@flexkit/studio 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/dist/chat-page-ZFPMTRLD.js +2 -0
  2. package/dist/chat-page-ZFPMTRLD.js.map +1 -0
  3. package/dist/chunk-BKJ2DBRK.js +2 -0
  4. package/dist/{chunk-QQUNCDUB.js.map → chunk-BKJ2DBRK.js.map} +1 -1
  5. package/dist/chunk-DPCMOWK4.js +3 -0
  6. package/dist/chunk-DPCMOWK4.js.map +1 -0
  7. package/dist/chunk-DQ6Z333C.js +4 -0
  8. package/dist/{chunk-YINI2YKQ.js.map → chunk-DQ6Z333C.js.map} +1 -1
  9. package/dist/{chunk-OUSEULBR.js → chunk-LMVJWCOM.js} +4 -4
  10. package/dist/{chunk-OUSEULBR.js.map → chunk-LMVJWCOM.js.map} +1 -1
  11. package/dist/{chunk-7PDYCDX6.js → chunk-LX7Q56OS.js} +2 -2
  12. package/dist/{chunk-7PDYCDX6.js.map → chunk-LX7Q56OS.js.map} +1 -1
  13. package/dist/chunk-MKEIZ5ZQ.js +5 -0
  14. package/dist/chunk-MKEIZ5ZQ.js.map +1 -0
  15. package/dist/chunk-QJWY4XIM.js +2 -0
  16. package/dist/{chunk-GZIMMYLK.js.map → chunk-QJWY4XIM.js.map} +1 -1
  17. package/dist/{chunk-3CPWATOI.js → chunk-WBZKCRQK.js} +2 -2
  18. package/dist/{chunk-3CPWATOI.js.map → chunk-WBZKCRQK.js.map} +1 -1
  19. package/dist/index.css +6 -0
  20. package/dist/index.js +4 -4
  21. package/dist/list-GALFFS5F.js +2 -0
  22. package/dist/{list-SQCN7HA3.js.map → list-GALFFS5F.js.map} +1 -1
  23. package/dist/pages-IA7GOMMS.js +3 -0
  24. package/dist/pages-IA7GOMMS.js.map +1 -0
  25. package/dist/{plugin-pages-AHOA6YJE.js → plugin-pages-Q63UBSKH.js} +2 -2
  26. package/dist/{plugin-pages-AHOA6YJE.js.map → plugin-pages-Q63UBSKH.js.map} +1 -1
  27. package/dist/root-5TCUJI6Q.js +23 -0
  28. package/dist/{root-4FGNRGCD.js.map → root-5TCUJI6Q.js.map} +1 -1
  29. package/dist/{root-IIILTOJI.js → root-SMHRBFGW.js} +3 -3
  30. package/dist/{root-IIILTOJI.js.map → root-SMHRBFGW.js.map} +1 -1
  31. package/dist/root-VSTE2THV.js +2 -0
  32. package/dist/{root-5ZW536V7.js.map → root-VSTE2THV.js.map} +1 -1
  33. package/dist/{root-QPQQ3DFJ.js → root-VYZYDWIB.js} +2 -2
  34. package/dist/{root-QPQQ3DFJ.js.map → root-VYZYDWIB.js.map} +1 -1
  35. package/dist/{search-2K2BU4UU.js → search-K75Q65A6.js} +2 -2
  36. package/dist/{search-2K2BU4UU.js.map → search-K75Q65A6.js.map} +1 -1
  37. package/dist/{skills-pages-PSBRTFGK.js → skills-pages-KDG2NOQJ.js} +2 -2
  38. package/dist/{skills-pages-PSBRTFGK.js.map → skills-pages-KDG2NOQJ.js.map} +1 -1
  39. package/package.json +4 -4
  40. package/dist/chat-page-NWMI4XOE.js +0 -2
  41. package/dist/chat-page-NWMI4XOE.js.map +0 -1
  42. package/dist/chunk-GZIMMYLK.js +0 -2
  43. package/dist/chunk-NSYO57O3.js +0 -5
  44. package/dist/chunk-NSYO57O3.js.map +0 -1
  45. package/dist/chunk-QQUNCDUB.js +0 -2
  46. package/dist/chunk-W2EBZZAY.js +0 -3
  47. package/dist/chunk-W2EBZZAY.js.map +0 -1
  48. package/dist/chunk-YINI2YKQ.js +0 -4
  49. package/dist/list-SQCN7HA3.js +0 -2
  50. package/dist/pages-OIAPASPF.js +0 -3
  51. package/dist/pages-OIAPASPF.js.map +0 -1
  52. package/dist/root-4FGNRGCD.js +0 -23
  53. package/dist/root-5ZW536V7.js +0 -2
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/core/attribute-scope.ts","../src/graphql-client/queries.ts","../src/graphql-client/error-utils.ts","../src/graphql-client/graphql-context.tsx","../src/graphql-client/refetch-entity-lists.ts","../src/graphql-client/use-entity-query.ts","../src/core/error/project-disabled.tsx","../src/core/error/schema-error.tsx","../src/data-grid/should-load-more.ts","../src/data-grid/data-table.tsx","../src/entities/actions-context.tsx","../src/data-grid/data-table-sorted-by.tsx","../src/graphql-client/use-entity-mutation.ts","../src/data-grid/data-table-column-header.tsx","../src/data-grid/preview-components/boolean.tsx","../src/data-grid/preview-components/copyable-truncated-text.tsx","../src/data-grid/preview-components/text.tsx","../src/form/fields/editor/extensions.ts","../src/data-grid/preview-components/editor-text.ts","../src/data-grid/preview-components/editor.tsx","../src/ui/hooks/use-cached-image-src.ts","../src/data-grid/preview-components/asset.tsx","../src/data-grid/preview-components/datetime.tsx","../src/data-grid/preview-components/select.tsx","../src/data-grid/preview-components/tags.tsx","../src/data-grid/preview-components/rating-state.ts","../src/data-grid/preview-components/rating.tsx","../src/apps/asset-manager/data-grid/asset-url.ts","../src/apps/asset-manager/data-grid/preview-components/asset.tsx","../src/data-grid/columns.tsx"],"names":["getAttributeScope","attribute","FULL_ASSET_CONNECTION_LIMIT","LIST_ASSET_CONNECTION_LIMIT","NESTED_RELATIONSHIP_LIMIT","stringTypes","temporalTypes","assetFields","assetFieldsWithoutLqip","listAssetPreviewFields","isAssetRelationshipAttribute","hasOrderedAssetConnectionProperties","entity","tagSchema","isAssetAttribute","getOrderedAssetsFromConnection","connection","typedConnection","edges","totalCount","result","edge","index","a","b","getKnownAssetSortOrders","assets","asset","unwrapNode","value","getAssetConnectionNodeFields","includeLqip","previewOnly","getAssetConnectionSelection","attributeName","includeProperties","first","propertiesSelection","nodeFields","connectionArguments","getConnectionCount","getEntityCount","results","entityNamePlural","total","getConnectionCountSelection","fieldName","whereArgument","getTopLevelCountSelection","includeCount","countMode","getDisplayAttributeSelection","primaryAttribute","scope","schema","forList","additionalScope","field","nestedEntity","find","propEq","fieldAttribute","localAttributeQuery","getFullRelatedEntityAttributesSelection","relatedEntity","relatedAcc","relatedAttribute","relationshipEntity","relationshipAttribute","getAttributesByName","attributes","attributesByName","shouldSelectAttributeInList","getSortNotNullWhere","sort","primarySort","sortAttributeName","sortAttribute","getEntityQuery","options","requestedSelection","selection","filters","entitySchema","getEntitySchema","entityName","displayAttribute","getDisplayAttribute","heading","operationName","getOperationEntityName","globalAttributesList","getAttributeListByScope","imageAttributes","getImageAttributes","localAttributes","defaultScopedAttr","acc","scopedAttribute","localAttributesList","imageFieldsSelection","imageAttributesList","relationshipAttributesList","primarySelection","relatedLimit","attributesNameList","mapQueryResult","count","items","sliceFirstThreeItems","values","primaryAttributeName","item","scopedNode","mappedQueryResult","_id","updatedAt","globalAttributes","relationshipAttributes","relatedEntityName","localValue","primaryAttributeScope","relatedItems","relatedNode","primaryScopedNode","mapQueryResultForFormFields","attributeSchema","localAttribute","getValueByScope","rawValue","aggregateCount","attr","option","getEntityUpdateMutation","entityId","originalData","dataToMutate","pluralizedEntityName","capitalize","data","filterOutInvalidAttributes","globalAttributesUpdate","localAttributesUpdate","imageAttributesUpdate","relationshipAttributesUpdate","responseType","attributeNamesList","formatResponseFieldsForMutation","nonUpdatableAttributes","omit","pick","type","attributeType","schemaAttributes","operation","toPairs","valueToStringify","typedValue","stringifyValue","getLinkedAssetId","attributeValue","nextId","originalId","disconnect","stringifyStringLiteral","connect","imageAttributesCreate","assetId","dataType","inputType","relationship","orderedAssetRelationshipUpdate","disconnectIds","uniq","idsToConnect","node","originalValue","orderedConnections","orderedConnectionIds","originalSortOrderById","getRelationshipSortOrderById","disconnectedIds","newConnections","reorderedConnections","originalSortOrder","getOrderedAssetDisconnectString","getOrderedAssetConnectString","reorder","getOrderedAssetReorderString","fieldValue","sortOrder","ids","disconnectString","connections","getOrderedAssetConnectNodes","connectString","updateString","globalAttributesArray","localAttributesArray","relationshipAttributesArray","fields","relationshipMode","relationshipEntityName","relationshipEntityAttributes","list","multipleRelationshipAttributes","str","getEntityDeleteMutation","idList","localAttributesDelete","getEntityDeleteWhere","localIds","id","idFilter","getEntityCreateMutation","entityData","_options","localAttributesCreate","relationshipAttributesCreate","defaultScope","isMultipleRelationship","hasRelationships","connectNodes","getRelatedItemsQuery","queryEntityName","getEntityAssetConnectionQuery","normalizedEntityName","assetSchema","getLocalAttributeIdsFromUpdateResponse","response","updateKey","payload","entities","nodeId","hasCause","error","getServerError","ServerError","possibleServerError","getErrorMessage","message","parseErrorBody","bodyText","getGraphQLSchemaMismatchMessage","messages","getGraphQLValidationMessages","isMissingCountStoreFieldMessage","isMissingGraphQLFieldError","CombinedGraphQLErrors","isSchemaValidationError","directMessage","isSchemaValidationMessage","serverError","responseBody","getServerErrorResult","getErrorCauseResponse","cause","causeMessage","extensions","ApolloProviderCompat","ApolloProvider","GraphQLErrorContext","createContext","useGraphQLError","ctx","useContext","createErrorLink","setSchemaErrorMessage","ErrorLink","schemaMismatchMessage","locations","path","CombinedProtocolErrors","responseError","errors","responseMessage","firstError","firstErrorMessage","additiveLink","currentProjectId","from","HttpLink","client","ApolloClient","InMemoryCache","responseObject","defaultDataIdFromObject","GraphQLProvider","children","useConfig","schemaErrorMessage","useState","useMemo","apolloClient","jsx","refetchTimer","pendingQueryNames","pendingResolvers","listeners","removalListeners","patchListeners","getEntityListQueryName","entityNameOrPlural","byPlural","byName","plural","subscribeEntityListRefetch","listener","subscribeEntityListRemoval","subscribeEntityListPatch","scheduleEntityListRemoval","queryName","entityIds","scheduleEntityListRefetch","scheduleEntityListPatch","patches","nextPatches","patch","_apolloClient","resolve","reject","names","resolvers","finish","fail","useEntityQuery","variables","isForm","setResult","isLoadingMore","setIsLoadingMore","isReloading","setIsReloading","unsupportedTotalCount","setUnsupportedTotalCount","isLoadingMoreRef","useRef","isReloadingRef","nextOffsetRef","syncedQueryKeyRef","pendingQueryKeyRef","totalCountField","queryDocument","gql","fetchMoreDocument","isLoading","fetchNextPage","refetch","networkStatus","useQuery","fetchNextPageRef","refetchRef","fetchMoreDocumentRef","previousNetworkStatusRef","variablesRef","isMissingTotalCountField","shouldFallbackToAggregate","effectiveError","isTotalCountFallbackLoading","isProjectDisabled","isProjectReadOnly","useEffect","fetchMore","useCallback","args","limit","offset","res","mappedFetchMoreResults","mapResults","pageLength","prevRows","merged","uniqBy","prop","fetchError","reload","preserve","queryKey","mapped","getVariablesOffset","previousStatus","NetworkStatus","listQueryName","unsubscribeRefetch","queryNames","unsubscribeRemoval","prev","nextResults","row","rowId","removedCount","unsubscribePatch","applyEntityListPatches","patchById","didPatch","sortEntityListResults","primarySortEntry","sortField","sortDirection","direction","left","right","leftValue","rightValue","leftText","rightText","ProjectDisabled","jsxs","Alert","AlertCircle","AlertTitle","AlertDescription","SchemaError","Fragment","summary","deployHint","details","detail","shouldLoadMore","scrollHeight","scrollTop","clientHeight","threshold","DEFAULT_ROW_HEIGHT_PX","ROW_OVERSCAN","COLUMN_OVERSCAN","STICKY_HEADER_HEIGHT_PX","inferRowHeightEstimate","rowClassName","tokens","resolveRowHeightPx","rowHeightEstimate","DataTable","classNames","columns","hasMore","initialSelectionState","onEntitySelectionChange","onLoadMore","onScroll","onSortingChange","pageSize","rowAdditionState","rowDeletionState","scrollToTopKey","sortingProp","toolbarComponent","scrollRef","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnFilters","setColumnFilters","uncontrolledSorting","setUncontrolledSorting","sorting","currentSelection","nextSelection","handleSortingChange","updater","table","useReactTable","handleRowSelectionChange","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","getRowClassnames","rows","rowHeightPx","hasExplicitRowHeightClass","rowVirtualizer","useVirtualizer","visibleColumns","headerGroups","virtualizeColumns","columnVirtualizer","columnSizesKey","column","virtualColumns","firstColumn","lastColumn","paddingLeft","paddingRight","virtualItems","paddingTop","paddingBottom","getVirtualBodySpacers","onLoadMoreRef","hasMoreRef","checkLoadMore","container","scrollElement","updaterFn","selectedIds","handleScroll","event","cn","TooltipProvider","Table","TableHeader","headerGroup","TableRow","VirtualColumnSpacer","header","TableHead","flexRender","TableBody","TableCell","VirtualRowSpacer","virtualRow","cell","totalSize","scrollMargin","firstStart","lastEnd","width","height","line","ActionsContext","EntityDispatchContext","actionsReducer","actions","action","actionType","props","ActionsProvider","entityActions","dispatchEntityActions","useReducer","useActions","useDispatch","DataTableSortedBy","label","Button","X","useEntityMutation","runMutation","setRunMutation","mutation","setMutation","setOptions","mutateFunction","loading","useMutation","DataTableColumnHeader","title","className","isSortedAsc","isSortedDesc","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuItem","ArrowUp","ArrowDown","Boolean","CircleCheck","CircleX","TOOLTIP_MAX_LENGTH","COPIED_DISMISS_MS","CopyableTruncatedText","textRef","dismissTimeoutRef","copied","setCopied","tooltipOpen","setTooltipOpen","measureTruncation","element","handleClick","handlePointerEnter","handleTooltipOpenChange","open","tooltipText","Tooltip","TooltipTrigger","CheckIcon","CopyIcon","TooltipContent","Text","displayValue","aiHighlight","AIHighlight","placeholder","Placeholder","tiptapLink","TiptapLink","cx","markdownExtension","Markdown","tiptapImage","TiptapImage","UploadImagesPlugin","taskList","TaskList","taskItem","TaskItem","horizontalRule","HorizontalRule","starterKit","StarterKit","codeBlockLowlight","CodeBlockLowlight","createLowlight","common","youtube","Youtube","twitter","Twitter","mathematics","Mathematics","characterCount","CharacterCount","defaultExtensions","TiptapUnderline","HighlightExtension","TextStyle","Color","CustomKeymap","GlobalDragHandle","serializer","createSerializer","getSchema","getTextSerializersFromSchema","getEditorPreviewText","maxLength","document","getText","Node","Editor","textValue","MAX_CACHE_ENTRIES","MAX_SINGLE_BLOB_BYTES","blobUrlCache","inFlightLoads","corsBlockedUrls","preloadedImages","ensurePreloaded","url","img","touch","entry","evictIfNeeded","entries","evictCount","i","loadToCache","existing","promise","blob","objectUrl","err","useCachedImageSrc","initial","cached","src","setSrc","isStale","next","transparentImageBackground","Asset","AssetStack","SingleAsset","hasPath","isImage","getExtensionFromPath","p","clean","parts","thumbnaillUrl","IMAGES_BASE_URL","fullUrl","cachedThumbnailSrc","TooltipPortal","ext","style","defaultStyles","FileTypeIcon","overflowCount","DateTime","date","isValid","format","isGroupedSelectList","flattenSelectList","resolveSelectLabel","match","Select","stringValue","Tags","tag","Badge","getRatingState","max","numeric","filled","Rating","state","_","Star","IMAGE_EXTENSION","getFilenameFromUrl","pathname","getAssetFilename","getExtensionFromAsset","filename","isImageAsset","getAssetImageUrl","size","params","separator","FileTypeIconCompat","isZoomOpen","setIsZoomOpen","thumbnailUrl","handleThumbnailClick","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","SORTABLE_INPUT_TYPES","useGridColumnsDefinition","attributesSchema","checkboxSelect","actionsComponent","enableColumnSorting","auth","useAuth","visibleAttributesSchema","filterAttributesForSpaces","inputTypeToPreviewFieldMap","previewFieldComponentsMap","cols","previewType","previewComponent","isTagsPreview","canSort","PreviewComponent","singleCheckboxSelect","Checkbox","multipleCheckboxSelect"],"mappings":"i4DAEO,SAASA,CAAAA,CAAkBC,CAAAA,CAAiC,CACjE,OAAIA,CAAAA,CAAU,WAAa,OAAA,CAClB,QAAA,CAGFA,EAAU,KACnB,KC6BaC,EAAAA,CAA8B,EAAA,CAErCC,GAA8B,CAAA,CAE9BC,EAAAA,CAA4B,EAE5BC,EAAAA,CAA0B,CAAC,KAAM,QAAQ,CAAA,CACzCC,GAA4B,CAAC,MAAA,CAAQ,WAAY,UAAA,CAAY,MAAM,EACnEC,EAAAA,CAAc,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA,CAUdC,EAAAA,CAAyB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,WAAA,CAAA,CASzBC,EAAAA,CAAyB,CAAA;AAAA;AAAA,aAAA,EAkB/B,SAASC,EAAAA,CAA6BT,CAAAA,CAA2C,CAC/E,OAAKA,CAAAA,CAKHD,EAAkBC,CAAS,CAAA,GAAM,gBACjCA,CAAAA,CAAU,YAAA,EAAc,OAAS,UAAA,EACjCA,CAAAA,CAAU,aAAa,MAAA,GAAW,QAAA,CAN3B,KAQX,CAEA,SAASU,GAAoCV,CAAAA,CAAkCW,CAAAA,CAAqC,CAClH,OAAI,CAACX,GAAa,CAACS,EAAAA,CAA6BT,CAAS,CAAA,CAChD,KAAA,CAGFW,GAAQ,IAAA,GAASC,CAAAA,CAAU,MAAQZ,CAAAA,CAAU,IAAA,GAAS,QAC/D,CAEA,SAASa,GAAiBb,CAAAA,CAA2C,CACnE,OAAOA,CAAAA,EAAW,WAAa,OAAA,EAAWA,CAAAA,EAAW,YAAc,OACrE,CAEO,SAASc,EAAAA,CAA+BC,CAAAA,CAA0C,CACvF,IAAMC,CAAAA,CAAkBD,EAClBE,CAAAA,CAAQD,CAAAA,EAAiB,OAAS,EAAC,CAGnCE,EAAaF,CAAAA,EAAiB,SAAA,EAAW,OAAO,KAAA,EAASC,CAAAA,CAAM,OAErE,OAAOA,CAAAA,CACJ,OAA4B,CAACE,CAAAA,CAAQC,EAAMC,CAAAA,IACrCD,CAAAA,CAAK,MAIVD,CAAAA,CAAO,IAAA,CAAK,CACV,GAAGC,CAAAA,CAAK,KACR,SAAA,CAAWA,CAAAA,CAAK,YAAY,SAAA,EAAaC,CAAAA,CACzC,UAAA,CAAAH,CACF,CAAC,CAAA,CAEMC,CAAAA,CAAAA,CACN,EAAE,CAAA,CACJ,KAAK,CAACG,CAAAA,CAAGC,KAAOD,CAAAA,CAAE,SAAA,EAAa,OAAO,gBAAA,GAAqBC,CAAAA,CAAE,WAAa,MAAA,CAAO,gBAAA,CAAiB,CACvG,CAGO,SAASC,GAAwBC,CAAAA,CAAuD,CAC7F,OAAOA,CAAAA,CAAO,MAAA,CAAiC,CAACN,CAAAA,CAAQO,CAAAA,CAAOL,IACxDK,CAAAA,CAAM,GAAA,CAIJ,CACL,GAAGP,CAAAA,CACH,CAACO,CAAAA,CAAM,GAAG,EAAGA,CAAAA,CAAM,SAAA,EAAaL,CAClC,CAAA,CANSF,CAAAA,CAOR,EAAE,CACP,CAQA,SAASQ,EAAAA,CAAWC,EAAuC,CACzD,OAAI,MAAM,OAAA,CAAQA,CAAK,EACbA,CAAAA,CAAM,CAAC,GAAoC,IAAA,CAG7CA,CAAAA,EAAmC,IAC7C,CAQA,SAASC,GAA6BC,CAAAA,CAAsBC,CAAAA,CAA8B,CACxF,OAAIA,CAAAA,CACKvB,GAGLsB,CAAAA,CACKxB,EAAAA,CAGFC,EACT,CAEA,SAASyB,GACPC,CAAAA,CACAC,CAAAA,CAAoB,KACpBJ,CAAAA,CAAc,IAAA,CACdK,EAAQlC,EAAAA,CACR8B,CAAAA,CAAc,MACN,CACR,IAAMK,EAAsBF,CAAAA,CACxB,CAAA;AAAA;AAAA;AAAA,CAAA,CACA,GACEG,CAAAA,CAAaR,EAAAA,CAA6BC,EAAaC,CAAW,CAAA,CAElEO,EAAsBJ,CAAAA,CACxB,CAAA,QAAA,EAAWC,CAAK,CAAA,uCAAA,CAAA,CAChB,WAAWA,CAAK,CAAA,CAAA,CAAA,CAEpB,OACE,CAAA,IAAA,EAAOF,CAAa,aAAaK,CAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAOpDF,CAAAA,CACA,CAAA;AAAA,UAAA,EACaC,CAAU;AAAA;AAAA;AAAA;AAAA,CAK3B,CAMA,SAASE,EAAAA,CAAmBX,CAAAA,CAAwB,CAGlD,OAFmBA,CAAAA,EAA6E,WAE9E,KAAA,EAAO,KAAA,EAAS,CACpC,CAEA,SAASY,GAAeC,CAAAA,CAA6BC,CAAAA,CAAkC,CACrF,IAAMC,CAAAA,CAAQF,CAAAA,CAAQ,CAAA,EAAGC,CAAgB,CAAA,KAAA,CAAO,EAEhD,OAAI,OAAOC,GAAU,QAAA,CACZA,CAAAA,CAGFJ,GAAmBE,CAAAA,CAAQ,CAAA,EAAGC,CAAgB,CAAA,UAAA,CAAY,CAAC,CACpE,CAEA,SAASE,EAAAA,CAA4BC,EAAmBC,CAAAA,CAAgB,EAAA,CAAY,CAClF,OACE,CAAA,IAAA,EAAOD,CAAS,CAAA,UAAA,EAAaC,CAAa,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAQ9C,CAEA,SAASC,EAAAA,CACPL,CAAAA,CACAM,CAAAA,CACAC,CAAAA,CACQ,CACR,OAAKD,CAAAA,CAIDC,CAAAA,GAAc,OAAA,CACT,CAAA,EAAA,EAAKP,CAAgB,CAAA;AAAA,CAAA,CAGvBE,EAAAA,CAA4BF,CAAAA,CAAkB,iBAAiB,CAAA,CAP7D,EAQX,CAMA,SAASQ,EAAAA,CACPC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CAAU,MACF,CACR,GAAI,CAACH,CAAAA,CACH,OAAO,EAAA,CAGT,IAAMI,CAAAA,CAAkBH,CAAAA,GAAU,SAAA,CAAY,EAAA,CAAK,CAAA,EAAGA,CAAK;AAAA,QAAA,CAAA,CAE3D,GAAIvC,GAAiBsC,CAAgB,CAAA,CACnC,OAAIG,CAAAA,CACK,CAAA,MAAA,EAASH,EAAiB,IAAI,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAGhC,CAAA,MAAA,EAASA,EAAiB,IAAI,CAAA;AAAA,QAAA,EAAe7C,EAAW;AAAA;AAAA,CAAA,CAGjE,GAAIP,EAAkBoD,CAAgB,CAAA,GAAM,QAC1C,OAAO,CAAA,MAAA,EAASA,EAAiB,IAAI,CAAA;AAAA;AAAA;AAAA,QAAA,EAA6CI,CAAe,CAAA;AAAA,CAAA,CAGnG,GAAIxD,CAAAA,CAAkBoD,CAAgB,CAAA,GAAM,cAAA,CAAgB,CAC1D,IAAMK,CAAAA,CAAQL,CAAAA,CAAiB,YAAA,EAAc,MAE7C,GAAI,CAACK,EACH,OAAO,CAAA,MAAA,EAASL,EAAiB,IAAI;AAAA,CAAA,CAGvC,IAAMM,CAAAA,CAAeC,IAAAA,CAAKC,MAAAA,CAAOR,CAAAA,CAAiB,YAAA,EAAc,MAAA,CAAQ,MAAM,CAAC,CAAA,CAAEE,CAAM,CAAA,CACjFO,CAAAA,CAAiBF,IAAAA,CAAKC,MAAAA,CAAOH,CAAAA,CAAO,MAAM,CAAC,CAAA,CAAEC,CAAAA,EAAc,UAAA,EAAc,EAAE,CAAA,CAC3EI,CAAAA,CACJD,CAAAA,EAAkB7D,CAAAA,CAAkB6D,CAAc,IAAM,OAAA,CACpD,CAAA;AAAA;AAAA;AAAA,UAAA,EAAkDL,CAAe,CAAA;AAAA,CAAA,CACjE,EAAA,CAEN,OAAIJ,CAAAA,CAAiB,YAAA,EAAc,OAAS,QAAA,CACnC,CAAA,MAAA,EAASA,EAAiB,IAAI,CAAA;AAAA,QAAA,EAAeK,CAAK,IAAIK,CAAmB,CAAA;AAAA,CAAA,CAG3E,CAAA,MAAA,EAASV,EAAiB,IAAI,CAAA;AAAA,QAAA,EAAqCK,CAAK,IAAIK,CAAmB,CAAA;AAAA,CACxG,CAEA,OAAO,CAAA,MAAA,EAASV,CAAAA,CAAiB,IAAI;AAAA,CACvC,CAEA,SAASW,EAAAA,CACPC,CAAAA,CACAX,EACAC,CAAAA,CACQ,CACR,OACEU,CAAAA,EAAe,UAAA,CAAW,OAAO,CAACC,CAAAA,CAAYC,IAAqB,CACjE,IAAMV,EAAkBH,CAAAA,GAAU,SAAA,CAAY,EAAA,CAAK,CAAA,EAAGA,CAAK;AAAA,IAAA,CAAA,CAI3D,GAAIvC,EAAAA,CAAiBoD,CAAgB,CAAA,CACnC,OAAO,GAAGD,CAAU;AAAA,MAAA,EAAWC,EAAiB,IAAI,CAAA;AAAA,QAAA,EAAe1D,EAAsB;AAAA;AAAA,IAAA,CAAA,CAG3F,GAAIR,CAAAA,CAAkBkE,CAAgB,IAAM,OAAA,CAC1C,OAAO,GAAGD,CAAU;AAAA,MAAA,EAAWC,EAAiB,IAAI,CAAA;AAAA;AAAA;AAAA,MAAA,EAA2CV,CAAe;AAAA;AAAA,IAAA,CAAA,CAGhH,GAAIxD,CAAAA,CAAkBkE,CAAgB,CAAA,GAAM,cAAA,CAAgB,CAC1D,IAAMC,CAAAA,CAAqBR,IAAAA,CAAKC,MAAAA,CAAOM,EAAiB,YAAA,EAAc,MAAA,CAAQ,MAAM,CAAC,EAAEZ,CAAM,CAAA,CAGvFc,CAAAA,CAAwBT,IAAAA,CAAKC,OAAOM,CAAAA,CAAiB,YAAA,EAAc,KAAA,CAAO,MAAM,CAAC,CAAA,CACrFC,CAAAA,EAAoB,UAAA,EAAc,EACpC,CAAA,CACML,CAAAA,CACJ9D,CAAAA,CAAkBoE,CAAqB,IAAM,OAAA,CACzC,CAAA;AAAA;AAAA;AAAA,MAAA,EAAsCZ,CAAe,CAAA;AAAA,QAAA,CAAA,CACrD,EAAA,CAEN,GAAIU,CAAAA,CAAiB,YAAA,EAAc,OAAS,QAAA,CAC1C,OAAO,GAAGD,CAAU;AAAA,MAAA,EAAWC,EAAiB,IAAI,CAAA;AAAA,MAAA,EAAaA,CAAAA,CAAiB,YAAA,CAAa,KAAK,CAAA,EAAA,EAAKJ,CAAmB,CAAA;AAAA,IAAA,CAAA,CAG9H,GAAII,CAAAA,CAAiB,YAAA,EAAc,KAAA,CACjC,OAAO,GAAGD,CAAU;AAAA,MAAA,EAAWC,CAAAA,CAAiB,IAAI,CAAA,SAAA,EAAY9D,EAAyB,CAAA;AAAA,MAAA,EAAyB8D,CAAAA,CAAiB,YAAA,CAAa,KAAK,CAAA,EAAA,EAAKJ,CAAmB,CAAA;AAAA,IAAA,CAEjL,CAEA,OAAO,CAAA,EAAGG,CAAU;AAAA,MAAA,EAAWC,EAAiB,IAAI;AAAA,EAAA,CACtD,CAAA,CAAG,EAAE,CAAA,EAAK,EAEd,CAEA,SAASG,EAAAA,CAAoBC,CAAAA,CAAoE,CAC/F,IAAMC,CAAAA,CAA8D,EAAC,CAErE,QAAWtE,CAAAA,IAAaqE,CAAAA,CACtBC,CAAAA,CAAiBtE,CAAAA,CAAU,IAAI,CAAA,CAAIA,CAAAA,CAGrC,OAAOsE,CACT,CAEA,SAASC,EAAAA,CAA4BvE,CAAAA,CAA2C,CAC9E,OAAKA,CAAAA,CAKDA,CAAAA,CAAU,IAAA,GAAS,KAAA,CACd,IAAA,CAGL,EAAAA,CAAAA,CAAU,MAAA,GAAW,IAAA,EAAQA,CAAAA,CAAU,IAAA,GAAS,MAAA,CAAA,CAR3C,KAaX,CAEO,SAASwE,EAAAA,CAAoBC,CAAAA,CAAe9D,CAAAA,CAA0D,CAC3G,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQ8D,CAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,GAAW,CAAA,CAC1C,OAGF,GAAM,CAACC,CAAW,CAAA,CAAID,CAAAA,CAEtB,GAAI,CAACC,CAAAA,EAAe,OAAOA,CAAAA,EAAgB,QAAA,CACzC,OAGF,GAAM,CAACC,CAAiB,EAAI,MAAA,CAAO,IAAA,CAAKD,CAAW,CAAA,CAEnD,GAAI,CAACC,CAAAA,EAAqB,CAAC,KAAA,CAAO,YAAA,CAAc,YAAY,CAAA,CAAE,QAAA,CAASA,CAAiB,EACtF,OAGF,IAAMC,CAAAA,CAAgBjE,CAAAA,EAAQ,UAAA,CAAW,IAAA,CAAMX,CAAAA,EAAcA,CAAAA,CAAU,IAAA,GAAS2E,CAAiB,CAAA,CAEjG,GACE,EAAA,CAACC,CAAAA,EACD7E,CAAAA,CAAkB6E,CAAa,CAAA,GAAM,QAAA,EACrCA,CAAAA,CAAc,QAAA,GAAa,OAAA,CAAA,CAK7B,OAAO,CACL,GAAA,CAAK,CACH,CAACD,CAAiB,EAAG,CACnB,EAAA,CAAI,IACN,CACF,CACF,CACF,CAEO,SAASE,EAAAA,CACdnC,GAAAA,CACAU,CAAAA,CACAC,CAAAA,CACAyB,CAAAA,CAWa,CACb,IAAMC,CAAAA,CAAqBD,CAAAA,EAAS,WAAa,MAAA,CAC3CE,CAAAA,CAAYD,CAAAA,GAAuB,SAAA,CAAY,MAAA,CAASA,CAAAA,CACxD/B,CAAAA,CAAe8B,CAAAA,EAAS,YAAA,EAAgB,IAAA,CACxC7B,CAAAA,CAAY6B,CAAAA,EAAS,SAAA,EAAa,WAAA,CAClCG,EAAU,8DAAA,CACVC,CAAAA,CAAeC,EAAAA,CAAgB9B,CAAAA,CAAQX,GAAgB,CAAA,CACvD0C,CAAAA,CAAaF,CAAAA,EAAc,IAAA,EAAQxC,GAAAA,CACnC2C,CAAAA,CAAmBC,CAAAA,CAAoBJ,CAAY,CAAA,CACnDb,EAAaU,CAAAA,GAAuB,SAAA,CACrCM,CAAAA,CAAmB,CAACA,CAAgB,CAAA,CAAI,EAAC,CAC1CH,CAAAA,EAAc,UAAA,EAAc,EAAC,CAC3BZ,CAAAA,CAAmBF,EAAAA,CAAoBC,CAAU,CAAA,CACjDkB,CAAAA,CAAU,CAAA,QAAA,EAAWH,CAAU,CAAA,0CAAA,EAA6CA,CAAU,CAAA,MAAA,CAAA,CACtFI,CAAAA,CAAgBV,CAAAA,EAAS,aAAA,EAAiB,CAAA,GAAA,EAAMW,CAAAA,CAAuB/C,GAAgB,CAAC,GAE9F,GAAI,CAACwC,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAWE,CAAU,CAAA,yBAAA,CAA2B,CAAA,CAGlE,GAAIf,CAAAA,CAAW,MAAA,GAAW,CAAA,CACxB,MAAM,IAAI,KAAA,CAAM,CAAA,QAAA,EAAWe,CAAU,CAAA,yCAAA,CAA2C,CAAA,CAGlF,IAAMM,CAAAA,CAA+BC,CAAAA,CAAwB,QAAA,CAAUtB,CAAU,CAAA,CAC9E,MAAA,CAAQpC,CAAAA,EACHA,CAAAA,GAAkB,YAAA,CACb,KAAA,CAGL+C,CAAAA,GAAc,MAAA,CACTD,CAAAA,GAAuB,SAAA,EAAaR,EAAAA,CAA4BD,CAAAA,CAAiBrC,CAAa,CAAC,CAAA,CAGjG,IACR,CAAA,CACA,IAAA,CAAK;AAAA,EAAA,CAAM,CAAA,CACR2D,EAAkBC,EAAAA,CAAmBxB,CAAU,EAAE,MAAA,CAAQpC,CAAAA,EAC7D+C,IAAc,MAAA,EAAUD,CAAAA,GAAuB,WAAaR,EAAAA,CAA4BD,CAAAA,CAAiBrC,CAAa,CAAC,CACzH,EACM6D,CAAAA,CAAqCH,CAAAA,CAAwB,CAAC,OAAO,CAAA,CAAGtB,CAAU,CAAA,CAAE,MAAA,CAAQpC,GAC5F+C,CAAAA,GAAc,MAAA,CACT,KAGFD,CAAAA,GAAuB,SAAA,EAAaR,GAA4BD,CAAAA,CAAiBrC,CAAa,CAAC,CACvG,CAAA,CACK8D,EAAoBD,CAAAA,CAAgB,MAAA,CACxC,CAACE,CAAAA,CAAKhG,CAAAA,GAAc,GAAGgG,CAAG;AAAA,IAAA,EAAShG,CAAS,CAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA,CAC5C,EACF,EACMiG,CAAAA,CAAkBH,CAAAA,CAAgB,OACtC,CAACE,CAAAA,CAAKhG,CAAAA,GAAc,CAAA,EAAGgG,CAAG;AAAA,IAAA,EAAShG,CAAS,CAAA;AAAA;AAAA;AAAA,MAAA,EAAuCoD,CAAK;AAAA;AAAA,EAAA,CAAA,CACxF,EACF,CAAA,CACM8C,CAAAA,CAA8B9C,IAAU,SAAA,CAAY2C,CAAAA,CAAoBE,EAC1EE,CAAAA,CAAuB,CAAA;AAAA;AAAA,SAAA,CAAA,CAEvBnB,CAAAA,GAAc,SAChBmB,CAAAA,CACE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAAA,CAAA,CAAA,CAGJ,IAAMC,EAA8BR,CAAAA,CAAgB,MAAA,CAAO,CAACI,CAAAA,CAAKhG,CAAAA,GACxD,GAAGgG,CAAG;AAAA,IAAA,EAAShG,CAAS,CAAA;AAAA,MAAA,EAAamG,CAAoB;AAAA;AAAA,EAAA,CAAA,CAC/D,EAAE,CAAA,CAGCE,CAAAA,CADyBhC,CAAAA,CAAW,OAAQrE,CAAAA,EAAcD,CAAAA,CAAkBC,CAAS,CAAA,GAAM,cAAc,CAAA,CAC7C,MAAA,CAAO,CAACgG,EAAKhG,CAAAA,GAAc,CAC3F,GAAIgF,CAAAA,GAAc,MAAA,EAAUD,CAAAA,GAAuB,SAAA,EAAa/E,CAAAA,CAAU,SAAW,IAAA,CACnF,OAAOgG,CAAAA,CAGT,GAAIvF,EAAAA,CAA6BT,CAAS,CAAA,CACxC,OAAO,GAAGgG,CAAG;AAAA,EAAKhE,EAAAA,CAChBhC,CAAAA,CAAU,IAAA,CACVU,EAAAA,CAAoCV,CAAAA,CAAWkF,CAAY,CAAA,CAC3DF,CAAAA,GAAc,MAAA,CACdA,CAAAA,GAAc,MAAA,CAAS9E,EAAAA,CAA8BD,GACrD+E,CAAAA,GAAc,MAChB,CAAC,CAAA,CAAA,CAGH,IAAMjB,CAAAA,CAAgBL,IAAAA,CAAKC,MAAAA,CAAO3D,CAAAA,CAAU,YAAA,EAAc,MAAA,CAAQ,MAAM,CAAC,CAAA,CAAEqD,CAAM,CAAA,CAEjF,GAAI2B,CAAAA,GAAc,MAAA,CAAQ,CACxB,IAAMK,EAAmBC,CAAAA,CAAoBvB,CAAa,CAAA,CACpDuC,CAAAA,CAAmBpD,EAAAA,CAA6BmC,CAAAA,CAAkBjC,EAAOC,CAAAA,CAAQ,IAAI,CAAA,CACrFkD,EAAAA,CAAevG,CAAAA,CAAU,YAAA,EAAc,IAAA,GAAS,QAAA,CAAW,CAAA,CAAI,CAAA,CAErE,OACE,CAAA,EAAGgG,CAAG;AAAA,IAAA,EAAShG,CAAAA,CAAU,IAAI,CAAA,SAAA,EAAYuG,EAAY,CAAA;AAAA;AAAA,EAElDD,CAAgB,CAAA;AAAA,EAAA,CAGvB,CAEA,IAAME,CAAAA,CAAqB1C,EAAAA,CAAwCC,CAAAA,CAAeX,EAAOC,CAAM,CAAA,CAE/F,OACE,CAAA,EAAGT,GAA4B5C,CAAAA,CAAU,IAAI,EAAE,IAAA,EAAM,GAClDgG,CAAG;AAAA,IAAA,EAAShG,CAAAA,CAAU,IAAI,CAAA,+BAAA,EAAkCwG,CAAkB,CAAA;AAAA,EAAA,CAGrF,CAAA,CAAG,EAAE,CAAA,CAEL,OAAO,CACL,eAAA,CAAiB9D,GAAAA,CACjB,KAAA,CACE,CAAA,MAAA,EAAS8C,CAAa,CAAA,CAAA,EAAID,CAAO,CAAA;AAAA,CAAA,CACjCxC,EAAAA,CAA0BL,IAAkBM,CAAAA,CAAcC,CAAS,EACnE,CAAA,EAAA,EAAKP,GAAgB,GAAGuC,CAAO,CAAA;AAAA;AAAA;AAAA,IAAA,EAGxBS,CAAoB,CAAA,IAAA,EACpBQ,CAAmB,CAAA,IAAA,EACnBE,CAAmB,KACrBC,CAA0B,CAAA;AAAA;AAAA,CAGnC,CACF,CAKO,SAASI,EAAAA,CACd/D,IACAU,CAAAA,CACAX,CAAAA,CACAY,EAC0B,CAE1B,IAAMgB,EADec,EAAAA,CAAgB9B,CAAAA,CAAQX,GAAgB,CAAA,EAC5B,UAAA,EAAc,EAAC,CAEhD,GAAI2B,CAAAA,CAAW,MAAA,GAAW,CAAA,CACxB,OAAO,CACL,KAAA,CAAO,CAAA,CACP,QAAS,EACX,EAGF,IAAMqC,CAAAA,CAAQlE,EAAAA,CAAeC,CAAAA,CAASC,GAAgB,CAAA,CAChDiE,EAAQlE,CAAAA,CAAQC,GAAgB,EAChCkE,CAAAA,CAAuB,CAACC,EAAsB1D,CAAAA,GAAwC,CAC1F,IAAM2D,CAAAA,CAAuB3D,CAAAA,CAAiB,IAAA,CAE9C,OAAO0D,CAAAA,CACJ,KAAA,CAAM,EAAG,CAAC,CAAA,CACV,IAAKE,CAAAA,EAAS,CACb,GAAIhH,CAAAA,CAAkBoD,CAAgB,CAAA,GAAM,QAC1C,OAAO4D,CAAAA,CAAKD,CAAoB,CAAA,CAGlC,IAAME,EAAarF,EAAAA,CAAWoF,CAAAA,CAAKD,CAAoB,CAAC,CAAA,CAExD,OAAOE,IAAa5D,CAAK,CAAA,EAAK4D,GAAY,OAC5C,CAAC,EACA,IAAA,CAAK,IAAI,CACd,CAAA,CACMC,CAAAA,CAAoBN,CAAAA,CAAM,IAAKhG,CAAAA,EAAW,CAC9C,GAAM,CAAE,GAAA,CAAAuG,CAAI,CAAA,CAAIvG,CAAAA,CACVwG,CAAAA,CAAY,OAAOxG,CAAAA,CAAO,UAAA,EAAe,SAAWA,CAAAA,CAAO,UAAA,CAAa,GACxEyG,CAAAA,CAAmBzB,CAAAA,CAAwB,SAAUtB,CAAU,CAAA,CAClE,OAAQpC,CAAAA,EAAkBA,CAAAA,GAAkB,YAAY,CAAA,CACxD,MAAA,CAAO,CAAC+D,CAAAA,CAAK/D,CAAAA,IAAmB,CAAE,GAAG+D,CAAAA,CAAK,CAAC/D,CAAa,EAAGtB,CAAAA,CAAOsB,CAAa,CAAE,CAAA,CAAA,CAAI,EAAE,CAAA,CACpF6D,EAAkBH,CAAAA,CAAwB,OAAA,CAAStB,CAAU,CAAA,CAAE,MAAA,CAAO,CAAC2B,EAAK/D,CAAAA,GAAkB,CAClG,IAAMgE,CAAAA,CAAkBtE,EAAAA,CAAWhB,EAAOsB,CAAa,CAAC,CAAA,CAExD,OAAO,CACL,GAAG+D,EACH,CAAC/D,CAAa,EAAGgE,CAAAA,GAAkB7C,CAAK,EAAI6C,CAAAA,CAAgB7C,CAAK,CAAA,CAAI6C,CAAAA,EAAiB,OACxF,CACF,EAAG,EAAE,EACCL,CAAAA,CAAkBC,EAAAA,CAAmBxB,CAAU,CAAA,CAAE,MAAA,CACrD,CAAC2B,CAAAA,CAAK/D,CAAAA,IAAmB,CAAE,GAAG+D,CAAAA,CAAK,CAAC/D,CAAa,EAAGN,EAAAA,CAAWhB,EAAOsB,CAAa,CAAC,CAAE,CAAA,CAAA,CACtF,EACF,EACMoF,CAAAA,CAAyB1B,CAAAA,CAAwB,CAAC,cAAc,CAAA,CAAGtB,CAAU,CAAA,CAAE,MAAA,CACnF,CAAC2B,CAAAA,CAAK/D,CAAAA,GAAkB,CACtB,IAAMkC,CAAAA,CAAwBT,IAAAA,CAAKC,OAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEoC,CAAU,EACtEiD,CAAAA,CAAoBnD,CAAAA,CAAsB,cAAc,MAAA,EAAU,EAAA,CAClEJ,EAAgBL,IAAAA,CAAKC,MAAAA,CAAO2D,EAAmB,MAAM,CAAC,CAAA,CAAEjE,CAAM,CAAA,CAC9DF,CAAAA,CAAmBmC,EAAoBvB,CAAa,CAAA,CACpDwD,EAAa5G,CAAAA,CAAOsB,CAAa,EAEvC,GAAIxB,EAAAA,CAA6B0D,CAAqB,CAAA,CAAG,CACvD,IAAM1C,EAASX,EAAAA,CAA+BH,CAAAA,CAAO,GAAGsB,CAAa,CAAA,UAAA,CAAY,CAAC,CAAA,CAElF,OAAO,CACL,GAAG+D,CAAAA,CACH,CAAC/D,CAAa,EAAGR,CACnB,CACF,CAEA,GAAI,CAAC0B,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,CAAA,gEAAA,EAAmElB,CAAa,GAAG,CAAA,CAGrG,IAAM6E,GAAuB3D,CAAAA,CAAiB,IAAA,CACxCqE,EAAwBzH,CAAAA,CAAkBoD,CAAgB,CAAA,CAIhE,GAAIgB,CAAAA,CAAsB,YAAA,EAAc,OAAS,UAAA,CAAY,CAC3D,IAAMsD,CAAAA,CAAgB,KAAA,CAAM,QAAQF,CAAU,CAAA,CAAIA,CAAAA,CAAa,EAAC,CAEhE,OAAO,CACL,GAAGvB,CAAAA,CACH,CAAC/D,CAAa,EAAG2E,EAAqBa,CAAAA,CAActE,CAAgB,CACtE,CACF,CAEA,IAAMuE,EAAc/F,EAAAA,CAAW4F,CAAU,EAEzC,GAAIC,CAAAA,GAA0B,SAC5B,OAAO,CACL,GAAGxB,CAAAA,CACH,CAAC/D,CAAa,EAAGyF,CAAAA,GAAcZ,EAAoB,CACrD,CAAA,CAGF,IAAMa,CAAAA,CAAoBhG,EAAAA,CAAW+F,CAAAA,GAAcZ,EAAoB,CAAC,CAAA,CAExE,OAAO,CACL,GAAGd,EACH,CAAC/D,CAAa,EAAG0F,CAAAA,GAAoBvE,CAAK,CAAA,EAAKuE,CAAAA,EAAmB,OACpE,CACF,EACA,EACF,EAEA,OAAO,CACL,IAAAT,CAAAA,CACA,GAAGE,CAAAA,CACH,GAAGtB,CAAAA,CACH,GAAGF,EACH,GAAGyB,CAAAA,CACH,WAAYF,CACd,CACF,CAAC,CAAA,CAED,OAAO,CACL,KAAA,CAAAT,CAAAA,CACA,OAAA,CAASO,CACX,CACF,CAMO,SAASW,EAAAA,CACdlF,CAAAA,CACAU,EACAX,CAAAA,CACAY,CAAAA,CAC8B,CAE9B,IAAMgB,CAAAA,CADec,EAAAA,CAAgB9B,EAAQX,CAAgB,CAAA,EAC5B,YAAc,EAAC,CAEhD,GAAI2B,CAAAA,CAAW,MAAA,GAAW,CAAA,CACxB,OAAO,CACL,KAAA,CAAO,EACP,OAAA,CAAS,EACX,CAAA,CAGF,IAAMqC,EAAQlE,EAAAA,CAAeC,CAAAA,CAASC,CAAgB,CAAA,CAEhDuE,CAAAA,CADQxE,CAAAA,CAAQC,CAAgB,CAAA,CACN,GAAA,CAAK/B,GAAW,CAC9C,IAAMyG,EAAmBzB,CAAAA,CAAwB,QAAA,CAAUtB,CAAU,CAAA,CAAE,MAAA,CACrE,CAAC2B,CAAAA,CAAKhG,CAAAA,IAAe,CACnB,GAAGgG,CAAAA,CACH,CAAChG,CAAS,EAAG,CACX,KAAA,CAAOW,CAAAA,CAAOX,CAAS,EACvB,QAAA,CAAU,KAAA,CACV,MAAO,SAAA,CACP,GAAA,CAAK,EACP,CACF,CAAA,CAAA,CACA,EACF,CAAA,CACM8F,CAAAA,CAAkBH,EAAwB,OAAA,CAAStB,CAAU,EAAE,MAAA,CAAO,CAAC2B,EAAK/D,CAAAA,GAAkB,CAClG,IAAM4F,CAAAA,CAAkBnE,IAAAA,CAAKC,MAAAA,CAAO1B,EAAe,MAAM,CAAC,EAAEoC,CAAU,CAAA,CAChEyD,EAAiBnG,EAAAA,CAAWhB,CAAAA,CAAOsB,CAAa,CAAC,CAAA,CAEvD,OAAO,CACL,GAAG+D,CAAAA,CACH,CAAC/D,CAAa,EAAG,CACf,KAAA,CAAO6F,CAAAA,CAAiBC,EAAAA,CAAgBD,CAAAA,CAAgB1E,CAAK,CAAA,CAAI,KACjE,QAAA,CAAU,CAAA,EACR0E,GACAA,CAAAA,CAAe1E,CAAK,IAAM,IAAA,EAC1BrD,CAAAA,CAAkB8H,CAAe,CAAA,GAAM,OAAA,EACvCzE,CAAAA,GAAU,WAEZ,KAAA,CAAAA,CAAAA,CACA,IAAK0E,CAAAA,CAAiBA,CAAAA,CAAe,IAAM,IAC7C,CACF,CACF,CAAA,CAAG,EAAE,EACClC,CAAAA,CAAkBC,EAAAA,CAAmBxB,CAAU,CAAA,CAAE,MAAA,CACrD,CAAC2B,CAAAA,CAAKhG,CAAAA,IAAe,CACnB,GAAGgG,CAAAA,CACH,CAAChG,CAAS,EAAG,CACX,KAAA,CAAO2B,EAAAA,CAAWhB,EAAOX,CAAS,CAAC,CAAA,CACnC,QAAA,CAAU,KAAA,CACV,KAAA,CAAO,UACP,GAAA,CAAK,EACP,CACF,CAAA,CAAA,CACA,EACF,CAAA,CACMqH,CAAAA,CAAyB1B,CAAAA,CAAwB,CAAC,cAAc,CAAA,CAAGtB,CAAU,CAAA,CAAE,MAAA,CACnF,CAAC2B,CAAAA,CAAK/D,CAAAA,GAAkB,CACtB,IAAMkC,CAAAA,CAAwBT,IAAAA,CAAKC,MAAAA,CAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEoC,CAAU,EACtE2D,CAAAA,CAAWrH,CAAAA,CAAOsB,CAAa,CAAA,CAG/BL,CAAAA,CACJuC,CAAAA,CAAsB,YAAA,EAAc,IAAA,GAAS,QAAA,CAAWxC,GAAWqG,CAAQ,CAAA,CAAIA,EAE3Ed,CAAAA,CAAMtF,CAAAA,EAAO,IACbqG,CAAAA,CAAiB1F,EAAAA,CAAmB5B,CAAAA,CAAO,CAAA,EAAGsB,CAAa,CAAA,UAAA,CAAY,CAAC,CAAA,CAE9E,GAAIxB,GAA6B0D,CAAqB,CAAA,CAAG,CACvD,IAAM1C,CAAAA,CAASX,EAAAA,CAA+BH,CAAAA,CAAO,CAAA,EAAGsB,CAAa,YAAY,CAAC,CAAA,CAElF,OAAO,CACL,GAAG+D,EACH,CAAC/D,CAAa,EAAG,CACf,KAAA,CAAOgG,CAAAA,CACP,IAAAf,CAAAA,CACA,oBAAA,CAAsB1F,GAAwBC,CAAM,CAAA,CACpD,MAAOA,CAAAA,CACP,QAAA,CAAU,MACV,KAAA,CAAA2B,CACF,CACF,CACF,CAEA,OAAO,CACL,GAAG4C,EACH,CAAC/D,CAAa,EAAG,CACf,KAAA,CAAOgG,CAAAA,CACP,IAAAf,CAAAA,CACA,KAAA,CAAAtF,EACA,QAAA,CAAU,KAAA,CACV,MAAAwB,CACF,CACF,CACF,CAAA,CACA,EACF,EAEA,OAAO,CAAE,GAAGgE,CAAAA,CAAkB,GAAGtB,EAAiB,GAAGF,CAAAA,CAAiB,GAAGyB,CAAuB,CAClG,CAAC,EAED,OAAO,CACL,MAAAX,CAAAA,CACA,OAAA,CAASO,CACX,CACF,CAKA,SAASc,EAAAA,CACP/H,CAAAA,CACAoD,CAAAA,CACsE,CACtE,OAAI,KAAA,CAAM,QAAQpD,CAAS,CAAA,CAClBA,EAAU,MAAA,CAAO,CAACmB,CAAAA,CAA0B+G,CAAAA,GAAyB,CAC1E,GAAIA,EAAK9E,CAAK,CAAA,EAAK8E,EAAK,OAAA,CAAS,CAC/B,IAAMC,CAAAA,CAAS,CACb,GAAA,CAAKD,CAAAA,CAAK,GAAA,CACV,QAAA,CAAkBA,EAAK,KAAA,GAAU,IAAA,EAAQ9E,IAAU,SAAA,CACnD,KAAA,CAAAA,EACA,KAAA,CAAO8E,CAAAA,CAAK9E,CAAK,CAAA,EAAK8E,CAAAA,CAAK,OAC7B,EAEA/G,CAAAA,CAAO,IAAA,CAAKgH,CAAM,EACpB,CAEA,OAAOhH,CACT,CAAA,CAAG,EAAE,CAAA,CAGAnB,CAAAA,CAAUoD,CAAK,CAAA,EAAKpD,CAAAA,CAAU,SAAW,IAClD,CAKO,SAASoI,EAAAA,CACd1F,CAAAA,CACA2F,CAAAA,CACAjF,CAAAA,CACAC,CAAAA,CACAiF,CAAAA,CACAC,EACAzD,CAAAA,CACQ,CACR,IAAMI,CAAAA,CAAeC,EAAAA,CAAgB9B,EAAQX,CAAgB,CAAA,CACvD0C,CAAAA,CAAaF,CAAAA,EAAc,IAAA,EAAQxC,CAAAA,CACnC2B,EAAaa,CAAAA,EAAc,UAAA,EAAc,EAAC,CAC1CsD,CAAAA,CAAuBC,GAAW/F,CAAgB,CAAA,CAExD,GAAI2B,CAAAA,CAAW,MAAA,GAAW,CAAA,CACxB,OAAO,EAAA,CAGT,IAAMqE,EAAOC,EAAAA,CAA2BtE,CAAAA,CAAYkE,CAAY,CAAA,CAC1DnB,CAAAA,CAAmBwB,EAAAA,CAAuBvE,CAAAA,CAAYqE,CAAI,CAAA,CAC1D5C,EAAkB+C,EAAAA,CAAsBR,CAAAA,CAAUhE,EAAYqE,CAAAA,CAAMtF,CAAK,EACzEwC,CAAAA,CAAkBkD,EAAAA,CAAsBzE,CAAAA,CAAYiE,CAAAA,CAAcI,CAAI,CAAA,CACtErB,EAAyB0B,EAAAA,CAA6B1E,CAAAA,CAAYiE,EAAcI,CAAI,CAAA,CACpFM,EAAetG,CAAAA,CACfuG,CAAAA,CACJnE,CAAAA,EAAS,cAAA,EAAkBoE,EAAAA,CAAgC7F,CAAAA,CAAQX,EAAkBU,CAAK,CAAA,CAG5F,OACE,CAAA,SAAA,EAHoB,CAAA,MAAA,EAASqC,EAAuB/C,CAAgB,CAAC,CAAA,CAG5C,CAAA,SAAA,EAAY0C,CAAU,CAAA;AAAA,QAAA,EACpCoD,CAAoB,CAAA;AAAA;AAAA,aAAA,EAEfpB,CAAgB,CAAA,EAAGtB,CAAe,CAAA,EAAGF,CAAe,GAAGyB,CAAsB;AAAA;AAAA;AAAA,IAAA,EAEtF2B,CAAY,CAAA;AAAA;AAAA,IAAA,EAEZC,CAAkB,CAAA;AAAA;AAAA;AAAA,CAK7B,CAKA,SAASN,EAAAA,CAA2BtE,CAAAA,CAAyBkE,CAAAA,CAA8C,CAEzG,IAAMY,CAAAA,CAA4C9E,CAAAA,CAC/C,MAAA,CAAQrE,GAAcA,CAAAA,CAAU,QAAA,GAAa,IAAI,CAAA,CACjD,IAAKA,CAAAA,EAAcA,CAAAA,CAAU,IAAI,CAAA,CAC9B0I,EAAOU,IAAAA,CAAKD,CAAAA,CAAwBZ,CAAY,CAAA,CAEtD,OAAOc,IAAAA,CACLhF,CAAAA,CAAW,GAAA,CAAKrE,CAAAA,EAAcA,EAAU,IAAI,CAAA,CAC5C0I,CACF,CACF,CAKA,SAAS/C,CAAAA,CAAwB2D,CAAAA,CAA+BjF,CAAAA,CAA8C,CAC5G,OAAI,KAAA,CAAM,OAAA,CAAQiF,CAAI,EACbA,CAAAA,CAAK,MAAA,CAAO,CAACtD,CAAAA,CAA0BuD,IACrCvD,CAAAA,CAAI,MAAA,CAAOL,CAAAA,CAAwB4D,CAAAA,CAAelF,CAAU,CAAC,CAAA,CACnE,EAAE,EAGoBA,CAAAA,CAAW,MAAA,CACnCrE,CAAAA,EAAcD,CAAAA,CAAkBC,CAAS,CAAA,GAAMsJ,CAAAA,EAAQtJ,CAAAA,CAAU,SAAA,GAAc,OAClF,CAAA,CAE0B,GAAA,CAAKA,GAAcA,CAAAA,CAAU,IAAI,CAC7D,CAKA,SAAS6F,EAAAA,CAAmBxB,CAAAA,CAA8C,CAGxE,OAF2BA,CAAAA,CAAW,MAAA,CAAOxD,EAAgB,EAEnC,GAAA,CAAKb,CAAAA,EAAcA,CAAAA,CAAU,IAAI,CAC7D,CAMA,SAAS4I,EAAAA,CACPY,CAAAA,CACAd,EACAe,CAAAA,CAAiC,QAAA,CACzB,CACR,IAAMrC,EAAmBiC,IAAAA,CAAK1D,CAAAA,CAAwB,QAAA,CAAU6D,CAAgB,EAAed,CAAI,CAAA,CAkBnG,OAjByBgB,OAAAA,CAAQtC,CAAgB,CAAA,CAAE,MAAA,CAAO,CAACpB,CAAAA,CAAK,CAAC/D,CAAAA,CAAeL,CAAK,CAAA,GAAM,CACzF,IAAMiG,CAAAA,CAAkBnE,IAAAA,CAAKC,MAAAA,CAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEuH,CAAgB,CAAA,CACtEG,EAAmB,KAAA,CAAM,OAAA,CAAQ/H,CAAAA,EAAO,KAAK,EAAI,IAAA,CAAQA,CAAAA,EAAO,KAAA,EAAS,IAAA,CACzEgI,EAAaC,EAAAA,CAAehC,CAAAA,CAAgB,QAAA,CAAU8B,CAAgB,EAG5E,OAAIF,CAAAA,GAAc,QAAA,GAAaG,CAAAA,GAAe,MAAQA,CAAAA,GAAe,EAAA,CAAA,CAC5D5D,EAGLyD,CAAAA,GAAc,QAAA,CACT,GAAGzD,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA,SAAA,EAAY2H,CAAU,CAAA,EAAA,CAAA,CAGtD,GAAG5D,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA,EAAA,EAAK2H,CAAU,CAAA,CACtD,EAAG,EAAE,CAGP,CAMA,SAASE,EAAAA,CAAiBlI,CAAAA,CAA8C,CACtE,OAAI,CAACA,CAAAA,EAAO,GAAA,EAAO,CAACA,CAAAA,CAAM,IAAA,CACjB,EAAA,CAGFA,CAAAA,CAAM,GACf,CAOA,SAASkH,EAAAA,CACPU,CAAAA,CACAlB,CAAAA,CACAI,CAAAA,CACQ,CACR,IAAM9C,CAAAA,CAAkByD,KAAKxD,EAAAA,CAAmB2D,CAAgB,CAAA,CAAed,CAAI,CAAA,CAoBnF,OAnBoDgB,OAAAA,CAAQ9D,CAAe,EAC1B,MAAA,CAAO,CAACI,CAAAA,CAAK,CAAC/D,CAAAA,CAAe8H,CAAc,CAAA,GAAM,CAChG,IAAMC,CAAAA,CAASF,EAAAA,CAAiBC,CAAAA,CAAe,KAA0B,CAAA,CACnEE,CAAAA,CAAaH,EAAAA,CAAiBxB,CAAAA,CAAarG,CAAa,CAAA,EAAG,KAAsC,CAAA,CAEvG,GAAI+H,IAAWC,CAAAA,CACb,OAAOjE,CAAAA,CAGT,IAAMkE,EAAaD,CAAAA,CACf,CAAA;AAAA;AAAA;AAAA;AAAA,2BAAA,EAAgHE,CAAAA,CAAuBF,CAAU,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAClJ,EAAA,CACEG,EAAUJ,CAAAA,CACZ,CAAA;AAAA;AAAA;AAAA;AAAA,2BAAA,EAA6GG,CAAAA,CAAuBH,CAAM,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAC3I,EAAA,CAEJ,OAAO,CAAA,EAAGhE,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA,EAAQiI,CAAU,CAAA,EAAGE,CAAO,SACnE,CAAA,CAAG,EAAE,CAGP,CAEA,SAASC,GAAsBb,CAAAA,CAA+Bd,CAAAA,CAA8B,CAC1F,IAAM9C,CAAAA,CAAkByD,KAAKxD,EAAAA,CAAmB2D,CAAgB,EAAed,CAAI,CAAA,CAsBnF,OArBoDgB,OAAAA,CAAQ9D,CAAe,CAAA,CAC1B,MAAA,CAAO,CAACI,CAAAA,CAAK,CAAC/D,EAAe8H,CAAc,CAAA,GAAM,CAChG,IAAMO,CAAAA,CAAUR,GAAiBC,CAAAA,CAAe,KAA0B,EAE1E,OAAKO,CAAAA,CAKH,GAAGtE,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EAIFkI,CAAAA,CAAuBG,CAAO,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,OAAA,CAAA,CARpDtE,CAcX,CAAA,CAAG,EAAE,CAGP,CAEA,SAAS6C,EAAAA,CACPR,CAAAA,CACAmB,CAAAA,CACAd,CAAAA,CACAtF,CAAAA,CACQ,CACR,IAAM0C,CAAAA,CAAkBuD,IAAAA,CAAK1D,CAAAA,CAAwB,OAAA,CAAS6D,CAAgB,CAAA,CAAed,CAAI,CAAA,CA2CjG,OA1CoDgB,OAAAA,CAAQ5D,CAAe,CAAA,CAC1B,MAAA,CAAO,CAACE,CAAAA,CAAK,CAAC/D,CAAAA,CAAe8H,CAAc,CAAA,GAAM,CAChG,IAAMlC,CAAAA,CAAkBnE,IAAAA,CAAKC,MAAAA,CAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEuH,CAAgB,CAAA,CACtE,CAAE,QAAA,CAAAe,CAAS,CAAA,CAAI1C,EACf+B,CAAAA,CACJG,CAAAA,CAAe,QAAA,EAAY,KAAA,CAAM,OAAA,CAAQA,CAAAA,CAAe,KAAK,CAAA,CACzD,OACAF,EAAAA,CAAeU,CAAAA,CAAUR,CAAAA,CAAe,KAAK,CAAA,CAEnD,OAAIA,CAAAA,CAAe,GAAA,CACV,GAAG/D,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA;AAAA;AAAA,YAAA,EAA2DmB,CAAK,YAAYwG,CAAU,CAAA;AAAA;AAAA;AAAA,QAAA,CAAA,CAQ3HG,CAAAA,CAAe,UACf,KAAA,CAAM,OAAA,CAAQA,EAAe,KAAK,CAAA,EAClCA,CAAAA,CAAe,KAAA,GAAU,MAAA,EACzBA,CAAAA,CAAe,QAAU,IAAA,EACzBA,CAAAA,CAAe,QAAU,EAAA,EACzBH,CAAAA,GAAe,MACfA,CAAAA,GAAe,EAAA,CAER5D,CAAAA,CAIP,CAAA,EAAGA,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA;AAAA;AAAA,iBAAA,EAGVkI,EAAuB,CAAA,EAAG9B,CAAQ,CAAA,CAAA,EAAIpG,CAAa,EAAE,CAAC;AAAA,oBAAA,EACnDsI,CAAQ,CAAA;AAAA,YAAA,EAChBnH,CAAK,KAAKwG,CAAU;AAAA;AAAA;AAAA,QAAA,CAKvC,CAAA,CAAG,EAAE,CAGP,CAEA,SAASb,EAAAA,CACPS,CAAAA,CACAlB,CAAAA,CACAI,CAAAA,CACQ,CACR,IAAMrB,CAAAA,CAAyBgC,IAAAA,CAAK1D,CAAAA,CAAwB,eAAgB6D,CAAgB,CAAA,CAAed,CAAI,CAAA,CA2D/G,OA1DwBgB,OAAAA,CAAQrC,CAAsB,CAAA,CACL,OAAO,CAACrB,CAAAA,CAAK,CAAC/D,CAAAA,CAAe8H,CAAc,CAAA,GAAM,CAChG,IAAMlC,CAAAA,CAAkBnE,KAAKC,MAAAA,CAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEuH,CAAgB,CAAA,CACtE,CAAE,UAAAgB,CAAAA,CAAW,YAAA,CAAAC,CAAa,CAAA,CAAI5C,EAEpC,GAAI2C,CAAAA,GAAc,cAAA,EAAkBC,CAAAA,EAAc,OAAS,QAAA,CAAU,CACnE,IAAMR,CAAAA,CAAa3B,EAAarG,CAAa,CAAA,CAAE,GAAA,EAAO,EAAA,CAChD+H,EAASD,CAAAA,CAAe,GAAA,EAAO,EAAA,CAErC,GAAIE,IAAeD,CAAAA,CACjB,OAAOhE,CAAAA,CAKT,IAAMkE,EAAaD,CAAAA,CACf,CAAA;AAAA;AAAA;AAAA;AAAA,2BAAA,EAAgHE,CAAAA,CAAuBF,CAAU,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAClJ,EAAA,CACEG,EAAUJ,CAAAA,CACZ,CAAA;AAAA;AAAA;AAAA;AAAA,2BAAA,EAA6GG,CAAAA,CAAuBH,CAAM,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAC3I,EAAA,CAEJ,OAAO,CAAA,EAAGhE,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA,EAAQiI,CAAU,CAAA,EAAGE,CAAO,CAAA,OAAA,CACnE,CAEA,GAAII,CAAAA,GAAc,cAAA,EAAkBC,CAAAA,EAAc,IAAA,GAAS,UAAA,CAAY,CACrE,GAAIA,CAAAA,CAAa,MAAA,GAAW,QAAA,CAC1B,OAAO,CAAA,EAAGzE,CAAG,CAAA,EAAG0E,EAAAA,CAA+BzI,CAAAA,CAAeqG,CAAAA,CAAarG,CAAa,CAAA,CAAG8H,CAAc,CAAC,CAAA,CAAA,CAM5G,IAAMY,EAAgBC,IAAAA,CAAKb,CAAAA,CAAe,aAAA,EAAe,UAAA,EAAc,EAAE,CAAA,CAAE,MAAA,CAAO,OAAO,CAAA,CAEnFc,CAAAA,CAAAA,CADed,CAAAA,CAAe,aAAA,EAAe,OAAA,EAAqD,EAAC,EACxE,GAAA,CAAKe,CAAAA,EAASX,CAAAA,CAAuBW,CAAAA,CAAK,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CACpFZ,CAAAA,CAAaS,CAAAA,CAAc,MAAA,CAC7B,CAAA;AAAA;AAAA,EAAuCA,CAAAA,CACpC,IACEzD,CAAAA,EACC,CAAA;AAAA;AAAA;AAAA,6BAAA,EAAgGiD,CAAAA,CAAuBjD,CAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,CAC/H,CAAA,CACC,IAAA,CAAK,EAAE,CAAC,CAAA;AAAA;AAAA,CAAA,CACX,EAAA,CACEkD,EAAUS,CAAAA,CACZ,CAAA;AAAA;AAAA;AAAA;AAAA,4BAAA,EAA8GA,CAAY,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAC1H,EAAA,CAEJ,OAAI,CAACX,CAAAA,EAAc,CAACE,CAAAA,CACXpE,CAAAA,CAGF,GAAGA,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA,EAAQiI,CAAU,CAAA,EAAGE,CAAO,SACnE,CAEA,OAAO,GAAGpE,CAAG;AAAA,CACf,CAAA,CAAG,EAAE,CAGP,CAEA,SAAS0E,EAAAA,CACPzI,CAAAA,CACA8I,CAAAA,CACAhB,CAAAA,CACQ,CAER,IAAMiB,CAAAA,CAAAA,CADejB,CAAAA,CAAe,eAAe,OAAA,EAAqD,EAAC,EAClE,GAAA,CAAI,CAAChJ,CAAAA,CAAYM,CAAAA,IAAW,CACjE,GAAGN,CAAAA,CACH,SAAA,CAAWA,CAAAA,CAAW,SAAA,EAAaM,CACrC,EAAE,CAAA,CACI4J,CAAAA,CAAuBD,CAAAA,CAAmB,GAAA,CAAKjK,CAAAA,EAAeA,CAAAA,CAAW,GAAG,CAAA,CAG5EmK,CAAAA,CAAwB,CAC5B,GAAGC,EAAAA,CAA6BJ,CAAa,CAAA,CAC7C,GAAIA,CAAAA,EAAe,oBAAA,EAAwB,EAAC,CAC5C,GAAIhB,CAAAA,CAAe,oBAAA,EAAwB,EAC7C,CAAA,CACMqB,CAAAA,CAAkBR,IAAAA,CAAKb,CAAAA,CAAe,aAAA,EAAe,UAAA,EAAc,EAAE,CAAA,CAAE,MAAA,CAC1E7C,CAAAA,EAAQA,CAAAA,EAAO,CAAC+D,CAAAA,CAAqB,QAAA,CAAS/D,CAAG,CACpD,CAAA,CAKMmE,CAAAA,CAAiBL,CAAAA,CAAmB,MAAA,CAAQjK,CAAAA,EAAemK,CAAAA,CAAsBnK,CAAAA,CAAW,GAAG,CAAA,GAAM,MAAS,CAAA,CAC9GuK,CAAAA,CAAuBN,CAAAA,CAAmB,MAAA,CAAQjK,CAAAA,EAAe,CACrE,IAAMwK,CAAAA,CAAoBL,CAAAA,CAAsBnK,CAAAA,CAAW,GAAG,CAAA,CAE9D,OAAOwK,CAAAA,GAAsB,MAAA,EAAaA,CAAAA,GAAsBxK,CAAAA,CAAW,SAC7E,CAAC,CAAA,CACKmJ,CAAAA,CAAasB,EAAAA,CAAgCJ,CAAe,CAAA,CAC5DhB,CAAAA,CAAUqB,EAAAA,CAA6BJ,CAAc,CAAA,CACrDK,CAAAA,CAAUC,EAAAA,CAA6BL,CAAoB,CAAA,CAEjE,OAAI,CAACpB,CAAAA,EAAc,CAACE,CAAAA,EAAW,CAACsB,CAAAA,CACvB,EAAA,CAGF;AAAA,MAAA,EAAWzJ,CAAa,CAAA;AAAA,EAAQiI,CAAU,CAAA,EAAGE,CAAO,GAAGsB,CAAO,CAAA,OAAA,CACvE,CAEA,SAASP,EAAAA,CAA6BS,EAAkE,CACtG,IAAMhK,EAAQgK,CAAAA,EAAY,KAAA,CAE1B,OAAK,KAAA,CAAM,OAAA,CAAQhK,CAAK,CAAA,CAIjBA,CAAAA,CAAM,MAAA,CAAiC,CAACT,EAAQ4F,CAAAA,CAAM1F,CAAAA,GAAU,CACrE,GAAI,OAAO0F,GAAS,QAAA,EAAY,CAACA,GAAQ,EAAE,KAAA,GAASA,GAClD,OAAO5F,CAAAA,CAGT,GAAM,CAAE,GAAA,CAAA+F,CAAI,CAAA,CAAIH,CAAAA,CAEhB,GAAI,OAAOG,GAAQ,QAAA,EAAYA,CAAAA,CAAI,SAAW,CAAA,CAC5C,OAAO/F,EAGT,IAAM0K,CAAAA,CAAY,cAAe9E,CAAAA,EAAQ,OAAOA,EAAK,SAAA,EAAc,QAAA,CAAWA,EAAK,SAAA,CAAY1F,CAAAA,CAE/F,OAAO,CACL,GAAGF,CAAAA,CACH,CAAC+F,CAAG,EAAG2E,CACT,CACF,CAAA,CAAG,EAAE,CAAA,CApBI,EAqBX,CAEA,SAASL,GAAgCM,CAAAA,CAAuB,CAC9D,OAAIA,CAAAA,CAAI,MAAA,GAAW,EACV,EAAA,CAOF,CAAA;AAAA;AAAA,EAJOA,EAAI,MAAA,CAAO,CAACC,CAAAA,CAAkB7E,CAAAA,GACnC,GAAG6E,CAAgB,CAAA;AAAA,wCAAA,EAAwD5B,CAAAA,CAAuBjD,CAAG,CAAC,CAAA;AAAA;AAAA,CAAA,CAC5G,EAAE,CAE8C,CAAA;AAAA;AAAA,CACrD,CAEA,SAASuE,EAAAA,CAA6BO,CAAAA,CAAqD,CACzF,OAAIA,CAAAA,CAAY,MAAA,GAAW,CAAA,CAClB,EAAA,CAKF,CAAA;AAAA;AAAA,EAFOC,EAAAA,CAA4BD,CAAW,CAEL,CAAA;AAAA;AAAA,CAClD,CAEA,SAASC,EAAAA,CAA4BD,CAAAA,CAAqD,CACxF,OAAOA,CAAAA,CAAY,OAAO,CAACE,CAAAA,CAAenL,EAAYM,CAAAA,GAAU,CAC9D,IAAMwK,CAAAA,CAAY9K,CAAAA,CAAW,WAAaM,CAAAA,CAE1C,OACE,GAAG6K,CAAa,CAAA;AAAA,wCAAA,EAC2B/B,CAAAA,CAAuBpJ,CAAAA,CAAW,GAAG,CAAC,CAAA;AAAA,+BAAA,EAC/C8K,CAAS,CAAA;AAAA;AAAA,CAG/C,CAAA,CAAG,EAAE,CACP,CAEA,SAASF,EAAAA,CAA6BK,CAAAA,CAAqD,CACzF,OAAIA,CAAAA,CAAY,MAAA,GAAW,CAAA,CAClB,EAAA,CAGKA,CAAAA,CAAY,MAAA,CAAO,CAACG,CAAAA,CAAcpL,CAAAA,CAAYM,CAAAA,GAAU,CACpE,IAAMwK,CAAAA,CAAY9K,CAAAA,CAAW,SAAA,EAAaM,CAAAA,CAE1C,OACE,CAAA,EAAG8K,CAAY,CAAA;AAAA;AAAA,wCAAA,EAE4BhC,CAAAA,CAAuBpJ,CAAAA,CAAW,GAAG,CAAC,CAAA;AAAA,sCAAA,EACxC8K,CAAS,CAAA;AAAA;AAAA;AAAA,CAItD,CAAA,CAAG,EAAE,CAGP,CAEA,SAAShC,EAAAA,CACPP,CAAAA,CACA1H,EACe,CACf,OAAIvB,GAAc,QAAA,CAASiJ,CAAI,EACtB1H,CAAAA,EAAO,QAAA,GAAauI,CAAAA,CAAuBvI,CAAAA,CAAM,UAAU,CAAA,CAAI,KAGpExB,EAAAA,CAAY,QAAA,CAASkJ,CAAI,CAAA,CAEA1H,CAAAA,EAAU,KAC5B,IAAA,CAGFuI,CAAAA,CAAuBvI,EAAM,QAAA,EAAU,EAIrBA,CAAAA,EAAU,IAAA,EAAQA,IAAU,EAAA,CAC9C,IAAA,CAGFA,EAAM,QAAA,EACf,CAMA,SAASuI,CAAAA,CAAuBvI,CAAAA,CAAuB,CACrD,OAAO,IAAA,CAAK,UAAUA,CAAK,CAC7B,CAEA,SAASsH,EAAAA,CAAgC7F,EAAgBX,CAAAA,CAA0BU,CAAAA,CAAuB,CACxG,IAAM8B,CAAAA,CAAeC,GAAgB9B,CAAAA,CAAQX,CAAgB,EACvD8G,CAAAA,CAAmBtE,CAAAA,EAAc,UAAA,EAAc,EAAC,CAChDkH,CAAAA,CAAwBzG,EAAwB,QAAA,CAAU6D,CAAgB,EAC1E6C,CAAAA,CAAuB1G,CAAAA,CAAwB,QAAS6D,CAAgB,CAAA,CACxE8C,EAA8B3G,CAAAA,CAAwB,cAAA,CAAgB6D,CAAgB,CAAA,CAExF+C,CAAAA,CAASH,EAAsB,MAAA,CAAO,CAACpG,EAAK/D,CAAAA,GACvC,CAAA,EAAG+D,CAAG,CAAA,EAAG/D,CAAa;AAAA,EAAA,CAAA,CAC5B,EAAE,CAAA,CAEL,OAAAsK,CAAAA,EAAUF,CAAAA,CAAqB,MAAA,CAAO,CAACrG,CAAAA,CAAK/D,CAAAA,GACnC,CAAA,EAAG+D,CAAG,CAAA,IAAA,EAAO/D,CAAa,CAAA;AAAA;AAAA,QAAA,EAA4BmB,CAAK;AAAA;AAAA,EAAA,CAAA,CACjE,EAAE,CAAA,CAELmJ,CAAAA,EAAUD,EAA4B,MAAA,CAAO,CAACtG,EAAK/D,CAAAA,GAA0B,CAC3E,IAAMkC,CAAAA,CAAwBT,KAAKC,MAAAA,CAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEuH,CAAgB,CAAA,CAC5EgD,CAAAA,CAAmBrI,CAAAA,EAAuB,YAAA,EAAc,MAAQ,QAAA,CAEtE,GAAI1D,GAA6B0D,CAAqB,CAAA,CACpD,OAAO,CAAA,EAAG6B,CAAG,CAAA,EAAGhE,EAAAA,CACdC,EACAvB,EAAAA,CAAoCyD,CAAAA,CAAuBe,CAAY,CACzE,CAAC,GAGH,IAAMuH,CAAAA,CAAyBtI,CAAAA,EAAuB,YAAA,EAAc,QAAU,EAAA,CAExEuI,CAAAA,CAD2BhJ,KAAKC,MAAAA,CAAO8I,CAAAA,CAAwB,MAAM,CAAC,CAAA,CAAEpJ,CAAM,CAAA,EACrB,YAAc,EAAC,CACxEyD,EACJ3C,CAAAA,EAAuB,YAAA,EAAc,OAAS,6CAAA,CAC1ChB,CAAAA,CAAmBO,IAAAA,CAAKC,MAAAA,CAAOmD,EAAsB,MAAM,CAAC,EAAE4F,CAA4B,CAAA,CAC1FlF,EAAwBzH,CAAAA,CAAkBoD,CAAgB,EAC5DwJ,CAAAA,CAAO,EAAA,CAYX,GAVIH,CAAAA,GAAqB,QAAA,GACnBhF,IAA0B,QAAA,GAC5BmF,CAAAA,CAAO,KAAK1K,CAAa,CAAA;AAAA;AAAA,IAAA,EAAsB6E,CAAoB;AAAA;AAAA,EAAA,CAAA,CAAA,CAGjEU,CAAAA,GAA0B,OAAA,GAC5BmF,CAAAA,CAAO,CAAA,EAAA,EAAK1K,CAAa,CAAA;AAAA;AAAA,MAAA,EAAwB6E,CAAoB,CAAA;AAAA;AAAA;AAAA,QAAA,EAA6C1D,CAAK;AAAA;AAAA;AAAA,EAAA,CAAA,CAAA,CAAA,CAIvHoJ,CAAAA,GAAqB,YAAcE,CAAAA,CAA6B,MAAA,CAAQ,CAC1E,IAAME,CAAAA,CAAiCF,CAAAA,CAA6B,MAAA,CAAO,CAACG,CAAAA,CAAK7M,IAAc,CAC7F,GAAID,CAAAA,CAAkBC,CAAS,CAAA,GAAM,OAAA,CACnC,OAAO,CAAA,EAAG6M,CAAG,CAAA,QAAA,EAAW7M,CAAAA,CAAU,IAAI,CAAA;AAAA;AAAA;AAAA,UAAA,EAAmDoD,CAAK;AAAA;AAAA,CAAA,CAGhG,GAAIrD,CAAAA,CAAkBC,CAAS,CAAA,GAAM,cAAA,CAAgB,CACnD,IAAMuD,CAAAA,CAAkBH,CAAAA,GAAU,SAAA,CAAY,EAAA,CAAK,CAAA,EAAGA,CAAK;AAAA,IAAA,CAAA,CACrDc,EAAAA,CAAqBR,IAAAA,CAAKC,MAAAA,CAAO3D,CAAAA,CAAU,YAAA,EAAc,MAAA,CAAQ,MAAM,CAAC,CAAA,CAAEqD,CAAM,CAAA,CAChFc,CAAAA,CAAwBT,IAAAA,CAAKC,MAAAA,CAAO3D,CAAAA,CAAU,YAAA,EAAc,KAAA,CAAO,MAAM,CAAC,CAAA,CAC9EkE,EAAAA,EAAoB,UAAA,EAAc,EACpC,CAAA,CACML,CAAAA,CACJ9D,CAAAA,CAAkBoE,CAAqB,IAAM,OAAA,CACzC,CAAA;AAAA;AAAA;AAAA,MAAA,EAAsCZ,CAAe,CAAA;AAAA,QAAA,CAAA,CACrD,EAAA,CAEN,GAAIvD,CAAAA,CAAU,YAAA,EAAc,IAAA,GAAS,QAAA,CACnC,OAAO,CAAA,EAAG6M,CAAG,CAAA,EAAA,EAAK7M,CAAAA,CAAU,IAAI,CAAA;AAAA,MAAA,EAAaA,CAAAA,CAAU,YAAA,CAAa,KAAK,CAAA,EAAA,EAAK6D,CAAmB,CAAA;AAAA,IAAA,CAAA,CAGnG,GAAI7D,CAAAA,CAAU,YAAA,EAAc,KAAA,CAC1B,OAAO,CAAA,EAAG6M,CAAG,CAAA,EAAA,EAAK7M,CAAAA,CAAU,IAAI,CAAA,SAAA,EAAYG,EAAyB,CAAA;AAAA,MAAA,EAAyBH,CAAAA,CAAU,YAAA,CAAa,KAAK,CAAA,EAAA,EAAK6D,CAAmB,CAAA;AAAA,IAAA,CAEtJ,CAGA,OAAIhD,EAAAA,CAAiBb,CAAS,EACrB,CAAA,EAAG6M,CAAG,CAAA,EAAA,EAAK7M,CAAAA,CAAU,IAAI,CAAA;AAAA,IAAA,EAAWO,EAAsB;AAAA;AAAA,CAAA,CAG5D,CAAA,EAAGsM,CAAG,CAAA,EAAA,EAAK7M,CAAAA,CAAU,IAAI;AAAA,EAAA,CAClC,CAAA,CAAG,EAAE,CAAA,CAEL2M,CAAAA,CACE/J,GAA4BX,CAAa,CAAA,CACzC,SAASA,CAAa,CAAA;AAAA,EAA8B2K,CAA8B,CAAA;AAAA,EAEtF,CAEA,OAAO,CAAA,EAAG5G,CAAG,GAAG2G,CAAI,CAAA,CACtB,CAAA,CAAG,EAAE,CAAA,CAEEJ,CACT,CAKO,SAASO,GACd1H,CAAAA,CACA/B,CAAAA,CACAyI,CAAAA,CACQ,CACR,IAAMiB,CAAAA,CAAS,OAAOjB,CAAAA,EAAQ,SAAW,CAACA,CAAG,CAAA,CAAI,CAAC,GAAGA,CAAG,CAAA,CAClD5G,CAAAA,CAAexB,KAAKC,MAAAA,CAAOyB,CAAAA,CAAY,MAAM,CAAC,CAAA,CAAE/B,CAAM,CAAA,CACtDgB,CAAAA,CAAaa,GAAc,UAAA,EAAc,EAAC,CAC1CsD,CAAAA,CAAuBC,EAAAA,CAAWvD,CAAAA,EAAc,MAAA,EAAU,EAAE,EAC5DY,CAAAA,CAAkBkH,EAAAA,CAAsB3I,CAAAA,CAAY0I,CAAM,CAAA,CAC1DvH,CAAAA,CAAgB,CAAA,MAAA,EAASC,CAAAA,CAAuBP,GAAc,MAAA,EAAUE,CAAU,CAAC,CAAA,CAAA,CAEzF,OAAIA,CAAAA,GAAe,QAAA,CAEf,CAAA,SAAA,EAAYI,CAAa,YAAYJ,CAAU,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAYjD,CAAA,SAAA,EAAYI,CAAa,CAAA,SAAA,EAAYJ,CAAU,CAAA;AAAA,QAAA,EACpCoD,CAAoB,CAAA;AAAA;AAAA,EAE5B1C,CAAAA,CAAkB,CAAA;AAAA,KAAA,EAAuBA,CAAe;AAAA;AAAA,CAAA,CAAc,EAAE,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAO/E,CAEO,SAASmH,EAAAA,CAAqBnB,CAAAA,CAAsF,CACzH,IAAMiB,CAAAA,CAAS,OAAOjB,CAAAA,EAAQ,QAAA,CAAW,CAACA,CAAG,CAAA,CAAI,CAAC,GAAGA,CAAG,EAExD,OAAIiB,CAAAA,CAAO,MAAA,GAAW,CAAA,CACb,CAAE,GAAA,CAAK,CAAE,EAAA,CAAIA,CAAAA,CAAO,CAAC,CAAY,CAAE,CAAA,CAGrC,CAAE,IAAK,CAAE,EAAA,CAAIA,CAAO,CAAE,CAC/B,CAEA,SAASC,EAAAA,CAAsBxD,CAAAA,CAA+BsC,CAAAA,CAAgC,CAkB5F,OAjBwBnG,CAAAA,CAAwB,OAAA,CAAS6D,CAAgB,EACxB,MAAA,CAAO,CAACxD,CAAAA,CAAK/D,CAAAA,GAAkB,CAC9E,IAAMiL,CAAAA,CAAWpB,EAAI,GAAA,CAAKqB,CAAAA,EAAOhD,EAAuB,CAAA,EAAGgD,CAAE,CAAA,CAAA,EAAIlL,CAAa,EAAE,CAAC,CAAA,CAAE,KAAK,IAAI,CAAA,CACtFmL,EAAWtB,CAAAA,CAAI,MAAA,GAAW,CAAA,CAAI,CAAA,WAAA,EAAcoB,CAAQ,CAAA,EAAA,CAAA,CAAO,CAAA,YAAA,EAAeA,CAAQ,CAAA,GAAA,CAAA,CAExF,OACE,GAAGlH,CAAG;AAAA,MAAA,EACG/D,CAAa,CAAA;AAAA;AAAA;AAAA,YAAA,EAGPmL,CAAQ;AAAA;AAAA;AAAA,QAAA,CAK3B,EAAG,EAAE,CAGP,CAEO,SAASC,GACd3K,CAAAA,CACAW,CAAAA,CACAiK,CAAAA,CACApG,CAAAA,CACAqG,EACQ,CACR,IAAMrI,CAAAA,CAAeC,EAAAA,CAAgB9B,EAAQX,CAAgB,CAAA,CACvD2B,CAAAA,CAAaa,CAAAA,EAAc,YAAc,EAAC,CAC1CsD,CAAAA,CAAuBC,EAAAA,CAAWvD,GAAc,MAAA,EAAU,EAAE,CAAA,CAElE,GAAIb,EAAW,MAAA,GAAW,CAAA,CACxB,OAAO,EAAA,CAGT,IAAMqE,EAAOC,EAAAA,CAA2BtE,CAAAA,CAAYiJ,CAAU,CAAA,CACxDlG,EAAmBwB,EAAAA,CAAuBvE,CAAAA,CAAYqE,CAAAA,CAAM,QAAQ,EACpE5C,CAAAA,CAAkB0H,EAAAA,CAAsBnJ,CAAAA,CAAYqE,CAAAA,CAAM,UAAWxB,CAAG,CAAA,CACxEtB,CAAAA,CAAkByE,EAAAA,CAAsBhG,EAAYqE,CAAI,CAAA,CACxDrB,CAAAA,CAAyBoG,EAAAA,CAA6BpJ,EAAYqE,CAAI,CAAA,CACtEM,CAAAA,CAAetG,CAAAA,CACfuG,EAAqBC,EAAAA,CAAgC7F,CAAAA,CAAQ2F,CAAAA,CAAc,SAAS,EAG1F,OACE,CAAA,SAAA,EAHoB,SAASvD,CAAAA,CAAuB/C,CAAgB,CAAC,CAAA,CAG5C,CAAA;AAAA,QAAA,EACd8F,CAAoB,CAAA;AAAA;AAAA,WAAA,EAEjB2B,EAAuBjD,CAAG,CAAC,CAAA,MAAA,EAChCE,CAAgB,SAChBtB,CAAe;AAAA,MAAA,EACfF,CAAe;AAAA,MAAA,EACfyB,CAAsB;AAAA;AAAA;AAAA,IAAA,EAGxB2B,CAAY,CAAA;AAAA;AAAA,MAAA,EAEVC,CAAkB,CAAA;AAAA;AAAA;AAAA,CAK/B,CAEA,SAASuE,EAAAA,CACPhE,CAAAA,CACAd,CAAAA,CACAgF,CAAAA,CACAxG,CAAAA,CACQ,CACR,IAAMpB,CAAAA,CAAkBuD,IAAAA,CAAK1D,CAAAA,CAAwB,QAAS6D,CAAgB,CAAA,CAAed,CAAI,CAAA,CA0BjG,OAzBwBgB,OAAAA,CAAQ5D,CAAe,CAAA,CACE,OAAO,CAACE,CAAAA,CAAK,CAAC/D,CAAAA,CAAe8H,CAAc,CAAA,GAAM,CAChG,GAAIA,GAAgB,KAAA,GAAU,MAAA,EAAaA,CAAAA,CAAe,KAAA,GAAU,IAAA,EAAQA,CAAAA,CAAe,KAAA,GAAU,EAAA,CACnG,OAAO/D,CAAAA,CAGT,IAAM6B,CAAAA,CAAkBnE,IAAAA,CAAKC,MAAAA,CAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEuH,CAAgB,CAAA,CACtEI,CAAAA,CAAa,KAAA,CAAM,OAAA,CAAQG,CAAAA,CAAe,KAAK,EACjD,MAAA,CACAF,EAAAA,CAAehC,CAAAA,CAAgB,QAAA,CAAUkC,CAAAA,CAAe,KAAK,CAAA,CAEjE,OACE,GAAG/D,CAAG;AAAA,MAAA,EACG/D,CAAa,CAAA;AAAA;AAAA;AAAA,iBAAA,EAGFkI,EAAuB,CAAA,EAAGjD,CAAG,CAAA,CAAA,EAAIjF,CAAa,EAAE,CAAC;AAAA,oBAAA,EAC9C4F,EAAgB,QAAQ,CAAA;AAAA,YAAA,EAChC6F,CAAY,KAAK9D,CAAU;AAAA;AAAA;AAAA,OAAA,CAK9C,CAAA,CAAG,EAAE,CAGP,CAEA,SAAS6D,EAAAA,CAA6BjE,CAAAA,CAA+Bd,CAAAA,CAA8B,CACjG,IAAMrB,CAAAA,CAAyBgC,IAAAA,CAAK1D,CAAAA,CAAwB,cAAA,CAAgB6D,CAAgB,CAAA,CAAed,CAAI,CAAA,CA4C/G,OA3CwBgB,OAAAA,CAAQrC,CAAsB,CAAA,CACL,MAAA,CAAO,CAACrB,CAAAA,CAAK,CAAC/D,CAAAA,CAAe8H,CAAc,CAAA,GAAM,CAChG,IAAMlC,CAAAA,CAAkBnE,IAAAA,CAAKC,MAAAA,CAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEuH,CAAgB,CAAA,CACtE,CAAE,SAAA,CAAAgB,CAAAA,CAAW,YAAA,CAAAC,CAAa,CAAA,CAAI5C,CAAAA,CAEpC,GAAI2C,CAAAA,GAAc,cAAA,EAAkBC,CAAAA,EAAc,IAAA,GAAS,QAAA,CAAU,CACnE,GAAI,CAACV,CAAAA,CAAe,GAAA,CAClB,OAAO/D,CAAAA,CAGT,IAAMoE,CAAAA,CAAU,CAAA;AAAA;AAAA;AAAA,yBAAA,EAAkFD,CAAAA,CAAuBJ,CAAAA,CAAe,GAAG,CAAC,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAE5I,OAAO,GAAG/D,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA,QAAA,EAAgBmI,CAAO,CAAA,OAAA,CAC9D,CAEA,IAAMuD,CAAAA,CAAyBnD,CAAAA,GAAc,cAAA,EAAkBC,CAAAA,EAAc,IAAA,GAAS,UAAA,CAChFmD,CAAAA,CACJ,KAAA,CAAM,OAAA,CAAQ7D,CAAAA,CAAe,aAAA,EAAe,OAAO,CAAA,EAAKA,CAAAA,CAAe,aAAA,CAAc,OAAA,CAAQ,MAAA,CAAS,CAAA,CACxG,GAAI4D,CAAAA,EAA0BC,CAAAA,CAAkB,CAC9C,IAAM5B,CAAAA,CAAejC,CAAAA,CAAe,eAAe,OAAA,EAAqD,EAAC,CAEzG,GAAIU,CAAAA,EAAc,MAAA,GAAW,QAAA,CAAU,CACrC,IAAMoD,CAAAA,CAAe5B,EAAAA,CACnBD,CAAAA,CAAY,GAAA,CAAI,CAACjL,CAAAA,CAAYM,CAAAA,IAAW,CACtC,GAAGN,CAAAA,CACH,SAAA,CAAWA,CAAAA,CAAW,SAAA,EAAaM,CACrC,CAAA,CAAE,CACJ,CAAA,CAEA,OAAO,CAAA,EAAG2E,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA;AAAA,EAA4B4L,CAAY,CAAA;AAAA,OAAA,CAC/E,CAEA,IAAMhD,CAAAA,CAAemB,CAAAA,CAAY,IAAKlB,CAAAA,EAASX,CAAAA,CAAuBW,CAAAA,CAAK,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,CACpFV,EAAUS,CAAAA,CACZ,CAAA;AAAA;AAAA;AAAA,0BAAA,EAAkFA,CAAY,CAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAC9F,EAAA,CAEJ,OAAO,CAAA,EAAG7E,CAAG;AAAA,MAAA,EAAW/D,CAAa,CAAA;AAAA,QAAA,EAAgBmI,CAAO,CAAA,OAAA,CAC9D,CAEA,OAAO,GAAGpE,CAAG;AAAA,CACf,EAAG,EAAE,CAGP,CAEO,SAAS8H,EAAAA,CAAqB,CACnC,iBAAA,CAAAxG,CAAAA,CACA,MAAAlE,CAAAA,CACA,MAAA,CAAAC,CACF,CAAA,CAKgB,CAEd,IAAM0K,CAAAA,CADerK,IAAAA,CAAKC,OAAO2D,CAAAA,CAAmB,MAAM,CAAC,CAAA,CAAEjE,CAAM,CAAA,EAC7B,MAAA,EAAU,GAEhD,OAAK0K,CAAAA,CAOElJ,GAAekJ,CAAAA,CAAiB3K,CAAAA,CAAOC,EAAQ,CACpD,SAAA,CAAW,OACX,aAAA,CAAe,CAAA,UAAA,EAAaoC,EAAuBsI,CAAe,CAAC,EACrE,CAAC,CAAA,CATQ,CACL,eAAA,CAAiB,GACjB,KAAA,CAAO,EACT,CAOJ,CAOO,SAASC,GAA8B,CAC5C,aAAA,CAAA/L,EACA,UAAA,CAAAmD,CAAAA,CACA,iBAAA1C,CAAAA,CACA,MAAA,CAAAW,CACF,CAAA,CAKgB,CACd,IAAM6B,CAAAA,CAAeC,EAAAA,CAAgB9B,CAAAA,CAAQX,CAAgB,EACvD1C,CAAAA,CAAY0D,IAAAA,CAAKC,OAAO1B,CAAAA,CAAe,MAAM,CAAC,CAAA,CAAEiD,CAAAA,EAAc,YAAc,EAAE,EAC9EhD,CAAAA,CAAoBxB,EAAAA,CAAoCV,EAAWkF,CAAY,CAAA,CAC/E9C,EAAsBF,CAAAA,CACxB,CAAA;AAAA;AAAA;AAAA,CAAA,CACA,GACEI,CAAAA,CAAsBJ,CAAAA,CACxB,wDACA,iBAAA,CACEsD,CAAAA,CAAgB,MAAMC,CAAAA,CAAuBL,CAAU,CAAC,CAAA,eAAA,CAAA,CAE9D,OAAO,CACL,eAAA,CAAiB1C,CAAAA,CACjB,MACE,CAAA,MAAA,EAAS8C,CAAa,YAAYJ,CAAU,CAAA;AAAA,EAAA,EACvC1C,CAAgB,CAAA;AAAA,IAAA,EACdT,CAAa,aAAaK,CAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA,CAOpDF,CAAAA,CACA,CAAA;AAAA,UAAA,EACa9B,EAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAM5B,CACF,CAEA,IAAMmI,EAAAA,CAAcoE,CAAAA,EACXA,EAAI,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,GAAgBA,CAAAA,CAAI,KAAA,CAAM,CAAC,CAAA,CAG3C,SAASpH,EAAuBL,CAAAA,CAA4B,CACjE,IAAM6I,CAAAA,CAAuB7I,EAC1B,KAAA,CAAM,eAAe,EACrB,MAAA,CAAO,OAAO,EACd,GAAA,CAAIqD,EAAU,CAAA,CACd,IAAA,CAAK,EAAE,CAAA,CAEV,OAAKwF,EAID,YAAA,CAAa,IAAA,CAAKA,CAAoB,CAAA,CACjCA,CAAAA,CAGF,CAAA,MAAA,EAASA,CAAoB,GAP3B,QAQX,CAEO,SAAS9I,EAAAA,CAAgB9B,EAAgBX,CAAAA,CAA8C,CAC5F,OAAIA,CAAAA,GAAqB,UAChBwL,CAAAA,CAGFxK,IAAAA,CAAKC,OAAOjB,CAAAA,CAAkB,QAAQ,CAAC,CAAA,CAAEW,CAAM,CACxD,CAMO,SAAS8K,EAAAA,CACdC,CAAAA,CACA1L,EACAW,CAAAA,CACqC,CACrC,GAAI,CAAC+K,CAAAA,EAAY,OAAOA,CAAAA,EAAa,SACnC,OAAO,GAGT,IAAMlJ,CAAAA,CAAeC,GAAgB9B,CAAAA,CAAQX,CAAgB,CAAA,CAE7D,GAAI,CAACwC,CAAAA,CACH,OAAO,EAAC,CAGV,IAAMmJ,CAAAA,CAAY,CAAA,MAAA,EAAS5F,EAAAA,CAAW/F,CAAgB,CAAC,CAAA,CAAA,CACjD4L,CAAAA,CAAWF,EAAwCC,CAAS,CAAA,CAElE,GAAI,CAACC,CAAAA,EAAW,OAAOA,CAAAA,EAAY,SACjC,OAAO,GAGT,IAAMC,CAAAA,CAAYD,EAAuC5L,CAAgB,CAAA,CACnE/B,CAAAA,CAAS,KAAA,CAAM,QAAQ4N,CAAQ,CAAA,CAAIA,EAAS,CAAC,CAAA,CAAI,OAEvD,OAAI,CAAC5N,CAAAA,EAAU,OAAOA,GAAW,QAAA,CACxB,EAAC,CAGHuE,CAAAA,CAAa,WAAW,MAAA,CAA4C,CAAC4G,CAAAA,CAAK9L,CAAAA,GAAc,CAC7F,GAAID,CAAAA,CAAkBC,CAAS,CAAA,GAAM,OAAA,CACnC,OAAO8L,CAAAA,CAIT,IAAM0C,CAAAA,CADO7M,EAAAA,CAAYhB,EAAsCX,CAAAA,CAAU,IAAI,CAAC,CAAA,EACzD,GAAA,CAErB,OAAI,OAAOwO,CAAAA,EAAW,QAAA,EAAYA,CAAAA,CAAO,SAAW,CAAA,CAC3C1C,CAAAA,CAGF,CACL,GAAGA,CAAAA,CACH,CAAC9L,CAAAA,CAAU,IAAI,EAAGwO,CACpB,CACF,CAAA,CAAG,EAAE,CACP,CCnrDA,SAASC,EAAAA,CAASC,CAAAA,CAA2C,CAC3D,OAAKA,EAIE,OAAA,GAAYA,CAAAA,CAHV,KAIX,CAEO,SAASC,EAAAA,CAAeD,CAAAA,CAAuC,CACpE,GAAI,CAACA,CAAAA,CACH,OAAO,KAGT,GAAIE,WAAAA,CAAY,GAAGF,CAAK,CAAA,CACtB,OAAOA,CAAAA,CAGT,GAAID,EAAAA,CAASC,CAAK,EAAG,CACnB,IAAMG,EAAsBH,CAAAA,CAAM,KAAA,CAElC,GAAIE,WAAAA,CAAY,GAAGC,CAAmB,CAAA,CACpC,OAAOA,CAEX,CAEA,OAAO,IACT,CAEA,SAASC,EAAAA,CAAgBJ,EAA+B,CACtD,GAAI,CAACA,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAC7B,OAAO,IAAA,CAGT,GAAM,CAAE,OAAA,CAAAK,CAAQ,CAAA,CAAIL,CAAAA,CAEpB,OAAO,OAAOK,CAAAA,EAAY,QAAA,CAAWA,CAAAA,CAAU,IACjD,CAEO,SAASC,GAAkBC,CAAAA,CAAwC,CACxE,GAAI,CAACA,CAAAA,CACH,OAAO,IAAA,CAGT,GAAI,CACF,OAAO,KAAK,KAAA,CAAMA,CAAQ,CAC5B,CAAA,KAAQ,CACN,OAAO,IACT,CACF,CAEO,SAASC,GAAgCR,CAAAA,CAAkC,CAChF,GAAI,CAACA,CAAAA,CACH,OAAO,IAAA,CAGT,IAAMS,CAAAA,CAAWC,EAAAA,CAA6BV,CAAK,CAAA,CAAE,MAAA,CAAQK,GAAY,CAACM,EAAAA,CAAgCN,CAAO,CAAC,EAElH,OAAII,CAAAA,CAAS,SAAW,CAAA,CACf,IAAA,CAGF,CACL,oEAAA,CACA,yEAAA,CACA,GAAGA,CAAAA,CAAS,IAAKJ,CAAAA,EAAY,CAAA,EAAA,EAAKA,CAAO,CAAA,CAAE,CAC7C,EAAE,IAAA,CAAK;AAAA,CAAI,CACb,CAEO,SAASO,EAAAA,CAA2BZ,EAA8B7L,CAAAA,CAA4B,CACnG,OAAK6L,CAAAA,CAIEU,EAAAA,CAA6BV,CAAK,CAAA,CAAE,IAAA,CAAMK,GACxCA,CAAAA,CAAQ,QAAA,CAAS,CAAA,oBAAA,EAAuBlM,CAAS,CAAA,CAAA,CAAG,CAC5D,CAAA,CALQ,KAMX,CAEA,SAASuM,EAAAA,CAA6BV,CAAAA,CAA4B,CAChE,GAAIa,qBAAAA,CAAsB,EAAA,CAAGb,CAAK,EAChC,OAAOA,CAAAA,CAAM,MAAA,CAAO,MAAA,CAAOc,EAAuB,CAAA,CAAE,GAAA,CAAI,CAAC,CAAE,OAAA,CAAAT,CAAQ,CAAA,GAAMA,CAAO,CAAA,CAGlF,IAAMU,CAAAA,CAAgBX,EAAAA,CAAgBJ,CAAK,CAAA,CAE3C,GAAIe,CAAAA,EAAiBC,EAAAA,CAA0BD,CAAa,CAAA,CAC1D,OAAO,CAACA,CAAa,CAAA,CAGvB,IAAME,CAAAA,CAAchB,EAAAA,CAAeD,CAAK,CAAA,CAExC,GAAIiB,CAAAA,EAAa,UAAA,GAAe,IAC9B,OAAO,EAAC,CAGV,IAAMC,CAAAA,CACJZ,EAAAA,CAAqCW,CAAAA,CAAY,QAAQ,GACzDE,EAAAA,CAAqBF,CAAW,CAAA,EAChCG,EAAAA,CAAsBpB,CAAK,CAAA,CAE7B,OAAKkB,CAAAA,CAID,MAAM,OAAA,CAAQA,CAAAA,CAAa,MAAM,CAAA,CAC5BA,CAAAA,CAAa,MAAA,CAAO,MAAA,CAAOJ,EAAuB,EAAE,GAAA,CAAKzI,CAAAA,EAASA,CAAAA,CAAK,OAAO,CAAA,CAGnF,OAAO6I,CAAAA,CAAa,OAAA,EAAY,UAAYF,EAAAA,CAA0BE,CAAAA,CAAa,OAAO,CAAA,CACrF,CAACA,CAAAA,CAAa,OAAO,CAAA,CAG1B,OAAOA,CAAAA,CAAa,KAAA,EAAU,QAAA,EAAYF,EAAAA,CAA0BE,CAAAA,CAAa,KAAK,CAAA,CACjF,CAACA,EAAa,KAAK,CAAA,CAGrB,EAAC,CAfC,EAgBX,CAEA,SAASC,GAAqBF,CAAAA,CAAuD,CACnF,GAAM,CAAE,OAAAxO,CAAO,CAAA,CAAIwO,CAAAA,CAEnB,OAAI,CAACxO,CAAAA,EAAU,OAAOA,CAAAA,EAAW,QAAA,CACxB,IAAA,CAGFA,CACT,CAEA,SAAS2O,GAAsBpB,CAAAA,CAA+C,CAC5E,GAAI,CAACD,EAAAA,CAASC,CAAK,CAAA,CACjB,OAAO,KAGT,GAAM,CAAE,KAAA,CAAAqB,CAAM,CAAA,CAAIrB,CAAAA,CACZsB,CAAAA,CAAelB,EAAAA,CAAgBiB,CAAK,CAAA,CAE1C,GAAIC,CAAAA,EAAgBN,EAAAA,CAA0BM,CAAY,CAAA,CACxD,OAAO,CAAE,QAASA,CAAa,CAAA,CAGjC,GAAI,CAACD,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAC7B,OAAO,IAAA,CAGT,GAAM,CAAE,MAAA,CAAA5O,CAAO,CAAA,CAAI4O,CAAAA,CAEnB,OAAI5O,GAAU,OAAOA,CAAAA,EAAW,QAAA,CACvBA,CAAAA,CAGF,IACT,CAEA,SAASqO,EAAAA,CAAwBd,EAAiE,CAChG,GAAI,CAACA,CAAAA,EAAS,OAAOA,CAAAA,EAAU,QAAA,CAC7B,OAAO,MAAA,CAGT,GAAM,CAAE,UAAA,CAAAuB,CAAAA,CAAY,OAAA,CAAAlB,CAAQ,CAAA,CAAIL,CAAAA,CAGhC,OAFauB,GAAY,IAAA,GAEZ,2BAAA,EAA+B,OAAOlB,CAAAA,EAAY,QAAA,CACtD,IAAA,CAGF,OAAOA,CAAAA,EAAY,UAAYW,EAAAA,CAA0BX,CAAO,CACzE,CAEA,SAASW,EAAAA,CAA0BX,CAAAA,CAA0B,CAC3D,OACEA,CAAAA,CAAQ,UAAA,CAAW,qBAAqB,CAAA,EACxCA,CAAAA,CAAQ,UAAA,CAAW,eAAe,CAAA,EAClCA,EAAQ,UAAA,CAAW,sBAAsB,CAAA,EACzCA,CAAAA,CAAQ,QAAA,CAAS,2BAA2B,CAEhD,CAEA,SAASM,EAAAA,CAAgCN,CAAAA,CAA0B,CACjE,OAAO,kEAAA,CAAmE,IAAA,CAAKA,CAAO,CACxF,CC9LA,IAAMmB,EAAAA,CAAuBC,cAAAA,CAUvBC,EAAAA,CAAsBC,aAAAA,CAAoD,MAAS,CAAA,CAEzF,SAASC,EAAAA,EAA4C,CACnD,IAAMC,CAAAA,CAAMC,UAAAA,CAAWJ,EAAmB,EAE1C,GAAI,CAACG,CAAAA,CACH,MAAM,IAAI,KAAA,CAAM,qDAAqD,CAAA,CAGvE,OAAOA,CACT,CAEA,SAASE,EAAAA,CAAgBC,CAAAA,CAAiE,CACxF,OAAO,IAAIC,UAAU,CAAC,CAAE,KAAA,CAAAjC,CAAM,CAAA,GAAM,CAClC,IAAMkC,CAAAA,CAAwB1B,GAAgCR,CAAK,CAAA,CAEnE,GAAIkC,CAAAA,CAAuB,CACzBF,CAAAA,CAAsBE,CAAqB,CAAA,CAE3C,MACF,CAEIrB,qBAAAA,CAAsB,EAAA,CAAGb,CAAK,CAAA,CAChCA,CAAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAE,OAAA,CAAAK,CAAAA,CAAS,SAAA,CAAA8B,CAAAA,CAAW,IAAA,CAAAC,CAAK,CAAA,GAAM,CACrD,OAAA,CAAQ,IAAA,CAAK,CAAA,0BAAA,EAA6B/B,CAAO,eAAe8B,CAAS,CAAA,QAAA,EAAWC,CAAI,CAAA,CAAE,EAC5F,CAAC,CAAA,CACQC,sBAAAA,CAAuB,EAAA,CAAGrC,CAAK,CAAA,EACxCA,CAAAA,CAAM,MAAA,CAAO,QAAQ,CAAC,CAAE,OAAA,CAAAK,CAAAA,CAAS,UAAA,CAAAkB,CAAW,CAAA,GAAM,CAChD,QAAQ,IAAA,CAAK,CAAA,2BAAA,EAA8BlB,CAAO,CAAA,cAAA,EAAiB,IAAA,CAAK,SAAA,CAAUkB,CAAU,CAAC,EAAE,EACjG,CAAC,CAAA,CAGH,IAAMN,CAAAA,CAAchB,EAAAA,CAAeD,CAAK,CAAA,CAExC,GAAIiB,CAAAA,EAAa,UAAA,GAAe,GAAA,CAAK,CACnC,IAAMC,CAAAA,CAAeZ,EAAAA,CAAwCW,CAAAA,CAAY,QAAQ,CAAA,CAC7EZ,CAAAA,CAAyB,IAAA,CAE7B,GAAIa,CAAAA,EAAgB,OAAOA,CAAAA,EAAiB,QAAA,CAAU,CACpD,GAAM,CACJ,KAAA,CAAOoB,CAAAA,CACP,MAAA,CAAAC,CAAAA,CACA,OAAA,CAASC,CACX,EAAItB,CAAAA,CAMJ,GAAI,OAAOsB,CAAAA,EAAoB,SAC7BnC,CAAAA,CAAUmC,CAAAA,CAAAA,KAAAA,GACD,KAAA,CAAM,OAAA,CAAQD,CAAM,CAAA,CAAG,CAChC,GAAM,CAACE,CAAU,CAAA,CAAIF,CAAAA,CAErB,GAAIE,GAAc,OAAOA,CAAAA,CAAW,OAAA,EAAY,QAAA,CAAU,CACxD,GAAM,CAAE,OAAA,CAASC,CAAkB,CAAA,CAAID,CAAAA,CACvCpC,CAAAA,CAAUqC,EACZ,CACF,CAAA,KAAW,OAAOJ,CAAAA,EAAkB,SAClCjC,CAAAA,CAAUiC,CAAAA,CAEVjC,CAAAA,CAAU,IAAA,CAAK,SAAA,CAAUa,CAAY,EAEzC,CAAA,KACEb,EAAUY,CAAAA,CAAY,QAAA,CAGxBe,CAAAA,CAAsB3B,CAAAA,EAAW,iGAAiG,EACpI,CAEA,GAAIY,EAAa,CACf,OAAA,CAAQ,IAAA,CAAK,CAAA,iBAAA,EAAoBA,CAAAA,CAAY,OAAO,CAAA,CAAE,CAAA,CAEtD,MACF,CAEIjB,CAAAA,EACF,OAAA,CAAQ,IAAA,CAAK,CAAA,iBAAA,EAAoBA,CAAAA,CAAM,OAAO,CAAA,CAAE,EAEpD,CAAC,CACH,CAEA,SAAS2C,GAAaC,CAAAA,CAA0BZ,CAAAA,CAAiE,CAC/G,OAAOa,KAAK,CACVd,EAAAA,CAAgBC,CAAqB,CAAA,CACrC,IAAIc,QAAAA,CAAS,CAAE,GAAA,CAAK,gBAAgBF,CAAgB,CAAA,QAAA,CAAW,CAAC,CAClE,CAAC,CACH,CAEA,SAASG,GACPH,CAAAA,CACAZ,CAAAA,CACc,CACd,OAAO,IAAIgB,YAAAA,CAAa,CACtB,IAAA,CAAML,GAAaC,CAAAA,EAAoB,EAAA,CAAIZ,CAAqB,CAAA,CAChE,MAAO,IAAIiB,aAAAA,CAAc,CACvB,gBAAA,CAAmBC,GACVA,CAAAA,CAAe,GAAA,CAAOA,CAAAA,CAAe,GAAA,CAAiBC,uBAAAA,CAAwBD,CAAc,CAEvG,CAAC,CACH,CAAC,CACH,CAEO,SAASE,EAAAA,CAAgB,CAAE,QAAA,CAAAC,CAAS,EAA+C,CACxF,GAAM,CAAE,gBAAA,CAAAT,CAAiB,CAAA,CAAIU,CAAAA,EAAU,CACjC,CAACC,CAAAA,CAAoBvB,CAAqB,CAAA,CAAIwB,QAAAA,CAAwB,IAAI,CAAA,CAC1E3B,CAAAA,CAAM4B,OAAAA,CAAQ,KAAO,CAAE,kBAAA,CAAAF,CAAAA,CAAoB,qBAAA,CAAAvB,CAAsB,CAAA,CAAA,CAAI,CAACuB,CAAkB,CAAC,EACzFG,CAAAA,CAAeD,OAAAA,CACnB,IAAMV,EAAAA,CAAOH,CAAAA,CAAkBZ,CAAqB,CAAA,CACpD,CAACY,CAAgB,CACnB,CAAA,CAEA,OACEe,GAAAA,CAACjC,EAAAA,CAAoB,QAAA,CAApB,CAA6B,KAAA,CAAOG,EACnC,QAAA,CAAA8B,GAAAA,CAACnC,EAAAA,CAAA,CAAqB,MAAA,CAAQkC,CAAAA,CAAe,QAAA,CAAAL,CAAAA,CAAS,EACxD,CAEJ,CC7HA,IAAIO,GAAqD,IAAA,CACnDC,EAAAA,CAAoB,IAAI,GAAA,CACxBC,GAAqF,EAAC,CACtFC,EAAAA,CAAY,IAAI,GAAA,CAChBC,EAAAA,CAAmB,IAAI,GAAA,CACvBC,GAAiB,IAAI,GAAA,CAEpB,SAASC,EAAAA,CAAuBC,CAAAA,CAA4BxP,CAAAA,CAAwB,CACzF,GAAIwP,IAAuB,QAAA,EAAYA,CAAAA,GAAuB,SAAA,CAC5D,OAAO,CAAA,GAAA,EAAMpN,CAAAA,CAAuByI,CAAAA,CAAY,MAAM,CAAC,CAAA,CAAA,CAGzD,IAAM4E,CAAAA,CAAWzP,CAAAA,CAAO,IAAA,CAAM1C,CAAAA,EAAWA,CAAAA,CAAO,MAAA,GAAWkS,CAAkB,CAAA,CACvEE,CAAAA,CAAS1P,CAAAA,CAAO,IAAA,CAAM1C,CAAAA,EAAWA,CAAAA,CAAO,IAAA,GAASkS,CAAkB,EACnEG,CAAAA,CAASF,CAAAA,EAAU,MAAA,EAAUC,CAAAA,EAAQ,MAAA,EAAUF,CAAAA,CAErD,OAAO,CAAA,GAAA,EAAMpN,EAAuBuN,CAAM,CAAC,CAAA,CAC7C,CAMO,SAASC,EAAAA,CAA2BC,CAAAA,CAAiD,CAC1F,OAAAT,EAAAA,CAAU,GAAA,CAAIS,CAAQ,CAAA,CAEf,IAAM,CACXT,EAAAA,CAAU,MAAA,CAAOS,CAAQ,EAC3B,CACF,CAKO,SAASC,EAAAA,CAA2BD,CAAAA,CAAiD,CAC1F,OAAAR,EAAAA,CAAiB,IAAIQ,CAAQ,CAAA,CAEtB,IAAM,CACXR,EAAAA,CAAiB,MAAA,CAAOQ,CAAQ,EAClC,CACF,CAKO,SAASE,EAAAA,CAAyBF,CAAAA,CAA+C,CACtF,OAAAP,EAAAA,CAAe,GAAA,CAAIO,CAAQ,CAAA,CAEpB,IAAM,CACXP,EAAAA,CAAe,MAAA,CAAOO,CAAQ,EAChC,CACF,CAKO,SAASG,EAAAA,CACdjB,CAAAA,CACAkB,CAAAA,CACAC,CAAAA,CACe,CACf,IAAMzH,CAAAA,CAAM,IAAI,GAAA,CAAIyH,CAAAA,CAAU,MAAA,CAAO,OAAO,CAAC,CAAA,CAE7C,GAAIzH,CAAAA,CAAI,KAAO,CAAA,CACb,IAAA,IAAWoH,CAAAA,IAAYR,EAAAA,CACrBQ,CAAAA,CAASI,CAAAA,CAAWxH,CAAG,CAAA,CAI3B,OAAO0H,EAAAA,CAA0BpB,CAAAA,CAAckB,CAAS,CAC1D,CAMO,SAASG,EAAAA,CAAwBH,CAAAA,CAAmBI,CAAAA,CAAqC,CAC9F,IAAMC,CAAAA,CAAcD,CAAAA,CAAQ,MAAA,CAAQE,CAAAA,EAAU,CAAA,CAAQA,CAAAA,CAAM,GAAI,EAEhE,GAAID,CAAAA,CAAY,MAAA,GAAW,CAAA,CAI3B,IAAA,IAAWT,CAAAA,IAAYP,EAAAA,CACrBO,CAAAA,CAASI,EAAWK,CAAW,EAEnC,CAKO,SAASH,EAAAA,CAA0BK,CAAAA,CAA6BP,CAAAA,CAAkC,CACvG,OAAAf,EAAAA,CAAkB,GAAA,CAAIe,CAAS,CAAA,CAExB,IAAI,OAAA,CAAc,CAACQ,CAAAA,CAASC,CAAAA,GAAW,CAC5CvB,EAAAA,CAAiB,IAAA,CAAK,CAAE,OAAA,CAAAsB,CAAAA,CAAS,MAAA,CAAAC,CAAO,CAAC,EAErCzB,EAAAA,EACF,YAAA,CAAaA,EAAY,CAAA,CAG3BA,EAAAA,CAAe,UAAA,CAAW,IAAM,CAC9B,IAAM0B,CAAAA,CAAQ,IAAI,GAAA,CAAIzB,EAAiB,CAAA,CACjC0B,CAAAA,CAAYzB,EAAAA,CAAiB,MAAA,CAAO,CAAC,CAAA,CAC3CD,EAAAA,CAAkB,KAAA,EAAM,CACxBD,GAAe,IAAA,CAEV,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAGG,EAAS,CAAA,CAAE,GAAA,CAAKS,CAAAA,EAAa,OAAA,CAAQ,OAAA,CAAQA,CAAAA,CAASc,CAAK,CAAC,CAAC,CAAC,CAAA,CAChF,IAAA,CAAK,IAAM,CACV,IAAA,GAAW,CAAE,QAASE,CAAO,CAAA,GAAKD,CAAAA,CAChCC,CAAAA,GAEJ,CAAC,CAAA,CACA,KAAA,CAAOxF,GAAmB,CACzB,OAAA,CAAQ,KAAA,CAAM,gCAAA,CAAkCA,CAAK,CAAA,CAErD,IAAA,GAAW,CAAE,OAAQyF,CAAK,CAAA,GAAKF,CAAAA,CAC7BE,CAAAA,CAAKzF,CAAK,EAEd,CAAC,EACL,EAAG,EAAE,EACP,CAAC,CACH,CC7FO,SAAS0F,EAAAA,CAAe,CAC7B,iBAAA1R,CAAAA,CACA,MAAA,CAAAW,CAAAA,CACA,KAAA,CAAAD,CAAAA,CACA,SAAA,CAAAiR,CAAAA,CACA,MAAA,CAAAC,EACA,SAAA,CAAAtP,CAAAA,CAAY,MAAA,CACZ,YAAA,CAAAhC,EAAe,IACjB,CAAA,CAUE,CACA,GAAM,CAAC7B,CAAAA,CAAQoT,CAAS,CAAA,CAAIrC,QAAAA,CAAkB,CAC5C,KAAA,CAAO,CAAA,CACP,OAAA,CAAS,EACX,CAAC,CAAA,CACK,CAACsC,CAAAA,CAAeC,CAAgB,CAAA,CAAIvC,QAAAA,CAAS,KAAK,CAAA,CAClD,CAACwC,CAAAA,CAAaC,CAAc,CAAA,CAAIzC,QAAAA,CAAS,KAAK,CAAA,CAC9C,CAAC0C,CAAAA,CAAuBC,CAAwB,CAAA,CAAI3C,QAAAA,CAGhD,IAAI,CAAA,CACR4C,CAAAA,CAAmBC,MAAAA,CAAO,KAAK,CAAA,CAC/BC,CAAAA,CAAiBD,MAAAA,CAAO,KAAK,CAAA,CAI7BE,CAAAA,CAAgBF,MAAAA,CAAO,CAAC,EAKxBG,CAAAA,CAAoBH,MAAAA,CAAsB,IAAI,CAAA,CAC9CI,CAAAA,CAAqBJ,MAAAA,CAAsB,IAAI,CAAA,CAC/CK,EAAkB,CAAA,EAAG1S,CAAgB,CAAA,KAAA,CAAA,CACrCwC,CAAAA,CAAeC,EAAAA,CAAgB9B,CAAAA,CAAQX,CAAgB,CAAA,CAKvDO,EAHJoR,CAAAA,EAAW,KAAA,GAAU,MAAA,EAAA,CACpBnP,CAAAA,EAAc,QAAQ,MAAA,EAAU,CAAA,IAAO,CAAA,GACvC0P,CAAAA,EAAuB,QAAUQ,CAAAA,EAAmBR,CAAAA,CAAsB,MAAA,GAAWvR,CAAAA,CAAAA,CACnD,OAAA,CAAU,WAAA,CACzCgS,EAAAA,CAAgBlD,OAAAA,CACpB,IAAMmD,GAAAA,CAAIzQ,EAAAA,CAAenC,CAAAA,CAAkBU,CAAAA,CAAOC,CAAAA,CAAQ,CAAE,SAAA,CAAA2B,CAAAA,CAAW,UAAA/B,CAAAA,CAAW,YAAA,CAAAD,CAAa,CAAC,CAAA,CAAE,KAAK,CAAA,CACvG,CAACN,EAAkBU,CAAAA,CAAOC,CAAAA,CAAQ2B,CAAAA,CAAW/B,CAAAA,CAAWD,CAAY,CACtE,CAAA,CAGMuS,CAAAA,CAAoBpD,QACxB,IAAMmD,GAAAA,CAAIzQ,EAAAA,CAAenC,CAAAA,CAAkBU,CAAAA,CAAOC,CAAAA,CAAQ,CAAE,SAAA,CAAA2B,EAAW,YAAA,CAAc,KAAM,CAAC,CAAA,CAAE,KAAK,CAAA,CACnG,CAACtC,CAAAA,CAAkBU,EAAOC,CAAAA,CAAQ2B,CAAS,CAC7C,CAAA,CACM,CAAE,kBAAA,CAAAiN,CAAAA,CAAoB,qBAAA,CAAAvB,CAAsB,CAAA,CAAIJ,EAAAA,EAAgB,CAChE,CACJ,QAASkF,CAAAA,CACT,IAAA,CAAA9M,CAAAA,CACA,SAAA,CAAW+M,EACX,OAAA,CAAAC,CAAAA,CACA,KAAA,CAAAhH,EAAAA,CACA,aAAA,CAAAiH,EACF,CAAA,CAAIC,QAAAA,CAAoDP,GAAe,CACrE,SAAA,CAAAhB,CAAAA,CACA,2BAAA,CAA6B,IAC/B,CAAC,CAAA,CACKwB,EAAAA,CAAmBd,OAAOU,CAAa,CAAA,CACvCK,CAAAA,CAAaf,MAAAA,CAAOW,CAAO,CAAA,CAC3BK,EAAAA,CAAuBhB,MAAAA,CAAOQ,CAAiB,CAAA,CAC/CS,EAAAA,CAA2BjB,MAAAA,CAAOY,EAAa,EAC/CM,EAAAA,CAAelB,MAAAA,CAAOV,CAAS,CAAA,CACrCwB,GAAiB,OAAA,CAAUJ,CAAAA,CAC3BK,CAAAA,CAAW,OAAA,CAAUJ,CAAAA,CACrBK,EAAAA,CAAqB,OAAA,CAAUR,CAAAA,CAC/BU,GAAa,OAAA,CAAU5B,CAAAA,CAGvB,IAAM6B,EAAAA,CAA2BlT,CAAAA,EAAgBsM,EAAAA,CAA2BZ,EAAAA,CAAO0G,CAAe,EAC5Fe,EAAAA,CAA4BlT,CAAAA,GAAc,OAAA,EAAWiT,EAAAA,CACrDE,CAAAA,CAAiBF,EAAAA,CAA2B,MAAA,CAAYxH,EAAAA,CACxD2H,GAA8BH,EAAAA,EAA4B,CAACxN,CAAAA,GAAOhG,CAAgB,EAClFiN,EAAAA,CAAchB,EAAAA,CAAeyH,CAAc,CAAA,CAC3CxF,EAAwB1B,EAAAA,CAAgCkH,CAAc,CAAA,CAEtE,CAAE,iBAAA,CAAAE,EAAAA,CAAmB,iBAAA,CAAAC,EAAkB,GAAK,IAAM,CACtD,GAAI5G,EAAAA,EAAa,UAAA,GAAe,GAAA,CAAK,CACnC,IAAMC,EAAeZ,EAAAA,CAAkCW,EAAAA,CAAY,QAAQ,CAAA,CAE3E,GAAIC,CAAAA,EAAgB,OAAOA,CAAAA,CAAa,MAAS,QAAA,CAAU,CACzD,GAAIA,CAAAA,CAAa,IAAA,GAAS,gBAAA,CACxB,OAAO,CACL,kBAAmB,IAAA,CACnB,iBAAA,CAAmB,KACrB,CAAA,CAGF,GAAIA,CAAAA,CAAa,IAAA,GAAS,gBAAA,CACxB,OAAO,CACL,iBAAA,CAAmB,KAAA,CACnB,iBAAA,CAAmB,IACrB,CAEJ,CAEA,OAAO,CACL,iBAAA,CAAmB,IAAA,CACnB,iBAAA,CAAmB,KACrB,CACF,CAEA,OAAO,CACL,kBAAmB,KAAA,CACnB,iBAAA,CAAmB,KACrB,CACF,IAAG,CAEH4G,SAAAA,CAAU,IAAM,CACTL,IAILtB,CAAAA,CAAyB,CAAE,KAAA,CAAOO,CAAAA,CAAiB,MAAA,CAAA/R,CAAO,CAAC,EAC7D,EAAG,CAACA,CAAAA,CAAQ8S,EAAAA,CAA2Bf,CAAe,CAAC,CAAA,CAEvD,IAAMqB,EAAAA,CAAYC,YACfC,CAAAA,EAAiC,CAChC,GAAI7B,CAAAA,CAAiB,OAAA,EAAWE,CAAAA,CAAe,OAAA,CAC7C,OAGFF,EAAiB,OAAA,CAAU,IAAA,CAC3BL,CAAAA,CAAiB,IAAI,CAAA,CAErB,GAAM,CAAE,KAAA,CAAAmC,CAAM,CAAA,CAAID,CAAAA,CAAK,SAAA,CACjBE,CAAAA,CAAS5B,CAAAA,CAAc,OAAA,CAE7BY,EAAAA,CACG,OAAA,CAAQ,CACP,GAAGc,CAAAA,CACH,KAAA,CAAOZ,EAAAA,CAAqB,OAAA,CAC5B,SAAA,CAAW,CAGT,GAAGE,GAAa,OAAA,CAChB,GAAGU,CAAAA,CAAK,SAAA,CACR,MAAA,CAAAE,CAAAA,CACA,KAAA,CAAAD,CACF,CACF,CAAC,CAAA,CACA,IAAA,CAAK,CAAC,CAAE,IAAA,CAAME,EAAI,CAAA,GAAM,CACvB,IAAMC,CAAAA,CAAyBC,EAAAA,CAAW,CAAE,IAAA,CAAMF,EAAAA,CAAK,gBAAA,CAAApU,CAAAA,CAAkB,MAAA,CAAA4R,EAAQ,MAAA,CAAAjR,CAAAA,CAAQ,KAAA,CAAAD,CAAM,CAAC,CAAA,CAI1F6T,CAAAA,CAAaF,CAAAA,CAAuB,QAAQ,MAAA,CAClD9B,CAAAA,CAAc,OAAA,CAAU4B,CAAAA,EAAUI,CAAAA,GAAe,CAAA,CAAI,CAAA,CAAI,IAAA,CAAK,IAAIA,CAAAA,CAAYL,CAAK,CAAA,CAAA,CAEnFrC,CAAAA,CAAW2C,CAAAA,EAAa,CACtB,IAAMC,CAAAA,CAASC,OAAOC,IAAAA,CAAK,KAAK,CAAA,CAAG,CACjC,GAAGH,CAAAA,CAAS,OAAA,CACZ,GAAGH,EAAuB,OAC5B,CAAC,CAAA,CAID,OAAII,CAAAA,CAAO,MAAA,GAAWD,CAAAA,CAAS,OAAA,CAAQ,OAC9B,CACL,KAAA,CAAOA,CAAAA,CAAS,OAAA,CAAQ,MAAA,CACxB,OAAA,CAASA,CAAAA,CAAS,OACpB,EAIK,CACL,KAAA,CAAOH,CAAAA,CAAuB,KAAA,EAASG,EAAS,KAAA,CAChD,OAAA,CAASC,CACX,CACF,CAAC,EACH,CAAC,CAAA,CACA,KAAA,CAAOG,EAAAA,EAAwB,CAC9B,OAAA,CAAQ,KAAA,CAAM,4BAA6BA,EAAU,EACvD,CAAC,CAAA,CACA,OAAA,CAAQ,IAAM,CACbxC,CAAAA,CAAiB,QAAU,KAAA,CAC3BL,CAAAA,CAAiB,KAAK,EACxB,CAAC,EACL,CAAA,CACA,CAAC/R,EAAkB4R,CAAAA,CAAQjR,CAAAA,CAAQD,CAAK,CAC1C,EAEMmU,EAAAA,CAASb,WAAAA,CACZ5R,CAAAA,EAAoD,CACnD,GAAIkQ,CAAAA,CAAe,OAAA,CACjB,OAAO,OAAA,CAAQ,OAAA,EAAQ,CAGzB,IAAMwC,CAAAA,CAAW1S,GAAS,QAAA,GAAa,IAAA,CAEvC,OAAAkQ,CAAAA,CAAe,OAAA,CAAU,IAAA,CACzBF,CAAAA,CAAiB,OAAA,CAAU,MAC3BL,CAAAA,CAAiB,KAAK,CAAA,CAEjB+C,CAAAA,GACHtC,CAAAA,CAAkB,OAAA,CAAU,IAAA,CAC5BC,CAAAA,CAAmB,QAAU,IAAA,CAC7BF,CAAAA,CAAc,OAAA,CAAU,CAAA,CACxBN,EAAe,IAAI,CAAA,CACnBJ,CAAAA,CAAU,CAAE,MAAO,CAAA,CAAG,OAAA,CAAS,EAAG,CAAC,CAAA,CAAA,CAG9BuB,CAAAA,CACJ,OAAA,GACA,IAAA,CAAK,CAAC,CAAE,IAAA,CAAMgB,CAAI,CAAA,GAAM,CACvB,IAAMW,GAAW,IAAA,CAAK,SAAA,CAAU,CAAE,gBAAA,CAAA/U,CAAAA,CAAkB,KAAA,CAAAU,CAAAA,CAAO,SAAA,CAAA4B,EAAW,YAAA,CAAAhC,CAAAA,CAAc,SAAA,CAAAqR,CAAU,CAAC,CAAA,CACzFqD,CAAAA,CAASV,EAAAA,CAAW,CAAE,IAAA,CAAMF,CAAAA,CAAK,gBAAA,CAAApU,CAAAA,CAAkB,MAAA,CAAA4R,CAAAA,CAAQ,MAAA,CAAAjR,CAAAA,CAAQ,MAAAD,CAAM,CAAC,CAAA,CAEhF8R,CAAAA,CAAkB,OAAA,CAAUuC,EAAAA,CAC5BtC,CAAAA,CAAmB,OAAA,CAAU,KAC7BF,CAAAA,CAAc,OAAA,CAAU0C,EAAAA,CAAmBtD,CAAS,CAAA,CAAIqD,CAAAA,CAAO,OAAA,CAAQ,MAAA,CACvEnD,EAAUmD,CAAM,EAClB,CAAC,CAAA,CACA,MAAOJ,CAAAA,EAAwB,CAC9B,OAAA,CAAQ,KAAA,CAAM,wBAAyBA,CAAU,EACnD,CAAC,CAAA,CACA,OAAA,CAAQ,IAAM,CACbtC,CAAAA,CAAe,QAAU,KAAA,CACzBL,CAAAA,CAAe,KAAK,EACtB,CAAC,CACL,CAAA,CACA,CAACjS,EAAkB4R,CAAAA,CAAQjR,CAAAA,CAAQD,CAAAA,CAAO4B,CAAAA,CAAWhC,CAAAA,CAAcqR,CAAS,CAC9E,CAAA,CAEA,OAAAmC,SAAAA,CAAU,IAAM,CACd,GAAI5F,CAAAA,CAAuB,CACzBF,CAAAA,CAAsBE,CAAqB,EAE3C,MACF,CAEIlI,CAAAA,EAAQuJ,CAAAA,EAAsB,CAACmE,CAAAA,EACjC1F,CAAAA,CAAsB,IAAI,EAE9B,CAAA,CAAG,CAAChI,CAAAA,CAAM0N,CAAAA,CAAgBnE,CAAAA,CAAoBrB,CAAAA,CAAuBF,CAAqB,CAAC,EAE3F8F,SAAAA,CAAU,IAAM,CACd,GAAIJ,CAAAA,EAAkBxF,CAAAA,EAAyByF,EAAAA,CAC7C,OAGF,IAAMoB,CAAAA,CAAW,IAAA,CAAK,SAAA,CAAU,CAAE,iBAAA/U,CAAAA,CAAkB,KAAA,CAAAU,CAAAA,CAAO,SAAA,CAAA4B,EAAW,YAAA,CAAAhC,CAAAA,CAAc,SAAA,CAAAqR,CAAU,CAAC,CAAA,CAG/F,GAAIa,CAAAA,CAAkB,UAAYuC,CAAAA,CAChC,OAGF,GAAIjC,CAAAA,EAAaL,CAAAA,CAAmB,OAAA,GAAYsC,CAAAA,CAAU,CACxDtC,EAAmB,OAAA,CAAUsC,CAAAA,CAC7BxC,CAAAA,CAAc,OAAA,CAAU,CAAA,CACxBV,CAAAA,CAAU,CAAE,KAAA,CAAO,EAAG,OAAA,CAAS,EAAG,CAAC,CAAA,CAEnC,MACF,CAEA,GAAIiB,EACF,OAGF,IAAMkC,CAAAA,CAASV,EAAAA,CAAW,CAAE,IAAA,CAAAtO,CAAAA,CAAM,gBAAA,CAAAhG,EAAkB,MAAA,CAAA4R,CAAAA,CAAQ,MAAA,CAAAjR,CAAAA,CAAQ,KAAA,CAAAD,CAAM,CAAC,CAAA,CAC3E8R,EAAkB,OAAA,CAAUuC,CAAAA,CAC5BtC,CAAAA,CAAmB,OAAA,CAAU,IAAA,CAC7BF,CAAAA,CAAc,OAAA,CAAU0C,EAAAA,CAAmBtD,CAAS,CAAA,CAAIqD,CAAAA,CAAO,OAAA,CAAQ,MAAA,CACvEnD,EAAUmD,CAAM,EAClB,CAAA,CAAG,CACDhP,EACA0N,CAAAA,CACA1T,CAAAA,CACA4R,CAAAA,CACAkB,CAAAA,CACAa,EAAAA,CACAhT,CAAAA,CACAuN,CAAAA,CACAxN,CAAAA,CACA4B,EACAhC,CAAAA,CACAqR,CACF,CAAC,CAAA,CAIDmC,SAAAA,CAAU,IAAM,CACd,IAAMoB,EAAiB5B,EAAAA,CAAyB,OAAA,CAOhD,GANAA,EAAAA,CAAyB,OAAA,CAAUL,EAAAA,CAE/BS,CAAAA,EAAkBxF,CAAAA,EAAyBoE,EAAe,OAAA,EAAWqB,EAAAA,EAIrEuB,CAAAA,GAAmBC,aAAAA,CAAc,SAAWlC,EAAAA,GAAkBkC,aAAAA,CAAc,KAAA,EAAS,CAACnP,EACxF,OAGF,IAAM+O,CAAAA,CAAW,IAAA,CAAK,SAAA,CAAU,CAAE,gBAAA,CAAA/U,CAAAA,CAAkB,MAAAU,CAAAA,CAAO,SAAA,CAAA4B,CAAAA,CAAW,YAAA,CAAAhC,CAAAA,CAAc,SAAA,CAAAqR,CAAU,CAAC,EACzFqD,CAAAA,CAASV,EAAAA,CAAW,CAAE,IAAA,CAAAtO,CAAAA,CAAM,gBAAA,CAAAhG,CAAAA,CAAkB,MAAA,CAAA4R,EAAQ,MAAA,CAAAjR,CAAAA,CAAQ,KAAA,CAAAD,CAAM,CAAC,CAAA,CAC3E8R,CAAAA,CAAkB,OAAA,CAAUuC,CAAAA,CAC5BtC,EAAmB,OAAA,CAAU,IAAA,CAC7BF,CAAAA,CAAc,OAAA,CAAU0C,EAAAA,CAAmBtD,CAAS,CAAA,CAAIqD,CAAAA,CAAO,QAAQ,MAAA,CACvEnD,CAAAA,CAAUmD,CAAM,EAClB,CAAA,CAAG,CACDhP,CAAAA,CACA0N,CAAAA,CACA1T,EACA4R,CAAAA,CACA+B,EAAAA,CACAV,EAAAA,CACAtS,CAAAA,CACAuN,CAAAA,CACAxN,CAAAA,CACA4B,CAAAA,CACAhC,CAAAA,CACAqR,CACF,CAAC,CAAA,CAIDmC,SAAAA,CAAU,IAAM,CACd,GAAIlC,CAAAA,CACF,OAGF,IAAMwD,CAAAA,CAAgB,CAAA,GAAA,EAAMrS,CAAAA,CAAuB/C,CAAgB,CAAC,CAAA,CAAA,CAE9DqV,CAAAA,CAAqB9E,EAAAA,CAA4B+E,GAAe,CACpE,GAAI,EAAA,CAACA,CAAAA,CAAW,GAAA,CAAIF,CAAa,CAAA,EAAKhD,CAAAA,CAAiB,SAAWE,CAAAA,CAAe,OAAA,CAAA,CAIjF,OAAOc,CAAAA,CACJ,OAAA,EAAQ,CACR,IAAA,CAAK,CAAC,CAAE,IAAA,CAAMgB,CAAI,CAAA,GAAM,CACvB,IAAMW,CAAAA,CAAW,IAAA,CAAK,SAAA,CAAU,CAAE,iBAAA/U,CAAAA,CAAkB,KAAA,CAAAU,CAAAA,CAAO,SAAA,CAAA4B,CAAAA,CAAW,YAAA,CAAAhC,CAAAA,CAAc,SAAA,CAAAqR,CAAU,CAAC,CAAA,CACzFqD,CAAAA,CAASV,EAAAA,CAAW,CAAE,IAAA,CAAMF,CAAAA,CAAK,gBAAA,CAAApU,EAAkB,MAAA,CAAA4R,CAAAA,CAAQ,MAAA,CAAAjR,CAAAA,CAAQ,KAAA,CAAAD,CAAM,CAAC,CAAA,CAChF8R,EAAkB,OAAA,CAAUuC,CAAAA,CAC5BtC,CAAAA,CAAmB,OAAA,CAAU,IAAA,CAC7BF,CAAAA,CAAc,OAAA,CAAU0C,EAAAA,CAAmBtD,CAAS,CAAA,CAAIqD,CAAAA,CAAO,OAAA,CAAQ,MAAA,CACvEnD,CAAAA,CAAUmD,CAAM,EAClB,CAAC,EACA,KAAA,CAAOJ,CAAAA,EAAwB,CAC9B,OAAA,CAAQ,KAAA,CAAM,oCAAA,CAAsCA,CAAU,EAChE,CAAC,CACL,CAAC,CAAA,CAEKW,CAAAA,CAAqB9E,EAAAA,CAA2B,CAACG,CAAAA,CAAWC,CAAAA,GAAc,CAC1ED,CAAAA,GAAcwE,CAAAA,EAIlBvD,CAAAA,CAAW2D,CAAAA,EAAS,CAClB,IAAMC,CAAAA,CAAcD,CAAAA,CAAK,OAAA,CAAQ,OAAQE,EAAAA,EAAQ,CAC/C,IAAMC,EAAAA,CAAQ,OAAOD,EAAAA,CAAI,GAAA,EAAQ,QAAA,CAAWA,GAAI,GAAA,CAAM,MAAA,CAEtD,OAAO,CAACC,EAAAA,EAAS,CAAC9E,CAAAA,CAAU,GAAA,CAAI8E,EAAK,CACvC,CAAC,CAAA,CACKC,EAAAA,CAAeJ,CAAAA,CAAK,OAAA,CAAQ,MAAA,CAASC,CAAAA,CAAY,OAEvD,OAAIG,EAAAA,GAAiB,CAAA,CACZJ,CAAAA,CAGF,CACL,KAAA,CAAO,IAAA,CAAK,GAAA,CAAI,EAAGA,CAAAA,CAAK,KAAA,CAAQI,EAAY,CAAA,CAC5C,OAAA,CAASH,CACX,CACF,CAAC,EACH,CAAC,CAAA,CAEKI,EAAAA,CAAmBnF,EAAAA,CAAyB,CAACE,CAAAA,CAAWI,CAAAA,GAAY,CACpEJ,IAAcwE,CAAAA,EAIlBvD,CAAAA,CAAW2D,CAAAA,EAASM,EAAAA,CAAuBN,CAAAA,CAAMxE,CAAAA,CAASW,CAAAA,EAAW,IAAI,CAAC,EAC5E,CAAC,CAAA,CAED,OAAO,IAAM,CACX0D,CAAAA,EAAmB,CACnBE,CAAAA,GACAM,EAAAA,GACF,CACF,CAAA,CAAG,CAAC7V,CAAAA,CAAkB4R,CAAAA,CAAQjR,CAAAA,CAAQD,EAAO4B,CAAAA,CAAWhC,CAAAA,CAAcqR,CAAS,CAAC,CAAA,CAEzE,CAEL,SAAA,CACGmB,CAAAA,EAAaG,KAAkBkC,aAAAA,CAAc,OAAA,EAAYnD,CAAAA,EAAe2B,EAAAA,CAC3E,aAAA,CAAA7B,CAAAA,CACA,SAAA,CAAAiC,EAAAA,CACA,OAAAc,EAAAA,CACA,KAAA,CAAOpW,CAAAA,CAAO,KAAA,CACd,KAAMA,CAAAA,CAAO,OAAA,CACb,iBAAA,CAAAmV,EAAAA,CACA,kBAAAC,EAAAA,CACA,kBAAA,CAAAtE,CACF,CACF,CAEA,SAAS0F,EAAAA,CAAmBtD,CAAAA,CAAmD,CAC7E,IAAMwC,CAAAA,CAASxC,CAAAA,EAAW,MAAA,CAE1B,OAAO,OAAOwC,CAAAA,EAAW,QAAA,EAAY,OAAO,QAAA,CAASA,CAAM,CAAA,CAAIA,CAAAA,CAAS,CAC1E,CAEA,SAASG,EAAAA,CACPL,EAGyD,CACzD,IAAMjU,CAAAA,CAAmBiU,CAAAA,CAAK,iBAE9B,OAAKA,CAAAA,CAAK,IAAA,GAAOjU,CAAgB,EAI1BiU,CAAAA,CAAK,MAAA,CACR/O,EAAAA,CAA4B+O,CAAAA,CAAK,gBAAA,CAAkBA,CAAAA,CAAK,KAAA,CAAOA,CAAAA,CAAK,KAAMA,CAAAA,CAAK,MAAM,CAAA,CACrFlQ,EAAAA,CAAekQ,CAAAA,CAAK,gBAAA,CAAkBA,CAAAA,CAAK,KAAA,CAAOA,EAAK,IAAA,CAAMA,CAAAA,CAAK,MAAM,CAAA,CALnE,CAAE,KAAA,CAAO,CAAA,CAAG,OAAA,CAAS,EAAG,CAMnC,CAEA,SAAS6B,EAAAA,CACPN,CAAAA,CACAxE,CAAAA,CACAjP,CAAAA,CACS,CACT,IAAMgU,CAAAA,CAAY,IAAI,GAAA,CAAI/E,CAAAA,CAAQ,GAAA,CAAKE,CAAAA,EAAU,CAACA,EAAM,GAAA,CAAKA,CAAK,CAAC,CAAC,CAAA,CAChE8E,CAAAA,CAAW,KAAA,CACTP,CAAAA,CAAcD,EAAK,OAAA,CAAQ,GAAA,CAAKE,CAAAA,EAAQ,CAC5C,IAAMC,CAAAA,CAAQ,OAAOD,CAAAA,CAAI,KAAQ,QAAA,CAAWA,CAAAA,CAAI,GAAA,CAAM,MAAA,CAEtD,GAAI,CAACC,CAAAA,CACH,OAAOD,CAAAA,CAGT,IAAMxE,CAAAA,CAAQ6E,CAAAA,CAAU,GAAA,CAAIJ,CAAK,CAAA,CAEjC,OAAKzE,CAAAA,EAIL8E,CAAAA,CAAW,KAEJ,CACL,GAAGN,CAAAA,CACH,GAAGxE,CAAAA,CAAM,UACX,CAAA,EARSwE,CASX,CAAC,CAAA,CAED,OAAKM,CAAAA,CAIE,CACL,KAAA,CAAOR,CAAAA,CAAK,KAAA,CACZ,OAAA,CAASS,GAAsBR,CAAAA,CAAa1T,CAAI,CAClD,CAAA,CANSyT,CAOX,CAEA,SAASS,EAAAA,CAA4DlW,EAAcgC,CAAAA,CAAoB,CACrG,GAAI,CAAC,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,EAAKA,EAAK,MAAA,GAAW,CAAA,CAC1C,OAAOhC,CAAAA,CAGT,GAAM,CAACiC,CAAW,CAAA,CAAID,EAEtB,GAAI,CAACC,CAAAA,EAAe,OAAOA,CAAAA,EAAgB,QAAA,CACzC,OAAOjC,CAAAA,CAGT,GAAM,CAACmW,CAAgB,CAAA,CAAI,MAAA,CAAO,QAAQlU,CAAyC,CAAA,CAC7E,CAACmU,CAAAA,CAAWC,CAAa,CAAA,CAAIF,CAAAA,EAAoB,EAAC,CAExD,GAAI,CAACC,CAAAA,EAAcC,CAAAA,GAAkB,OAASA,CAAAA,GAAkB,MAAA,CAC9D,OAAOrW,CAAAA,CAGT,IAAMsW,CAAAA,CAAYD,CAAAA,GAAkB,MAAA,CAAS,GAAK,CAAA,CAElD,OAAO,CAAC,GAAGrW,CAAO,CAAA,CAAE,IAAA,CAAK,CAACuW,EAAMC,CAAAA,GAAU,CACxC,IAAMC,CAAAA,CAAYF,CAAAA,CAAKH,CAAS,CAAA,CAC1BM,CAAAA,CAAaF,EAAMJ,CAAS,CAAA,CAC5BO,CAAAA,CAAW,OAAOF,CAAAA,EAAc,QAAA,CAAWA,CAAAA,CAAY,EAAA,CACvDG,EAAY,OAAOF,CAAAA,EAAe,QAAA,CAAWA,CAAAA,CAAa,EAAA,CAEhE,OAAOC,CAAAA,CAAS,aAAA,CAAcC,CAAS,CAAA,CAAIN,CAC7C,CAAC,CACH,CCzhBO,SAASO,EAAAA,EAA+B,CAC7C,OACEC,KAACC,EAAAA,CAAA,CAAM,OAAA,CAAQ,aAAA,CACb,QAAA,CAAA,CAAAnH,GAAAA,CAACoH,WAAAA,CAAA,CAAY,UAAU,eAAA,CAAgB,CAAA,CACvCpH,GAAAA,CAACqH,EAAAA,CAAA,CAAW,QAAA,CAAA,gBAAA,CAAc,CAAA,CAC1BH,IAAAA,CAACI,GAAA,CAAiB,QAAA,CAAA,CAAA,kEAAA,CACiD,GAAA,CACjEtH,GAAAA,CAAC,GAAA,CAAA,CACC,SAAA,CAAU,+BAAA,CACV,IAAA,CAAK,gDACL,MAAA,CAAO,QAAA,CACP,GAAA,CAAI,qBAAA,CACL,8BAED,CAAA,CAAI,GAAA,CAAA,CAEN,CAAA,CAAA,CACF,CAEJ,CClBO,SAASuH,EAAAA,EAA2B,CACzC,GAAM,CAAE,kBAAA,CAAA3H,CAAmB,CAAA,CAAI3B,EAAAA,EAAgB,CAE/C,GAAI,CAAC2B,CAAAA,CACH,OAAOI,GAAAA,CAAAwH,SAAA,EAAE,CAAA,CAGX,GAAM,CAACC,EAASC,CAAAA,CAAY,GAAGC,CAAO,CAAA,CAAI/H,EAAmB,KAAA,CAAM;AAAA,CAAI,EAEvE,OACEsH,IAAAA,CAACC,GAAA,CAAM,SAAA,CAAU,UAAU,OAAA,CAAQ,aAAA,CACjC,UAAAnH,GAAAA,CAACoH,WAAAA,CAAA,CAAY,SAAA,CAAU,eAAA,CAAgB,EACvCpH,GAAAA,CAACqH,EAAAA,CAAA,CAAW,QAAA,CAAA,iBAAA,CAAe,CAAA,CAC3BH,KAACI,EAAAA,CAAA,CACC,UAAAtH,GAAAA,CAAC,GAAA,CAAA,CAAG,SAAAyH,CAAAA,CAAQ,CAAA,CACXC,EAAa1H,GAAAA,CAAC,GAAA,CAAA,CAAE,UAAU,SAAA,CAAW,QAAA,CAAA0H,EAAW,CAAA,CAAO,IAAA,CACvDC,EAAQ,MAAA,CAAS,CAAA,CAChB3H,IAAC,IAAA,CAAA,CAAG,SAAA,CAAU,+BACX,QAAA,CAAA2H,CAAAA,CAAQ,IAAKC,CAAAA,EACZ5H,GAAAA,CAAC,MAAiB,QAAA,CAAA4H,CAAAA,CAAO,QAAQ,KAAA,CAAO,EAAE,GAAjCA,CAAmC,CAC7C,EACH,CAAA,CACE,IAAA,CAAA,CACN,GACF,CAEJ,CC9BO,SAASC,GAAe,CAC7B,YAAA,CAAAC,EACA,SAAA,CAAAC,CAAAA,CACA,aAAAC,CACF,CAAA,CAIY,CACV,GAAIA,CAAAA,EAAgB,EAClB,OAAO,MAAA,CAKT,IAAMC,CAAAA,CAAYF,CAAAA,CAAY,EAAI,IAAA,CAAK,GAAA,CAAI,IAAKC,CAAY,CAAA,CAAI,EAEhE,OAAOF,CAAAA,CAAeC,EAAYC,CAAAA,CAAeC,CACnD,CCoDA,IAAMC,GAAwB,EAAA,CACxBC,EAAAA,CAAe,GACfC,EAAAA,CAAkB,CAAA,CAGlBC,GAA0B,EAAA,CAEhC,SAASC,GAAuBC,CAAAA,CAA2C,CACzE,GAAI,CAACA,CAAAA,CACH,OAGF,IAAMC,CAAAA,CAASD,EAAa,KAAA,CAAM,KAAK,EAEvC,GAAIC,CAAAA,CAAO,SAAS,SAAS,CAAA,CAC3B,OAAO,EAAA,CAGT,GAAIA,EAAO,QAAA,CAAS,SAAS,EAC3B,OAAO,EAAA,CAGT,GAAIA,CAAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,CAC1B,SAIJ,CAEA,SAASC,GAAmBC,CAAAA,CAA4BH,CAAAA,CAA+B,CACrF,OAAOG,CAAAA,EAAqBJ,GAAuBC,CAAY,CAAA,EAAKL,EACtE,CAEO,SAASS,EAAAA,CAAgD,CAC9D,WAAAC,CAAAA,CACA,OAAA,CAAAC,EACA,IAAA,CAAAxS,CAAAA,CACA,WAAAtD,CAAAA,CACA,OAAA,CAAA+V,EAAU,KAAA,CACV,qBAAA,CAAAC,EACA,aAAA,CAAA5G,CAAAA,CAAgB,MAChB,uBAAA,CAAA6G,CAAAA,CACA,WAAAC,GAAAA,CACA,QAAA,CAAAC,EACA,eAAA,CAAAC,CAAAA,CACA,SAAAC,CAAAA,CACA,iBAAA,CAAAV,EACA,gBAAA,CAAAW,CAAAA,CACA,iBAAAC,CAAAA,CACA,cAAA,CAAAC,EACA,OAAA,CAASC,CAAAA,CACT,iBAAAC,CACF,CAAA,CAA+C,CAC7C,IAAMC,CAAAA,CAAYhH,OAAuB,IAAI,CAAA,CACvC,CAAE,kBAAA,CAAA9C,CAAmB,EAAI3B,EAAAA,EAAgB,CACzC,CAAC0L,CAAAA,CAAcC,CAAe,EAAI/J,QAAAA,CAASkJ,CAAAA,EAAyB,EAAE,CAAA,CACtE,CAACc,CAAAA,CAAkBC,CAAmB,EAAIjK,QAAAA,CAA0B,EAAE,CAAA,CACtE,CAACkK,GAAeC,GAAgB,CAAA,CAAInK,SAA6B,EAAE,EACnE,CAACoK,CAAAA,CAAqBC,CAAsB,CAAA,CAAIrK,QAAAA,CAAuB,EAAE,CAAA,CACzEsK,EAAUX,CAAAA,EAAeS,CAAAA,CAE/B9F,UAAU,IAAM,CACduF,CAAAA,CAAU,OAAA,EAAS,SAAS,CAAE,GAAA,CAAK,EAAG,IAAA,CAAM,CAAE,CAAC,EACjD,CAAA,CAAG,CAAC3W,CAAAA,CAAYwW,CAAc,CAAC,CAAA,CAE/BpF,SAAAA,CAAU,IAAM,CACd,GAAI,CAAC4E,CAAAA,CACH,OAGF,IAAMqB,CAAAA,CAAmB,MAAA,CAAO,KAAKT,CAAY,CAAA,CAAE,MAAK,CAAE,IAAA,CAAK,GAAG,CAAA,CAC5DU,CAAAA,CAAgB,OAAO,IAAA,CAAKtB,CAAqB,EAAE,IAAA,EAAK,CAAE,KAAK,GAAG,CAAA,CAEpEqB,IAAqBC,CAAAA,EAIzBT,CAAAA,CAAgBb,CAAqB,EACvC,CAAA,CAAG,CAACA,CAAAA,CAAuBY,CAAY,CAAC,CAAA,CAExC,SAASW,EAAoBC,CAAAA,CAAsC,CACjE,GAAIpB,CAAAA,CAAiB,CACnBA,EAAgBoB,CAAO,CAAA,CAEvB,MACF,CAEAL,CAAAA,CAAuBK,CAAO,EAChC,CAEA,IAAMC,CAAAA,CAAQC,aAAAA,CAAc,CAC1B,IAAA,CAAApU,CAAAA,CACA,QAAAwS,CAAAA,CACA,KAAA,CAAO,CACL,OAAA,CAAAsB,CAAAA,CACA,iBAAAN,CAAAA,CACA,YAAA,CAAAF,EACA,aAAA,CAAAI,EACF,EACA,YAAA,CAAc,CACZ,WAAY,CACV,QAAA,CAAUX,CAAAA,EAAY,EACxB,CACF,CAAA,CACA,kBAAA,CAAoB,KACpB,oBAAA,CAAsBsB,EAAAA,CACtB,gBAAiBJ,CAAAA,CACjB,qBAAA,CAAuBN,IACvB,wBAAA,CAA0BF,CAAAA,CAC1B,gBAAiBa,eAAAA,EAAgB,CACjC,oBAAqBC,mBAAAA,EAAoB,CACzC,sBAAuBC,qBAAAA,EAAsB,CAC7C,kBAAmBC,iBAAAA,EAAkB,CACrC,SAAW/E,CAAAA,EAAQA,CAAAA,CAAI,IAGvB,eAAA,CAAiB,IAAA,CACjB,iBAAkB,IAAA,CAClB,aAAA,CAAe,KACf,IAAA,CAAM,CACJ,iBAAmBA,CAAAA,EAA6BgF,EAAAA,CAAiBhF,EAAKuD,CAAAA,CAAkBD,CAAgB,CAC1G,CACF,CAAC,EAEK,CAAE,IAAA,CAAA2B,CAAK,CAAA,CAAIR,CAAAA,CAAM,aAAY,CAC7BS,EAAAA,CAAcxC,GAAmBC,CAAAA,CAAmBE,CAAAA,EAAY,GAAG,CAAA,CACnEsC,EAAAA,CAA4B5C,GAAuBM,CAAAA,EAAY,GAAG,GAAK,IAAA,CAGvEuC,EAAAA,CAAiBC,eAAe,CACpC,KAAA,CAAOJ,EAAK,MAAA,CACZ,YAAA,CAAc,IAAMC,EAAAA,CACpB,UAAA,CAAajc,GAAUgc,CAAAA,CAAKhc,CAAK,GAAG,EAAA,EAAMA,CAAAA,CAC1C,iBAAkB,IAAM0a,CAAAA,CAAU,QAClC,QAAA,CAAUvB,EAAAA,CACV,aAAcE,EAChB,CAAC,EAEKgD,CAAAA,CAAiBb,CAAAA,CAAM,qBAAA,EAAsB,CAC7Cc,GAAed,CAAAA,CAAM,eAAA,GAErBe,EAAAA,CAAoBD,EAAAA,CAAa,SAAW,CAAA,CAC5CE,EAAAA,CAAoBJ,eAAe,CACvC,UAAA,CAAY,KACZ,KAAA,CAAOC,CAAAA,CAAe,OACtB,YAAA,CAAerc,CAAAA,EAAUqc,EAAerc,CAAK,CAAA,CAAE,SAAQ,CACvD,UAAA,CAAaA,GAAUqc,CAAAA,CAAerc,CAAK,EAAE,EAAA,CAC7C,gBAAA,CAAkB,IAAM0a,CAAAA,CAAU,OAAA,CAClC,SAAUtB,EAAAA,CACV,OAAA,CAASmD,EACX,CAAC,CAAA,CAGKE,GAAiB,IAAA,CAAK,SAAA,CAAUJ,EAAe,GAAA,CAAKK,CAAAA,EAAW,CAACA,CAAAA,CAAO,EAAA,CAAIA,EAAO,OAAA,EAAS,CAAC,CAAC,CAAA,CACnGvH,UAAU,IAAM,CACdqH,GAAkB,OAAA,GACpB,EAAG,CAACC,EAAAA,CAAgBD,EAAiB,CAAC,CAAA,CACtC,IAAMG,EAAAA,CAAiBH,EAAAA,CAAkB,iBAAgB,CACnDI,CAAAA,CAAcL,GAAqBI,EAAAA,CAAe,CAAC,GAAG,KAAA,EAAS,CAAA,CAAK,EACpEE,EAAAA,CAAaN,EAAAA,CAAAA,CACdI,GAAeA,EAAAA,CAAe,MAAA,CAAS,CAAC,CAAA,EAAG,KAAA,EAAS,IAAM,CAAA,CAC3DN,CAAAA,CAAe,OACbS,EAAAA,CAAcP,EAAAA,CAAqBI,EAAAA,CAAe,CAAC,GAAG,KAAA,EAAS,CAAA,CAAK,EACpEI,CAAAA,CAAeR,EAAAA,CACjB,KAAK,GAAA,CAAI,CAAA,CAAGC,GAAkB,YAAA,EAAa,EAAKG,GAAeA,EAAAA,CAAe,MAAA,CAAS,CAAC,CAAA,EAAG,GAAA,EAAO,EAAE,CAAA,CACpG,CAAA,CAEEK,GAAeb,EAAAA,CAAe,eAAA,GAC9B,CAAE,UAAA,CAAAc,GAAY,aAAA,CAAAC,EAAc,EAAIC,EAAAA,CACpCH,EAAAA,CACAb,GAAe,YAAA,EAAa,CAC5B9C,EACF,CAAA,CAIM+D,EAAAA,CAAgB1J,OAAOuG,GAAU,CAAA,CACjCoD,EAAa3J,MAAAA,CAAOoG,CAAO,EAC3BrG,CAAAA,CAAmBC,MAAAA,CAAOP,CAAa,CAAA,CAC7CiK,EAAAA,CAAc,QAAUnD,GAAAA,CACxBoD,CAAAA,CAAW,QAAUvD,CAAAA,CACrBrG,CAAAA,CAAiB,QAAUN,CAAAA,CAE3B,IAAMmK,EAAgBjI,WAAAA,CAAakI,CAAAA,EAAsC,CACvE,GAAI,CAACH,GAAc,OAAA,EAAW,CAACC,EAAW,OAAA,EAAW5J,CAAAA,CAAiB,QACpE,OAGF,IAAM+J,EAAgBD,CAAAA,EAAa7C,CAAAA,CAAU,QAExC8C,CAAAA,EAIA3E,EAAAA,CAAe2E,CAAa,CAAA,GAKjC/J,CAAAA,CAAiB,QAAU,IAAA,CAC3B2J,EAAAA,CAAc,SAAQ,EACxB,CAAA,CAAG,EAAE,CAAA,CAGLjI,UAAU,IAAM,CACdmI,IACF,CAAA,CAAG,CAACA,CAAAA,CAAetB,CAAAA,CAAK,OAAQlC,CAAAA,CAAS3G,CAAa,CAAC,CAAA,CAEvD,SAASuI,GAAyB+B,CAAAA,CAA6C,CAC7E,IAAMC,CAAAA,CAAgD,MAAA,CAAO,KAAzC,OAAOD,CAAAA,EAAc,WAAyBA,CAAAA,CAAU9C,CAAY,EAAiB8C,CAAhB,CAAA,CAEzF7C,EAAgB6C,CAAS,CAAA,CACzBzD,IAA0B0D,CAAW,EACvC,CAEA,SAASC,CAAAA,CAAaC,EAAsC,CAC1D1D,CAAAA,GAAW0D,CAAK,CAAA,CAChBN,CAAAA,CAAcM,EAAM,aAAa,EACnC,CAEA,OAAIhN,CAAAA,CACKI,IAAAwH,QAAAA,CAAA,EAAE,EAITN,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAW2F,CAAAA,CAAG,wEAAA,CAA0EjE,GAAY,OAAO,CAAA,CAC7G,UAAAa,CAAAA,EAAoBA,CAAAA,CAAiBe,CAAK,CAAA,CAC3CxK,GAAAA,CAAC,OAAI,SAAA,CAAU,uDAAA,CACb,SAAAA,GAAAA,CAAC8M,CAAAA,CAAA,CAAgB,aAAA,CAAe,GAAA,CAC9B,SAAA5F,IAAAA,CAAC6F,EAAAA,CAAA,CACC,SAAA,CAAWF,CAAAA,CAAG,mBAAoBjE,CAAAA,EAAY,KAAK,EACnD,eAAA,CAAeyC,CAAAA,CAAe,OAC9B,KAAA,CAAO,CAAE,SAAUb,CAAAA,CAAM,YAAA,EAAe,CAAA,CACxC,mBAAoB5B,CAAAA,EAAY,cAAA,CAChC,SAAU+D,CAAAA,CACV,GAAA,CAAKjD,EAEL,QAAA,CAAA,CAAA1J,GAAAA,CAACgN,GAAA,CAAY,SAAA,CAAU,qCACpB,QAAA,CAAA1B,EAAAA,CAAa,IAAK2B,CAAAA,EACjB/F,IAAAA,CAACgG,GAAA,CAAS,SAAA,CAAU,oBACjB,QAAA,CAAA,CAAApB,EAAAA,CAAc,EAAI9L,GAAAA,CAACmN,EAAAA,CAAA,CAAoB,KAAA,CAAOrB,EAAAA,CAAa,OAAM,IAAA,CAAC,CAAA,CAAK,MACtEP,EAAAA,CAAoB0B,CAAAA,CAAY,QAAQ,KAAA,CAAMrB,CAAAA,CAAaC,EAAU,CAAA,CAAIoB,CAAAA,CAAY,SAAS,GAAA,CAC9F,CAACG,EAAQpe,CAAAA,GAELkY,IAAAA,CAACmG,KAAA,CACC,eAAA,CAAe9B,GAAoBK,CAAAA,CAAc5c,CAAAA,CAAQ,EAAI,MAAA,CAC7D,SAAA,CAAW6d,EACT,qCAAA,CACAO,CAAAA,CAAO,OAAO,EAAA,GAAO,SAAA,EAAa,SACpC,CAAA,CACA,OAAA,CAASA,EAAO,OAAA,CAEhB,KAAA,CAAOA,EAAO,OAAA,EAAQ,CAAI,CAAE,KAAA,CAAO,CAAA,EAAGA,EAAO,OAAA,EAAQ,CAAE,UAAU,CAAA,EAAA,CAAK,EAAI,EAAC,CAE1E,UAAAA,CAAAA,CAAO,aAAA,CACJ,KACAE,UAAAA,CAAWF,CAAAA,CAAO,OAAO,SAAA,CAAU,MAAA,CAAQA,CAAAA,CAAO,UAAA,EAAY,CAAA,CACjEjL,CAAAA,CACCnC,IAAC,KAAA,CAAA,CACC,aAAA,CAAW,KACX,SAAA,CAAU,yHAAA,CAEV,SAAAA,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,0DAAA,CAA2D,CAAA,CAC5E,EACE,IAAA,CAAA,CAAA,CAbCoN,CAAAA,CAAO,EAcd,CAGN,CAAA,CACCrB,EAAe,CAAA,CAAI/L,GAAAA,CAACmN,GAAA,CAAoB,KAAA,CAAOpB,EAAc,MAAA,CAAM,IAAA,CAAC,EAAK,IAAA,CAAA,CAAA,CA9B/BkB,CAAAA,CAAY,EA+BzD,CACD,CAAA,CACH,EACAjN,GAAAA,CAACuN,EAAAA,CAAA,CAAU,SAAA,CAAU,qBAAA,CAClB,SAAAvC,CAAAA,CAAK,MAAA,GAAW,EACfhL,GAAAA,CAACkN,EAAAA,CAAA,CACC,QAAA,CAAAlN,GAAAA,CAACwN,GAAA,CAAU,SAAA,CAAU,yBAAyB,OAAA,CAAS3E,CAAAA,CAAQ,OAAQ,QAAA,CAAA,aAAA,CAEvE,CAAA,CACF,EAEA3B,IAAAA,CAAAM,QAAAA,CAAA,CACG,QAAA,CAAA,CAAAyE,EAAAA,CAAa,EAAIjM,GAAAA,CAACyN,EAAAA,CAAA,CAAiB,MAAA,CAAQxB,EAAAA,CAAY,EAAK,IAAA,CAC5DD,EAAAA,CAAa,IAAK0B,CAAAA,EAAe,CAChC,IAAM3H,CAAAA,CAAMiF,CAAAA,CAAK0C,EAAW,KAAK,CAAA,CAEjC,OACExG,IAAAA,CAACgG,EAAAA,CAAA,CACC,SAAA,CAAWL,CAAAA,CACRrC,EAAM,OAAA,CAAQ,IAAA,CAA2B,gBAAA,CAAiBzE,CAAG,EAC9D,yDAAA,CACA,CAACmF,IAA6BxC,CAAAA,EAAqB,IAAA,EAAQ,SAC3DE,CAAAA,EAAY,GACd,EACA,YAAA,CAAY8E,CAAAA,CAAW,MACvB,YAAA,CAAY3H,CAAAA,CAAI,eAAc,EAAK,UAAA,CAEnC,MAAO,CACL,MAAA,CAAQ,GAAGkF,EAAAA,CAAY,QAAA,EAAU,CAAA,EAAA,CACnC,CAAA,CAEC,UAAAa,EAAAA,CAAc,CAAA,CAAI9L,IAACmN,EAAAA,CAAA,CAAoB,MAAOrB,EAAAA,CAAa,CAAA,CAAK,KAChE/F,CAAAA,CACE,eAAA,GACA,KAAA,CAAM6F,CAAAA,CAAaC,EAAU,CAAA,CAC7B,GAAA,CAAI,CAAC8B,CAAAA,CAAM3e,EAAAA,GACVgR,IAACwN,EAAAA,CAAA,CACC,UAAWX,CAAAA,CACT,iDAAA,CACAc,EAAK,MAAA,CAAO,EAAA,GAAO,WAAa,UAClC,CAAA,CACA,gBAAe/B,CAAAA,CAAc5c,EAAAA,CAAQ,EAErC,KAAA,CAAO,CACL,MAAO2e,CAAAA,CAAK,MAAA,CAAO,SACrB,CAAA,CAEC,SAAAL,UAAAA,CAAWK,CAAAA,CAAK,OAAO,SAAA,CAAU,IAAA,CAAMA,EAAK,UAAA,EAAY,GALpDA,CAAAA,CAAK,EAMZ,CACD,CAAA,CACF5B,CAAAA,CAAe,EAAI/L,GAAAA,CAACmN,EAAAA,CAAA,CAAoB,KAAA,CAAOpB,CAAAA,CAAc,CAAA,CAAK,IAAA,CAAA,CAAA,CAxB9D2B,EAAW,GAyBlB,CAEJ,CAAC,CAAA,CACAxB,EAAAA,CAAgB,EAAIlM,GAAAA,CAACyN,EAAAA,CAAA,CAAiB,MAAA,CAAQvB,EAAAA,CAAe,EAAK,IAAA,CAAA,CACrE,CAAA,CAEJ,GACF,CAAA,CACF,CAAA,CACF,GACF,CAEJ,CAEA,SAASC,EAAAA,CACPH,CAAAA,CACA4B,EACAC,CAAAA,CAC+C,CAC/C,GAAI7B,CAAAA,CAAa,MAAA,GAAW,EAC1B,OAAO,CAAE,WAAY,CAAA,CAAG,aAAA,CAAe,CAAE,CAAA,CAG3C,IAAM8B,EAAa9B,CAAAA,CAAa,CAAC,GAAG,KAAA,EAAS,CAAA,CACvC+B,EAAU/B,CAAAA,CAAaA,CAAAA,CAAa,OAAS,CAAC,CAAA,EAAG,KAAO,CAAA,CAI9D,OAAO,CACL,UAAA,CAAY,IAAA,CAAK,IAAI,CAAA,CAAG8B,CAAAA,CAAaD,CAAY,CAAA,CACjD,aAAA,CAAe,KAAK,GAAA,CAAI,CAAA,CAAGD,GAAaG,CAAAA,CAAUF,CAAAA,CAAa,CACjE,CACF,CAEA,SAASV,EAAAA,CAAoB,CAAE,MAAAa,CAAAA,CAAO,MAAA,CAAAZ,EAAS,KAAM,CAAA,CAAqD,CAGxG,OAAOpN,GAAAA,CAFWoN,EAAS,IAAA,CAAO,IAAA,CAE1B,CAAU,aAAA,CAAW,IAAA,CAAC,MAAO,CAAE,KAAA,CAAAY,CAAAA,CAAO,UAAA,CAAY,EAAG,OAAA,CAAS,CAAA,CAAG,OAAQ,CAAE,CAAA,CAAG,CACxF,CAEA,SAASP,GAAiB,CAAE,MAAA,CAAAQ,CAAO,CAAA,CAAoC,CACrE,OACEjO,GAAAA,CAAC,IAAA,CAAA,CACC,cAAW,IAAA,CACX,SAAA,CAAU,qCACV,KAAA,CAAO,CAAE,QAAS,OAAA,CAAS,MAAA,CAAQ,GAAGiO,CAAAA,CAAO,QAAA,EAAU,CAAA,EAAA,CAAK,CAAA,CAE5D,SAAAjO,GAAAA,CAAC,IAAA,CAAA,CAAG,UAAU,oBAAA,CAAqB,CAAA,CACrC,CAEJ,CAEA,SAAS+K,GACPhF,CAAAA,CACAuD,CAAAA,CACAD,EACQ,CACR,OAAIC,GAAkB,QAAA,CAASvD,CAAAA,CAAI,SAAS,GAAG,CAAA,CACtC,kDAGLsD,CAAAA,EAAkB,IAAA,CAAM6E,GAASA,CAAAA,CAAK,GAAA,GAAQnI,EAAI,QAAA,CAAS,GAAG,EACzD,6CAAA,CAGF,EACT,CC5bA,IAAMoI,EAAAA,CAAiBnQ,aAAAA,CAA6B,EAAE,CAAA,CAChDoQ,GAAwBpQ,aAAAA,CAAgC,IAAG,CAAA,CAAY,CAAA,CAE7E,SAASqQ,EAAAA,CAAeC,CAAAA,CAAmBC,EAA0B,CACnE,IAAMC,EAAaD,CAAAA,CAAO,IAAA,CAM1B,OAJKA,CAAAA,CAAO,GAAA,GACVA,EAAO,GAAA,CAAM,IAAA,CAAK,KAAI,CAAE,QAAA,IAGlBC,CAAAA,EACN,KAAK,cAAA,CACH,OAAOzJ,OAAO0J,KAAAA,CAAM,CAAC,OAAkB,KAAK,CAAC,EAAG,CAAC,GAAIH,EAAkCC,CAAM,CAAC,EAEhG,KAAK,WAAA,CACH,OAAOxJ,MAAAA,CAAO0J,KAAAA,CAAM,CAAC,MAAA,CAAkB,KAAK,CAAC,CAAA,CAAG,CAAC,GAAIH,CAAAA,CAA+BC,CAAM,CAAC,CAAA,CAE7F,KAAK,aACH,OAAOxJ,MAAAA,CAAO0J,MAAM,CAAC,MAAA,CAAkB,KAAK,CAAC,CAAA,CAAG,CAAC,GAAIH,CAAAA,CAAgCC,CAAM,CAAC,CAAA,CAE9F,KAAK,kBAAA,CACH,OAAOxJ,OAAO0J,KAAAA,CAAM,CAAC,OAAkB,KAAK,CAAC,EAAG,CAAC,GAAIH,EAAsCC,CAAM,CAAC,EAEpG,KAAK,aAAA,CACH,OAAOxJ,MAAAA,CAAO0J,KAAAA,CAAM,CAAC,MAAA,CAAkB,KAAK,CAAC,CAAA,CAAG,CAAC,GAAIH,CAAAA,CAAiCC,CAAM,CAAC,CAAA,CAE/F,KAAK,SAAA,CACH,OAAOD,EAAQ,MAAA,CAAQ5Z,CAAAA,EAASA,EAAK,GAAA,GAAQ6Z,CAAAA,CAAO,GAAG,CAAA,CAEzD,QACE,MAAM,KAAA,CAAM,CAAA,gBAAA,EAAmBC,CAAoB,CAAA,CAAE,CAEzD,CACF,CAEA,SAASE,GAAgB,CAAE,QAAA,CAAAhP,CAAS,CAAA,CAAyC,CAC3E,GAAM,CAACiP,CAAAA,CAAeC,CAAqB,CAAA,CAAIC,UAAAA,CAAWR,GAAgB,EAAE,EAE5E,OACErO,GAAAA,CAACmO,GAAe,QAAA,CAAf,CAAwB,MAAOQ,CAAAA,CAC9B,QAAA,CAAA3O,IAACoO,EAAAA,CAAsB,QAAA,CAAtB,CAA+B,KAAA,CAAOQ,CAAAA,CAAwB,SAAAlP,CAAAA,CAAS,CAAA,CAC1E,CAEJ,CAEA,SAASoP,IAAuB,CAC9B,OAAO3Q,WAAWgQ,EAAc,CAClC,CAEA,SAASY,EAAAA,EAAgC,CACvC,OAAO5Q,UAAAA,CAAWiQ,EAAqB,CACzC,CClDO,SAASY,EAAAA,CAAyB,CAAE,KAAA,CAAAxE,CAAM,EAAsD,CACrG,GAAM,CAACpY,CAAI,CAAA,CAAIoY,EAAM,QAAA,EAAS,CAAE,QAEhC,GAAI,CAACpY,EACH,OAAO,IAAA,CAIT,IAAM6c,CAAAA,CADSzE,CAAAA,CAAM,UAAUpY,CAAAA,CAAK,EAAE,GACf,SAAA,CAAU,IAAA,EAAiC,OAASA,CAAAA,CAAK,EAAA,CAC1EsU,EAAYtU,CAAAA,CAAK,IAAA,CAAO,OAAS,KAAA,CAEvC,OACE8U,KAACgI,CAAAA,CAAA,CACC,aAAY,CAAA,iBAAA,EAAoBD,CAAK,GACrC,SAAA,CAAU,0DAAA,CACV,QAAS,IAAM,CACbzE,EAAM,YAAA,GACR,EACA,IAAA,CAAK,IAAA,CACL,QAAQ,SAAA,CACT,QAAA,CAAA,CAAA,YAAA,CACYyE,EAAM,GAAA,CAAEvI,CAAAA,CACnB1G,IAACmP,GAAAA,CAAA,CAAE,UAAU,uBAAA,CAAwB,CAAA,CAAA,CACvC,CAEJ,CCnBO,SAASC,EAAAA,EAA4C,CAC1D,GAAM,CAACC,EAAaC,CAAc,CAAA,CAAIzP,SAAS,KAAK,CAAA,CAC9C,CAAC0P,CAAAA,CAAUC,CAAW,EAAI3P,QAAAA,CAASoD,GAAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAIxC,CAAA,CACK,CAACxQ,CAAAA,CAASgd,CAAU,EAAI5P,QAAAA,CAA8B,EAAE,CAAA,CACxD,CAAC6P,EAAgB,CAAE,IAAA,CAAArZ,EAAM,OAAA,CAAAsZ,CAAAA,CAAS,MAAAtT,CAAM,CAAC,EAAIuT,WAAAA,CAAYL,CAAAA,CAAU9c,CAAO,CAAA,CAG1E6K,CAAAA,CAAchB,GAAeD,CAAK,CAAA,CAElC,CAAE,iBAAA,CAAA4H,CAAAA,CAAmB,kBAAAC,CAAkB,CAAA,CAAA,CAAK,IAAM,CACtD,GAAI5G,GAAa,UAAA,GAAe,GAAA,CAAK,CACnC,IAAMC,CAAAA,CAAeZ,GAAkCW,CAAAA,CAAY,QAAQ,EAE3E,GAAIC,CAAAA,EAAgB,OAAOA,CAAAA,CAAa,IAAA,EAAS,SAAU,CACzD,GAAIA,EAAa,IAAA,GAAS,gBAAA,CACxB,OAAO,CACL,iBAAA,CAAmB,KACnB,iBAAA,CAAmB,KACrB,EAGF,GAAIA,CAAAA,CAAa,OAAS,gBAAA,CACxB,OAAO,CACL,iBAAA,CAAmB,KAAA,CACnB,kBAAmB,IACrB,CAEJ,CAEA,OAAO,CACL,kBAAmB,IAAA,CACnB,iBAAA,CAAmB,KACrB,CACF,CAEA,OAAO,CACL,iBAAA,CAAmB,MACnB,iBAAA,CAAmB,KACrB,CACF,CAAA,GAAG,CAEH,OAAA4G,UAAU,IAAM,CACVkL,IACGK,CAAAA,EAAe,CACpBJ,EAAe,KAAK,CAAA,EAExB,EAAG,CAACD,CAAAA,CAAaK,CAAc,CAAC,CAAA,CAEzB,CAACJ,CAAAA,CAAgBE,CAAAA,CAAaC,EAAY,CAAE,IAAA,CAAApZ,EAAM,OAAA,CAAAsZ,CAAAA,CAAS,MAAAtT,CAAAA,CAAO,iBAAA,CAAA4H,EAAmB,iBAAA,CAAAC,CAAkB,CAAC,CACjH,CCvDO,SAAS2L,EAAAA,CAAqC,CACnD,MAAA,CAAAnE,CAAAA,CACA,MAAAoE,CAAAA,CACA,SAAA,CAAAC,CACF,CAAA,CAA2D,CACzD,GAAI,CAACrE,CAAAA,CAAO,YAAW,CACrB,OAAO1L,IAAC,KAAA,CAAA,CAAI,SAAA,CAAW6M,EAAG,yBAAA,CAA2BkD,CAAS,EAAI,QAAA,CAAAD,CAAAA,CAAM,EAG1E,IAAME,CAAAA,CAActE,EAAO,WAAA,EAAY,GAAM,MACvCuE,CAAAA,CAAevE,CAAAA,CAAO,aAAY,GAAM,MAAA,CAE9C,OACExE,IAAAA,CAAC,KAAA,CAAA,CAAI,UAAW2F,CAAAA,CAAG,+DAAA,CAAiEkD,CAAS,CAAA,CAC3F,QAAA,CAAA,CAAA/P,GAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,aAAA,CAAe,SAAA8P,CAAAA,CAAM,CAAA,CACrC5I,KAACgJ,GAAAA,CAAA,CACC,UAAAlQ,GAAAA,CAACmQ,CAAAA,CAAA,CAAoB,OAAA,CAAO,IAAA,CAC1B,SAAAnQ,GAAAA,CAAC,QAAA,CAAA,CACC,aAAY,CAAA,KAAA,EAAQ8P,CAAK,GACzB,SAAA,CAAU,yPAAA,CACV,KAAK,QAAA,CAEL,QAAA,CAAA9P,IAACoQ,WAAAA,CAAA,CAAY,UAAU,mBAAA,CAAoB,CAAA,CAC7C,EACF,CAAA,CACAlJ,IAAAA,CAACmJ,EAAA,CAAoB,KAAA,CAAM,MAAM,SAAA,CAAU,SAAA,CACzC,UAAAnJ,IAAAA,CAACoJ,CAAAA,CAAA,CACC,cAAA,CAAcN,CAAAA,CACd,UAAWnD,CAAAA,CAAGmD,CAAAA,EAAe,wCAAwC,CAAA,CACrE,QAAA,CAAU,IAAM,CACd,GAAIA,EAAa,CACftE,CAAAA,CAAO,cAAa,CAEpB,MACF,CAEAA,CAAAA,CAAO,aAAA,CAAc,KAAK,EAC5B,CAAA,CACA,KAAK,kBAAA,CAEL,QAAA,CAAA,CAAA1L,IAACuQ,OAAAA,CAAA,CAAQ,UAAW1D,CAAAA,CAAG,eAAA,CAAiBmD,GAAe,eAAe,CAAA,CAAG,EAAE,gBAAA,CAAA,CAE7E,CAAA,CACA9I,KAACoJ,CAAAA,CAAA,CACC,eAAcL,CAAAA,CACd,SAAA,CAAWpD,EAAGoD,CAAAA,EAAgB,wCAAwC,EACtE,QAAA,CAAU,IAAM,CACd,GAAIA,CAAAA,CAAc,CAChBvE,EAAO,YAAA,EAAa,CAEpB,MACF,CAEAA,CAAAA,CAAO,cAAc,IAAI,EAC3B,EACA,IAAA,CAAK,kBAAA,CAEL,UAAA1L,GAAAA,CAACwQ,SAAAA,CAAA,CAAU,SAAA,CAAW3D,CAAAA,CAAG,gBAAiBoD,CAAAA,EAAgB,eAAe,EAAG,CAAA,CAAE,iBAAA,CAAA,CAEhF,GACF,CAAA,CAAA,CACF,CAAA,CAAA,CACF,CAEJ,CCjFO,SAASQ,GAAQ,CAAE,KAAA,CAAAlhB,CAAM,CAAA,CAAuB,CACrD,OACEyQ,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sCACZ,QAAA,CAAAzQ,CAAAA,CACCyQ,IAAC0Q,WAAAA,CAAA,CAAY,UAAU,mCAAA,CAAoC,CAAA,CAE3D1Q,IAAC2Q,OAAAA,CAAA,CAAQ,UAAU,wCAAA,CAAyC,CAAA,CAEhE,CAEJ,CCJA,IAAMC,EAAAA,CAAqB,GAAA,CACrBC,GAAoB,GAAA,CAMnB,SAASC,EAAsB,CAAE,KAAA,CAAAvhB,CAAM,CAAA,CAA4C,CACxF,IAAMwhB,EAAUrO,MAAAA,CAAwB,IAAI,EACtCsO,CAAAA,CAAoBtO,MAAAA,CAA6C,IAAI,CAAA,CACrE,CAACuO,EAAQC,CAAS,CAAA,CAAIrR,SAAS,KAAK,CAAA,CACpC,CAACsR,CAAAA,CAAaC,CAAc,EAAIvR,QAAAA,CAAS,KAAK,EAEpDsE,SAAAA,CAAU,IACD,IAAM,CACP6M,CAAAA,CAAkB,SACpB,YAAA,CAAaA,CAAAA,CAAkB,OAAO,EAE1C,CAAA,CACC,EAAE,CAAA,CAEL,SAASK,CAAAA,EAA6B,CACpC,IAAMC,CAAAA,CAAUP,CAAAA,CAAQ,QAExB,OAAKO,CAAAA,CAIEA,EAAQ,WAAA,CAAcA,CAAAA,CAAQ,YAH5B,KAIX,CAEA,eAAeC,GAAAA,CAAY3E,CAAAA,CAAqD,CAI9E,GAHAA,CAAAA,CAAM,gBAAe,CACrBA,CAAAA,CAAM,iBAAgB,CAElB,CAAA,CAACrd,EAIL,CAAA,GAAI,CACF,MAAM,SAAA,CAAU,SAAA,CAAU,UAAUA,CAAK,EAC3C,MAAQ,CACN,MACF,CAEA2hB,CAAAA,CAAU,IAAI,EACdE,CAAAA,CAAe,IAAI,EAEfJ,CAAAA,CAAkB,OAAA,EACpB,aAAaA,CAAAA,CAAkB,OAAO,EAGxCA,CAAAA,CAAkB,OAAA,CAAU,WAAW,IAAM,CAC3CE,CAAAA,CAAU,KAAK,CAAA,CACfE,CAAAA,CAAe,KAAK,EACtB,CAAA,CAAGP,EAAiB,EAAA,CACtB,CAEA,SAASW,CAAAA,EAA2B,CAClCH,IACF,CAEA,SAASI,CAAAA,CAAwBC,CAAAA,CAAqB,CACpD,GAAI,CAAAT,EAIJ,CAAA,GAAIS,CAAAA,CAAM,CACRN,CAAAA,CAAeC,CAAAA,EAAmB,CAAA,CAElC,MACF,CAEAD,CAAAA,CAAe,KAAK,GACtB,CAEA,GAAI,CAAC7hB,CAAAA,CACH,OAAOyQ,IAAC,KAAA,CAAA,CAAI,SAAA,CAAU,cAAc,CAAA,CAGtC,IAAM2R,EACJpiB,CAAAA,CAAM,MAAA,CAASqhB,EAAAA,CAAqB,CAAA,EAAGrhB,CAAAA,CAAM,KAAA,CAAM,EAAGqhB,EAAkB,CAAC,SAAMrhB,CAAAA,CAEjF,OACE2X,KAAC0K,CAAAA,CAAA,CAAQ,KAAMT,CAAAA,CAAa,YAAA,CAAcM,EACxC,QAAA,CAAA,CAAAzR,GAAAA,CAAC6R,IAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAA3K,IAAAA,CAAC,UACC,YAAA,CAAW,YAAA,CACX,UAAW2F,CAAAA,CACT,uNAAA,CACA,0FACA,4FAAA,CACA,oFACF,EACA,OAAA,CAAS0E,GAAAA,CACT,eAAgBC,CAAAA,CAChB,IAAA,CAAK,SAEL,QAAA,CAAA,CAAAxR,GAAAA,CAAC,QAAK,SAAA,CAAU,0CAAA,CAA2C,IAAK+Q,CAAAA,CAC7D,QAAA,CAAAxhB,CAAAA,CACH,CAAA,CACAyQ,GAAAA,CAAC,MAAA,CAAA,CACC,cAAW,IAAA,CACX,SAAA,CAAW6M,EACT,0HAAA,CACA,4HAAA,CACA,wCACAoE,CAAAA,CACI,mCAAA,CACA,8FACN,CAAA,CAEC,QAAA,CAAAA,EAASjR,GAAAA,CAAC8R,KAAAA,CAAA,CAAU,SAAA,CAAU,WAAA,CAAY,EAAK9R,GAAAA,CAAC+R,IAAAA,CAAA,CAAS,SAAA,CAAU,WAAA,CAAY,EAClF,CAAA,CAAA,CACF,CAAA,CACF,EACA/R,GAAAA,CAACgS,CAAAA,CAAA,CAAe,SAAA,CAAU,gCAAA,CACvB,SAAAf,CAAAA,CAAS,qBAAA,CAAwBU,EACpC,CAAA,CAAA,CACF,CAEJ,CC/HO,SAASM,EAAAA,CAAK,CAAE,KAAA,CAAA1iB,CAAM,EAA2C,CACtE,IAAI2iB,EAAe,OAAO3iB,CAAAA,EAAU,UAAY,KAAA,CAAM,OAAA,CAAQA,CAAK,CAAA,CAAI,IAAA,CAAK,UAAUA,CAAK,CAAA,CAAIA,EAC/F,OAAA2iB,CAAAA,CAAeA,IAAiB,MAAA,EAAUA,CAAAA,EAAgB,KAAO,EAAA,CAAK,MAAA,CAAOA,CAAY,CAAA,CAElFlS,GAAAA,CAAC8Q,EAAA,CAAsB,KAAA,CAAOoB,EAAc,CACrD,CCoBA,IAAMC,EAAAA,CAAcC,YAEdC,EAAAA,CAAcC,WAAAA,CACdC,GAAaC,UAAAA,CAAW,SAAA,CAAU,CACtC,cAAA,CAAgB,CACd,MAASC,EAAAA,CACP,8HACF,CACF,CACF,CAAC,EAEKC,EAAAA,CAAoBC,QAAAA,CAAS,UAAU,CAC3C,IAAA,CAAM,KACN,UAAA,CAAY,IAAA,CACZ,eAAgB,OAAA,CAChB,gBAAA,CAAkB,IAClB,OAAA,CAAS,KAAA,CACT,OAAQ,KAAA,CACR,mBAAA,CAAqB,MACrB,mBAAA,CAAqB,KACvB,CAAC,CAAA,CAEKC,EAAAA,CAAcC,WAAAA,CAAY,OAAO,CACrC,qBAAA,EAAwB,CACtB,OAAO,CACLC,mBAAmB,CACjB,UAAA,CAAYL,GAAG,8EAA8E,CAC/F,CAAC,CACH,CACF,CACF,CAAC,CAAA,CAAE,UAAU,CACX,WAAA,CAAa,KACb,cAAA,CAAgB,CACd,MAAOA,EAAAA,CAAG,4DAA4D,CACxE,CACF,CAAC,EAEKM,EAAAA,CAAWC,QAAAA,CAAS,UAAU,CAClC,cAAA,CAAgB,CACd,KAAA,CAAOP,EAAAA,CAAG,uBAAuB,CACnC,CACF,CAAC,CAAA,CACKQ,EAAAA,CAAWC,SAAS,SAAA,CAAU,CAClC,eAAgB,CACd,KAAA,CAAST,GAAG,sCAAsC,CACpD,EACA,MAAA,CAAQ,IACV,CAAC,CAAA,CAEKU,EAAAA,CAAiBC,eAAe,SAAA,CAAU,CAC9C,eAAgB,CACd,KAAA,CAASX,GAAG,4CAA4C,CAC1D,CACF,CAAC,CAAA,CAEKY,GAAaC,UAAAA,CAAW,SAAA,CAAU,CACtC,UAAA,CAAY,CACV,eAAgB,CACd,KAAA,CAASb,GAAG,oDAAoD,CAClE,CACF,CAAA,CACA,WAAA,CAAa,CACX,cAAA,CAAgB,CACd,MAASA,EAAAA,CAAG,uDAAuD,CACrE,CACF,CAAA,CACA,QAAA,CAAU,CACR,cAAA,CAAgB,CACd,MAASA,EAAAA,CAAG,4BAA4B,CAC1C,CACF,CAAA,CACA,WAAY,CACV,cAAA,CAAgB,CACd,KAAA,CAASA,EAAAA,CAAG,iCAAiC,CAC/C,CACF,EACA,SAAA,CAAW,KAAA,CACX,KAAM,CACJ,cAAA,CAAgB,CACd,KAAA,CAASA,EAAAA,CAAG,4FAA4F,CAAA,CACxG,UAAA,CAAY,OACd,CACF,CAAA,CACA,eAAgB,KAAA,CAChB,UAAA,CAAY,CACV,KAAA,CAAO,SAAA,CACP,MAAO,CACT,CAAA,CACA,UAAW,KACb,CAAC,CAAA,CAEKc,EAAAA,CAAoBC,iBAAAA,CAAkB,SAAA,CAAU,CAGpD,QAAA,CAAUC,cAAAA,CAAeC,MAAM,CACjC,CAAC,EAEKC,EAAAA,CAAUC,OAAAA,CAAQ,UAAU,CAChC,cAAA,CAAgB,CACd,KAAA,CAASnB,EAAAA,CAAG,4DAA4D,CAC1E,CAAA,CACA,OAAQ,KACV,CAAC,EAEKoB,EAAAA,CAAUC,OAAAA,CAAQ,UAAU,CAChC,cAAA,CAAgB,CACd,KAAA,CAASrB,EAAAA,CAAG,cAAc,CAC5B,CAAA,CACA,OAAQ,KACV,CAAC,EAEKsB,EAAAA,CAAcC,WAAAA,CAAY,UAAU,CACxC,cAAA,CAAgB,CACd,KAAA,CAASvB,EAAAA,CAAG,gGAAgG,CAC9G,CAAA,CACA,YAAA,CAAc,CACZ,YAAA,CAAc,KAChB,CACF,CAAC,CAAA,CAEKwB,GAAiBC,cAAAA,CAAe,SAAA,GAEzBC,EAAAA,CAAwC,CACnDd,GACAhB,EAAAA,CACAE,EAAAA,CACAK,GACAG,EAAAA,CACAE,EAAAA,CACAE,GACAhB,EAAAA,CACAoB,EAAAA,CACAI,GACAE,EAAAA,CACAE,EAAAA,CACAE,GACAG,eAAAA,CACA1B,EAAAA,CACA2B,mBACAC,SAAAA,CACAC,KAAAA,CACAC,aACAC,gBACF,ECnKA,IAAIC,EAAAA,CAEJ,SAASC,IAAmB,CAC1B,IAAM3jB,EAAS4jB,SAAAA,CAAUT,EAA+B,EAExD,OAAO,CAAE,OAAAnjB,CAAAA,CAAQ,eAAA,CAAiB6jB,6BAA6B7jB,CAAM,CAAE,CACzE,CAEO,SAAS8jB,GAAqBvlB,CAAAA,CAA2BwlB,CAAAA,CAAY,IAAa,CACvF,GAAI,CAACxlB,CAAAA,CACH,OAAO,GAGT,GAAI,CACF,IAAMylB,CAAAA,CAAW,IAAA,CAAK,MAAMzlB,CAAK,CAAA,CACjC,OAAAmlB,EAAAA,GAAeC,EAAAA,GAERM,OAAAA,CAAQC,IAAAA,CAAK,SAASR,EAAAA,CAAW,MAAA,CAAQM,CAAQ,CAAA,CAAG,CACzD,gBAAiBN,EAAAA,CAAW,eAC9B,CAAC,CAAA,CAAE,SAAA,CAAU,EAAGK,CAAS,CAC3B,CAAA,KAAQ,CACN,OAAOxlB,CAAAA,CAAM,UAAU,CAAA,CAAGwlB,CAAS,CACrC,CACF,CCvBO,SAASI,EAAAA,CAAO,CAAE,MAAA5lB,CAAM,CAAA,CAAsB,CACnD,IAAM6lB,CAAAA,CAAYtV,QAAQ,IAAMgV,EAAAA,CAAqBvlB,CAAK,CAAA,CAAG,CAACA,CAAK,CAAC,CAAA,CAEpE,OAAOyQ,GAAAA,CAAC8Q,CAAAA,CAAA,CAAsB,KAAA,CAAOsE,CAAAA,CAAW,CAClD,CCHA,IAAMC,EAAAA,CAAoB,GAAA,CACpBC,GAAwB,IAAA,CAExBC,EAAAA,CAAe,IAAI,GAAA,CACnBC,EAAAA,CAAgB,IAAI,GAAA,CACpBC,EAAAA,CAAkB,IAAI,GAAA,CACtBC,EAAAA,CAAkB,IAAI,GAAA,CAE5B,SAASC,GAAgBC,CAAAA,CAAmB,CAC1C,GAAIF,EAAAA,CAAgB,GAAA,CAAIE,CAAG,CAAA,CACzB,OAGF,IAAMC,CAAAA,CAAM,IAAI,MAChBA,CAAAA,CAAI,QAAA,CAAW,QACfA,CAAAA,CAAI,GAAA,CAAMD,EACVF,EAAAA,CAAgB,GAAA,CAAIE,EAAKC,CAAG,EAC9B,CAEA,SAASC,EAAAA,CAAMF,CAAAA,CAAmB,CAChC,IAAMG,CAAAA,CAAQR,GAAa,GAAA,CAAIK,CAAG,EAE7BG,CAAAA,EAILR,EAAAA,CAAa,IAAIK,CAAAA,CAAK,CAAE,GAAGG,CAAAA,CAAO,UAAA,CAAY,KAAK,GAAA,EAAM,CAAC,EAC5D,CAEA,SAASC,EAAAA,EAAsB,CAC7B,GAAIT,EAAAA,CAAa,IAAA,EAAQF,GACvB,OAGF,IAAMY,EAAU,KAAA,CAAM,IAAA,CAAKV,GAAa,OAAA,EAAS,EAAE,IAAA,CAAK,CAACtmB,EAAGC,CAAAA,GAAMD,CAAAA,CAAE,CAAC,CAAA,CAAE,UAAA,CAAaC,EAAE,CAAC,CAAA,CAAE,UAAU,CAAA,CAC7FgnB,CAAAA,CAAa,KAAK,GAAA,CAAI,CAAA,CAAG,KAAK,IAAA,CAAKb,EAAAA,CAAoB,EAAG,CAAC,CAAA,CAEjE,QAASc,CAAAA,CAAI,CAAA,CAAGA,EAAID,CAAAA,EAAcC,CAAAA,CAAIF,EAAQ,MAAA,CAAQE,CAAAA,EAAK,EAAG,CAC5D,GAAM,CAACP,CAAAA,CAAKG,CAAK,EAAIE,CAAAA,CAAQE,CAAC,EAC9BZ,EAAAA,CAAa,MAAA,CAAOK,CAAG,CAAA,CAEvB,GAAA,CAAI,gBAAgBG,CAAAA,CAAM,SAAS,EACrC,CACF,CAEA,eAAeK,EAAAA,CAAYR,CAAAA,CAA4B,CACrD,GAAIH,EAAAA,CAAgB,GAAA,CAAIG,CAAG,CAAA,CAAG,CAC5BD,GAAgBC,CAAG,CAAA,CAEnB,MACF,CAEA,GAAIL,GAAa,GAAA,CAAIK,CAAG,EAAG,CACzBE,EAAAA,CAAMF,CAAG,CAAA,CAET,MACF,CAEA,IAAMS,CAAAA,CAAWb,GAAc,GAAA,CAAII,CAAG,EAEtC,GAAIS,CAAAA,CAAU,CACZ,MAAMA,CAAAA,CAEN,MACF,CAEA,IAAMC,GAAW,SAAY,CAC3B,GAAI,CACF,IAAM7R,EAAM,MAAM,KAAA,CAAMmR,EAAK,CAC3B,IAAA,CAAM,OACN,KAAA,CAAO,aACT,CAAC,CAAA,CAED,GAAI,CAACnR,EAAI,EAAA,CAAI,CACXkR,GAAgBC,CAAG,CAAA,CAEnB,MACF,CAEA,IAAMW,EAAO,MAAM9R,CAAAA,CAAI,MAAK,CAE5B,GAAI8R,EAAK,IAAA,CAAOjB,EAAAA,CACd,OAGF,IAAMkB,CAAAA,CAAY,IAAI,eAAA,CAAgBD,CAAI,EAC1ChB,EAAAA,CAAa,GAAA,CAAIK,EAAK,CAAE,SAAA,CAAAY,EAAW,QAAA,CAAUD,CAAAA,CAAK,KAAM,UAAA,CAAY,IAAA,CAAK,KAAM,CAAC,EAChFP,EAAAA,GACF,OAASS,CAAAA,CAAc,CAEjBA,CAAAA,YAAe,SAAA,EACjBhB,EAAAA,CAAgB,GAAA,CAAIG,CAAG,CAAA,CAGzBD,EAAAA,CAAgBC,CAAG,EACrB,CACF,IAAG,CAEHJ,EAAAA,CAAc,IAAII,CAAAA,CAAKU,CAAO,EAE9B,MAAMA,CAAAA,CAENd,GAAc,MAAA,CAAOI,CAAG,EAC1B,CAMO,SAASc,GAAkBd,CAAAA,CAA+C,CAC/E,IAAMe,CAAAA,CAAU7W,OAAAA,CAAQ,IAAM,CAC5B,GAAI,CAAC8V,CAAAA,CACH,OAAO,KAGT,IAAMgB,CAAAA,CAASrB,GAAa,GAAA,CAAIK,CAAG,EAEnC,OAAKgB,CAAAA,EAILd,GAAMF,CAAG,CAAA,CAEFgB,EAAO,SAAA,EALL,IAMX,EAAG,CAAChB,CAAG,CAAC,CAAA,CAEF,CAACiB,EAAKC,CAAM,CAAA,CAAIjX,SAAwB8W,CAAO,CAAA,CAErD,OAAAxS,SAAAA,CAAU,IAAM,CACd,GAAI,CAACyR,EAAK,CACRkB,CAAAA,CAAO,IAAI,CAAA,CAEX,MACF,CAEA,GAAIrB,EAAAA,CAAgB,IAAIG,CAAG,CAAA,CAAG,CAC5BD,EAAAA,CAAgBC,CAAG,EACnBkB,CAAAA,CAAO,IAAI,EAEX,MACF,CAEA,IAAMF,CAAAA,CAASrB,EAAAA,CAAa,IAAIK,CAAG,CAAA,CAEnC,GAAIgB,CAAAA,CAAQ,CACVd,EAAAA,CAAMF,CAAG,CAAA,CACTkB,CAAAA,CAAOF,EAAO,SAAS,CAAA,CAEvB,MACF,CAEAE,CAAAA,CAAO,IAAI,CAAA,CACX,IAAIC,EAAU,KAAA,CAEd,OAAAX,GAAYR,CAAG,CAAA,CAAE,KAAK,IAAM,CAC1B,IAAMoB,CAAAA,CAAOzB,EAAAA,CAAa,IAAIK,CAAG,CAAA,CAE5BoB,IAIDD,CAAAA,GAIJjB,EAAAA,CAAMF,CAAG,CAAA,CACTkB,CAAAA,CAAOE,EAAK,SAAS,CAAA,CAAA,EACvB,CAAC,CAAA,CAEM,IAAM,CACXD,CAAAA,CAAU,KACZ,CACF,CAAA,CAAG,CAACnB,CAAG,CAAC,CAAA,CAEDiB,CACT,CC1KA,IAAMI,EAAAA,CACJ,6bAAA,CAEK,SAASC,EAAAA,CAAM,CAAE,MAAA3nB,CAAM,CAAA,CAA+B,CAC3D,OAAI,KAAA,CAAM,QAAQA,CAAK,CAAA,CACdyQ,IAACmX,EAAAA,CAAA,CAAW,MAAO5nB,CAAAA,CAAO,CAAA,CAG5ByQ,IAACoX,EAAAA,CAAA,CAAY,MAAO7nB,CAAAA,CAAO,CACpC,CAEA,SAAS6nB,EAAAA,CAAY,CAAE,KAAA,CAAA7nB,CAAM,EAAqB,CAChD,IAAMkP,EAAOlP,CAAAA,EAAO,IAAA,EAAQ,EAAA,CACtB8nB,CAAAA,CAAU,CAAA,CAAQ5Y,CAAAA,CAClB6Y,EAAUD,CAAAA,EAAW,mCAAA,CAAoC,KAAK5Y,CAAI,CAAA,CAElE8Y,EAAwBC,CAAAA,EAAsB,CAClD,GAAM,CAACC,CAAK,EAAID,CAAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CACrBE,CAAAA,CAAQD,EAAM,KAAA,CAAM,GAAG,EAE7B,OAAIC,CAAAA,CAAM,OAAS,CAAA,CACVA,CAAAA,CAAM,KAAI,CAAG,WAAA,GAGf,MACT,CAAA,CAEMC,EAAgBN,CAAAA,CAClB5Y,CAAAA,CAAK,SAAS,MAAM,CAAA,CAClB,GAAGmZ,GAAe,CAAA,EAAGnZ,CAAI,CAAA,CAAA,CACzB,CAAA,EAAGmZ,GAAe,CAAA,EAAGnZ,CAAI,oBAC3B,IAAA,CAEEoZ,CAAAA,CAAUR,EACZ5Y,CAAAA,CAAK,QAAA,CAAS,MAAM,CAAA,CAClB,CAAA,EAAGmZ,GAAe,CAAA,EAAGnZ,CAAI,GACzB,CAAA,EAAGmZ,GAAe,GAAGnZ,CAAI,CAAA,mBAAA,CAAA,CAC3B,GAEEqZ,CAAAA,CAAqBpB,EAAAA,CAAkBiB,CAAa,CAAA,CAE1D,OAAKN,EAKHrX,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CACZ,QAAA,CAAAsX,EACCpQ,IAAAA,CAAC0K,CAAAA,CAAA,CACC,QAAA,CAAA,CAAA5R,GAAAA,CAAC6R,IAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAA7R,GAAAA,CAAC,OACC,GAAA,CAAI,OAAA,CACJ,SAAA,CAAW,CAAA,mFAAA,EAAsFiX,EAA0B,CAAA,mBAAA,CAAA,CAC3H,SAAS,OAAA,CACT,GAAA,CAAKa,GAAsB,MAAA,CAC7B,CAAA,CACF,EACA9X,GAAAA,CAAC+X,CAAAA,CAAA,CACC,QAAA,CAAA/X,GAAAA,CAACgS,EAAA,CACC,QAAA,CAAAhS,IAAC,KAAA,CAAA,CACC,GAAA,CAAI,QACJ,SAAA,CAAW,CAAA,mEAAA,EAAsEiX,EAA0B,CAAA,mBAAA,CAAA,CAC3G,QAAA,CAAS,QACT,GAAA,CAAKY,CAAAA,CACP,EACF,CAAA,CACF,CAAA,CAAA,CACF,EAEA3Q,IAAAA,CAAC0K,CAAAA,CAAA,CACC,QAAA,CAAA,CAAA5R,GAAAA,CAAC6R,IAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAA7R,GAAAA,CAAC,OAAI,SAAA,CAAU,gJAAA,CACX,cAAM,CACN,IAAMgY,EAAMT,CAAAA,CAAqB9Y,CAAI,EAC/BwZ,CAAAA,CACJC,aAAAA,CACAF,CAAG,CAAA,CAEL,OAAOhY,IAACmY,QAAAA,CAAA,CAAa,UAAWH,CAAAA,CAAM,GAAIC,GAAS,EAAC,CAAI,CAC1D,CAAA,GAAG,CACL,EACF,CAAA,CACAjY,GAAAA,CAAC+X,EAAA,CACC,QAAA,CAAA/X,IAACgS,CAAAA,CAAA,CACC,SAAAhS,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,qCAAA,CAAsC,QAAA,CAAA,uBAAA,CAAqB,EAC5E,CAAA,CACF,CAAA,CAAA,CACF,EAEJ,CAAA,CA/CO,IAiDX,CAEA,SAASmX,EAAAA,CAAW,CAAE,KAAA,CAAA5nB,CAAM,CAAA,CAA2C,CACrE,IAAMH,CAAAA,CAASG,EAAM,MAAA,CAAQF,CAAAA,EAAU,EAAQA,CAAAA,CAAM,IAAK,EAAE,KAAA,CAAM,CAAA,CAAG,CAAC,CAAA,CAGhER,CAAAA,CAAa,KAAK,GAAA,CAAIU,CAAAA,CAAM,CAAC,CAAA,EAAG,UAAA,EAAc,EAAGA,CAAAA,CAAM,MAAM,EAKnE,GAAIH,CAAAA,CAAO,SAAW,CAAA,CACpB,OAAIP,EAAa,CAAA,CAEbmR,GAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CACb,SAAAA,GAAAA,CAAC,MAAA,CAAA,CAAK,UAAU,qCAAA,CACb,QAAA,CAAAnR,IAAe,CAAA,CAAI,SAAA,CAAY,GAAGA,CAAU,CAAA,OAAA,CAAA,CAC/C,EACF,CAAA,CAIG,IAAA,CAGT,IAAMupB,CAAAA,CAAgBvpB,CAAAA,CAAaO,EAAO,MAAA,CAE1C,OACE8X,KAAC,KAAA,CAAA,CAAI,SAAA,CAAU,0BACb,QAAA,CAAA,CAAAlH,GAAAA,CAAC,OAAI,SAAA,CAAU,uBAAA,CACZ,SAAA5Q,CAAAA,CAAO,GAAA,CAAKC,GACX2Q,GAAAA,CAAC,KAAA,CAAA,CACC,IAAI,OAAA,CACJ,SAAA,CAAW,oEAAoEiX,EAA0B,CAAA,mBAAA,CAAA,CACzG,SAAS,OAAA,CAET,GAAA,CAAK,GAAGW,GAAe,CAAA,EAAGvoB,EAAM,IAAI,CAAA,iBAAA,CAAA,CAAA,CAD/BA,EAAM,GAEb,CACD,EACH,CAAA,CACC+oB,CAAAA,CAAgB,CAAA,CACflR,IAAAA,CAAC,MAAA,CAAA,CAAK,SAAA,CAAU,8CAA8C,QAAA,CAAA,CAAA,GAAA,CAAEkR,CAAAA,CAAAA,CAAc,EAC5E,IAAA,CAAA,CACN,CAEJ,CClJO,SAASC,EAAAA,CAAS,CAAE,KAAA,CAAA9oB,CAAM,EAA2C,CAC1E,GAAIA,GAAU,IAAA,EAA+BA,CAAAA,GAAU,IAAM,OAAOA,CAAAA,EAAU,SAC5E,OAAOyQ,GAAAA,CAAC8Q,EAAA,CAAsB,KAAA,CAAM,GAAG,CAAA,CAGzC,IAAMwH,EAAO,IAAI,IAAA,CAAK/oB,CAAK,CAAA,CAE3B,GAAI,CAACgpB,OAAAA,CAAQD,CAAI,CAAA,CACf,OAAOtY,GAAAA,CAAC8Q,CAAAA,CAAA,CAAsB,KAAA,CAAM,EAAA,CAAG,EAGzC,IAAMoB,CAAAA,CAAesG,OAAOF,CAAAA,CAAM,aAAa,EAAI,MAAA,CAASE,MAAAA,CAAOF,EAAM,OAAO,CAAA,CAEhF,OAAOtY,GAAAA,CAAC8Q,CAAAA,CAAA,CAAsB,KAAA,CAAOoB,CAAAA,CAAc,CACrD,CCHA,SAASuG,GAAoB3iB,CAAAA,CAAyE,CACpG,OAAO,YAAA,GAAgBA,CACzB,CAEA,SAAS4iB,EAAAA,CAAkBpe,EAA+C,CACxE,OAAOA,EAAK,OAAA,CAASxE,CAAAA,EACf2iB,EAAAA,CAAoB3iB,CAAM,CAAA,CACrBA,CAAAA,CAAO,MAGT,CAACA,CAAM,CACf,CACH,CAEA,SAAS6iB,EAAAA,CAAmBppB,CAAAA,CAAe+K,EAAiD,CAC1F,GAAI,CAACA,CAAAA,CACH,OAAO/K,EAGT,IAAMqpB,CAAAA,CAAQF,GAAkBpe,CAAI,CAAA,CAAE,KAAM5F,CAAAA,EAAS,MAAA,CAAOA,EAAK,KAAK,CAAA,GAAMnF,CAAK,CAAA,CAEjF,OAAKqpB,EAIEA,CAAAA,CAAM,KAAA,CAHJrpB,CAIX,CAEO,SAASspB,GAAO,CACrB,KAAA,CAAAtpB,EACA,OAAA,CAAAkD,CACF,EAGgB,CACd,GAAIlD,GAAU,IAAA,CACZ,OAAOyQ,IAAC8Q,CAAAA,CAAA,CAAsB,MAAM,EAAA,CAAG,CAAA,CAGzC,IAAMgI,CAAAA,CAAc,MAAA,CAAOvpB,CAAK,CAAA,CAC1B2iB,CAAAA,CAAeyG,GAAmBG,CAAAA,CAAarmB,CAAAA,EAAS,IAAI,CAAA,CAElE,OAAOuN,IAAC8Q,CAAAA,CAAA,CAAsB,MAAOoB,CAAAA,CAAc,CACrD,CCvDO,SAAS6G,EAAAA,CAAK,CAAE,KAAA,CAAAxpB,CAAM,EAAsB,CACjD,OAAI,CAACA,CAAAA,EAAS,CAACA,EAAM,KAAA,CAAM,GAAG,EAAE,MAAA,CACvB,IAAA,CAIPyQ,GAAAA,CAAC,KAAA,CAAA,CAAI,SAAA,CAAU,sDAAA,CACZ,SAAAzQ,CAAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAKypB,GACrBhZ,GAAAA,CAACiZ,GAAAA,CAAA,CACC,SAAA,CAAU,mEAAA,CAEV,QAAQ,WAAA,CAEP,QAAA,CAAAD,GAHIA,CAIP,CACD,EACH,CAEJ,CCJO,SAASE,EAAAA,CAAe3pB,EAAgB4pB,CAAAA,CAA0B,CAAA,CAAwC,CAC/G,IAAM7oB,CAAAA,CAAQ,OAAO,QAAA,CAAS6oB,CAAG,GAAMA,CAAAA,EAAkB,CAAA,CAAI,KAAK,KAAA,CAAMA,CAAa,EAAI,CAAA,CACnFC,CAAAA,CAAU,OAAO7pB,CAAAA,EAAU,QAAA,EAAYA,CAAAA,CAAM,MAAK,GAAM,EAAA,CAAK,OAAOA,CAAK,CAAA,CAAIA,EAEnF,GAAI,OAAO6pB,GAAY,QAAA,EAAY,CAAC,OAAO,QAAA,CAASA,CAAO,EACzD,OAAO,IAAA,CAGT,IAAMC,CAAAA,CAAS,IAAA,CAAK,IAAI/oB,CAAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAG,IAAA,CAAK,MAAM8oB,CAAO,CAAC,CAAC,CAAA,CAE/D,OAAO,CAAE,MAAA,CAAAC,CAAAA,CAAQ,IAAK/oB,CAAAA,CAAO,KAAA,CAAO,GAAG,MAAA,CAAO+oB,CAAM,CAAC,CAAA,QAAA,EAAW,MAAA,CAAO/oB,CAAK,CAAC,CAAA,MAAA,CAAS,CACxF,CChBO,SAASgpB,EAAAA,CAAO,CAAE,KAAA,CAAA/pB,CAAAA,CAAO,QAAAkD,CAAQ,CAAA,CAAuB,CAC7D,IAAM8mB,CAAAA,CAAQL,GAAe3pB,CAAAA,CAAOkD,CAAAA,EAAS,GAAG,CAAA,CAEhD,OAAK8mB,EAKHvZ,GAAAA,CAAC,MAAA,CAAA,CAAK,aAAYuZ,CAAAA,CAAM,KAAA,CAAO,UAAU,2CAAA,CAA4C,IAAA,CAAK,MAAM,KAAA,CAAOA,CAAAA,CAAM,MAC1G,QAAA,CAAA,KAAA,CAAM,IAAA,CAAK,CAAE,MAAA,CAAQA,CAAAA,CAAM,GAAI,CAAA,CAAG,CAACC,EAAGxqB,CAAAA,GACrCgR,GAAAA,CAACyZ,KAAA,CACC,aAAA,CAAW,KACX,SAAA,CACEzqB,CAAAA,CAAQuqB,EAAM,MAAA,CACV,uDAAA,CACA,oEAGN,WAAA,CAAa,GAAA,CAAA,CADRvqB,CAEP,CACD,CAAA,CACH,EAjBOgR,GAAAA,CAAC,MAAA,CAAA,EAAK,CAmBjB,CClCA,IAAM0Z,EAAAA,CAAkB,mCAAA,CASxB,SAASC,EAAAA,CAAmB/D,CAAAA,CAAqB,CAC/C,GAAI,CACF,GAAM,CAAE,QAAA,CAAAgE,CAAS,CAAA,CAAI,IAAI,IAAIhE,CAAG,CAAA,CAGhC,OAFgBgE,CAAAA,CAAS,KAAA,CAAM,GAAG,EAAE,GAAA,EAAI,EAEtBA,CACpB,CAAA,KAAQ,CACN,GAAM,CAACA,CAAQ,EAAIhE,CAAAA,CAAI,KAAA,CAAM,GAAG,CAAA,CAEhC,OAAOgE,CACT,CACF,CAEO,SAASC,EAAAA,CAAiBxqB,CAAAA,CAA+B,CAC9D,OAAIA,CAAAA,CAAM,iBACDA,CAAAA,CAAM,gBAAA,CAGXA,EAAM,IAAA,CACDA,CAAAA,CAAM,KAGXA,CAAAA,CAAM,GAAA,CACDsqB,GAAmBtqB,CAAAA,CAAM,GAAG,EAG9B,EACT,CAEO,SAASyqB,EAAAA,CAAsBzqB,CAAAA,CAA+B,CACnE,IAAM0qB,CAAAA,CAAWF,EAAAA,CAAiBxqB,CAAK,CAAA,CACjC,CAACooB,CAAK,CAAA,CAAIsC,CAAAA,CAAS,MAAM,GAAG,CAAA,CAC5BrC,EAAQD,CAAAA,CAAM,KAAA,CAAM,GAAG,CAAA,CAE7B,OAAIC,EAAM,MAAA,CAAS,CAAA,CACVA,EAAM,GAAA,EAAI,CAAG,aAAY,CAG3B,MACT,CAEO,SAASsC,EAAAA,CAAa3qB,EAAgC,CAC3D,OAAIA,EAAM,QAAA,CACDA,CAAAA,CAAM,SAAS,UAAA,CAAW,QAAQ,EAGpCqqB,EAAAA,CAAgB,IAAA,CAAKG,GAAiBxqB,CAAK,CAAC,CACrD,CAEO,SAAS4qB,GAAiBrE,CAAAA,CAAasE,CAAAA,CAAkD,CAK9F,GAJI,CAACtE,CAAAA,EAAO,CAACsE,CAAAA,EAITP,EAAAA,CAAmB/D,CAAG,CAAA,CAAE,WAAA,GAAc,QAAA,CAAS,MAAM,EACvD,OAAOA,CAAAA,CAGT,IAAMuE,CAAAA,CAAS,IAAI,gBAAgB,CACjC,CAAA,CAAG,OACH,CAAA,CAAG,MAAA,CAAOD,EAAK,MAAM,CAAA,CACrB,EAAG,MAAA,CAAOA,CAAAA,CAAK,KAAK,CACtB,CAAC,EACKE,CAAAA,CAAYxE,CAAAA,CAAI,SAAS,GAAG,CAAA,CAAI,IAAM,GAAA,CAE5C,OAAO,GAAGA,CAAG,CAAA,EAAGwE,CAAS,CAAA,EAAGD,CAAAA,CAAO,UAAU,CAAA,CAC/C,CCrDA,IAAME,EAAAA,CAAqBlC,SAErBlB,EAAAA,CACJ,6bAAA,CAEK,SAASC,EAAAA,CAAM,CAAE,MAAA3nB,CAAM,CAAA,CAAkD,CAC9E,GAAM,CAAC+qB,EAAYC,CAAa,CAAA,CAAI1a,SAAS,KAAK,CAAA,CAC5C+V,EAAMrmB,CAAAA,EAAO,GAAA,EAAO,GAE1B,GAAI,CAACA,GAAU,CAACqmB,CAAAA,EAAO,CAACrmB,CAAAA,CAAM,IAAA,EAAQ,CAACA,CAAAA,CAAM,gBAAA,CAC3C,OAAO,IAAA,CAKT,GAAI,EAFYyqB,EAAAA,CAAazqB,CAAK,CAAA,EAAK,EAAQqmB,CAAAA,CAAAA,CAEjC,CACZ,IAAMoC,CAAAA,CAAM8B,EAAAA,CAAsBvqB,CAAK,CAAA,CACjC0oB,CAAAA,CACJC,cAGAF,CAAG,CAAA,CAEL,OACEhY,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CACb,QAAA,CAAAA,IAAC8M,CAAAA,CAAA,CACC,SAAA5F,IAAAA,CAAC0K,CAAAA,CAAA,CACC,QAAA,CAAA,CAAA5R,GAAAA,CAAC6R,IAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAA7R,GAAAA,CAAC,OAAI,SAAA,CAAU,gJAAA,CACb,SAAAA,GAAAA,CAACqa,EAAAA,CAAA,CAAmB,SAAA,CAAWrC,CAAAA,CAAM,GAAIC,CAAAA,EAAS,EAAC,CAAI,CAAA,CACzD,CAAA,CACF,CAAA,CACAjY,IAAC+X,CAAAA,CAAA,CACC,SAAA/X,GAAAA,CAACgS,CAAAA,CAAA,CACC,QAAA,CAAAhS,GAAAA,CAAC,OAAI,SAAA,CAAU,qCAAA,CAAsC,iCAAqB,CAAA,CAC5E,CAAA,CACF,GACF,CAAA,CACF,CAAA,CACF,CAEJ,CAEA,IAAMwa,IAAeP,EAAAA,CAAiBrE,CAAAA,CAAK,CAAE,KAAA,CAAO,EAAA,CAAI,OAAQ,EAAG,CAAC,EAC9DiC,CAAAA,CAAUoC,EAAAA,CAAiBrE,EAAK,CAAE,KAAA,CAAO,IAAK,MAAA,CAAQ,GAAI,CAAC,CAAA,CAEjE,SAAS6E,EAAqB7N,CAAAA,CAA2C,CACvEA,CAAAA,CAAM,eAAA,EAAgB,CACtB2N,CAAAA,CAAc,IAAI,EACpB,CAEA,OACEva,GAAAA,CAAC,KAAA,CAAA,CAAI,UAAU,SAAA,CACb,QAAA,CAAAkH,KAAC4F,CAAAA,CAAA,CACC,UAAA5F,IAAAA,CAAC0K,CAAAA,CAAA,CACC,QAAA,CAAA,CAAA5R,GAAAA,CAAC6R,IAAA,CAAe,OAAA,CAAO,KACrB,QAAA,CAAA7R,GAAAA,CAAC,OACC,GAAA,CAAKwa,GAAAA,CACL,IAAI,OAAA,CACJ,SAAA,CAAW,wFAAwFvD,EAA0B,CAAA,mBAAA,CAAA,CAC7H,QAASwD,CAAAA,CACX,CAAA,CACF,EACAza,GAAAA,CAAC+X,CAAAA,CAAA,CACC,QAAA,CAAA/X,GAAAA,CAACgS,EAAA,CACC,QAAA,CAAAhS,IAAC,KAAA,CAAA,CACC,GAAA,CAAK6X,EACL,GAAA,CAAI,OAAA,CACJ,UAAW,CAAA,mEAAA,EAAsEZ,EAA0B,sBAC7G,CAAA,CACF,CAAA,CACF,GACF,CAAA,CACAjX,GAAAA,CAAC0a,IAAA,CAAO,IAAA,CAAMJ,EAAY,YAAA,CAAcC,CAAAA,CACtC,SAAArT,IAAAA,CAACyT,GAAAA,CAAA,CAAc,SAAA,CAAU,wBAAA,CACvB,UAAAzT,IAAAA,CAAC0T,CAAAA,CAAA,CACC,QAAA,CAAA,CAAA5a,GAAAA,CAAC6a,EAAA,CAAY,SAAA,CAAU,aAAa,QAAA,CAAA,eAAA,CAAa,CAAA,CACjD7a,IAAC8a,CAAAA,CAAA,CAAkB,UAAU,YAAA,CAAa,QAAA,CAAA,wBAAA,CAAsB,GAClE,CAAA,CACA9a,GAAAA,CAAC,KAAA,CAAA,CACC,GAAA,CAAK4V,CAAAA,CACL,GAAA,CAAI,QACJ,SAAA,CAAW,iGAAA,CACb,GACF,CAAA,CACF,CAAA,CAAA,CACF,EACF,CAEJ,CC5FA,IAAMmF,EAAAA,CAAuB,IAAI,IAAe,CAC9C,MAAA,CACA,SACA,UAAA,CACA,QAAA,CACA,QACF,CAAC,CAAA,CAWM,SAASC,EAAAA,CAA+D,CAC7E,iBAAAC,CAAAA,CACA,cAAA,CAAAC,EACA,gBAAA,CAAAC,CAAAA,CACA,oBAAAC,CAAAA,CAAsB,KACxB,EAAoD,CAClD,GAAM,EAAGC,GAAI,EAAIC,GAAAA,EAAQ,CAGnBC,CAAAA,CAA0BC,GAAAA,CAA0BP,CAAAA,CAAkBI,GAAAA,CAAK,MAAM,MAAM,CAAA,CACvFI,EAA6B,CACjC,QAAA,CAAY,WACZ,MAAA,CAAU,QAAA,CACV,MAAS,OAAA,CACT,MAAA,CAAU,OACV,YAAA,CAAgB,MAAA,CAChB,OAAU,QAAA,CACV,MAAA,CAAU,UACV,IAAA,CAAQ,MAAA,CACR,SAAY,MACd,CAAA,CACMC,EAA4B,CAChC,OAAA,CAAWjL,GACX,IAAA,CAAQwB,EAAAA,CACR,SAAYoG,EAAAA,CACZ,MAAA,CAAUlD,GACV,KAAA,CAAS+B,EAAAA,CACT,OAAUjF,EAAAA,CACV,YAAA,CAAgBA,GAChB,MAAA,CAAU4G,EAAAA,CACV,OAAUpI,EAAAA,CACV,IAAA,CAAQwB,EAAAA,CACR,QAAA,CAAYA,EAAAA,CACZ,IAAA,CAAQ8G,GACR,MAAA,CAAUO,EAAAA,CAEV,kBAAqBpC,EACvB,CAAA,CAEMyE,EAAOJ,CAAAA,CACV,GAAA,CAAK5tB,GAAc,CAElB,GAAIA,EAAU,IAAA,GAAS,YAAA,CACrB,OAAO,IAAA,CAGT,IAAMiuB,GACHjuB,CAAAA,CAAU,SAAA,GAAc,gBAAkBA,CAAAA,CAAU,YAAA,EAAc,SAAW,QAAA,CAAW,OAAA,CAAU,SACnGA,CAAAA,CAAU,WAAA,EACV8tB,EAA2B9tB,CAAAA,CAAU,SAAoD,EAErFkuB,CAAAA,CACHH,CAAAA,CAA0BE,CAAqD,CAAA,EAE9DF,CAAAA,CAA0B,KAE9C,GAAI/tB,CAAAA,CAAU,SAAW,IAAA,CACvB,OAAO,KAGT,IAAMmuB,CAAAA,CAAgBF,IAAgB,MAAA,CAGhCG,CAAAA,CACJX,GACAztB,CAAAA,CAAU,KAAA,GAAU,UACpBotB,EAAAA,CAAqB,GAAA,CAAIptB,EAAU,SAAS,CAAA,CAE9C,OAAO,CACL,WAAA,CAAaA,EAAU,IAAA,CACvB,QAAA,CAAU,CAACoY,CAAAA,CAAiBjL,CAAAA,CAAYvL,IAClCusB,CAAAA,CACK,IAAA,CAAA,CAGc,MAAM,OAAA,CAAQvsB,CAAK,EAAIA,CAAAA,CAAQ,CAACA,CAAK,CAAA,EAEtC,QAAA,CAASwW,EAAI,QAAA,CAASjL,CAAE,CAAC,CAAA,CAEjD,MAAA,CAAQ,CAAC,CAAE,MAAA,CAAA4Q,CAAO,CAAA,GAChBqQ,CAAAA,CACE/b,GAAAA,CAAC6P,EAAAA,CAAA,CAAsB,MAAA,CAAQnE,EAAQ,KAAA,CAAO/d,CAAAA,CAAU,MAAO,CAAA,CAE/DqS,GAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CAA2B,SAAArS,CAAAA,CAAU,KAAA,CAAM,EAE9D,IAAA,CAAM,CAAC,CAAE,GAAA,CAAAoY,CAAI,IAAkC,CAC7C,IAAMiW,EAAmBH,CAAAA,CAMzB,OAAID,IAAgB,QAAA,EAAYA,CAAAA,GAAgB,SAE5C5b,GAAAA,CAACgc,CAAAA,CAAA,CACC,KAAA,CAAOjW,CAAAA,CAAI,SAASpY,CAAAA,CAAU,IAAI,EAClC,OAAA,CAASA,CAAAA,CAAU,QACrB,CAAA,CAIAiuB,CAAAA,GAAgB,oBACX5b,GAAAA,CAACgc,CAAAA,CAAA,CAAiB,KAAA,CAAOjW,CAAAA,CAAI,QAAA,CAAU,EAGzC/F,GAAAA,CAACgc,CAAAA,CAAA,CAAiB,KAAA,CAAOjW,CAAAA,CAAI,SAASpY,CAAAA,CAAU,IAAI,EAAG,CAChE,CAAA,CACA,cAAeouB,CAAAA,CACf,YAAA,CAAc,KACd,IAAA,CAAM,CACJ,MAAOpuB,CAAAA,CAAU,KACnB,EACA,IAAA,CAAMA,CAAAA,CAAU,SAAS,IAAA,EAAQ,GACnC,CACF,CAAC,CAAA,CACA,OAAQ+d,CAAAA,EAAWA,CAAAA,GAAW,IAAI,CAAA,CAE/B4C,CAAAA,CAAU,CACd,EAAA,CAAI,SAAA,CACJ,KAAM,CAAC,CAAE,IAAAvI,CAAI,CAAA,GAAmCoV,CAAAA,CAAmBA,CAAAA,CAAiBpV,CAAG,CAAA,CAAI,KAC3F,IAAA,CAAM,EACR,EAEMjR,CAAAA,CAAY,CAChB,YAAa,YAAA,CACb,MAAA,CAAQ,CAAC,CAAE,MAAA,CAAA4W,CAAO,CAAA,GAChB0P,CAAAA,CACEpb,IAAC6P,EAAAA,CAAA,CAAsB,OAAQnE,CAAAA,CAAQ,KAAA,CAAM,aAAa,CAAA,CAE1D1L,GAAAA,CAAC,OAAI,SAAA,CAAU,yBAAA,CAA0B,sBAAU,CAAA,CAEvD,IAAA,CAAM,CAAC,CAAE,GAAA,CAAA+F,CAAI,CAAA,GACX/F,GAAAA,CAACqY,GAAA,CAAqB,KAAA,CAAOtS,EAAI,QAAA,CAAS,YAAY,EAAG,CAAA,CAE3D,aAAA,CAAeqV,EACf,YAAA,CAAc,KAAA,CACd,KAAM,CACJ,KAAA,CAAO,YACT,CAAA,CACA,IAAA,CAAM,GACR,CAAA,CAEMa,CAAAA,CAAuB,CAC3B,EAAA,CAAI,QAAA,CACJ,KAAM,CAAC,CAAE,IAAAlW,CAAAA,CAAK,KAAA,CAAAyE,CAAM,CAAA,GAClBxK,GAAAA,CAACkc,EAAA,CACC,YAAA,CAAW,aACX,OAAA,CAASnW,CAAAA,CAAI,eAAc,CAC3B,eAAA,CAAkBxW,GAAU,CAC1Bib,CAAAA,CAAM,0BAA0B,KAAK,CAAA,CACrCzE,EAAI,cAAA,CAAe,CAAA,CAAQxW,CAAM,EACnC,CAAA,CACF,EAEF,aAAA,CAAe,KAAA,CACf,YAAA,CAAc,KAAA,CACd,IAAA,CAAM,EACR,EAEM4sB,CAAAA,CAAyB,CAC7B,GAAI,QAAA,CACJ,MAAA,CAAQ,CAAC,CAAE,KAAA,CAAA3R,CAAM,CAAA,GACfxK,GAAAA,CAACkc,EAAA,CACC,SAAA,CAAU,sBACV,YAAA,CAAW,YAAA,CACX,QAAS1R,CAAAA,CAAM,wBAAA,IAA+BA,CAAAA,CAAM,yBAAA,IAA+B,eAAA,CACnF,eAAA,CAAkBjb,GAAU,CAC1Bib,CAAAA,CAAM,0BAA0B,CAAA,CAAQjb,CAAM,EAChD,CAAA,CACF,CAAA,CAEF,KAAM,CAAC,CAAE,IAAAwW,CAAI,CAAA,GACX/F,IAACkc,CAAAA,CAAA,CACC,YAAA,CAAW,YAAA,CACX,OAAA,CAASnW,CAAAA,CAAI,eAAc,CAC3B,eAAA,CAAkBxW,GAAU,CAC1BwW,CAAAA,CAAI,eAAe,CAAA,CAAQxW,CAAM,EACnC,CAAA,CACF,CAAA,CAEF,cAAe,KAAA,CACf,YAAA,CAAc,MACd,IAAA,CAAM,EACR,EAEA,OAAO,CACL,GAAI2rB,CAAAA,GAAmB,QAAA,CAAW,CAACe,CAAoB,CAAA,CAAI,EAAC,CAC5D,GAAIf,IAAmB,UAAA,CAAa,CAACiB,CAAsB,CAAA,CAAI,GAC/D,GAAIhB,CAAAA,CAAmB,CAAC7M,CAAO,CAAA,CAAI,EAAC,CACpC,GAAGqN,CAAAA,CACH7mB,CACF,CACF","file":"chunk-OUSEULBR.js","sourcesContent":["import type { Attribute, ScopeType } from './types';\n\nexport function getAttributeScope(attribute: Attribute): ScopeType {\n if (attribute.dataType === 'asset') {\n return 'global';\n }\n\n return attribute.scope;\n}\n","import { find, omit, pick, propEq, toPairs, uniq } from 'ramda';\nimport { getAttributeScope } from '../core/attribute-scope';\nimport { getDisplayAttribute } from '../core/get-display-attribute';\nimport { assetSchema } from '../entities/assets-schema';\nimport { tagSchema } from '../entities/tags-schema';\nimport type { User } from '../auth/types';\nimport type { Attribute, Entity, DataType, Schema, ScopeType, MultipleRelationshipConnection } from '../core/types';\nimport type {\n AttributeValue,\n EntityItem,\n EntityQueryResults,\n FormEntityItem,\n FormFieldValue,\n MappedEntityItem,\n MappedEntityQueryResults,\n MappedFormEntityQueryResults,\n EntityQueryResult,\n ImageValue,\n OrderedAssetValue,\n EntityQuerySelection,\n} from './types';\n\ntype EntityQuery = {\n queryEntityName: string;\n query: string;\n};\n\nexport type EntityQueryCountMode = 'aggregate' | 'total';\nexport type SortNotNullWhere = {\n NOT: {\n [attributeName: string]: {\n eq: null;\n };\n };\n};\n\n/** Page size for asset connections in forms (galleries, ordered assets). */\nexport const FULL_ASSET_CONNECTION_LIMIT = 25;\n/** List grids render at most 3 stacked asset thumbnails (plus a \"+N\" badge). */\nconst LIST_ASSET_CONNECTION_LIMIT = 3;\n/** Grids preview at most 3 nested relationship values (sliceFirstThreeItems). */\nconst NESTED_RELATIONSHIP_LIMIT = 3;\n\nconst stringTypes: DataType[] = ['id', 'string'];\nconst temporalTypes: DataType[] = ['date', 'datetime', 'duration', 'time'];\nconst assetFields = `_id\n originalFilename\n mimeType\n path\n url\n size\n height\n width\n lqip`;\n\nconst assetFieldsWithoutLqip = `_id\n originalFilename\n mimeType\n path\n url\n size\n height\n width`;\n/** List grids resolve thumbnails from the asset URL; extra metadata is unused. */\nconst listAssetPreviewFields = `_id\n path\n url`;\n\ntype AssetRelationshipConnection = {\n aggregate?: {\n count?: {\n nodes?: number;\n };\n };\n edges?: {\n properties?: {\n sortOrder?: number | null;\n } | null;\n node?: OrderedAssetValue | null;\n }[];\n};\n\nfunction isAssetRelationshipAttribute(attribute: Attribute | undefined): boolean {\n if (!attribute) {\n return false;\n }\n\n return (\n getAttributeScope(attribute) === 'relationship' &&\n attribute.relationship?.mode === 'multiple' &&\n attribute.relationship.entity === '_asset'\n );\n}\n\nfunction hasOrderedAssetConnectionProperties(attribute: Attribute | undefined, entity: Entity | undefined): boolean {\n if (!attribute || !isAssetRelationshipAttribute(attribute)) {\n return false;\n }\n\n return entity?.name !== tagSchema.name || attribute.name !== 'assets';\n}\n\nfunction isAssetAttribute(attribute: Attribute | undefined): boolean {\n return attribute?.dataType === 'asset' || attribute?.inputType === 'asset';\n}\n\nexport function getOrderedAssetsFromConnection(connection: unknown): OrderedAssetValue[] {\n const typedConnection = connection as AssetRelationshipConnection | undefined;\n const edges = typedConnection?.edges ?? [];\n // Edges are bounded by `first`; the aggregate count carries the real total so\n // consumers (e.g. the \"+N\" badge in list grids) do not undercount.\n const totalCount = typedConnection?.aggregate?.count?.nodes ?? edges.length;\n\n return edges\n .reduce<OrderedAssetValue[]>((result, edge, index) => {\n if (!edge.node) {\n return result;\n }\n\n result.push({\n ...edge.node,\n sortOrder: edge.properties?.sortOrder ?? index,\n totalCount,\n });\n\n return result;\n }, [])\n .sort((a, b) => (a.sortOrder ?? Number.MAX_SAFE_INTEGER) - (b.sortOrder ?? Number.MAX_SAFE_INTEGER));\n}\n\n/** Build the sort-order map update mutations use to detect new vs existing assets. */\nexport function getKnownAssetSortOrders(assets: OrderedAssetValue[]): { [id: string]: number } {\n return assets.reduce<{ [id: string]: number }>((result, asset, index) => {\n if (!asset._id) {\n return result;\n }\n\n return {\n ...result,\n [asset._id]: asset.sortOrder ?? index,\n };\n }, {});\n}\n\n/**\n * Relationship fields are list-typed in the generated schema ([Type!]!), so\n * single-valued fields (local attributes, global assets, single-mode\n * relationships) come back as arrays of 0..1 nodes. Unwraps to the first node,\n * tolerating the legacy single-object shape.\n */\nfunction unwrapNode(value: unknown): AttributeValue | null {\n if (Array.isArray(value)) {\n return (value[0] as AttributeValue | undefined) ?? null;\n }\n\n return (value as AttributeValue | null) ?? null;\n}\n\n/**\n * Asset connections must always be bounded: without `first` the generated\n * Cypher expands every connected asset per row (tags with thousands of assets\n * made list queries take seconds). The aggregate count is still selected, so\n * consumers can show \"+N more\" from `totalCount`.\n */\nfunction getAssetConnectionNodeFields(includeLqip: boolean, previewOnly: boolean): string {\n if (previewOnly) {\n return listAssetPreviewFields;\n }\n\n if (includeLqip) {\n return assetFields;\n }\n\n return assetFieldsWithoutLqip;\n}\n\nfunction getAssetConnectionSelection(\n attributeName: string,\n includeProperties = true,\n includeLqip = true,\n first = FULL_ASSET_CONNECTION_LIMIT,\n previewOnly = false\n): string {\n const propertiesSelection = includeProperties\n ? ` properties {\\n` + ` sortOrder\\n` + ` }\\n`\n : '';\n const nodeFields = getAssetConnectionNodeFields(includeLqip, previewOnly);\n // Edge sort input only exists when the relationship carries properties.\n const connectionArguments = includeProperties\n ? `(first: ${first}, sort: [{ edge: { sortOrder: ASC } }])`\n : `(first: ${first})`;\n\n return (\n ` ${attributeName}Connection${connectionArguments} {\\n` +\n ` aggregate {\\n` +\n ` count {\\n` +\n ` nodes\\n` +\n ` }\\n` +\n ` }\\n` +\n ` edges {\\n` +\n propertiesSelection +\n ` node {\\n` +\n ` ${nodeFields}\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n`\n );\n}\n\n/**\n * Counts moved inside connection fields in Neo4j GraphQL v7:\n * xConnection \\{ aggregate \\{ count \\{ nodes \\} \\} \\}. Reads that shape back.\n */\nfunction getConnectionCount(value: unknown): number {\n const aggregate = (value as { aggregate?: { count?: { nodes?: number } } } | null | undefined)?.aggregate;\n\n return aggregate?.count?.nodes ?? 0;\n}\n\nfunction getEntityCount(results: EntityQueryResults, entityNamePlural: string): number {\n const total = results[`${entityNamePlural}Total`];\n\n if (typeof total === 'number') {\n return total;\n }\n\n return getConnectionCount(results[`${entityNamePlural}Connection`]);\n}\n\nfunction getConnectionCountSelection(fieldName: string, whereArgument = ''): string {\n return (\n ` ${fieldName}Connection${whereArgument} {\\n` +\n ` aggregate {\\n` +\n ` count {\\n` +\n ` nodes\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n`\n );\n}\n\nfunction getTopLevelCountSelection(\n entityNamePlural: string,\n includeCount: boolean,\n countMode: EntityQueryCountMode\n): string {\n if (!includeCount) {\n return '';\n }\n\n if (countMode === 'total') {\n return ` ${entityNamePlural}Total\\n`;\n }\n\n return getConnectionCountSelection(entityNamePlural, '(where: $where)');\n}\n\n/**\n * Selection set for a related entity's display attribute only — enough for list-grid\n * relationship columns (mapQueryResult / sliceFirstThreeItems).\n */\nfunction getDisplayAttributeSelection(\n primaryAttribute: Attribute | undefined,\n scope: string,\n schema: Schema,\n forList = false\n): string {\n if (!primaryAttribute) {\n return '';\n }\n\n const additionalScope = scope === 'default' ? '' : `${scope}\\n `;\n\n if (isAssetAttribute(primaryAttribute)) {\n if (forList) {\n return ` ${primaryAttribute.name} {\\n _id\\n path\\n url\\n }\\n`;\n }\n\n return ` ${primaryAttribute.name} {\\n ${assetFields}\\n }\\n`;\n }\n\n if (getAttributeScope(primaryAttribute) === 'local') {\n return ` ${primaryAttribute.name} {\\n _id\\n default\\n ${additionalScope}}\\n`;\n }\n\n if (getAttributeScope(primaryAttribute) === 'relationship') {\n const field = primaryAttribute.relationship?.field;\n\n if (!field) {\n return ` ${primaryAttribute.name}\\n`;\n }\n\n const nestedEntity = find(propEq(primaryAttribute.relationship?.entity, 'name'))(schema) as Entity | undefined;\n const fieldAttribute = find(propEq(field, 'name'))(nestedEntity?.attributes ?? []) as Attribute | undefined;\n const localAttributeQuery =\n fieldAttribute && getAttributeScope(fieldAttribute) === 'local'\n ? `{\\n _id\\n default\\n ${additionalScope}}\\n`\n : '';\n\n if (primaryAttribute.relationship?.mode === 'single') {\n return ` ${primaryAttribute.name} {\\n ${field} ${localAttributeQuery}}\\n`;\n }\n\n return ` ${primaryAttribute.name} (limit: 3, offset: 0) {\\n ${field} ${localAttributeQuery}}\\n`;\n }\n\n return ` ${primaryAttribute.name}\\n`;\n}\n\nfunction getFullRelatedEntityAttributesSelection(\n relatedEntity: Entity | undefined,\n scope: string,\n schema: Schema\n): string {\n return (\n relatedEntity?.attributes.reduce((relatedAcc, relatedAttribute) => {\n const additionalScope = scope === 'default' ? '' : `${scope}\\n `;\n\n // Related-entity assets only render as CDN-path thumbnails in grids; the\n // base64 lqip payload is form-field-only and skipped at this depth.\n if (isAssetAttribute(relatedAttribute)) {\n return `${relatedAcc}\\n ${relatedAttribute.name} {\\n ${assetFieldsWithoutLqip}\\n }\\n `;\n }\n\n if (getAttributeScope(relatedAttribute) === 'local') {\n return `${relatedAcc}\\n ${relatedAttribute.name} {\\n _id\\n default\\n ${additionalScope}\\n}\\n `;\n }\n\n if (getAttributeScope(relatedAttribute) === 'relationship') {\n const relationshipEntity = find(propEq(relatedAttribute.relationship?.entity, 'name'))(schema) as\n | Entity\n | undefined;\n const relationshipAttribute = find(propEq(relatedAttribute.relationship?.field, 'name'))(\n relationshipEntity?.attributes ?? []\n ) as Attribute;\n const localAttributeQuery =\n getAttributeScope(relationshipAttribute) === 'local'\n ? `{\\n _id\\n default\\n ${additionalScope}}\\n `\n : '';\n\n if (relatedAttribute.relationship?.mode === 'single') {\n return `${relatedAcc}\\n ${relatedAttribute.name} {\\n ${relatedAttribute.relationship.field} ${localAttributeQuery}}\\n `;\n }\n\n if (relatedAttribute.relationship?.field) {\n return `${relatedAcc}\\n ${relatedAttribute.name} (limit: ${NESTED_RELATIONSHIP_LIMIT}, offset: 0) {\\n ${relatedAttribute.relationship.field} ${localAttributeQuery}}\\n `;\n }\n }\n\n return `${relatedAcc}\\n ${relatedAttribute.name}\\n `;\n }, '') ?? ''\n );\n}\n\nfunction getAttributesByName(attributes: Attribute[]): { [name: string]: Attribute | undefined } {\n const attributesByName: { [name: string]: Attribute | undefined } = {};\n\n for (const attribute of attributes) {\n attributesByName[attribute.name] = attribute;\n }\n\n return attributesByName;\n}\n\nfunction shouldSelectAttributeInList(attribute: Attribute | undefined): boolean {\n if (!attribute) {\n return false;\n }\n\n // Computed asset URL is hidden from the grid but required to preview and copy links.\n if (attribute.name === 'url') {\n return true;\n }\n\n if (attribute.hidden === true || attribute.name === 'lqip') {\n return false;\n }\n\n return true;\n}\n\nexport function getSortNotNullWhere(sort: unknown, entity: Entity | undefined): SortNotNullWhere | undefined {\n if (!Array.isArray(sort) || sort.length === 0) {\n return undefined;\n }\n\n const [primarySort] = sort;\n\n if (!primarySort || typeof primarySort !== 'object') {\n return undefined;\n }\n\n const [sortAttributeName] = Object.keys(primarySort);\n\n if (!sortAttributeName || ['_id', '_createdAt', '_updatedAt'].includes(sortAttributeName)) {\n return undefined;\n }\n\n const sortAttribute = entity?.attributes.find((attribute) => attribute.name === sortAttributeName);\n\n if (\n !sortAttribute ||\n getAttributeScope(sortAttribute) !== 'global' ||\n sortAttribute.dataType === 'asset'\n ) {\n return undefined;\n }\n\n return {\n NOT: {\n [sortAttributeName]: {\n eq: null,\n },\n },\n };\n}\n\nexport function getEntityQuery(\n entityNamePlural: string,\n scope: string,\n schema: Schema,\n options?: {\n selection?: EntityQuerySelection;\n /**\n * The top-level aggregate count is a filtered label scan on the server.\n * Pagination pages (fetchMore) skip it — the total from the first page\n * still stands.\n */\n includeCount?: boolean;\n countMode?: EntityQueryCountMode;\n operationName?: string;\n }\n): EntityQuery {\n const requestedSelection = options?.selection ?? 'full';\n const selection = requestedSelection === 'display' ? 'list' : requestedSelection;\n const includeCount = options?.includeCount ?? true;\n const countMode = options?.countMode ?? 'aggregate';\n const filters = `(where: $where, limit: $limit, offset: $offset, sort: $sort)`;\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const entityName = entitySchema?.name ?? entityNamePlural;\n const displayAttribute = getDisplayAttribute(entitySchema);\n const attributes = requestedSelection === 'display'\n ? (displayAttribute ? [displayAttribute] : [])\n : entitySchema?.attributes ?? [];\n const attributesByName = getAttributesByName(attributes);\n const heading = `$where: ${entityName}Where, $limit: Int, $offset: Int, $sort: [${entityName}Sort!]`;\n const operationName = options?.operationName ?? `Get${getOperationEntityName(entityNamePlural)}`;\n\n if (!entitySchema) {\n throw new Error(`Entity '${entityName}' not found in the schema`);\n }\n\n if (attributes.length === 0) {\n throw new Error(`Entity '${entityName}' has no attributes defined in the schema`);\n }\n\n const globalAttributesList: string = getAttributeListByScope('global', attributes)\n .filter((attributeName) => {\n if (attributeName === '_updatedAt') {\n return false;\n }\n\n if (selection === 'list') {\n return requestedSelection === 'display' || shouldSelectAttributeInList(attributesByName[attributeName]);\n }\n\n return true;\n })\n .join('\\n ');\n const imageAttributes = getImageAttributes(attributes).filter((attributeName) =>\n selection !== 'list' || requestedSelection === 'display' || shouldSelectAttributeInList(attributesByName[attributeName])\n );\n const localAttributes: readonly string[] = getAttributeListByScope(['local'], attributes).filter((attributeName) => {\n if (selection !== 'list') {\n return true;\n }\n\n return requestedSelection === 'display' || shouldSelectAttributeInList(attributesByName[attributeName]);\n });\n const defaultScopedAttr = localAttributes.reduce(\n (acc, attribute) => `${acc}\\n ${attribute} {\\n _id\\n default\\n }\\n `,\n ''\n );\n const scopedAttribute = localAttributes.reduce(\n (acc, attribute) => `${acc}\\n ${attribute} {\\n _id\\n default\\n ${scope}\\n }\\n `,\n ''\n );\n const localAttributesList: string = scope === 'default' ? defaultScopedAttr : scopedAttribute;\n let imageFieldsSelection = `_id\\n path\\n url`;\n\n if (selection !== 'list') {\n imageFieldsSelection =\n `_id\\n originalFilename\\n mimeType\\n path\\n url\\n size\\n height\\n width\\n lqip`;\n }\n\n const imageAttributesList: string = imageAttributes.reduce((acc, attribute) => {\n return `${acc}\\n ${attribute} {\\n ${imageFieldsSelection}\\n }\\n `;\n }, '');\n\n const relationshipAttributes = attributes.filter((attribute) => getAttributeScope(attribute) === 'relationship');\n const relationshipAttributesList: string = relationshipAttributes.reduce((acc, attribute) => {\n if (selection === 'list' && requestedSelection !== 'display' && attribute.hidden === true) {\n return acc;\n }\n\n if (isAssetRelationshipAttribute(attribute)) {\n return `${acc}\\n${getAssetConnectionSelection(\n attribute.name,\n hasOrderedAssetConnectionProperties(attribute, entitySchema),\n selection !== 'list',\n selection === 'list' ? LIST_ASSET_CONNECTION_LIMIT : FULL_ASSET_CONNECTION_LIMIT,\n selection === 'list'\n )}`;\n }\n\n const relatedEntity = find(propEq(attribute.relationship?.entity, 'name'))(schema) as Entity | undefined;\n\n if (selection === 'list') {\n const displayAttribute = getDisplayAttribute(relatedEntity);\n const primarySelection = getDisplayAttributeSelection(displayAttribute, scope, schema, true);\n const relatedLimit = attribute.relationship?.mode === 'single' ? 1 : 3;\n\n return (\n `${acc}\\n ${attribute.name} (limit: ${relatedLimit}, offset: 0) {\\n` +\n ` _id\\n` +\n `${primarySelection}` +\n ` }\\n `\n );\n }\n\n const attributesNameList = getFullRelatedEntityAttributesSelection(relatedEntity, scope, schema);\n\n return (\n `${getConnectionCountSelection(attribute.name).trim()}` +\n `${acc}\\n ${attribute.name} (limit: 25, offset: 0) { _id ${attributesNameList}` +\n `}\\n `\n );\n }, '');\n\n return {\n queryEntityName: entityNamePlural,\n query:\n `query ${operationName}(${heading}) {\\n` +\n getTopLevelCountSelection(entityNamePlural, includeCount, countMode) +\n ` ${entityNamePlural}${filters} {\\n` +\n ` _id\\n` +\n ` _updatedAt\\n` +\n ` ${globalAttributesList}` +\n ` ${localAttributesList}` +\n ` ${imageAttributesList}` +\n ` ${relationshipAttributesList}` +\n `}\\n` +\n `}\\n`,\n };\n}\n\n/**\n * Map the GraphQl results JSON to a key-value pair array. The values inside the scopedAttributes key are flattened to the first level.\n */\nexport function mapQueryResult(\n entityNamePlural: string,\n scope: string,\n results: EntityQueryResults,\n schema: Schema\n): MappedEntityQueryResults {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const attributes = entitySchema?.attributes ?? [];\n\n if (attributes.length === 0) {\n return {\n count: 0,\n results: [],\n };\n }\n\n const count = getEntityCount(results, entityNamePlural);\n const items = results[entityNamePlural] as EntityQueryResult[];\n const sliceFirstThreeItems = (values: EntityItem[], primaryAttribute: Attribute): string => {\n const primaryAttributeName = primaryAttribute.name;\n\n return values\n .slice(0, 3)\n .map((item) => {\n if (getAttributeScope(primaryAttribute) !== 'local') {\n return item[primaryAttributeName];\n }\n\n const scopedNode = unwrapNode(item[primaryAttributeName]);\n\n return scopedNode?.[scope] ?? scopedNode?.default;\n })\n .join(', ');\n };\n const mappedQueryResult = items.map((entity) => {\n const { _id } = entity;\n const updatedAt = typeof entity._updatedAt === 'string' ? entity._updatedAt : '';\n const globalAttributes = getAttributeListByScope('global', attributes)\n .filter((attributeName) => attributeName !== '_updatedAt')\n .reduce((acc, attributeName) => ({ ...acc, [attributeName]: entity[attributeName] }), {});\n const localAttributes = getAttributeListByScope('local', attributes).reduce((acc, attributeName) => {\n const scopedAttribute = unwrapNode(entity[attributeName]);\n\n return {\n ...acc,\n [attributeName]: scopedAttribute?.[scope] ? scopedAttribute[scope] : scopedAttribute?.default,\n };\n }, {});\n const imageAttributes = getImageAttributes(attributes).reduce(\n (acc, attributeName) => ({ ...acc, [attributeName]: unwrapNode(entity[attributeName]) }),\n {}\n );\n const relationshipAttributes = getAttributeListByScope(['relationship'], attributes).reduce(\n (acc, attributeName) => {\n const relationshipAttribute = find(propEq(attributeName, 'name'))(attributes) as Attribute;\n const relatedEntityName = relationshipAttribute.relationship?.entity ?? '';\n const relatedEntity = find(propEq(relatedEntityName, 'name'))(schema) as Entity | undefined;\n const primaryAttribute = getDisplayAttribute(relatedEntity);\n const localValue = entity[attributeName];\n\n if (isAssetRelationshipAttribute(relationshipAttribute)) {\n const assets = getOrderedAssetsFromConnection(entity[`${attributeName}Connection`]);\n\n return {\n ...acc,\n [attributeName]: assets,\n };\n }\n\n if (!primaryAttribute) {\n throw new Error(`There is an error in the schema for the relationship attribute \"${attributeName}\"`);\n }\n\n const primaryAttributeName = primaryAttribute.name;\n const primaryAttributeScope = getAttributeScope(primaryAttribute);\n\n // All relationship fields are lists in the schema, so the mode from the\n // JSON schema (not the value shape) decides single vs multiple mapping.\n if (relationshipAttribute.relationship?.mode === 'multiple') {\n const relatedItems = (Array.isArray(localValue) ? localValue : []) as EntityItem[];\n\n return {\n ...acc,\n [attributeName]: sliceFirstThreeItems(relatedItems, primaryAttribute),\n };\n }\n\n const relatedNode = unwrapNode(localValue);\n\n if (primaryAttributeScope === 'global') {\n return {\n ...acc,\n [attributeName]: relatedNode?.[primaryAttributeName],\n };\n }\n\n const primaryScopedNode = unwrapNode(relatedNode?.[primaryAttributeName]);\n\n return {\n ...acc,\n [attributeName]: primaryScopedNode?.[scope] ?? primaryScopedNode?.default,\n };\n },\n {}\n );\n\n return {\n _id,\n ...globalAttributes,\n ...localAttributes,\n ...imageAttributes,\n ...relationshipAttributes,\n _updatedAt: updatedAt,\n };\n });\n\n return {\n count,\n results: mappedQueryResult,\n };\n}\n\n/**\n * Like mapQueryResult but the local attribute values are returned as an object:\n * \\{_id: string, value: string, disabled: boolean, scope: string\\}.\n */\nexport function mapQueryResultForFormFields(\n entityNamePlural: string,\n scope: string,\n results: EntityQueryResults,\n schema: Schema\n): MappedFormEntityQueryResults {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const attributes = entitySchema?.attributes ?? [];\n\n if (attributes.length === 0) {\n return {\n count: 0,\n results: [],\n };\n }\n\n const count = getEntityCount(results, entityNamePlural);\n const items = results[entityNamePlural] as EntityQueryResult[];\n const mappedQueryResult = items.map((entity) => {\n const globalAttributes = getAttributeListByScope('global', attributes).reduce(\n (acc, attribute) => ({\n ...acc,\n [attribute]: {\n value: entity[attribute],\n disabled: false,\n scope: 'default',\n _id: '',\n },\n }),\n {}\n );\n const localAttributes = getAttributeListByScope('local', attributes).reduce((acc, attributeName) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(attributes) as Attribute;\n const localAttribute = unwrapNode(entity[attributeName]);\n\n return {\n ...acc,\n [attributeName]: {\n value: localAttribute ? getValueByScope(localAttribute, scope) : null,\n disabled: Boolean(\n localAttribute &&\n localAttribute[scope] === null &&\n getAttributeScope(attributeSchema) === 'local' &&\n scope !== 'default'\n ),\n scope,\n _id: localAttribute ? localAttribute._id : null,\n },\n };\n }, {});\n const imageAttributes = getImageAttributes(attributes).reduce(\n (acc, attribute) => ({\n ...acc,\n [attribute]: {\n value: unwrapNode(entity[attribute]),\n disabled: false,\n scope: 'default',\n _id: '',\n },\n }),\n {}\n );\n const relationshipAttributes = getAttributeListByScope(['relationship'], attributes).reduce(\n (acc, attributeName) => {\n const relationshipAttribute = find(propEq(attributeName, 'name'))(attributes) as Attribute;\n const rawValue = entity[attributeName];\n // Single-mode relationships come back as lists of 0..1 nodes; multiple\n // mode keeps the array so downstream grids receive it unchanged.\n const value = (\n relationshipAttribute.relationship?.mode === 'single' ? unwrapNode(rawValue) : rawValue\n ) as AttributeValue | null;\n const _id = value?._id;\n const aggregateCount = getConnectionCount(entity[`${attributeName}Connection`]);\n\n if (isAssetRelationshipAttribute(relationshipAttribute)) {\n const assets = getOrderedAssetsFromConnection(entity[`${attributeName}Connection`]);\n\n return {\n ...acc,\n [attributeName]: {\n count: aggregateCount,\n _id,\n knownAssetSortOrders: getKnownAssetSortOrders(assets),\n value: assets,\n disabled: false,\n scope,\n },\n };\n }\n\n return {\n ...acc,\n [attributeName]: {\n count: aggregateCount,\n _id,\n value,\n disabled: false,\n scope,\n },\n };\n },\n {}\n );\n\n return { ...globalAttributes, ...localAttributes, ...imageAttributes, ...relationshipAttributes };\n });\n\n return {\n count,\n results: mappedQueryResult,\n };\n}\n\n/**\n * Attribute values can be an object or an array of objects if the attribute is a multi-select.\n */\nfunction getValueByScope(\n attribute: AttributeValue | AttributeValue[],\n scope: string\n): FormFieldValue[] | AttributeValue | AttributeValue[] | string | null {\n if (Array.isArray(attribute)) {\n return attribute.reduce((result: FormFieldValue[], attr: AttributeValue) => {\n if (attr[scope] ?? attr.default) {\n const option = {\n _id: attr._id,\n disabled: Boolean(attr.scope === null && scope !== 'default'),\n scope,\n value: attr[scope] ?? attr.default,\n };\n\n result.push(option);\n }\n\n return result;\n }, []);\n }\n\n return attribute[scope] ?? attribute.default ?? null;\n}\n\n/**\n * Returns a string with the GraphQl query needed to mutate the dataToMutate object for the given entity and scope.\n */\nexport function getEntityUpdateMutation(\n entityNamePlural: string,\n entityId: string,\n scope: string,\n schema: Schema,\n originalData: FormEntityItem,\n dataToMutate: FormEntityItem,\n options?: { currentUser?: User; responseFields?: string }\n): string {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const entityName = entitySchema?.name ?? entityNamePlural;\n const attributes = entitySchema?.attributes ?? [];\n const pluralizedEntityName = capitalize(entityNamePlural);\n\n if (attributes.length === 0) {\n return '';\n }\n\n const data = filterOutInvalidAttributes(attributes, dataToMutate);\n const globalAttributes = globalAttributesUpdate(attributes, data);\n const localAttributes = localAttributesUpdate(entityId, attributes, data, scope);\n const imageAttributes = imageAttributesUpdate(attributes, originalData, data);\n const relationshipAttributes = relationshipAttributesUpdate(attributes, originalData, data);\n const responseType = entityNamePlural;\n const attributeNamesList =\n options?.responseFields ?? formatResponseFieldsForMutation(schema, entityNamePlural, scope);\n const operationName = `Update${getOperationEntityName(entityNamePlural)}`;\n\n return (\n `mutation ${operationName}($where: ${entityName}Where) {\\n` +\n ` update${pluralizedEntityName}(\\n` +\n ` where: $where\\n` +\n ` update: {${globalAttributes}${localAttributes}${imageAttributes}${relationshipAttributes}\\n }\\n` +\n ` ) {\\n` +\n ` ${responseType} {\\n` +\n ` _id\\n` +\n ` ${attributeNamesList}` +\n ` }\\n` +\n ` }\\n` +\n `}\\n`\n );\n}\n\n/**\n * Filter out any attribute received from the form that does not exist in the schema.\n */\nfunction filterOutInvalidAttributes(attributes: Attribute[], dataToMutate: FormEntityItem): FormEntityItem {\n // Read-only attributes are never written by the Studio.\n const nonUpdatableAttributes: readonly string[] = attributes\n .filter((attribute) => attribute.readOnly === true)\n .map((attribute) => attribute.name);\n const data = omit(nonUpdatableAttributes, dataToMutate);\n\n return pick(\n attributes.map((attribute) => attribute.name) as unknown as readonly [number, ...number[]],\n data\n ) as FormEntityItem;\n}\n\n/**\n * Filter attributes by scope: local, global or relationship.\n */\nfunction getAttributeListByScope(type: ScopeType | ScopeType[], attributes: Attribute[]): Attribute['name'][] {\n if (Array.isArray(type)) {\n return type.reduce((acc: Attribute['name'][], attributeType: ScopeType) => {\n return acc.concat(getAttributeListByScope(attributeType, attributes));\n }, []);\n }\n\n const filteredAttributes = attributes.filter(\n (attribute) => getAttributeScope(attribute) === type && attribute.inputType !== 'asset'\n );\n\n return filteredAttributes.map((attribute) => attribute.name);\n}\n\n/**\n * Get all attributes that are of type image.\n */\nfunction getImageAttributes(attributes: Attribute[]): Attribute['name'][] {\n const filteredAttributes = attributes.filter(isAssetAttribute);\n\n return filteredAttributes.map((attribute) => attribute.name);\n}\n\n/**\n * Update inputs require the dedicated set operator in Neo4j GraphQL v7\n * (name: \\{ set: value \\}); create inputs still take plain values.\n */\nfunction globalAttributesUpdate(\n schemaAttributes: Attribute[],\n data: FormEntityItem,\n operation: 'create' | 'update' = 'update'\n): string {\n const globalAttributes = pick(getAttributeListByScope('global', schemaAttributes) as [string], data);\n const attributesString = toPairs(globalAttributes).reduce((acc, [attributeName, value]) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const valueToStringify = Array.isArray(value?.value) ? null : (value?.value ?? null);\n const typedValue = stringifyValue(attributeSchema.dataType, valueToStringify);\n\n // Omit empty optional globals on create — `field: ` with no value is invalid GraphQL.\n if (operation === 'create' && (typedValue === null || typedValue === '')) {\n return acc;\n }\n\n if (operation === 'update') {\n return `${acc}\\n ${attributeName}: { set: ${typedValue} }`;\n }\n\n return `${acc}\\n ${attributeName}: ${typedValue}`;\n }, '');\n\n return attributesString;\n}\n\n/**\n * Returns the asset _id of a field value when it points at a real asset.\n * Cleared fields keep a stub value without a path, so path is required too.\n */\nfunction getLinkedAssetId(value: ImageValue | null | undefined): string {\n if (!value?._id || !value.path) {\n return '';\n }\n\n return value._id;\n}\n\n/**\n * Asset nodes are created up front by the /assets endpoint, so entity saves\n * only connect/disconnect them by _id. Disconnect runs before connect so the\n * field keeps at most one linked asset.\n */\nfunction imageAttributesUpdate(\n schemaAttributes: Attribute[],\n originalData: FormEntityItem,\n data: FormEntityItem\n): string {\n const imageAttributes = pick(getImageAttributes(schemaAttributes) as [string], data);\n const attributesArray: [string, FormFieldValue][] = toPairs(imageAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const nextId = getLinkedAssetId(attributeValue.value as ImageValue | null);\n const originalId = getLinkedAssetId(originalData[attributeName]?.value as ImageValue | null | undefined);\n\n if (nextId === originalId) {\n return acc;\n }\n\n const disconnect = originalId\n ? ` {\\n disconnect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(originalId)} }\\n }\\n }\\n }]\\n }\\n`\n : '';\n const connect = nextId\n ? ` {\\n connect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(nextId)} }\\n }\\n }\\n }]\\n }\\n`\n : '';\n\n return `${acc}\\n ${attributeName}: [\\n${disconnect}${connect} ]`;\n }, '');\n\n return attributesString;\n}\n\nfunction imageAttributesCreate(schemaAttributes: Attribute[], data: FormEntityItem): string {\n const imageAttributes = pick(getImageAttributes(schemaAttributes) as [string], data);\n const attributesArray: [string, FormFieldValue][] = toPairs(imageAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const assetId = getLinkedAssetId(attributeValue.value as ImageValue | null);\n\n if (!assetId) {\n return acc;\n }\n\n return (\n `${acc}\\n ${attributeName}: {\\n` +\n ` connect: [{\\n` +\n ` where: {\\n` +\n ` node: {\\n` +\n ` _id: { eq: ${stringifyStringLiteral(assetId)} }\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }]\\n` +\n ` }`\n );\n }, '');\n\n return attributesString;\n}\n\nfunction localAttributesUpdate(\n entityId: string,\n schemaAttributes: Attribute[],\n data: FormEntityItem,\n scope: string\n): string {\n const localAttributes = pick(getAttributeListByScope('local', schemaAttributes) as [string], data);\n const attributesArray: [string, FormFieldValue][] = toPairs(localAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const { dataType } = attributeSchema;\n const typedValue =\n attributeValue.disabled || Array.isArray(attributeValue.value)\n ? 'null'\n : stringifyValue(dataType, attributeValue.value);\n\n if (attributeValue._id) {\n return `${acc}\\n ${attributeName}: [{\\n update: {\\n node: {\\n ${scope}: { set: ${typedValue} }\\n }\\n }\\n }]`;\n }\n\n // Match localAttributesCreate: never create nodes for empty values. Empty\n // locals used to stringify to the string \"null\" and create with a\n // deterministic id; the next save then hit a unique-constraint failure\n // because the form still had no _id for those fields.\n if (\n attributeValue.disabled ||\n Array.isArray(attributeValue.value) ||\n attributeValue.value === undefined ||\n attributeValue.value === null ||\n attributeValue.value === '' ||\n typedValue === null ||\n typedValue === ''\n ) {\n return acc;\n }\n\n return (\n `${acc}\\n ${attributeName}: [{\\n` +\n ` create: {\\n` +\n ` node: {\\n` +\n ` _id: ${stringifyStringLiteral(`${entityId}:${attributeName}`)}\\n` +\n ` _type: \"${dataType}\"\\n` +\n ` ${scope}: ${typedValue}\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }]`\n );\n }, '');\n\n return attributesString;\n}\n\nfunction relationshipAttributesUpdate(\n schemaAttributes: Attribute[],\n originalData: FormEntityItem,\n data: FormEntityItem\n): string {\n const relationshipAttributes = pick(getAttributeListByScope('relationship', schemaAttributes) as [string], data);\n const attributesArray = toPairs(relationshipAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const { inputType, relationship } = attributeSchema;\n\n if (inputType === 'relationship' && relationship?.mode === 'single') {\n const originalId = originalData[attributeName]._id ?? '';\n const nextId = attributeValue._id ?? '';\n\n if (originalId === nextId) {\n return acc;\n }\n\n // Relationship fields are lists in the schema; disconnect runs before\n // connect so the field keeps at most one related node.\n const disconnect = originalId\n ? ` {\\n disconnect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(originalId)} }\\n }\\n }\\n }]\\n }\\n`\n : '';\n const connect = nextId\n ? ` {\\n connect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(nextId)} }\\n }\\n }\\n }]\\n }\\n`\n : '';\n\n return `${acc}\\n ${attributeName}: [\\n${disconnect}${connect} ]`;\n }\n\n if (inputType === 'relationship' && relationship?.mode === 'multiple') {\n if (relationship.entity === '_asset') {\n return `${acc}${orderedAssetRelationshipUpdate(attributeName, originalData[attributeName], attributeValue)}`;\n }\n\n // Neo4j GraphQL v7 expects list-shaped connect/disconnect entries with\n // `where.node`. The old `disconnect.where.OR` form drops the filter and\n // disconnects every related node.\n const disconnectIds = uniq(attributeValue.relationships?.disconnect ?? []).filter(Boolean);\n const connections = (attributeValue.relationships?.connect as MultipleRelationshipConnection | null) ?? [];\n const idsToConnect = connections.map((node) => stringifyStringLiteral(node._id)).join(', ');\n const disconnect = disconnectIds.length\n ? ` {\\n disconnect: [\\n${disconnectIds\n .map(\n (_id) =>\n ` {\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(_id)} }\\n }\\n }\\n }\\n`\n )\n .join('')} ]\\n }\\n`\n : '';\n const connect = idsToConnect\n ? ` {\\n connect: [{\\n where: {\\n node: {\\n _id: { in: [${idsToConnect}] }\\n }\\n }\\n }]\\n }\\n`\n : '';\n\n if (!disconnect && !connect) {\n return acc;\n }\n\n return `${acc}\\n ${attributeName}: [\\n${disconnect}${connect} ]`;\n }\n\n return `${acc}\\n`;\n }, '');\n\n return attributesString;\n}\n\nfunction orderedAssetRelationshipUpdate(\n attributeName: string,\n originalValue: FormFieldValue | undefined,\n attributeValue: FormFieldValue\n): string {\n const connections = (attributeValue.relationships?.connect as MultipleRelationshipConnection | null) ?? [];\n const orderedConnections = connections.map((connection, index) => ({\n ...connection,\n sortOrder: connection.sortOrder ?? index,\n }));\n const orderedConnectionIds = orderedConnections.map((connection) => connection._id);\n // Merge paged-in server assets from the live field so load-more edges are not\n // mistaken for brand-new connects (which would duplicate relationship edges).\n const originalSortOrderById = {\n ...getRelationshipSortOrderById(originalValue),\n ...(originalValue?.knownAssetSortOrders ?? {}),\n ...(attributeValue.knownAssetSortOrders ?? {}),\n };\n const disconnectedIds = uniq(attributeValue.relationships?.disconnect ?? []).filter(\n (_id) => _id && !orderedConnectionIds.includes(_id)\n );\n // In Neo4j GraphQL v7 connect always creates a new relationship, so\n // reconnecting an already-connected asset would duplicate the edge. New\n // assets are connected; existing ones with a changed sortOrder get a nested\n // update on the edge instead.\n const newConnections = orderedConnections.filter((connection) => originalSortOrderById[connection._id] === undefined);\n const reorderedConnections = orderedConnections.filter((connection) => {\n const originalSortOrder = originalSortOrderById[connection._id];\n\n return originalSortOrder !== undefined && originalSortOrder !== connection.sortOrder;\n });\n const disconnect = getOrderedAssetDisconnectString(disconnectedIds);\n const connect = getOrderedAssetConnectString(newConnections);\n const reorder = getOrderedAssetReorderString(reorderedConnections);\n\n if (!disconnect && !connect && !reorder) {\n return '';\n }\n\n return `\\n ${attributeName}: [\\n${disconnect}${connect}${reorder} ]`;\n}\n\nfunction getRelationshipSortOrderById(fieldValue: FormFieldValue | undefined): { [id: string]: number } {\n const value = fieldValue?.value;\n\n if (!Array.isArray(value)) {\n return {};\n }\n\n return value.reduce<{ [id: string]: number }>((result, item, index) => {\n if (typeof item !== 'object' || !item || !('_id' in item)) {\n return result;\n }\n\n const { _id } = item;\n\n if (typeof _id !== 'string' || _id.length === 0) {\n return result;\n }\n\n const sortOrder = 'sortOrder' in item && typeof item.sortOrder === 'number' ? item.sortOrder : index;\n\n return {\n ...result,\n [_id]: sortOrder,\n };\n }, {});\n}\n\nfunction getOrderedAssetDisconnectString(ids: string[]): string {\n if (ids.length === 0) {\n return '';\n }\n\n const nodes = ids.reduce((disconnectString, _id) => {\n return `${disconnectString} {\\n where: { node: { _id: { eq: ${stringifyStringLiteral(_id)} } } }\\n }\\n`;\n }, '');\n\n return ` {\\n disconnect: [\\n${nodes} ]\\n }\\n`;\n}\n\nfunction getOrderedAssetConnectString(connections: MultipleRelationshipConnection): string {\n if (connections.length === 0) {\n return '';\n }\n\n const nodes = getOrderedAssetConnectNodes(connections);\n\n return ` {\\n connect: [\\n${nodes} ]\\n }\\n`;\n}\n\nfunction getOrderedAssetConnectNodes(connections: MultipleRelationshipConnection): string {\n return connections.reduce((connectString, connection, index) => {\n const sortOrder = connection.sortOrder ?? index;\n\n return (\n `${connectString} {\\n` +\n ` where: { node: { _id: { eq: ${stringifyStringLiteral(connection._id)} } } }\\n` +\n ` edge: { sortOrder: ${sortOrder} }\\n` +\n ` }\\n`\n );\n }, '');\n}\n\nfunction getOrderedAssetReorderString(connections: MultipleRelationshipConnection): string {\n if (connections.length === 0) {\n return '';\n }\n\n const nodes = connections.reduce((updateString, connection, index) => {\n const sortOrder = connection.sortOrder ?? index;\n\n return (\n `${updateString} {\\n` +\n ` update: {\\n` +\n ` where: { node: { _id: { eq: ${stringifyStringLiteral(connection._id)} } } }\\n` +\n ` edge: { sortOrder: { set: ${sortOrder} } }\\n` +\n ` }\\n` +\n ` }\\n`\n );\n }, '');\n\n return nodes;\n}\n\nfunction stringifyValue(\n type: DataType,\n value: boolean | number | string | MappedEntityItem | EntityItem | AttributeValue | ImageValue | null | undefined\n): string | null {\n if (temporalTypes.includes(type)) {\n return value?.toString() ? stringifyStringLiteral(value.toString()) : null;\n }\n\n if (stringTypes.includes(type)) {\n // null/undefined must be GraphQL null, not the string literal \"null\".\n if (value === undefined || value === null) {\n return null;\n }\n\n return stringifyStringLiteral(value.toString());\n }\n\n // Empty optional numbers/booleans must not stringify to \"\" (breaks GraphQL as `field: `).\n if (value === undefined || value === null || value === '') {\n return null;\n }\n\n return value.toString();\n}\n\nfunction stringifyNullableString(value: string | null | undefined): string {\n return value ? stringifyStringLiteral(value) : 'null';\n}\n\nfunction stringifyStringLiteral(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction formatResponseFieldsForMutation(schema: Schema, entityNamePlural: string, scope: string): string {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const schemaAttributes = entitySchema?.attributes ?? [];\n const globalAttributesArray = getAttributeListByScope('global', schemaAttributes);\n const localAttributesArray = getAttributeListByScope('local', schemaAttributes);\n const relationshipAttributesArray = getAttributeListByScope('relationship', schemaAttributes);\n\n let fields = globalAttributesArray.reduce((acc, attributeName: string) => {\n return `${acc}${attributeName}\\n `;\n }, '');\n\n fields += localAttributesArray.reduce((acc, attributeName: string) => {\n return `${acc} ${attributeName} {\\n _id\\n ${scope}\\n }\\n `;\n }, '');\n\n fields += relationshipAttributesArray.reduce((acc, attributeName: string) => {\n const relationshipAttribute = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute | undefined;\n const relationshipMode = relationshipAttribute?.relationship?.mode ?? 'single';\n\n if (isAssetRelationshipAttribute(relationshipAttribute)) {\n return `${acc}${getAssetConnectionSelection(\n attributeName,\n hasOrderedAssetConnectionProperties(relationshipAttribute, entitySchema)\n )}`;\n }\n\n const relationshipEntityName = relationshipAttribute?.relationship?.entity ?? '';\n const relationshipEntitySchema = find(propEq(relationshipEntityName, 'name'))(schema) as Entity | undefined;\n const relationshipEntityAttributes = relationshipEntitySchema?.attributes ?? [];\n const primaryAttributeName =\n relationshipAttribute?.relationship?.field ?? '[invalid_relationship_field_name_in_schema]';\n const primaryAttribute = find(propEq(primaryAttributeName, 'name'))(relationshipEntityAttributes) as Attribute;\n const primaryAttributeScope = getAttributeScope(primaryAttribute);\n let list = '';\n\n if (relationshipMode === 'single') {\n if (primaryAttributeScope === 'global') {\n list = ` ${attributeName} {\\n _id\\n ${primaryAttributeName}\\n }\\n `;\n }\n\n if (primaryAttributeScope === 'local') {\n list = ` ${attributeName} {\\n _id\\n ${primaryAttributeName} {\\n _id\\n default\\n ${scope}\\n }\\n }\\n `;\n }\n }\n\n if (relationshipMode === 'multiple' && relationshipEntityAttributes.length) {\n const multipleRelationshipAttributes = relationshipEntityAttributes.reduce((str, attribute) => {\n if (getAttributeScope(attribute) === 'local') {\n return `${str} ${attribute.name} {\\n _id\\n default\\n ${scope}\\n }\\n`;\n }\n\n if (getAttributeScope(attribute) === 'relationship') {\n const additionalScope = scope === 'default' ? '' : `${scope}\\n `;\n const relationshipEntity = find(propEq(attribute.relationship?.entity, 'name'))(schema) as Entity | undefined;\n const relationshipAttribute = find(propEq(attribute.relationship?.field, 'name'))(\n relationshipEntity?.attributes ?? []\n ) as Attribute;\n const localAttributeQuery =\n getAttributeScope(relationshipAttribute) === 'local'\n ? `{\\n _id\\n default\\n ${additionalScope}}\\n `\n : '';\n\n if (attribute.relationship?.mode === 'single') {\n return `${str} ${attribute.name} {\\n ${attribute.relationship.field} ${localAttributeQuery}}\\n `;\n }\n\n if (attribute.relationship?.field) {\n return `${str} ${attribute.name} (limit: ${NESTED_RELATIONSHIP_LIMIT}, offset: 0) {\\n ${attribute.relationship.field} ${localAttributeQuery}}\\n `;\n }\n }\n\n // Display-only at this depth; lqip is a form-field concern.\n if (isAssetAttribute(attribute)) {\n return `${str} ${attribute.name} {\\n ${assetFieldsWithoutLqip}\\n }\\n`;\n }\n\n return `${str} ${attribute.name}\\n `;\n }, '');\n\n list =\n getConnectionCountSelection(attributeName) +\n ` ${attributeName} (limit: 25, offset: 0) {\\n${multipleRelationshipAttributes}` +\n ` }\\n`;\n }\n\n return `${acc}${list}`;\n }, '');\n\n return fields;\n}\n\n/**\n * Returns a string with the GraphQl mutation needed to delete one or more entities.\n */\nexport function getEntityDeleteMutation(\n entityName: string,\n schema: Schema,\n ids: string | readonly string[]\n): string {\n const idList = typeof ids === 'string' ? [ids] : [...ids];\n const entitySchema = find(propEq(entityName, 'name'))(schema) as Entity | undefined;\n const attributes = entitySchema?.attributes ?? [];\n const pluralizedEntityName = capitalize(entitySchema?.plural ?? '');\n const localAttributes = localAttributesDelete(attributes, idList);\n const operationName = `Delete${getOperationEntityName(entitySchema?.plural ?? entityName)}`;\n\n if (entityName === '_asset') {\n return (\n `mutation ${operationName}($where: ${entityName}Where) {\\n` +\n ` delete_assets(\\n` +\n ` where: $where\\n` +\n ` ) {\\n` +\n ` nodesDeleted\\n` +\n ` relationshipsDeleted\\n` +\n ` }\\n` +\n `}\\n`\n );\n }\n\n return (\n `mutation ${operationName}($where: ${entityName}Where) {\\n` +\n ` delete${pluralizedEntityName}(\\n` +\n ` where: $where\\n` +\n `${localAttributes ? ` delete: {\\n ${localAttributes}\\n }\\n` : ''}` +\n ` ) {\\n` +\n ` nodesDeleted\\n` +\n ` relationshipsDeleted\\n` +\n ` }\\n` +\n `}\\n`\n );\n}\n\nexport function getEntityDeleteWhere(ids: string | readonly string[]): { _id: { eq: string } } | { _id: { in: string[] } } {\n const idList = typeof ids === 'string' ? [ids] : [...ids];\n\n if (idList.length === 1) {\n return { _id: { eq: idList[0] as string } };\n }\n\n return { _id: { in: idList } };\n}\n\nfunction localAttributesDelete(schemaAttributes: Attribute[], ids: readonly string[]): string {\n const localAttributes = getAttributeListByScope('local', schemaAttributes);\n const attributesString: string = localAttributes.reduce((acc, attributeName) => {\n const localIds = ids.map((id) => stringifyStringLiteral(`${id}:${attributeName}`)).join(', ');\n const idFilter = ids.length === 1 ? `_id: { eq: ${localIds} }` : `_id: { in: [${localIds}] }`;\n\n return (\n `${acc}\\n` +\n ` ${attributeName}: [{\\n` +\n ` where: {\\n` +\n ` node: {\\n` +\n ` ${idFilter}\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }]`\n );\n }, '');\n\n return attributesString;\n}\n\nexport function getEntityCreateMutation(\n entityNamePlural: string,\n schema: Schema,\n entityData: FormEntityItem,\n _id: string,\n _options?: { currentUser?: User }\n): string {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const attributes = entitySchema?.attributes ?? [];\n const pluralizedEntityName = capitalize(entitySchema?.plural ?? '');\n\n if (attributes.length === 0) {\n return '';\n }\n\n const data = filterOutInvalidAttributes(attributes, entityData);\n const globalAttributes = globalAttributesUpdate(attributes, data, 'create');\n const localAttributes = localAttributesCreate(attributes, data, 'default', _id);\n const imageAttributes = imageAttributesCreate(attributes, data);\n const relationshipAttributes = relationshipAttributesCreate(attributes, data);\n const responseType = entityNamePlural;\n const attributeNamesList = formatResponseFieldsForMutation(schema, responseType, 'default');\n const operationName = `Create${getOperationEntityName(entityNamePlural)}`;\n\n return (\n `mutation ${operationName} {\\n` +\n ` create${pluralizedEntityName}(\\n` +\n ` input: [{\\n` +\n ` _id: ${stringifyStringLiteral(_id)}` +\n ` ${globalAttributes}` +\n ` ${localAttributes}\\n` +\n ` ${imageAttributes}\\n` +\n ` ${relationshipAttributes}\\n` +\n ` }]\\n` +\n ` ) {\\n` +\n ` ${responseType} {\\n` +\n ` _id\\n` +\n ` ${attributeNamesList}` +\n ` }\\n` +\n ` }\\n` +\n `}\\n`\n );\n}\n\nfunction localAttributesCreate(\n schemaAttributes: Attribute[],\n data: FormEntityItem,\n defaultScope: string,\n _id: string\n): string {\n const localAttributes = pick(getAttributeListByScope('local', schemaAttributes) as [string], data);\n const attributesArray = toPairs(localAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n if (attributeValue?.value === undefined || attributeValue.value === null || attributeValue.value === '') {\n return acc;\n }\n\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const typedValue = Array.isArray(attributeValue.value)\n ? 'null'\n : stringifyValue(attributeSchema.dataType, attributeValue.value);\n\n return (\n `${acc}\\n` +\n ` ${attributeName}: {\\n` +\n ` create: [{\\n` +\n ` node: {\\n` +\n ` _id: ${stringifyStringLiteral(`${_id}:${attributeName}`)}\\n` +\n ` _type: \"${attributeSchema.dataType}\"\\n` +\n ` ${defaultScope}: ${typedValue}\\n` +\n ` }\\n` +\n ` }]\\n` +\n ` }`\n );\n }, '');\n\n return attributesString;\n}\n\nfunction relationshipAttributesCreate(schemaAttributes: Attribute[], data: FormEntityItem): string {\n const relationshipAttributes = pick(getAttributeListByScope('relationship', schemaAttributes) as [string], data);\n const attributesArray = toPairs(relationshipAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const { inputType, relationship } = attributeSchema;\n\n if (inputType === 'relationship' && relationship?.mode === 'single') {\n if (!attributeValue._id) {\n return acc;\n }\n\n const connect = `connect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(attributeValue._id)} }\\n }\\n }\\n }]\\n`;\n\n return `${acc}\\n ${attributeName}: {\\n ${connect} }`;\n }\n\n const isMultipleRelationship = inputType === 'relationship' && relationship?.mode === 'multiple';\n const hasRelationships =\n Array.isArray(attributeValue.relationships?.connect) && attributeValue.relationships.connect.length > 0;\n if (isMultipleRelationship && hasRelationships) {\n const connections = (attributeValue.relationships?.connect as MultipleRelationshipConnection | null) ?? [];\n\n if (relationship?.entity === '_asset') {\n const connectNodes = getOrderedAssetConnectNodes(\n connections.map((connection, index) => ({\n ...connection,\n sortOrder: connection.sortOrder ?? index,\n }))\n );\n\n return `${acc}\\n ${attributeName}: {\\n connect: [\\n${connectNodes} ]\\n }`;\n }\n\n const idsToConnect = connections.map((node) => stringifyStringLiteral(node._id)).join(', ');\n const connect = idsToConnect\n ? `connect: {\\n where: {\\n node: {\\n _id: { in: [${idsToConnect}] }\\n }\\n }\\n }\\n`\n : '';\n\n return `${acc}\\n ${attributeName}: {\\n ${connect} }`;\n }\n\n return `${acc}\\n`;\n }, '');\n\n return attributesString;\n}\n\nexport function getRelatedItemsQuery({\n relatedEntityName,\n scope,\n schema,\n}: {\n attributeName: string;\n relatedEntityName: string;\n scope: string;\n schema: Schema;\n}): EntityQuery {\n const entitySchema = find(propEq(relatedEntityName, 'name'))(schema) as Entity | undefined;\n const queryEntityName = entitySchema?.plural ?? '';\n\n if (!queryEntityName) {\n return {\n queryEntityName: '',\n query: '',\n };\n }\n\n return getEntityQuery(queryEntityName, scope, schema, {\n selection: 'list',\n operationName: `GetRelated${getOperationEntityName(queryEntityName)}`,\n });\n}\n\n/**\n * Pages an entity's ordered asset connection beyond the initial form `first`.\n * Callers grow `first` (e.g. loaded + page size) so already-fetched edges are\n * re-returned in sortOrder and can be merged without a cursor.\n */\nexport function getEntityAssetConnectionQuery({\n attributeName,\n entityName,\n entityNamePlural,\n schema,\n}: {\n attributeName: string;\n entityName: string;\n entityNamePlural: string;\n schema: Schema;\n}): EntityQuery {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const attribute = find(propEq(attributeName, 'name'))(entitySchema?.attributes ?? []) as Attribute | undefined;\n const includeProperties = hasOrderedAssetConnectionProperties(attribute, entitySchema);\n const propertiesSelection = includeProperties\n ? ` properties {\\n` + ` sortOrder\\n` + ` }\\n`\n : '';\n const connectionArguments = includeProperties\n ? '(first: $first, sort: [{ edge: { sortOrder: ASC } }])'\n : '(first: $first)';\n const operationName = `Get${getOperationEntityName(entityName)}AssetConnection`;\n\n return {\n queryEntityName: entityNamePlural,\n query:\n `query ${operationName}($where: ${entityName}Where, $first: Int) {\\n` +\n ` ${entityNamePlural}(where: $where) {\\n` +\n ` ${attributeName}Connection${connectionArguments} {\\n` +\n ` aggregate {\\n` +\n ` count {\\n` +\n ` nodes\\n` +\n ` }\\n` +\n ` }\\n` +\n ` edges {\\n` +\n propertiesSelection +\n ` node {\\n` +\n ` ${assetFields}\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n` +\n `}\\n`,\n };\n}\n\nconst capitalize = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nexport function getOperationEntityName(entityName: string): string {\n const normalizedEntityName = entityName\n .split(/[^0-9A-Za-z]+/)\n .filter(Boolean)\n .map(capitalize)\n .join('');\n\n if (!normalizedEntityName) {\n return 'Entity';\n }\n\n if (/^[A-Za-z_]/.test(normalizedEntityName)) {\n return normalizedEntityName;\n }\n\n return `Entity${normalizedEntityName}`;\n}\n\nexport function getEntitySchema(schema: Schema, entityNamePlural: string): Entity | undefined {\n if (entityNamePlural === '_assets') {\n return assetSchema;\n }\n\n return find(propEq(entityNamePlural, 'plural'))(schema) as Entity | undefined;\n}\n\n/**\n * Pulls local-attribute node _ids out of an update mutation response so the\n * form can adopt them without a full refetch (which re-dirties the drawer).\n */\nexport function getLocalAttributeIdsFromUpdateResponse(\n response: unknown,\n entityNamePlural: string,\n schema: Schema\n): { [attributeName: string]: string } {\n if (!response || typeof response !== 'object') {\n return {};\n }\n\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n\n if (!entitySchema) {\n return {};\n }\n\n const updateKey = `update${capitalize(entityNamePlural)}`;\n const payload = (response as { [key: string]: unknown })[updateKey];\n\n if (!payload || typeof payload !== 'object') {\n return {};\n }\n\n const entities = (payload as { [key: string]: unknown })[entityNamePlural];\n const entity = Array.isArray(entities) ? entities[0] : undefined;\n\n if (!entity || typeof entity !== 'object') {\n return {};\n }\n\n return entitySchema.attributes.reduce<{ [attributeName: string]: string }>((ids, attribute) => {\n if (getAttributeScope(attribute) !== 'local') {\n return ids;\n }\n\n const node = unwrapNode((entity as { [key: string]: unknown })[attribute.name]);\n const nodeId = node?._id;\n\n if (typeof nodeId !== 'string' || nodeId.length === 0) {\n return ids;\n }\n\n return {\n ...ids,\n [attribute.name]: nodeId,\n };\n }, {});\n}\n","import type { ErrorLike } from '@apollo/client';\nimport { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';\n\ntype ErrorWithCause = ErrorLike & { cause?: unknown };\ntype ErrorWithMessage = {\n message?: unknown;\n};\ntype ServerErrorWithResult = ServerError & {\n result?: unknown;\n};\ntype GraphQLErrorResponse = {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n};\ntype GraphQLErrorItem = {\n extensions?: {\n code?: unknown;\n };\n message?: unknown;\n};\n\nfunction hasCause(error: ErrorLike): error is ErrorWithCause {\n if (!error) {\n return false;\n }\n\n return 'cause' in (error as ErrorWithCause);\n}\n\nexport function getServerError(error?: ErrorLike): ServerError | null {\n if (!error) {\n return null;\n }\n\n if (ServerError.is(error)) {\n return error;\n }\n\n if (hasCause(error)) {\n const possibleServerError = error.cause;\n\n if (ServerError.is(possibleServerError)) {\n return possibleServerError;\n }\n }\n\n return null;\n}\n\nfunction getErrorMessage(error: unknown): string | null {\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const { message } = error as ErrorWithMessage;\n\n return typeof message === 'string' ? message : null;\n}\n\nexport function parseErrorBody<T>(bodyText: string | undefined): T | null {\n if (!bodyText) {\n return null;\n }\n\n try {\n return JSON.parse(bodyText) as T;\n } catch {\n return null;\n }\n}\n\nexport function getGraphQLSchemaMismatchMessage(error?: ErrorLike): string | null {\n if (!error) {\n return null;\n }\n\n const messages = getGraphQLValidationMessages(error).filter((message) => !isMissingCountStoreFieldMessage(message));\n\n if (messages.length === 0) {\n return null;\n }\n\n return [\n 'The deployed schema is out of sync with your local Flexkit schema.',\n 'Run `flexkit deploy` using the CLI to apply your latest schema changes.',\n ...messages.map((message) => `- ${message}`),\n ].join('\\n');\n}\n\nexport function isMissingGraphQLFieldError(error: ErrorLike | undefined, fieldName: string): boolean {\n if (!error) {\n return false;\n }\n\n return getGraphQLValidationMessages(error).some((message) => {\n return message.includes(`Cannot query field \"${fieldName}\"`);\n });\n}\n\nfunction getGraphQLValidationMessages(error: ErrorLike): string[] {\n if (CombinedGraphQLErrors.is(error)) {\n return error.errors.filter(isSchemaValidationError).map(({ message }) => message);\n }\n\n const directMessage = getErrorMessage(error);\n\n if (directMessage && isSchemaValidationMessage(directMessage)) {\n return [directMessage];\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode !== 400) {\n return [];\n }\n\n const responseBody =\n parseErrorBody<GraphQLErrorResponse>(serverError.bodyText) ??\n getServerErrorResult(serverError) ??\n getErrorCauseResponse(error);\n\n if (!responseBody) {\n return [];\n }\n\n if (Array.isArray(responseBody.errors)) {\n return responseBody.errors.filter(isSchemaValidationError).map((item) => item.message);\n }\n\n if (typeof responseBody.message === 'string' && isSchemaValidationMessage(responseBody.message)) {\n return [responseBody.message];\n }\n\n if (typeof responseBody.error === 'string' && isSchemaValidationMessage(responseBody.error)) {\n return [responseBody.error];\n }\n\n return [];\n}\n\nfunction getServerErrorResult(serverError: ServerError): GraphQLErrorResponse | null {\n const { result } = serverError as ServerErrorWithResult;\n\n if (!result || typeof result !== 'object') {\n return null;\n }\n\n return result as GraphQLErrorResponse;\n}\n\nfunction getErrorCauseResponse(error: ErrorLike): GraphQLErrorResponse | null {\n if (!hasCause(error)) {\n return null;\n }\n\n const { cause } = error;\n const causeMessage = getErrorMessage(cause);\n\n if (causeMessage && isSchemaValidationMessage(causeMessage)) {\n return { message: causeMessage };\n }\n\n if (!cause || typeof cause !== 'object') {\n return null;\n }\n\n const { result } = cause as { result?: unknown };\n\n if (result && typeof result === 'object') {\n return result as GraphQLErrorResponse;\n }\n\n return null;\n}\n\nfunction isSchemaValidationError(error: unknown): error is GraphQLErrorItem & { message: string } {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { extensions, message } = error as GraphQLErrorItem;\n const code = extensions?.code;\n\n if (code === 'GRAPHQL_VALIDATION_FAILED' && typeof message === 'string') {\n return true;\n }\n\n return typeof message === 'string' && isSchemaValidationMessage(message);\n}\n\nfunction isSchemaValidationMessage(message: string): boolean {\n return (\n message.startsWith('Cannot query field ') ||\n message.startsWith('Unknown type ') ||\n message.startsWith('Cannot query field \"') ||\n message.includes('GRAPHQL_VALIDATION_FAILED')\n );\n}\n\nfunction isMissingCountStoreFieldMessage(message: string): boolean {\n return /Cannot query field \"[_A-Za-z][_0-9A-Za-z]*Total\" on type \"Query\"/.test(message);\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { ApolloClient, InMemoryCache, defaultDataIdFromObject, from, HttpLink } from '@apollo/client';\nimport type { ApolloLink } from '@apollo/client';\nimport { ApolloProvider } from '@apollo/client/react';\nimport { ErrorLink } from '@apollo/client/link/error';\nimport { CombinedGraphQLErrors, CombinedProtocolErrors } from '@apollo/client/errors';\nimport { getGraphQLSchemaMismatchMessage, getServerError, parseErrorBody } from './error-utils';\nimport { useConfig } from '../core/config/config-context';\nimport React, { createContext, useContext, useMemo, useState } from 'react';\n\nconst ApolloProviderCompat = ApolloProvider as unknown as React.ComponentType<{\n children?: React.ReactNode;\n client: ApolloClient;\n}>;\n\ntype GraphQLErrorContextValue = {\n schemaErrorMessage: string | null;\n setSchemaErrorMessage: React.Dispatch<React.SetStateAction<string | null>>;\n};\n\nconst GraphQLErrorContext = createContext<GraphQLErrorContextValue | undefined>(undefined);\n\nfunction useGraphQLError(): GraphQLErrorContextValue {\n const ctx = useContext(GraphQLErrorContext);\n\n if (!ctx) {\n throw new Error('useGraphQLError must be used within GraphQLProvider');\n }\n\n return ctx;\n}\n\nfunction createErrorLink(setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return new ErrorLink(({ error }) => {\n const schemaMismatchMessage = getGraphQLSchemaMismatchMessage(error);\n\n if (schemaMismatchMessage) {\n setSchemaErrorMessage(schemaMismatchMessage);\n\n return;\n }\n\n if (CombinedGraphQLErrors.is(error)) {\n error.errors.forEach(({ message, locations, path }) => {\n console.warn(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`);\n });\n } else if (CombinedProtocolErrors.is(error)) {\n error.errors.forEach(({ message, extensions }) => {\n console.warn(`[Protocol error]: Message: ${message}, Extensions: ${JSON.stringify(extensions)}`);\n });\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode === 400) {\n const responseBody = parseErrorBody<Record<string, unknown>>(serverError.bodyText);\n let message: string | null = null;\n\n if (responseBody && typeof responseBody === 'object') {\n const {\n error: responseError,\n errors,\n message: responseMessage,\n } = responseBody as {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n };\n\n if (typeof responseMessage === 'string') {\n message = responseMessage;\n } else if (Array.isArray(errors)) {\n const [firstError] = errors as { message?: unknown }[];\n\n if (firstError && typeof firstError.message === 'string') {\n const { message: firstErrorMessage } = firstError;\n message = firstErrorMessage;\n }\n } else if (typeof responseError === 'string') {\n message = responseError;\n } else {\n message = JSON.stringify(responseBody);\n }\n } else {\n message = serverError.bodyText;\n }\n\n setSchemaErrorMessage(message ?? 'There is an error in the deployed Flexkit schema. Fix flexkit.config.ts and run flexkit deploy.');\n }\n\n if (serverError) {\n console.warn(`[Network error]: ${serverError.message}`);\n\n return;\n }\n\n if (error) {\n console.warn(`[Network error]: ${error.message}`);\n }\n });\n}\n\nfunction additiveLink(currentProjectId: string, setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return from([\n createErrorLink(setSchemaErrorMessage),\n new HttpLink({ uri: `/api/flexkit/${currentProjectId}/graphql` }),\n ]);\n}\n\nfunction client(\n currentProjectId: string | undefined,\n setSchemaErrorMessage: (msg: string | null) => void\n): ApolloClient {\n return new ApolloClient({\n link: additiveLink(currentProjectId ?? '', setSchemaErrorMessage),\n cache: new InMemoryCache({\n dataIdFromObject: (responseObject) => {\n return responseObject._id ? (responseObject._id as string) : defaultDataIdFromObject(responseObject);\n },\n }),\n });\n}\n\nexport function GraphQLProvider({ children }: { children: React.ReactNode }): JSX.Element {\n const { currentProjectId } = useConfig();\n const [schemaErrorMessage, setSchemaErrorMessage] = useState<string | null>(null);\n const ctx = useMemo(() => ({ schemaErrorMessage, setSchemaErrorMessage }), [schemaErrorMessage]);\n const apolloClient = useMemo(\n () => client(currentProjectId, setSchemaErrorMessage),\n [currentProjectId]\n );\n\n return (\n <GraphQLErrorContext.Provider value={ctx}>\n <ApolloProviderCompat client={apolloClient}>{children}</ApolloProviderCompat>\n </GraphQLErrorContext.Provider>\n );\n}\n\nexport { useGraphQLError };\n","import type { ApolloClient } from '@apollo/client';\nimport type { Schema } from '../core/types';\nimport { assetSchema } from '../entities/assets-schema';\nimport { getOperationEntityName } from './queries';\n\ntype EntityListRefreshListener = (queryNames: ReadonlySet<string>) => void | Promise<void>;\ntype EntityListRemovalListener = (queryName: string, entityIds: ReadonlySet<string>) => void;\ntype EntityListPatchListener = (queryName: string, patches: EntityListRowPatch[]) => void;\n\nexport type EntityListRowPatch = {\n _id: string;\n attributes: { [key: string]: string };\n};\n\nlet refetchTimer: ReturnType<typeof setTimeout> | null = null;\nconst pendingQueryNames = new Set<string>();\nconst pendingResolvers: Array<{ resolve: () => void; reject: (error: unknown) => void }> = [];\nconst listeners = new Set<EntityListRefreshListener>();\nconst removalListeners = new Set<EntityListRemovalListener>();\nconst patchListeners = new Set<EntityListPatchListener>();\n\nexport function getEntityListQueryName(entityNameOrPlural: string, schema: Schema): string {\n if (entityNameOrPlural === '_asset' || entityNameOrPlural === '_assets') {\n return `Get${getOperationEntityName(assetSchema.plural)}`;\n }\n\n const byPlural = schema.find((entity) => entity.plural === entityNameOrPlural);\n const byName = schema.find((entity) => entity.name === entityNameOrPlural);\n const plural = byPlural?.plural ?? byName?.plural ?? entityNameOrPlural;\n\n return `Get${getOperationEntityName(plural)}`;\n}\n\n/**\n * Subscribe to soft list refreshes. Listeners should refetch their own query and\n * remap local paginated state (useEntityQuery ignores Apollo cache writes after sync).\n */\nexport function subscribeEntityListRefetch(listener: EntityListRefreshListener): () => void {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n}\n\n/**\n * Subscribe to optimistic row removals (e.g. after delete) before the soft-refetch lands.\n */\nexport function subscribeEntityListRemoval(listener: EntityListRemovalListener): () => void {\n removalListeners.add(listener);\n\n return () => {\n removalListeners.delete(listener);\n };\n}\n\n/**\n * Subscribe to in-place row patches (e.g. tag connect/disconnect) without a full list refetch.\n */\nexport function subscribeEntityListPatch(listener: EntityListPatchListener): () => void {\n patchListeners.add(listener);\n\n return () => {\n patchListeners.delete(listener);\n };\n}\n\n/**\n * Immediately drop rows from mounted lists, then soft-refetch to sync counts/pages.\n */\nexport function scheduleEntityListRemoval(\n apolloClient: ApolloClient,\n queryName: string,\n entityIds: string[]\n): Promise<void> {\n const ids = new Set(entityIds.filter(Boolean));\n\n if (ids.size > 0) {\n for (const listener of removalListeners) {\n listener(queryName, ids);\n }\n }\n\n return scheduleEntityListRefetch(apolloClient, queryName);\n}\n\n/**\n * Patch mounted list rows in place. Use when a mutation cannot change list cardinality\n * (e.g. tag connect/disconnect) so we avoid a full GetAssets soft-refetch.\n */\nexport function scheduleEntityListPatch(queryName: string, patches: EntityListRowPatch[]): void {\n const nextPatches = patches.filter((patch) => Boolean(patch._id));\n\n if (nextPatches.length === 0) {\n return;\n }\n\n for (const listener of patchListeners) {\n listener(queryName, nextPatches);\n }\n}\n\n/**\n * Ask mounted entity lists to soft-refresh. Debounced so batch deletes coalesce.\n */\nexport function scheduleEntityListRefetch(_apolloClient: ApolloClient, queryName: string): Promise<void> {\n pendingQueryNames.add(queryName);\n\n return new Promise<void>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n if (refetchTimer) {\n clearTimeout(refetchTimer);\n }\n\n refetchTimer = setTimeout(() => {\n const names = new Set(pendingQueryNames);\n const resolvers = pendingResolvers.splice(0);\n pendingQueryNames.clear();\n refetchTimer = null;\n\n void Promise.all([...listeners].map((listener) => Promise.resolve(listener(names))))\n .then(() => {\n for (const { resolve: finish } of resolvers) {\n finish();\n }\n })\n .catch((error: unknown) => {\n console.error('Error refreshing entity lists:', error);\n\n for (const { reject: fail } of resolvers) {\n fail(error);\n }\n });\n }, 50);\n });\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { prop, uniqBy } from 'ramda';\nimport { gql, NetworkStatus } from '@apollo/client';\nimport type { OperationVariables } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n getGraphQLSchemaMismatchMessage,\n getServerError,\n isMissingGraphQLFieldError,\n parseErrorBody,\n} from './error-utils';\nimport {\n getEntityQuery,\n getEntitySchema,\n getOperationEntityName,\n mapQueryResult,\n mapQueryResultForFormFields,\n} from './queries';\nimport {\n subscribeEntityListPatch,\n subscribeEntityListRefetch,\n subscribeEntityListRemoval,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\nimport { useGraphQLError } from './graphql-context';\nimport type {\n EntityQueryAggregate,\n EntityQueryResults,\n FormEntityItem,\n MappedEntityQueryResults,\n MappedEntityItem,\n MappedFormEntityQueryResults,\n UseEntityQueryParams,\n ImageValue,\n} from './types';\n\ntype FetchMoreOptions = {\n // `offset` is accepted for call-site compatibility but overridden by nextOffsetRef.\n // `where`/`sort` are inherited from the active query unless overridden here.\n variables: OperationVariables & { offset: number; limit: number };\n};\ntype Results = (MappedEntityQueryResults | MappedFormEntityQueryResults) | { count: 0; results: [] };\n\nexport function useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables,\n isForm,\n selection = 'full',\n includeCount = true,\n}: UseEntityQueryParams): {\n count: number;\n data: MappedEntityItem[] | FormEntityItem[] | ImageValue[] | undefined;\n fetchMore: (args: FetchMoreOptions) => void;\n isLoading: boolean;\n isLoadingMore: boolean;\n isProjectDisabled: boolean;\n isProjectReadOnly: boolean;\n reload: (options?: { preserve?: boolean }) => Promise<void>;\n schemaErrorMessage: string | null;\n} {\n const [result, setResult] = useState<Results>({\n count: 0,\n results: [],\n });\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [isReloading, setIsReloading] = useState(false);\n const [unsupportedTotalCount, setUnsupportedTotalCount] = useState<{\n field: string;\n schema: UseEntityQueryParams['schema'];\n } | null>(null);\n const isLoadingMoreRef = useRef(false);\n const isReloadingRef = useRef(false);\n // Next offset for fetchMore — advanced by each requested page window, not by the\n // deduplicated row count. Using unique rows.length as offset collapses when pages\n // overlap (unstable sorts / tied timestamps) into irregular steps like 25→35→42.\n const nextOffsetRef = useRef(0);\n // Tracks the query identity we last synced into local result state.\n // fetchMore updates Apollo `data` without changing this identity; syncing those\n // updates would wipe accumulated pages and retrigger infinite load-more.\n // Must include entity/scope — variables alone collide across entity navigations.\n const syncedQueryKeyRef = useRef<string | null>(null);\n const pendingQueryKeyRef = useRef<string | null>(null);\n const totalCountField = `${entityNamePlural}Total`;\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const canUseTotalCount =\n variables?.where === undefined &&\n (entitySchema?.spaces?.length ?? 0) === 0 &&\n (unsupportedTotalCount?.field !== totalCountField || unsupportedTotalCount.schema !== schema);\n const countMode = canUseTotalCount ? 'total' : 'aggregate';\n const queryDocument = useMemo(\n () => gql(getEntityQuery(entityNamePlural, scope, schema, { selection, countMode, includeCount }).query),\n [entityNamePlural, scope, schema, selection, countMode, includeCount]\n );\n // fetchMore pages skip the top-level aggregate count (a filtered label scan\n // on the server); the total from the first page still stands.\n const fetchMoreDocument = useMemo(\n () => gql(getEntityQuery(entityNamePlural, scope, schema, { selection, includeCount: false }).query),\n [entityNamePlural, scope, schema, selection]\n );\n const { schemaErrorMessage, setSchemaErrorMessage } = useGraphQLError();\n const {\n loading: isLoading,\n data,\n fetchMore: fetchNextPage,\n refetch,\n error,\n networkStatus,\n } = useQuery<EntityQueryResults & EntityQueryAggregate>(queryDocument, {\n variables,\n notifyOnNetworkStatusChange: true,\n });\n const fetchNextPageRef = useRef(fetchNextPage);\n const refetchRef = useRef(refetch);\n const fetchMoreDocumentRef = useRef(fetchMoreDocument);\n const previousNetworkStatusRef = useRef(networkStatus);\n const variablesRef = useRef(variables);\n fetchNextPageRef.current = fetchNextPage;\n refetchRef.current = refetch;\n fetchMoreDocumentRef.current = fetchMoreDocument;\n variablesRef.current = variables;\n\n // Parse 403 error response to determine the specific error code\n const isMissingTotalCountField = includeCount && isMissingGraphQLFieldError(error, totalCountField);\n const shouldFallbackToAggregate = countMode === 'total' && isMissingTotalCountField;\n const effectiveError = isMissingTotalCountField ? undefined : error;\n const isTotalCountFallbackLoading = isMissingTotalCountField && !data?.[entityNamePlural];\n const serverError = getServerError(effectiveError);\n const schemaMismatchMessage = getGraphQLSchemaMismatchMessage(effectiveError);\n\n const { isProjectDisabled, isProjectReadOnly } = (() => {\n if (serverError?.statusCode === 403) {\n const responseBody = parseErrorBody<{ code?: string }>(serverError.bodyText);\n\n if (responseBody && typeof responseBody.code === 'string') {\n if (responseBody.code === 'PROJECT_PAUSED') {\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n if (responseBody.code === 'READ_ONLY_MODE') {\n return {\n isProjectDisabled: false,\n isProjectReadOnly: true,\n };\n }\n }\n\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n return {\n isProjectDisabled: false,\n isProjectReadOnly: false,\n };\n })();\n\n useEffect(() => {\n if (!shouldFallbackToAggregate) {\n return;\n }\n\n setUnsupportedTotalCount({ field: totalCountField, schema });\n }, [schema, shouldFallbackToAggregate, totalCountField]);\n\n const fetchMore = useCallback(\n (args: FetchMoreOptions): void => {\n if (isLoadingMoreRef.current || isReloadingRef.current) {\n return;\n }\n\n isLoadingMoreRef.current = true;\n setIsLoadingMore(true);\n\n const { limit } = args.variables;\n const offset = nextOffsetRef.current;\n\n fetchNextPageRef\n .current({\n ...args,\n query: fetchMoreDocumentRef.current,\n variables: {\n // fetchMore uses a count-free document, so Apollo will not inherit\n // the original operation's where/sort unless we pass them again.\n ...variablesRef.current,\n ...args.variables,\n offset,\n limit,\n },\n })\n .then(({ data: res }) => {\n const mappedFetchMoreResults = mapResults({ data: res, entityNamePlural, isForm, schema, scope });\n // Advance by the fetched page window (capped at limit), not by how many unique\n // rows survived client-side merge. Cap protects against Apollo returning a\n // merged cache blob larger than the requested page.\n const pageLength = mappedFetchMoreResults.results.length;\n nextOffsetRef.current = offset + (pageLength === 0 ? 0 : Math.min(pageLength, limit));\n\n setResult((prevRows) => {\n const merged = uniqBy(prop('_id'), [\n ...prevRows.results,\n ...mappedFetchMoreResults.results,\n ]) as Results['results'];\n\n // Empty/duplicate pages must end pagination, otherwise load-more loops forever\n // when aggregate count is ahead of rows that the where-clause can actually return.\n if (merged.length === prevRows.results.length) {\n return {\n count: prevRows.results.length,\n results: prevRows.results,\n } as Results;\n }\n\n // Count-free pagination pages report 0; the first page's total stands.\n return {\n count: mappedFetchMoreResults.count || prevRows.count,\n results: merged,\n } as Results;\n });\n })\n .catch((fetchError: unknown) => {\n console.error('Error fetching more data:', fetchError);\n })\n .finally(() => {\n isLoadingMoreRef.current = false;\n setIsLoadingMore(false);\n });\n },\n [entityNamePlural, isForm, schema, scope]\n );\n\n const reload = useCallback(\n (options?: { preserve?: boolean }): Promise<void> => {\n if (isReloadingRef.current) {\n return Promise.resolve();\n }\n\n const preserve = options?.preserve === true;\n\n isReloadingRef.current = true;\n isLoadingMoreRef.current = false;\n setIsLoadingMore(false);\n\n if (!preserve) {\n syncedQueryKeyRef.current = null;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = 0;\n setIsReloading(true);\n setResult({ count: 0, results: [] });\n }\n\n return refetchRef\n .current()\n .then(({ data: res }) => {\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data: res, entityNamePlural, isForm, schema, scope });\n\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n })\n .catch((fetchError: unknown) => {\n console.error('Error reloading data:', fetchError);\n })\n .finally(() => {\n isReloadingRef.current = false;\n setIsReloading(false);\n });\n },\n [entityNamePlural, isForm, schema, scope, selection, includeCount, variables]\n );\n\n useEffect(() => {\n if (schemaMismatchMessage) {\n setSchemaErrorMessage(schemaMismatchMessage);\n\n return;\n }\n\n if (data && schemaErrorMessage && !effectiveError) {\n setSchemaErrorMessage(null);\n }\n }, [data, effectiveError, schemaErrorMessage, schemaMismatchMessage, setSchemaErrorMessage]);\n\n useEffect(() => {\n if (effectiveError || schemaMismatchMessage || isTotalCountFallbackLoading) {\n return;\n }\n\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n\n // Already synced for this query identity — ignore Apollo `data` updates from fetchMore.\n if (syncedQueryKeyRef.current === queryKey) {\n return;\n }\n\n if (isLoading && pendingQueryKeyRef.current !== queryKey) {\n pendingQueryKeyRef.current = queryKey;\n nextOffsetRef.current = 0;\n setResult({ count: 0, results: [] });\n\n return;\n }\n\n if (isLoading) {\n return;\n }\n\n const mapped = mapResults({ data, entityNamePlural, isForm, schema, scope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n }, [\n data,\n effectiveError,\n entityNamePlural,\n isForm,\n isLoading,\n isTotalCountFallbackLoading,\n schema,\n schemaMismatchMessage,\n scope,\n selection,\n includeCount,\n variables,\n ]);\n\n // After an Apollo refetch (delete/upload), replace accumulated pages with the\n // fresh first page. fetchMore uses NetworkStatus.fetchMore and is ignored.\n useEffect(() => {\n const previousStatus = previousNetworkStatusRef.current;\n previousNetworkStatusRef.current = networkStatus;\n\n if (effectiveError || schemaMismatchMessage || isReloadingRef.current || isTotalCountFallbackLoading) {\n return;\n }\n\n if (previousStatus !== NetworkStatus.refetch || networkStatus !== NetworkStatus.ready || !data) {\n return;\n }\n\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data, entityNamePlural, isForm, schema, scope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n }, [\n data,\n effectiveError,\n entityNamePlural,\n isForm,\n isTotalCountFallbackLoading,\n networkStatus,\n schema,\n schemaMismatchMessage,\n scope,\n selection,\n includeCount,\n variables,\n ]);\n\n // Soft-refresh after mutations (tags, deletes, uploads). Local paginated state\n // ignores Apollo cache writes, so we must refetch and remap explicitly.\n useEffect(() => {\n if (isForm) {\n return;\n }\n\n const listQueryName = `Get${getOperationEntityName(entityNamePlural)}`;\n\n const unsubscribeRefetch = subscribeEntityListRefetch((queryNames) => {\n if (!queryNames.has(listQueryName) || isLoadingMoreRef.current || isReloadingRef.current) {\n return;\n }\n\n return refetchRef\n .current()\n .then(({ data: res }) => {\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data: res, entityNamePlural, isForm, schema, scope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n })\n .catch((fetchError: unknown) => {\n console.error('Error soft-refreshing entity list:', fetchError);\n });\n });\n\n const unsubscribeRemoval = subscribeEntityListRemoval((queryName, entityIds) => {\n if (queryName !== listQueryName) {\n return;\n }\n\n setResult((prev) => {\n const nextResults = prev.results.filter((row) => {\n const rowId = typeof row._id === 'string' ? row._id : undefined;\n\n return !rowId || !entityIds.has(rowId);\n });\n const removedCount = prev.results.length - nextResults.length;\n\n if (removedCount === 0) {\n return prev;\n }\n\n return {\n count: Math.max(0, prev.count - removedCount),\n results: nextResults,\n } as Results;\n });\n });\n\n const unsubscribePatch = subscribeEntityListPatch((queryName, patches) => {\n if (queryName !== listQueryName) {\n return;\n }\n\n setResult((prev) => applyEntityListPatches(prev, patches, variables?.sort));\n });\n\n return () => {\n unsubscribeRefetch();\n unsubscribeRemoval();\n unsubscribePatch();\n };\n }, [entityNamePlural, isForm, schema, scope, selection, includeCount, variables]);\n\n return {\n // Refetch keeps existing rows visible; only initial load / explicit reload show as loading.\n isLoading:\n (isLoading && networkStatus !== NetworkStatus.refetch) || isReloading || isTotalCountFallbackLoading,\n isLoadingMore,\n fetchMore,\n reload,\n count: result.count,\n data: result.results,\n isProjectDisabled,\n isProjectReadOnly,\n schemaErrorMessage,\n };\n}\n\nfunction getVariablesOffset(variables: OperationVariables | undefined): number {\n const offset = variables?.offset;\n\n return typeof offset === 'number' && Number.isFinite(offset) ? offset : 0;\n}\n\nfunction mapResults(\n args: {\n data: (EntityQueryResults & EntityQueryAggregate) | undefined;\n } & UseEntityQueryParams\n): MappedEntityQueryResults | MappedFormEntityQueryResults {\n const entityNamePlural = args.entityNamePlural as keyof FormEntityItem;\n\n if (!args.data?.[entityNamePlural]) {\n return { count: 0, results: [] };\n }\n\n return args.isForm\n ? mapQueryResultForFormFields(args.entityNamePlural, args.scope, args.data, args.schema)\n : mapQueryResult(args.entityNamePlural, args.scope, args.data, args.schema);\n}\n\nfunction applyEntityListPatches(\n prev: Results,\n patches: EntityListRowPatch[],\n sort: unknown\n): Results {\n const patchById = new Map(patches.map((patch) => [patch._id, patch]));\n let didPatch = false;\n const nextResults = prev.results.map((row) => {\n const rowId = typeof row._id === 'string' ? row._id : undefined;\n\n if (!rowId) {\n return row;\n }\n\n const patch = patchById.get(rowId);\n\n if (!patch) {\n return row;\n }\n\n didPatch = true;\n\n return {\n ...row,\n ...patch.attributes,\n };\n });\n\n if (!didPatch) {\n return prev;\n }\n\n return {\n count: prev.count,\n results: sortEntityListResults(nextResults, sort),\n } as Results;\n}\n\nfunction sortEntityListResults<T extends { [key: string]: unknown }>(results: T[], sort: unknown): T[] {\n if (!Array.isArray(sort) || sort.length === 0) {\n return results;\n }\n\n const [primarySort] = sort;\n\n if (!primarySort || typeof primarySort !== 'object') {\n return results;\n }\n\n const [primarySortEntry] = Object.entries(primarySort as { [key: string]: unknown });\n const [sortField, sortDirection] = primarySortEntry ?? [];\n\n if (!sortField || (sortDirection !== 'ASC' && sortDirection !== 'DESC')) {\n return results;\n }\n\n const direction = sortDirection === 'DESC' ? -1 : 1;\n\n return [...results].sort((left, right) => {\n const leftValue = left[sortField];\n const rightValue = right[sortField];\n const leftText = typeof leftValue === 'string' ? leftValue : '';\n const rightText = typeof rightValue === 'string' ? rightValue : '';\n\n return leftText.localeCompare(rightText) * direction;\n });\n}\n","import type { JSX } from 'react';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '../../ui/primitives/alert';\n\nexport function ProjectDisabled(): JSX.Element {\n return (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"fk:h-4 fk:w-4\" />\n <AlertTitle>Project Paused</AlertTitle>\n <AlertDescription>\n This project has been paused. To troubleshoot this error, please{' '}\n <a\n className=\"fk:text-blue-500 fk:underline\"\n href=\"https://flexkit.io/docs/errors/project-paused\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n follow these steps\n </a>\n .\n </AlertDescription>\n </Alert>\n );\n}\n","import type { JSX } from 'react';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '../../ui/primitives/alert';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\n\nexport function SchemaError(): JSX.Element {\n const { schemaErrorMessage } = useGraphQLError();\n\n if (!schemaErrorMessage) {\n return <></>;\n }\n\n const [summary, deployHint, ...details] = schemaErrorMessage.split('\\n');\n\n return (\n <Alert className=\"fk:mb-4\" variant=\"destructive\">\n <AlertCircle className=\"fk:h-4 fk:w-4\" />\n <AlertTitle>Schema mismatch</AlertTitle>\n <AlertDescription>\n <p>{summary}</p>\n {deployHint ? <p className=\"fk:mt-1\">{deployHint}</p> : null}\n {details.length > 0 ? (\n <ul className=\"fk:mt-2 fk:list-disc fk:pl-4\">\n {details.map((detail) => (\n <li key={detail}>{detail.replace(/^- /, '')}</li>\n ))}\n </ul>\n ) : null}\n </AlertDescription>\n </Alert>\n );\n}\n","/** Fill short viewports immediately; prefetch ahead only once the user scrolls. */\nexport function shouldLoadMore({\n scrollHeight,\n scrollTop,\n clientHeight,\n}: {\n scrollHeight: number;\n scrollTop: number;\n clientHeight: number;\n}): boolean {\n if (clientHeight <= 0) {\n return false;\n }\n\n // Applying the scrolling threshold at the top requests a second page on\n // mount even when the first page already fills the viewport.\n const threshold = scrollTop > 0 ? Math.max(600, clientHeight) : 1;\n\n return scrollHeight - scrollTop - clientHeight < threshold;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { JSX, ReactElement, UIEvent } from 'react';\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport type {\n ColumnDef,\n ColumnFiltersState,\n OnChangeFn,\n Updater,\n Row,\n RowSelectionState,\n SortingState,\n Table,\n TableMeta,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n Table as TablePrimitive,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/primitives/table';\nimport { cn } from '../ui/lib/utils';\nimport { TooltipProvider } from '../ui/primitives/tooltip';\nimport type { AttributeValue } from '../graphql-client/types';\nimport type { MultipleRelationshipConnection } from '../core/types';\nimport { useGraphQLError } from '../graphql-client/graphql-context';\nimport { shouldLoadMore } from './should-load-more';\n\ninterface DataTableProps<TData extends AttributeValue, TValue> {\n classNames?: {\n wrapper?: string;\n table?: string;\n tableContainer?: string;\n row?: string;\n };\n columns: ColumnDef<AttributeValue, TValue>[];\n data: TData[];\n entityName: string;\n hasMore?: boolean;\n initialSelectionState?: RowSelectionState;\n isLoadingMore?: boolean;\n onEntitySelectionChange?: (rowSelection: string[]) => void;\n onLoadMore?: () => void;\n onScroll?: (event: UIEvent<HTMLDivElement>) => void;\n onSortingChange?: OnChangeFn<SortingState>;\n pageSize?: number;\n rowHeightEstimate?: number;\n rowAdditionState?: MultipleRelationshipConnection;\n rowDeletionState?: string[];\n scrollToTopKey?: number;\n sorting?: SortingState;\n toolbarComponent?: (table: Table<AttributeValue>) => ReactElement;\n}\n\ninterface ExtendedDataTable extends TableMeta<unknown> {\n getRowBackground: (row: Row<AttributeValue>) => string;\n}\n\n// Matches default `fk:h-9` rows (text-sm / 28px assets + cell padding + border).\nconst DEFAULT_ROW_HEIGHT_PX = 36;\nconst ROW_OVERSCAN = 15;\nconst COLUMN_OVERSCAN = 2;\n// Matches `fk:h-10` on TableHead. The header lives in the same scroll\n// container as the rows, so item measurements must start after it.\nconst STICKY_HEADER_HEIGHT_PX = 40;\n\nfunction inferRowHeightEstimate(rowClassName?: string): number | undefined {\n if (!rowClassName) {\n return undefined;\n }\n\n const tokens = rowClassName.split(/\\s+/);\n\n if (tokens.includes('fk:h-20')) {\n return 80;\n }\n\n if (tokens.includes('fk:h-10')) {\n return 40;\n }\n\n if (tokens.includes('fk:h-9')) {\n return 36;\n }\n\n return undefined;\n}\n\nfunction resolveRowHeightPx(rowHeightEstimate?: number, rowClassName?: string): number {\n return rowHeightEstimate ?? inferRowHeightEstimate(rowClassName) ?? DEFAULT_ROW_HEIGHT_PX;\n}\n\nexport function DataTable<TData extends AttributeValue, TValue>({\n classNames,\n columns,\n data,\n entityName,\n hasMore = false,\n initialSelectionState,\n isLoadingMore = false,\n onEntitySelectionChange,\n onLoadMore,\n onScroll,\n onSortingChange,\n pageSize,\n rowHeightEstimate,\n rowAdditionState,\n rowDeletionState,\n scrollToTopKey,\n sorting: sortingProp,\n toolbarComponent,\n}: DataTableProps<TData, TValue>): JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const { schemaErrorMessage } = useGraphQLError();\n const [rowSelection, setRowSelection] = useState(initialSelectionState ?? {});\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [uncontrolledSorting, setUncontrolledSorting] = useState<SortingState>([]);\n const sorting = sortingProp ?? uncontrolledSorting;\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0, left: 0 });\n }, [entityName, scrollToTopKey]);\n\n useEffect(() => {\n if (!initialSelectionState) {\n return;\n }\n\n const currentSelection = Object.keys(rowSelection).sort().join(',');\n const nextSelection = Object.keys(initialSelectionState).sort().join(',');\n\n if (currentSelection === nextSelection) {\n return;\n }\n\n setRowSelection(initialSelectionState);\n }, [initialSelectionState, rowSelection]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n if (onSortingChange) {\n onSortingChange(updater);\n\n return;\n }\n\n setUncontrolledSorting(updater);\n }\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n },\n initialState: {\n pagination: {\n pageSize: pageSize ?? 50,\n },\n },\n enableRowSelection: true,\n onRowSelectionChange: handleRowSelectionChange,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: (row) => row._id,\n // Filtering is applied via GraphQL `where` (Asset Manager toolbar); keep loaded\n // pages intact instead of re-filtering them client-side.\n manualFiltering: true,\n manualPagination: true,\n manualSorting: true,\n meta: {\n getRowBackground: (row: Row<AttributeValue>) => getRowClassnames(row, rowDeletionState, rowAdditionState),\n },\n });\n\n const { rows } = table.getRowModel();\n const rowHeightPx = resolveRowHeightPx(rowHeightEstimate, classNames?.row);\n const hasExplicitRowHeightClass = inferRowHeightEstimate(classNames?.row) != null;\n // Fixed row heights: skip dynamic measurement so infinite-scroll appends keep\n // identical spacing (estimate corrections were causing a brief taller jump).\n const rowVirtualizer = useVirtualizer({\n count: rows.length,\n estimateSize: () => rowHeightPx,\n getItemKey: (index) => rows[index]?.id ?? index,\n getScrollElement: () => scrollRef.current,\n overscan: ROW_OVERSCAN,\n scrollMargin: STICKY_HEADER_HEIGHT_PX,\n });\n\n const visibleColumns = table.getVisibleLeafColumns();\n const headerGroups = table.getHeaderGroups();\n // Grouped headers span multiple leaf columns; keep their existing layout.\n const virtualizeColumns = headerGroups.length === 1;\n const columnVirtualizer = useVirtualizer({\n horizontal: true,\n count: visibleColumns.length,\n estimateSize: (index) => visibleColumns[index].getSize(),\n getItemKey: (index) => visibleColumns[index].id,\n getScrollElement: () => scrollRef.current,\n overscan: COLUMN_OVERSCAN,\n enabled: virtualizeColumns,\n });\n // Visibility/size changes invalidate cached offsets even when the count stays\n // the same (e.g. navigating between two equally wide entity schemas).\n const columnSizesKey = JSON.stringify(visibleColumns.map((column) => [column.id, column.getSize()]));\n useEffect(() => {\n columnVirtualizer.measure();\n }, [columnSizesKey, columnVirtualizer]);\n const virtualColumns = columnVirtualizer.getVirtualItems();\n const firstColumn = virtualizeColumns ? (virtualColumns[0]?.index ?? 0) : 0;\n const lastColumn = virtualizeColumns\n ? (virtualColumns[virtualColumns.length - 1]?.index ?? -1) + 1\n : visibleColumns.length;\n const paddingLeft = virtualizeColumns ? (virtualColumns[0]?.start ?? 0) : 0;\n const paddingRight = virtualizeColumns\n ? Math.max(0, columnVirtualizer.getTotalSize() - (virtualColumns[virtualColumns.length - 1]?.end ?? 0))\n : 0;\n\n const virtualItems = rowVirtualizer.getVirtualItems();\n const { paddingTop, paddingBottom } = getVirtualBodySpacers(\n virtualItems,\n rowVirtualizer.getTotalSize(),\n STICKY_HEADER_HEIGHT_PX\n );\n\n // Keep load-more inputs in refs so callback identity churn from parents\n // (e.g. Apollo fetchMore) cannot re-trigger the effect every render.\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n if (!shouldLoadMore(scrollElement)) {\n return;\n }\n\n // Optimistic guard until the parent's isLoadingMore prop catches up.\n isLoadingMoreRef.current = true;\n onLoadMoreRef.current();\n }, []);\n\n // Re-check when rows/hasMore/loading settle — not when parent callback identities change.\n useEffect(() => {\n checkLoadMore();\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore]);\n\n function handleRowSelectionChange(updaterFn: Updater<RowSelectionState>): void {\n const selectedIds = typeof updaterFn === 'function' ? Object.keys(updaterFn(rowSelection)) : Object.keys(updaterFn);\n\n setRowSelection(updaterFn);\n onEntitySelectionChange?.(selectedIds);\n }\n\n function handleScroll(event: UIEvent<HTMLDivElement>): void {\n onScroll?.(event);\n checkLoadMore(event.currentTarget);\n }\n\n if (schemaErrorMessage) {\n return <></>;\n }\n\n return (\n <div className={cn('fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4', classNames?.wrapper)}>\n {toolbarComponent && toolbarComponent(table)}\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1 fk:-mb-px\">\n <TooltipProvider delayDuration={400}>\n <TablePrimitive\n className={cn('fk:grid fk:pb-20', classNames?.table)}\n aria-colcount={visibleColumns.length}\n style={{ minWidth: table.getTotalSize() }}\n containerClassName={classNames?.tableContainer}\n onScroll={handleScroll}\n ref={scrollRef}\n >\n <TableHeader className=\"fk:sticky fk:top-0 fk:z-20 fk:grid\">\n {headerGroups.map((headerGroup) => (\n <TableRow className=\"fk:flex fk:w-full\" key={headerGroup.id}>\n {paddingLeft > 0 ? <VirtualColumnSpacer width={paddingLeft} header /> : null}\n {(virtualizeColumns ? headerGroup.headers.slice(firstColumn, lastColumn) : headerGroup.headers).map(\n (header, index) => {\n return (\n <TableHead\n aria-colindex={virtualizeColumns ? firstColumn + index + 1 : undefined}\n className={cn(\n 'fk:flex fk:shrink-0 fk:items-center',\n header.column.id === 'actions' && 'fk:pl-0'\n )}\n colSpan={header.colSpan}\n key={header.id}\n style={header.getSize() ? { width: `${header.getSize().toString()}px` } : {}}\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-10.25 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-4\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n </TableHead>\n );\n }\n )}\n {paddingRight > 0 ? <VirtualColumnSpacer width={paddingRight} header /> : null}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody className=\"fk:grid fk:relative\">\n {rows.length === 0 ? (\n <TableRow>\n <TableCell className=\"fk:h-24 fk:text-center\" colSpan={columns.length}>\n No results.\n </TableCell>\n </TableRow>\n ) : (\n <>\n {paddingTop > 0 ? <VirtualRowSpacer height={paddingTop} /> : null}\n {virtualItems.map((virtualRow) => {\n const row = rows[virtualRow.index];\n\n return (\n <TableRow\n className={cn(\n (table.options.meta as ExtendedDataTable).getRowBackground(row),\n 'fk:flex fk:w-full fk:overflow-hidden fk:transition-none',\n !hasExplicitRowHeightClass && rowHeightEstimate == null && 'fk:h-9',\n classNames?.row\n )}\n data-index={virtualRow.index}\n data-state={row.getIsSelected() && 'selected'}\n key={virtualRow.key}\n style={{\n height: `${rowHeightPx.toString()}px`,\n }}\n >\n {paddingLeft > 0 ? <VirtualColumnSpacer width={paddingLeft} /> : null}\n {row\n .getVisibleCells()\n .slice(firstColumn, lastColumn)\n .map((cell, index) => (\n <TableCell\n className={cn(\n 'fk:flex fk:shrink-0 fk:items-center fk:truncate',\n cell.column.id === 'actions' && 'fk:pl-1!'\n )}\n aria-colindex={firstColumn + index + 1}\n key={cell.id}\n style={{\n width: cell.column.getSize(),\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n {paddingRight > 0 ? <VirtualColumnSpacer width={paddingRight} /> : null}\n </TableRow>\n );\n })}\n {paddingBottom > 0 ? <VirtualRowSpacer height={paddingBottom} /> : null}\n </>\n )}\n </TableBody>\n </TablePrimitive>\n </TooltipProvider>\n </div>\n </div>\n );\n}\n\nfunction getVirtualBodySpacers(\n virtualItems: { start: number; end: number }[],\n totalSize: number,\n scrollMargin: number\n): { paddingTop: number; paddingBottom: number } {\n if (virtualItems.length === 0) {\n return { paddingTop: 0, paddingBottom: 0 };\n }\n\n const firstStart = virtualItems[0]?.start ?? 0;\n const lastEnd = virtualItems[virtualItems.length - 1]?.end ?? 0;\n\n // Measurements include scrollMargin so range math sees the header; tbody\n // spacers must not, because the header is already in thead.\n return {\n paddingTop: Math.max(0, firstStart - scrollMargin),\n paddingBottom: Math.max(0, totalSize - (lastEnd - scrollMargin)),\n };\n}\n\nfunction VirtualColumnSpacer({ width, header = false }: { width: number; header?: boolean }): JSX.Element {\n const Component = header ? 'th' : 'td';\n\n return <Component aria-hidden style={{ width, flexShrink: 0, padding: 0, border: 0 }} />;\n}\n\nfunction VirtualRowSpacer({ height }: { height: number }): JSX.Element {\n return (\n <tr\n aria-hidden\n className=\"fk:pointer-events-none fk:border-0\"\n style={{ display: 'block', height: `${height.toString()}px` }}\n >\n <td className=\"fk:p-0 fk:border-0\" />\n </tr>\n );\n}\n\nfunction getRowClassnames(\n row: Row<AttributeValue>,\n rowDeletionState?: string[],\n rowAdditionState?: MultipleRelationshipConnection\n): string {\n if (rowDeletionState?.includes(row.original._id)) {\n return 'fk:bg-row-removed fk:hover:bg-row-removed-hover';\n }\n\n if (rowAdditionState?.some((line) => line._id === row.original._id)) {\n return 'fk:bg-row-added fk:hover:bg-row-added-hover';\n }\n\n return '';\n}\n","'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, JSX, ReactNode } from 'react';\nimport { props, uniqBy } from 'ramda';\nimport type {\n Action,\n ActionAddEntity,\n ActionAlertDialog,\n ActionDeleteEntity,\n ActionEditEntity,\n ActionEditRelationship,\n} from './types';\n\nconst ActionsContext = createContext<Action[] | []>([]);\nconst EntityDispatchContext = createContext<Dispatch<Action>>(() => undefined);\n\nfunction actionsReducer(actions: Action[], action: Action): Action[] {\n const actionType = action.type;\n\n if (!action._id) {\n action._id = Date.now().toString();\n }\n\n switch (actionType) {\n case 'DeleteEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionDeleteEntity[]), action]);\n }\n case 'AddEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAddEntity[]), action]);\n }\n case 'EditEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditEntity[]), action]);\n }\n case 'EditRelationship': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditRelationship[]), action]);\n }\n case 'AlertDialog': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAlertDialog[]), action]);\n }\n case 'Dismiss': {\n return actions.filter((item) => item._id !== action._id);\n }\n default: {\n throw Error(`Unknown action: ${actionType as string}`);\n }\n }\n}\n\nfunction ActionsProvider({ children }: { children: ReactNode }): JSX.Element {\n const [entityActions, dispatchEntityActions] = useReducer(actionsReducer, []);\n\n return (\n <ActionsContext.Provider value={entityActions}>\n <EntityDispatchContext.Provider value={dispatchEntityActions}>{children}</EntityDispatchContext.Provider>\n </ActionsContext.Provider>\n );\n}\n\nfunction useActions(): Action[] {\n return useContext(ActionsContext);\n}\n\nfunction useDispatch(): Dispatch<Action> {\n return useContext(EntityDispatchContext);\n}\n\nexport { ActionsProvider, useActions, useDispatch };\n","'use client';\n\nimport type { JSX } from 'react';\nimport { X } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\n\ninterface DataTableSortedByProps<TData> {\n table: Table<TData>;\n}\n\ntype ColumnMeta = {\n label?: string;\n};\n\nexport function DataTableSortedBy<TData>({ table }: DataTableSortedByProps<TData>): JSX.Element | null {\n const [sort] = table.getState().sorting;\n\n if (!sort) {\n return null;\n }\n\n const column = table.getColumn(sort.id);\n const label = (column?.columnDef.meta as ColumnMeta | undefined)?.label ?? sort.id;\n const direction = sort.desc ? 'desc' : 'asc';\n\n return (\n <Button\n aria-label={`Clear sorting by ${label}`}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3 fk:text-success fk:border-none\"\n onClick={() => {\n table.resetSorting();\n }}\n size=\"sm\"\n variant=\"outline\"\n >\n Sorted by {label} {direction}\n <X className=\"fk:ml-1 fk:h-4 fk:w-4\" />\n </Button>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport { gql } from '@apollo/client';\nimport type { DocumentNode, ErrorLike } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport type { MutationHookOptions } from '@apollo/client/react';\nimport { getServerError, parseErrorBody } from './error-utils';\n\ntype EntityMutationResponse = [\n Dispatch<SetStateAction<boolean>>,\n Dispatch<SetStateAction<DocumentNode>>,\n Dispatch<SetStateAction<object>>,\n {\n data: unknown;\n loading: boolean;\n error: ErrorLike | undefined;\n isProjectDisabled: boolean;\n isProjectReadOnly: boolean;\n },\n];\n\nexport function useEntityMutation(): EntityMutationResponse {\n const [runMutation, setRunMutation] = useState(false);\n const [mutation, setMutation] = useState(gql`\n mutation updateEntity($any: Any) {\n any\n }\n `);\n const [options, setOptions] = useState<MutationHookOptions>({});\n const [mutateFunction, { data, loading, error }] = useMutation(mutation, options);\n\n // Parse 403 error response to determine the specific error code\n const serverError = getServerError(error);\n\n const { isProjectDisabled, isProjectReadOnly } = (() => {\n if (serverError?.statusCode === 403) {\n const responseBody = parseErrorBody<{ code?: string }>(serverError.bodyText);\n\n if (responseBody && typeof responseBody.code === 'string') {\n if (responseBody.code === 'PROJECT_PAUSED') {\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n if (responseBody.code === 'READ_ONLY_MODE') {\n return {\n isProjectDisabled: false,\n isProjectReadOnly: true,\n };\n }\n }\n\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n return {\n isProjectDisabled: false,\n isProjectReadOnly: false,\n };\n })();\n\n useEffect(() => {\n if (runMutation) {\n void mutateFunction();\n setRunMutation(false);\n }\n }, [runMutation, mutateFunction]);\n\n return [setRunMutation, setMutation, setOptions, { data, loading, error, isProjectDisabled, isProjectReadOnly }];\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { ArrowDown, ArrowUp, ChevronDown } from 'lucide-react';\nimport type { Column } from '@tanstack/react-table';\nimport { cn } from '../ui/lib/utils';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableColumnHeaderProps<TData, TValue> {\n column: Column<TData, TValue>;\n title: string;\n className?: string;\n}\n\nexport function DataTableColumnHeader<TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>): JSX.Element {\n if (!column.getCanSort()) {\n return <div className={cn('fk:flex fk:items-center', className)}>{title}</div>;\n }\n\n const isSortedAsc = column.getIsSorted() === 'asc';\n const isSortedDesc = column.getIsSorted() === 'desc';\n\n return (\n <div className={cn('fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-1', className)}>\n <span className=\"fk:truncate\">{title}</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n aria-label={`Sort ${title}`}\n className=\"fk:inline-flex fk:shrink-0 fk:items-center fk:justify-center fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:outline-hidden fk:hover:bg-accent fk:hover:text-accent-foreground fk:focus-visible:ring-1 fk:focus-visible:ring-ring fk:corner-squircle\"\n type=\"button\"\n >\n <ChevronDown className=\"fk:h-3.5 fk:w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-44\">\n <DropdownMenuItem\n aria-checked={isSortedAsc}\n className={cn(isSortedAsc && 'fk:bg-accent fk:text-accent-foreground')}\n onSelect={() => {\n if (isSortedAsc) {\n column.clearSorting();\n\n return;\n }\n\n column.toggleSorting(false);\n }}\n role=\"menuitemcheckbox\"\n >\n <ArrowUp className={cn('fk:h-4 fk:w-4', isSortedAsc && 'fk:text-white')} />\n Sort Ascending\n </DropdownMenuItem>\n <DropdownMenuItem\n aria-checked={isSortedDesc}\n className={cn(isSortedDesc && 'fk:bg-accent fk:text-accent-foreground')}\n onSelect={() => {\n if (isSortedDesc) {\n column.clearSorting();\n\n return;\n }\n\n column.toggleSorting(true);\n }}\n role=\"menuitemcheckbox\"\n >\n <ArrowDown className={cn('fk:h-4 fk:w-4', isSortedDesc && 'fk:text-white')} />\n Sort Descending\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import { CircleCheck, CircleX } from 'lucide-react';\n\nexport function Boolean({ value }: { value: boolean }) {\n return (\n <div className=\"fk:flex fk:w-full fk:justify-center\">\n {value ? (\n <CircleCheck className=\"fk:w-4 fk:h-4 fk:text-emerald-500\" />\n ) : (\n <CircleX className=\"fk:w-4 fk:h-4 fk:text-muted-foreground\" />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { JSX, MouseEvent } from 'react';\nimport { Check as CheckIcon, Copy as CopyIcon } from 'lucide-react';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/primitives/tooltip';\nimport { cn } from '../../ui/lib/utils';\n\nconst TOOLTIP_MAX_LENGTH = 500;\nconst COPIED_DISMISS_MS = 3000;\n\ntype CopyableTruncatedTextProps = {\n value: string;\n};\n\nexport function CopyableTruncatedText({ value }: CopyableTruncatedTextProps): JSX.Element {\n const textRef = useRef<HTMLSpanElement>(null);\n const dismissTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [copied, setCopied] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n useEffect(() => {\n return () => {\n if (dismissTimeoutRef.current) {\n clearTimeout(dismissTimeoutRef.current);\n }\n };\n }, []);\n\n function measureTruncation(): boolean {\n const element = textRef.current;\n\n if (!element) {\n return false;\n }\n\n return element.scrollWidth > element.clientWidth;\n }\n\n async function handleClick(event: MouseEvent<HTMLButtonElement>): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (!value) {\n return;\n }\n\n try {\n await navigator.clipboard.writeText(value);\n } catch {\n return;\n }\n\n setCopied(true);\n setTooltipOpen(true);\n\n if (dismissTimeoutRef.current) {\n clearTimeout(dismissTimeoutRef.current);\n }\n\n dismissTimeoutRef.current = setTimeout(() => {\n setCopied(false);\n setTooltipOpen(false);\n }, COPIED_DISMISS_MS);\n }\n\n function handlePointerEnter(): void {\n measureTruncation();\n }\n\n function handleTooltipOpenChange(open: boolean): void {\n if (copied) {\n return;\n }\n\n if (open) {\n setTooltipOpen(measureTruncation());\n\n return;\n }\n\n setTooltipOpen(false);\n }\n\n if (!value) {\n return <div className=\"fk:truncate\" />;\n }\n\n const tooltipText =\n value.length > TOOLTIP_MAX_LENGTH ? `${value.slice(0, TOOLTIP_MAX_LENGTH)}…` : value;\n\n return (\n <Tooltip open={tooltipOpen} onOpenChange={handleTooltipOpenChange}>\n <TooltipTrigger asChild>\n <button\n aria-label=\"Copy value\"\n className={cn(\n 'fk:group/copyable fk:relative fk:flex fk:w-full fk:min-w-0 fk:items-center fk:rounded-sm fk:border-0 fk:bg-transparent fk:px-0.5 fk:-mx-0.5 fk:py-0.5 fk:text-left fk:text-inherit fk:font-inherit fk:corner-squircle',\n 'fk:cursor-pointer fk:transition-[transform,background-color] fk:duration-75 fk:ease-out',\n 'fk:hover:bg-muted/50 fk:active:translate-y-px fk:active:scale-[0.98] fk:active:bg-muted/70',\n 'fk:focus-visible:outline-hidden fk:focus-visible:ring-1 fk:focus-visible:ring-ring'\n )}\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n type=\"button\"\n >\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:pr-4\" ref={textRef}>\n {value}\n </span>\n <span\n aria-hidden\n className={cn(\n 'fk:pointer-events-none fk:absolute fk:right-0.5 fk:top-1/2 fk:flex fk:-translate-y-1/2 fk:items-center fk:justify-center',\n 'fk:rounded-sm fk:bg-muted/80 fk:p-0.5 fk:text-muted-foreground fk:shadow-sm fk:ring-1 fk:ring-border/60 fk:corner-squircle',\n 'fk:transition-opacity fk:duration-100',\n copied\n ? 'fk:opacity-100 fk:text-foreground'\n : 'fk:opacity-0 fk:group-hover/copyable:opacity-100 fk:group-focus-visible/copyable:opacity-100'\n )}\n >\n {copied ? <CheckIcon className=\"fk:size-3\" /> : <CopyIcon className=\"fk:size-3\" />}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"fk:max-w-xs fk:wrap-break-word\">\n {copied ? 'Copied to clipboard' : tooltipText}\n </TooltipContent>\n </Tooltip>\n );\n}\n","import { CopyableTruncatedText } from './copyable-truncated-text';\n\nexport function Text({ value }: { value: string | object | unknown[] }) {\n let displayValue = typeof value === 'object' || Array.isArray(value) ? JSON.stringify(value) : value;\n displayValue = displayValue === 'null' || displayValue == null ? '' : String(displayValue);\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n","import {\n AIHighlight,\n CharacterCount,\n CodeBlockLowlight,\n Color,\n CustomKeymap,\n GlobalDragHandle,\n HighlightExtension,\n HorizontalRule,\n Placeholder,\n StarterKit,\n TaskItem,\n TaskList,\n TextStyle,\n TiptapImage,\n TiptapLink,\n TiptapUnderline,\n Twitter,\n Youtube,\n Mathematics,\n UploadImagesPlugin,\n} from 'novel';\nimport { Markdown } from 'tiptap-markdown';\nimport { cx } from 'class-variance-authority';\nimport { common, createLowlight } from 'lowlight';\n\n//TODO I am using cx here to get tailwind autocomplete working, idk if someone else can write a regex to just capture the class key in objects\nconst aiHighlight = AIHighlight;\n//You can overwrite the placeholder with your own configuration\nconst placeholder = Placeholder;\nconst tiptapLink = TiptapLink.configure({\n HTMLAttributes: {\n 'class': cx(\n 'fk:text-muted-foreground fk:underline fk:underline-offset-[3px] fk:hover:text-primary fk:transition-colors fk:cursor-pointer'\n ),\n },\n});\n\nconst markdownExtension = Markdown.configure({\n html: true,\n tightLists: true,\n tightListClass: 'tight',\n bulletListMarker: '-',\n linkify: false,\n breaks: false,\n transformPastedText: false,\n transformCopiedText: false,\n});\n\nconst tiptapImage = TiptapImage.extend({\n addProseMirrorPlugins() {\n return [\n UploadImagesPlugin({\n imageClass: cx('fk:opacity-40 fk:rounded-lg fk:border fk:border-stone-200 fk:corner-squircle'),\n }),\n ];\n },\n}).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: cx('fk:rounded-lg fk:border fk:border-muted fk:corner-squircle'),\n },\n});\n\nconst taskList = TaskList.configure({\n HTMLAttributes: {\n class: cx('fk:not-prose fk:pl-2 '),\n },\n});\nconst taskItem = TaskItem.configure({\n HTMLAttributes: {\n 'class': cx('fk:flex gap-2 fk:items-start fk:my-2'),\n },\n nested: true,\n});\n\nconst horizontalRule = HorizontalRule.configure({\n HTMLAttributes: {\n 'class': cx('mt-4 mb-6 border-t border-muted-foreground'),\n },\n});\n\nconst starterKit = StarterKit.configure({\n bulletList: {\n HTMLAttributes: {\n 'class': cx('fk:list-disc fk:list-outside fk:leading-3 fk:-mt-2'),\n },\n },\n orderedList: {\n HTMLAttributes: {\n 'class': cx('fk:list-decimal fk:list-outside fk:leading-3 fk:-mt-2'),\n },\n },\n listItem: {\n HTMLAttributes: {\n 'class': cx('fk:leading-normal fk:-mb-2'),\n },\n },\n blockquote: {\n HTMLAttributes: {\n 'class': cx('fk:border-l-4 fk:border-primary'),\n },\n },\n codeBlock: false,\n code: {\n HTMLAttributes: {\n 'class': cx('fk:rounded-md fk:bg-muted fk:px-1.5 fk:py-1 fk:font-mono fk:font-medium fk:corner-squircle'),\n spellcheck: 'false',\n },\n },\n horizontalRule: false,\n dropcursor: {\n color: '#DBEAFE',\n width: 4,\n },\n gapcursor: false,\n});\n\nconst codeBlockLowlight = CodeBlockLowlight.configure({\n // configure lowlight: common / all / use highlightJS in case there is a need to specify certain language grammars only\n // common: covers 37 language grammars which should be good enough in most cases\n lowlight: createLowlight(common),\n});\n\nconst youtube = Youtube.configure({\n HTMLAttributes: {\n 'class': cx('fk:rounded-lg fk:border fk:border-muted fk:corner-squircle'),\n },\n inline: false,\n});\n\nconst twitter = Twitter.configure({\n HTMLAttributes: {\n 'class': cx('fk:not-prose'),\n },\n inline: false,\n});\n\nconst mathematics = Mathematics.configure({\n HTMLAttributes: {\n 'class': cx('fk:text-foreground fk:rounded-sm fk:p-1 fk:hover:bg-muted fk:cursor-pointer fk:corner-squircle'),\n },\n katexOptions: {\n throwOnError: false,\n },\n});\n\nconst characterCount = CharacterCount.configure();\n\nexport const defaultExtensions: readonly unknown[] = [\n starterKit,\n placeholder,\n tiptapLink,\n tiptapImage,\n taskList,\n taskItem,\n horizontalRule,\n aiHighlight,\n codeBlockLowlight,\n youtube,\n twitter,\n mathematics,\n characterCount,\n TiptapUnderline,\n markdownExtension,\n HighlightExtension,\n TextStyle,\n Color,\n CustomKeymap,\n GlobalDragHandle,\n];\n","import { getSchema, getText, getTextSerializersFromSchema } from '@tiptap/core';\nimport type { Extensions } from '@tiptap/core';\nimport { Node } from '@tiptap/pm/model';\nimport { defaultExtensions } from '../../form/fields/editor/extensions';\n\n// generateText builds this schema for every call. Grid cells share the same\n// extensions, so compile once, on the first rich-text preview that needs it.\nlet serializer: ReturnType<typeof createSerializer> | undefined;\n\nfunction createSerializer() {\n const schema = getSchema(defaultExtensions as Extensions);\n\n return { schema, textSerializers: getTextSerializersFromSchema(schema) };\n}\n\nexport function getEditorPreviewText(value: string | undefined, maxLength = 100): string {\n if (!value) {\n return '';\n }\n\n try {\n const document = JSON.parse(value);\n serializer ??= createSerializer();\n\n return getText(Node.fromJSON(serializer.schema, document), {\n textSerializers: serializer.textSerializers,\n }).substring(0, maxLength);\n } catch {\n return value.substring(0, maxLength);\n }\n}\n","import { useMemo } from 'react';\nimport { getEditorPreviewText } from './editor-text';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\n/**\n * Renders a preview of the editor content.\n */\nexport function Editor({ value }: { value: string }) {\n const textValue = useMemo(() => getEditorPreviewText(value), [value]);\n\n return <CopyableTruncatedText value={textValue} />;\n}\n","import { useEffect, useMemo, useState } from 'react';\n\ntype CacheEntry = {\n objectUrl: string;\n byteSize: number;\n lastUsedAt: number;\n};\n\nconst MAX_CACHE_ENTRIES = 250;\nconst MAX_SINGLE_BLOB_BYTES = 2_500_000; // ~2.5MB\n\nconst blobUrlCache = new Map<string, CacheEntry>();\nconst inFlightLoads = new Map<string, Promise<void>>();\nconst corsBlockedUrls = new Set<string>();\nconst preloadedImages = new Map<string, HTMLImageElement>();\n\nfunction ensurePreloaded(url: string): void {\n if (preloadedImages.has(url)) {\n return;\n }\n\n const img = new Image();\n img.decoding = 'async';\n img.src = url;\n preloadedImages.set(url, img);\n}\n\nfunction touch(url: string): void {\n const entry = blobUrlCache.get(url);\n\n if (!entry) {\n return;\n }\n\n blobUrlCache.set(url, { ...entry, lastUsedAt: Date.now() });\n}\n\nfunction evictIfNeeded(): void {\n if (blobUrlCache.size <= MAX_CACHE_ENTRIES) {\n return;\n }\n\n const entries = Array.from(blobUrlCache.entries()).sort((a, b) => a[1].lastUsedAt - b[1].lastUsedAt);\n const evictCount = Math.max(1, Math.ceil(MAX_CACHE_ENTRIES * 0.1));\n\n for (let i = 0; i < evictCount && i < entries.length; i += 1) {\n const [url, entry] = entries[i];\n blobUrlCache.delete(url);\n\n URL.revokeObjectURL(entry.objectUrl);\n }\n}\n\nasync function loadToCache(url: string): Promise<void> {\n if (corsBlockedUrls.has(url)) {\n ensurePreloaded(url);\n\n return;\n }\n\n if (blobUrlCache.has(url)) {\n touch(url);\n\n return;\n }\n\n const existing = inFlightLoads.get(url);\n\n if (existing) {\n await existing;\n\n return;\n }\n\n const promise = (async () => {\n try {\n const res = await fetch(url, {\n mode: 'cors',\n cache: 'force-cache',\n });\n\n if (!res.ok) {\n ensurePreloaded(url);\n\n return;\n }\n\n const blob = await res.blob();\n\n if (blob.size > MAX_SINGLE_BLOB_BYTES) {\n return;\n }\n\n const objectUrl = URL.createObjectURL(blob);\n blobUrlCache.set(url, { objectUrl, byteSize: blob.size, lastUsedAt: Date.now() });\n evictIfNeeded();\n } catch (err: unknown) {\n // Most common failure is CORS (TypeError: Failed to fetch). If so, avoid retrying.\n if (err instanceof TypeError) {\n corsBlockedUrls.add(url);\n }\n\n ensurePreloaded(url);\n }\n })();\n\n inFlightLoads.set(url, promise);\n\n await promise;\n\n inFlightLoads.delete(url);\n}\n\n/**\n * Keeps a stable, in-memory cached image src across virtualized unmount/remount cycles.\n * Falls back to the original URL if the image can’t be fetched (e.g. due to CORS).\n */\nexport function useCachedImageSrc(url: string | null | undefined): string | null {\n const initial = useMemo(() => {\n if (!url) {\n return null;\n }\n\n const cached = blobUrlCache.get(url);\n\n if (!cached) {\n return null;\n }\n\n touch(url);\n\n return cached.objectUrl;\n }, [url]);\n\n const [src, setSrc] = useState<string | null>(initial);\n\n useEffect(() => {\n if (!url) {\n setSrc(null);\n\n return;\n }\n\n if (corsBlockedUrls.has(url)) {\n ensurePreloaded(url);\n setSrc(null);\n\n return;\n }\n\n const cached = blobUrlCache.get(url);\n\n if (cached) {\n touch(url);\n setSrc(cached.objectUrl);\n\n return;\n }\n\n setSrc(null);\n let isStale = false;\n\n loadToCache(url).then(() => {\n const next = blobUrlCache.get(url);\n\n if (!next) {\n return;\n }\n\n if (isStale) {\n return;\n }\n\n touch(url);\n setSrc(next.objectUrl);\n });\n\n return () => {\n isStale = true;\n };\n }, [url]);\n\n return src;\n}\n","import type { JSX } from 'react';\nimport { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from '../../ui/primitives/tooltip';\nimport { IMAGES_BASE_URL } from '../../core/api-paths';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { useCachedImageSrc } from '../../ui/hooks/use-cached-image-src';\n\nexport type Asset = {\n _id: string;\n path: string;\n /** Total connected assets; the fetched array is bounded by the query's `first`. */\n totalCount?: number;\n};\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: Asset | Asset[] }) {\n if (Array.isArray(value)) {\n return <AssetStack value={value} />;\n }\n\n return <SingleAsset value={value} />;\n}\n\nfunction SingleAsset({ value }: { value: Asset }) {\n const path = value?.path ?? '';\n const hasPath = Boolean(path);\n const isImage = hasPath && /\\.(png|jpe?g|gif|webp|avif|svg)$/i.test(path);\n\n const getExtensionFromPath = (p: string): string => {\n const [clean] = p.split('?');\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n };\n\n const thumbnaillUrl = hasPath\n ? path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=84&h=84&f=webp`\n : null;\n\n const fullUrl = hasPath\n ? path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=624&h=624&f=webp`\n : '';\n\n const cachedThumbnailSrc = useCachedImageSrc(thumbnaillUrl);\n\n if (!hasPath) {\n return null;\n }\n\n return (\n <div className=\"fk:z-10\">\n {isImage ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n alt=\"asset\"\n className={`fk:w-7 fk:h-7 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n decoding=\"async\"\n src={cachedThumbnailSrc ?? undefined}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n alt=\"asset\"\n className={`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n decoding=\"async\"\n src={fullUrl}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto fk:corner-squircle\">\n {(() => {\n const ext = getExtensionFromPath(path);\n const style = (\n defaultStyles as Record<string, Record<string, string | number | boolean | undefined>>\n )[ext];\n\n return <FileTypeIcon extension={ext} {...(style || {})} />;\n })()}\n </div>\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <div className=\"fk:text-sm fk:text-muted-foreground\">Preview not available</div>\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n )}\n </div>\n );\n}\n\nfunction AssetStack({ value }: { value: Asset[] }): JSX.Element | null {\n const assets = value.filter((asset) => Boolean(asset.path)).slice(0, 3);\n // Queries bound connection edges, so the array length undercounts; the\n // aggregate total travels on each item as totalCount.\n const totalCount = Math.max(value[0]?.totalCount ?? 0, value.length);\n\n // All fetched edges can lack `path` (still-processing uploads, incomplete\n // nodes) while totalCount > 0 — especially likely now that list queries\n // only fetch the first 3 edges. Show a count so the cell is not blank.\n if (assets.length === 0) {\n if (totalCount > 0) {\n return (\n <div className=\"fk:flex fk:items-center\">\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n {totalCount === 1 ? '1 asset' : `${totalCount} assets`}\n </span>\n </div>\n );\n }\n\n return null;\n }\n\n const overflowCount = totalCount - assets.length;\n\n return (\n <div className=\"fk:flex fk:items-center\">\n <div className=\"fk:flex fk:-space-x-2\">\n {assets.map((asset) => (\n <img\n alt=\"asset\"\n className={`fk:h-7 fk:w-7 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n decoding=\"async\"\n key={asset._id}\n src={`${IMAGES_BASE_URL}${asset.path}?w=84&h=84&f=webp`}\n />\n ))}\n </div>\n {overflowCount > 0 ? (\n <span className=\"fk:ml-2 fk:text-xs fk:text-muted-foreground\">+{overflowCount}</span>\n ) : null}\n </div>\n );\n}\n","import { format, isValid } from 'date-fns';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\nexport function DateTime({ value }: { value: string | object | unknown[] }) {\n if (value === null || value === undefined || value === '' || typeof value !== 'string') {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const date = new Date(value);\n\n if (!isValid(date)) {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const displayValue = format(date, 'MMM d, yyyy') + ' at ' + format(date, 'HH:mm');\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n","import type { JSX } from 'react';\nimport type { SelectOptions } from '../../core/types';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\ntype SelectListItem = {\n label: string;\n value: string;\n};\n\ntype GroupedSelectList = {\n groupLabel: string;\n items: SelectListItem[];\n};\n\nfunction isGroupedSelectList(option: SelectListItem | GroupedSelectList): option is GroupedSelectList {\n return 'groupLabel' in option;\n}\n\nfunction flattenSelectList(list: SelectOptions['list']): SelectListItem[] {\n return list.flatMap((option) => {\n if (isGroupedSelectList(option)) {\n return option.items;\n }\n\n return [option];\n });\n}\n\nfunction resolveSelectLabel(value: string, list: SelectOptions['list'] | undefined): string {\n if (!list) {\n return value;\n }\n\n const match = flattenSelectList(list).find((item) => String(item.value) === value);\n\n if (!match) {\n return value;\n }\n\n return match.label;\n}\n\nexport function Select({\n value,\n options,\n}: {\n value: string | number | null | undefined;\n options?: SelectOptions;\n}): JSX.Element {\n if (value === null || value === undefined) {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const stringValue = String(value);\n const displayValue = resolveSelectLabel(stringValue, options?.list);\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n","import { Badge } from '../../ui/primitives/badge';\n\nexport function Tags({ value }: { value: string }) {\n if (!value || !value.split(',').length) {\n return null;\n }\n\n return (\n <div className=\"fk:flex fk:flex-wrap fk:gap-1 fk:max-w-full truncate\">\n {value.split(',').map((tag) => (\n <Badge\n className=\"fk:px-2.5 fk:py-0 fk:font-normal fk:text-[0.6875rem] fk:leading-4\"\n key={tag}\n variant=\"secondary\"\n >\n {tag}\n </Badge>\n ))}\n </div>\n );\n}\n","export const DEFAULT_RATING_MAX = 5;\n\nexport type RatingState = {\n /** Number of filled stars. */\n filled: number;\n /** Total number of stars. */\n max: number;\n /** Accessible description, e.g. \"4 out of 5 stars\". */\n label: string;\n};\n\n/**\n * Turns a stored value into what the stars show. Non-numeric, missing and\n * empty values yield `null` (render nothing); numbers are rounded and clamped\n * to `[0, max]`. `max` comes from `options.max` and falls back to five.\n */\nexport function getRatingState(value: unknown, max: number | undefined = DEFAULT_RATING_MAX): RatingState | null {\n const total = Number.isFinite(max) && (max as number) >= 1 ? Math.floor(max as number) : DEFAULT_RATING_MAX;\n const numeric = typeof value === 'string' && value.trim() !== '' ? Number(value) : value;\n\n if (typeof numeric !== 'number' || !Number.isFinite(numeric)) {\n return null;\n }\n\n const filled = Math.min(total, Math.max(0, Math.round(numeric)));\n\n return { filled, max: total, label: `${String(filled)} out of ${String(total)} stars` };\n}\n","import type { JSX } from 'react';\nimport { Star } from 'lucide-react';\nimport type { NumberOptions } from '../../core/types';\nimport { getRatingState } from './rating-state';\n\ntype Props = {\n value: number | string | null | undefined;\n options?: NumberOptions;\n};\n\n/** Filled stars for a numeric attribute (`previewType: 'rating'`); `options.max` sets the count. */\nexport function Rating({ value, options }: Props): JSX.Element {\n const state = getRatingState(value, options?.max);\n\n if (!state) {\n return <span />;\n }\n\n return (\n <span aria-label={state.label} className=\"fk:inline-flex fk:items-center fk:gap-0.5\" role=\"img\" title={state.label}>\n {Array.from({ length: state.max }, (_, index) => (\n <Star\n aria-hidden\n className={\n index < state.filled\n ? 'fk:h-3.5 fk:w-3.5 fk:fill-amber-400 fk:text-amber-400'\n : 'fk:h-3.5 fk:w-3.5 fk:fill-transparent fk:text-muted-foreground/40'\n }\n key={index}\n strokeWidth={1.5}\n />\n ))}\n </span>\n );\n}\n","const IMAGE_EXTENSION = /\\.(png|jpe?g|gif|webp|avif|svg)$/i;\n\nexport type AssetUrlFields = {\n mimeType?: string | null;\n originalFilename?: string | null;\n path?: string | null;\n url?: string | null;\n};\n\nfunction getFilenameFromUrl(url: string): string {\n try {\n const { pathname } = new URL(url);\n const segment = pathname.split('/').pop();\n\n return segment || pathname;\n } catch {\n const [pathname] = url.split('?');\n\n return pathname;\n }\n}\n\nexport function getAssetFilename(asset: AssetUrlFields): string {\n if (asset.originalFilename) {\n return asset.originalFilename;\n }\n\n if (asset.path) {\n return asset.path;\n }\n\n if (asset.url) {\n return getFilenameFromUrl(asset.url);\n }\n\n return '';\n}\n\nexport function getExtensionFromAsset(asset: AssetUrlFields): string {\n const filename = getAssetFilename(asset);\n const [clean] = filename.split('?');\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n}\n\nexport function isImageAsset(asset: AssetUrlFields): boolean {\n if (asset.mimeType) {\n return asset.mimeType.startsWith('image/');\n }\n\n return IMAGE_EXTENSION.test(getAssetFilename(asset));\n}\n\nexport function getAssetImageUrl(url: string, size?: { height: number; width: number }): string {\n if (!url || !size) {\n return url;\n }\n\n if (getFilenameFromUrl(url).toLowerCase().endsWith('.svg')) {\n return url;\n }\n\n const params = new URLSearchParams({\n f: 'webp',\n h: String(size.height),\n w: String(size.width),\n });\n const separator = url.includes('?') ? '&' : '?';\n\n return `${url}${separator}${params.toString()}`;\n}\n","import { useState, type ComponentType, type JSX, type MouseEvent } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Tooltip,\n TooltipContent,\n TooltipPortal,\n TooltipProvider,\n TooltipTrigger,\n} from '../../../../ui';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { getAssetImageUrl, getExtensionFromAsset, isImageAsset, type AssetUrlFields } from '../asset-url';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: AssetUrlFields }): JSX.Element | null {\n const [isZoomOpen, setIsZoomOpen] = useState(false);\n const url = value?.url ?? '';\n\n if (!value || (!url && !value.path && !value.originalFilename)) {\n return null;\n }\n\n const isImage = isImageAsset(value) && Boolean(url);\n\n if (!isImage) {\n const ext = getExtensionFromAsset(value);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto fk:corner-squircle\">\n <FileTypeIconCompat extension={ext} {...(style || {})} />\n </div>\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <div className=\"fk:text-sm fk:text-muted-foreground\">Preview not available</div>\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n </TooltipProvider>\n </div>\n );\n }\n\n const thumbnailUrl = getAssetImageUrl(url, { width: 84, height: 84 });\n const fullUrl = getAssetImageUrl(url, { width: 624, height: 624 });\n\n function handleThumbnailClick(event: MouseEvent<HTMLImageElement>): void {\n event.stopPropagation();\n setIsZoomOpen(true);\n }\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n src={thumbnailUrl}\n alt=\"asset\"\n className={`fk:w-12 fk:h-12 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n onClick={handleThumbnailClick}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n src={fullUrl}\n alt=\"asset\"\n className={`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n <Dialog open={isZoomOpen} onOpenChange={setIsZoomOpen}>\n <DialogContent className=\"fk:sm:max-w-4xl fk:p-3\">\n <DialogHeader>\n <DialogTitle className=\"fk:sr-only\">Asset preview</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Enlarged asset preview</DialogDescription>\n </DialogHeader>\n <img\n src={url}\n alt=\"asset\"\n className={`fk:max-h-[85vh] fk:w-full fk:overflow-hidden fk:rounded-md fk:object-contain fk:corner-squircle`}\n />\n </DialogContent>\n </Dialog>\n </TooltipProvider>\n </div>\n );\n}\n","import { ComponentType } from 'react';\nimport type { JSX } from 'react';\nimport type { CellContext, Column, ColumnDef, Row, Table } from '@tanstack/react-table';\nimport type { Attribute, InputType, NumberOptions, SelectOptions } from '../core/types';\nimport type { AttributeValue } from '../graphql-client/types';\nimport { useAuth } from '../auth/auth-context';\nimport { filterAttributesForSpaces } from '../core/spaces';\nimport { Checkbox } from '../ui/primitives/checkbox';\nimport { Boolean as BooleanPrefiewField } from './preview-components/boolean';\nimport { Text as TextPreviewField } from './preview-components/text';\nimport { Editor as EditorPreviewField } from './preview-components/editor';\nimport { Asset as AssetPreviewField } from './preview-components/asset';\nimport { DateTime as DateTimePreviewField } from './preview-components/datetime';\nimport { Select as SelectPreviewField } from './preview-components/select';\nimport { Tags as TagsPreviewField } from './preview-components/tags';\nimport { Rating as RatingPreviewField } from './preview-components/rating';\nimport { Asset as AssetManagerAssetPreviewField } from '../apps/asset-manager/data-grid/preview-components/asset';\nimport { DataTableColumnHeader } from './data-table-column-header';\n\nconst SORTABLE_INPUT_TYPES = new Set<InputType>([\n 'text',\n 'number',\n 'datetime',\n 'switch',\n 'select',\n]);\n\ntype Props<TData> = {\n attributesSchema: Attribute[];\n checkboxSelect?: 'single' | 'multiple'; // whether to include a checkbox column for row selection\n actionsComponent?: (row: Row<TData>) => JSX.Element; // a component to be displayed in the actions column of the grid\n enableColumnSorting?: boolean;\n};\n\ntype ColumnDefinition<TData extends AttributeValue, TValue> = ColumnDef<TData, TValue> & { id?: string; size: number };\n\nexport function useGridColumnsDefinition<TData extends AttributeValue, TValue>({\n attributesSchema,\n checkboxSelect,\n actionsComponent,\n enableColumnSorting = false,\n}: Props<TData>): ColumnDefinition<TData, TValue>[] {\n const [, auth] = useAuth();\n // Space-bound attributes are filtered out for non-members; their values are\n // null-ed by the server anyway, this just avoids rendering empty columns.\n const visibleAttributesSchema = filterAttributesForSpaces(attributesSchema, auth.user?.spaces);\n const inputTypeToPreviewFieldMap = {\n 'datetime': 'datetime',\n 'editor': 'editor',\n 'asset': 'asset',\n 'number': 'text',\n 'relationship': 'text',\n 'select': 'select',\n 'switch': 'boolean',\n 'text': 'text',\n 'textarea': 'text',\n };\n const previewFieldComponentsMap = {\n 'boolean': BooleanPrefiewField,\n 'date': TextPreviewField,\n 'datetime': DateTimePreviewField,\n 'editor': EditorPreviewField,\n 'asset': AssetPreviewField,\n 'number': TextPreviewField,\n 'relationship': TextPreviewField,\n 'select': SelectPreviewField,\n 'switch': BooleanPrefiewField,\n 'text': TextPreviewField,\n 'textarea': TextPreviewField,\n 'tags': TagsPreviewField,\n 'rating': RatingPreviewField,\n // Asset Manager rows render the whole record (path, mime type, ...).\n 'assetPreviewField': AssetManagerAssetPreviewField,\n };\n\n const cols = visibleAttributesSchema\n .map((attribute) => {\n // System timestamp column is always appended last; skip schema duplicates.\n if (attribute.name === '_updatedAt') {\n return null;\n }\n\n const previewType =\n (attribute.inputType === 'relationship' && attribute.relationship?.entity === '_asset' ? 'asset' : undefined) ??\n attribute.previewType ??\n inputTypeToPreviewFieldMap[attribute.inputType as keyof typeof inputTypeToPreviewFieldMap];\n // Unknown preview types (e.g. custom ones from older configs) fall back to text.\n const previewComponent =\n (previewFieldComponentsMap[previewType as keyof typeof previewFieldComponentsMap] as\n | ComponentType<{ value: TData }>\n | undefined) ?? previewFieldComponentsMap['text'];\n\n if (attribute.hidden === true) {\n return null;\n }\n\n const isTagsPreview = previewType === 'tags';\n // Only global scalars appear on Neo4j GraphQL `{entity}Sort`. Local fields are\n // emitted as relationships (e.g. brand.metaTitle → brand_metaTitle) and cannot be sorted.\n const canSort =\n enableColumnSorting &&\n attribute.scope === 'global' &&\n SORTABLE_INPUT_TYPES.has(attribute.inputType);\n\n return {\n accessorKey: attribute.name,\n filterFn: (row: Row<TData>, id: string, value: string | string[]) => {\n if (isTagsPreview) {\n return true;\n }\n\n const selectedValues = Array.isArray(value) ? value : [value];\n\n return selectedValues.includes(row.getValue(id));\n },\n header: ({ column }: { column: Column<TData, TValue> }) =>\n canSort ? (\n <DataTableColumnHeader column={column} title={attribute.label} />\n ) : (\n <div className=\"fk:flex fk:items-center\">{attribute.label}</div>\n ),\n cell: ({ row }: CellContext<TData, TValue>) => {\n const PreviewComponent = previewComponent as ComponentType<{\n value: TData;\n options?: SelectOptions | NumberOptions;\n }>;\n\n // Select needs its option list; rating reads the star count from options.max.\n if (previewType === 'select' || previewType === 'rating') {\n return (\n <PreviewComponent\n value={row.getValue(attribute.name)}\n options={attribute.options as SelectOptions | NumberOptions | undefined}\n />\n );\n }\n\n if (previewType === 'assetPreviewField') {\n return <PreviewComponent value={row.original} />;\n }\n\n return <PreviewComponent value={row.getValue(attribute.name)} />;\n },\n enableSorting: canSort,\n enableHiding: true,\n meta: {\n label: attribute.label,\n },\n size: attribute.options?.size ?? 150,\n };\n })\n .filter((column) => column !== null);\n\n const actions = {\n id: 'actions',\n cell: ({ row }: CellContext<TData, TValue>) => (actionsComponent ? actionsComponent(row) : null),\n size: 80,\n };\n\n const updatedAt = {\n accessorKey: '_updatedAt',\n header: ({ column }: { column: Column<TData, TValue> }) =>\n enableColumnSorting ? (\n <DataTableColumnHeader column={column} title=\"Updated At\" />\n ) : (\n <div className=\"fk:flex fk:items-center\">Updated At</div>\n ),\n cell: ({ row }: CellContext<TData, TValue>) => (\n <DateTimePreviewField value={row.getValue('_updatedAt')} />\n ),\n enableSorting: enableColumnSorting,\n enableHiding: false,\n meta: {\n label: 'Updated At',\n },\n size: 220,\n };\n\n const singleCheckboxSelect = {\n id: 'select',\n cell: ({ row, table }: CellContext<TData, TValue>) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(value) => {\n table.toggleAllPageRowsSelected(false);\n row.toggleSelected(Boolean(value));\n }}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 50,\n };\n\n const multipleCheckboxSelect = {\n id: 'select',\n header: ({ table }: { table: Table<unknown> }) => (\n <Checkbox\n className=\"fk:dark:bg-white/15\"\n aria-label=\"Select all\"\n checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && 'indeterminate')}\n onCheckedChange={(value) => {\n table.toggleAllPageRowsSelected(Boolean(value));\n }}\n />\n ),\n cell: ({ row }: CellContext<TData, TValue>) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(value) => {\n row.toggleSelected(Boolean(value));\n }}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 50,\n };\n\n return [\n ...(checkboxSelect === 'single' ? [singleCheckboxSelect] : []),\n ...(checkboxSelect === 'multiple' ? [multipleCheckboxSelect] : []),\n ...(actionsComponent ? [actions] : []),\n ...cols,\n updatedAt,\n ];\n}\n"]}
1
+ {"version":3,"sources":["../src/core/attribute-scope.ts","../src/graphql-client/queries.ts","../src/graphql-client/error-utils.ts","../src/graphql-client/graphql-context.tsx","../src/graphql-client/refetch-entity-lists.ts","../src/graphql-client/use-entity-query.ts","../src/core/error/project-disabled.tsx","../src/core/error/schema-error.tsx","../src/data-grid/should-load-more.ts","../src/data-grid/data-table.tsx","../src/entities/actions-context.tsx","../src/data-grid/data-table-sorted-by.tsx","../src/graphql-client/use-entity-mutation.ts","../src/data-grid/data-table-column-header.tsx","../src/data-grid/preview-components/boolean.tsx","../src/data-grid/preview-components/copyable-truncated-text.tsx","../src/data-grid/preview-components/text.tsx","../src/form/fields/editor/extensions.ts","../src/data-grid/preview-components/editor-text.ts","../src/data-grid/preview-components/editor.tsx","../src/ui/hooks/use-cached-image-src.ts","../src/data-grid/preview-components/asset.tsx","../src/data-grid/preview-components/datetime.tsx","../src/data-grid/preview-components/select.tsx","../src/data-grid/preview-components/tags.tsx","../src/data-grid/preview-components/rating-state.ts","../src/data-grid/preview-components/rating.tsx","../src/apps/asset-manager/data-grid/asset-url.ts","../src/apps/asset-manager/data-grid/preview-components/asset.tsx","../src/data-grid/columns.tsx"],"names":["getAttributeScope","attribute","FULL_ASSET_CONNECTION_LIMIT","LIST_ASSET_CONNECTION_LIMIT","NESTED_RELATIONSHIP_LIMIT","stringTypes","temporalTypes","assetFields","assetFieldsWithoutLqip","listAssetPreviewFields","isAssetRelationshipAttribute","hasOrderedAssetConnectionProperties","entity","tagSchema","isAssetAttribute","getOrderedAssetsFromConnection","connection","typedConnection","edges","totalCount","result","edge","index","a","b","getKnownAssetSortOrders","assets","asset","unwrapNode","value","getAssetConnectionNodeFields","includeLqip","previewOnly","getAssetConnectionSelection","attributeName","includeProperties","first","propertiesSelection","nodeFields","connectionArguments","getConnectionCount","getEntityCount","results","entityNamePlural","total","getConnectionCountSelection","fieldName","whereArgument","getTopLevelCountSelection","includeCount","countMode","getDisplayAttributeSelection","primaryAttribute","scope","schema","forList","additionalScope","field","nestedEntity","find","propEq","fieldAttribute","localAttributeQuery","getFullRelatedEntityAttributesSelection","relatedEntity","relatedAcc","relatedAttribute","relationshipEntity","relationshipAttribute","getAttributesByName","attributes","attributesByName","shouldSelectAttributeInList","getSortNotNullWhere","sort","primarySort","sortAttributeName","sortAttribute","getEntityQuery","options","requestedSelection","selection","filters","entitySchema","getEntitySchema","entityName","displayAttribute","getDisplayAttribute","heading","operationName","getOperationEntityName","globalAttributesList","getAttributeListByScope","imageAttributes","getImageAttributes","localAttributes","defaultScopedAttr","acc","scopedAttribute","localAttributesList","imageFieldsSelection","imageAttributesList","relationshipAttributesList","primarySelection","relatedLimit","attributesNameList","mapQueryResult","count","items","sliceFirstThreeItems","values","primaryAttributeName","item","scopedNode","mappedQueryResult","_id","updatedAt","globalAttributes","relationshipAttributes","relatedEntityName","localValue","primaryAttributeScope","relatedItems","relatedNode","primaryScopedNode","mapQueryResultForFormFields","attributeSchema","localAttribute","getValueByScope","rawValue","aggregateCount","attr","option","getEntityUpdateMutation","entityId","originalData","dataToMutate","pluralizedEntityName","capitalize","data","filterOutInvalidAttributes","globalAttributesUpdate","localAttributesUpdate","imageAttributesUpdate","relationshipAttributesUpdate","responseType","attributeNamesList","formatResponseFieldsForMutation","nonUpdatableAttributes","omit","pick","type","attributeType","schemaAttributes","operation","toPairs","valueToStringify","typedValue","stringifyValue","getLinkedAssetId","attributeValue","nextId","originalId","disconnect","stringifyStringLiteral","connect","imageAttributesCreate","assetId","dataType","inputType","relationship","orderedAssetRelationshipUpdate","disconnectIds","uniq","idsToConnect","node","originalValue","orderedConnections","orderedConnectionIds","originalSortOrderById","getRelationshipSortOrderById","disconnectedIds","newConnections","reorderedConnections","originalSortOrder","getOrderedAssetDisconnectString","getOrderedAssetConnectString","reorder","getOrderedAssetReorderString","fieldValue","sortOrder","ids","disconnectString","connections","getOrderedAssetConnectNodes","connectString","updateString","globalAttributesArray","localAttributesArray","relationshipAttributesArray","fields","relationshipMode","relationshipEntityName","relationshipEntityAttributes","list","multipleRelationshipAttributes","str","getEntityDeleteMutation","idList","localAttributesDelete","getEntityDeleteWhere","localIds","id","idFilter","getEntityCreateMutation","entityData","_options","localAttributesCreate","relationshipAttributesCreate","defaultScope","isMultipleRelationship","hasRelationships","connectNodes","getRelatedItemsQuery","queryEntityName","getEntityAssetConnectionQuery","normalizedEntityName","assetSchema","getLocalAttributeIdsFromUpdateResponse","response","updateKey","payload","entities","nodeId","hasCause","error","getServerError","ServerError","possibleServerError","getErrorMessage","message","parseErrorBody","bodyText","getGraphQLSchemaMismatchMessage","messages","getGraphQLValidationMessages","isMissingCountStoreFieldMessage","isMissingGraphQLFieldError","CombinedGraphQLErrors","isSchemaValidationError","directMessage","isSchemaValidationMessage","serverError","responseBody","getServerErrorResult","getErrorCauseResponse","cause","causeMessage","extensions","ApolloProviderCompat","ApolloProvider","GraphQLErrorContext","createContext","useGraphQLError","ctx","useContext","createErrorLink","setSchemaErrorMessage","ErrorLink","schemaMismatchMessage","locations","path","CombinedProtocolErrors","responseError","errors","responseMessage","firstError","firstErrorMessage","additiveLink","currentProjectId","from","HttpLink","client","ApolloClient","InMemoryCache","responseObject","defaultDataIdFromObject","GraphQLProvider","children","useConfig","schemaErrorMessage","useState","useMemo","apolloClient","jsx","refetchTimer","pendingQueryNames","pendingResolvers","listeners","removalListeners","patchListeners","getEntityListQueryName","entityNameOrPlural","byPlural","byName","plural","subscribeEntityListRefetch","listener","subscribeEntityListRemoval","subscribeEntityListPatch","scheduleEntityListRemoval","queryName","entityIds","scheduleEntityListRefetch","scheduleEntityListPatch","patches","nextPatches","patch","_apolloClient","resolve","reject","names","resolvers","finish","fail","useEntityQuery","variables","isForm","setResult","isLoadingMore","setIsLoadingMore","isReloading","setIsReloading","unsupportedTotalCount","setUnsupportedTotalCount","isLoadingMoreRef","useRef","isReloadingRef","nextOffsetRef","syncedQueryKeyRef","pendingQueryKeyRef","totalCountField","queryDocument","gql","fetchMoreDocument","isLoading","fetchNextPage","refetch","networkStatus","useQuery","fetchNextPageRef","refetchRef","fetchMoreDocumentRef","previousNetworkStatusRef","variablesRef","isMissingTotalCountField","shouldFallbackToAggregate","effectiveError","isTotalCountFallbackLoading","isProjectDisabled","isProjectReadOnly","useEffect","fetchMore","useCallback","args","limit","offset","res","mappedFetchMoreResults","mapResults","pageLength","prevRows","merged","uniqBy","prop","fetchError","reload","preserve","queryKey","mapped","getVariablesOffset","previousStatus","NetworkStatus","listQueryName","unsubscribeRefetch","queryNames","unsubscribeRemoval","prev","nextResults","row","rowId","removedCount","unsubscribePatch","applyEntityListPatches","patchById","didPatch","sortEntityListResults","primarySortEntry","sortField","sortDirection","direction","left","right","leftValue","rightValue","leftText","rightText","ProjectDisabled","jsxs","Alert","AlertCircle","AlertTitle","AlertDescription","SchemaError","Fragment","summary","deployHint","details","detail","shouldLoadMore","scrollHeight","scrollTop","clientHeight","threshold","DEFAULT_ROW_HEIGHT_PX","ROW_OVERSCAN","COLUMN_OVERSCAN","STICKY_HEADER_HEIGHT_PX","inferRowHeightEstimate","rowClassName","tokens","resolveRowHeightPx","rowHeightEstimate","DataTable","classNames","columns","hasMore","initialSelectionState","onEntitySelectionChange","onLoadMore","onScroll","onSortingChange","pageSize","rowAdditionState","rowDeletionState","scrollToTopKey","sortingProp","toolbarComponent","scrollRef","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnFilters","setColumnFilters","uncontrolledSorting","setUncontrolledSorting","sorting","currentSelection","nextSelection","handleSortingChange","updater","table","useReactTable","handleRowSelectionChange","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","getRowClassnames","rows","rowHeightPx","hasExplicitRowHeightClass","rowVirtualizer","useVirtualizer","visibleColumns","headerGroups","virtualizeColumns","columnVirtualizer","columnSizesKey","column","virtualColumns","firstColumn","lastColumn","paddingLeft","paddingRight","virtualItems","paddingTop","paddingBottom","getVirtualBodySpacers","onLoadMoreRef","hasMoreRef","checkLoadMore","container","scrollElement","updaterFn","selectedIds","handleScroll","event","cn","TooltipProvider","Table","TableHeader","headerGroup","TableRow","VirtualColumnSpacer","header","TableHead","flexRender","TableBody","TableCell","VirtualRowSpacer","virtualRow","cell","totalSize","scrollMargin","firstStart","lastEnd","width","height","line","ActionsContext","EntityDispatchContext","actionsReducer","actions","action","actionType","props","ActionsProvider","entityActions","dispatchEntityActions","useReducer","useActions","useDispatch","DataTableSortedBy","label","Button","X","useEntityMutation","runMutation","setRunMutation","mutation","setMutation","setOptions","mutateFunction","loading","useMutation","DataTableColumnHeader","title","className","isSortedAsc","isSortedDesc","DropdownMenu","DropdownMenuTrigger","ChevronDown","DropdownMenuContent","DropdownMenuItem","ArrowUp","ArrowDown","Boolean","CircleCheck","CircleX","TOOLTIP_MAX_LENGTH","COPIED_DISMISS_MS","CopyableTruncatedText","textRef","dismissTimeoutRef","copied","setCopied","tooltipOpen","setTooltipOpen","measureTruncation","element","handleClick","handlePointerEnter","handleTooltipOpenChange","open","tooltipText","Tooltip","TooltipTrigger","CheckIcon","CopyIcon","TooltipContent","Text","displayValue","aiHighlight","AIHighlight","placeholder","Placeholder","tiptapLink","TiptapLink","cx","markdownExtension","Markdown","tiptapImage","TiptapImage","UploadImagesPlugin","taskList","TaskList","taskItem","TaskItem","horizontalRule","HorizontalRule","starterKit","StarterKit","codeBlockLowlight","CodeBlockLowlight","createLowlight","common","youtube","Youtube","twitter","Twitter","mathematics","Mathematics","characterCount","CharacterCount","defaultExtensions","TiptapUnderline","HighlightExtension","TextStyle","Color","CustomKeymap","GlobalDragHandle","serializer","createSerializer","getSchema","getTextSerializersFromSchema","getEditorPreviewText","maxLength","document","getText","Node","Editor","textValue","MAX_CACHE_ENTRIES","MAX_SINGLE_BLOB_BYTES","blobUrlCache","inFlightLoads","corsBlockedUrls","preloadedImages","ensurePreloaded","url","img","touch","entry","evictIfNeeded","entries","evictCount","i","loadToCache","existing","promise","blob","objectUrl","err","useCachedImageSrc","initial","cached","src","setSrc","isStale","next","transparentImageBackground","Asset","AssetStack","SingleAsset","hasPath","isImage","getExtensionFromPath","p","clean","parts","thumbnaillUrl","IMAGES_BASE_URL","fullUrl","cachedThumbnailSrc","TooltipPortal","ext","style","defaultStyles","FileTypeIcon","overflowCount","DateTime","date","isValid","format","isGroupedSelectList","flattenSelectList","resolveSelectLabel","match","Select","stringValue","Tags","tag","Badge","getRatingState","max","numeric","filled","Rating","state","_","Star","IMAGE_EXTENSION","getFilenameFromUrl","pathname","getAssetFilename","getExtensionFromAsset","filename","isImageAsset","getAssetImageUrl","size","params","separator","FileTypeIconCompat","isZoomOpen","setIsZoomOpen","thumbnailUrl","handleThumbnailClick","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","SORTABLE_INPUT_TYPES","useGridColumnsDefinition","attributesSchema","checkboxSelect","actionsComponent","enableColumnSorting","auth","useAuth","visibleAttributesSchema","filterAttributesForSpaces","inputTypeToPreviewFieldMap","previewFieldComponentsMap","cols","previewType","previewComponent","isTagsPreview","canSort","PreviewComponent","singleCheckboxSelect","Checkbox","multipleCheckboxSelect"],"mappings":"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","file":"chunk-LMVJWCOM.js","sourcesContent":["import type { Attribute, ScopeType } from './types';\n\nexport function getAttributeScope(attribute: Attribute): ScopeType {\n if (attribute.dataType === 'asset') {\n return 'global';\n }\n\n return attribute.scope;\n}\n","import { find, omit, pick, propEq, toPairs, uniq } from 'ramda';\nimport { getAttributeScope } from '../core/attribute-scope';\nimport { getDisplayAttribute } from '../core/get-display-attribute';\nimport { assetSchema } from '../entities/assets-schema';\nimport { tagSchema } from '../entities/tags-schema';\nimport type { User } from '../auth/types';\nimport type { Attribute, Entity, DataType, Schema, ScopeType, MultipleRelationshipConnection } from '../core/types';\nimport type {\n AttributeValue,\n EntityItem,\n EntityQueryResults,\n FormEntityItem,\n FormFieldValue,\n MappedEntityItem,\n MappedEntityQueryResults,\n MappedFormEntityQueryResults,\n EntityQueryResult,\n ImageValue,\n OrderedAssetValue,\n EntityQuerySelection,\n} from './types';\n\ntype EntityQuery = {\n queryEntityName: string;\n query: string;\n};\n\nexport type EntityQueryCountMode = 'aggregate' | 'total';\nexport type SortNotNullWhere = {\n NOT: {\n [attributeName: string]: {\n eq: null;\n };\n };\n};\n\n/** Page size for asset connections in forms (galleries, ordered assets). */\nexport const FULL_ASSET_CONNECTION_LIMIT = 25;\n/** List grids render at most 3 stacked asset thumbnails (plus a \"+N\" badge). */\nconst LIST_ASSET_CONNECTION_LIMIT = 3;\n/** Grids preview at most 3 nested relationship values (sliceFirstThreeItems). */\nconst NESTED_RELATIONSHIP_LIMIT = 3;\n\nconst stringTypes: DataType[] = ['id', 'string'];\nconst temporalTypes: DataType[] = ['date', 'datetime', 'duration', 'time'];\nconst assetFields = `_id\n originalFilename\n mimeType\n path\n url\n size\n height\n width\n lqip`;\n\nconst assetFieldsWithoutLqip = `_id\n originalFilename\n mimeType\n path\n url\n size\n height\n width`;\n/** List grids resolve thumbnails from the asset URL; extra metadata is unused. */\nconst listAssetPreviewFields = `_id\n path\n url`;\n\ntype AssetRelationshipConnection = {\n aggregate?: {\n count?: {\n nodes?: number;\n };\n };\n edges?: {\n properties?: {\n sortOrder?: number | null;\n } | null;\n node?: OrderedAssetValue | null;\n }[];\n};\n\nfunction isAssetRelationshipAttribute(attribute: Attribute | undefined): boolean {\n if (!attribute) {\n return false;\n }\n\n return (\n getAttributeScope(attribute) === 'relationship' &&\n attribute.relationship?.mode === 'multiple' &&\n attribute.relationship.entity === '_asset'\n );\n}\n\nfunction hasOrderedAssetConnectionProperties(attribute: Attribute | undefined, entity: Entity | undefined): boolean {\n if (!attribute || !isAssetRelationshipAttribute(attribute)) {\n return false;\n }\n\n return entity?.name !== tagSchema.name || attribute.name !== 'assets';\n}\n\nfunction isAssetAttribute(attribute: Attribute | undefined): boolean {\n return attribute?.dataType === 'asset' || attribute?.inputType === 'asset';\n}\n\nexport function getOrderedAssetsFromConnection(connection: unknown): OrderedAssetValue[] {\n const typedConnection = connection as AssetRelationshipConnection | undefined;\n const edges = typedConnection?.edges ?? [];\n // Edges are bounded by `first`; the aggregate count carries the real total so\n // consumers (e.g. the \"+N\" badge in list grids) do not undercount.\n const totalCount = typedConnection?.aggregate?.count?.nodes ?? edges.length;\n\n return edges\n .reduce<OrderedAssetValue[]>((result, edge, index) => {\n if (!edge.node) {\n return result;\n }\n\n result.push({\n ...edge.node,\n sortOrder: edge.properties?.sortOrder ?? index,\n totalCount,\n });\n\n return result;\n }, [])\n .sort((a, b) => (a.sortOrder ?? Number.MAX_SAFE_INTEGER) - (b.sortOrder ?? Number.MAX_SAFE_INTEGER));\n}\n\n/** Build the sort-order map update mutations use to detect new vs existing assets. */\nexport function getKnownAssetSortOrders(assets: OrderedAssetValue[]): { [id: string]: number } {\n return assets.reduce<{ [id: string]: number }>((result, asset, index) => {\n if (!asset._id) {\n return result;\n }\n\n return {\n ...result,\n [asset._id]: asset.sortOrder ?? index,\n };\n }, {});\n}\n\n/**\n * Relationship fields are list-typed in the generated schema ([Type!]!), so\n * single-valued fields (local attributes, global assets, single-mode\n * relationships) come back as arrays of 0..1 nodes. Unwraps to the first node,\n * tolerating the legacy single-object shape.\n */\nfunction unwrapNode(value: unknown): AttributeValue | null {\n if (Array.isArray(value)) {\n return (value[0] as AttributeValue | undefined) ?? null;\n }\n\n return (value as AttributeValue | null) ?? null;\n}\n\n/**\n * Asset connections must always be bounded: without `first` the generated\n * Cypher expands every connected asset per row (tags with thousands of assets\n * made list queries take seconds). The aggregate count is still selected, so\n * consumers can show \"+N more\" from `totalCount`.\n */\nfunction getAssetConnectionNodeFields(includeLqip: boolean, previewOnly: boolean): string {\n if (previewOnly) {\n return listAssetPreviewFields;\n }\n\n if (includeLqip) {\n return assetFields;\n }\n\n return assetFieldsWithoutLqip;\n}\n\nfunction getAssetConnectionSelection(\n attributeName: string,\n includeProperties = true,\n includeLqip = true,\n first = FULL_ASSET_CONNECTION_LIMIT,\n previewOnly = false\n): string {\n const propertiesSelection = includeProperties\n ? ` properties {\\n` + ` sortOrder\\n` + ` }\\n`\n : '';\n const nodeFields = getAssetConnectionNodeFields(includeLqip, previewOnly);\n // Edge sort input only exists when the relationship carries properties.\n const connectionArguments = includeProperties\n ? `(first: ${first}, sort: [{ edge: { sortOrder: ASC } }])`\n : `(first: ${first})`;\n\n return (\n ` ${attributeName}Connection${connectionArguments} {\\n` +\n ` aggregate {\\n` +\n ` count {\\n` +\n ` nodes\\n` +\n ` }\\n` +\n ` }\\n` +\n ` edges {\\n` +\n propertiesSelection +\n ` node {\\n` +\n ` ${nodeFields}\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n`\n );\n}\n\n/**\n * Counts moved inside connection fields in Neo4j GraphQL v7:\n * xConnection \\{ aggregate \\{ count \\{ nodes \\} \\} \\}. Reads that shape back.\n */\nfunction getConnectionCount(value: unknown): number {\n const aggregate = (value as { aggregate?: { count?: { nodes?: number } } } | null | undefined)?.aggregate;\n\n return aggregate?.count?.nodes ?? 0;\n}\n\nfunction getEntityCount(results: EntityQueryResults, entityNamePlural: string): number {\n const total = results[`${entityNamePlural}Total`];\n\n if (typeof total === 'number') {\n return total;\n }\n\n return getConnectionCount(results[`${entityNamePlural}Connection`]);\n}\n\nfunction getConnectionCountSelection(fieldName: string, whereArgument = ''): string {\n return (\n ` ${fieldName}Connection${whereArgument} {\\n` +\n ` aggregate {\\n` +\n ` count {\\n` +\n ` nodes\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n`\n );\n}\n\nfunction getTopLevelCountSelection(\n entityNamePlural: string,\n includeCount: boolean,\n countMode: EntityQueryCountMode\n): string {\n if (!includeCount) {\n return '';\n }\n\n if (countMode === 'total') {\n return ` ${entityNamePlural}Total\\n`;\n }\n\n return getConnectionCountSelection(entityNamePlural, '(where: $where)');\n}\n\n/**\n * Selection set for a related entity's display attribute only — enough for list-grid\n * relationship columns (mapQueryResult / sliceFirstThreeItems).\n */\nfunction getDisplayAttributeSelection(\n primaryAttribute: Attribute | undefined,\n scope: string,\n schema: Schema,\n forList = false\n): string {\n if (!primaryAttribute) {\n return '';\n }\n\n const additionalScope = scope === 'default' ? '' : `${scope}\\n `;\n\n if (isAssetAttribute(primaryAttribute)) {\n if (forList) {\n return ` ${primaryAttribute.name} {\\n _id\\n path\\n url\\n }\\n`;\n }\n\n return ` ${primaryAttribute.name} {\\n ${assetFields}\\n }\\n`;\n }\n\n if (getAttributeScope(primaryAttribute) === 'local') {\n return ` ${primaryAttribute.name} {\\n _id\\n default\\n ${additionalScope}}\\n`;\n }\n\n if (getAttributeScope(primaryAttribute) === 'relationship') {\n const field = primaryAttribute.relationship?.field;\n\n if (!field) {\n return ` ${primaryAttribute.name}\\n`;\n }\n\n const nestedEntity = find(propEq(primaryAttribute.relationship?.entity, 'name'))(schema) as Entity | undefined;\n const fieldAttribute = find(propEq(field, 'name'))(nestedEntity?.attributes ?? []) as Attribute | undefined;\n const localAttributeQuery =\n fieldAttribute && getAttributeScope(fieldAttribute) === 'local'\n ? `{\\n _id\\n default\\n ${additionalScope}}\\n`\n : '';\n\n if (primaryAttribute.relationship?.mode === 'single') {\n return ` ${primaryAttribute.name} {\\n ${field} ${localAttributeQuery}}\\n`;\n }\n\n return ` ${primaryAttribute.name} (limit: 3, offset: 0) {\\n ${field} ${localAttributeQuery}}\\n`;\n }\n\n return ` ${primaryAttribute.name}\\n`;\n}\n\nfunction getFullRelatedEntityAttributesSelection(\n relatedEntity: Entity | undefined,\n scope: string,\n schema: Schema\n): string {\n return (\n relatedEntity?.attributes.reduce((relatedAcc, relatedAttribute) => {\n const additionalScope = scope === 'default' ? '' : `${scope}\\n `;\n\n // Related-entity assets only render as CDN-path thumbnails in grids; the\n // base64 lqip payload is form-field-only and skipped at this depth.\n if (isAssetAttribute(relatedAttribute)) {\n return `${relatedAcc}\\n ${relatedAttribute.name} {\\n ${assetFieldsWithoutLqip}\\n }\\n `;\n }\n\n if (getAttributeScope(relatedAttribute) === 'local') {\n return `${relatedAcc}\\n ${relatedAttribute.name} {\\n _id\\n default\\n ${additionalScope}\\n}\\n `;\n }\n\n if (getAttributeScope(relatedAttribute) === 'relationship') {\n const relationshipEntity = find(propEq(relatedAttribute.relationship?.entity, 'name'))(schema) as\n | Entity\n | undefined;\n const relationshipAttribute = find(propEq(relatedAttribute.relationship?.field, 'name'))(\n relationshipEntity?.attributes ?? []\n ) as Attribute;\n const localAttributeQuery =\n getAttributeScope(relationshipAttribute) === 'local'\n ? `{\\n _id\\n default\\n ${additionalScope}}\\n `\n : '';\n\n if (relatedAttribute.relationship?.mode === 'single') {\n return `${relatedAcc}\\n ${relatedAttribute.name} {\\n ${relatedAttribute.relationship.field} ${localAttributeQuery}}\\n `;\n }\n\n if (relatedAttribute.relationship?.field) {\n return `${relatedAcc}\\n ${relatedAttribute.name} (limit: ${NESTED_RELATIONSHIP_LIMIT}, offset: 0) {\\n ${relatedAttribute.relationship.field} ${localAttributeQuery}}\\n `;\n }\n }\n\n return `${relatedAcc}\\n ${relatedAttribute.name}\\n `;\n }, '') ?? ''\n );\n}\n\nfunction getAttributesByName(attributes: Attribute[]): { [name: string]: Attribute | undefined } {\n const attributesByName: { [name: string]: Attribute | undefined } = {};\n\n for (const attribute of attributes) {\n attributesByName[attribute.name] = attribute;\n }\n\n return attributesByName;\n}\n\nfunction shouldSelectAttributeInList(attribute: Attribute | undefined): boolean {\n if (!attribute) {\n return false;\n }\n\n // Computed asset URL is hidden from the grid but required to preview and copy links.\n if (attribute.name === 'url') {\n return true;\n }\n\n if (attribute.hidden === true || attribute.name === 'lqip') {\n return false;\n }\n\n return true;\n}\n\nexport function getSortNotNullWhere(sort: unknown, entity: Entity | undefined): SortNotNullWhere | undefined {\n if (!Array.isArray(sort) || sort.length === 0) {\n return undefined;\n }\n\n const [primarySort] = sort;\n\n if (!primarySort || typeof primarySort !== 'object') {\n return undefined;\n }\n\n const [sortAttributeName] = Object.keys(primarySort);\n\n if (!sortAttributeName || ['_id', '_createdAt', '_updatedAt'].includes(sortAttributeName)) {\n return undefined;\n }\n\n const sortAttribute = entity?.attributes.find((attribute) => attribute.name === sortAttributeName);\n\n if (\n !sortAttribute ||\n getAttributeScope(sortAttribute) !== 'global' ||\n sortAttribute.dataType === 'asset'\n ) {\n return undefined;\n }\n\n return {\n NOT: {\n [sortAttributeName]: {\n eq: null,\n },\n },\n };\n}\n\nexport function getEntityQuery(\n entityNamePlural: string,\n scope: string,\n schema: Schema,\n options?: {\n selection?: EntityQuerySelection;\n /**\n * The top-level aggregate count is a filtered label scan on the server.\n * Pagination pages (fetchMore) skip it — the total from the first page\n * still stands.\n */\n includeCount?: boolean;\n countMode?: EntityQueryCountMode;\n operationName?: string;\n }\n): EntityQuery {\n const requestedSelection = options?.selection ?? 'full';\n const selection = requestedSelection === 'display' ? 'list' : requestedSelection;\n const includeCount = options?.includeCount ?? true;\n const countMode = options?.countMode ?? 'aggregate';\n const filters = `(where: $where, limit: $limit, offset: $offset, sort: $sort)`;\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const entityName = entitySchema?.name ?? entityNamePlural;\n const displayAttribute = getDisplayAttribute(entitySchema);\n const attributes = requestedSelection === 'display'\n ? (displayAttribute ? [displayAttribute] : [])\n : entitySchema?.attributes ?? [];\n const attributesByName = getAttributesByName(attributes);\n const heading = `$where: ${entityName}Where, $limit: Int, $offset: Int, $sort: [${entityName}Sort!]`;\n const operationName = options?.operationName ?? `Get${getOperationEntityName(entityNamePlural)}`;\n\n if (!entitySchema) {\n throw new Error(`Entity '${entityName}' not found in the schema`);\n }\n\n if (attributes.length === 0) {\n throw new Error(`Entity '${entityName}' has no attributes defined in the schema`);\n }\n\n const globalAttributesList: string = getAttributeListByScope('global', attributes)\n .filter((attributeName) => {\n if (attributeName === '_updatedAt') {\n return false;\n }\n\n if (selection === 'list') {\n return requestedSelection === 'display' || shouldSelectAttributeInList(attributesByName[attributeName]);\n }\n\n return true;\n })\n .join('\\n ');\n const imageAttributes = getImageAttributes(attributes).filter((attributeName) =>\n selection !== 'list' || requestedSelection === 'display' || shouldSelectAttributeInList(attributesByName[attributeName])\n );\n const localAttributes: readonly string[] = getAttributeListByScope(['local'], attributes).filter((attributeName) => {\n if (selection !== 'list') {\n return true;\n }\n\n return requestedSelection === 'display' || shouldSelectAttributeInList(attributesByName[attributeName]);\n });\n const defaultScopedAttr = localAttributes.reduce(\n (acc, attribute) => `${acc}\\n ${attribute} {\\n _id\\n default\\n }\\n `,\n ''\n );\n const scopedAttribute = localAttributes.reduce(\n (acc, attribute) => `${acc}\\n ${attribute} {\\n _id\\n default\\n ${scope}\\n }\\n `,\n ''\n );\n const localAttributesList: string = scope === 'default' ? defaultScopedAttr : scopedAttribute;\n let imageFieldsSelection = `_id\\n path\\n url`;\n\n if (selection !== 'list') {\n imageFieldsSelection =\n `_id\\n originalFilename\\n mimeType\\n path\\n url\\n size\\n height\\n width\\n lqip`;\n }\n\n const imageAttributesList: string = imageAttributes.reduce((acc, attribute) => {\n return `${acc}\\n ${attribute} {\\n ${imageFieldsSelection}\\n }\\n `;\n }, '');\n\n const relationshipAttributes = attributes.filter((attribute) => getAttributeScope(attribute) === 'relationship');\n const relationshipAttributesList: string = relationshipAttributes.reduce((acc, attribute) => {\n if (selection === 'list' && requestedSelection !== 'display' && attribute.hidden === true) {\n return acc;\n }\n\n if (isAssetRelationshipAttribute(attribute)) {\n return `${acc}\\n${getAssetConnectionSelection(\n attribute.name,\n hasOrderedAssetConnectionProperties(attribute, entitySchema),\n selection !== 'list',\n selection === 'list' ? LIST_ASSET_CONNECTION_LIMIT : FULL_ASSET_CONNECTION_LIMIT,\n selection === 'list'\n )}`;\n }\n\n const relatedEntity = find(propEq(attribute.relationship?.entity, 'name'))(schema) as Entity | undefined;\n\n if (selection === 'list') {\n const displayAttribute = getDisplayAttribute(relatedEntity);\n const primarySelection = getDisplayAttributeSelection(displayAttribute, scope, schema, true);\n const relatedLimit = attribute.relationship?.mode === 'single' ? 1 : 3;\n\n return (\n `${acc}\\n ${attribute.name} (limit: ${relatedLimit}, offset: 0) {\\n` +\n ` _id\\n` +\n `${primarySelection}` +\n ` }\\n `\n );\n }\n\n const attributesNameList = getFullRelatedEntityAttributesSelection(relatedEntity, scope, schema);\n\n return (\n `${getConnectionCountSelection(attribute.name).trim()}` +\n `${acc}\\n ${attribute.name} (limit: 25, offset: 0) { _id ${attributesNameList}` +\n `}\\n `\n );\n }, '');\n\n return {\n queryEntityName: entityNamePlural,\n query:\n `query ${operationName}(${heading}) {\\n` +\n getTopLevelCountSelection(entityNamePlural, includeCount, countMode) +\n ` ${entityNamePlural}${filters} {\\n` +\n ` _id\\n` +\n ` _updatedAt\\n` +\n ` ${globalAttributesList}` +\n ` ${localAttributesList}` +\n ` ${imageAttributesList}` +\n ` ${relationshipAttributesList}` +\n `}\\n` +\n `}\\n`,\n };\n}\n\n/**\n * Map the GraphQl results JSON to a key-value pair array. The values inside the scopedAttributes key are flattened to the first level.\n */\nexport function mapQueryResult(\n entityNamePlural: string,\n scope: string,\n results: EntityQueryResults,\n schema: Schema\n): MappedEntityQueryResults {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const attributes = entitySchema?.attributes ?? [];\n\n if (attributes.length === 0) {\n return {\n count: 0,\n results: [],\n };\n }\n\n const count = getEntityCount(results, entityNamePlural);\n const items = results[entityNamePlural] as EntityQueryResult[];\n const sliceFirstThreeItems = (values: EntityItem[], primaryAttribute: Attribute): string => {\n const primaryAttributeName = primaryAttribute.name;\n\n return values\n .slice(0, 3)\n .map((item) => {\n if (getAttributeScope(primaryAttribute) !== 'local') {\n return item[primaryAttributeName];\n }\n\n const scopedNode = unwrapNode(item[primaryAttributeName]);\n\n return scopedNode?.[scope] ?? scopedNode?.default;\n })\n .join(', ');\n };\n const mappedQueryResult = items.map((entity) => {\n const { _id } = entity;\n const updatedAt = typeof entity._updatedAt === 'string' ? entity._updatedAt : '';\n const globalAttributes = getAttributeListByScope('global', attributes)\n .filter((attributeName) => attributeName !== '_updatedAt')\n .reduce((acc, attributeName) => ({ ...acc, [attributeName]: entity[attributeName] }), {});\n const localAttributes = getAttributeListByScope('local', attributes).reduce((acc, attributeName) => {\n const scopedAttribute = unwrapNode(entity[attributeName]);\n\n return {\n ...acc,\n [attributeName]: scopedAttribute?.[scope] ? scopedAttribute[scope] : scopedAttribute?.default,\n };\n }, {});\n const imageAttributes = getImageAttributes(attributes).reduce(\n (acc, attributeName) => ({ ...acc, [attributeName]: unwrapNode(entity[attributeName]) }),\n {}\n );\n const relationshipAttributes = getAttributeListByScope(['relationship'], attributes).reduce(\n (acc, attributeName) => {\n const relationshipAttribute = find(propEq(attributeName, 'name'))(attributes) as Attribute;\n const relatedEntityName = relationshipAttribute.relationship?.entity ?? '';\n const relatedEntity = find(propEq(relatedEntityName, 'name'))(schema) as Entity | undefined;\n const primaryAttribute = getDisplayAttribute(relatedEntity);\n const localValue = entity[attributeName];\n\n if (isAssetRelationshipAttribute(relationshipAttribute)) {\n const assets = getOrderedAssetsFromConnection(entity[`${attributeName}Connection`]);\n\n return {\n ...acc,\n [attributeName]: assets,\n };\n }\n\n if (!primaryAttribute) {\n throw new Error(`There is an error in the schema for the relationship attribute \"${attributeName}\"`);\n }\n\n const primaryAttributeName = primaryAttribute.name;\n const primaryAttributeScope = getAttributeScope(primaryAttribute);\n\n // All relationship fields are lists in the schema, so the mode from the\n // JSON schema (not the value shape) decides single vs multiple mapping.\n if (relationshipAttribute.relationship?.mode === 'multiple') {\n const relatedItems = (Array.isArray(localValue) ? localValue : []) as EntityItem[];\n\n return {\n ...acc,\n [attributeName]: sliceFirstThreeItems(relatedItems, primaryAttribute),\n };\n }\n\n const relatedNode = unwrapNode(localValue);\n\n if (primaryAttributeScope === 'global') {\n return {\n ...acc,\n [attributeName]: relatedNode?.[primaryAttributeName],\n };\n }\n\n const primaryScopedNode = unwrapNode(relatedNode?.[primaryAttributeName]);\n\n return {\n ...acc,\n [attributeName]: primaryScopedNode?.[scope] ?? primaryScopedNode?.default,\n };\n },\n {}\n );\n\n return {\n _id,\n ...globalAttributes,\n ...localAttributes,\n ...imageAttributes,\n ...relationshipAttributes,\n _updatedAt: updatedAt,\n };\n });\n\n return {\n count,\n results: mappedQueryResult,\n };\n}\n\n/**\n * Like mapQueryResult but the local attribute values are returned as an object:\n * \\{_id: string, value: string, disabled: boolean, scope: string\\}.\n */\nexport function mapQueryResultForFormFields(\n entityNamePlural: string,\n scope: string,\n results: EntityQueryResults,\n schema: Schema\n): MappedFormEntityQueryResults {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const attributes = entitySchema?.attributes ?? [];\n\n if (attributes.length === 0) {\n return {\n count: 0,\n results: [],\n };\n }\n\n const count = getEntityCount(results, entityNamePlural);\n const items = results[entityNamePlural] as EntityQueryResult[];\n const mappedQueryResult = items.map((entity) => {\n const globalAttributes = getAttributeListByScope('global', attributes).reduce(\n (acc, attribute) => ({\n ...acc,\n [attribute]: {\n value: entity[attribute],\n disabled: false,\n scope: 'default',\n _id: '',\n },\n }),\n {}\n );\n const localAttributes = getAttributeListByScope('local', attributes).reduce((acc, attributeName) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(attributes) as Attribute;\n const localAttribute = unwrapNode(entity[attributeName]);\n\n return {\n ...acc,\n [attributeName]: {\n value: localAttribute ? getValueByScope(localAttribute, scope) : null,\n disabled: Boolean(\n localAttribute &&\n localAttribute[scope] === null &&\n getAttributeScope(attributeSchema) === 'local' &&\n scope !== 'default'\n ),\n scope,\n _id: localAttribute ? localAttribute._id : null,\n },\n };\n }, {});\n const imageAttributes = getImageAttributes(attributes).reduce(\n (acc, attribute) => ({\n ...acc,\n [attribute]: {\n value: unwrapNode(entity[attribute]),\n disabled: false,\n scope: 'default',\n _id: '',\n },\n }),\n {}\n );\n const relationshipAttributes = getAttributeListByScope(['relationship'], attributes).reduce(\n (acc, attributeName) => {\n const relationshipAttribute = find(propEq(attributeName, 'name'))(attributes) as Attribute;\n const rawValue = entity[attributeName];\n // Single-mode relationships come back as lists of 0..1 nodes; multiple\n // mode keeps the array so downstream grids receive it unchanged.\n const value = (\n relationshipAttribute.relationship?.mode === 'single' ? unwrapNode(rawValue) : rawValue\n ) as AttributeValue | null;\n const _id = value?._id;\n const aggregateCount = getConnectionCount(entity[`${attributeName}Connection`]);\n\n if (isAssetRelationshipAttribute(relationshipAttribute)) {\n const assets = getOrderedAssetsFromConnection(entity[`${attributeName}Connection`]);\n\n return {\n ...acc,\n [attributeName]: {\n count: aggregateCount,\n _id,\n knownAssetSortOrders: getKnownAssetSortOrders(assets),\n value: assets,\n disabled: false,\n scope,\n },\n };\n }\n\n return {\n ...acc,\n [attributeName]: {\n count: aggregateCount,\n _id,\n value,\n disabled: false,\n scope,\n },\n };\n },\n {}\n );\n\n return { ...globalAttributes, ...localAttributes, ...imageAttributes, ...relationshipAttributes };\n });\n\n return {\n count,\n results: mappedQueryResult,\n };\n}\n\n/**\n * Attribute values can be an object or an array of objects if the attribute is a multi-select.\n */\nfunction getValueByScope(\n attribute: AttributeValue | AttributeValue[],\n scope: string\n): FormFieldValue[] | AttributeValue | AttributeValue[] | string | null {\n if (Array.isArray(attribute)) {\n return attribute.reduce((result: FormFieldValue[], attr: AttributeValue) => {\n if (attr[scope] ?? attr.default) {\n const option = {\n _id: attr._id,\n disabled: Boolean(attr.scope === null && scope !== 'default'),\n scope,\n value: attr[scope] ?? attr.default,\n };\n\n result.push(option);\n }\n\n return result;\n }, []);\n }\n\n return attribute[scope] ?? attribute.default ?? null;\n}\n\n/**\n * Returns a string with the GraphQl query needed to mutate the dataToMutate object for the given entity and scope.\n */\nexport function getEntityUpdateMutation(\n entityNamePlural: string,\n entityId: string,\n scope: string,\n schema: Schema,\n originalData: FormEntityItem,\n dataToMutate: FormEntityItem,\n options?: { currentUser?: User; responseFields?: string }\n): string {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const entityName = entitySchema?.name ?? entityNamePlural;\n const attributes = entitySchema?.attributes ?? [];\n const pluralizedEntityName = capitalize(entityNamePlural);\n\n if (attributes.length === 0) {\n return '';\n }\n\n const data = filterOutInvalidAttributes(attributes, dataToMutate);\n const globalAttributes = globalAttributesUpdate(attributes, data);\n const localAttributes = localAttributesUpdate(entityId, attributes, data, scope);\n const imageAttributes = imageAttributesUpdate(attributes, originalData, data);\n const relationshipAttributes = relationshipAttributesUpdate(attributes, originalData, data);\n const responseType = entityNamePlural;\n const attributeNamesList =\n options?.responseFields ?? formatResponseFieldsForMutation(schema, entityNamePlural, scope);\n const operationName = `Update${getOperationEntityName(entityNamePlural)}`;\n\n return (\n `mutation ${operationName}($where: ${entityName}Where) {\\n` +\n ` update${pluralizedEntityName}(\\n` +\n ` where: $where\\n` +\n ` update: {${globalAttributes}${localAttributes}${imageAttributes}${relationshipAttributes}\\n }\\n` +\n ` ) {\\n` +\n ` ${responseType} {\\n` +\n ` _id\\n` +\n ` ${attributeNamesList}` +\n ` }\\n` +\n ` }\\n` +\n `}\\n`\n );\n}\n\n/**\n * Filter out any attribute received from the form that does not exist in the schema.\n */\nfunction filterOutInvalidAttributes(attributes: Attribute[], dataToMutate: FormEntityItem): FormEntityItem {\n // Read-only attributes are never written by the Studio.\n const nonUpdatableAttributes: readonly string[] = attributes\n .filter((attribute) => attribute.readOnly === true)\n .map((attribute) => attribute.name);\n const data = omit(nonUpdatableAttributes, dataToMutate);\n\n return pick(\n attributes.map((attribute) => attribute.name) as unknown as readonly [number, ...number[]],\n data\n ) as FormEntityItem;\n}\n\n/**\n * Filter attributes by scope: local, global or relationship.\n */\nfunction getAttributeListByScope(type: ScopeType | ScopeType[], attributes: Attribute[]): Attribute['name'][] {\n if (Array.isArray(type)) {\n return type.reduce((acc: Attribute['name'][], attributeType: ScopeType) => {\n return acc.concat(getAttributeListByScope(attributeType, attributes));\n }, []);\n }\n\n const filteredAttributes = attributes.filter(\n (attribute) => getAttributeScope(attribute) === type && attribute.inputType !== 'asset'\n );\n\n return filteredAttributes.map((attribute) => attribute.name);\n}\n\n/**\n * Get all attributes that are of type image.\n */\nfunction getImageAttributes(attributes: Attribute[]): Attribute['name'][] {\n const filteredAttributes = attributes.filter(isAssetAttribute);\n\n return filteredAttributes.map((attribute) => attribute.name);\n}\n\n/**\n * Update inputs require the dedicated set operator in Neo4j GraphQL v7\n * (name: \\{ set: value \\}); create inputs still take plain values.\n */\nfunction globalAttributesUpdate(\n schemaAttributes: Attribute[],\n data: FormEntityItem,\n operation: 'create' | 'update' = 'update'\n): string {\n const globalAttributes = pick(getAttributeListByScope('global', schemaAttributes) as [string], data);\n const attributesString = toPairs(globalAttributes).reduce((acc, [attributeName, value]) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const valueToStringify = Array.isArray(value?.value) ? null : (value?.value ?? null);\n const typedValue = stringifyValue(attributeSchema.dataType, valueToStringify);\n\n // Omit empty optional globals on create — `field: ` with no value is invalid GraphQL.\n if (operation === 'create' && (typedValue === null || typedValue === '')) {\n return acc;\n }\n\n if (operation === 'update') {\n return `${acc}\\n ${attributeName}: { set: ${typedValue} }`;\n }\n\n return `${acc}\\n ${attributeName}: ${typedValue}`;\n }, '');\n\n return attributesString;\n}\n\n/**\n * Returns the asset _id of a field value when it points at a real asset.\n * Cleared fields keep a stub value without a path, so path is required too.\n */\nfunction getLinkedAssetId(value: ImageValue | null | undefined): string {\n if (!value?._id || !value.path) {\n return '';\n }\n\n return value._id;\n}\n\n/**\n * Asset nodes are created up front by the /assets endpoint, so entity saves\n * only connect/disconnect them by _id. Disconnect runs before connect so the\n * field keeps at most one linked asset.\n */\nfunction imageAttributesUpdate(\n schemaAttributes: Attribute[],\n originalData: FormEntityItem,\n data: FormEntityItem\n): string {\n const imageAttributes = pick(getImageAttributes(schemaAttributes) as [string], data);\n const attributesArray: [string, FormFieldValue][] = toPairs(imageAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const nextId = getLinkedAssetId(attributeValue.value as ImageValue | null);\n const originalId = getLinkedAssetId(originalData[attributeName]?.value as ImageValue | null | undefined);\n\n if (nextId === originalId) {\n return acc;\n }\n\n const disconnect = originalId\n ? ` {\\n disconnect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(originalId)} }\\n }\\n }\\n }]\\n }\\n`\n : '';\n const connect = nextId\n ? ` {\\n connect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(nextId)} }\\n }\\n }\\n }]\\n }\\n`\n : '';\n\n return `${acc}\\n ${attributeName}: [\\n${disconnect}${connect} ]`;\n }, '');\n\n return attributesString;\n}\n\nfunction imageAttributesCreate(schemaAttributes: Attribute[], data: FormEntityItem): string {\n const imageAttributes = pick(getImageAttributes(schemaAttributes) as [string], data);\n const attributesArray: [string, FormFieldValue][] = toPairs(imageAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const assetId = getLinkedAssetId(attributeValue.value as ImageValue | null);\n\n if (!assetId) {\n return acc;\n }\n\n return (\n `${acc}\\n ${attributeName}: {\\n` +\n ` connect: [{\\n` +\n ` where: {\\n` +\n ` node: {\\n` +\n ` _id: { eq: ${stringifyStringLiteral(assetId)} }\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }]\\n` +\n ` }`\n );\n }, '');\n\n return attributesString;\n}\n\nfunction localAttributesUpdate(\n entityId: string,\n schemaAttributes: Attribute[],\n data: FormEntityItem,\n scope: string\n): string {\n const localAttributes = pick(getAttributeListByScope('local', schemaAttributes) as [string], data);\n const attributesArray: [string, FormFieldValue][] = toPairs(localAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const { dataType } = attributeSchema;\n const typedValue =\n attributeValue.disabled || Array.isArray(attributeValue.value)\n ? 'null'\n : stringifyValue(dataType, attributeValue.value);\n\n if (attributeValue._id) {\n return `${acc}\\n ${attributeName}: [{\\n update: {\\n node: {\\n ${scope}: { set: ${typedValue} }\\n }\\n }\\n }]`;\n }\n\n // Match localAttributesCreate: never create nodes for empty values. Empty\n // locals used to stringify to the string \"null\" and create with a\n // deterministic id; the next save then hit a unique-constraint failure\n // because the form still had no _id for those fields.\n if (\n attributeValue.disabled ||\n Array.isArray(attributeValue.value) ||\n attributeValue.value === undefined ||\n attributeValue.value === null ||\n attributeValue.value === '' ||\n typedValue === null ||\n typedValue === ''\n ) {\n return acc;\n }\n\n return (\n `${acc}\\n ${attributeName}: [{\\n` +\n ` create: {\\n` +\n ` node: {\\n` +\n ` _id: ${stringifyStringLiteral(`${entityId}:${attributeName}`)}\\n` +\n ` _type: \"${dataType}\"\\n` +\n ` ${scope}: ${typedValue}\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }]`\n );\n }, '');\n\n return attributesString;\n}\n\nfunction relationshipAttributesUpdate(\n schemaAttributes: Attribute[],\n originalData: FormEntityItem,\n data: FormEntityItem\n): string {\n const relationshipAttributes = pick(getAttributeListByScope('relationship', schemaAttributes) as [string], data);\n const attributesArray = toPairs(relationshipAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const { inputType, relationship } = attributeSchema;\n\n if (inputType === 'relationship' && relationship?.mode === 'single') {\n const originalId = originalData[attributeName]._id ?? '';\n const nextId = attributeValue._id ?? '';\n\n if (originalId === nextId) {\n return acc;\n }\n\n // Relationship fields are lists in the schema; disconnect runs before\n // connect so the field keeps at most one related node.\n const disconnect = originalId\n ? ` {\\n disconnect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(originalId)} }\\n }\\n }\\n }]\\n }\\n`\n : '';\n const connect = nextId\n ? ` {\\n connect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(nextId)} }\\n }\\n }\\n }]\\n }\\n`\n : '';\n\n return `${acc}\\n ${attributeName}: [\\n${disconnect}${connect} ]`;\n }\n\n if (inputType === 'relationship' && relationship?.mode === 'multiple') {\n if (relationship.entity === '_asset') {\n return `${acc}${orderedAssetRelationshipUpdate(attributeName, originalData[attributeName], attributeValue)}`;\n }\n\n // Neo4j GraphQL v7 expects list-shaped connect/disconnect entries with\n // `where.node`. The old `disconnect.where.OR` form drops the filter and\n // disconnects every related node.\n const disconnectIds = uniq(attributeValue.relationships?.disconnect ?? []).filter(Boolean);\n const connections = (attributeValue.relationships?.connect as MultipleRelationshipConnection | null) ?? [];\n const idsToConnect = connections.map((node) => stringifyStringLiteral(node._id)).join(', ');\n const disconnect = disconnectIds.length\n ? ` {\\n disconnect: [\\n${disconnectIds\n .map(\n (_id) =>\n ` {\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(_id)} }\\n }\\n }\\n }\\n`\n )\n .join('')} ]\\n }\\n`\n : '';\n const connect = idsToConnect\n ? ` {\\n connect: [{\\n where: {\\n node: {\\n _id: { in: [${idsToConnect}] }\\n }\\n }\\n }]\\n }\\n`\n : '';\n\n if (!disconnect && !connect) {\n return acc;\n }\n\n return `${acc}\\n ${attributeName}: [\\n${disconnect}${connect} ]`;\n }\n\n return `${acc}\\n`;\n }, '');\n\n return attributesString;\n}\n\nfunction orderedAssetRelationshipUpdate(\n attributeName: string,\n originalValue: FormFieldValue | undefined,\n attributeValue: FormFieldValue\n): string {\n const connections = (attributeValue.relationships?.connect as MultipleRelationshipConnection | null) ?? [];\n const orderedConnections = connections.map((connection, index) => ({\n ...connection,\n sortOrder: connection.sortOrder ?? index,\n }));\n const orderedConnectionIds = orderedConnections.map((connection) => connection._id);\n // Merge paged-in server assets from the live field so load-more edges are not\n // mistaken for brand-new connects (which would duplicate relationship edges).\n const originalSortOrderById = {\n ...getRelationshipSortOrderById(originalValue),\n ...(originalValue?.knownAssetSortOrders ?? {}),\n ...(attributeValue.knownAssetSortOrders ?? {}),\n };\n const disconnectedIds = uniq(attributeValue.relationships?.disconnect ?? []).filter(\n (_id) => _id && !orderedConnectionIds.includes(_id)\n );\n // In Neo4j GraphQL v7 connect always creates a new relationship, so\n // reconnecting an already-connected asset would duplicate the edge. New\n // assets are connected; existing ones with a changed sortOrder get a nested\n // update on the edge instead.\n const newConnections = orderedConnections.filter((connection) => originalSortOrderById[connection._id] === undefined);\n const reorderedConnections = orderedConnections.filter((connection) => {\n const originalSortOrder = originalSortOrderById[connection._id];\n\n return originalSortOrder !== undefined && originalSortOrder !== connection.sortOrder;\n });\n const disconnect = getOrderedAssetDisconnectString(disconnectedIds);\n const connect = getOrderedAssetConnectString(newConnections);\n const reorder = getOrderedAssetReorderString(reorderedConnections);\n\n if (!disconnect && !connect && !reorder) {\n return '';\n }\n\n return `\\n ${attributeName}: [\\n${disconnect}${connect}${reorder} ]`;\n}\n\nfunction getRelationshipSortOrderById(fieldValue: FormFieldValue | undefined): { [id: string]: number } {\n const value = fieldValue?.value;\n\n if (!Array.isArray(value)) {\n return {};\n }\n\n return value.reduce<{ [id: string]: number }>((result, item, index) => {\n if (typeof item !== 'object' || !item || !('_id' in item)) {\n return result;\n }\n\n const { _id } = item;\n\n if (typeof _id !== 'string' || _id.length === 0) {\n return result;\n }\n\n const sortOrder = 'sortOrder' in item && typeof item.sortOrder === 'number' ? item.sortOrder : index;\n\n return {\n ...result,\n [_id]: sortOrder,\n };\n }, {});\n}\n\nfunction getOrderedAssetDisconnectString(ids: string[]): string {\n if (ids.length === 0) {\n return '';\n }\n\n const nodes = ids.reduce((disconnectString, _id) => {\n return `${disconnectString} {\\n where: { node: { _id: { eq: ${stringifyStringLiteral(_id)} } } }\\n }\\n`;\n }, '');\n\n return ` {\\n disconnect: [\\n${nodes} ]\\n }\\n`;\n}\n\nfunction getOrderedAssetConnectString(connections: MultipleRelationshipConnection): string {\n if (connections.length === 0) {\n return '';\n }\n\n const nodes = getOrderedAssetConnectNodes(connections);\n\n return ` {\\n connect: [\\n${nodes} ]\\n }\\n`;\n}\n\nfunction getOrderedAssetConnectNodes(connections: MultipleRelationshipConnection): string {\n return connections.reduce((connectString, connection, index) => {\n const sortOrder = connection.sortOrder ?? index;\n\n return (\n `${connectString} {\\n` +\n ` where: { node: { _id: { eq: ${stringifyStringLiteral(connection._id)} } } }\\n` +\n ` edge: { sortOrder: ${sortOrder} }\\n` +\n ` }\\n`\n );\n }, '');\n}\n\nfunction getOrderedAssetReorderString(connections: MultipleRelationshipConnection): string {\n if (connections.length === 0) {\n return '';\n }\n\n const nodes = connections.reduce((updateString, connection, index) => {\n const sortOrder = connection.sortOrder ?? index;\n\n return (\n `${updateString} {\\n` +\n ` update: {\\n` +\n ` where: { node: { _id: { eq: ${stringifyStringLiteral(connection._id)} } } }\\n` +\n ` edge: { sortOrder: { set: ${sortOrder} } }\\n` +\n ` }\\n` +\n ` }\\n`\n );\n }, '');\n\n return nodes;\n}\n\nfunction stringifyValue(\n type: DataType,\n value: boolean | number | string | MappedEntityItem | EntityItem | AttributeValue | ImageValue | null | undefined\n): string | null {\n if (temporalTypes.includes(type)) {\n return value?.toString() ? stringifyStringLiteral(value.toString()) : null;\n }\n\n if (stringTypes.includes(type)) {\n // null/undefined must be GraphQL null, not the string literal \"null\".\n if (value === undefined || value === null) {\n return null;\n }\n\n return stringifyStringLiteral(value.toString());\n }\n\n // Empty optional numbers/booleans must not stringify to \"\" (breaks GraphQL as `field: `).\n if (value === undefined || value === null || value === '') {\n return null;\n }\n\n return value.toString();\n}\n\nfunction stringifyNullableString(value: string | null | undefined): string {\n return value ? stringifyStringLiteral(value) : 'null';\n}\n\nfunction stringifyStringLiteral(value: string): string {\n return JSON.stringify(value);\n}\n\nfunction formatResponseFieldsForMutation(schema: Schema, entityNamePlural: string, scope: string): string {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const schemaAttributes = entitySchema?.attributes ?? [];\n const globalAttributesArray = getAttributeListByScope('global', schemaAttributes);\n const localAttributesArray = getAttributeListByScope('local', schemaAttributes);\n const relationshipAttributesArray = getAttributeListByScope('relationship', schemaAttributes);\n\n let fields = globalAttributesArray.reduce((acc, attributeName: string) => {\n return `${acc}${attributeName}\\n `;\n }, '');\n\n fields += localAttributesArray.reduce((acc, attributeName: string) => {\n return `${acc} ${attributeName} {\\n _id\\n ${scope}\\n }\\n `;\n }, '');\n\n fields += relationshipAttributesArray.reduce((acc, attributeName: string) => {\n const relationshipAttribute = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute | undefined;\n const relationshipMode = relationshipAttribute?.relationship?.mode ?? 'single';\n\n if (isAssetRelationshipAttribute(relationshipAttribute)) {\n return `${acc}${getAssetConnectionSelection(\n attributeName,\n hasOrderedAssetConnectionProperties(relationshipAttribute, entitySchema)\n )}`;\n }\n\n const relationshipEntityName = relationshipAttribute?.relationship?.entity ?? '';\n const relationshipEntitySchema = find(propEq(relationshipEntityName, 'name'))(schema) as Entity | undefined;\n const relationshipEntityAttributes = relationshipEntitySchema?.attributes ?? [];\n const primaryAttributeName =\n relationshipAttribute?.relationship?.field ?? '[invalid_relationship_field_name_in_schema]';\n const primaryAttribute = find(propEq(primaryAttributeName, 'name'))(relationshipEntityAttributes) as Attribute;\n const primaryAttributeScope = getAttributeScope(primaryAttribute);\n let list = '';\n\n if (relationshipMode === 'single') {\n if (primaryAttributeScope === 'global') {\n list = ` ${attributeName} {\\n _id\\n ${primaryAttributeName}\\n }\\n `;\n }\n\n if (primaryAttributeScope === 'local') {\n list = ` ${attributeName} {\\n _id\\n ${primaryAttributeName} {\\n _id\\n default\\n ${scope}\\n }\\n }\\n `;\n }\n }\n\n if (relationshipMode === 'multiple' && relationshipEntityAttributes.length) {\n const multipleRelationshipAttributes = relationshipEntityAttributes.reduce((str, attribute) => {\n if (getAttributeScope(attribute) === 'local') {\n return `${str} ${attribute.name} {\\n _id\\n default\\n ${scope}\\n }\\n`;\n }\n\n if (getAttributeScope(attribute) === 'relationship') {\n const additionalScope = scope === 'default' ? '' : `${scope}\\n `;\n const relationshipEntity = find(propEq(attribute.relationship?.entity, 'name'))(schema) as Entity | undefined;\n const relationshipAttribute = find(propEq(attribute.relationship?.field, 'name'))(\n relationshipEntity?.attributes ?? []\n ) as Attribute;\n const localAttributeQuery =\n getAttributeScope(relationshipAttribute) === 'local'\n ? `{\\n _id\\n default\\n ${additionalScope}}\\n `\n : '';\n\n if (attribute.relationship?.mode === 'single') {\n return `${str} ${attribute.name} {\\n ${attribute.relationship.field} ${localAttributeQuery}}\\n `;\n }\n\n if (attribute.relationship?.field) {\n return `${str} ${attribute.name} (limit: ${NESTED_RELATIONSHIP_LIMIT}, offset: 0) {\\n ${attribute.relationship.field} ${localAttributeQuery}}\\n `;\n }\n }\n\n // Display-only at this depth; lqip is a form-field concern.\n if (isAssetAttribute(attribute)) {\n return `${str} ${attribute.name} {\\n ${assetFieldsWithoutLqip}\\n }\\n`;\n }\n\n return `${str} ${attribute.name}\\n `;\n }, '');\n\n list =\n getConnectionCountSelection(attributeName) +\n ` ${attributeName} (limit: 25, offset: 0) {\\n${multipleRelationshipAttributes}` +\n ` }\\n`;\n }\n\n return `${acc}${list}`;\n }, '');\n\n return fields;\n}\n\n/**\n * Returns a string with the GraphQl mutation needed to delete one or more entities.\n */\nexport function getEntityDeleteMutation(\n entityName: string,\n schema: Schema,\n ids: string | readonly string[]\n): string {\n const idList = typeof ids === 'string' ? [ids] : [...ids];\n const entitySchema = find(propEq(entityName, 'name'))(schema) as Entity | undefined;\n const attributes = entitySchema?.attributes ?? [];\n const pluralizedEntityName = capitalize(entitySchema?.plural ?? '');\n const localAttributes = localAttributesDelete(attributes, idList);\n const operationName = `Delete${getOperationEntityName(entitySchema?.plural ?? entityName)}`;\n\n if (entityName === '_asset') {\n return (\n `mutation ${operationName}($where: ${entityName}Where) {\\n` +\n ` delete_assets(\\n` +\n ` where: $where\\n` +\n ` ) {\\n` +\n ` nodesDeleted\\n` +\n ` relationshipsDeleted\\n` +\n ` }\\n` +\n `}\\n`\n );\n }\n\n return (\n `mutation ${operationName}($where: ${entityName}Where) {\\n` +\n ` delete${pluralizedEntityName}(\\n` +\n ` where: $where\\n` +\n `${localAttributes ? ` delete: {\\n ${localAttributes}\\n }\\n` : ''}` +\n ` ) {\\n` +\n ` nodesDeleted\\n` +\n ` relationshipsDeleted\\n` +\n ` }\\n` +\n `}\\n`\n );\n}\n\nexport function getEntityDeleteWhere(ids: string | readonly string[]): { _id: { eq: string } } | { _id: { in: string[] } } {\n const idList = typeof ids === 'string' ? [ids] : [...ids];\n\n if (idList.length === 1) {\n return { _id: { eq: idList[0] as string } };\n }\n\n return { _id: { in: idList } };\n}\n\nfunction localAttributesDelete(schemaAttributes: Attribute[], ids: readonly string[]): string {\n const localAttributes = getAttributeListByScope('local', schemaAttributes);\n const attributesString: string = localAttributes.reduce((acc, attributeName) => {\n const localIds = ids.map((id) => stringifyStringLiteral(`${id}:${attributeName}`)).join(', ');\n const idFilter = ids.length === 1 ? `_id: { eq: ${localIds} }` : `_id: { in: [${localIds}] }`;\n\n return (\n `${acc}\\n` +\n ` ${attributeName}: [{\\n` +\n ` where: {\\n` +\n ` node: {\\n` +\n ` ${idFilter}\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }]`\n );\n }, '');\n\n return attributesString;\n}\n\nexport function getEntityCreateMutation(\n entityNamePlural: string,\n schema: Schema,\n entityData: FormEntityItem,\n _id: string,\n _options?: { currentUser?: User }\n): string {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const attributes = entitySchema?.attributes ?? [];\n const pluralizedEntityName = capitalize(entitySchema?.plural ?? '');\n\n if (attributes.length === 0) {\n return '';\n }\n\n const data = filterOutInvalidAttributes(attributes, entityData);\n const globalAttributes = globalAttributesUpdate(attributes, data, 'create');\n const localAttributes = localAttributesCreate(attributes, data, 'default', _id);\n const imageAttributes = imageAttributesCreate(attributes, data);\n const relationshipAttributes = relationshipAttributesCreate(attributes, data);\n const responseType = entityNamePlural;\n const attributeNamesList = formatResponseFieldsForMutation(schema, responseType, 'default');\n const operationName = `Create${getOperationEntityName(entityNamePlural)}`;\n\n return (\n `mutation ${operationName} {\\n` +\n ` create${pluralizedEntityName}(\\n` +\n ` input: [{\\n` +\n ` _id: ${stringifyStringLiteral(_id)}` +\n ` ${globalAttributes}` +\n ` ${localAttributes}\\n` +\n ` ${imageAttributes}\\n` +\n ` ${relationshipAttributes}\\n` +\n ` }]\\n` +\n ` ) {\\n` +\n ` ${responseType} {\\n` +\n ` _id\\n` +\n ` ${attributeNamesList}` +\n ` }\\n` +\n ` }\\n` +\n `}\\n`\n );\n}\n\nfunction localAttributesCreate(\n schemaAttributes: Attribute[],\n data: FormEntityItem,\n defaultScope: string,\n _id: string\n): string {\n const localAttributes = pick(getAttributeListByScope('local', schemaAttributes) as [string], data);\n const attributesArray = toPairs(localAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n if (attributeValue?.value === undefined || attributeValue.value === null || attributeValue.value === '') {\n return acc;\n }\n\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const typedValue = Array.isArray(attributeValue.value)\n ? 'null'\n : stringifyValue(attributeSchema.dataType, attributeValue.value);\n\n return (\n `${acc}\\n` +\n ` ${attributeName}: {\\n` +\n ` create: [{\\n` +\n ` node: {\\n` +\n ` _id: ${stringifyStringLiteral(`${_id}:${attributeName}`)}\\n` +\n ` _type: \"${attributeSchema.dataType}\"\\n` +\n ` ${defaultScope}: ${typedValue}\\n` +\n ` }\\n` +\n ` }]\\n` +\n ` }`\n );\n }, '');\n\n return attributesString;\n}\n\nfunction relationshipAttributesCreate(schemaAttributes: Attribute[], data: FormEntityItem): string {\n const relationshipAttributes = pick(getAttributeListByScope('relationship', schemaAttributes) as [string], data);\n const attributesArray = toPairs(relationshipAttributes);\n const attributesString: string = attributesArray.reduce((acc, [attributeName, attributeValue]) => {\n const attributeSchema = find(propEq(attributeName, 'name'))(schemaAttributes) as Attribute;\n const { inputType, relationship } = attributeSchema;\n\n if (inputType === 'relationship' && relationship?.mode === 'single') {\n if (!attributeValue._id) {\n return acc;\n }\n\n const connect = `connect: [{\\n where: {\\n node: {\\n _id: { eq: ${stringifyStringLiteral(attributeValue._id)} }\\n }\\n }\\n }]\\n`;\n\n return `${acc}\\n ${attributeName}: {\\n ${connect} }`;\n }\n\n const isMultipleRelationship = inputType === 'relationship' && relationship?.mode === 'multiple';\n const hasRelationships =\n Array.isArray(attributeValue.relationships?.connect) && attributeValue.relationships.connect.length > 0;\n if (isMultipleRelationship && hasRelationships) {\n const connections = (attributeValue.relationships?.connect as MultipleRelationshipConnection | null) ?? [];\n\n if (relationship?.entity === '_asset') {\n const connectNodes = getOrderedAssetConnectNodes(\n connections.map((connection, index) => ({\n ...connection,\n sortOrder: connection.sortOrder ?? index,\n }))\n );\n\n return `${acc}\\n ${attributeName}: {\\n connect: [\\n${connectNodes} ]\\n }`;\n }\n\n const idsToConnect = connections.map((node) => stringifyStringLiteral(node._id)).join(', ');\n const connect = idsToConnect\n ? `connect: {\\n where: {\\n node: {\\n _id: { in: [${idsToConnect}] }\\n }\\n }\\n }\\n`\n : '';\n\n return `${acc}\\n ${attributeName}: {\\n ${connect} }`;\n }\n\n return `${acc}\\n`;\n }, '');\n\n return attributesString;\n}\n\nexport function getRelatedItemsQuery({\n relatedEntityName,\n scope,\n schema,\n}: {\n attributeName: string;\n relatedEntityName: string;\n scope: string;\n schema: Schema;\n}): EntityQuery {\n const entitySchema = find(propEq(relatedEntityName, 'name'))(schema) as Entity | undefined;\n const queryEntityName = entitySchema?.plural ?? '';\n\n if (!queryEntityName) {\n return {\n queryEntityName: '',\n query: '',\n };\n }\n\n return getEntityQuery(queryEntityName, scope, schema, {\n selection: 'list',\n operationName: `GetRelated${getOperationEntityName(queryEntityName)}`,\n });\n}\n\n/**\n * Pages an entity's ordered asset connection beyond the initial form `first`.\n * Callers grow `first` (e.g. loaded + page size) so already-fetched edges are\n * re-returned in sortOrder and can be merged without a cursor.\n */\nexport function getEntityAssetConnectionQuery({\n attributeName,\n entityName,\n entityNamePlural,\n schema,\n}: {\n attributeName: string;\n entityName: string;\n entityNamePlural: string;\n schema: Schema;\n}): EntityQuery {\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const attribute = find(propEq(attributeName, 'name'))(entitySchema?.attributes ?? []) as Attribute | undefined;\n const includeProperties = hasOrderedAssetConnectionProperties(attribute, entitySchema);\n const propertiesSelection = includeProperties\n ? ` properties {\\n` + ` sortOrder\\n` + ` }\\n`\n : '';\n const connectionArguments = includeProperties\n ? '(first: $first, sort: [{ edge: { sortOrder: ASC } }])'\n : '(first: $first)';\n const operationName = `Get${getOperationEntityName(entityName)}AssetConnection`;\n\n return {\n queryEntityName: entityNamePlural,\n query:\n `query ${operationName}($where: ${entityName}Where, $first: Int) {\\n` +\n ` ${entityNamePlural}(where: $where) {\\n` +\n ` ${attributeName}Connection${connectionArguments} {\\n` +\n ` aggregate {\\n` +\n ` count {\\n` +\n ` nodes\\n` +\n ` }\\n` +\n ` }\\n` +\n ` edges {\\n` +\n propertiesSelection +\n ` node {\\n` +\n ` ${assetFields}\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n` +\n ` }\\n` +\n `}\\n`,\n };\n}\n\nconst capitalize = (str: string): string => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\n\nexport function getOperationEntityName(entityName: string): string {\n const normalizedEntityName = entityName\n .split(/[^0-9A-Za-z]+/)\n .filter(Boolean)\n .map(capitalize)\n .join('');\n\n if (!normalizedEntityName) {\n return 'Entity';\n }\n\n if (/^[A-Za-z_]/.test(normalizedEntityName)) {\n return normalizedEntityName;\n }\n\n return `Entity${normalizedEntityName}`;\n}\n\nexport function getEntitySchema(schema: Schema, entityNamePlural: string): Entity | undefined {\n if (entityNamePlural === '_assets') {\n return assetSchema;\n }\n\n return find(propEq(entityNamePlural, 'plural'))(schema) as Entity | undefined;\n}\n\n/**\n * Pulls local-attribute node _ids out of an update mutation response so the\n * form can adopt them without a full refetch (which re-dirties the drawer).\n */\nexport function getLocalAttributeIdsFromUpdateResponse(\n response: unknown,\n entityNamePlural: string,\n schema: Schema\n): { [attributeName: string]: string } {\n if (!response || typeof response !== 'object') {\n return {};\n }\n\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n\n if (!entitySchema) {\n return {};\n }\n\n const updateKey = `update${capitalize(entityNamePlural)}`;\n const payload = (response as { [key: string]: unknown })[updateKey];\n\n if (!payload || typeof payload !== 'object') {\n return {};\n }\n\n const entities = (payload as { [key: string]: unknown })[entityNamePlural];\n const entity = Array.isArray(entities) ? entities[0] : undefined;\n\n if (!entity || typeof entity !== 'object') {\n return {};\n }\n\n return entitySchema.attributes.reduce<{ [attributeName: string]: string }>((ids, attribute) => {\n if (getAttributeScope(attribute) !== 'local') {\n return ids;\n }\n\n const node = unwrapNode((entity as { [key: string]: unknown })[attribute.name]);\n const nodeId = node?._id;\n\n if (typeof nodeId !== 'string' || nodeId.length === 0) {\n return ids;\n }\n\n return {\n ...ids,\n [attribute.name]: nodeId,\n };\n }, {});\n}\n","import type { ErrorLike } from '@apollo/client';\nimport { CombinedGraphQLErrors, ServerError } from '@apollo/client/errors';\n\ntype ErrorWithCause = ErrorLike & { cause?: unknown };\ntype ErrorWithMessage = {\n message?: unknown;\n};\ntype ServerErrorWithResult = ServerError & {\n result?: unknown;\n};\ntype GraphQLErrorResponse = {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n};\ntype GraphQLErrorItem = {\n extensions?: {\n code?: unknown;\n };\n message?: unknown;\n};\n\nfunction hasCause(error: ErrorLike): error is ErrorWithCause {\n if (!error) {\n return false;\n }\n\n return 'cause' in (error as ErrorWithCause);\n}\n\nexport function getServerError(error?: ErrorLike): ServerError | null {\n if (!error) {\n return null;\n }\n\n if (ServerError.is(error)) {\n return error;\n }\n\n if (hasCause(error)) {\n const possibleServerError = error.cause;\n\n if (ServerError.is(possibleServerError)) {\n return possibleServerError;\n }\n }\n\n return null;\n}\n\nfunction getErrorMessage(error: unknown): string | null {\n if (!error || typeof error !== 'object') {\n return null;\n }\n\n const { message } = error as ErrorWithMessage;\n\n return typeof message === 'string' ? message : null;\n}\n\nexport function parseErrorBody<T>(bodyText: string | undefined): T | null {\n if (!bodyText) {\n return null;\n }\n\n try {\n return JSON.parse(bodyText) as T;\n } catch {\n return null;\n }\n}\n\nexport function getGraphQLSchemaMismatchMessage(error?: ErrorLike): string | null {\n if (!error) {\n return null;\n }\n\n const messages = getGraphQLValidationMessages(error).filter((message) => !isMissingCountStoreFieldMessage(message));\n\n if (messages.length === 0) {\n return null;\n }\n\n return [\n 'The deployed schema is out of sync with your local Flexkit schema.',\n 'Run `flexkit deploy` using the CLI to apply your latest schema changes.',\n ...messages.map((message) => `- ${message}`),\n ].join('\\n');\n}\n\nexport function isMissingGraphQLFieldError(error: ErrorLike | undefined, fieldName: string): boolean {\n if (!error) {\n return false;\n }\n\n return getGraphQLValidationMessages(error).some((message) => {\n return message.includes(`Cannot query field \"${fieldName}\"`);\n });\n}\n\nfunction getGraphQLValidationMessages(error: ErrorLike): string[] {\n if (CombinedGraphQLErrors.is(error)) {\n return error.errors.filter(isSchemaValidationError).map(({ message }) => message);\n }\n\n const directMessage = getErrorMessage(error);\n\n if (directMessage && isSchemaValidationMessage(directMessage)) {\n return [directMessage];\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode !== 400) {\n return [];\n }\n\n const responseBody =\n parseErrorBody<GraphQLErrorResponse>(serverError.bodyText) ??\n getServerErrorResult(serverError) ??\n getErrorCauseResponse(error);\n\n if (!responseBody) {\n return [];\n }\n\n if (Array.isArray(responseBody.errors)) {\n return responseBody.errors.filter(isSchemaValidationError).map((item) => item.message);\n }\n\n if (typeof responseBody.message === 'string' && isSchemaValidationMessage(responseBody.message)) {\n return [responseBody.message];\n }\n\n if (typeof responseBody.error === 'string' && isSchemaValidationMessage(responseBody.error)) {\n return [responseBody.error];\n }\n\n return [];\n}\n\nfunction getServerErrorResult(serverError: ServerError): GraphQLErrorResponse | null {\n const { result } = serverError as ServerErrorWithResult;\n\n if (!result || typeof result !== 'object') {\n return null;\n }\n\n return result as GraphQLErrorResponse;\n}\n\nfunction getErrorCauseResponse(error: ErrorLike): GraphQLErrorResponse | null {\n if (!hasCause(error)) {\n return null;\n }\n\n const { cause } = error;\n const causeMessage = getErrorMessage(cause);\n\n if (causeMessage && isSchemaValidationMessage(causeMessage)) {\n return { message: causeMessage };\n }\n\n if (!cause || typeof cause !== 'object') {\n return null;\n }\n\n const { result } = cause as { result?: unknown };\n\n if (result && typeof result === 'object') {\n return result as GraphQLErrorResponse;\n }\n\n return null;\n}\n\nfunction isSchemaValidationError(error: unknown): error is GraphQLErrorItem & { message: string } {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const { extensions, message } = error as GraphQLErrorItem;\n const code = extensions?.code;\n\n if (code === 'GRAPHQL_VALIDATION_FAILED' && typeof message === 'string') {\n return true;\n }\n\n return typeof message === 'string' && isSchemaValidationMessage(message);\n}\n\nfunction isSchemaValidationMessage(message: string): boolean {\n return (\n message.startsWith('Cannot query field ') ||\n message.startsWith('Unknown type ') ||\n message.startsWith('Cannot query field \"') ||\n message.includes('GRAPHQL_VALIDATION_FAILED')\n );\n}\n\nfunction isMissingCountStoreFieldMessage(message: string): boolean {\n return /Cannot query field \"[_A-Za-z][_0-9A-Za-z]*Total\" on type \"Query\"/.test(message);\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { ApolloClient, InMemoryCache, defaultDataIdFromObject, from, HttpLink } from '@apollo/client';\nimport type { ApolloLink } from '@apollo/client';\nimport { ApolloProvider } from '@apollo/client/react';\nimport { ErrorLink } from '@apollo/client/link/error';\nimport { CombinedGraphQLErrors, CombinedProtocolErrors } from '@apollo/client/errors';\nimport { getGraphQLSchemaMismatchMessage, getServerError, parseErrorBody } from './error-utils';\nimport { useConfig } from '../core/config/config-context';\nimport React, { createContext, useContext, useMemo, useState } from 'react';\n\nconst ApolloProviderCompat = ApolloProvider as unknown as React.ComponentType<{\n children?: React.ReactNode;\n client: ApolloClient;\n}>;\n\ntype GraphQLErrorContextValue = {\n schemaErrorMessage: string | null;\n setSchemaErrorMessage: React.Dispatch<React.SetStateAction<string | null>>;\n};\n\nconst GraphQLErrorContext = createContext<GraphQLErrorContextValue | undefined>(undefined);\n\nfunction useGraphQLError(): GraphQLErrorContextValue {\n const ctx = useContext(GraphQLErrorContext);\n\n if (!ctx) {\n throw new Error('useGraphQLError must be used within GraphQLProvider');\n }\n\n return ctx;\n}\n\nfunction createErrorLink(setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return new ErrorLink(({ error }) => {\n const schemaMismatchMessage = getGraphQLSchemaMismatchMessage(error);\n\n if (schemaMismatchMessage) {\n setSchemaErrorMessage(schemaMismatchMessage);\n\n return;\n }\n\n if (CombinedGraphQLErrors.is(error)) {\n error.errors.forEach(({ message, locations, path }) => {\n console.warn(`[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`);\n });\n } else if (CombinedProtocolErrors.is(error)) {\n error.errors.forEach(({ message, extensions }) => {\n console.warn(`[Protocol error]: Message: ${message}, Extensions: ${JSON.stringify(extensions)}`);\n });\n }\n\n const serverError = getServerError(error);\n\n if (serverError?.statusCode === 400) {\n const responseBody = parseErrorBody<Record<string, unknown>>(serverError.bodyText);\n let message: string | null = null;\n\n if (responseBody && typeof responseBody === 'object') {\n const {\n error: responseError,\n errors,\n message: responseMessage,\n } = responseBody as {\n error?: unknown;\n errors?: unknown;\n message?: unknown;\n };\n\n if (typeof responseMessage === 'string') {\n message = responseMessage;\n } else if (Array.isArray(errors)) {\n const [firstError] = errors as { message?: unknown }[];\n\n if (firstError && typeof firstError.message === 'string') {\n const { message: firstErrorMessage } = firstError;\n message = firstErrorMessage;\n }\n } else if (typeof responseError === 'string') {\n message = responseError;\n } else {\n message = JSON.stringify(responseBody);\n }\n } else {\n message = serverError.bodyText;\n }\n\n setSchemaErrorMessage(message ?? 'There is an error in the deployed Flexkit schema. Fix flexkit.config.ts and run flexkit deploy.');\n }\n\n if (serverError) {\n console.warn(`[Network error]: ${serverError.message}`);\n\n return;\n }\n\n if (error) {\n console.warn(`[Network error]: ${error.message}`);\n }\n });\n}\n\nfunction additiveLink(currentProjectId: string, setSchemaErrorMessage: (msg: string | null) => void): ApolloLink {\n return from([\n createErrorLink(setSchemaErrorMessage),\n new HttpLink({ uri: `/api/flexkit/${currentProjectId}/graphql` }),\n ]);\n}\n\nfunction client(\n currentProjectId: string | undefined,\n setSchemaErrorMessage: (msg: string | null) => void\n): ApolloClient {\n return new ApolloClient({\n link: additiveLink(currentProjectId ?? '', setSchemaErrorMessage),\n cache: new InMemoryCache({\n dataIdFromObject: (responseObject) => {\n return responseObject._id ? (responseObject._id as string) : defaultDataIdFromObject(responseObject);\n },\n }),\n });\n}\n\nexport function GraphQLProvider({ children }: { children: React.ReactNode }): JSX.Element {\n const { currentProjectId } = useConfig();\n const [schemaErrorMessage, setSchemaErrorMessage] = useState<string | null>(null);\n const ctx = useMemo(() => ({ schemaErrorMessage, setSchemaErrorMessage }), [schemaErrorMessage]);\n const apolloClient = useMemo(\n () => client(currentProjectId, setSchemaErrorMessage),\n [currentProjectId]\n );\n\n return (\n <GraphQLErrorContext.Provider value={ctx}>\n <ApolloProviderCompat client={apolloClient}>{children}</ApolloProviderCompat>\n </GraphQLErrorContext.Provider>\n );\n}\n\nexport { useGraphQLError };\n","import type { ApolloClient } from '@apollo/client';\nimport type { Schema } from '../core/types';\nimport { assetSchema } from '../entities/assets-schema';\nimport { getOperationEntityName } from './queries';\n\ntype EntityListRefreshListener = (queryNames: ReadonlySet<string>) => void | Promise<void>;\ntype EntityListRemovalListener = (queryName: string, entityIds: ReadonlySet<string>) => void;\ntype EntityListPatchListener = (queryName: string, patches: EntityListRowPatch[]) => void;\n\nexport type EntityListRowPatch = {\n _id: string;\n attributes: { [key: string]: string };\n};\n\nlet refetchTimer: ReturnType<typeof setTimeout> | null = null;\nconst pendingQueryNames = new Set<string>();\nconst pendingResolvers: Array<{ resolve: () => void; reject: (error: unknown) => void }> = [];\nconst listeners = new Set<EntityListRefreshListener>();\nconst removalListeners = new Set<EntityListRemovalListener>();\nconst patchListeners = new Set<EntityListPatchListener>();\n\nexport function getEntityListQueryName(entityNameOrPlural: string, schema: Schema): string {\n if (entityNameOrPlural === '_asset' || entityNameOrPlural === '_assets') {\n return `Get${getOperationEntityName(assetSchema.plural)}`;\n }\n\n const byPlural = schema.find((entity) => entity.plural === entityNameOrPlural);\n const byName = schema.find((entity) => entity.name === entityNameOrPlural);\n const plural = byPlural?.plural ?? byName?.plural ?? entityNameOrPlural;\n\n return `Get${getOperationEntityName(plural)}`;\n}\n\n/**\n * Subscribe to soft list refreshes. Listeners should refetch their own query and\n * remap local paginated state (useEntityQuery ignores Apollo cache writes after sync).\n */\nexport function subscribeEntityListRefetch(listener: EntityListRefreshListener): () => void {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n}\n\n/**\n * Subscribe to optimistic row removals (e.g. after delete) before the soft-refetch lands.\n */\nexport function subscribeEntityListRemoval(listener: EntityListRemovalListener): () => void {\n removalListeners.add(listener);\n\n return () => {\n removalListeners.delete(listener);\n };\n}\n\n/**\n * Subscribe to in-place row patches (e.g. tag connect/disconnect) without a full list refetch.\n */\nexport function subscribeEntityListPatch(listener: EntityListPatchListener): () => void {\n patchListeners.add(listener);\n\n return () => {\n patchListeners.delete(listener);\n };\n}\n\n/**\n * Immediately drop rows from mounted lists, then soft-refetch to sync counts/pages.\n */\nexport function scheduleEntityListRemoval(\n apolloClient: ApolloClient,\n queryName: string,\n entityIds: string[]\n): Promise<void> {\n const ids = new Set(entityIds.filter(Boolean));\n\n if (ids.size > 0) {\n for (const listener of removalListeners) {\n listener(queryName, ids);\n }\n }\n\n return scheduleEntityListRefetch(apolloClient, queryName);\n}\n\n/**\n * Patch mounted list rows in place. Use when a mutation cannot change list cardinality\n * (e.g. tag connect/disconnect) so we avoid a full GetAssets soft-refetch.\n */\nexport function scheduleEntityListPatch(queryName: string, patches: EntityListRowPatch[]): void {\n const nextPatches = patches.filter((patch) => Boolean(patch._id));\n\n if (nextPatches.length === 0) {\n return;\n }\n\n for (const listener of patchListeners) {\n listener(queryName, nextPatches);\n }\n}\n\n/**\n * Ask mounted entity lists to soft-refresh. Debounced so batch deletes coalesce.\n */\nexport function scheduleEntityListRefetch(_apolloClient: ApolloClient, queryName: string): Promise<void> {\n pendingQueryNames.add(queryName);\n\n return new Promise<void>((resolve, reject) => {\n pendingResolvers.push({ resolve, reject });\n\n if (refetchTimer) {\n clearTimeout(refetchTimer);\n }\n\n refetchTimer = setTimeout(() => {\n const names = new Set(pendingQueryNames);\n const resolvers = pendingResolvers.splice(0);\n pendingQueryNames.clear();\n refetchTimer = null;\n\n void Promise.all([...listeners].map((listener) => Promise.resolve(listener(names))))\n .then(() => {\n for (const { resolve: finish } of resolvers) {\n finish();\n }\n })\n .catch((error: unknown) => {\n console.error('Error refreshing entity lists:', error);\n\n for (const { reject: fail } of resolvers) {\n fail(error);\n }\n });\n }, 50);\n });\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { prop, uniqBy } from 'ramda';\nimport { gql, NetworkStatus } from '@apollo/client';\nimport type { OperationVariables } from '@apollo/client';\nimport { useQuery } from '@apollo/client/react';\nimport {\n getGraphQLSchemaMismatchMessage,\n getServerError,\n isMissingGraphQLFieldError,\n parseErrorBody,\n} from './error-utils';\nimport {\n getEntityQuery,\n getEntitySchema,\n getOperationEntityName,\n mapQueryResult,\n mapQueryResultForFormFields,\n} from './queries';\nimport {\n subscribeEntityListPatch,\n subscribeEntityListRefetch,\n subscribeEntityListRemoval,\n type EntityListRowPatch,\n} from './refetch-entity-lists';\nimport { useGraphQLError } from './graphql-context';\nimport type {\n EntityQueryAggregate,\n EntityQueryResults,\n FormEntityItem,\n MappedEntityQueryResults,\n MappedEntityItem,\n MappedFormEntityQueryResults,\n UseEntityQueryParams,\n ImageValue,\n} from './types';\n\ntype FetchMoreOptions = {\n // `offset` is accepted for call-site compatibility but overridden by nextOffsetRef.\n // `where`/`sort` are inherited from the active query unless overridden here.\n variables: OperationVariables & { offset: number; limit: number };\n};\ntype Results = (MappedEntityQueryResults | MappedFormEntityQueryResults) | { count: 0; results: [] };\n\nexport function useEntityQuery({\n entityNamePlural,\n schema,\n scope,\n variables,\n isForm,\n selection = 'full',\n includeCount = true,\n}: UseEntityQueryParams): {\n count: number;\n data: MappedEntityItem[] | FormEntityItem[] | ImageValue[] | undefined;\n fetchMore: (args: FetchMoreOptions) => void;\n isLoading: boolean;\n isLoadingMore: boolean;\n isProjectDisabled: boolean;\n isProjectReadOnly: boolean;\n reload: (options?: { preserve?: boolean }) => Promise<void>;\n schemaErrorMessage: string | null;\n} {\n const [result, setResult] = useState<Results>({\n count: 0,\n results: [],\n });\n const [isLoadingMore, setIsLoadingMore] = useState(false);\n const [isReloading, setIsReloading] = useState(false);\n const [unsupportedTotalCount, setUnsupportedTotalCount] = useState<{\n field: string;\n schema: UseEntityQueryParams['schema'];\n } | null>(null);\n const isLoadingMoreRef = useRef(false);\n const isReloadingRef = useRef(false);\n // Next offset for fetchMore — advanced by each requested page window, not by the\n // deduplicated row count. Using unique rows.length as offset collapses when pages\n // overlap (unstable sorts / tied timestamps) into irregular steps like 25→35→42.\n const nextOffsetRef = useRef(0);\n // Tracks the query identity we last synced into local result state.\n // fetchMore updates Apollo `data` without changing this identity; syncing those\n // updates would wipe accumulated pages and retrigger infinite load-more.\n // Must include entity/scope — variables alone collide across entity navigations.\n const syncedQueryKeyRef = useRef<string | null>(null);\n const pendingQueryKeyRef = useRef<string | null>(null);\n const totalCountField = `${entityNamePlural}Total`;\n const entitySchema = getEntitySchema(schema, entityNamePlural);\n const canUseTotalCount =\n variables?.where === undefined &&\n (entitySchema?.spaces?.length ?? 0) === 0 &&\n (unsupportedTotalCount?.field !== totalCountField || unsupportedTotalCount.schema !== schema);\n const countMode = canUseTotalCount ? 'total' : 'aggregate';\n const queryDocument = useMemo(\n () => gql(getEntityQuery(entityNamePlural, scope, schema, { selection, countMode, includeCount }).query),\n [entityNamePlural, scope, schema, selection, countMode, includeCount]\n );\n // fetchMore pages skip the top-level aggregate count (a filtered label scan\n // on the server); the total from the first page still stands.\n const fetchMoreDocument = useMemo(\n () => gql(getEntityQuery(entityNamePlural, scope, schema, { selection, includeCount: false }).query),\n [entityNamePlural, scope, schema, selection]\n );\n const { schemaErrorMessage, setSchemaErrorMessage } = useGraphQLError();\n const {\n loading: isLoading,\n data,\n fetchMore: fetchNextPage,\n refetch,\n error,\n networkStatus,\n } = useQuery<EntityQueryResults & EntityQueryAggregate>(queryDocument, {\n variables,\n notifyOnNetworkStatusChange: true,\n });\n const fetchNextPageRef = useRef(fetchNextPage);\n const refetchRef = useRef(refetch);\n const fetchMoreDocumentRef = useRef(fetchMoreDocument);\n const previousNetworkStatusRef = useRef(networkStatus);\n const variablesRef = useRef(variables);\n fetchNextPageRef.current = fetchNextPage;\n refetchRef.current = refetch;\n fetchMoreDocumentRef.current = fetchMoreDocument;\n variablesRef.current = variables;\n\n // Parse 403 error response to determine the specific error code\n const isMissingTotalCountField = includeCount && isMissingGraphQLFieldError(error, totalCountField);\n const shouldFallbackToAggregate = countMode === 'total' && isMissingTotalCountField;\n const effectiveError = isMissingTotalCountField ? undefined : error;\n const isTotalCountFallbackLoading = isMissingTotalCountField && !data?.[entityNamePlural];\n const serverError = getServerError(effectiveError);\n const schemaMismatchMessage = getGraphQLSchemaMismatchMessage(effectiveError);\n\n const { isProjectDisabled, isProjectReadOnly } = (() => {\n if (serverError?.statusCode === 403) {\n const responseBody = parseErrorBody<{ code?: string }>(serverError.bodyText);\n\n if (responseBody && typeof responseBody.code === 'string') {\n if (responseBody.code === 'PROJECT_PAUSED') {\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n if (responseBody.code === 'READ_ONLY_MODE') {\n return {\n isProjectDisabled: false,\n isProjectReadOnly: true,\n };\n }\n }\n\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n return {\n isProjectDisabled: false,\n isProjectReadOnly: false,\n };\n })();\n\n useEffect(() => {\n if (!shouldFallbackToAggregate) {\n return;\n }\n\n setUnsupportedTotalCount({ field: totalCountField, schema });\n }, [schema, shouldFallbackToAggregate, totalCountField]);\n\n const fetchMore = useCallback(\n (args: FetchMoreOptions): void => {\n if (isLoadingMoreRef.current || isReloadingRef.current) {\n return;\n }\n\n isLoadingMoreRef.current = true;\n setIsLoadingMore(true);\n\n const { limit } = args.variables;\n const offset = nextOffsetRef.current;\n\n fetchNextPageRef\n .current({\n ...args,\n query: fetchMoreDocumentRef.current,\n variables: {\n // fetchMore uses a count-free document, so Apollo will not inherit\n // the original operation's where/sort unless we pass them again.\n ...variablesRef.current,\n ...args.variables,\n offset,\n limit,\n },\n })\n .then(({ data: res }) => {\n const mappedFetchMoreResults = mapResults({ data: res, entityNamePlural, isForm, schema, scope });\n // Advance by the fetched page window (capped at limit), not by how many unique\n // rows survived client-side merge. Cap protects against Apollo returning a\n // merged cache blob larger than the requested page.\n const pageLength = mappedFetchMoreResults.results.length;\n nextOffsetRef.current = offset + (pageLength === 0 ? 0 : Math.min(pageLength, limit));\n\n setResult((prevRows) => {\n const merged = uniqBy(prop('_id'), [\n ...prevRows.results,\n ...mappedFetchMoreResults.results,\n ]) as Results['results'];\n\n // Empty/duplicate pages must end pagination, otherwise load-more loops forever\n // when aggregate count is ahead of rows that the where-clause can actually return.\n if (merged.length === prevRows.results.length) {\n return {\n count: prevRows.results.length,\n results: prevRows.results,\n } as Results;\n }\n\n // Count-free pagination pages report 0; the first page's total stands.\n return {\n count: mappedFetchMoreResults.count || prevRows.count,\n results: merged,\n } as Results;\n });\n })\n .catch((fetchError: unknown) => {\n console.error('Error fetching more data:', fetchError);\n })\n .finally(() => {\n isLoadingMoreRef.current = false;\n setIsLoadingMore(false);\n });\n },\n [entityNamePlural, isForm, schema, scope]\n );\n\n const reload = useCallback(\n (options?: { preserve?: boolean }): Promise<void> => {\n if (isReloadingRef.current) {\n return Promise.resolve();\n }\n\n const preserve = options?.preserve === true;\n\n isReloadingRef.current = true;\n isLoadingMoreRef.current = false;\n setIsLoadingMore(false);\n\n if (!preserve) {\n syncedQueryKeyRef.current = null;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = 0;\n setIsReloading(true);\n setResult({ count: 0, results: [] });\n }\n\n return refetchRef\n .current()\n .then(({ data: res }) => {\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data: res, entityNamePlural, isForm, schema, scope });\n\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n })\n .catch((fetchError: unknown) => {\n console.error('Error reloading data:', fetchError);\n })\n .finally(() => {\n isReloadingRef.current = false;\n setIsReloading(false);\n });\n },\n [entityNamePlural, isForm, schema, scope, selection, includeCount, variables]\n );\n\n useEffect(() => {\n if (schemaMismatchMessage) {\n setSchemaErrorMessage(schemaMismatchMessage);\n\n return;\n }\n\n if (data && schemaErrorMessage && !effectiveError) {\n setSchemaErrorMessage(null);\n }\n }, [data, effectiveError, schemaErrorMessage, schemaMismatchMessage, setSchemaErrorMessage]);\n\n useEffect(() => {\n if (effectiveError || schemaMismatchMessage || isTotalCountFallbackLoading) {\n return;\n }\n\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n\n // Already synced for this query identity — ignore Apollo `data` updates from fetchMore.\n if (syncedQueryKeyRef.current === queryKey) {\n return;\n }\n\n if (isLoading && pendingQueryKeyRef.current !== queryKey) {\n pendingQueryKeyRef.current = queryKey;\n nextOffsetRef.current = 0;\n setResult({ count: 0, results: [] });\n\n return;\n }\n\n if (isLoading) {\n return;\n }\n\n const mapped = mapResults({ data, entityNamePlural, isForm, schema, scope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n }, [\n data,\n effectiveError,\n entityNamePlural,\n isForm,\n isLoading,\n isTotalCountFallbackLoading,\n schema,\n schemaMismatchMessage,\n scope,\n selection,\n includeCount,\n variables,\n ]);\n\n // After an Apollo refetch (delete/upload), replace accumulated pages with the\n // fresh first page. fetchMore uses NetworkStatus.fetchMore and is ignored.\n useEffect(() => {\n const previousStatus = previousNetworkStatusRef.current;\n previousNetworkStatusRef.current = networkStatus;\n\n if (effectiveError || schemaMismatchMessage || isReloadingRef.current || isTotalCountFallbackLoading) {\n return;\n }\n\n if (previousStatus !== NetworkStatus.refetch || networkStatus !== NetworkStatus.ready || !data) {\n return;\n }\n\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data, entityNamePlural, isForm, schema, scope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n }, [\n data,\n effectiveError,\n entityNamePlural,\n isForm,\n isTotalCountFallbackLoading,\n networkStatus,\n schema,\n schemaMismatchMessage,\n scope,\n selection,\n includeCount,\n variables,\n ]);\n\n // Soft-refresh after mutations (tags, deletes, uploads). Local paginated state\n // ignores Apollo cache writes, so we must refetch and remap explicitly.\n useEffect(() => {\n if (isForm) {\n return;\n }\n\n const listQueryName = `Get${getOperationEntityName(entityNamePlural)}`;\n\n const unsubscribeRefetch = subscribeEntityListRefetch((queryNames) => {\n if (!queryNames.has(listQueryName) || isLoadingMoreRef.current || isReloadingRef.current) {\n return;\n }\n\n return refetchRef\n .current()\n .then(({ data: res }) => {\n const queryKey = JSON.stringify({ entityNamePlural, scope, selection, includeCount, variables });\n const mapped = mapResults({ data: res, entityNamePlural, isForm, schema, scope });\n syncedQueryKeyRef.current = queryKey;\n pendingQueryKeyRef.current = null;\n nextOffsetRef.current = getVariablesOffset(variables) + mapped.results.length;\n setResult(mapped);\n })\n .catch((fetchError: unknown) => {\n console.error('Error soft-refreshing entity list:', fetchError);\n });\n });\n\n const unsubscribeRemoval = subscribeEntityListRemoval((queryName, entityIds) => {\n if (queryName !== listQueryName) {\n return;\n }\n\n setResult((prev) => {\n const nextResults = prev.results.filter((row) => {\n const rowId = typeof row._id === 'string' ? row._id : undefined;\n\n return !rowId || !entityIds.has(rowId);\n });\n const removedCount = prev.results.length - nextResults.length;\n\n if (removedCount === 0) {\n return prev;\n }\n\n return {\n count: Math.max(0, prev.count - removedCount),\n results: nextResults,\n } as Results;\n });\n });\n\n const unsubscribePatch = subscribeEntityListPatch((queryName, patches) => {\n if (queryName !== listQueryName) {\n return;\n }\n\n setResult((prev) => applyEntityListPatches(prev, patches, variables?.sort));\n });\n\n return () => {\n unsubscribeRefetch();\n unsubscribeRemoval();\n unsubscribePatch();\n };\n }, [entityNamePlural, isForm, schema, scope, selection, includeCount, variables]);\n\n return {\n // Refetch keeps existing rows visible; only initial load / explicit reload show as loading.\n isLoading:\n (isLoading && networkStatus !== NetworkStatus.refetch) || isReloading || isTotalCountFallbackLoading,\n isLoadingMore,\n fetchMore,\n reload,\n count: result.count,\n data: result.results,\n isProjectDisabled,\n isProjectReadOnly,\n schemaErrorMessage,\n };\n}\n\nfunction getVariablesOffset(variables: OperationVariables | undefined): number {\n const offset = variables?.offset;\n\n return typeof offset === 'number' && Number.isFinite(offset) ? offset : 0;\n}\n\nfunction mapResults(\n args: {\n data: (EntityQueryResults & EntityQueryAggregate) | undefined;\n } & UseEntityQueryParams\n): MappedEntityQueryResults | MappedFormEntityQueryResults {\n const entityNamePlural = args.entityNamePlural as keyof FormEntityItem;\n\n if (!args.data?.[entityNamePlural]) {\n return { count: 0, results: [] };\n }\n\n return args.isForm\n ? mapQueryResultForFormFields(args.entityNamePlural, args.scope, args.data, args.schema)\n : mapQueryResult(args.entityNamePlural, args.scope, args.data, args.schema);\n}\n\nfunction applyEntityListPatches(\n prev: Results,\n patches: EntityListRowPatch[],\n sort: unknown\n): Results {\n const patchById = new Map(patches.map((patch) => [patch._id, patch]));\n let didPatch = false;\n const nextResults = prev.results.map((row) => {\n const rowId = typeof row._id === 'string' ? row._id : undefined;\n\n if (!rowId) {\n return row;\n }\n\n const patch = patchById.get(rowId);\n\n if (!patch) {\n return row;\n }\n\n didPatch = true;\n\n return {\n ...row,\n ...patch.attributes,\n };\n });\n\n if (!didPatch) {\n return prev;\n }\n\n return {\n count: prev.count,\n results: sortEntityListResults(nextResults, sort),\n } as Results;\n}\n\nfunction sortEntityListResults<T extends { [key: string]: unknown }>(results: T[], sort: unknown): T[] {\n if (!Array.isArray(sort) || sort.length === 0) {\n return results;\n }\n\n const [primarySort] = sort;\n\n if (!primarySort || typeof primarySort !== 'object') {\n return results;\n }\n\n const [primarySortEntry] = Object.entries(primarySort as { [key: string]: unknown });\n const [sortField, sortDirection] = primarySortEntry ?? [];\n\n if (!sortField || (sortDirection !== 'ASC' && sortDirection !== 'DESC')) {\n return results;\n }\n\n const direction = sortDirection === 'DESC' ? -1 : 1;\n\n return [...results].sort((left, right) => {\n const leftValue = left[sortField];\n const rightValue = right[sortField];\n const leftText = typeof leftValue === 'string' ? leftValue : '';\n const rightText = typeof rightValue === 'string' ? rightValue : '';\n\n return leftText.localeCompare(rightText) * direction;\n });\n}\n","import type { JSX } from 'react';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '../../ui/primitives/alert';\n\nexport function ProjectDisabled(): JSX.Element {\n return (\n <Alert variant=\"destructive\">\n <AlertCircle className=\"fk:h-4 fk:w-4\" />\n <AlertTitle>Project Paused</AlertTitle>\n <AlertDescription>\n This project has been paused. To troubleshoot this error, please{' '}\n <a\n className=\"fk:text-blue-500 fk:underline\"\n href=\"https://flexkit.io/docs/errors/project-paused\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n follow these steps\n </a>\n .\n </AlertDescription>\n </Alert>\n );\n}\n","import type { JSX } from 'react';\nimport { AlertCircle } from 'lucide-react';\nimport { Alert, AlertDescription, AlertTitle } from '../../ui/primitives/alert';\nimport { useGraphQLError } from '../../graphql-client/graphql-context';\n\nexport function SchemaError(): JSX.Element {\n const { schemaErrorMessage } = useGraphQLError();\n\n if (!schemaErrorMessage) {\n return <></>;\n }\n\n const [summary, deployHint, ...details] = schemaErrorMessage.split('\\n');\n\n return (\n <Alert className=\"fk:mb-4\" variant=\"destructive\">\n <AlertCircle className=\"fk:h-4 fk:w-4\" />\n <AlertTitle>Schema mismatch</AlertTitle>\n <AlertDescription>\n <p>{summary}</p>\n {deployHint ? <p className=\"fk:mt-1\">{deployHint}</p> : null}\n {details.length > 0 ? (\n <ul className=\"fk:mt-2 fk:list-disc fk:pl-4\">\n {details.map((detail) => (\n <li key={detail}>{detail.replace(/^- /, '')}</li>\n ))}\n </ul>\n ) : null}\n </AlertDescription>\n </Alert>\n );\n}\n","/** Fill short viewports immediately; prefetch ahead only once the user scrolls. */\nexport function shouldLoadMore({\n scrollHeight,\n scrollTop,\n clientHeight,\n}: {\n scrollHeight: number;\n scrollTop: number;\n clientHeight: number;\n}): boolean {\n if (clientHeight <= 0) {\n return false;\n }\n\n // Applying the scrolling threshold at the top requests a second page on\n // mount even when the first page already fills the viewport.\n const threshold = scrollTop > 0 ? Math.max(600, clientHeight) : 1;\n\n return scrollHeight - scrollTop - clientHeight < threshold;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { JSX, ReactElement, UIEvent } from 'react';\nimport {\n flexRender,\n getCoreRowModel,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n useReactTable,\n} from '@tanstack/react-table';\nimport type {\n ColumnDef,\n ColumnFiltersState,\n OnChangeFn,\n Updater,\n Row,\n RowSelectionState,\n SortingState,\n Table,\n TableMeta,\n VisibilityState,\n} from '@tanstack/react-table';\nimport { useVirtualizer } from '@tanstack/react-virtual';\nimport {\n Table as TablePrimitive,\n TableBody,\n TableCell,\n TableHead,\n TableHeader,\n TableRow,\n} from '../ui/primitives/table';\nimport { cn } from '../ui/lib/utils';\nimport { TooltipProvider } from '../ui/primitives/tooltip';\nimport type { AttributeValue } from '../graphql-client/types';\nimport type { MultipleRelationshipConnection } from '../core/types';\nimport { useGraphQLError } from '../graphql-client/graphql-context';\nimport { shouldLoadMore } from './should-load-more';\n\ninterface DataTableProps<TData extends AttributeValue, TValue> {\n classNames?: {\n wrapper?: string;\n table?: string;\n tableContainer?: string;\n row?: string;\n };\n columns: ColumnDef<AttributeValue, TValue>[];\n data: TData[];\n entityName: string;\n hasMore?: boolean;\n initialSelectionState?: RowSelectionState;\n isLoadingMore?: boolean;\n onEntitySelectionChange?: (rowSelection: string[]) => void;\n onLoadMore?: () => void;\n onScroll?: (event: UIEvent<HTMLDivElement>) => void;\n onSortingChange?: OnChangeFn<SortingState>;\n pageSize?: number;\n rowHeightEstimate?: number;\n rowAdditionState?: MultipleRelationshipConnection;\n rowDeletionState?: string[];\n scrollToTopKey?: number;\n sorting?: SortingState;\n toolbarComponent?: (table: Table<AttributeValue>) => ReactElement;\n}\n\ninterface ExtendedDataTable extends TableMeta<unknown> {\n getRowBackground: (row: Row<AttributeValue>) => string;\n}\n\n// Matches default `fk:h-9` rows (text-sm / 28px assets + cell padding + border).\nconst DEFAULT_ROW_HEIGHT_PX = 36;\nconst ROW_OVERSCAN = 15;\nconst COLUMN_OVERSCAN = 2;\n// Matches `fk:h-10` on TableHead. The header lives in the same scroll\n// container as the rows, so item measurements must start after it.\nconst STICKY_HEADER_HEIGHT_PX = 40;\n\nfunction inferRowHeightEstimate(rowClassName?: string): number | undefined {\n if (!rowClassName) {\n return undefined;\n }\n\n const tokens = rowClassName.split(/\\s+/);\n\n if (tokens.includes('fk:h-20')) {\n return 80;\n }\n\n if (tokens.includes('fk:h-10')) {\n return 40;\n }\n\n if (tokens.includes('fk:h-9')) {\n return 36;\n }\n\n return undefined;\n}\n\nfunction resolveRowHeightPx(rowHeightEstimate?: number, rowClassName?: string): number {\n return rowHeightEstimate ?? inferRowHeightEstimate(rowClassName) ?? DEFAULT_ROW_HEIGHT_PX;\n}\n\nexport function DataTable<TData extends AttributeValue, TValue>({\n classNames,\n columns,\n data,\n entityName,\n hasMore = false,\n initialSelectionState,\n isLoadingMore = false,\n onEntitySelectionChange,\n onLoadMore,\n onScroll,\n onSortingChange,\n pageSize,\n rowHeightEstimate,\n rowAdditionState,\n rowDeletionState,\n scrollToTopKey,\n sorting: sortingProp,\n toolbarComponent,\n}: DataTableProps<TData, TValue>): JSX.Element {\n const scrollRef = useRef<HTMLDivElement>(null);\n const { schemaErrorMessage } = useGraphQLError();\n const [rowSelection, setRowSelection] = useState(initialSelectionState ?? {});\n const [columnVisibility, setColumnVisibility] = useState<VisibilityState>({});\n const [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n const [uncontrolledSorting, setUncontrolledSorting] = useState<SortingState>([]);\n const sorting = sortingProp ?? uncontrolledSorting;\n\n useEffect(() => {\n scrollRef.current?.scrollTo({ top: 0, left: 0 });\n }, [entityName, scrollToTopKey]);\n\n useEffect(() => {\n if (!initialSelectionState) {\n return;\n }\n\n const currentSelection = Object.keys(rowSelection).sort().join(',');\n const nextSelection = Object.keys(initialSelectionState).sort().join(',');\n\n if (currentSelection === nextSelection) {\n return;\n }\n\n setRowSelection(initialSelectionState);\n }, [initialSelectionState, rowSelection]);\n\n function handleSortingChange(updater: Updater<SortingState>): void {\n if (onSortingChange) {\n onSortingChange(updater);\n\n return;\n }\n\n setUncontrolledSorting(updater);\n }\n\n const table = useReactTable({\n data,\n columns,\n state: {\n sorting,\n columnVisibility,\n rowSelection,\n columnFilters,\n },\n initialState: {\n pagination: {\n pageSize: pageSize ?? 50,\n },\n },\n enableRowSelection: true,\n onRowSelectionChange: handleRowSelectionChange,\n onSortingChange: handleSortingChange,\n onColumnFiltersChange: setColumnFilters,\n onColumnVisibilityChange: setColumnVisibility,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getRowId: (row) => row._id,\n // Filtering is applied via GraphQL `where` (Asset Manager toolbar); keep loaded\n // pages intact instead of re-filtering them client-side.\n manualFiltering: true,\n manualPagination: true,\n manualSorting: true,\n meta: {\n getRowBackground: (row: Row<AttributeValue>) => getRowClassnames(row, rowDeletionState, rowAdditionState),\n },\n });\n\n const { rows } = table.getRowModel();\n const rowHeightPx = resolveRowHeightPx(rowHeightEstimate, classNames?.row);\n const hasExplicitRowHeightClass = inferRowHeightEstimate(classNames?.row) != null;\n // Fixed row heights: skip dynamic measurement so infinite-scroll appends keep\n // identical spacing (estimate corrections were causing a brief taller jump).\n const rowVirtualizer = useVirtualizer({\n count: rows.length,\n estimateSize: () => rowHeightPx,\n getItemKey: (index) => rows[index]?.id ?? index,\n getScrollElement: () => scrollRef.current,\n overscan: ROW_OVERSCAN,\n scrollMargin: STICKY_HEADER_HEIGHT_PX,\n });\n\n const visibleColumns = table.getVisibleLeafColumns();\n const headerGroups = table.getHeaderGroups();\n // Grouped headers span multiple leaf columns; keep their existing layout.\n const virtualizeColumns = headerGroups.length === 1;\n const columnVirtualizer = useVirtualizer({\n horizontal: true,\n count: visibleColumns.length,\n estimateSize: (index) => visibleColumns[index].getSize(),\n getItemKey: (index) => visibleColumns[index].id,\n getScrollElement: () => scrollRef.current,\n overscan: COLUMN_OVERSCAN,\n enabled: virtualizeColumns,\n });\n // Visibility/size changes invalidate cached offsets even when the count stays\n // the same (e.g. navigating between two equally wide entity schemas).\n const columnSizesKey = JSON.stringify(visibleColumns.map((column) => [column.id, column.getSize()]));\n useEffect(() => {\n columnVirtualizer.measure();\n }, [columnSizesKey, columnVirtualizer]);\n const virtualColumns = columnVirtualizer.getVirtualItems();\n const firstColumn = virtualizeColumns ? (virtualColumns[0]?.index ?? 0) : 0;\n const lastColumn = virtualizeColumns\n ? (virtualColumns[virtualColumns.length - 1]?.index ?? -1) + 1\n : visibleColumns.length;\n const paddingLeft = virtualizeColumns ? (virtualColumns[0]?.start ?? 0) : 0;\n const paddingRight = virtualizeColumns\n ? Math.max(0, columnVirtualizer.getTotalSize() - (virtualColumns[virtualColumns.length - 1]?.end ?? 0))\n : 0;\n\n const virtualItems = rowVirtualizer.getVirtualItems();\n const { paddingTop, paddingBottom } = getVirtualBodySpacers(\n virtualItems,\n rowVirtualizer.getTotalSize(),\n STICKY_HEADER_HEIGHT_PX\n );\n\n // Keep load-more inputs in refs so callback identity churn from parents\n // (e.g. Apollo fetchMore) cannot re-trigger the effect every render.\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const isLoadingMoreRef = useRef(isLoadingMore);\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n isLoadingMoreRef.current = isLoadingMore;\n\n const checkLoadMore = useCallback((container?: HTMLDivElement | null) => {\n if (!onLoadMoreRef.current || !hasMoreRef.current || isLoadingMoreRef.current) {\n return;\n }\n\n const scrollElement = container ?? scrollRef.current;\n\n if (!scrollElement) {\n return;\n }\n\n if (!shouldLoadMore(scrollElement)) {\n return;\n }\n\n // Optimistic guard until the parent's isLoadingMore prop catches up.\n isLoadingMoreRef.current = true;\n onLoadMoreRef.current();\n }, []);\n\n // Re-check when rows/hasMore/loading settle — not when parent callback identities change.\n useEffect(() => {\n checkLoadMore();\n }, [checkLoadMore, rows.length, hasMore, isLoadingMore]);\n\n function handleRowSelectionChange(updaterFn: Updater<RowSelectionState>): void {\n const selectedIds = typeof updaterFn === 'function' ? Object.keys(updaterFn(rowSelection)) : Object.keys(updaterFn);\n\n setRowSelection(updaterFn);\n onEntitySelectionChange?.(selectedIds);\n }\n\n function handleScroll(event: UIEvent<HTMLDivElement>): void {\n onScroll?.(event);\n checkLoadMore(event.currentTarget);\n }\n\n if (schemaErrorMessage) {\n return <></>;\n }\n\n return (\n <div className={cn('fk:flex fk:h-full fk:min-h-0 fk:w-full fk:min-w-0 fk:flex-col fk:gap-4', classNames?.wrapper)}>\n {toolbarComponent && toolbarComponent(table)}\n <div className=\"fk:relative fk:min-h-0 fk:min-w-0 fk:flex-1 fk:-mb-px\">\n <TooltipProvider delayDuration={400}>\n <TablePrimitive\n className={cn('fk:grid fk:pb-20', classNames?.table)}\n aria-colcount={visibleColumns.length}\n style={{ minWidth: table.getTotalSize() }}\n containerClassName={classNames?.tableContainer}\n onScroll={handleScroll}\n ref={scrollRef}\n >\n <TableHeader className=\"fk:sticky fk:top-0 fk:z-20 fk:grid\">\n {headerGroups.map((headerGroup) => (\n <TableRow className=\"fk:flex fk:w-full\" key={headerGroup.id}>\n {paddingLeft > 0 ? <VirtualColumnSpacer width={paddingLeft} header /> : null}\n {(virtualizeColumns ? headerGroup.headers.slice(firstColumn, lastColumn) : headerGroup.headers).map(\n (header, index) => {\n return (\n <TableHead\n aria-colindex={virtualizeColumns ? firstColumn + index + 1 : undefined}\n className={cn(\n 'fk:flex fk:shrink-0 fk:items-center',\n header.column.id === 'actions' && 'fk:pl-0'\n )}\n colSpan={header.colSpan}\n key={header.id}\n style={header.getSize() ? { width: `${header.getSize().toString()}px` } : {}}\n >\n {header.isPlaceholder\n ? null\n : flexRender(header.column.columnDef.header, header.getContext())}\n {isLoadingMore ? (\n <div\n aria-hidden\n className=\"fk:pointer-events-none fk:absolute fk:top-10.25 fk:right-px fk:left-px fk:z-20 fk:h-0.5 fk:overflow-hidden fk:opacity-4\"\n >\n <div className=\"fk:animate-progress fk:h-full fk:w-full fk:bg-foreground\" />\n </div>\n ) : null}\n </TableHead>\n );\n }\n )}\n {paddingRight > 0 ? <VirtualColumnSpacer width={paddingRight} header /> : null}\n </TableRow>\n ))}\n </TableHeader>\n <TableBody className=\"fk:grid fk:relative\">\n {rows.length === 0 ? (\n <TableRow>\n <TableCell className=\"fk:h-24 fk:text-center\" colSpan={columns.length}>\n No results.\n </TableCell>\n </TableRow>\n ) : (\n <>\n {paddingTop > 0 ? <VirtualRowSpacer height={paddingTop} /> : null}\n {virtualItems.map((virtualRow) => {\n const row = rows[virtualRow.index];\n\n return (\n <TableRow\n className={cn(\n (table.options.meta as ExtendedDataTable).getRowBackground(row),\n 'fk:flex fk:w-full fk:overflow-hidden fk:transition-none',\n !hasExplicitRowHeightClass && rowHeightEstimate == null && 'fk:h-9',\n classNames?.row\n )}\n data-index={virtualRow.index}\n data-state={row.getIsSelected() && 'selected'}\n key={virtualRow.key}\n style={{\n height: `${rowHeightPx.toString()}px`,\n }}\n >\n {paddingLeft > 0 ? <VirtualColumnSpacer width={paddingLeft} /> : null}\n {row\n .getVisibleCells()\n .slice(firstColumn, lastColumn)\n .map((cell, index) => (\n <TableCell\n className={cn(\n 'fk:flex fk:shrink-0 fk:items-center fk:truncate',\n cell.column.id === 'actions' && 'fk:pl-1!'\n )}\n aria-colindex={firstColumn + index + 1}\n key={cell.id}\n style={{\n width: cell.column.getSize(),\n }}\n >\n {flexRender(cell.column.columnDef.cell, cell.getContext())}\n </TableCell>\n ))}\n {paddingRight > 0 ? <VirtualColumnSpacer width={paddingRight} /> : null}\n </TableRow>\n );\n })}\n {paddingBottom > 0 ? <VirtualRowSpacer height={paddingBottom} /> : null}\n </>\n )}\n </TableBody>\n </TablePrimitive>\n </TooltipProvider>\n </div>\n </div>\n );\n}\n\nfunction getVirtualBodySpacers(\n virtualItems: { start: number; end: number }[],\n totalSize: number,\n scrollMargin: number\n): { paddingTop: number; paddingBottom: number } {\n if (virtualItems.length === 0) {\n return { paddingTop: 0, paddingBottom: 0 };\n }\n\n const firstStart = virtualItems[0]?.start ?? 0;\n const lastEnd = virtualItems[virtualItems.length - 1]?.end ?? 0;\n\n // Measurements include scrollMargin so range math sees the header; tbody\n // spacers must not, because the header is already in thead.\n return {\n paddingTop: Math.max(0, firstStart - scrollMargin),\n paddingBottom: Math.max(0, totalSize - (lastEnd - scrollMargin)),\n };\n}\n\nfunction VirtualColumnSpacer({ width, header = false }: { width: number; header?: boolean }): JSX.Element {\n const Component = header ? 'th' : 'td';\n\n return <Component aria-hidden style={{ width, flexShrink: 0, padding: 0, border: 0 }} />;\n}\n\nfunction VirtualRowSpacer({ height }: { height: number }): JSX.Element {\n return (\n <tr\n aria-hidden\n className=\"fk:pointer-events-none fk:border-0\"\n style={{ display: 'block', height: `${height.toString()}px` }}\n >\n <td className=\"fk:p-0 fk:border-0\" />\n </tr>\n );\n}\n\nfunction getRowClassnames(\n row: Row<AttributeValue>,\n rowDeletionState?: string[],\n rowAdditionState?: MultipleRelationshipConnection\n): string {\n if (rowDeletionState?.includes(row.original._id)) {\n return 'fk:bg-row-removed fk:hover:bg-row-removed-hover';\n }\n\n if (rowAdditionState?.some((line) => line._id === row.original._id)) {\n return 'fk:bg-row-added fk:hover:bg-row-added-hover';\n }\n\n return '';\n}\n","'use client';\n\nimport { createContext, useContext, useReducer } from 'react';\nimport type { Dispatch, JSX, ReactNode } from 'react';\nimport { props, uniqBy } from 'ramda';\nimport type {\n Action,\n ActionAddEntity,\n ActionAlertDialog,\n ActionDeleteEntity,\n ActionEditEntity,\n ActionEditRelationship,\n} from './types';\n\nconst ActionsContext = createContext<Action[] | []>([]);\nconst EntityDispatchContext = createContext<Dispatch<Action>>(() => undefined);\n\nfunction actionsReducer(actions: Action[], action: Action): Action[] {\n const actionType = action.type;\n\n if (!action._id) {\n action._id = Date.now().toString();\n }\n\n switch (actionType) {\n case 'DeleteEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionDeleteEntity[]), action]);\n }\n case 'AddEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAddEntity[]), action]);\n }\n case 'EditEntity': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditEntity[]), action]);\n }\n case 'EditRelationship': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionEditRelationship[]), action]);\n }\n case 'AlertDialog': {\n return uniqBy(props(['type' as string, '_id']), [...(actions as ActionAlertDialog[]), action]);\n }\n case 'Dismiss': {\n return actions.filter((item) => item._id !== action._id);\n }\n default: {\n throw Error(`Unknown action: ${actionType as string}`);\n }\n }\n}\n\nfunction ActionsProvider({ children }: { children: ReactNode }): JSX.Element {\n const [entityActions, dispatchEntityActions] = useReducer(actionsReducer, []);\n\n return (\n <ActionsContext.Provider value={entityActions}>\n <EntityDispatchContext.Provider value={dispatchEntityActions}>{children}</EntityDispatchContext.Provider>\n </ActionsContext.Provider>\n );\n}\n\nfunction useActions(): Action[] {\n return useContext(ActionsContext);\n}\n\nfunction useDispatch(): Dispatch<Action> {\n return useContext(EntityDispatchContext);\n}\n\nexport { ActionsProvider, useActions, useDispatch };\n","'use client';\n\nimport type { JSX } from 'react';\nimport { X } from 'lucide-react';\nimport type { Table } from '@tanstack/react-table';\nimport { Button } from '../ui/primitives/button';\n\ninterface DataTableSortedByProps<TData> {\n table: Table<TData>;\n}\n\ntype ColumnMeta = {\n label?: string;\n};\n\nexport function DataTableSortedBy<TData>({ table }: DataTableSortedByProps<TData>): JSX.Element | null {\n const [sort] = table.getState().sorting;\n\n if (!sort) {\n return null;\n }\n\n const column = table.getColumn(sort.id);\n const label = (column?.columnDef.meta as ColumnMeta | undefined)?.label ?? sort.id;\n const direction = sort.desc ? 'desc' : 'asc';\n\n return (\n <Button\n aria-label={`Clear sorting by ${label}`}\n className=\"fk:h-8 fk:px-2 fk:lg:px-3 fk:text-success fk:border-none\"\n onClick={() => {\n table.resetSorting();\n }}\n size=\"sm\"\n variant=\"outline\"\n >\n Sorted by {label} {direction}\n <X className=\"fk:ml-1 fk:h-4 fk:w-4\" />\n </Button>\n );\n}\n","import { useEffect, useState } from 'react';\nimport type { Dispatch, SetStateAction } from 'react';\nimport { gql } from '@apollo/client';\nimport type { DocumentNode, ErrorLike } from '@apollo/client';\nimport { useMutation } from '@apollo/client/react';\nimport type { MutationHookOptions } from '@apollo/client/react';\nimport { getServerError, parseErrorBody } from './error-utils';\n\ntype EntityMutationResponse = [\n Dispatch<SetStateAction<boolean>>,\n Dispatch<SetStateAction<DocumentNode>>,\n Dispatch<SetStateAction<object>>,\n {\n data: unknown;\n loading: boolean;\n error: ErrorLike | undefined;\n isProjectDisabled: boolean;\n isProjectReadOnly: boolean;\n },\n];\n\nexport function useEntityMutation(): EntityMutationResponse {\n const [runMutation, setRunMutation] = useState(false);\n const [mutation, setMutation] = useState(gql`\n mutation updateEntity($any: Any) {\n any\n }\n `);\n const [options, setOptions] = useState<MutationHookOptions>({});\n const [mutateFunction, { data, loading, error }] = useMutation(mutation, options);\n\n // Parse 403 error response to determine the specific error code\n const serverError = getServerError(error);\n\n const { isProjectDisabled, isProjectReadOnly } = (() => {\n if (serverError?.statusCode === 403) {\n const responseBody = parseErrorBody<{ code?: string }>(serverError.bodyText);\n\n if (responseBody && typeof responseBody.code === 'string') {\n if (responseBody.code === 'PROJECT_PAUSED') {\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n if (responseBody.code === 'READ_ONLY_MODE') {\n return {\n isProjectDisabled: false,\n isProjectReadOnly: true,\n };\n }\n }\n\n return {\n isProjectDisabled: true,\n isProjectReadOnly: false,\n };\n }\n\n return {\n isProjectDisabled: false,\n isProjectReadOnly: false,\n };\n })();\n\n useEffect(() => {\n if (runMutation) {\n void mutateFunction();\n setRunMutation(false);\n }\n }, [runMutation, mutateFunction]);\n\n return [setRunMutation, setMutation, setOptions, { data, loading, error, isProjectDisabled, isProjectReadOnly }];\n}\n","'use client';\n\nimport type { JSX } from 'react';\nimport { ArrowDown, ArrowUp, ChevronDown } from 'lucide-react';\nimport type { Column } from '@tanstack/react-table';\nimport { cn } from '../ui/lib/utils';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../ui/primitives/dropdown-menu';\n\ninterface DataTableColumnHeaderProps<TData, TValue> {\n column: Column<TData, TValue>;\n title: string;\n className?: string;\n}\n\nexport function DataTableColumnHeader<TData, TValue>({\n column,\n title,\n className,\n}: DataTableColumnHeaderProps<TData, TValue>): JSX.Element {\n if (!column.getCanSort()) {\n return <div className={cn('fk:flex fk:items-center', className)}>{title}</div>;\n }\n\n const isSortedAsc = column.getIsSorted() === 'asc';\n const isSortedDesc = column.getIsSorted() === 'desc';\n\n return (\n <div className={cn('fk:flex fk:w-full fk:items-center fk:justify-between fk:gap-1', className)}>\n <span className=\"fk:truncate\">{title}</span>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <button\n aria-label={`Sort ${title}`}\n className=\"fk:inline-flex fk:shrink-0 fk:items-center fk:justify-center fk:rounded-sm fk:p-0.5 fk:text-muted-foreground fk:outline-hidden fk:hover:bg-accent fk:hover:text-accent-foreground fk:focus-visible:ring-1 fk:focus-visible:ring-ring fk:corner-squircle\"\n type=\"button\"\n >\n <ChevronDown className=\"fk:h-3.5 fk:w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"fk:w-44\">\n <DropdownMenuItem\n aria-checked={isSortedAsc}\n className={cn(isSortedAsc && 'fk:bg-accent fk:text-accent-foreground')}\n onSelect={() => {\n if (isSortedAsc) {\n column.clearSorting();\n\n return;\n }\n\n column.toggleSorting(false);\n }}\n role=\"menuitemcheckbox\"\n >\n <ArrowUp className={cn('fk:h-4 fk:w-4', isSortedAsc && 'fk:text-white')} />\n Sort Ascending\n </DropdownMenuItem>\n <DropdownMenuItem\n aria-checked={isSortedDesc}\n className={cn(isSortedDesc && 'fk:bg-accent fk:text-accent-foreground')}\n onSelect={() => {\n if (isSortedDesc) {\n column.clearSorting();\n\n return;\n }\n\n column.toggleSorting(true);\n }}\n role=\"menuitemcheckbox\"\n >\n <ArrowDown className={cn('fk:h-4 fk:w-4', isSortedDesc && 'fk:text-white')} />\n Sort Descending\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n );\n}\n","import { CircleCheck, CircleX } from 'lucide-react';\n\nexport function Boolean({ value }: { value: boolean }) {\n return (\n <div className=\"fk:flex fk:w-full fk:justify-center\">\n {value ? (\n <CircleCheck className=\"fk:w-4 fk:h-4 fk:text-emerald-500\" />\n ) : (\n <CircleX className=\"fk:w-4 fk:h-4 fk:text-muted-foreground\" />\n )}\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { JSX, MouseEvent } from 'react';\nimport { Check as CheckIcon, Copy as CopyIcon } from 'lucide-react';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '../../ui/primitives/tooltip';\nimport { cn } from '../../ui/lib/utils';\n\nconst TOOLTIP_MAX_LENGTH = 500;\nconst COPIED_DISMISS_MS = 3000;\n\ntype CopyableTruncatedTextProps = {\n value: string;\n};\n\nexport function CopyableTruncatedText({ value }: CopyableTruncatedTextProps): JSX.Element {\n const textRef = useRef<HTMLSpanElement>(null);\n const dismissTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [copied, setCopied] = useState(false);\n const [tooltipOpen, setTooltipOpen] = useState(false);\n\n useEffect(() => {\n return () => {\n if (dismissTimeoutRef.current) {\n clearTimeout(dismissTimeoutRef.current);\n }\n };\n }, []);\n\n function measureTruncation(): boolean {\n const element = textRef.current;\n\n if (!element) {\n return false;\n }\n\n return element.scrollWidth > element.clientWidth;\n }\n\n async function handleClick(event: MouseEvent<HTMLButtonElement>): Promise<void> {\n event.preventDefault();\n event.stopPropagation();\n\n if (!value) {\n return;\n }\n\n try {\n await navigator.clipboard.writeText(value);\n } catch {\n return;\n }\n\n setCopied(true);\n setTooltipOpen(true);\n\n if (dismissTimeoutRef.current) {\n clearTimeout(dismissTimeoutRef.current);\n }\n\n dismissTimeoutRef.current = setTimeout(() => {\n setCopied(false);\n setTooltipOpen(false);\n }, COPIED_DISMISS_MS);\n }\n\n function handlePointerEnter(): void {\n measureTruncation();\n }\n\n function handleTooltipOpenChange(open: boolean): void {\n if (copied) {\n return;\n }\n\n if (open) {\n setTooltipOpen(measureTruncation());\n\n return;\n }\n\n setTooltipOpen(false);\n }\n\n if (!value) {\n return <div className=\"fk:truncate\" />;\n }\n\n const tooltipText =\n value.length > TOOLTIP_MAX_LENGTH ? `${value.slice(0, TOOLTIP_MAX_LENGTH)}…` : value;\n\n return (\n <Tooltip open={tooltipOpen} onOpenChange={handleTooltipOpenChange}>\n <TooltipTrigger asChild>\n <button\n aria-label=\"Copy value\"\n className={cn(\n 'fk:group/copyable fk:relative fk:flex fk:w-full fk:min-w-0 fk:items-center fk:rounded-sm fk:border-0 fk:bg-transparent fk:px-0.5 fk:-mx-0.5 fk:py-0.5 fk:text-left fk:text-inherit fk:font-inherit fk:corner-squircle',\n 'fk:cursor-pointer fk:transition-[transform,background-color] fk:duration-75 fk:ease-out',\n 'fk:hover:bg-muted/50 fk:active:translate-y-px fk:active:scale-[0.98] fk:active:bg-muted/70',\n 'fk:focus-visible:outline-hidden fk:focus-visible:ring-1 fk:focus-visible:ring-ring'\n )}\n onClick={handleClick}\n onPointerEnter={handlePointerEnter}\n type=\"button\"\n >\n <span className=\"fk:min-w-0 fk:flex-1 fk:truncate fk:pr-4\" ref={textRef}>\n {value}\n </span>\n <span\n aria-hidden\n className={cn(\n 'fk:pointer-events-none fk:absolute fk:right-0.5 fk:top-1/2 fk:flex fk:-translate-y-1/2 fk:items-center fk:justify-center',\n 'fk:rounded-sm fk:bg-muted/80 fk:p-0.5 fk:text-muted-foreground fk:shadow-sm fk:ring-1 fk:ring-border/60 fk:corner-squircle',\n 'fk:transition-opacity fk:duration-100',\n copied\n ? 'fk:opacity-100 fk:text-foreground'\n : 'fk:opacity-0 fk:group-hover/copyable:opacity-100 fk:group-focus-visible/copyable:opacity-100'\n )}\n >\n {copied ? <CheckIcon className=\"fk:size-3\" /> : <CopyIcon className=\"fk:size-3\" />}\n </span>\n </button>\n </TooltipTrigger>\n <TooltipContent className=\"fk:max-w-xs fk:wrap-break-word\">\n {copied ? 'Copied to clipboard' : tooltipText}\n </TooltipContent>\n </Tooltip>\n );\n}\n","import { CopyableTruncatedText } from './copyable-truncated-text';\n\nexport function Text({ value }: { value: string | object | unknown[] }) {\n let displayValue = typeof value === 'object' || Array.isArray(value) ? JSON.stringify(value) : value;\n displayValue = displayValue === 'null' || displayValue == null ? '' : String(displayValue);\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n","import {\n AIHighlight,\n CharacterCount,\n CodeBlockLowlight,\n Color,\n CustomKeymap,\n GlobalDragHandle,\n HighlightExtension,\n HorizontalRule,\n Placeholder,\n StarterKit,\n TaskItem,\n TaskList,\n TextStyle,\n TiptapImage,\n TiptapLink,\n TiptapUnderline,\n Twitter,\n Youtube,\n Mathematics,\n UploadImagesPlugin,\n} from 'novel';\nimport { Markdown } from 'tiptap-markdown';\nimport { cx } from 'class-variance-authority';\nimport { common, createLowlight } from 'lowlight';\n\n//TODO I am using cx here to get tailwind autocomplete working, idk if someone else can write a regex to just capture the class key in objects\nconst aiHighlight = AIHighlight;\n//You can overwrite the placeholder with your own configuration\nconst placeholder = Placeholder;\nconst tiptapLink = TiptapLink.configure({\n HTMLAttributes: {\n 'class': cx(\n 'fk:text-muted-foreground fk:underline fk:underline-offset-[3px] fk:hover:text-primary fk:transition-colors fk:cursor-pointer'\n ),\n },\n});\n\nconst markdownExtension = Markdown.configure({\n html: true,\n tightLists: true,\n tightListClass: 'tight',\n bulletListMarker: '-',\n linkify: false,\n breaks: false,\n transformPastedText: false,\n transformCopiedText: false,\n});\n\nconst tiptapImage = TiptapImage.extend({\n addProseMirrorPlugins() {\n return [\n UploadImagesPlugin({\n imageClass: cx('fk:opacity-40 fk:rounded-lg fk:border fk:border-stone-200 fk:corner-squircle'),\n }),\n ];\n },\n}).configure({\n allowBase64: true,\n HTMLAttributes: {\n class: cx('fk:rounded-lg fk:border fk:border-muted fk:corner-squircle'),\n },\n});\n\nconst taskList = TaskList.configure({\n HTMLAttributes: {\n class: cx('fk:not-prose fk:pl-2 '),\n },\n});\nconst taskItem = TaskItem.configure({\n HTMLAttributes: {\n 'class': cx('fk:flex gap-2 fk:items-start fk:my-2'),\n },\n nested: true,\n});\n\nconst horizontalRule = HorizontalRule.configure({\n HTMLAttributes: {\n 'class': cx('mt-4 mb-6 border-t border-muted-foreground'),\n },\n});\n\nconst starterKit = StarterKit.configure({\n bulletList: {\n HTMLAttributes: {\n 'class': cx('fk:list-disc fk:list-outside fk:leading-3 fk:-mt-2'),\n },\n },\n orderedList: {\n HTMLAttributes: {\n 'class': cx('fk:list-decimal fk:list-outside fk:leading-3 fk:-mt-2'),\n },\n },\n listItem: {\n HTMLAttributes: {\n 'class': cx('fk:leading-normal fk:-mb-2'),\n },\n },\n blockquote: {\n HTMLAttributes: {\n 'class': cx('fk:border-l-4 fk:border-primary'),\n },\n },\n codeBlock: false,\n code: {\n HTMLAttributes: {\n 'class': cx('fk:rounded-md fk:bg-muted fk:px-1.5 fk:py-1 fk:font-mono fk:font-medium fk:corner-squircle'),\n spellcheck: 'false',\n },\n },\n horizontalRule: false,\n dropcursor: {\n color: '#DBEAFE',\n width: 4,\n },\n gapcursor: false,\n});\n\nconst codeBlockLowlight = CodeBlockLowlight.configure({\n // configure lowlight: common / all / use highlightJS in case there is a need to specify certain language grammars only\n // common: covers 37 language grammars which should be good enough in most cases\n lowlight: createLowlight(common),\n});\n\nconst youtube = Youtube.configure({\n HTMLAttributes: {\n 'class': cx('fk:rounded-lg fk:border fk:border-muted fk:corner-squircle'),\n },\n inline: false,\n});\n\nconst twitter = Twitter.configure({\n HTMLAttributes: {\n 'class': cx('fk:not-prose'),\n },\n inline: false,\n});\n\nconst mathematics = Mathematics.configure({\n HTMLAttributes: {\n 'class': cx('fk:text-foreground fk:rounded-sm fk:p-1 fk:hover:bg-muted fk:cursor-pointer fk:corner-squircle'),\n },\n katexOptions: {\n throwOnError: false,\n },\n});\n\nconst characterCount = CharacterCount.configure();\n\nexport const defaultExtensions: readonly unknown[] = [\n starterKit,\n placeholder,\n tiptapLink,\n tiptapImage,\n taskList,\n taskItem,\n horizontalRule,\n aiHighlight,\n codeBlockLowlight,\n youtube,\n twitter,\n mathematics,\n characterCount,\n TiptapUnderline,\n markdownExtension,\n HighlightExtension,\n TextStyle,\n Color,\n CustomKeymap,\n GlobalDragHandle,\n];\n","import { getSchema, getText, getTextSerializersFromSchema } from '@tiptap/core';\nimport type { Extensions } from '@tiptap/core';\nimport { Node } from '@tiptap/pm/model';\nimport { defaultExtensions } from '../../form/fields/editor/extensions';\n\n// generateText builds this schema for every call. Grid cells share the same\n// extensions, so compile once, on the first rich-text preview that needs it.\nlet serializer: ReturnType<typeof createSerializer> | undefined;\n\nfunction createSerializer() {\n const schema = getSchema(defaultExtensions as Extensions);\n\n return { schema, textSerializers: getTextSerializersFromSchema(schema) };\n}\n\nexport function getEditorPreviewText(value: string | undefined, maxLength = 100): string {\n if (!value) {\n return '';\n }\n\n try {\n const document = JSON.parse(value);\n serializer ??= createSerializer();\n\n return getText(Node.fromJSON(serializer.schema, document), {\n textSerializers: serializer.textSerializers,\n }).substring(0, maxLength);\n } catch {\n return value.substring(0, maxLength);\n }\n}\n","import { useMemo } from 'react';\nimport { getEditorPreviewText } from './editor-text';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\n/**\n * Renders a preview of the editor content.\n */\nexport function Editor({ value }: { value: string }) {\n const textValue = useMemo(() => getEditorPreviewText(value), [value]);\n\n return <CopyableTruncatedText value={textValue} />;\n}\n","import { useEffect, useMemo, useState } from 'react';\n\ntype CacheEntry = {\n objectUrl: string;\n byteSize: number;\n lastUsedAt: number;\n};\n\nconst MAX_CACHE_ENTRIES = 250;\nconst MAX_SINGLE_BLOB_BYTES = 2_500_000; // ~2.5MB\n\nconst blobUrlCache = new Map<string, CacheEntry>();\nconst inFlightLoads = new Map<string, Promise<void>>();\nconst corsBlockedUrls = new Set<string>();\nconst preloadedImages = new Map<string, HTMLImageElement>();\n\nfunction ensurePreloaded(url: string): void {\n if (preloadedImages.has(url)) {\n return;\n }\n\n const img = new Image();\n img.decoding = 'async';\n img.src = url;\n preloadedImages.set(url, img);\n}\n\nfunction touch(url: string): void {\n const entry = blobUrlCache.get(url);\n\n if (!entry) {\n return;\n }\n\n blobUrlCache.set(url, { ...entry, lastUsedAt: Date.now() });\n}\n\nfunction evictIfNeeded(): void {\n if (blobUrlCache.size <= MAX_CACHE_ENTRIES) {\n return;\n }\n\n const entries = Array.from(blobUrlCache.entries()).sort((a, b) => a[1].lastUsedAt - b[1].lastUsedAt);\n const evictCount = Math.max(1, Math.ceil(MAX_CACHE_ENTRIES * 0.1));\n\n for (let i = 0; i < evictCount && i < entries.length; i += 1) {\n const [url, entry] = entries[i];\n blobUrlCache.delete(url);\n\n URL.revokeObjectURL(entry.objectUrl);\n }\n}\n\nasync function loadToCache(url: string): Promise<void> {\n if (corsBlockedUrls.has(url)) {\n ensurePreloaded(url);\n\n return;\n }\n\n if (blobUrlCache.has(url)) {\n touch(url);\n\n return;\n }\n\n const existing = inFlightLoads.get(url);\n\n if (existing) {\n await existing;\n\n return;\n }\n\n const promise = (async () => {\n try {\n const res = await fetch(url, {\n mode: 'cors',\n cache: 'force-cache',\n });\n\n if (!res.ok) {\n ensurePreloaded(url);\n\n return;\n }\n\n const blob = await res.blob();\n\n if (blob.size > MAX_SINGLE_BLOB_BYTES) {\n return;\n }\n\n const objectUrl = URL.createObjectURL(blob);\n blobUrlCache.set(url, { objectUrl, byteSize: blob.size, lastUsedAt: Date.now() });\n evictIfNeeded();\n } catch (err: unknown) {\n // Most common failure is CORS (TypeError: Failed to fetch). If so, avoid retrying.\n if (err instanceof TypeError) {\n corsBlockedUrls.add(url);\n }\n\n ensurePreloaded(url);\n }\n })();\n\n inFlightLoads.set(url, promise);\n\n await promise;\n\n inFlightLoads.delete(url);\n}\n\n/**\n * Keeps a stable, in-memory cached image src across virtualized unmount/remount cycles.\n * Falls back to the original URL if the image can’t be fetched (e.g. due to CORS).\n */\nexport function useCachedImageSrc(url: string | null | undefined): string | null {\n const initial = useMemo(() => {\n if (!url) {\n return null;\n }\n\n const cached = blobUrlCache.get(url);\n\n if (!cached) {\n return null;\n }\n\n touch(url);\n\n return cached.objectUrl;\n }, [url]);\n\n const [src, setSrc] = useState<string | null>(initial);\n\n useEffect(() => {\n if (!url) {\n setSrc(null);\n\n return;\n }\n\n if (corsBlockedUrls.has(url)) {\n ensurePreloaded(url);\n setSrc(null);\n\n return;\n }\n\n const cached = blobUrlCache.get(url);\n\n if (cached) {\n touch(url);\n setSrc(cached.objectUrl);\n\n return;\n }\n\n setSrc(null);\n let isStale = false;\n\n loadToCache(url).then(() => {\n const next = blobUrlCache.get(url);\n\n if (!next) {\n return;\n }\n\n if (isStale) {\n return;\n }\n\n touch(url);\n setSrc(next.objectUrl);\n });\n\n return () => {\n isStale = true;\n };\n }, [url]);\n\n return src;\n}\n","import type { JSX } from 'react';\nimport { Tooltip, TooltipContent, TooltipPortal, TooltipTrigger } from '../../ui/primitives/tooltip';\nimport { IMAGES_BASE_URL } from '../../core/api-paths';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { useCachedImageSrc } from '../../ui/hooks/use-cached-image-src';\n\nexport type Asset = {\n _id: string;\n path: string;\n /** Total connected assets; the fetched array is bounded by the query's `first`. */\n totalCount?: number;\n};\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: Asset | Asset[] }) {\n if (Array.isArray(value)) {\n return <AssetStack value={value} />;\n }\n\n return <SingleAsset value={value} />;\n}\n\nfunction SingleAsset({ value }: { value: Asset }) {\n const path = value?.path ?? '';\n const hasPath = Boolean(path);\n const isImage = hasPath && /\\.(png|jpe?g|gif|webp|avif|svg)$/i.test(path);\n\n const getExtensionFromPath = (p: string): string => {\n const [clean] = p.split('?');\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n };\n\n const thumbnaillUrl = hasPath\n ? path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=84&h=84&f=webp`\n : null;\n\n const fullUrl = hasPath\n ? path.endsWith('.svg')\n ? `${IMAGES_BASE_URL}${path}`\n : `${IMAGES_BASE_URL}${path}?w=624&h=624&f=webp`\n : '';\n\n const cachedThumbnailSrc = useCachedImageSrc(thumbnaillUrl);\n\n if (!hasPath) {\n return null;\n }\n\n return (\n <div className=\"fk:z-10\">\n {isImage ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n alt=\"asset\"\n className={`fk:w-7 fk:h-7 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n decoding=\"async\"\n src={cachedThumbnailSrc ?? undefined}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n alt=\"asset\"\n className={`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n decoding=\"async\"\n src={fullUrl}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto fk:corner-squircle\">\n {(() => {\n const ext = getExtensionFromPath(path);\n const style = (\n defaultStyles as Record<string, Record<string, string | number | boolean | undefined>>\n )[ext];\n\n return <FileTypeIcon extension={ext} {...(style || {})} />;\n })()}\n </div>\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <div className=\"fk:text-sm fk:text-muted-foreground\">Preview not available</div>\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n )}\n </div>\n );\n}\n\nfunction AssetStack({ value }: { value: Asset[] }): JSX.Element | null {\n const assets = value.filter((asset) => Boolean(asset.path)).slice(0, 3);\n // Queries bound connection edges, so the array length undercounts; the\n // aggregate total travels on each item as totalCount.\n const totalCount = Math.max(value[0]?.totalCount ?? 0, value.length);\n\n // All fetched edges can lack `path` (still-processing uploads, incomplete\n // nodes) while totalCount > 0 — especially likely now that list queries\n // only fetch the first 3 edges. Show a count so the cell is not blank.\n if (assets.length === 0) {\n if (totalCount > 0) {\n return (\n <div className=\"fk:flex fk:items-center\">\n <span className=\"fk:text-xs fk:text-muted-foreground\">\n {totalCount === 1 ? '1 asset' : `${totalCount} assets`}\n </span>\n </div>\n );\n }\n\n return null;\n }\n\n const overflowCount = totalCount - assets.length;\n\n return (\n <div className=\"fk:flex fk:items-center\">\n <div className=\"fk:flex fk:-space-x-2\">\n {assets.map((asset) => (\n <img\n alt=\"asset\"\n className={`fk:h-7 fk:w-7 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n decoding=\"async\"\n key={asset._id}\n src={`${IMAGES_BASE_URL}${asset.path}?w=84&h=84&f=webp`}\n />\n ))}\n </div>\n {overflowCount > 0 ? (\n <span className=\"fk:ml-2 fk:text-xs fk:text-muted-foreground\">+{overflowCount}</span>\n ) : null}\n </div>\n );\n}\n","import { format, isValid } from 'date-fns';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\nexport function DateTime({ value }: { value: string | object | unknown[] }) {\n if (value === null || value === undefined || value === '' || typeof value !== 'string') {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const date = new Date(value);\n\n if (!isValid(date)) {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const displayValue = format(date, 'MMM d, yyyy') + ' at ' + format(date, 'HH:mm');\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n","import type { JSX } from 'react';\nimport type { SelectOptions } from '../../core/types';\nimport { CopyableTruncatedText } from './copyable-truncated-text';\n\ntype SelectListItem = {\n label: string;\n value: string;\n};\n\ntype GroupedSelectList = {\n groupLabel: string;\n items: SelectListItem[];\n};\n\nfunction isGroupedSelectList(option: SelectListItem | GroupedSelectList): option is GroupedSelectList {\n return 'groupLabel' in option;\n}\n\nfunction flattenSelectList(list: SelectOptions['list']): SelectListItem[] {\n return list.flatMap((option) => {\n if (isGroupedSelectList(option)) {\n return option.items;\n }\n\n return [option];\n });\n}\n\nfunction resolveSelectLabel(value: string, list: SelectOptions['list'] | undefined): string {\n if (!list) {\n return value;\n }\n\n const match = flattenSelectList(list).find((item) => String(item.value) === value);\n\n if (!match) {\n return value;\n }\n\n return match.label;\n}\n\nexport function Select({\n value,\n options,\n}: {\n value: string | number | null | undefined;\n options?: SelectOptions;\n}): JSX.Element {\n if (value === null || value === undefined) {\n return <CopyableTruncatedText value=\"\" />;\n }\n\n const stringValue = String(value);\n const displayValue = resolveSelectLabel(stringValue, options?.list);\n\n return <CopyableTruncatedText value={displayValue} />;\n}\n","import { Badge } from '../../ui/primitives/badge';\n\nexport function Tags({ value }: { value: string }) {\n if (!value || !value.split(',').length) {\n return null;\n }\n\n return (\n <div className=\"fk:flex fk:flex-wrap fk:gap-1 fk:max-w-full truncate\">\n {value.split(',').map((tag) => (\n <Badge\n className=\"fk:px-2.5 fk:py-0 fk:font-normal fk:text-[0.6875rem] fk:leading-4\"\n key={tag}\n variant=\"secondary\"\n >\n {tag}\n </Badge>\n ))}\n </div>\n );\n}\n","export const DEFAULT_RATING_MAX = 5;\n\nexport type RatingState = {\n /** Number of filled stars. */\n filled: number;\n /** Total number of stars. */\n max: number;\n /** Accessible description, e.g. \"4 out of 5 stars\". */\n label: string;\n};\n\n/**\n * Turns a stored value into what the stars show. Non-numeric, missing and\n * empty values yield `null` (render nothing); numbers are rounded and clamped\n * to `[0, max]`. `max` comes from `options.max` and falls back to five.\n */\nexport function getRatingState(value: unknown, max: number | undefined = DEFAULT_RATING_MAX): RatingState | null {\n const total = Number.isFinite(max) && (max as number) >= 1 ? Math.floor(max as number) : DEFAULT_RATING_MAX;\n const numeric = typeof value === 'string' && value.trim() !== '' ? Number(value) : value;\n\n if (typeof numeric !== 'number' || !Number.isFinite(numeric)) {\n return null;\n }\n\n const filled = Math.min(total, Math.max(0, Math.round(numeric)));\n\n return { filled, max: total, label: `${String(filled)} out of ${String(total)} stars` };\n}\n","import type { JSX } from 'react';\nimport { Star } from 'lucide-react';\nimport type { NumberOptions } from '../../core/types';\nimport { getRatingState } from './rating-state';\n\ntype Props = {\n value: number | string | null | undefined;\n options?: NumberOptions;\n};\n\n/** Filled stars for a numeric attribute (`previewType: 'rating'`); `options.max` sets the count. */\nexport function Rating({ value, options }: Props): JSX.Element {\n const state = getRatingState(value, options?.max);\n\n if (!state) {\n return <span />;\n }\n\n return (\n <span aria-label={state.label} className=\"fk:inline-flex fk:items-center fk:gap-0.5\" role=\"img\" title={state.label}>\n {Array.from({ length: state.max }, (_, index) => (\n <Star\n aria-hidden\n className={\n index < state.filled\n ? 'fk:h-3.5 fk:w-3.5 fk:fill-amber-400 fk:text-amber-400'\n : 'fk:h-3.5 fk:w-3.5 fk:fill-transparent fk:text-muted-foreground/40'\n }\n key={index}\n strokeWidth={1.5}\n />\n ))}\n </span>\n );\n}\n","const IMAGE_EXTENSION = /\\.(png|jpe?g|gif|webp|avif|svg)$/i;\n\nexport type AssetUrlFields = {\n mimeType?: string | null;\n originalFilename?: string | null;\n path?: string | null;\n url?: string | null;\n};\n\nfunction getFilenameFromUrl(url: string): string {\n try {\n const { pathname } = new URL(url);\n const segment = pathname.split('/').pop();\n\n return segment || pathname;\n } catch {\n const [pathname] = url.split('?');\n\n return pathname;\n }\n}\n\nexport function getAssetFilename(asset: AssetUrlFields): string {\n if (asset.originalFilename) {\n return asset.originalFilename;\n }\n\n if (asset.path) {\n return asset.path;\n }\n\n if (asset.url) {\n return getFilenameFromUrl(asset.url);\n }\n\n return '';\n}\n\nexport function getExtensionFromAsset(asset: AssetUrlFields): string {\n const filename = getAssetFilename(asset);\n const [clean] = filename.split('?');\n const parts = clean.split('.');\n\n if (parts.length > 1) {\n return parts.pop()!.toLowerCase();\n }\n\n return 'file';\n}\n\nexport function isImageAsset(asset: AssetUrlFields): boolean {\n if (asset.mimeType) {\n return asset.mimeType.startsWith('image/');\n }\n\n return IMAGE_EXTENSION.test(getAssetFilename(asset));\n}\n\nexport function getAssetImageUrl(url: string, size?: { height: number; width: number }): string {\n if (!url || !size) {\n return url;\n }\n\n if (getFilenameFromUrl(url).toLowerCase().endsWith('.svg')) {\n return url;\n }\n\n const params = new URLSearchParams({\n f: 'webp',\n h: String(size.height),\n w: String(size.width),\n });\n const separator = url.includes('?') ? '&' : '?';\n\n return `${url}${separator}${params.toString()}`;\n}\n","import { useState, type ComponentType, type JSX, type MouseEvent } from 'react';\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n Tooltip,\n TooltipContent,\n TooltipPortal,\n TooltipProvider,\n TooltipTrigger,\n} from '../../../../ui';\nimport { FileIcon as FileTypeIcon, defaultStyles } from 'react-file-icon';\nimport { getAssetImageUrl, getExtensionFromAsset, isImageAsset, type AssetUrlFields } from '../asset-url';\n\n// Temporary fix due to runtime mismatch between React 18 and React 19 types\ntype FileTypeIconCompatProps = {\n extension: string;\n [key: string]: string | number | boolean | undefined;\n};\n\nconst FileTypeIconCompat = FileTypeIcon as unknown as ComponentType<FileTypeIconCompatProps>;\n\nconst transparentImageBackground =\n 'fk:bg-[#fafafa] [--asset-checker:#f0f0f0] [background-image:linear-gradient(45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(-45deg,var(--asset-checker)_25%,transparent_25%),linear-gradient(45deg,transparent_75%,var(--asset-checker)_75%),linear-gradient(-45deg,transparent_75%,var(--asset-checker)_75%)] [background-position:0_0,0_4px,4px_-4px,-4px_0px] [background-size:8px_8px] fk:dark:bg-[#222] dark:[--asset-checker:#2a2a2a]';\n\nexport function Asset({ value }: { value: AssetUrlFields }): JSX.Element | null {\n const [isZoomOpen, setIsZoomOpen] = useState(false);\n const url = value?.url ?? '';\n\n if (!value || (!url && !value.path && !value.originalFilename)) {\n return null;\n }\n\n const isImage = isImageAsset(value) && Boolean(url);\n\n if (!isImage) {\n const ext = getExtensionFromAsset(value);\n const style = (\n defaultStyles as unknown as {\n [key: string]: { [key: string]: string | number | boolean | undefined } | undefined;\n }\n )[ext];\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <div className=\"fk:w-7 fk:h-7 fk:rounded-sm fk:bg-transparent fk:flex fk:items-center fk:justify-center fk:[&>svg]:h-full fk:[&>svg]:w-auto fk:corner-squircle\">\n <FileTypeIconCompat extension={ext} {...(style || {})} />\n </div>\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <div className=\"fk:text-sm fk:text-muted-foreground\">Preview not available</div>\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n </TooltipProvider>\n </div>\n );\n }\n\n const thumbnailUrl = getAssetImageUrl(url, { width: 84, height: 84 });\n const fullUrl = getAssetImageUrl(url, { width: 624, height: 624 });\n\n function handleThumbnailClick(event: MouseEvent<HTMLImageElement>): void {\n event.stopPropagation();\n setIsZoomOpen(true);\n }\n\n return (\n <div className=\"fk:z-10\">\n <TooltipProvider>\n <Tooltip>\n <TooltipTrigger asChild>\n <img\n src={thumbnailUrl}\n alt=\"asset\"\n className={`fk:w-12 fk:h-12 fk:cursor-zoom-in fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n onClick={handleThumbnailClick}\n />\n </TooltipTrigger>\n <TooltipPortal>\n <TooltipContent>\n <img\n src={fullUrl}\n alt=\"asset\"\n className={`fk:w-52 fk:h-52 fk:overflow-hidden fk:rounded-md fk:object-contain ${transparentImageBackground} fk:corner-squircle`}\n />\n </TooltipContent>\n </TooltipPortal>\n </Tooltip>\n <Dialog open={isZoomOpen} onOpenChange={setIsZoomOpen}>\n <DialogContent className=\"fk:sm:max-w-4xl fk:p-3\">\n <DialogHeader>\n <DialogTitle className=\"fk:sr-only\">Asset preview</DialogTitle>\n <DialogDescription className=\"fk:sr-only\">Enlarged asset preview</DialogDescription>\n </DialogHeader>\n <img\n src={url}\n alt=\"asset\"\n className={`fk:max-h-[85vh] fk:w-full fk:overflow-hidden fk:rounded-md fk:object-contain fk:corner-squircle`}\n />\n </DialogContent>\n </Dialog>\n </TooltipProvider>\n </div>\n );\n}\n","import { ComponentType } from 'react';\nimport type { JSX } from 'react';\nimport type { CellContext, Column, ColumnDef, Row, Table } from '@tanstack/react-table';\nimport type { Attribute, InputType, NumberOptions, SelectOptions } from '../core/types';\nimport type { AttributeValue } from '../graphql-client/types';\nimport { useAuth } from '../auth/auth-context';\nimport { filterAttributesForSpaces } from '../core/spaces';\nimport { Checkbox } from '../ui/primitives/checkbox';\nimport { Boolean as BooleanPrefiewField } from './preview-components/boolean';\nimport { Text as TextPreviewField } from './preview-components/text';\nimport { Editor as EditorPreviewField } from './preview-components/editor';\nimport { Asset as AssetPreviewField } from './preview-components/asset';\nimport { DateTime as DateTimePreviewField } from './preview-components/datetime';\nimport { Select as SelectPreviewField } from './preview-components/select';\nimport { Tags as TagsPreviewField } from './preview-components/tags';\nimport { Rating as RatingPreviewField } from './preview-components/rating';\nimport { Asset as AssetManagerAssetPreviewField } from '../apps/asset-manager/data-grid/preview-components/asset';\nimport { DataTableColumnHeader } from './data-table-column-header';\n\nconst SORTABLE_INPUT_TYPES = new Set<InputType>([\n 'text',\n 'number',\n 'datetime',\n 'switch',\n 'select',\n]);\n\ntype Props<TData> = {\n attributesSchema: Attribute[];\n checkboxSelect?: 'single' | 'multiple'; // whether to include a checkbox column for row selection\n actionsComponent?: (row: Row<TData>) => JSX.Element; // a component to be displayed in the actions column of the grid\n enableColumnSorting?: boolean;\n};\n\ntype ColumnDefinition<TData extends AttributeValue, TValue> = ColumnDef<TData, TValue> & { id?: string; size: number };\n\nexport function useGridColumnsDefinition<TData extends AttributeValue, TValue>({\n attributesSchema,\n checkboxSelect,\n actionsComponent,\n enableColumnSorting = false,\n}: Props<TData>): ColumnDefinition<TData, TValue>[] {\n const [, auth] = useAuth();\n // Space-bound attributes are filtered out for non-members; their values are\n // null-ed by the server anyway, this just avoids rendering empty columns.\n const visibleAttributesSchema = filterAttributesForSpaces(attributesSchema, auth.user?.spaces);\n const inputTypeToPreviewFieldMap = {\n 'datetime': 'datetime',\n 'editor': 'editor',\n 'asset': 'asset',\n 'number': 'text',\n 'relationship': 'text',\n 'select': 'select',\n 'switch': 'boolean',\n 'text': 'text',\n 'textarea': 'text',\n };\n const previewFieldComponentsMap = {\n 'boolean': BooleanPrefiewField,\n 'date': TextPreviewField,\n 'datetime': DateTimePreviewField,\n 'editor': EditorPreviewField,\n 'asset': AssetPreviewField,\n 'number': TextPreviewField,\n 'relationship': TextPreviewField,\n 'select': SelectPreviewField,\n 'switch': BooleanPrefiewField,\n 'text': TextPreviewField,\n 'textarea': TextPreviewField,\n 'tags': TagsPreviewField,\n 'rating': RatingPreviewField,\n // Asset Manager rows render the whole record (path, mime type, ...).\n 'assetPreviewField': AssetManagerAssetPreviewField,\n };\n\n const cols = visibleAttributesSchema\n .map((attribute) => {\n // System timestamp column is always appended last; skip schema duplicates.\n if (attribute.name === '_updatedAt') {\n return null;\n }\n\n const previewType =\n (attribute.inputType === 'relationship' && attribute.relationship?.entity === '_asset' ? 'asset' : undefined) ??\n attribute.previewType ??\n inputTypeToPreviewFieldMap[attribute.inputType as keyof typeof inputTypeToPreviewFieldMap];\n // Unknown preview types (e.g. custom ones from older configs) fall back to text.\n const previewComponent =\n (previewFieldComponentsMap[previewType as keyof typeof previewFieldComponentsMap] as\n | ComponentType<{ value: TData }>\n | undefined) ?? previewFieldComponentsMap['text'];\n\n if (attribute.hidden === true) {\n return null;\n }\n\n const isTagsPreview = previewType === 'tags';\n // Only global scalars appear on Neo4j GraphQL `{entity}Sort`. Local fields are\n // emitted as relationships (e.g. brand.metaTitle → brand_metaTitle) and cannot be sorted.\n const canSort =\n enableColumnSorting &&\n attribute.scope === 'global' &&\n SORTABLE_INPUT_TYPES.has(attribute.inputType);\n\n return {\n accessorKey: attribute.name,\n filterFn: (row: Row<TData>, id: string, value: string | string[]) => {\n if (isTagsPreview) {\n return true;\n }\n\n const selectedValues = Array.isArray(value) ? value : [value];\n\n return selectedValues.includes(row.getValue(id));\n },\n header: ({ column }: { column: Column<TData, TValue> }) =>\n canSort ? (\n <DataTableColumnHeader column={column} title={attribute.label} />\n ) : (\n <div className=\"fk:flex fk:items-center\">{attribute.label}</div>\n ),\n cell: ({ row }: CellContext<TData, TValue>) => {\n const PreviewComponent = previewComponent as ComponentType<{\n value: TData;\n options?: SelectOptions | NumberOptions;\n }>;\n\n // Select needs its option list; rating reads the star count from options.max.\n if (previewType === 'select' || previewType === 'rating') {\n return (\n <PreviewComponent\n value={row.getValue(attribute.name)}\n options={attribute.options as SelectOptions | NumberOptions | undefined}\n />\n );\n }\n\n if (previewType === 'assetPreviewField') {\n return <PreviewComponent value={row.original} />;\n }\n\n return <PreviewComponent value={row.getValue(attribute.name)} />;\n },\n enableSorting: canSort,\n enableHiding: true,\n meta: {\n label: attribute.label,\n },\n size: attribute.options?.size ?? 150,\n };\n })\n .filter((column) => column !== null);\n\n const actions = {\n id: 'actions',\n cell: ({ row }: CellContext<TData, TValue>) => (actionsComponent ? actionsComponent(row) : null),\n size: 80,\n };\n\n const updatedAt = {\n accessorKey: '_updatedAt',\n header: ({ column }: { column: Column<TData, TValue> }) =>\n enableColumnSorting ? (\n <DataTableColumnHeader column={column} title=\"Updated At\" />\n ) : (\n <div className=\"fk:flex fk:items-center\">Updated At</div>\n ),\n cell: ({ row }: CellContext<TData, TValue>) => (\n <DateTimePreviewField value={row.getValue('_updatedAt')} />\n ),\n enableSorting: enableColumnSorting,\n enableHiding: false,\n meta: {\n label: 'Updated At',\n },\n size: 220,\n };\n\n const singleCheckboxSelect = {\n id: 'select',\n cell: ({ row, table }: CellContext<TData, TValue>) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(value) => {\n table.toggleAllPageRowsSelected(false);\n row.toggleSelected(Boolean(value));\n }}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 50,\n };\n\n const multipleCheckboxSelect = {\n id: 'select',\n header: ({ table }: { table: Table<unknown> }) => (\n <Checkbox\n className=\"fk:dark:bg-white/15\"\n aria-label=\"Select all\"\n checked={table.getIsAllPageRowsSelected() || (table.getIsSomePageRowsSelected() && 'indeterminate')}\n onCheckedChange={(value) => {\n table.toggleAllPageRowsSelected(Boolean(value));\n }}\n />\n ),\n cell: ({ row }: CellContext<TData, TValue>) => (\n <Checkbox\n aria-label=\"Select row\"\n checked={row.getIsSelected()}\n onCheckedChange={(value) => {\n row.toggleSelected(Boolean(value));\n }}\n />\n ),\n enableSorting: false,\n enableHiding: false,\n size: 50,\n };\n\n return [\n ...(checkboxSelect === 'single' ? [singleCheckboxSelect] : []),\n ...(checkboxSelect === 'multiple' ? [multipleCheckboxSelect] : []),\n ...(actionsComponent ? [actions] : []),\n ...cols,\n updatedAt,\n ];\n}\n"]}