{"version":3,"file":"UdpFormsSubmissionGrid.mjs","names":["React","useMemo","useState","useEffect","useCallback","useRef","useUser","useTenant","useHistory","useLocation","useSnackbar","CustomMenuPage","useTranslation","apiMutate","ConfigService","SearchMethodUdpGrid","LoadingIndicator","UdpPageEnums","StatusCellRenderer","SqlFilterOperators","SideSheet","Autocomplete","TextField","FormControlLabel","Switch","PageLoading","parseSearchParamsIntoFilterObjects","UdpFormsSubmissionGridIds","Object","freeze","ResponderId","ManagerId","UdpFormsSubmissionStatusEnum","InProgress","Submitted","Created","formatDateTime","dateString","normalizedDateString","includes","replace","toUpperCase","endsWith","date","Date","toLocaleString","undefined","year","month","day","hour","minute","hour12","toUtcIsoAtLocalEndOfDay","yyyyMmDd","y","m","d","String","split","map","x","Number","local","toISOString","tryParseJsonObject","value","JSON","parse","hasNonWhitespaceText","v","trim","length","applySubmissionTemplateOverrides","submissionRow","dataObj","formSubmission_Data","overrides","FormTemplateOverrides","newSubmissionRow","FormName","form_Name","FormDescription","form_Description","formatDateForFilename","isNaN","getTime","toLocaleDateString","sanitizeFilenamePart","getSubmissionDisplayFormName","row","t","overrideName","baseName","name","defaultValue","getBrowserTimeZone","Intl","DateTimeFormat","resolvedOptions","timeZone","filterConfigByUrlField","form_name","agGridField","filterType","formsubmission_formid","formsubmission_formversion","form_description","formsubmission_userdisplayname","formsubmission_status","formsubmission_initialcreatedon","formsubmission_lastmodifiedon","formsubmission_submittedon","formsubmission_duedate","formsubmission_isoverdue","mapUrlFiltersToAgGridModel","filterObjects","agGridModel","forEach","filter","searchField","searchOperator","searchValue","searchKey","toLocaleLowerCase","config","console","warn","type","EQUALS","NOT_EQUALS","GREATER_THAN","LESS_THAN","LIKE","filterValue","toLowerCase","dateFrom","parseIdAndVersion","input","formSubmissionId","getSubmissionStatusLabel","node","formStatus","data","formSubmission_Status","getOverdueStatusLabel","overdueStatus","formSubmission_IsOverdue","filterSubmissionByTenantId","submissions","tenantId","submission","form_TenantId","gridFunctions","statusMappingConfig","Overdue","defaultGridOptions","pagination","defaultColDef","sortable","resizable","UdpFormsSubmissionGrid","isManagerMode","generic1","generic2","generic3","formsRendererUrlPath","allFormTitle","menuTitle","onSideSheetPrimaryAction","enableDownloadPdfAction","paginationAutoPageSize","user","tenant","history","location","enqueueSnackbar","closeSnackbar","innerMenuItemList","setInnerMenuItemList","formSubmissionViewDataRaw","setFormSubmissionViewDataRaw","formDataRaw","setFormDataRaw","isSidesheetOpen","setIsSidesheetOpen","selectedUdpFormInSideSheet","setSelectedUdpFormInSideSheet","formSubmissionUrlSearchObjs","setFormSubmissionUrlSearchObjs","gridApi","setGridApi","handleGridApiCallback","api","containsDueDate","setContainsDueDate","dueDateValue","setDueDateValue","isPdfDownloadInProgress","setIsPdfDownloadInProgress","isPdfDownloadInProgressRef","initialFilterModel","gridOptions","overlayLoadingTemplate","setFilterModel","onFilterChanged","refreshCells","force","columns","toggleLoadingOverlay","consolidateAndSortFormsByFormId","forms","resultMap","Map","item","id","formId","version","formVersion","formName","description","formDescription","initialCreatedOn","key","existing","get","versionNum","ts","submissionCount","sub","formSubmission_FormId","set","mostRecentCreatedOn","sortedOptions","Array","from","values","sort","a","b","localeCompare","consolidateAndSortFormSubmissionsByFormId","formSubmission_FormVersion","formSubmission_InitialCreatedOn","Math","max","fetchForms","activeTenant","filterElements","push","formResponse","productV1ApiUrl","method","eagerLoad","getAll","pageList","e","error","getSearchMethodConfig","orderElements","sortColumn","sortDirection","requestUrl","customSearchObject","generateFormRendererUrlPathUsingFormIdAndFormVersion","baseRoute","Udp_Forms_Renderer_Page_Private","encodeURIComponent","generateFormRendererUrlPathUsingSubmissionId","submissionId","getGridHeaderConfig","formTitle","title","primaryActionButton","label","onClick","columnDefs","headerName","field","hide","valueGetter","params","overrideDescription","cellRenderer","cellRendererParams","getStatusValue","cellDataType","valueFormatter","p","actionList","iconName","handleOnClick","formSubmission_Id","checkDisabled","current","browserTimeZone","response","responseType","blob","reportName","submissionOwner","formSubmission_UserDisplayName","isSubmitted","submittedLabel","formSubmission_SubmittedOn","filename","blobUrl","window","URL","createObjectURL","link","document","createElement","href","download","body","appendChild","click","removeChild","revokeObjectURL","variant","anchorOrigin","vertical","horizontal","handleSidesheetPrimaryClick","raw","versionStr","fd","FormData","append","stringify","formSubmissionViewSearchResponse","newSubmissionId","urlPath","handleSideSheetDueDateToggleChange","checked","handleDueDateChange","next","target","handleSideSheetClosed","selectableItems","f","formType","form_Type","form_Id","Id","form_Version","Form_Name","displayName","selectorOptions","s","handleSelectedUdpFormInSideSheetChange","event","newValue","getMainGridContent","selectedNode","menuItemsList","idMap","classes","found","find","form","newestFormVersion","formObj","reduce","acc","curr","Boolean","marginLeft","shrink","selectedOption","urlSearchObjs","cancelled","processedSubmissions","err","search","innerMenuList","unshift"],"sources":["../../../../src/udp/pages/UdpFormsSubmissionGrid/UdpFormsSubmissionGrid.jsx"],"sourcesContent":["import React, {\n  useMemo,\n  useState,\n  useEffect,\n  useCallback,\n  useRef\n} from 'react';\nimport { useUser } from '../../../utilities/auth/useUser';\nimport { useTenant } from '../../../utilities/tenant/useTenant';\nimport { useHistory, useLocation } from 'react-router-dom';\nimport { useSnackbar } from 'notistack';\nimport { CustomMenuPage } from '../../../menuPage';\nimport { useTranslation } from 'react-i18next';\nimport { apiMutate } from '../../../utilities';\nimport { ConfigService } from '../../../configService';\nimport { SearchMethodUdpGrid } from '../../../UI/templates/newGrid';\nimport { LoadingIndicator } from '../../../UI/loading/LoadingIndicator';\nimport { UdpPageEnums } from '../../../enums';\nimport { StatusCellRenderer } from '../../../UI/templates/ui/renderers';\nimport { SqlFilterOperators } from '../../../enums/aggridEnums';\nimport { SideSheet } from '../../../UI/surfaces/SideSheet';\nimport { Autocomplete } from '@material-ui/lab';\nimport { TextField, FormControlLabel, Switch} from '@material-ui/core';\nimport { PageLoading } from '../../../UI';\nimport { parseSearchParamsIntoFilterObjects } from '../../../utilities/search';\n\n\n\n// ============================================================================\n// Grid Ids Enums\n// ============================================================================\nconst UdpFormsSubmissionGridIds = Object.freeze({\n  ResponderId: '5C4A93B6-6C25-4236-ABCA-2E23DC6540B5',\n  ManagerId: '15F165D1-82CD-4775-9A35-FF2153058240'\n});\n\n\n// ============================================================================\n// Submission status enum\n// Used to map numeric submission status values returned from the backend\n// ============================================================================\nconst UdpFormsSubmissionStatusEnum = Object.freeze({\n  InProgress: 1,\n  Submitted: 2,\n  Created: 3\n});\n\n// ============================================================================\n// Date formatter helper\n// Normalizes backend date strings and formats them for display\n// Handles both ISO strings and \"YYYY-MM-DD HH:mm:ss.sss\" formats\n// ============================================================================\nconst formatDateTime = (dateString) => {\n  let normalizedDateString = dateString;\n\n  // Check if the string is in the 'YYYY-MM-DD HH:mm:ss.sss' format\n  // (i.e., contains a space instead of 'T').\n  // If the input is already ISO (e.g. '2025-12-10T20:23:23.055Z'),\n  // it passes straight through.\n  // This format is assumed to be missing timezone info and treated as UTC.\n  if (dateString.includes(' ')) {\n    // Replace the space with 'T' to normalize to ISO-like format\n    normalizedDateString = dateString.replace(' ', 'T');\n  }\n\n  // Ensure UTC timezone is explicitly specified\n  if (!dateString.toUpperCase().endsWith('Z')) {\n    normalizedDateString = normalizedDateString + 'Z';\n  }\n\n  const date = new Date(normalizedDateString);\n\n  // Localized, user-friendly date/time display\n  return date.toLocaleString(undefined, {\n    year: 'numeric',\n    month: 'short',\n    day: 'numeric',\n    hour: '2-digit',\n    minute: '2-digit',\n    hour12: true\n  });\n};\n\nconst toUtcIsoAtLocalEndOfDay = (yyyyMmDd) => {\n  if (!yyyyMmDd) return null;\n  const [y, m, d] = String(yyyyMmDd)\n    .split('-')\n    .map((x) => Number(x));\n  if (!y || !m || !d) return null;\n\n  // local time end-of-day (23:59:59.000), then serialize as UTC ISO\n  const local = new Date(y, m - 1, d, 23, 59, 59, 0);\n  return local.toISOString();\n};\n\n// ============================================================================\n// FormTemplateOverrides helpers\n// `formSubmission_Data` may be a JSON object or a JSON string.\n// If `Data.FormTemplateOverrides.FormName` / `FormDescription` are populated,\n// they should override the displayed `form_Name` / `form_Description`.\n// ============================================================================\nconst tryParseJsonObject = (value) => {\n  if (!value) return null;\n  if (typeof value === 'object') return value;\n  if (typeof value !== 'string') return null;\n  try {\n    return JSON.parse(value);\n  } catch {\n    return null;\n  }\n};\n\nconst hasNonWhitespaceText = (v) => typeof v === 'string' && v.trim().length > 0;\n\nconst applySubmissionTemplateOverrides = (submissionRow) => {\n  if (!submissionRow) return submissionRow;\n\n  const dataObj = tryParseJsonObject(submissionRow.formSubmission_Data);\n  const overrides = dataObj?.FormTemplateOverrides;\n  if (!overrides) return submissionRow;\n\n  const newSubmissionRow = { ...submissionRow };\n\n  if (hasNonWhitespaceText(overrides.FormName)) {\n    newSubmissionRow.form_Name = overrides.FormName.trim();\n  }\n  if (hasNonWhitespaceText(overrides.FormDescription)) {\n    newSubmissionRow.form_Description = overrides.FormDescription.trim();\n  }\n\n  return newSubmissionRow;\n};\n\nconst formatDateForFilename = (dateString) => {\n  if (!dateString) return '';\n  let normalizedDateString = dateString;\n  if (typeof normalizedDateString === 'string' && normalizedDateString.includes(' ')) {\n    normalizedDateString = normalizedDateString.replace(' ', 'T');\n  }\n  if (\n    typeof normalizedDateString === 'string' &&\n    !normalizedDateString.toUpperCase().endsWith('Z')\n  ) {\n    normalizedDateString = normalizedDateString + 'Z';\n  }\n\n  const date = new Date(normalizedDateString);\n  if (Number.isNaN(date.getTime())) return '';\n\n  return date.toLocaleDateString(undefined, {\n    year: 'numeric',\n    month: 'long',\n    day: '2-digit'\n  });\n};\n\nconst sanitizeFilenamePart = (value) =>\n  String(value ?? '')\n    // Windows file name chars: \\ / : * ? \" < > |\n    .replace(/[\\\\/:*?\"<>|]/g, '')\n    .replace(/\\s+/g, ' ')\n    .trim();\n\nconst getSubmissionDisplayFormName = (row, t) => {\n  const dataObj = tryParseJsonObject(row?.formSubmission_Data);\n  const overrideName = dataObj?.FormTemplateOverrides?.FormName;\n  const baseName = row?.form_Name;\n\n  const name = hasNonWhitespaceText(overrideName)\n    ? overrideName.trim()\n    : hasNonWhitespaceText(baseName)\n      ? baseName.trim()\n      : t('formSubmissions.untitledForm', { defaultValue: 'Untitled Form' });\n\n  return name;\n};\n\nconst getBrowserTimeZone = () => {\n  try {\n    return Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';\n  } catch {\n    return 'UTC';\n  }\n};\n\n// ============================================================================\n// URL filter field → ag-Grid filter configuration mapping\n// Used when converting URL search params into ag-Grid filter models\n// ============================================================================\nconst filterConfigByUrlField = {\n  form_name: { agGridField: 'form_Name', filterType: 'text' },\n  formsubmission_formid: {\n    agGridField: 'formSubmission_FormId',\n    filterType: 'text'\n  },\n  formsubmission_formversion: {\n    agGridField: 'formSubmission_FormVersion',\n    filterType: 'number'\n  },\n  form_description: { agGridField: 'form_Description', filterType: 'text' },\n  formsubmission_userdisplayname: {\n    agGridField: 'formSubmission_UserDisplayName',\n    filterType: 'text'\n  },\n  formsubmission_status: {\n    agGridField: 'formSubmission_Status',\n    filterType: 'number'\n  },\n  formsubmission_initialcreatedon: {\n    agGridField: 'formSubmission_InitialCreatedOn',\n    filterType: 'date'\n  },\n  formsubmission_lastmodifiedon: {\n    agGridField: 'formSubmission_LastModifiedOn',\n    filterType: 'date'\n  },\n  formsubmission_submittedon: {\n    agGridField: 'formSubmission_SubmittedOn',\n    filterType: 'date'\n  },\n  formsubmission_duedate: {\n    agGridField: 'formSubmission_DueDate',\n    filterType: 'date'\n  },\n  formsubmission_isoverdue: {\n    agGridField: 'formSubmission_IsOverdue',\n    filterType: 'text'\n  }\n};\n\n\n/**\n * Maps your internal filter object structure (from URL processing)\n * to the ag-Grid Filter Model structure.\n * @param {Array<{searchField: string, searchOperator: number, searchValue: string}>} filterObjects\n * @returns {object} ag-Grid Filter Model\n */\nconst mapUrlFiltersToAgGridModel = (filterObjects) => {\n  if (!filterObjects || filterObjects.length === 0) {\n    return null;\n  }\n\n  const agGridModel = {};\n\n  filterObjects.forEach((filter) => {\n    const { searchField, searchOperator, searchValue } = filter;\n\n    const searchKey = searchField.toLocaleLowerCase();\n    const config = filterConfigByUrlField[searchKey];\n\n    if (!config) {\n      console.warn(\n        `No configuration found for URL filter field: ${searchField}. Filter ignored.`\n      );\n      return;\n    }\n\n    const agGridField = config.agGridField;\n    const filterType = config.filterType;\n\n    let type = 'equals';\n    switch (searchOperator) {\n      case SqlFilterOperators.EQUALS:\n        type = 'equals';\n        break;\n      case SqlFilterOperators.NOT_EQUALS:\n        type = 'notEqual';\n        break;\n      case SqlFilterOperators.GREATER_THAN:\n        type = 'greaterThan';\n        break;\n      case SqlFilterOperators.LESS_THAN:\n        type = 'lessThan';\n        break;\n      case SqlFilterOperators.LIKE:\n        type = 'contains';\n        break;\n      default:\n        type = 'equals';\n    }\n\n    let filterValue = searchValue;\n\n    if (\n      !filterValue ||\n      filterValue.toLowerCase() === 'undefined' ||\n      filterValue.toLowerCase() === 'null'\n    ) {\n      console.warn(\n        `Skipping filter for ${agGridField} due to invalid value: ${searchValue}`\n      );\n      return;\n    }\n\n    if (filterType == 'date') {\n      agGridModel[agGridField] = {\n        filterType,\n        type,\n        dateFrom: filterValue\n      };\n    } else if (\n      filterType == 'text' &&\n      agGridField.toLocaleLowerCase() == 'formsubmission_isoverdue'\n    ) {\n      agGridModel[agGridField] = {\n        filterType,\n        type: filterValue\n      };\n    } else {\n      agGridModel[agGridField] = {\n        filterType,\n        type,\n        filter: filterValue\n      };\n    }\n  });\n\n  return agGridModel;\n};\n\n// ============================================================================\n// Helper for CustomMenuPage to parse form submission ID and version from node ID\n// ============================================================================\nconst parseIdAndVersion = (input) => {\n  const formSubmissionId = input.replace(/^form-submission-/, '');\n  // Check for \"all forms\" special case\n  if (formSubmissionId.includes('all-forms-key')) {\n    return null;\n  }\n  return formSubmissionId;\n};\n\n// ============================================================================\n// Maps a submission status enum value to a human-readable status label\n// Used in grid cell renderer\n// ============================================================================\nconst getSubmissionStatusLabel = (node) => {\n  const formStatus = node?.data?.formSubmission_Status;\n  switch (formStatus) {\n    case UdpFormsSubmissionStatusEnum.InProgress:\n      return 'InProgress';\n    case UdpFormsSubmissionStatusEnum.Created:\n      return 'Created';\n    case UdpFormsSubmissionStatusEnum.Submitted:\n      return 'Submitted';\n    default:\n      return '';\n  }\n};\n\n// ============================================================================\n// Maps overdue flag to a display label\n// Used in grid cell renderer\n// ============================================================================\nconst getOverdueStatusLabel = (node) => {\n  const overdueStatus = node?.data?.formSubmission_IsOverdue;\n  switch (overdueStatus) {\n    case true:\n      return 'Overdue';\n    default:\n      return '';\n  }\n};\n\n// ============================================================================\n// Filters form submissions by tenant ID\n// ============================================================================\nconst filterSubmissionByTenantId = (submissions, tenantId) => {\n  return submissions.filter(\n    (submission) => submission.form_TenantId === tenantId\n  );\n};\n\n// ============================================================================\n// Map of status labels to status types\n// Used in grid configs\n// ============================================================================\nconst gridFunctions = [\n  { name: 'agGridSizeColumnsToFit' },\n  { name: 'agGridAutoSizeColumns' },\n  { name: 'agGridResetColumns' },\n  { name: 'agGridHideShowColumns' },\n  { name: 'agGridExport' },\n  { name: 'openSavedViews' },\n];\n\n// ============================================================================\n// Map of status labels to status types\n// Used in grid configs\n// ============================================================================\nconst statusMappingConfig = {\n  Created: 'info',\n  InProgress: 'warning',\n  Submitted: 'success',\n  Overdue: 'error'\n};\n\n// ============================================================================\n// Map of status labels to status types\n// Grid options config\n// ============================================================================\nconst defaultGridOptions = {\n  pagination: true,\n  defaultColDef: {\n    sortable: true,\n    filter: true,\n    resizable: true\n  }\n};\n\nexport const UdpFormsSubmissionGrid = ({\n  isManagerMode = false,\n  generic1 = undefined,\n  generic2 = undefined,\n  generic3 = undefined,\n  formsRendererUrlPath = undefined,\n  allFormTitle = undefined,\n  menuTitle = undefined,\n  onSideSheetPrimaryAction = undefined,\n  enableDownloadPdfAction = true,\n  paginationAutoPageSize = true\n}) => {\n  const user = useUser();\n  const tenant = useTenant();\n  const history = useHistory();\n  const location = useLocation();\n  const { t } = useTranslation();\n  const { enqueueSnackbar, closeSnackbar } = useSnackbar();\n\n  // Component states\n  const [innerMenuItemList, setInnerMenuItemList] = useState([]);\n  const [formSubmissionViewDataRaw, setFormSubmissionViewDataRaw] = useState([]);\n  const [formDataRaw, setFormDataRaw] = useState([]);\n  const [isSidesheetOpen, setIsSidesheetOpen] = useState(false);\n  const [selectedUdpFormInSideSheet, setSelectedUdpFormInSideSheet] = useState({});\n  const [formSubmissionUrlSearchObjs, setFormSubmissionUrlSearchObjs] = useState([]);\n  const [gridApi, setGridApi] = useState(null);\n  const handleGridApiCallback = useCallback((api) => { setGridApi(api) }, []);\n  const [containsDueDate, setContainsDueDate] = useState(false);\n  const [dueDateValue, setDueDateValue] = useState(null); \n  const [isPdfDownloadInProgress, setIsPdfDownloadInProgress] = useState(false);\n  const isPdfDownloadInProgressRef = useRef(false);\n\n  const initialFilterModel = useMemo(() => {\n    return mapUrlFiltersToAgGridModel(formSubmissionUrlSearchObjs);\n  }, [formSubmissionUrlSearchObjs]);\n\n  const gridOptions = useMemo(() => {\n    return {\n      ...defaultGridOptions,\n      paginationAutoPageSize,\n      overlayLoadingTemplate: `<UdpText variant=\"body1\">${t(\n        'formSubmissions.generatingPdf',\n        { defaultValue: 'Generating PDF...' }\n      )}</UdpText>`\n    };\n  }, [paginationAutoPageSize, t]);\n\n  useEffect(() => {\n    if (gridApi && initialFilterModel) {\n      gridApi.setFilterModel(initialFilterModel);\n      gridApi.onFilterChanged();\n    }\n  }, [gridApi, initialFilterModel]);\n\n  useEffect(() => {\n    if (!gridApi) return;\n\n    gridApi.refreshCells({ force: true, columns: ['actions'] });\n  }, [gridApi, isPdfDownloadInProgress]);\n\n  useEffect(() => {\n    if (!gridApi?.toggleLoadingOverlay) return;\n\n    // Show a blocking loading mask so users get immediate visual feedback\n    // and cannot trigger additional actions while a PDF is being generated.\n    gridApi.toggleLoadingOverlay(isPdfDownloadInProgress);\n  }, [gridApi, isPdfDownloadInProgress]);\n\n  const consolidateAndSortFormsByFormId = useCallback(\n    (forms, submissions = []) => {\n      const resultMap = new Map();\n      for (const item of forms) {\n        const {\n          id: formId,\n          version: formVersion,\n          name: formName,\n          description: formDescription,\n          initialCreatedOn: initialCreatedOn\n        } = item;\n        if (!formId || formVersion == null) continue;\n\n        const key = String(formId);\n        const existing = resultMap.get(key);\n\n        // normalize version and timestamp\n        const versionNum = Number(formVersion) || 0;\n        const ts = initialCreatedOn ? new Date(initialCreatedOn).getTime() : 0;\n\n        // robust comparison (coerce to string)\n        const submissionCount = (submissions || []).filter(\n          (sub) => String(sub?.formSubmission_FormId) === key\n        ).length;\n\n        if (!existing) {\n          resultMap.set(key, {\n            id: key,\n            formId,\n            formVersion: versionNum,\n            name:\n              formName ||\n              t('formSubmissions.untitledForm', {\n                defaultValue: 'Untitled Form'\n              }),\n            submissionCount,\n            description: formDescription || '',\n            mostRecentCreatedOn: ts\n          });\n        } else {\n          // keep metadata (name/description/formVersion) from the highest version seen\n          if (versionNum > (existing.formVersion || 0)) {\n            existing.formVersion = versionNum;\n            if (formName) existing.name = formName;\n            if (formDescription) existing.description = formDescription;\n          }\n        }\n      }\n\n      const sortedOptions = Array.from(resultMap.values()).sort((a, b) =>\n        b.name.localeCompare(a.name)\n      );\n      return sortedOptions;\n    },\n    [t]\n  );\n\n  const consolidateAndSortFormSubmissionsByFormId = useCallback(\n    (submissions) => {\n      const resultMap = new Map();\n      for (const item of submissions) {\n        const {\n          formSubmission_FormId: formId,\n          formSubmission_FormVersion: formVersion,\n          form_Name: formName,\n          form_Description: formDescription,\n          formSubmission_InitialCreatedOn: initialCreatedOn\n        } = item;\n        if (!formId || formVersion == null) continue;\n\n        const key = `${formId}`;\n        const existing = resultMap.get(key);\n\n        // normalize version and timestamp\n        const versionNum = Number(formVersion) || 0;\n        const ts = initialCreatedOn ? new Date(initialCreatedOn).getTime() : 0;\n\n        if (!existing) {\n          resultMap.set(key, {\n            id: key,\n            formId,\n            formVersion: versionNum,\n            name:\n              formName ||\n              t('formSubmissions.untitledForm', {\n                defaultValue: 'Untitled Form'\n              }),\n            submissionCount: 1,\n            description: formDescription || '',\n            mostRecentCreatedOn: ts\n          });\n        } else {\n          existing.submissionCount += 1;\n          existing.mostRecentCreatedOn = Math.max(\n            existing.mostRecentCreatedOn || 0,\n            ts\n          );\n\n          // keep metadata (name/description/formVersion) from the highest version seen\n          if (versionNum > (existing.formVersion || 0)) {\n            existing.formVersion = versionNum;\n            if (formName) existing.name = formName;\n            if (formDescription) existing.description = formDescription;\n          }\n        }\n      }\n\n      const sortedOptions = Array.from(resultMap.values()).sort(\n        (a, b) => b.mostRecentCreatedOn - a.mostRecentCreatedOn\n      );\n      return sortedOptions;\n    },\n    [t]\n  );\n\n  const fetchForms = useCallback(async () => {\n    try {\n      if (!tenant?.activeTenant?.tenantId) return;\n\n      const filterElements = [];\n\n      filterElements.push({\n        searchField: 'tenantId',\n        searchOperator: '=',\n        searchValue: tenant.activeTenant.tenantId\n      });\n\n      const formResponse = await apiMutate(\n        ConfigService.productV1ApiUrl,\n        `UdpForm/search`,\n        {\n          method: 'POST',\n          data: {\n            eagerLoad: false,\n            getAll: true,\n            filterElements\n          }\n        },\n        {}\n      );\n\n      const forms = formResponse?.data.pageList || [];\n      setFormDataRaw(forms);\n    } catch (e) {\n      console.error('fetchForms error:', e);\n    }\n  }, [user, tenant, consolidateAndSortFormSubmissionsByFormId]);\n\n  const getSearchMethodConfig = useCallback(\n    (formId) => {\n      if (!tenant?.activeTenant?.tenantId) return;\n\n      const filterElements = [];\n\n      if (!isManagerMode) {\n        filterElements.push({\n          searchField: 'formSubmission_unityUserId',\n          searchOperator: '=',\n          searchValue: user.id || ''\n        });\n      }\n\n      if (formId) {\n        filterElements.push({\n          searchField: 'formSubmission_formId',\n          searchOperator: '=',\n          searchValue: formId\n        });\n      }\n\n      if (generic1 !== undefined) {\n        filterElements.push({\n          searchField: 'formSubmission_generic1',\n          searchOperator: '=',\n          searchValue: generic1\n        });\n      }\n\n      if (generic2 !== undefined) {\n        filterElements.push({\n          searchField: 'formSubmission_generic2',\n          searchOperator: '=',\n          searchValue: generic2\n        });\n      }\n\n      if (generic3 !== undefined) {\n        filterElements.push({\n          searchField: 'formSubmission_generic3',\n          searchOperator: '=',\n          searchValue: generic3\n        });\n      }\n\n      filterElements.push({\n        searchField: 'form_tenantId',\n        searchOperator: '=',\n        searchValue: tenant?.activeTenant?.tenantId || ''\n      });\n\n      const orderElements = [\n        {\n          sortColumn: 'formSubmission_InitialCreatedOn',\n          sortDirection: 'DESC'\n        }\n      ];\n\n      return {\n        requestUrl: `${ConfigService.productV1ApiUrl}/UdpFormWithSubmissionsView/search`,\n        customSearchObject: {\n          eagerLoad: false,\n          filterElements,\n          orderElements\n        }\n        // logicalSearchOperator: 1,\n        // groupingType: '',\n        // groupProperty: [],\n        // groupOperationList: [],\n        // type: 'advanced',\n        // pageNumber: 1,\n        // pageSize: 20,\n      };\n    },\n    [user, isManagerMode, tenant, generic1, generic2, generic3]\n  );\n\n  const generateFormRendererUrlPathUsingFormIdAndFormVersion = useCallback(\n    (formId, formVersion) => {\n      const baseRoute = formsRendererUrlPath\n        ? formsRendererUrlPath\n        : 'page/' + UdpPageEnums.Udp_Forms_Renderer_Page_Private;\n\n      return `${baseRoute}?udpf_formId=${encodeURIComponent(\n        formId\n      )}&udpf_formVersion=${encodeURIComponent(formVersion)}`;\n    },\n    [formsRendererUrlPath]\n  );\n\n  const generateFormRendererUrlPathUsingSubmissionId = useCallback(\n    (submissionId) => {\n      const baseRoute = formsRendererUrlPath\n        ? formsRendererUrlPath\n        : 'page/' + UdpPageEnums.Udp_Forms_Renderer_Page_Private;\n\n      return `${baseRoute}?udpf_submissionId=${encodeURIComponent(\n        submissionId\n      )}`;\n    },\n    [formsRendererUrlPath]\n  );\n\n  const getGridHeaderConfig = useCallback(\n    (formId, formVersion, formTitle) => {\n      const config = {\n        title: formTitle\n      };\n\n      if (!isManagerMode) {\n        config.primaryActionButton = {\n          label: t('formSubmissions.submitNewForm', {\n            defaultValue: 'Submit New Form'\n          }),\n          onClick: () => {\n            if (formId && formVersion) {\n              setSelectedUdpFormInSideSheet({ value: `${formId}|${formVersion}`, label: formTitle });\n            } \n            setIsSidesheetOpen(true);\n          }\n        };\n      }\n\n      return config;\n    },\n    [history, t, isManagerMode]\n  );\n\n  const columnDefs =  [\n      {\n        headerName: t('formSubmissions.columns.formId', {\n          defaultValue: 'Form ID'\n        }),\n        field: 'formSubmission_FormId',\n        hide: true\n      },\n      {\n        headerName: t('formSubmissions.columns.name', {\n          defaultValue: 'Name'\n        }),\n        field: 'form_Name',\n        type: 'text',\n        sortable: true,\n        valueGetter: (params) => {\n          const row = params?.data;\n          if (!row) return '';\n\n          const dataObj = tryParseJsonObject(row.formSubmission_Data);\n          const overrideName = dataObj?.FormTemplateOverrides?.FormName;\n          if (hasNonWhitespaceText(overrideName)) return overrideName.trim();\n\n          return row.form_Name ?? '';\n        }\n      },\n      {\n        headerName: t('formSubmissions.columns.version', {\n          defaultValue: 'Version'\n        }),\n        field: 'formSubmission_FormVersion',\n        type: 'number',\n        sortable: true\n      },\n      {\n        headerName: t('formSubmissions.columns.description', {\n          defaultValue: 'Description'\n        }),\n        field: 'form_Description',\n        type: 'text',\n        sortable: true,\n        hide: true,\n        valueGetter: (params) => {\n          const row = params?.data;\n          if (!row) return '';\n\n          const dataObj = tryParseJsonObject(row.formSubmission_Data);\n          const overrideDescription =\n            dataObj?.FormTemplateOverrides?.FormDescription;\n          if (hasNonWhitespaceText(overrideDescription)) {\n            return overrideDescription.trim();\n          }\n\n          return row.form_Description ?? '';\n        }\n      },\n      {\n        headerName: t('formSubmissions.columns.submittedBy', {\n          defaultValue: 'Submitted By'\n        }),\n        field: 'formSubmission_UserDisplayName',\n        type: 'text',\n        sortable: true\n      },\n      {\n        headerName: t('formSubmissions.columns.status', {\n          defaultValue: 'Status'\n        }),\n        filter: true,\n        field: 'formSubmission_Status',\n        cellRenderer: 'statusRenderer',\n        cellRendererParams: {\n          statusMappingConfig: statusMappingConfig,\n          getStatusValue: getSubmissionStatusLabel\n        }\n      },\n      {\n        headerName: t('formSubmissions.columns.overdueStatus', {\n          defaultValue: 'Overdue Status'\n        }),\n        field: 'formSubmission_IsOverdue',\n        cellDataType: 'boolean',\n        sortable: true,\n        cellRenderer: 'statusRenderer',\n        cellRendererParams: {\n          statusMappingConfig: statusMappingConfig,\n          getStatusValue: getOverdueStatusLabel\n        }\n      },\n      {\n        headerName: t('formSubmissions.columns.createdOn', {\n          defaultValue: 'Created On'\n        }),\n        field: 'formSubmission_InitialCreatedOn',\n        valueFormatter: (p) => (p.value ? formatDateTime(p.value) : ''),\n        sortable: true,\n        cellDataType: 'dateTimeString'\n      },\n      {\n        headerName: t('formSubmissions.columns.lastModifiedOn', {\n          defaultValue: 'Last Modified On'\n        }),\n        field: 'formSubmission_LastModifiedOn',\n        valueFormatter: (p) => (p.value ? formatDateTime(p.value) : ''),\n        sortable: true,\n        cellDataType: 'dateTimeString'\n      },\n      {\n        headerName: t('formSubmissions.columns.submittedOn', {\n          defaultValue: 'Submitted On'\n        }),\n        field: 'formSubmission_SubmittedOn',\n        valueFormatter: (p) => (p.value ? formatDateTime(p.value) : ''),\n        sortable: true,\n        cellDataType: 'dateTimeString'\n      },\n      {\n        headerName: t('formSubmissions.columns.dueOn', {\n          defaultValue: 'Due On'\n        }),\n        field: 'formSubmission_DueDate',\n        valueFormatter: (p) => (p.value ? formatDateTime(p.value) : ''),\n        sortable: true,\n        cellDataType: 'dateTimeString'\n      },\n      {\n        field: 'actions',\n        cellRenderer: 'actionsRenderer',\n        cellRendererParams: {\n          actionList: [\n            {\n              id: 0,\n              iconName: 'view',\n              title: t('formSubmissions.actions.openSubmission', {\n                defaultValue: 'Open This Submission'\n              }),\n              handleOnClick: (e, params) => {\n                history.push(\n                  `${\n                    formsRendererUrlPath\n                      ? formsRendererUrlPath\n                      : '/page/' + UdpPageEnums.Udp_Forms_Renderer_Page_Private\n                  }?udpf_submissionId=${params?.data?.formSubmission_Id}`\n                );\n              }\n            },\n            ...(enableDownloadPdfAction ? [\n              {\n                id: 1,\n                iconName: 'documentPdf',\n                title: t('formSubmissions.actions.downloadReport', {\n                  defaultValue: 'Download Report'\n                }),\n                checkDisabled: () => isPdfDownloadInProgress,\n                // checkDisabled: () => true,\n                handleOnClick: async (e, params) => {\n                  // Use a ref lock to avoid rapid-click races before React state re-renders.\n                  if (isPdfDownloadInProgressRef.current) {\n                    return;\n                  }\n\n                  isPdfDownloadInProgressRef.current = true;\n                  setIsPdfDownloadInProgress(true);\n                  try {\n                    const row = params?.data;\n                    const browserTimeZone = getBrowserTimeZone();\n                    const response = await apiMutate(\n                      ConfigService.productV1ApiUrl,\n                      `udpFormSubmission/${row?.formSubmission_Id}/report?timeZoneId=${encodeURIComponent(\n                        browserTimeZone\n                      )}`,\n                      {\n                        method: 'GET',\n                        responseType: 'blob'\n                      },\n                      {}\n                    );\n\n                    const blob = response.data;\n\n                    const reportName = getSubmissionDisplayFormName(row, t);\n                    const submissionOwner =\n                      row?.formSubmission_UserDisplayName ||\n                      t('formSubmissions.unknownUser', {\n                        defaultValue: 'Unknown User'\n                      });\n                    const isSubmitted = Number(row?.formSubmission_Status) === UdpFormsSubmissionStatusEnum.Submitted;\n\n                    const submittedLabel = isSubmitted\n                      ? formatDateForFilename(row?.formSubmission_SubmittedOn) ||\n                        t('formSubmissions.submitted', {\n                          defaultValue: 'Submitted'\n                        })\n                      : t('formSubmissions.notSubmitted', {\n                          defaultValue: 'Not Submitted'\n                        });\n\n                    const filename = `${sanitizeFilenamePart(reportName)} - ${sanitizeFilenamePart(submissionOwner)} - ${sanitizeFilenamePart(submittedLabel)}.pdf`;\n\n                    // Create a blob URL and trigger download\n                    const blobUrl = window.URL.createObjectURL(blob);\n                    const link = document.createElement('a');\n                    link.href = blobUrl;\n                    link.download = filename;\n                    document.body.appendChild(link);\n                    link.click();\n                    document.body.removeChild(link);\n                    window.URL.revokeObjectURL(blobUrl);\n                    \n                  } catch (error) {\n                    console.error('Error downloading report:', error);\n                    enqueueSnackbar(\n                      t('formSubmissions.downloadReportError', {\n                        defaultValue: 'Error downloading report'\n                      }),\n                      { variant: 'error', anchorOrigin: { vertical: 'top', horizontal: 'center' } }\n                    );\n                  } finally {\n                    isPdfDownloadInProgressRef.current = false;\n                    setIsPdfDownloadInProgress(false);\n                  }\n                }\n              }\n            ] : [])\n          ]\n        }\n      }\n    ];\n\n  // ============================================================================\n  // Side Sheet Helpers and Handlers\n  // ============================================================================\n  const handleSidesheetPrimaryClick = async () => {\n    try {\n      // selectedUdpFormInSideSheet format is { value: \"formId|formVersion\", label: \"...\" }\n      const raw = selectedUdpFormInSideSheet?.value || '';\n      const [id, versionStr] = raw.split('|');\n      const version = Number(versionStr || 0);\n      if (!id || !version) {\n        console.warn('Invalid selection:', selectedUdpFormInSideSheet);\n        setIsSidesheetOpen(false);\n        return;\n      }\n\n      const fd = new FormData();\n      fd.append('FormId', id);\n      fd.append('FormVersion', String(version));\n      fd.append('Status', String(UdpFormsSubmissionStatusEnum.Created));\n      fd.append('Data', JSON.stringify({}));\n      if (dueDateValue) {\n        fd.append('DueDate', toUtcIsoAtLocalEndOfDay(dueDateValue));\n      }\n      if (generic1 !== undefined) {\n        fd.append('Generic1', String(generic1));\n      }\n      if (generic2 !== undefined) {\n        fd.append('Generic2', String(generic2));\n      }\n      if (generic3 !== undefined) {\n        fd.append('Generic3', String(generic3));\n      }\n\n      const formSubmissionViewSearchResponse = await apiMutate(\n        ConfigService.productV1ApiUrl,\n        `UdpFormSubmission`,\n        {\n          method: 'POST',\n          data: fd\n        },\n        {}\n      );\n\n      const newSubmissionId = formSubmissionViewSearchResponse?.data?.id;\n      setIsSidesheetOpen(false);\n      const urlPath = generateFormRendererUrlPathUsingSubmissionId(newSubmissionId);\n      history.push(urlPath);\n    } catch (e) {\n      console.error('handleSidesheetPrimaryClick error:', e);\n      enqueueSnackbar(\n        t('formSubmissions.createFormError', {\n          defaultValue: 'Error creating a new form.'\n        }),\n        { variant: 'error' , anchorOrigin: { vertical: 'top', horizontal: 'center' }}\n      );\n    }\n  };\n\n  const handleSideSheetDueDateToggleChange = useCallback((checked) => {\n    setContainsDueDate(checked);\n    if (!checked) setDueDateValue(null); // hide + clear datapoint\n  }, []);\n\n  const handleDueDateChange = useCallback((e) => {\n    const next = e?.target?.value;\n    setDueDateValue(next);\n  }, []);\n\n  const handleSideSheetClosed = () => {\n    setSelectedUdpFormInSideSheet({});\n    setIsSidesheetOpen(false);\n    setContainsDueDate(false);\n    setDueDateValue(null);\n  };\n\n  const selectableItems = useMemo(() => {\n    const map = new Map();\n\n    for (const f of formDataRaw || []) {\n      const formType = f.form_Type ?? f.formType ?? f.type;\n      if (Number(formType) !== 1) continue;\n\n      const formId = f.id ?? f.form_Id ?? f.formId ?? String(f?.Id ?? '');\n      const version = Number(f.version ?? f.form_Version ?? f.formVersion ?? 0);\n      const name =\n        f.name ??\n        f.form_Name ??\n        f.formName ??\n        f.Form_Name ??\n        f.displayName ??\n        t('formSubmissions.untitledForm', { defaultValue: 'Untitled Form' });\n      const description = f.description ?? f.form_Description ?? '';\n\n      const existing = map.get(formId);\n      if (!existing || version > existing.version) {\n        map.set(formId, { id: formId, name, version, description });\n      }\n    }\n\n    return Array.from(map.values()).sort((a, b) => b.version - a.version);\n  }, [formDataRaw, t]);\n\n  const selectorOptions = useMemo(() => {\n    return (selectableItems || []).map((s) => ({\n      value: `${s.id}|${s.version}`,\n      label: s.version ? `${s.name} (v${s.version})` : s.name\n    }));\n  }, [selectableItems]);\n\n  const handleSelectedUdpFormInSideSheetChange = (event, newValue) => {\n    if (newValue !== null) {\n      setSelectedUdpFormInSideSheet(newValue);\n    }\n  };\n\n  const getMainGridContent = ({\n    selectedNode,\n    menuItemsList,\n    idMap,\n    classes\n  }) => {\n    if (!selectedNode) {\n      return <PageLoading />;\n    }\n    const formId = parseIdAndVersion(selectedNode.id);\n    const found = innerMenuItemList.find((form) => form.formId == formId);\n    const formTitle = `${found?.name}` || 'Unknown Form';\n    const newestFormVersion = formDataRaw\n      .filter((formObj) => formObj.id == formId)\n      .reduce((acc, curr) => {\n        return Math.max(acc, curr.version);\n      }, null);\n\n    return (\n      <>\n        <SideSheet\n          open={isSidesheetOpen}\n          title={t('formSubmissions.submitNewForm', {\n            defaultValue: 'Submit New Form'\n          })}\n          position='right'\n          width={'30%'}\n          buttonLabel={t('common.new', { defaultValue: 'New' })}\n          // Disable primary action when there is no selected form OR when\n          // the user requested a due date but didn't pick one.\n          buttonOneDisabled={!selectedUdpFormInSideSheet?.value || (containsDueDate && !dueDateValue)}\n          onSubmit={handleSidesheetPrimaryClick}\n          onClose={handleSideSheetClosed}\n        >\n          <FormControlLabel\n            control={\n              <Switch\n                size='small'\n                onChange={(e) => handleSideSheetDueDateToggleChange(Boolean(e?.target?.checked))}\n              />\n            }\n            label={t('formSubmissions.setDueDate', {\n              defaultValue: 'Set a Due Date'\n            })}\n            style={{ marginLeft: 0 }}\n          />\n            {containsDueDate ? (\n              <TextField\n                label={t('formSubmissions.dueDate', {\n                  defaultValue: 'Due Date'\n                })}\n                type='date'\n                variant='outlined'\n                size='small'\n                InputLabelProps={{ shrink: true }}\n                value={dueDateValue}\n                onChange={handleDueDateChange}\n                helperText={t('formSubmissions.dueDateHint', {\n                  defaultValue:\n                    'Set a due date at the end-of-day based on your local time.'\n                })}\n              />\n          ) : null}\n          \n          {/* // Only show form selector when the user is not in a specific form context */}\n          {!(found?.id && newestFormVersion) && (\n            <Autocomplete\n              options={selectorOptions}\n              getOptionLabel={(selectedOption) => selectedOption.label}\n              onChange={handleSelectedUdpFormInSideSheetChange}\n              // Autocomplete expects the selected option object as value\n              value={selectedUdpFormInSideSheet}\n              disableClearable={true}\n              size='small'\n              renderInput={(params) => (\n                <TextField\n                  {...params}\n                  label={t('formSubmissions.chooseForm', {\n                    defaultValue: 'Choose a Form'\n                  })}\n                  variant='outlined'\n                />\n              )}\n            />\n          )}\n          \n        </SideSheet>\n\n        <SearchMethodUdpGrid\n          searchMethodConfig={getSearchMethodConfig(formId)}\n          columnDefs={columnDefs}\n          gridId={isManagerMode ? UdpFormsSubmissionGridIds.ManagerId : UdpFormsSubmissionGridIds.ResponderId}\n          gridOptions={gridOptions}\n          gridHeaderConfig={getGridHeaderConfig(\n            formId,\n            newestFormVersion,\n            formTitle\n          )}\n          gridFunctions={gridFunctions}\n          gridApiCallback={handleGridApiCallback} // Pass the setter/ref handler\n        />\n      </>\n    );\n  };\n\n  useEffect(() => {\n    if (!tenant?.activeTenant?.tenantId) return;\n\n    const urlSearchObjs = parseSearchParamsIntoFilterObjects();\n    setFormSubmissionUrlSearchObjs(urlSearchObjs); // THIS LINE TRIGGERS initialFilterModel\n\n    let cancelled = false;\n    (async () => {\n      try {\n        // replicate fetchSubmissions logic but using local urlSearchObjs (avoids depending on the state)\n        let filterElements = [];\n\n        filterElements.push({\n          searchField: 'Form_TenantId',\n          searchOperator: '=',\n          searchValue: tenant.activeTenant.tenantId\n        });\n\n        if (!isManagerMode) {\n          filterElements.push({\n            searchField: 'FormSubmission_UnityUserId',\n            searchOperator: '=',\n            searchValue: user.id\n          });\n        }\n\n        if (generic1 !== undefined) {\n          filterElements.push({\n            searchField: 'formSubmission_generic1',\n            searchOperator: '=',\n            searchValue: generic1\n          });\n        }\n\n        if (generic2 !== undefined) {\n          filterElements.push({\n            searchField: 'formSubmission_generic2',\n            searchOperator: '=',\n            searchValue: generic2\n          });\n        }\n\n        if (generic3 !== undefined) {\n          filterElements.push({\n            searchField: 'formSubmission_generic3',\n            searchOperator: '=',\n            searchValue: generic3\n          });\n        }\n\n        const formSubmissionViewSearchResponse = await apiMutate(\n          ConfigService.productV1ApiUrl,\n          `UdpFormWithSubmissionsView/search`,\n          {\n            method: 'POST',\n            data: {\n              eagerLoad: false,\n              getAll: true,\n              filterElements\n            }\n          },\n          {}\n        );\n\n        if (cancelled) return;\n\n        const submissions = formSubmissionViewSearchResponse?.data.pageList || [];\n        const processedSubmissions = submissions.filter((submission) =>\n          submission.form_TenantId === tenant.activeTenant.tenantId\n        );\n        setFormSubmissionViewDataRaw(processedSubmissions);\n        await fetchForms();\n      } catch (err) {\n        console.error('fetching submissions/forms failed', err);\n      }\n    })();\n\n    return () => {\n      cancelled = true;\n    };\n  }, [\n    location.search,\n    tenant?.activeTenant?.tenantId,\n    generic1,\n    generic2,\n    generic3,\n    isManagerMode,\n    user?.id,\n    fetchForms\n  ]);\n\n  // derive menu items from fetched submissions (separate effect to avoid refetch loop)\n  useEffect(() => {\n    const innerMenuList = consolidateAndSortFormsByFormId(\n      formDataRaw || [],\n      formSubmissionViewDataRaw || []\n    );\n\n    innerMenuList.unshift({\n      id: 'all-forms-key',\n      name:\n        allFormTitle ??\n        (isManagerMode\n          ? t('formSubmissions.allFormSubmissions', {\n              defaultValue: 'All Form Submissions'\n            })\n          : t('formSubmissions.allMyFormSubmissions', {\n              defaultValue: 'All My Form Submissions'\n            })),\n      submissionCount: formSubmissionViewDataRaw?.length || 0\n    });\n    setInnerMenuItemList(innerMenuList);\n  }, [\n    formSubmissionViewDataRaw,\n    isManagerMode,\n    consolidateAndSortFormsByFormId,\n    formDataRaw,\n    t,\n    allFormTitle\n  ]);\n\n  return (\n    <div>\n      <CustomMenuPage\n        menuTitle={\n          menuTitle ?? t('formSubmissions.forms', { defaultValue: 'Forms' })\n        }\n        items={innerMenuItemList}\n        idPrefix='form-submission'\n        showItemCount={true}\n        itemCountAccessor={(item) => item?.submissionCount ?? 0}\n        mainContent={({ selectedNode, menuItemsList, idMap, classes }) => {\n          return (\n            <div>\n              {getMainGridContent({\n                selectedNode,\n                menuItemsList,\n                idMap,\n                classes\n              })}\n            </div>\n          );\n        }}\n      />\n    </div>\n  );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AA+BA,MAAM2B,4BAA4BC,OAAOC,OAAO;CAC9CC,aAAa;CACbC,WAAW;CACZ,CAAC;AAOF,MAAMC,+BAA+BJ,OAAOC,OAAO;CACjDI,YAAY;CACZC,WAAW;CACXC,SAAS;CACV,CAAC;AAOF,MAAMC,kBAAkBC,eAAe;CACrC,IAAIC,uBAAuBD;AAO3B,KAAIA,WAAWE,SAAS,IAAI,CAE1BD,wBAAuBD,WAAWG,QAAQ,KAAK,IAAI;AAIrD,KAAI,CAACH,WAAWI,aAAa,CAACC,SAAS,IAAI,CACzCJ,wBAAuBA,uBAAuB;AAMhD,QAHa,IAAIM,KAAKN,qBAAqB,CAG/BO,eAAeC,KAAAA,GAAW;EACpCC,MAAM;EACNC,OAAO;EACPC,KAAK;EACLC,MAAM;EACNC,QAAQ;EACRC,QAAQ;EACT,CAAC;;AAGJ,MAAMC,2BAA2BC,aAAa;AAC5C,KAAI,CAACA,SAAU,QAAO;CACtB,MAAM,CAACC,GAAGC,GAAGC,KAAKC,OAAOJ,SAAS,CAC/BK,MAAM,IAAI,CACVC,KAAKC,MAAMC,OAAOD,EAAE,CAAC;AACxB,KAAI,CAACN,KAAK,CAACC,KAAK,CAACC,EAAG,QAAO;AAI3B,QADc,IAAIb,KAAKW,GAAGC,IAAI,GAAGC,GAAG,IAAI,IAAI,IAAI,EAAE,CACrCO,aAAa;;AAS5B,MAAMC,sBAAsBC,UAAU;AACpC,KAAI,CAACA,MAAO,QAAO;AACnB,KAAI,OAAOA,UAAU,SAAU,QAAOA;AACtC,KAAI,OAAOA,UAAU,SAAU,QAAO;AACtC,KAAI;AACF,SAAOC,KAAKC,MAAMF,MAAM;SAClB;AACN,SAAO;;;AAIX,MAAMG,wBAAwBC,MAAM,OAAOA,MAAM,YAAYA,EAAEC,MAAM,CAACC,SAAS;AAqB/E,MAAMY,yBAAyB/C,eAAe;AAC5C,KAAI,CAACA,WAAY,QAAO;CACxB,IAAIC,uBAAuBD;AAC3B,KAAI,OAAOC,yBAAyB,YAAYA,qBAAqBC,SAAS,IAAI,CAChFD,wBAAuBA,qBAAqBE,QAAQ,KAAK,IAAI;AAE/D,KACE,OAAOF,yBAAyB,YAChC,CAACA,qBAAqBG,aAAa,CAACC,SAAS,IAAI,CAEjDJ,wBAAuBA,uBAAuB;CAGhD,MAAMK,OAAO,IAAIC,KAAKN,qBAAqB;AAC3C,KAAIwB,OAAOuB,MAAM1C,KAAK2C,SAAS,CAAC,CAAE,QAAO;AAEzC,QAAO3C,KAAK4C,mBAAmBzC,KAAAA,GAAW;EACxCC,MAAM;EACNC,OAAO;EACPC,KAAK;EACN,CAAC;;AAGJ,MAAMuC,wBAAwBtB,UAC5BR,OAAOQ,SAAS,GAAE,CAEf1B,QAAQ,iBAAiB,GAAG,CAC5BA,QAAQ,QAAQ,IAAI,CACpB+B,MAAM;AAEX,MAAMkB,gCAAgCC,KAAKC,MAAM;CAE/C,MAAMC,eADU3B,mBAAmByB,KAAKd,oBAAoB,EAC9BE,uBAAuBE;CACrD,MAAMa,WAAWH,KAAKT;AAQtB,QANaZ,qBAAqBuB,aAAa,GAC3CA,aAAarB,MAAM,GACnBF,qBAAqBwB,SAAS,GAC5BA,SAAStB,MAAM,GACfoB,EAAE,gCAAgC,EAAEI,cAAc,iBAAiB,CAAC;;AAK5E,MAAMC,2BAA2B;AAC/B,KAAI;AACF,SAAOC,KAAKC,gBAAgB,CAACC,iBAAiB,CAACC,YAAY;SACrD;AACN,SAAO;;;AAQX,MAAMC,yBAAyB;CAC7BC,WAAW;EAAEC,aAAa;EAAaC,YAAY;EAAQ;CAC3DC,uBAAuB;EACrBF,aAAa;EACbC,YAAY;EACb;CACDE,4BAA4B;EAC1BH,aAAa;EACbC,YAAY;EACb;CACDG,kBAAkB;EAAEJ,aAAa;EAAoBC,YAAY;EAAQ;CACzEI,gCAAgC;EAC9BL,aAAa;EACbC,YAAY;EACb;CACDK,uBAAuB;EACrBN,aAAa;EACbC,YAAY;EACb;CACDM,iCAAiC;EAC/BP,aAAa;EACbC,YAAY;EACb;CACDO,+BAA+B;EAC7BR,aAAa;EACbC,YAAY;EACb;CACDQ,4BAA4B;EAC1BT,aAAa;EACbC,YAAY;EACb;CACDS,wBAAwB;EACtBV,aAAa;EACbC,YAAY;EACb;CACDU,0BAA0B;EACxBX,aAAa;EACbC,YAAY;EACd;CACD;;;;;;;AASD,MAAMW,8BAA8BC,kBAAkB;AACpD,KAAI,CAACA,iBAAiBA,cAAc5C,WAAW,EAC7C,QAAO;CAGT,MAAM6C,cAAc,EAAE;AAEtBD,eAAcE,SAASC,WAAW;EAChC,MAAM,EAAEC,aAAaC,gBAAgBC,gBAAgBH;EAGrD,MAAMM,SAASxB,uBADGmB,YAAYI,mBAAmB;AAGjD,MAAI,CAACC,QAAQ;AACXC,WAAQC,KACN,gDAAgDP,YAAW,mBAC5D;AACD;;EAGF,MAAMjB,cAAcsB,OAAOtB;EAC3B,MAAMC,aAAaqB,OAAOrB;EAE1B,IAAIwB,OAAO;AACX,UAAQP,gBAAR;GACE,KAAKtG,mBAAmB8G;AACtBD,WAAO;AACP;GACF,KAAK7G,mBAAmB+G;AACtBF,WAAO;AACP;GACF,KAAK7G,mBAAmBgH;AACtBH,WAAO;AACP;GACF,KAAK7G,mBAAmBiH;AACtBJ,WAAO;AACP;GACF,KAAK7G,mBAAmBkH;AACtBL,WAAO;AACP;GACF,QACEA,QAAO;;EAGX,IAAIM,cAAcZ;AAElB,MACE,CAACY,eACDA,YAAYC,aAAa,KAAK,eAC9BD,YAAYC,aAAa,KAAK,QAC9B;AACAT,WAAQC,KACN,uBAAuBxB,YAAW,yBAA0BmB,cAC7D;AACD;;AAGF,MAAIlB,cAAc,OAChBa,aAAYd,eAAe;GACzBC;GACAwB;GACAQ,UAAUF;GACX;WAED9B,cAAc,UACdD,YAAYqB,mBAAmB,IAAI,2BAEnCP,aAAYd,eAAe;GACzBC;GACAwB,MAAMM;GACP;MAEDjB,aAAYd,eAAe;GACzBC;GACAwB;GACAT,QAAQe;GACT;GAEH;AAEF,QAAOjB;;AAMT,MAAMoB,qBAAqBC,UAAU;CACnC,MAAMC,mBAAmBD,MAAMlG,QAAQ,qBAAqB,GAAG;AAE/D,KAAImG,iBAAiBpG,SAAS,gBAAgB,CAC5C,QAAO;AAET,QAAOoG;;AAOT,MAAMC,4BAA4BC,SAAS;AAEzC,SADmBA,MAAME,MAAMC,uBAC/B;EACE,KAAKhH,6BAA6BC,WAChC,QAAO;EACT,KAAKD,6BAA6BG,QAChC,QAAO;EACT,KAAKH,6BAA6BE,UAChC,QAAO;EACT,QACE,QAAO;;;AAQb,MAAM+G,yBAAyBJ,SAAS;AAEtC,SADsBA,MAAME,MAAMI,0BAClC;EACE,KAAK,KACH,QAAO;EACT,QACE,QAAO;;;AAiBb,MAAMM,gBAAgB;CACpB,EAAE3D,MAAM,0BAA0B;CAClC,EAAEA,MAAM,yBAAyB;CACjC,EAAEA,MAAM,sBAAsB;CAC9B,EAAEA,MAAM,yBAAyB;CACjC,EAAEA,MAAM,gBAAgB;CACxB,EAAEA,MAAM,kBAAkB;CAC3B;AAMD,MAAM4D,sBAAsB;CAC1BvH,SAAS;CACTF,YAAY;CACZC,WAAW;CACXyH,SAAS;CACV;AAMD,MAAMC,qBAAqB;CACzBC,YAAY;CACZC,eAAe;EACbC,UAAU;EACVxC,QAAQ;EACRyC,WAAW;EACb;CACD;AAED,MAAaC,0BAA0B,EACrCC,gBAAgB,OAChBC,WAAWrH,KAAAA,GACXsH,WAAWtH,KAAAA,GACXuH,WAAWvH,KAAAA,GACXwH,uBAAuBxH,KAAAA,GACvByH,eAAezH,KAAAA,GACf0H,YAAY1H,KAAAA,GACZ2H,2BAA2B3H,KAAAA,GAC3B4H,0BAA0B,MAC1BC,yBAAyB,WACrB;CACJ,MAAMC,OAAOtK,SAAS;CACtB,MAAMuK,SAAStK,WAAW;CAC1B,MAAMuK,UAAUtK,YAAY;CAC5B,MAAMuK,WAAWtK,aAAa;CAC9B,MAAM,EAAEkF,MAAM/E,gBAAgB;CAC9B,MAAM,EAAEoK,iBAAiBC,kBAAkBvK,aAAa;CAGxD,MAAM,CAACwK,mBAAmBC,wBAAwBjL,SAAS,EAAE,CAAC;CAC9D,MAAM,CAACkL,2BAA2BC,gCAAgCnL,SAAS,EAAE,CAAC;CAC9E,MAAM,CAACoL,aAAaC,kBAAkBrL,SAAS,EAAE,CAAC;CAClD,MAAM,CAACsL,iBAAiBC,sBAAsBvL,SAAS,MAAM;CAC7D,MAAM,CAACwL,4BAA4BC,iCAAiCzL,SAAS,EAAE,CAAC;CAChF,MAAM,CAAC0L,6BAA6BC,kCAAkC3L,SAAS,EAAE,CAAC;CAClF,MAAM,CAAC4L,SAASC,cAAc7L,SAAS,KAAK;CAC5C,MAAM8L,wBAAwB5L,aAAa6L,QAAQ;AAAEF,aAAWE,IAAI;IAAI,EAAE,CAAC;CAC3E,MAAM,CAACC,iBAAiBC,sBAAsBjM,SAAS,MAAM;CAC7D,MAAM,CAACkM,cAAcC,mBAAmBnM,SAAS,KAAK;CACtD,MAAM,CAACoM,yBAAyBC,8BAA8BrM,SAAS,MAAM;CAC7E,MAAMsM,6BAA6BnM,OAAO,MAAM;CAEhD,MAAMoM,qBAAqBxM,cAAc;AACvC,SAAOkH,2BAA2ByE,4BAA4B;IAC7D,CAACA,4BAA4B,CAAC;CAEjC,MAAMc,cAAczM,cAAc;AAChC,SAAO;GACL,GAAG2J;GACHe;GACAgC,wBAAwB,4BAA4BhH,EAClD,iCACA,EAAEI,cAAc,qBAClB,CAAC,CAAA;GACF;IACA,CAAC4E,wBAAwBhF,EAAE,CAAC;AAE/BxF,iBAAgB;AACd,MAAI2L,WAAWW,oBAAoB;AACjCX,WAAQc,eAAeH,mBAAmB;AAC1CX,WAAQe,iBAAiB;;IAE1B,CAACf,SAASW,mBAAmB,CAAC;AAEjCtM,iBAAgB;AACd,MAAI,CAAC2L,QAAS;AAEdA,UAAQgB,aAAa;GAAEC,OAAO;GAAMC,SAAS,CAAC,UAAS;GAAG,CAAC;IAC1D,CAAClB,SAASQ,wBAAwB,CAAC;AAEtCnM,iBAAgB;AACd,MAAI,CAAC2L,SAASmB,qBAAsB;AAIpCnB,UAAQmB,qBAAqBX,wBAAwB;IACpD,CAACR,SAASQ,wBAAwB,CAAC;CAEtC,MAAMY,kCAAkC9M,aACrC+M,OAAO9D,cAAc,EAAE,KAAK;EAC3B,MAAM+D,4BAAY,IAAIC,KAAK;AAC3B,OAAK,MAAMC,QAAQH,OAAO;GACxB,MAAM,EACJI,IAAIC,QACJC,SAASC,aACT5H,MAAM6H,UACNC,aAAaC,iBACKC,qBAChBR;AACJ,OAAI,CAACE,UAAUE,eAAe,KAAM;GAEpC,MAAMK,MAAMrK,OAAO8J,OAAO;GAC1B,MAAMQ,WAAWZ,UAAUa,IAAIF,IAAI;GAGnC,MAAMG,aAAapK,OAAO4J,YAAY,IAAI;GAC1C,MAAMS,KAAKL,mBAAmB,IAAIlL,KAAKkL,iBAAiB,CAACxI,SAAS,GAAG;GAGrE,MAAM8I,mBAAmB/E,eAAe,EAAE,EAAE9B,QACzC8G,QAAQ3K,OAAO2K,KAAKC,sBAAsB,KAAKP,IACjD,CAACvJ;AAEF,OAAI,CAACwJ,SACHZ,WAAUmB,IAAIR,KAAK;IACjBR,IAAIQ;IACJP;IACAE,aAAaQ;IACbpI,MACE6H,YACAhI,EAAE,gCAAgC,EAChCI,cAAc,iBACf,CAAC;IACJqI;IACAR,aAAaC,mBAAmB;IAChCW,qBAAqBL;IACtB,CAAC;YAGED,cAAcF,SAASN,eAAe,IAAI;AAC5CM,aAASN,cAAcQ;AACvB,QAAIP,SAAUK,UAASlI,OAAO6H;AAC9B,QAAIE,gBAAiBG,UAASJ,cAAcC;;;AAQlD,SAHsBa,MAAMC,KAAKvB,UAAUwB,QAAQ,CAAC,CAACC,MAAMC,GAAGC,MAC5DA,EAAEjJ,KAAKkJ,cAAcF,EAAEhJ,KACzB,CAAC;IAGH,CAACH,EACH,CAAC;CA4DD,MAAM2J,aAAalP,YAAY,YAAY;AACzC,MAAI;AACF,OAAI,CAACyK,QAAQ0E,cAAcjG,SAAU;GAErC,MAAMkG,iBAAiB,EAAE;AAEzBA,kBAAeC,KAAK;IAClBjI,aAAa;IACbC,gBAAgB;IAChBC,aAAamD,OAAO0E,aAAajG;IAClC,CAAC;AAiBFiC,mBAfqB,MAAM1K,UACzBC,cAAc6O,iBACd,kBACA;IACEC,QAAQ;IACR7G,MAAM;KACJ8G,WAAW;KACXC,QAAQ;KACRN;KACF;IACD,EACD,EACF,CAAC,GAE2BzG,KAAKgH,YAAY,EAAE,CAC1B;WACdC,GAAG;AACVlI,WAAQmI,MAAM,qBAAqBD,EAAE;;IAEtC;EAACpF;EAAMC;EAzFwCzK,aAC/CiJ,kBAAgB;GACf,MAAM+D,8BAAY,IAAIC,KAAK;AAC3B,QAAK,MAAMC,UAAQjE,eAAa;IAC9B,MAAM,EACJiF,uBAAuBd,UACvB0B,4BAA4BxB,eAC5BzI,WAAW0I,YACXxI,kBAAkB0I,mBAClBsB,iCAAiCrB,uBAC/BR;AACJ,QAAI,CAACE,YAAUE,iBAAe,KAAM;IAEpC,MAAMK,QAAM,GAAGP;IACf,MAAMQ,aAAWZ,YAAUa,IAAIF,MAAI;IAGnC,MAAMG,eAAapK,OAAO4J,cAAY,IAAI;IAC1C,MAAMS,OAAKL,qBAAmB,IAAIlL,KAAKkL,mBAAiB,CAACxI,SAAS,GAAG;AAErE,QAAI,CAAC0I,WACHZ,aAAUmB,IAAIR,OAAK;KACjBR,IAAIQ;KACJP,QAAAA;KACAE,aAAaQ;KACbpI,MACE6H,cACAhI,EAAE,gCAAgC,EAChCI,cAAc,iBACf,CAAC;KACJqI,iBAAiB;KACjBR,aAAaC,qBAAmB;KAChCW,qBAAqBL;KACtB,CAAC;SACG;AACLH,gBAASI,mBAAmB;AAC5BJ,gBAASQ,sBAAsBY,KAAKC,IAClCrB,WAASQ,uBAAuB,GAChCL,KACD;AAGD,SAAID,gBAAcF,WAASN,eAAe,IAAI;AAC5CM,iBAASN,cAAcQ;AACvB,UAAIP,WAAUK,YAASlI,OAAO6H;AAC9B,UAAIE,kBAAiBG,YAASJ,cAAcC;;;;AAQlD,UAHsBa,MAAMC,KAAKvB,YAAUwB,QAAQ,CAAC,CAACC,MAClDC,KAAGC,QAAMA,IAAEP,sBAAsBM,IAAEN,oBACrC;KAGH,CAAC7I,EACH,CAAC;EAiC2D,CAAC;CAE7D,MAAMuK,wBAAwB9P,aAC3BoN,aAAW;AACV,MAAI,CAAC3C,QAAQ0E,cAAcjG,SAAU;EAErC,MAAMkG,mBAAiB,EAAE;AAEzB,MAAI,CAACtF,cACHsF,kBAAeC,KAAK;GAClBjI,aAAa;GACbC,gBAAgB;GAChBC,aAAakD,KAAK2C,MAAM;GACzB,CAAC;AAGJ,MAAIC,SACFgC,kBAAeC,KAAK;GAClBjI,aAAa;GACbC,gBAAgB;GAChBC,aAAa8F;GACd,CAAC;AAGJ,MAAIrD,aAAarH,KAAAA,EACf0M,kBAAeC,KAAK;GAClBjI,aAAa;GACbC,gBAAgB;GAChBC,aAAayC;GACd,CAAC;AAGJ,MAAIC,aAAatH,KAAAA,EACf0M,kBAAeC,KAAK;GAClBjI,aAAa;GACbC,gBAAgB;GAChBC,aAAa0C;GACd,CAAC;AAGJ,MAAIC,aAAavH,KAAAA,EACf0M,kBAAeC,KAAK;GAClBjI,aAAa;GACbC,gBAAgB;GAChBC,aAAa2C;GACd,CAAC;AAGJmF,mBAAeC,KAAK;GAClBjI,aAAa;GACbC,gBAAgB;GAChBC,aAAamD,QAAQ0E,cAAcjG,YAAY;GAChD,CAAC;AASF,SAAO;GACLgH,YAAY,GAAGxP,cAAc6O,gBAAe;GAC5CY,oBAAoB;IAClBV,WAAW;IACXL,gBAAAA;IACAW,eAZkB,CACpB;KACEC,YAAY;KACZC,eAAe;KAChB,CACF;IAQC;GAQD;IAEH;EAACzF;EAAMV;EAAeW;EAAQV;EAAUC;EAAUC;EACpD,CAAC;AAE4DjK,cAC1DoN,UAAQE,kBAAgB;AAKvB,SAAO,GAJWpD,uBACdA,uBACA,UAAUrJ,aAAayP,gCAER,eAAgBC,mBACjCnD,SACD,CAAA,oBAAqBmD,mBAAmBjD,cAAY;IAEvD,CAACpD,qBACH,CAAC;CAED,MAAMsG,+CAA+CxQ,aAClDyQ,iBAAiB;AAKhB,SAAO,GAJWvG,uBACdA,uBACA,UAAUrJ,aAAayP,gCAER,qBAAsBC,mBACvCE,aACD;IAEH,CAACvG,qBACH,CAAC;CAED,MAAMwG,sBAAsB1Q,aACzBoN,UAAQE,eAAaqD,cAAc;EAClC,MAAMlJ,SAAS,EACbmJ,OAAOD,WACR;AAED,MAAI,CAAC7G,cACHrC,QAAOoJ,sBAAsB;GAC3BC,OAAOvL,EAAE,iCAAiC,EACxCI,cAAc,mBACf,CAAC;GACFoL,eAAe;AACb,QAAI3D,YAAUE,cACZ/B,+BAA8B;KAAEzH,OAAO,GAAGsJ,SAAM,GAAIE;KAAewD,OAAOH;KAAW,CAAC;AAExFtF,uBAAmB,KAAK;;GAE3B;AAGH,SAAO5D;IAET;EAACiD;EAASnF;EAAGuE;EACf,CAAC;CAED,MAAMkH,aAAc;EAChB;GACEC,YAAY1L,EAAE,kCAAkC,EAC9CI,cAAc,WACf,CAAC;GACFuL,OAAO;GACPC,MAAM;GACP;EACD;GACEF,YAAY1L,EAAE,gCAAgC,EAC5CI,cAAc,QACf,CAAC;GACFuL,OAAO;GACPtJ,MAAM;GACN+B,UAAU;GACVyH,cAAcC,WAAW;IACvB,MAAM/L,MAAM+L,QAAQ1I;AACpB,QAAI,CAACrD,IAAK,QAAO;IAGjB,MAAME,eADU3B,mBAAmByB,IAAId,oBAAoB,EAC7BE,uBAAuBE;AACrD,QAAIX,qBAAqBuB,aAAa,CAAE,QAAOA,aAAarB,MAAM;AAElE,WAAOmB,IAAIT,aAAa;;GAE3B;EACD;GACEoM,YAAY1L,EAAE,mCAAmC,EAC/CI,cAAc,WACf,CAAC;GACFuL,OAAO;GACPtJ,MAAM;GACN+B,UAAU;GACX;EACD;GACEsH,YAAY1L,EAAE,uCAAuC,EACnDI,cAAc,eACf,CAAC;GACFuL,OAAO;GACPtJ,MAAM;GACN+B,UAAU;GACVwH,MAAM;GACNC,cAAcC,aAAW;IACvB,MAAM/L,QAAM+L,UAAQ1I;AACpB,QAAI,CAACrD,MAAK,QAAO;IAGjB,MAAMgM,sBADUzN,mBAAmByB,MAAId,oBAAoB,EAEhDE,uBAAuBI;AAClC,QAAIb,qBAAqBqN,oBAAoB,CAC3C,QAAOA,oBAAoBnN,MAAM;AAGnC,WAAOmB,MAAIP,oBAAoB;;GAElC;EACD;GACEkM,YAAY1L,EAAE,uCAAuC,EACnDI,cAAc,gBACf,CAAC;GACFuL,OAAO;GACPtJ,MAAM;GACN+B,UAAU;GACX;EACD;GACEsH,YAAY1L,EAAE,kCAAkC,EAC9CI,cAAc,UACf,CAAC;GACFwB,QAAQ;GACR+J,OAAO;GACPK,cAAc;GACdC,oBAAoB;IACGlI;IACrBmI,gBAAgBjJ;IAClB;GACD;EACD;GACEyI,YAAY1L,EAAE,yCAAyC,EACrDI,cAAc,kBACf,CAAC;GACFuL,OAAO;GACPQ,cAAc;GACd/H,UAAU;GACV4H,cAAc;GACdC,oBAAoB;IACGlI;IACrBmI,gBAAgB5I;IAClB;GACD;EACD;GACEoI,YAAY1L,EAAE,qCAAqC,EACjDI,cAAc,cACf,CAAC;GACFuL,OAAO;GACPS,iBAAiBC,MAAOA,EAAE9N,QAAQ9B,eAAe4P,EAAE9N,MAAM,GAAG;GAC5D6F,UAAU;GACV+H,cAAc;GACf;EACD;GACET,YAAY1L,EAAE,0CAA0C,EACtDI,cAAc,oBACf,CAAC;GACFuL,OAAO;GACPS,iBAAiBC,QAAOA,IAAE9N,QAAQ9B,eAAe4P,IAAE9N,MAAM,GAAG;GAC5D6F,UAAU;GACV+H,cAAc;GACf;EACD;GACET,YAAY1L,EAAE,uCAAuC,EACnDI,cAAc,gBACf,CAAC;GACFuL,OAAO;GACPS,iBAAiBC,QAAOA,IAAE9N,QAAQ9B,eAAe4P,IAAE9N,MAAM,GAAG;GAC5D6F,UAAU;GACV+H,cAAc;GACf;EACD;GACET,YAAY1L,EAAE,iCAAiC,EAC7CI,cAAc,UACf,CAAC;GACFuL,OAAO;GACPS,iBAAiBC,QAAOA,IAAE9N,QAAQ9B,eAAe4P,IAAE9N,MAAM,GAAG;GAC5D6F,UAAU;GACV+H,cAAc;GACf;EACD;GACER,OAAO;GACPK,cAAc;GACdC,oBAAoB,EAClBK,YAAY,CACV;IACE1E,IAAI;IACJ2E,UAAU;IACVlB,OAAOrL,EAAE,0CAA0C,EACjDI,cAAc,wBACf,CAAC;IACFoM,gBAAgBnC,KAAGyB,aAAW;AAC5B3G,aAAQ2E,KACN,GACEnF,uBACIA,uBACA,WAAWrJ,aAAayP,gCAA+B,qBACvCe,UAAQ1I,MAAMqJ,oBACrC;;IAEJ,EACD,GAAI1H,0BAA0B,CAC5B;IACE6C,IAAI;IACJ2E,UAAU;IACVlB,OAAOrL,EAAE,0CAA0C,EACjDI,cAAc,mBACf,CAAC;IACFsM,qBAAqB/F;IAErB6F,eAAe,OAAOnC,KAAGyB,aAAW;AAElC,SAAIjF,2BAA2B8F,QAC7B;AAGF9F,gCAA2B8F,UAAU;AACrC/F,gCAA2B,KAAK;AAChC,SAAI;MACF,MAAM7G,QAAM+L,UAAQ1I;MACpB,MAAMwJ,kBAAkBvM,oBAAoB;MAa5C,MAAM0M,QAZW,MAAM7R,UACrBC,cAAc6O,iBACd,qBAAqBjK,OAAK0M,kBAAiB,qBAAsBzB,mBAC/D4B,gBACD,IACD;OACE3C,QAAQ;OACR6C,cAAc;OACf,EACD,EACF,CAAC,EAEqB1J;MAEtB,MAAM4J,aAAalN,6BAA6BC,OAAKC,EAAE;MACvD,MAAMiN,kBACJlN,OAAKmN,kCACLlN,EAAE,+BAA+B,EAC/BI,cAAc,gBACf,CAAC;MAGJ,MAAMgN,iBAFcjP,OAAO4B,OAAKsD,sBAAsB,KAAKhH,6BAA6BE,YAGpFkD,sBAAsBM,OAAKsN,2BAA2B,IACtDrN,EAAE,6BAA6B,EAC7BI,cAAc,aACf,CAAC,GACFJ,EAAE,gCAAgC,EAChCI,cAAc,iBACf,CAAC;MAEN,MAAMkN,WAAW,GAAGzN,qBAAqBmN,WAAW,CAAA,KAAMnN,qBAAqBoN,gBAAgB,CAAA,KAAMpN,qBAAqBuN,eAAe,CAAA;MAGzI,MAAMG,UAAUC,OAAOC,IAAIC,gBAAgBX,KAAK;MAChD,MAAMY,OAAOC,SAASC,cAAc,IAAI;AACxCF,WAAKG,OAAOP;AACZI,WAAKI,WAAWT;AAChBM,eAASI,KAAKC,YAAYN,KAAK;AAC/BA,WAAKO,OAAO;AACZN,eAASI,KAAKG,YAAYR,KAAK;AAC/BH,aAAOC,IAAIW,gBAAgBb,QAAQ;cAE5BjD,OAAO;AACdnI,cAAQmI,MAAM,6BAA6BA,MAAM;AACjDjF,sBACErF,EAAE,uCAAuC,EACvCI,cAAc,4BACf,CAAC,EACF;OAAEiO,SAAS;OAASC,cAAc;QAAEC,UAAU;QAAOC,YAAY;QAAS;OAC5E,CAAC;eACO;AACR3H,iCAA2B8F,UAAU;AACrC/F,iCAA2B,MAAM;;;IAGtC,CACF,GAAG,EAAE,CAAC,EAEX;GACD;EACF;CAKH,MAAM6H,8BAA8B,YAAY;AAC9C,MAAI;GAGF,MAAM,CAAC7G,IAAI+G,eADC5I,4BAA4BxH,SAAS,IACpBP,MAAM,IAAI;GACvC,MAAM8J,UAAU3J,OAAOwQ,cAAc,EAAE;AACvC,OAAI,CAAC/G,MAAM,CAACE,SAAS;AACnB3F,YAAQC,KAAK,sBAAsB2D,2BAA2B;AAC9DD,uBAAmB,MAAM;AACzB;;GAGF,MAAM8I,KAAK,IAAIC,UAAU;AACzBD,MAAGE,OAAO,UAAUlH,GAAG;AACvBgH,MAAGE,OAAO,eAAe/Q,OAAO+J,QAAQ,CAAC;AACzC8G,MAAGE,OAAO,UAAU/Q,OAAO1B,6BAA6BG,QAAQ,CAAC;AACjEoS,MAAGE,OAAO,QAAQtQ,KAAKuQ,UAAU,EAAE,CAAC,CAAC;AACrC,OAAItI,aACFmI,IAAGE,OAAO,WAAWpR,wBAAwB+I,aAAa,CAAC;AAE7D,OAAIjC,aAAarH,KAAAA,EACfyR,IAAGE,OAAO,YAAY/Q,OAAOyG,SAAS,CAAC;AAEzC,OAAIC,aAAatH,KAAAA,EACfyR,IAAGE,OAAO,YAAY/Q,OAAO0G,SAAS,CAAC;AAEzC,OAAIC,aAAavH,KAAAA,EACfyR,IAAGE,OAAO,YAAY/Q,OAAO2G,SAAS,CAAC;GAazC,MAAMuK,mBAVmC,MAAM/T,UAC7CC,cAAc6O,iBACd,qBACA;IACEC,QAAQ;IACR7G,MAAMwL;IACP,EACD,EACF,CAAC,GAEyDxL,MAAMwE;AAChE9B,sBAAmB,MAAM;GACzB,MAAMoJ,UAAUjE,6CAA6CgE,gBAAgB;AAC7E9J,WAAQ2E,KAAKoF,QAAQ;WACd7E,KAAG;AACVlI,WAAQmI,MAAM,sCAAsCD,IAAE;AACtDhF,mBACErF,EAAE,mCAAmC,EACnCI,cAAc,8BACf,CAAC,EACF;IAAEiO,SAAS;IAAUC,cAAc;KAAEC,UAAU;KAAOC,YAAY;KAAS;IAC7E,CAAC;;;CAIL,MAAMW,qCAAqC1U,aAAa2U,YAAY;AAClE5I,qBAAmB4I,QAAQ;AAC3B,MAAI,CAACA,QAAS1I,iBAAgB,KAAK;IAClC,EAAE,CAAC;CAEN,MAAM2I,sBAAsB5U,aAAa4P,QAAM;EAC7C,MAAMiF,OAAOjF,KAAGkF,QAAQhR;AACxBmI,kBAAgB4I,KAAK;IACpB,EAAE,CAAC;CAEN,MAAME,8BAA8B;AAClCxJ,gCAA8B,EAAE,CAAC;AACjCF,qBAAmB,MAAM;AACzBU,qBAAmB,MAAM;AACzBE,kBAAgB,KAAK;;CAGvB,MAAM+I,kBAAkBnV,cAAc;EACpC,MAAM2D,sBAAM,IAAIyJ,KAAK;AAErB,OAAK,MAAMgI,KAAK/J,eAAe,EAAE,EAAE;GACjC,MAAMgK,WAAWD,EAAEE,aAAaF,EAAEC,YAAYD,EAAErN;AAChD,OAAIlE,OAAOwR,SAAS,KAAK,EAAG;GAE5B,MAAM9H,WAAS6H,EAAE9H,MAAM8H,EAAEG,WAAWH,EAAE7H,UAAU9J,OAAO2R,GAAGI,MAAM,GAAG;GACnE,MAAMhI,YAAU3J,OAAOuR,EAAE5H,WAAW4H,EAAEK,gBAAgBL,EAAE3H,eAAe,EAAE;GACzE,MAAM5H,OACJuP,EAAEvP,QACFuP,EAAEpQ,aACFoQ,EAAE1H,YACF0H,EAAEM,aACFN,EAAEO,eACFjQ,EAAE,gCAAgC,EAAEI,cAAc,iBAAiB,CAAC;GACtE,MAAM6H,cAAcyH,EAAEzH,eAAeyH,EAAElQ,oBAAoB;GAE3D,MAAM6I,aAAWpK,IAAIqK,IAAIT,SAAO;AAChC,OAAI,CAACQ,cAAYP,YAAUO,WAASP,QAClC7J,KAAI2K,IAAIf,UAAQ;IAAED,IAAIC;IAAQ1H;IAAM2H,SAAAA;IAASG;IAAa,CAAC;;AAI/D,SAAOc,MAAMC,KAAK/K,IAAIgL,QAAQ,CAAC,CAACC,MAAMC,KAAGC,QAAMA,IAAEtB,UAAUqB,IAAErB,QAAQ;IACpE,CAACnC,aAAa3F,EAAE,CAAC;CAEpB,MAAMkQ,kBAAkB5V,cAAc;AACpC,UAAQmV,mBAAmB,EAAE,EAAExR,KAAKkS,OAAO;GACzC5R,OAAO,GAAG4R,EAAEvI,GAAE,GAAIuI,EAAErI;GACpByD,OAAO4E,EAAErI,UAAU,GAAGqI,EAAEhQ,KAAI,KAAMgQ,EAAErI,QAAO,KAAMqI,EAAEhQ;GACpD,EAAE;IACF,CAACsP,gBAAgB,CAAC;CAErB,MAAMW,0CAA0CC,OAAOC,aAAa;AAClE,MAAIA,aAAa,KACftK,+BAA8BsK,SAAS;;CAI3C,MAAMC,sBAAsB,EAC1BC,cACAC,eACAC,OACAC,cACI;AACJ,MAAI,CAACH,aACH,QAAO,sBAAA,cAAC,aAAA,KAAc;EAExB,MAAM3I,WAAS/E,kBAAkB0N,aAAa5I,GAAG;EACjD,MAAMgJ,QAAQrL,kBAAkBsL,MAAMC,SAASA,KAAKjJ,UAAUA,SAAO;EACrE,MAAMuD,cAAY,GAAGwF,OAAOzQ,UAAU;EACtC,MAAM4Q,oBAAoBpL,YACvB/D,QAAQoP,YAAYA,QAAQpJ,MAAMC,SAAO,CACzCoJ,QAAQC,KAAKC,SAAS;AACrB,UAAO1H,KAAKC,IAAIwH,KAAKC,KAAKrJ,QAAQ;KACjC,KAAK;AAEV,SACE,sBAAA,cAAA,MAAA,UAAA,MACE,sBAAA,cAAC,WAAD;GACE,MAAMjC;GACN,OAAO7F,EAAE,iCAAiC,EACxCI,cAAc,mBACf,CAAC;GACF,UAAS;GACT,OAAO;GACP,aAAaJ,EAAE,cAAc,EAAEI,cAAc,OAAO,CAAC;GAGrD,mBAAmB,CAAC2F,4BAA4BxH,SAAUgI,mBAAmB,CAACE;GAC9E,UAAUgI;GACV,SAASe;GAsDA,EApDT,sBAAA,cAAC,kBAAD;GACE,SACE,sBAAA,cAAC,QAAD;IACE,MAAK;IACL,WAAWnF,QAAM8E,mCAAmCiC,QAAQ/G,KAAGkF,QAAQH,QAAQ,CAAC;IAEpF,CAAA;GACA,OAAOpP,EAAE,8BAA8B,EACrCI,cAAc,kBACf,CAAC;GACF,OAAO,EAAEiR,YAAY,GAAG;GAAC,CAAA,EAExB9K,kBACC,sBAAA,cAAC,WAAD;GACE,OAAOvG,EAAE,2BAA2B,EAClCI,cAAc,YACf,CAAC;GACF,MAAK;GACL,SAAQ;GACR,MAAK;GACL,iBAAiB,EAAEkR,QAAQ,MAAM;GACjC,OAAO7K;GACP,UAAU4I;GACV,YAAYrP,EAAE,+BAA+B,EAC3CI,cACE,8DACH,CAAC;GACF,CAAA,GACF,MAGH,EAAEwQ,OAAOhJ,MAAMmJ,sBACd,sBAAA,cAAC,cAAD;GACE,SAASb;GACT,iBAAiBqB,mBAAmBA,eAAehG;GACnD,UAAU6E;GAEV,OAAOrK;GACP,kBAAkB;GAClB,MAAK;GACL,cAAc+F,aACZ,sBAAA,cAAC,WAAD;IACE,GAAIA;IACJ,OAAO9L,EAAE,8BAA8B,EACrCI,cAAc,iBACf,CAAC;IACF,SAAQ;IAEX,CAAA;GAEJ,CAAA,CAEQ,EAEX,sBAAA,cAAC,qBAAD;GACE,oBAAoBmK,sBAAsB1C,SAAO;GACrC4D;GACZ,QAAQlH,gBAAgBvI,0BAA0BI,YAAYJ,0BAA0BG;GAC3E4K;GACb,kBAAkBoE,oBAChBtD,UACAkJ,mBACA3F,YACD;GACctH;GACf,iBAAiBuC;GAAuB,CAAA,CAEzC;;AAIP7L,iBAAgB;AACd,MAAI,CAAC0K,QAAQ0E,cAAcjG,SAAU;AAGrCuC,iCADsBnK,oCAAoC,CACb;EAE7C,IAAI0V,YAAY;AAChB,GAAC,YAAY;AACX,OAAI;IAEF,IAAI5H,mBAAiB,EAAE;AAEvBA,qBAAeC,KAAK;KAClBjI,aAAa;KACbC,gBAAgB;KAChBC,aAAamD,OAAO0E,aAAajG;KAClC,CAAC;AAEF,QAAI,CAACY,cACHsF,kBAAeC,KAAK;KAClBjI,aAAa;KACbC,gBAAgB;KAChBC,aAAakD,KAAK2C;KACnB,CAAC;AAGJ,QAAIpD,aAAarH,KAAAA,EACf0M,kBAAeC,KAAK;KAClBjI,aAAa;KACbC,gBAAgB;KAChBC,aAAayC;KACd,CAAC;AAGJ,QAAIC,aAAatH,KAAAA,EACf0M,kBAAeC,KAAK;KAClBjI,aAAa;KACbC,gBAAgB;KAChBC,aAAa0C;KACd,CAAC;AAGJ,QAAIC,aAAavH,KAAAA,EACf0M,kBAAeC,KAAK;KAClBjI,aAAa;KACbC,gBAAgB;KAChBC,aAAa2C;KACd,CAAC;IAGJ,MAAMsK,qCAAmC,MAAM9T,UAC7CC,cAAc6O,iBACd,qCACA;KACEC,QAAQ;KACR7G,MAAM;MACJ8G,WAAW;MACXC,QAAQ;MACRN,gBAAAA;MACF;KACD,EACD,EACF,CAAC;AAED,QAAI4H,UAAW;AAMf/L,kCAJoBsJ,oCAAkC5L,KAAKgH,YAAY,EAAE,EAChCxI,QAAQgC,eAC/CA,WAAWC,kBAAkBqB,OAAO0E,aAAajG,SAClD,CACiD;AAClD,UAAMgG,YAAY;YACXgI,KAAK;AACZxP,YAAQmI,MAAM,qCAAqCqH,IAAI;;MAEvD;AAEJ,eAAa;AACXF,eAAY;;IAEb;EACDrM,SAASwM;EACT1M,QAAQ0E,cAAcjG;EACtBa;EACAC;EACAC;EACAH;EACAU,MAAM2C;EACN+B;EACD,CAAC;AAGFnP,iBAAgB;EACd,MAAMqX,gBAAgBtK,gCACpB5B,eAAe,EAAE,EACjBF,6BAA6B,EAC/B,CAAC;AAEDoM,gBAAcC,QAAQ;GACpBlK,IAAI;GACJzH,MACEyE,iBACCL,gBACGvE,EAAE,sCAAsC,EACtCI,cAAc,wBACf,CAAC,GACFJ,EAAE,wCAAwC,EACxCI,cAAc,2BACf,CAAC;GACRqI,iBAAiBhD,2BAA2B5G,UAAU;GACvD,CAAC;AACF2G,uBAAqBqM,cAAc;IAClC;EACDpM;EACAlB;EACAgD;EACA5B;EACA3F;EACA4E;EACD,CAAC;AAEF,QACE,sBAAA,cAAC,OAAA,MACC,sBAAA,cAAC,gBAAD;EACE,WACEC,aAAa7E,EAAE,yBAAyB,EAAEI,cAAc,SAAS,CACnE;EACA,OAAOmF;EACP,UAAS;EACT,eAAe;EACf,oBAAoBoC,WAASA,QAAMc,mBAAmB;EACtD,cAAc,EAAE+H,cAAAA,gBAAcC,eAAAA,iBAAeC,OAAAA,SAAOC,SAAAA,gBAAc;AAChE,UACE,sBAAA,cAAC,OAAA,MACEJ,mBAAmB;IAClBC,cAAAA;IACAC,eAAAA;IACAC,OAAAA;IACAC,SAAAA;IACD,CAAC,CACE;;EAER,CAAA,CAEA"}