@ethlete/query 6.0.0-next.3 → 6.0.0-next.30

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 (31) hide show
  1. package/CHANGELOG.md +447 -0
  2. package/fesm2022/ethlete-query-testing.mjs +281 -5
  3. package/fesm2022/ethlete-query-testing.mjs.map +1 -1
  4. package/fesm2022/ethlete-query.mjs +9926 -5013
  5. package/fesm2022/ethlete-query.mjs.map +1 -1
  6. package/generators/deprecate-legacy-queries/migration.js +77 -0
  7. package/generators/deprecate-legacy-queries/schema.json +26 -0
  8. package/generators/generators.json +15 -0
  9. package/generators/migrate-query-client-features/migration.js +142 -0
  10. package/generators/migrate-query-client-features/report.js +136 -0
  11. package/generators/migrate-query-client-features/schema.json +26 -0
  12. package/generators/migrate-query-opt-in-features/migration.js +182 -0
  13. package/generators/migrate-query-opt-in-features/report.js +143 -0
  14. package/generators/migrate-query-opt-in-features/schema.json +31 -0
  15. package/generators/migrate-to-query-v3/auth-provider-scaffold.js +131 -0
  16. package/generators/migrate-to-query-v3/cleanup-migration.js +293 -0
  17. package/generators/migrate-to-query-v3/http-client-check.js +93 -0
  18. package/generators/migrate-to-query-v3/legacy-prepare-migration.js +865 -0
  19. package/generators/migrate-to-query-v3/legacy-query-creator-migration.js +608 -0
  20. package/generators/migrate-to-query-v3/migration-scope.js +41 -0
  21. package/generators/migrate-to-query-v3/migration.js +28 -2932
  22. package/generators/migrate-to-query-v3/module-graph.js +153 -0
  23. package/generators/migrate-to-query-v3/query-client-migration.js +526 -0
  24. package/generators/migrate-to-query-v3/rename-symbols.js +193 -0
  25. package/generators/migrate-to-query-v3/report.js +136 -0
  26. package/generators/migrate-to-query-v3/schema.json +12 -0
  27. package/generators/migrate-to-query-v3/shared.js +142 -0
  28. package/generators/prep-for-query-v3/migration.js +3 -3
  29. package/package.json +26 -13
  30. package/types/ethlete-query-testing.d.ts +139 -12
  31. package/types/ethlete-query.d.ts +6965 -3142
@@ -1 +1 @@
1
- {"version":3,"file":"ethlete-query.mjs","sources":["../../../../libs/query/src/lib/gql/gql-transformer.ts","../../../../libs/query/src/lib/gql/gql-query-execute.ts","../../../../libs/query/src/lib/gql/gql-query.ts","../../../../libs/query/src/lib/http/observable-signal.ts","../../../../libs/query/src/lib/http/query-context.ts","../../../../libs/query/src/lib/http/query-dependencies.ts","../../../../libs/query/src/lib/http/query-errors.ts","../../../../libs/query/src/lib/http/query-features.ts","../../../../libs/query/src/lib/http/query-state.ts","../../../../libs/query/src/lib/http/query-snapshot.ts","../../../../libs/query/src/lib/http/base-query-factory.ts","../../../../libs/query/src/lib/http/query-execute-utils.ts","../../../../libs/query/src/lib/http/query-execute.ts","../../../../libs/query/src/lib/http/query.ts","../../../../libs/query/src/lib/http/query-creator.ts","../../../../libs/query/src/lib/http/base-query-creator-factory.ts","../../../../libs/query/src/lib/http/query-error-response-utils.ts","../../../../libs/query/src/lib/legacy/logger/logger.ts","../../../../libs/query/src/lib/legacy/request/request.util.ts","../../../../libs/query/src/lib/legacy/request/request.ts","../../../../libs/query/src/lib/http/query-cache-utils.ts","../../../../libs/query/src/lib/http/query-retry-utils.ts","../../../../libs/query/src/lib/http/query-error-response.ts","../../../../libs/query/src/lib/http/http-request.ts","../../../../libs/query/src/lib/http/query-stack.ts","../../../../libs/query/src/lib/http/paged-query-stack.ts","../../../../libs/query/src/lib/legacy/auth/custom-header-auth-provider.ts","../../../../libs/query/src/lib/legacy/auth/basic-auth-provider.ts","../../../../libs/query/src/lib/legacy/utils/data.utils.ts","../../../../libs/query/src/lib/legacy/utils/deep-freeze.util.ts","../../../../libs/query/src/lib/legacy/utils/def.util.ts","../../../../libs/query/src/lib/legacy/query-creator/query-creator.ts","../../../../libs/query/src/lib/legacy/query-store/query-store.ts","../../../../libs/query/src/lib/legacy/query-client/query-client.ts","../../../../libs/query/src/lib/legacy/query-client/query-client.utils.ts","../../../../libs/query/src/lib/gql/gql-query-creator.ts","../../../../libs/query/src/lib/http/secure-query-execute-factory.ts","../../../../libs/query/src/lib/gql/secure-gql-query-execute.ts","../../../../libs/query/src/lib/gql/secure-gql-query.ts","../../../../libs/query/src/lib/gql/secure-gql-query-creator.ts","../../../../libs/query/src/lib/gql/gql-query-creator-templates.ts","../../../../libs/query/src/lib/legacy/interop/legacy-query.ts","../../../../libs/query/src/lib/legacy/interop/legacy-query-creator.ts","../../../../libs/query/src/lib/legacy/query/query.utils.ts","../../../../libs/query/src/lib/legacy/query/query.ts","../../../../libs/query/src/lib/legacy/auth/auth-provider.utils.ts","../../../../libs/query/src/lib/legacy/auth/bearer-auth-provider.ts","../../../../libs/query/src/lib/legacy/directives/infinity-query-response-delay-provider.ts","../../../../libs/query/src/lib/legacy/infinite-query/infinity-query.ts","../../../../libs/query/src/lib/legacy/infinite-query/infinity-query.utils.ts","../../../../libs/query/src/lib/legacy/directives/infinity-query.directive.ts","../../../../libs/query/src/lib/legacy/directives/infinity-query-trigger.directive.ts","../../../../libs/query/src/lib/legacy/directives/query.directive.ts","../../../../libs/query/src/lib/legacy/devtools/pipes/query-short-name.pipe.ts","../../../../libs/query/src/lib/legacy/devtools/utils/query-client.utils.ts","../../../../libs/query/src/lib/legacy/devtools/components/query-devtools/query-devtools.component.ts","../../../../libs/query/src/lib/legacy/devtools/components/query-devtools/query-devtools.component.html","../../../../libs/query/src/lib/legacy/entity/entity-store.ts","../../../../libs/query/src/lib/legacy/entity/entity.utils.ts","../../../../libs/query/src/lib/http/query-repository.ts","../../../../libs/query/src/lib/http/query-client.ts","../../../../libs/query/src/lib/http/secure-query-execute.ts","../../../../libs/query/src/lib/http/secure-query.ts","../../../../libs/query/src/lib/http/secure-query-creator.ts","../../../../libs/query/src/lib/http/query-creator-templates.ts","../../../../libs/query/src/lib/auth/internal/leader-election.ts","../../../../libs/query/src/lib/auth/utils/token-encryption.ts","../../../../libs/query/src/lib/auth/internal/multi-tab-sync.ts","../../../../libs/query/src/lib/auth/bearer-auth-provider.ts","../../../../libs/query/src/lib/auth/bearer-auth-query-builders.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-inactivity-logout.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-persistent-auth.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-token-expiration-warning.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-token-revocation.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-tracking.ts","../../../../libs/query/src/lib/pipes/parse-http-error-code-de.ts","../../../../libs/query/src/lib/pipes/parse-http-error-code-de.pipe.ts","../../../../libs/query/src/lib/pipes/parse-http-error-code-en.ts","../../../../libs/query/src/lib/pipes/parse-http-error-code-en.pipe.ts","../../../../libs/query/src/lib/query-form/query-form.utils.ts","../../../../libs/query/src/lib/query-form/query-form.ts","../../../../libs/query/src/lib/ws/web-socket-errors.ts","../../../../libs/query/src/lib/ws/web-socket-client.ts","../../../../libs/query/src/ethlete-query.ts"],"sourcesContent":["import { isDevMode } from '@angular/core';\n\nconst getOpName = /(query|mutation) ?([\\w\\d-_]+)? ?\\(.*?\\)? \\{/;\n\nexport type TransformedGqlQuery = {\n query: string;\n variables?: string;\n operationName?: string;\n};\n\nexport type GqlTransformer = (variables: Record<string, unknown> | null | undefined) => TransformedGqlQuery;\n\nexport const transformGql = (str: string | string[]): GqlTransformer => {\n const normalizedStr = Array.isArray(str) ? str.join('') : str;\n\n const name = getOpName.exec(normalizedStr);\n\n return (variables: Record<string, unknown> | null | undefined): TransformedGqlQuery => {\n const data: TransformedGqlQuery = { query: normalizedStr };\n\n if (variables) {\n data['variables'] = JSON.stringify(variables);\n }\n\n if (name && name.length) {\n const operationName = name[2];\n if (operationName) {\n data['operationName'] = operationName;\n }\n }\n\n if (!isDevMode()) {\n // minify the query\n data.query = data.query.replace(/\\s+/g, ' ').trim();\n }\n\n return data;\n };\n};\n\nexport type GQL = string & { readonly __gql: unique symbol };\n\nexport const gql = (strings: TemplateStringsArray, ...values: unknown[]): GQL => {\n const str = strings.reduce((acc, cur, i) => {\n return acc + cur + (values[i] ?? '');\n }, '');\n return str as GQL;\n};\n","import {\n circularQueryDependencyChecker,\n CreateQueryExecuteOptions,\n InternalQueryExecute,\n QueryArgs,\n QueryConfig,\n QueryDependencies,\n queryExecute,\n QueryExecuteArgs,\n QueryState,\n RequestArgs,\n resetExecuteState,\n RouteType,\n setupQueryExecuteState,\n} from '../http';\nimport { GqlQueryArgs } from './gql-query';\nimport { AnyCreateGqlQueryCreatorOptions, InternalCreateGqlQueryCreatorOptions } from './gql-query-creator';\nimport { transformGql } from './gql-transformer';\n\nexport type CreateGqlQueryExecuteOptions<TArgs extends QueryArgs> = {\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n creator?: AnyCreateGqlQueryCreatorOptions;\n creatorInternals: InternalCreateGqlQueryCreatorOptions;\n queryConfig: QueryConfig;\n};\n\nexport const createGqlExecuteFn = <TArgs extends GqlQueryArgs>(\n executeOptions: CreateGqlQueryExecuteOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const executeState = setupQueryExecuteState();\n const circularChecker = circularQueryDependencyChecker();\n\n const reset = () => resetExecuteState({ executeState, executeOptions });\n\n const exec = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n circularChecker.check();\n\n // Make sure all effects are flushed before reading the args.\n // A withArgs feature effect might still be pending otherwise resulting in the wrong args being read.\n executeOptions.deps.effectScheduler.flush();\n\n const { args = executeOptions.state.args(), options } = executeArgs ?? {};\n\n const query = transformGql(executeOptions.creatorInternals.query);\n let gqlParams = query(args?.variables);\n\n if (args?.queryParams && executeOptions.creatorInternals.transport === 'GET') {\n gqlParams = { ...gqlParams, ...args.queryParams };\n }\n\n const computedArgs = args ?? ({} as RequestArgs<TArgs>);\n\n if (executeOptions.creatorInternals.transport === 'GET') {\n computedArgs.queryParams = gqlParams;\n } else {\n computedArgs.body = gqlParams;\n }\n\n const normalizedOpts: CreateQueryExecuteOptions<TArgs> = {\n creator: {\n ...(executeOptions.creator ?? {}),\n subtle: {\n ...(executeOptions.creator?.subtle ?? {}),\n useQueryRepositoryCache:\n executeOptions.creator?.subtle?.useQueryRepositoryCache ??\n executeOptions.creatorInternals.method === 'QUERY',\n },\n },\n creatorInternals: {\n client: executeOptions.creatorInternals.client,\n method: executeOptions.creatorInternals.transport,\n route: (executeOptions.creator?.route ?? '') as RouteType<TArgs>,\n },\n deps: executeOptions.deps,\n queryConfig: executeOptions.queryConfig,\n state: executeOptions.state,\n };\n\n queryExecute({\n executeOptions: normalizedOpts,\n executeState,\n args: computedArgs,\n options,\n });\n };\n\n exec['reset'] = reset;\n\n exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();\n\n return exec;\n};\n","import { createBaseQuery, CreateQueryOptions, QueryArgs } from '../http';\nimport { CreateGqlQueryCreatorOptions, InternalCreateGqlQueryCreatorOptions } from './gql-query-creator';\nimport { createGqlExecuteFn } from './gql-query-execute';\n\nexport type GqlQueryArgs<TResponse = unknown> = QueryArgs & {\n response: TResponse;\n rawResponse?: { data: TResponse };\n variables?: Record<string, unknown>;\n};\n\nexport type CreateGqlQueryOptions<TArgs extends GqlQueryArgs> = Omit<\n CreateQueryOptions<TArgs>,\n 'creator' | 'creatorInternals'\n> & {\n creator?: CreateGqlQueryCreatorOptions<TArgs>;\n creatorInternals: InternalCreateGqlQueryCreatorOptions;\n};\n\nexport type GqlVariablesType<T extends GqlQueryArgs | null> = T extends GqlQueryArgs ? T['variables'] : never;\n\nexport const isCreateGqlQueryOptions = <TArgs extends QueryArgs>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: CreateQueryOptions<TArgs> | CreateGqlQueryOptions<any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): options is CreateGqlQueryOptions<any> => {\n return 'transport' in options.creatorInternals;\n};\n\nexport const createGqlQuery = <TArgs extends GqlQueryArgs>(options: CreateGqlQueryOptions<TArgs>) =>\n createBaseQuery({\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n features: options.features,\n queryConfig: options.queryConfig,\n executeFactory: createGqlExecuteFn,\n });\n","import { DestroyRef, Injector, Signal } from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\n\nexport type ObservableSignal<T> = Signal<T> & {\n /**\n * Converts this signal to an Observable.\n *\n * The observable lifetime is bounded by the signal owner's injector by default.\n * When an override injector is provided, the observable is bounded by whichever lifetime ends\n * first: `min(override injector lifetime, signal owner injector lifetime)`.\n */\n asObservable(options?: { injector?: Injector }): Observable<T>;\n};\n\nexport const wrapAsObservableSignal = <T>(source: Signal<T>, defaultInjector: Injector): ObservableSignal<T> => {\n const asObservable = (options?: { injector?: Injector }): Observable<T> => {\n const effectiveInjector = options?.injector ?? defaultInjector;\n const base$ = toObservable(source, { injector: effectiveInjector });\n\n if (options?.injector) {\n return base$.pipe(takeUntilDestroyed(defaultInjector.get(DestroyRef)));\n }\n\n return base$;\n };\n\n return Object.assign(source, { asObservable }) as unknown as ObservableSignal<T>;\n};\n","import { inject, InjectionToken } from '@angular/core';\nimport { createStaticProvider } from '@ethlete/core';\nimport { QueryDependencies } from './query-dependencies';\n\nexport type QueryContext = {\n /** All query dependencies (client, injector, destroy refs, etc.) */\n deps: QueryDependencies;\n};\n\nconst QUERY_CONTEXT_TOKEN = new InjectionToken<QueryContext>('QUERY_CONTEXT');\n\nexport const createQueryContext = (context: QueryContext) =>\n createStaticProvider(context, {\n name: 'Query Context',\n extraInjectionToken: QUERY_CONTEXT_TOKEN,\n });\n\nexport const injectQueryContext = () => inject(QUERY_CONTEXT_TOKEN);\n","import { HttpClient } from '@angular/common/http';\nimport {\n createEnvironmentInjector,\n DestroyRef,\n EnvironmentInjector,\n ErrorHandler,\n inject,\n Injector,\n ɵEffectScheduler,\n} from '@angular/core';\nimport { AnyCreateQueryClientResult, QueryClient } from './query-client';\nimport { createQueryContext, QueryContext } from './query-context';\nimport { QueryConfig } from './query-creator';\n\nexport type SetupQueryDependenciesOptions = {\n /** The query client tuple from createQueryClient */\n client: AnyCreateQueryClientResult;\n\n /** Optional query configuration */\n queryConfig: QueryConfig | undefined;\n};\n\nexport type QueryDependencies = {\n /** The destroy ref of the query. */\n destroyRef: DestroyRef;\n\n /** The destroy ref of the scope the query is in (e.g. a component) */\n scopeDestroyRef: DestroyRef;\n\n /** The query client */\n client: QueryClient;\n\n /** The injector of the query */\n injector: EnvironmentInjector;\n\n /** The effect scheduler */\n effectScheduler: ɵEffectScheduler;\n\n /** The error handler */\n ngErrorHandler: ErrorHandler;\n\n /** The http client */\n httpClient: HttpClient;\n};\n\nexport const setupQueryDependencies = (options: SetupQueryDependenciesOptions) => {\n const hostInjector = options.queryConfig?.injector ?? inject(Injector);\n const environmentInjector =\n options.queryConfig?.injector?.get(EnvironmentInjector) ?? hostInjector.get(EnvironmentInjector);\n\n const [, , clientToken] = options.client;\n\n const dependencies: QueryDependencies = {\n destroyRef: undefined as unknown as DestroyRef, // Will be set after injector creation\n scopeDestroyRef: hostInjector.get(DestroyRef),\n client: hostInjector.get<QueryClient>(clientToken),\n injector: undefined as unknown as EnvironmentInjector, // Will be set after injector creation\n effectScheduler: hostInjector.get(ɵEffectScheduler),\n ngErrorHandler: hostInjector.get(ErrorHandler),\n httpClient: hostInjector.get(HttpClient),\n };\n\n const queryContext: QueryContext = {\n deps: dependencies,\n };\n\n const [provideQueryContext] = createQueryContext(queryContext);\n\n const queryEnvironmentInjector = createEnvironmentInjector([provideQueryContext()], environmentInjector);\n\n dependencies.destroyRef = queryEnvironmentInjector.get(DestroyRef);\n dependencies.injector = queryEnvironmentInjector;\n\n // cleanup the environment injector when the scope (e.g. the component the query is in) is destroyed\n const scopeDestroyListener = dependencies.scopeDestroyRef.onDestroy(() => {\n try {\n queryEnvironmentInjector.destroy();\n } catch {\n // ignore\n }\n });\n\n dependencies.destroyRef.onDestroy(() => {\n // cleanup the scope destroy listener\n try {\n scopeDestroyListener();\n } catch {\n // ignore\n }\n });\n\n return dependencies;\n};\n","import { RuntimeError } from '@ethlete/core';\nimport { QueryFeatureType } from './query-features';\n\n// codes 0-999\nexport const QueryRuntimeErrorCode = {\n // Query\n QUERY_FEATURE_USED_MULTIPLE_TIMES: 0,\n\n // Query features\n WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION: 100,\n WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD: 101,\n WITH_AUTO_REFRESH_USED_ON_UNSUPPORTED_HTTP_METHOD: 102,\n WITH_AUTO_REFRESH_USED_IN_MANUAL_QUERY: 103,\n SILENCE_MISSING_WITH_ARGS_FEATURE_ERROR_USED_BUT_WITH_ARGS_PRESENT: 104,\n\n // Auth provider\n AUTH_EXTRACT_TOKENS_RESPONSE_NOT_OBJECT: 200,\n AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_ACCESS_TOKEN: 201,\n AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_REFRESH_TOKEN: 202,\n AUTH_PROVIDER_FEATURE_USED_MULTIPLE_TIMES: 203,\n\n // Query Repository\n UNCACHEABLE_REQUEST_HAS_CACHE_KEY_PARAM: 300,\n UNCACHEABLE_REQUEST_HAS_ALLOW_CACHE_PARAM: 301,\n\n // Paged Query Stack\n PAGED_QUERY_STACK_PAGE_BIGGER_THAN_TOTAL_PAGES: 400,\n PAGED_QUERY_STACK_NEXT_PAGE_CALLED_WITHOUT_PREVIOUS_PAGE: 401,\n PAGED_QUERY_STACK_PREVIOUS_PAGE_CALLED_BUT_ALREADY_AT_FIRST_PAGE: 402,\n\n // Query Stack\n QUERY_STACK_WITH_ARGS_USED: 500,\n QUERY_STACK_WITH_RESPONSE_UPDATE_USED: 501,\n QUERY_STACK_TOTAL_QUERIES_AND_EXPECTED_QUERIES_MISMATCH: 502,\n\n // GQL\n GQL_DATA_PROPERTY_MISSING_IN_RESPONSE: 600,\n\n // Secure Execute\n TOKENS_NOT_AVAILABLE_INSIDE_AUTH_AND_EXEC: 700,\n INVALID_STATE_INSIDE_SECURE_EXECUTE_FACTORY: 701,\n\n // Query Execution\n CIRCULAR_QUERY_DEPENDENCY: 800,\n} as const;\n\nexport type QueryRuntimeErrorCode = (typeof QueryRuntimeErrorCode)[keyof typeof QueryRuntimeErrorCode];\n\nexport const queryFeatureUsedMultipleTimes = (type: QueryFeatureType) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_FEATURE_USED_MULTIPLE_TIMES,\n `The query feature \"${type}()\" was used multiple times.`,\n );\n};\n\nexport const withArgsQueryFeatureMissingButRouteIsFunction = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION,\n `This queries route is a function, but a \"withArgs()\" feature is missing.`,\n );\n};\n\nexport const withPollingUsedOnUnsupportedHttpMethod = (method: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD,\n `This is a \"${method}\" request, \"withPolling()\" is only supported for GET, HEAD, OPTIONS requests and GQL queries.`,\n );\n};\n\nexport const withAutoRefreshUsedOnUnsupportedHttpMethod = (method: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.WITH_AUTO_REFRESH_USED_ON_UNSUPPORTED_HTTP_METHOD,\n `This is a \"${method}\" request, \"withAutoRefresh()\" is only supported for GET, HEAD, OPTIONS requests and GQL queries.`,\n );\n};\n\nexport const withAutoRefreshUsedInManualQuery = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.WITH_AUTO_REFRESH_USED_IN_MANUAL_QUERY,\n `\"withAutoRefresh()\" has been used inside a query that has \"onlyManualExecution\" set to true.` +\n ` If this is intentional, set \"ignoreOnlyManualExecution\" to true inside the auto refresh config.`,\n );\n};\n\nexport const silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.SILENCE_MISSING_WITH_ARGS_FEATURE_ERROR_USED_BUT_WITH_ARGS_PRESENT,\n `The \"silenceMissingWithArgsFeatureError\" config is set to true, but a \"withArgs()\" feature is present.`,\n );\n};\n\nexport const authExtractTokensResponseNotObject = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.AUTH_EXTRACT_TOKENS_RESPONSE_NOT_OBJECT,\n `The auth token extractor expects the response to be an object.`,\n );\n};\n\nexport const authExtractTokensResponseMissingAccessToken = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_ACCESS_TOKEN,\n `The auth token extractor expects the response to contain a string \"accessToken\" property.`,\n );\n};\n\nexport const authExtractTokensResponseMissingRefreshToken = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_REFRESH_TOKEN,\n `The auth token extractor expects the response to contain a string \"refreshToken\" property.`,\n );\n};\n\nexport const authProviderFeatureUsedMultipleTimes = (type: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.AUTH_PROVIDER_FEATURE_USED_MULTIPLE_TIMES,\n `Bearer auth feature \"${type}\" was used multiple times.`,\n );\n};\n\nexport const uncacheableRequestHasCacheKeyParam = (key: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.UNCACHEABLE_REQUEST_HAS_CACHE_KEY_PARAM,\n `This request is uncacheable, but a cache key was provided: ${key}. Please remove it.`,\n );\n};\n\nexport const uncacheableRequestHasAllowCacheParam = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.UNCACHEABLE_REQUEST_HAS_ALLOW_CACHE_PARAM,\n `This request is uncacheable, but allowCache is set to true. Please remove it.`,\n );\n};\n\nexport const pagedQueryStackPageBiggerThanTotalPages = (page: number, totalPages: number) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.PAGED_QUERY_STACK_PAGE_BIGGER_THAN_TOTAL_PAGES,\n `The page \"${page}\" is bigger than the total pages \"${totalPages}\".`,\n );\n};\n\nexport const pagedQueryStackNextPageCalledWithoutPreviousPage = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.PAGED_QUERY_STACK_NEXT_PAGE_CALLED_WITHOUT_PREVIOUS_PAGE,\n `fetchNextPage() has been called but the current page is not yet loaded. Please call it after the previous page has been loaded.`,\n );\n};\n\nexport const pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.PAGED_QUERY_STACK_PREVIOUS_PAGE_CALLED_BUT_ALREADY_AT_FIRST_PAGE,\n `fetchPreviousPage() has been called but the current page is already the first page.`,\n );\n};\n\nexport const queryStackWithArgsUsed = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_STACK_WITH_ARGS_USED,\n `withArgs() has been used in a query stack or a paged query stack. This is not supported.`,\n );\n};\n\nexport const queryStackWithResponseUpdateUsed = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_STACK_WITH_RESPONSE_UPDATE_USED,\n `withResponseUpdate() has been used in a query stack or a paged query stack. This is not supported.`,\n );\n};\n\nexport const queryStackTotalQueriesAndExpectedQueriesMismatch = (totalQueries: number, expectedQueries: number) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_STACK_TOTAL_QUERIES_AND_EXPECTED_QUERIES_MISMATCH,\n `The total queries \"${totalQueries}\" and the expected queries \"${expectedQueries}\" do not match. This usually happens if a query depends on the response of the previous query to calculate its pagination values. Set blockExecutionDuringLoading to true to prevent this.`,\n );\n};\n\nexport const gqlDataPropertyMissingInResponse = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.GQL_DATA_PROPERTY_MISSING_IN_RESPONSE,\n `The GraphQL response is missing the required \"data\" property. Please add a custom transformResponse param to the query creator to handle this response format.`,\n );\n};\n\nexport const tokensNotAvailableInsideAuthAndExec = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.TOKENS_NOT_AVAILABLE_INSIDE_AUTH_AND_EXEC,\n `Tokens are not available inside authAndExec.`,\n );\n};\n\nexport const invalidStateInsideSecureExecuteFactory = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.INVALID_STATE_INSIDE_SECURE_EXECUTE_FACTORY,\n `An invalid state occurred inside the secure execute factory.`,\n );\n};\n\nexport const circularQueryDependency = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.CIRCULAR_QUERY_DEPENDENCY,\n `Query was executed more than 5 times in less than 100ms. This is usually a sign of a circular dependency.`,\n );\n};\n","import { computed, CreateEffectOptions, effect, Signal, untracked } from '@angular/core';\nimport { getActiveConsumer, setActiveConsumer } from '@angular/core/primitives/signals';\nimport { RequestHttpEvent } from './http-request';\nimport { QueryArgs, RequestArgs, ResponseType } from './query';\nimport { QueryDependencies } from './query-dependencies';\nimport { QueryErrorResponse } from './query-error-response';\nimport {\n withAutoRefreshUsedInManualQuery,\n withAutoRefreshUsedOnUnsupportedHttpMethod,\n withPollingUsedOnUnsupportedHttpMethod,\n} from './query-errors';\nimport { InternalQueryExecute } from './query-execute';\nimport { QueryState } from './query-state';\n\n/**\n * Returning this inside a withArgs feature will reset the query args to null.\n * This will also pause polling and auto refresh until new args are set.\n */\nexport const CLEAR_QUERY_ARGS = Symbol('CLEAR_QUERY_ARGS');\nexport type ClearQueryArgs = typeof CLEAR_QUERY_ARGS;\n\n/** A angular effect that can be nested inside another effect */\nexport const nestedEffect = (fn: () => void, options?: CreateEffectOptions) => {\n const activeConsumer = getActiveConsumer();\n\n setActiveConsumer(null);\n\n const eff = effect(() => {\n fn();\n }, options);\n\n setActiveConsumer(activeConsumer);\n\n return eff;\n};\n\nexport type QueryFeatureFlags = {\n hasWithArgsFeature: boolean;\n shouldAutoExecuteMethod: boolean;\n shouldAutoExecute: boolean;\n hasRouteFunction: boolean;\n onlyManualExecution?: boolean;\n\n /** Human readable method name */\n method: string;\n};\n\nexport const QueryFeatureType = {\n WITH_ARGS: 'WITH_ARGS',\n WITH_LOGGING: 'WITH_LOGGING',\n WITH_ERROR_HANDLING: 'WITH_ERROR_HANDLING',\n WITH_SUCCESS_HANDLING: 'WITH_SUCCESS_HANDLING',\n WITH_POLLING: 'WITH_POLLING',\n WITH_AUTO_REFRESH: 'WITH_AUTO_REFRESH',\n WITH_RESPONSE_UPDATE: 'WITH_RESPONSE_UPDATE',\n} as const;\nexport type QueryFeatureType = (typeof QueryFeatureType)[keyof typeof QueryFeatureType];\n\nexport type QueryFeatureContext<TArgs extends QueryArgs> = {\n state: QueryState<TArgs>;\n execute: InternalQueryExecute<TArgs>;\n deps: QueryDependencies;\n flags: QueryFeatureFlags;\n};\n\nexport type QueryFeatureFn<TArgs extends QueryArgs> = (context: QueryFeatureContext<TArgs>) => void;\n\nexport type QueryFeature<TArgs extends QueryArgs> = {\n type: QueryFeatureType;\n fn: (context: QueryFeatureContext<TArgs>) => void;\n};\n\nexport const createQueryFeature = <TArgs extends QueryArgs>(config: {\n type: QueryFeatureType;\n fn: QueryFeatureFn<TArgs>;\n}) => {\n return config as QueryFeature<TArgs>;\n};\n\n/**\n * A query feature that allows you to set the arguments of the query.\n * The arguments are read within a computed function, so you can use reactive values.\n *\n * To set the arguments to `null`, return the symbol `CLEAR_QUERY_ARGS`.\n * If you instead return `null`, the arguments won't change.\n *\n * Changing arguments will automatically trigger a new execution of the query if it is eligible for auto execution (e.g. a GET request).\n */\nexport const withArgs = <TArgs extends QueryArgs>(args: () => NoInfer<RequestArgs<TArgs>> | ClearQueryArgs | null) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_ARGS,\n fn: (context) => {\n const currArgs = computed(() => args());\n\n nestedEffect(\n () => {\n const currArgsNow = currArgs();\n\n if (currArgsNow === null) return;\n\n untracked(() => {\n if (currArgsNow === CLEAR_QUERY_ARGS) {\n context.state.args.set(null);\n return;\n }\n\n context.state.args.set(currArgsNow);\n\n if (context.flags.shouldAutoExecute) context.execute({ args: currArgsNow });\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n\nexport type WithPollingFeatureOptions = {\n /** The interval in milliseconds at which the query should be executed */\n interval: number;\n\n /**\n * Whether the query should be executed initially.\n * By default, the query will be executed after the first interval.\n * @default false\n */\n executeInitially?: boolean;\n};\n\n/**\n * A query feature that will automatically execute the query at a given interval.\n * The interval will be cleared when the query is destroyed.\n * The interval will be reset when the arguments of the query change.\n *\n * @throws If the query is not eligible for auto execution (e.g. a POST request)\n */\nexport const withPolling = <TArgs extends QueryArgs>(options: WithPollingFeatureOptions) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_POLLING,\n fn: (context) => {\n if (!context.flags.shouldAutoExecuteMethod) {\n throw withPollingUsedOnUnsupportedHttpMethod(context.flags.method);\n }\n\n let intervalId: number | null = null;\n\n nestedEffect(\n () => {\n const args = context.state.args();\n\n untracked(() => {\n if (intervalId !== null) clearInterval(intervalId);\n\n // Don't start polling if the query doesn't have args.\n // It should have args because a withArgs feature is present.\n if (args === null && context.flags.hasWithArgsFeature) return;\n\n if (options.executeInitially) {\n context.execute({ args });\n }\n\n intervalId = window.setInterval(() => {\n context.execute({ args });\n }, options.interval);\n });\n },\n { injector: context.deps.injector },\n );\n\n context.deps.destroyRef.onDestroy(() => intervalId !== null && clearInterval(intervalId));\n },\n });\n};\n\nexport type WithLoggingFeatureOptions<TArgs extends QueryArgs> = {\n /** A function that will be called with the latest http event */\n logFn: (v: RequestHttpEvent<TArgs> | null) => void;\n};\n\n/** A query feature that can be used to log the latest http event */\nexport const withLogging = <TArgs extends QueryArgs>(options: WithLoggingFeatureOptions<TArgs>) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_LOGGING,\n fn: (context) => {\n nestedEffect(\n () => {\n const event = context.state.latestHttpEvent();\n\n if (event === null) return;\n\n untracked(() => {\n options.logFn(event);\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n\nexport type WithErrorHandlingFeatureOptions = {\n /** A function that will be called with the latest error */\n handler: (e: QueryErrorResponse) => void;\n};\n\n/** A query feature that can be used to handle errors */\nexport const withErrorHandling = <TArgs extends QueryArgs>(options: WithErrorHandlingFeatureOptions) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_ERROR_HANDLING,\n fn: (context) => {\n nestedEffect(\n () => {\n const error = context.state.error();\n\n if (error === null) return;\n\n untracked(() => {\n options.handler(error);\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n\nexport type WithSuccessHandlingFeatureOptions<TArgs extends QueryArgs> = {\n /** A function that will be called with the latest response */\n handler: (data: NonNullable<ResponseType<TArgs>>) => void;\n};\n\n/** A query feature that can be used to handle successful responses */\nexport const withSuccessHandling = <TArgs extends QueryArgs>(options: WithSuccessHandlingFeatureOptions<TArgs>) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_SUCCESS_HANDLING,\n fn: (context) => {\n nestedEffect(\n () => {\n const response = context.state.response();\n\n if (response === null) return;\n\n untracked(() => {\n options.handler(response as NonNullable<ResponseType<TArgs>>);\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n\nexport type WithAutoRefreshFeatureOptions = {\n /** The signals that should trigger a refresh of the query */\n onSignalChanges: Signal<unknown>[];\n\n /** Whether to ignore the `onlyManualExecution` query config flag */\n ignoreOnlyManualExecution?: boolean;\n};\n\n/**\n * A query feature that will automatically execute the query when any of the provided signals change\n * @throws If the query is not eligible for auto execution (e.g. a POST request)\n * @throws If the query has the `onlyManualExecution` query config flag set and `ignoreOnlyManualExecution` is not set\n */\nexport const withAutoRefresh = <TArgs extends QueryArgs>(options: WithAutoRefreshFeatureOptions) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_AUTO_REFRESH,\n fn: (context) => {\n if (!context.flags.shouldAutoExecuteMethod) {\n throw withAutoRefreshUsedOnUnsupportedHttpMethod(context.flags.method);\n }\n\n if (context.flags.onlyManualExecution && !options.ignoreOnlyManualExecution) {\n throw withAutoRefreshUsedInManualQuery();\n }\n\n nestedEffect(\n () => {\n for (const signal of options.onSignalChanges) {\n signal();\n }\n\n untracked(() => {\n const args = context.state.args();\n\n // Don't start polling if the query doesn't have args.\n // It should have args because a withArgs feature is present.\n if (args === null && context.flags.hasWithArgsFeature) return;\n\n context.execute({ args });\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n\nexport type WithResponseUpdateFeatureFnData<TArgs extends QueryArgs> = {\n /** The current response of the query */\n currentResponse: ResponseType<TArgs> | null;\n};\n\nexport type WithResponseUpdateFeatureOptions<TArgs extends QueryArgs> = {\n /**\n * A function that will be called with the latest response\n * If the function returns `null`, the response will not be updated.\n * Otherwise, the response will be updated with the returned value.\n * The function will be called in a reactive signal context.\n * If the query get's executed after the response was updated, the response will be set the the fresh data received from the server.\n *\n * This feature is most useful in combination with web sockets where the data received from the socket might be more up-to-date than the data received previously.\n *\n * @example\n * const matchEvents = mySocket.joinRoom('match-events');\n *\n * const myMatchQuery = getMatch(\n * withArgs(() => ({ matchId: 1 })),\n * withResponseUpdate(({ currentResponse }) => {\n * const matchEvent = matchEvents();\n *\n * if (!matchEvent) return null;\n *\n * // Do some checks here. This is just a very simple example.\n * // To apply partial updates, you can use the spread operator in combination with the current response.\n *\n * return matchEvent;\n * })\n * )\n */\n updater: (data: WithResponseUpdateFeatureFnData<TArgs>) => ResponseType<TArgs> | null;\n};\n\nexport const withResponseUpdate = <TArgs extends QueryArgs>(options: WithResponseUpdateFeatureOptions<TArgs>) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_RESPONSE_UPDATE,\n fn: (context) => {\n nestedEffect(\n () => {\n const currentResponse = untracked(() => context.state.response());\n const response = options.updater({ currentResponse });\n\n if (response === null) return;\n\n untracked(() => {\n context.state.rawResponse.set(response);\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n","import { Signal, WritableSignal, computed, linkedSignal, signal } from '@angular/core';\nimport { HttpRequest, HttpRequestLoadingState, RequestHttpEvent } from './http-request';\nimport { QueryArgs, RawResponseType, RequestArgs, ResponseType } from './query';\nimport { QueryErrorResponse } from './query-error-response';\n\nexport type SetupQueryStateOptions<TArgs extends QueryArgs> = {\n transformResponse?: (rawResponse: RawResponseType<TArgs>) => ResponseType<TArgs>;\n};\n\nexport type QueryStateSubtle<TArgs extends QueryArgs> = {\n request: WritableSignal<HttpRequest<TArgs> | null>;\n rawResponse: WritableSignal<RawResponseType<TArgs> | null>;\n};\n\nexport type QueryState<TArgs extends QueryArgs> = {\n rawResponse: WritableSignal<RawResponseType<TArgs> | null>;\n response: Signal<ResponseType<TArgs> | null>;\n args: WritableSignal<RequestArgs<TArgs> | null>;\n latestHttpEvent: WritableSignal<RequestHttpEvent<TArgs> | null>;\n loading: WritableSignal<HttpRequestLoadingState | null>;\n error: WritableSignal<QueryErrorResponse | null>;\n lastTimeExecutedAt: WritableSignal<number | null>;\n lastTriggeredBy: WritableSignal<string | null>;\n executionState: Signal<QueryExecutionState<TArgs> | null>;\n subtle: QueryStateSubtle<TArgs>;\n};\n\nexport type QueryExecutionStateSuccess<TArgs extends QueryArgs> = {\n type: 'success';\n response: ResponseType<TArgs>;\n};\n\nexport type QueryExecutionStateFailure = {\n type: 'failure';\n error: QueryErrorResponse;\n};\n\nexport type QueryExecutionStateLoadingWithNoResponse = {\n type: 'loading';\n hasCachedResponse: false;\n loading: HttpRequestLoadingState;\n};\n\nexport type QueryExecutionStateLoadingWithCachedResponse<TArgs extends QueryArgs> = {\n type: 'loading';\n hasCachedResponse: true;\n loading: HttpRequestLoadingState;\n cachedResponse: ResponseType<TArgs>;\n};\n\nexport type QueryExecutionStateLoading<TArgs extends QueryArgs> =\n | QueryExecutionStateLoadingWithNoResponse\n | QueryExecutionStateLoadingWithCachedResponse<TArgs>;\n\nexport type QueryExecutionState<TArgs extends QueryArgs> =\n | QueryExecutionStateSuccess<TArgs>\n | QueryExecutionStateFailure\n | QueryExecutionStateLoading<TArgs>;\n\nexport const setupQueryState = <TArgs extends QueryArgs>(options: SetupQueryStateOptions<TArgs>) => {\n const request = signal<HttpRequest<TArgs> | null>(null);\n\n const rawResponse = linkedSignal(() => request()?.response() ?? null);\n const response = computed(() => {\n const raw = rawResponse();\n if (raw === null) return null;\n return options.transformResponse ? options.transformResponse(raw) : (raw as ResponseType<TArgs>);\n });\n const loading = linkedSignal(() => request()?.loading() ?? null);\n const error = linkedSignal(() => request()?.error() ?? null);\n const latestHttpEvent = linkedSignal(() => request()?.currentEvent() ?? null);\n\n const args = signal<RequestArgs<TArgs> | null>(null);\n const lastTimeExecutedAt = signal<number | null>(null);\n const lastTriggeredBy = signal<string | null>(null);\n\n const executionState = computed<QueryExecutionState<TArgs> | null>(() => {\n const currentResponse = response();\n const currentError = error();\n const currentLoading = loading();\n\n if (currentLoading) {\n if (currentResponse) {\n return {\n type: 'loading',\n hasCachedResponse: true,\n loading: currentLoading,\n cachedResponse: currentResponse,\n };\n }\n\n return {\n type: 'loading',\n hasCachedResponse: false,\n loading: currentLoading,\n };\n } else if (currentError) {\n return {\n type: 'failure',\n error: currentError,\n };\n } else if (currentResponse) {\n return {\n type: 'success',\n response: currentResponse,\n };\n } else {\n return null;\n }\n });\n\n const state: QueryState<TArgs> = {\n rawResponse,\n response,\n args,\n latestHttpEvent,\n loading,\n error,\n lastTimeExecutedAt,\n lastTriggeredBy,\n executionState,\n subtle: {\n request,\n rawResponse,\n },\n };\n\n return state;\n};\n","import { effect, signal, untracked } from '@angular/core';\nimport { wrapAsObservableSignal } from './observable-signal';\nimport { QueryArgs, QuerySnapshot } from './query';\nimport { injectQueryContext } from './query-context';\nimport { QueryDependencies } from './query-dependencies';\nimport { InternalQueryExecute } from './query-execute';\nimport { QueryState, setupQueryState } from './query-state';\n\nexport type CreateQuerySnapshotOptions<TArgs extends QueryArgs> = {\n state: QueryState<TArgs>;\n execute: InternalQueryExecute<TArgs>;\n deps: QueryDependencies;\n};\n\nexport const createQuerySnapshotFn = <TArgs extends QueryArgs>(options: CreateQuerySnapshotOptions<TArgs>) => {\n const { state } = options;\n const context = injectQueryContext();\n\n const snapshotFn = () => {\n const snapshotState = setupQueryState<TArgs>({});\n const isAlive = signal(true);\n\n const killEffectRef = effect(\n () => {\n const currentLoading = state.loading();\n const currentError = state.error();\n const currentResponse = state.response();\n const currentArgs = state.args();\n const currentLatestHttpEvent = state.latestHttpEvent();\n const currentLastTimeExecutedAt = state.lastTimeExecutedAt();\n const currentLastTriggeredBy = state.lastTriggeredBy();\n\n untracked(() => {\n snapshotState.args.set(currentArgs);\n snapshotState.error.set(currentError);\n snapshotState.lastTimeExecutedAt.set(currentLastTimeExecutedAt);\n snapshotState.lastTriggeredBy.set(currentLastTriggeredBy);\n snapshotState.latestHttpEvent.set(currentLatestHttpEvent);\n snapshotState.loading.set(currentLoading);\n snapshotState.rawResponse.set(currentResponse);\n\n if (currentLoading) return;\n\n if (!currentResponse && !currentError) return;\n\n // kill the effect once loading is done and we either have a response or an error\n killEffectRef.destroy();\n isAlive.set(false);\n });\n },\n { injector: context.deps.injector },\n );\n\n const snapshot: QuerySnapshot<TArgs> = {\n args: wrapAsObservableSignal(snapshotState.args.asReadonly(), context.deps.injector),\n response: wrapAsObservableSignal(snapshotState.response, context.deps.injector),\n latestHttpEvent: wrapAsObservableSignal(snapshotState.latestHttpEvent.asReadonly(), context.deps.injector),\n loading: wrapAsObservableSignal(snapshotState.loading.asReadonly(), context.deps.injector),\n error: wrapAsObservableSignal(snapshotState.error.asReadonly(), context.deps.injector),\n lastTimeExecutedAt: wrapAsObservableSignal(snapshotState.lastTimeExecutedAt.asReadonly(), context.deps.injector),\n triggeredBy: wrapAsObservableSignal(snapshotState.lastTriggeredBy.asReadonly(), context.deps.injector),\n isAlive: wrapAsObservableSignal(isAlive.asReadonly(), context.deps.injector),\n id: wrapAsObservableSignal(options.execute.currentRepositoryKey, context.deps.injector),\n executionState: wrapAsObservableSignal(snapshotState.executionState, context.deps.injector),\n };\n\n return snapshot;\n };\n\n return snapshotFn;\n};\n","import { runInInjectionContext } from '@angular/core';\nimport { CreateGqlQueryOptions, isCreateGqlQueryOptions } from '../gql/gql-query';\nimport { AnyCreateGqlQueryCreatorOptions, GqlQueryMethod } from '../gql/gql-query-creator';\nimport { wrapAsObservableSignal } from './observable-signal';\nimport { CreateQueryOptions, Query, QueryArgs, RawResponseType, ReadonlyQuery, ResponseType } from './query';\nimport { AnyCreateQueryClientResult } from './query-client';\nimport {\n CreateQueryCreatorOptions,\n InternalCreateQueryCreatorOptions,\n QueryConfig,\n QueryMethod,\n} from './query-creator';\nimport { QueryDependencies, setupQueryDependencies } from './query-dependencies';\nimport {\n queryFeatureUsedMultipleTimes,\n silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent,\n withArgsQueryFeatureMissingButRouteIsFunction,\n} from './query-errors';\nimport { InternalQueryExecute } from './query-execute';\nimport { QueryFeature, QueryFeatureContext, QueryFeatureFlags, QueryFeatureType } from './query-features';\nimport { createQuerySnapshotFn } from './query-snapshot';\nimport { QueryState, setupQueryState } from './query-state';\n\nexport const shouldAutoExecuteQuery = (method: QueryMethod) => {\n return method === 'GET' || method === 'HEAD' || method === 'OPTIONS';\n};\n\nexport const shouldAutoExecuteGqlQuery = (method: GqlQueryMethod) => {\n return method === 'QUERY';\n};\n\nexport const getQueryFeatureUsage = <TArgs extends QueryArgs>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: CreateQueryOptions<TArgs> | CreateGqlQueryOptions<any>,\n) => {\n const { creator, features, queryConfig, creatorInternals } = options;\n\n const hasWithArgsFeature = features.some((f) => f.type == QueryFeatureType.WITH_ARGS);\n const shouldAutoExecuteMethod = isCreateGqlQueryOptions(options)\n ? shouldAutoExecuteGqlQuery(options.creatorInternals.method)\n : shouldAutoExecuteQuery(options.creatorInternals.method);\n const hasRouteFunction =\n typeof (creatorInternals as InternalCreateQueryCreatorOptions<TArgs>)?.route === 'function' ||\n typeof (creator as AnyCreateGqlQueryCreatorOptions)?.route === 'function';\n const shouldAutoExecute = shouldAutoExecuteMethod && !queryConfig.onlyManualExecution;\n\n if (hasRouteFunction && !hasWithArgsFeature && !queryConfig.silenceMissingWithArgsFeatureError) {\n throw withArgsQueryFeatureMissingButRouteIsFunction();\n }\n\n if (hasWithArgsFeature && queryConfig.silenceMissingWithArgsFeatureError) {\n throw silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent();\n }\n\n const featureFnContext: QueryFeatureFlags = {\n hasWithArgsFeature,\n shouldAutoExecuteMethod,\n shouldAutoExecute,\n hasRouteFunction,\n onlyManualExecution: queryConfig.onlyManualExecution,\n method: isCreateGqlQueryOptions(options)\n ? `GQL ${options.creatorInternals.method}`\n : options.creatorInternals.method,\n };\n\n return featureFnContext;\n};\n\nexport const applyQueryFeatures = <TArgs extends QueryArgs>(\n features: QueryFeature<TArgs>[],\n context: QueryFeatureContext<TArgs>,\n) => {\n const featureTypes = new Set<QueryFeatureType>();\n\n for (const feature of features) {\n if (featureTypes.has(feature.type)) {\n throw queryFeatureUsedMultipleTimes(feature.type);\n }\n\n featureTypes.add(feature.type);\n feature.fn(context);\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const maybeExecute = (options: { flags: QueryFeatureFlags; execute: InternalQueryExecute<any> }) => {\n if (options.flags.shouldAutoExecute && !options.flags.hasRouteFunction && !options.flags.hasWithArgsFeature) {\n options.execute();\n }\n};\n\nexport type CreateQueryObjectOptions<TArgs extends QueryArgs> = {\n state: QueryState<TArgs>;\n deps: QueryDependencies;\n execute: InternalQueryExecute<TArgs>;\n};\n\nexport const createQueryObject = <TArgs extends QueryArgs>(options: CreateQueryObjectOptions<TArgs>) => {\n const { state, execute, deps } = options;\n\n const destroy = () => deps.injector.destroy();\n const setResponse = (response: ResponseType<TArgs>) => state.rawResponse.set(response as RawResponseType<TArgs>);\n const createSnapshot = createQuerySnapshotFn({ state, execute, deps });\n\n // Pre-wrap all public signals once so both `query` and `roQuery` share the same instances.\n const wrappedArgs = wrapAsObservableSignal(state.args.asReadonly(), deps.injector);\n const wrappedResponse = wrapAsObservableSignal(state.response, deps.injector);\n const wrappedLatestHttpEvent = wrapAsObservableSignal(state.latestHttpEvent.asReadonly(), deps.injector);\n const wrappedLoading = wrapAsObservableSignal(state.loading.asReadonly(), deps.injector);\n const wrappedError = wrapAsObservableSignal(state.error.asReadonly(), deps.injector);\n const wrappedLastTimeExecutedAt = wrapAsObservableSignal(state.lastTimeExecutedAt.asReadonly(), deps.injector);\n const wrappedTriggeredBy = wrapAsObservableSignal(state.lastTriggeredBy.asReadonly(), deps.injector);\n const wrappedId = wrapAsObservableSignal(execute.currentRepositoryKey, deps.injector);\n const wrappedExecutionState = wrapAsObservableSignal(state.executionState, deps.injector);\n const wrappedRequest = wrapAsObservableSignal(state.subtle.request.asReadonly(), deps.injector);\n\n const asReadonly = () => {\n const roQuery: ReadonlyQuery<TArgs> = {\n args: wrappedArgs,\n response: wrappedResponse,\n latestHttpEvent: wrappedLatestHttpEvent,\n loading: wrappedLoading,\n error: wrappedError,\n lastTimeExecutedAt: wrappedLastTimeExecutedAt,\n triggeredBy: wrappedTriggeredBy,\n id: wrappedId,\n createSnapshot,\n executionState: wrappedExecutionState,\n };\n\n return roQuery;\n };\n\n const query: Query<TArgs> = {\n execute,\n args: wrappedArgs,\n response: wrappedResponse,\n latestHttpEvent: wrappedLatestHttpEvent,\n loading: wrappedLoading,\n error: wrappedError,\n lastTimeExecutedAt: wrappedLastTimeExecutedAt,\n triggeredBy: wrappedTriggeredBy,\n id: wrappedId,\n createSnapshot,\n reset: execute.reset,\n asReadonly,\n executionState: wrappedExecutionState,\n subtle: {\n destroy,\n setResponse,\n request: wrappedRequest,\n destroyRef: deps.scopeDestroyRef,\n injector: deps.injector,\n },\n };\n\n return query;\n};\n\nexport type ExecuteFactory<TArgs extends QueryArgs, TInternals> = (options: {\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n creator?: CreateQueryCreatorOptions;\n creatorInternals: TInternals;\n queryConfig: QueryConfig;\n}) => InternalQueryExecute<TArgs>;\n\nexport type CreateBaseQueryOptions<TArgs extends QueryArgs, TInternals> = {\n creator?: CreateQueryCreatorOptions;\n creatorInternals: TInternals;\n features: QueryFeature<TArgs>[];\n queryConfig: QueryConfig;\n executeFactory: ExecuteFactory<TArgs, TInternals>;\n};\n\nexport const createBaseQuery = <TArgs extends QueryArgs, TInternals extends { client: AnyCreateQueryClientResult }>(\n options: CreateBaseQueryOptions<TArgs, TInternals>,\n) => {\n const client = options.creatorInternals.client;\n\n const deps = setupQueryDependencies({\n client,\n queryConfig: options.queryConfig,\n });\n\n return runInInjectionContext(deps.injector, () => {\n const state = setupQueryState<TArgs>({\n transformResponse: options.creator?.transformResponse,\n });\n const flags = getQueryFeatureUsage(options as unknown as Parameters<typeof getQueryFeatureUsage>[0]);\n\n const execute = options.executeFactory({\n deps,\n state,\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n queryConfig: options.queryConfig,\n });\n\n const featureFnContext: QueryFeatureContext<TArgs> = {\n state,\n execute,\n flags,\n deps,\n };\n\n applyQueryFeatures(options.features, featureFnContext);\n\n maybeExecute({ execute, flags });\n\n return createQueryObject({ state, execute, deps });\n });\n};\n","import { signal, WritableSignal } from '@angular/core';\nimport { QueryArgs, RequestArgs } from './query';\nimport { circularQueryDependency } from './query-errors';\nimport { CreateQueryExecuteOptions } from './query-execute';\n\nexport type ResetExecuteStateOptions<TArgs extends QueryArgs> = {\n executeOptions: Pick<CreateQueryExecuteOptions<TArgs>, 'state' | 'deps'>;\n executeState: QueryExecuteState;\n};\n\nexport const resetExecuteState = <TArgs extends QueryArgs>(options: ResetExecuteStateOptions<TArgs>) => {\n const { executeState, executeOptions: opts } = options;\n const { state } = opts;\n\n opts.deps.client.repository.unbind(executeState.previousKey(), opts.deps.destroyRef);\n\n state.args.set(null);\n state.error.set(null);\n state.latestHttpEvent.set(null);\n state.loading.set(null);\n state.rawResponse.set(null);\n state.lastTimeExecutedAt.set(null);\n state.lastTriggeredBy.set(null);\n};\n\nexport type QueryExecuteState = {\n previousKey: WritableSignal<string | null>;\n};\n\nexport const setupQueryExecuteState = (): QueryExecuteState => {\n return {\n previousKey: signal(null),\n };\n};\n\nexport type RunQueryExecuteOptions = {\n allowCache?: boolean;\n triggeredBy?: string;\n};\n\nexport type QueryExecuteOptions<TArgs extends QueryArgs> = {\n executeOptions: CreateQueryExecuteOptions<TArgs>;\n executeState: QueryExecuteState;\n\n args: RequestArgs<TArgs> | null;\n options?: RunQueryExecuteOptions;\n\n isSecure?: boolean;\n};\n\nexport const queryExecute = <TArgs extends QueryArgs>(options: QueryExecuteOptions<TArgs>) => {\n const { executeOptions, args, executeState, options: runQueryOptions, isSecure } = options;\n const { deps, state, creator, creatorInternals, queryConfig } = executeOptions;\n\n const { key, request } = deps.client.repository.request({\n route: creatorInternals.route,\n method: creatorInternals.method,\n args,\n creatorOptions: creator,\n retryFn: creator?.retryFn,\n consumerDestroyRef: deps.destroyRef,\n key: queryConfig.key,\n previousKey: executeState.previousKey(),\n runQueryOptions,\n isSecure,\n });\n\n executeState.previousKey.set(key);\n state.lastTimeExecutedAt.set(Date.now());\n state.lastTriggeredBy.set(runQueryOptions?.triggeredBy ?? null);\n state.subtle.request.set(request);\n};\n\nexport const circularQueryDependencyChecker = () => {\n let lastTriggerTs = 0;\n let illegalWrites = 0;\n\n // Typing this as number will throw an type error during testing since it is of type Timeout in a node env.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let timeout: any = null;\n\n const check = () => {\n const now = performance.now();\n\n if (now - lastTriggerTs < 100) {\n illegalWrites++;\n\n if (illegalWrites > 5) {\n throw circularQueryDependency();\n }\n }\n\n lastTriggerTs = now;\n\n if (timeout) clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n illegalWrites = 0;\n }, 100);\n };\n\n return {\n check,\n };\n};\n","import { Signal } from '@angular/core';\nimport { QueryArgs, RequestArgs } from './query';\nimport { CreateQueryCreatorOptions, InternalCreateQueryCreatorOptions, QueryConfig } from './query-creator';\nimport { QueryDependencies } from './query-dependencies';\nimport {\n circularQueryDependencyChecker,\n queryExecute,\n resetExecuteState,\n RunQueryExecuteOptions,\n setupQueryExecuteState,\n} from './query-execute-utils';\nimport { QueryKey } from './query-repository';\nimport { QueryState } from './query-state';\n\nexport type CreateQueryExecuteOptions<TArgs extends QueryArgs> = {\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n creator?: CreateQueryCreatorOptions;\n creatorInternals: InternalCreateQueryCreatorOptions<TArgs>;\n queryConfig: QueryConfig;\n};\n\nexport type QueryExecuteArgs<TArgs extends QueryArgs> = {\n args?: RequestArgs<TArgs> | null;\n options?: RunQueryExecuteOptions;\n};\n\nexport type InternalQueryExecute<TArgs extends QueryArgs> = {\n (executeArgs?: QueryExecuteArgs<TArgs>): void;\n reset: () => void;\n currentRepositoryKey: Signal<QueryKey | null>;\n};\n\nexport type QueryExecute<TArgs extends QueryArgs> = (executeArgs?: QueryExecuteArgs<TArgs>) => void;\n\nexport const createExecuteFn = <TArgs extends QueryArgs>(\n executeOptions: CreateQueryExecuteOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const executeState = setupQueryExecuteState();\n const circularChecker = circularQueryDependencyChecker();\n\n const reset = () => resetExecuteState({ executeState, executeOptions });\n\n const exec = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n circularChecker.check();\n\n // Make sure all effects are flushed before reading the args.\n // A withArgs feature effect might still be pending otherwise resulting in the wrong args being read.\n executeOptions.deps.effectScheduler.flush();\n\n const { args = executeOptions.state.args(), options } = executeArgs ?? {};\n\n queryExecute({ executeOptions, executeState, args, options });\n };\n\n exec['reset'] = reset;\n\n exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();\n\n return exec;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { HttpHeaders } from '@angular/common/http';\nimport { DestroyRef, Injector } from '@angular/core';\nimport { createBaseQuery } from './base-query-factory';\nimport { HttpRequest, HttpRequestLoadingState, RequestHttpEvent } from './http-request';\nimport { ObservableSignal } from './observable-signal';\nimport { CreateQueryCreatorOptions, InternalCreateQueryCreatorOptions, QueryConfig } from './query-creator';\nimport { QueryErrorResponse } from './query-error-response';\nimport { createExecuteFn, QueryExecute } from './query-execute';\nimport { QueryFeature } from './query-features';\nimport { QueryExecutionState } from './query-state';\n\nexport type QueryArgs = {\n response?: any;\n rawResponse?: any;\n pathParams?: Record<string, string | number>;\n queryParams?: any;\n body?: any;\n headers?: HttpHeaders | (() => HttpHeaders);\n};\n\nexport type ResponseType<T extends QueryArgs | null> = T extends QueryArgs ? T['response'] : never;\nexport type RawResponseType<T extends QueryArgs | null> = T extends QueryArgs\n ? T['rawResponse'] extends undefined\n ? T['response']\n : T['rawResponse']\n : never;\nexport type PathParamsType<T extends QueryArgs | null> = T extends QueryArgs ? T['pathParams'] : never;\nexport type QueryParamsType<T extends QueryArgs | null> = T extends QueryArgs ? T['queryParams'] : never;\nexport type BodyType<T extends QueryArgs | null> = T extends QueryArgs ? T['body'] : never;\n\nexport type RequestArgs<T extends QueryArgs | null> = T extends QueryArgs ? Omit<T, 'response'> : never;\n\nexport type CreateQueryOptions<TArgs extends QueryArgs> = {\n creator?: CreateQueryCreatorOptions;\n creatorInternals: InternalCreateQueryCreatorOptions<TArgs>;\n features: QueryFeature<TArgs>[];\n queryConfig: QueryConfig;\n};\n\nexport type QueryBase<TArgs extends QueryArgs> = {\n /** The arguments of the last execution of the query. Will be `null` if the query has never been executed */\n args: ObservableSignal<RequestArgs<TArgs> | null>;\n\n /**\n * The latest response of the query. Will be `null` if the query has never been executed.\n * Responses are cached until a new response is received.\n * If a response is present but the next execution of the query fails, the response will be set to `null` again.\n */\n response: ObservableSignal<ResponseType<TArgs> | null>;\n\n /** The latest Angular HTTP client native http event that occurred during the last execution of the query. Will be `null` if no event occurred. */\n latestHttpEvent: ObservableSignal<RequestHttpEvent<TArgs> | null>;\n\n /** The loading state of the query. Will be `null` if the query currently isn't loading. */\n loading: ObservableSignal<HttpRequestLoadingState | null>;\n\n /** The error that occurred during the last execution of the query. Will be `null` if no error occurred. */\n error: ObservableSignal<QueryErrorResponse | null>;\n\n /** The time the query was last executed at. Will be `null` if the query has never been executed. */\n lastTimeExecutedAt: ObservableSignal<number | null>;\n\n /** Who or what triggered the last execution. Will be `null` for user-triggered executions. */\n triggeredBy: ObservableSignal<string | null>;\n\n /** The id of the query */\n id: ObservableSignal<string | null>;\n\n /** The current state of the query. Will be `null` if the query has never been executed. */\n executionState: ObservableSignal<QueryExecutionState<TArgs> | null>;\n};\n\n/** A snapshot of a query state at a specific point in time */\nexport type QuerySnapshot<TArgs extends QueryArgs> = QueryBase<TArgs> & {\n /** This signal is `true` until the latest execution of the query has completed in any way (success, error, or cancellation) */\n isAlive: ObservableSignal<boolean>;\n};\n\nexport type AnyQuerySnapshot = QuerySnapshot<any>;\nexport type AnyNewQuery = Query<any>;\n\nexport type QuerySubtle<TArgs extends QueryArgs> = {\n /** Destroys the query and cleans up all resources. The query should not be used after this method is called. */\n destroy: () => void;\n\n /** Manually sets the response of the query. This will not trigger a new execution of the query. */\n setResponse: (response: ResponseType<TArgs>) => void;\n\n /** The currently underlying HTTP request of the query. Will be `null` if the query has never been executed. */\n request: ObservableSignal<HttpRequest<TArgs> | null>;\n\n /** The destroy reference used to clean up the query when it is no longer needed */\n destroyRef: DestroyRef;\n\n /** The Angular injector used to resolve dependencies for the query */\n injector: Injector;\n};\n\nexport type Query<TArgs extends QueryArgs> = QueryBase<TArgs> & {\n /** Executes the query */\n execute: QueryExecute<TArgs>;\n\n /** Creates an immutable snapshot of the current query state */\n createSnapshot: () => QuerySnapshot<TArgs>;\n\n /** Resets the query state to its initial state */\n reset: () => void;\n\n /** Returns a readonly version of the query */\n asReadonly: () => ReadonlyQuery<TArgs>;\n\n /** Advanced query features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */\n subtle: QuerySubtle<TArgs>;\n};\n\nexport type ReadonlyQuery<TArgs extends QueryArgs> = Omit<Query<TArgs>, 'execute' | 'subtle' | 'reset' | 'asReadonly'>;\n\nexport const createQuery = <TArgs extends QueryArgs>(options: CreateQueryOptions<TArgs>) =>\n createBaseQuery({\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n features: options.features,\n queryConfig: options.queryConfig,\n executeFactory: createExecuteFn,\n });\n","import { Injector } from '@angular/core';\nimport { createBaseQueryCreator } from './base-query-creator-factory';\nimport { HttpRequestResponseType, HttpRequestTransferCacheConfig } from './http-request';\nimport { AnyNewQuery, PathParamsType, Query, QueryArgs, RawResponseType, ResponseType, createQuery } from './query';\nimport { AnyCreateQueryClientResult } from './query-client';\nimport { QueryFeature } from './query-features';\nimport { ShouldRetryRequestFn } from './query-retry-utils';\n\nexport type RouteType<TArgs extends QueryArgs> =\n PathParamsType<TArgs> extends { [key: string]: unknown } ? (args: TArgs['pathParams']) => RouteString : RouteString;\n\nexport type RouteString = `/${string}`;\n\nexport type BaseQueryCreatorOptionsSubtle = {\n /**\n * If true, the request will be forced to be cached (saved inside the query repository).\n * Can be used to e.g. cache GQL queries transported via POST\n *\n * - `true` means the request will always be cached\n * - `false` means the request will never be cached\n * - `undefined` means the request will be cached if the method is GET, OPTIONS or HEAD\n */\n useQueryRepositoryCache?: boolean;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type BaseQueryCreatorOptions<TArgs extends QueryArgs = QueryArgs> = {\n /**\n * If true, the query loading state will include progress information.\n * This is useful for file uploads and downloads.\n *\n * **Warning**: Upload progress events are not supported by browsers when using the fetch API, such as with `provideHttpClient(withFetch())`.\n * In this case, you should use the older XHR implementation by omitting `withFetch()`. But take into account that XHR is not supported in server-side rendering environments.\n *\n * @see https://angular.dev/guide/http/making-requests#receiving-raw-progress-events\n *\n * @default false\n */\n reportProgress?: boolean;\n\n /**\n * The response type of the query.\n * @default 'json'\n */\n responseType?: HttpRequestResponseType;\n\n /**\n * Whether to include credentials (cookies) in the request or not.\n * @default false\n */\n withCredentials?: boolean;\n\n /**\n * This property accepts either a boolean to enable/disable transferring cache for eligible\n * requests performed using `HttpClient`, or an object, which allows to configure cache\n * parameters, such as which headers should be included (no headers are included by default).\n *\n * Setting this property will override the options passed to `provideClientHydration()` for this\n * particular request\n */\n transferCache?: HttpRequestTransferCacheConfig;\n\n /**\n * Custom retry function for this specific query creator.\n * If provided, overrides the retry function configured at the client level.\n *\n * @default Client's retryFn or shouldRetryRequest()\n */\n retryFn?: ShouldRetryRequestFn;\n\n /** Advanced query creator features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */\n subtle?: BaseQueryCreatorOptionsSubtle;\n};\n\ntype HasKey<T, K extends PropertyKey> = K extends keyof T\n ? undefined extends T[K]\n ? K extends keyof Required<T>\n ? true\n : false\n : true\n : false;\n\n/**\n * Determines if rawResponse type differs from response type.\n * Returns true if rawResponse is explicitly defined and differs from response.\n */\nexport type RequiresTransform<TArgs extends QueryArgs> =\n HasKey<TArgs, 'rawResponse'> extends false\n ? false\n : RawResponseType<TArgs> extends ResponseType<TArgs>\n ? ResponseType<TArgs> extends RawResponseType<TArgs>\n ? false\n : true\n : true;\n\nexport type CreateQueryCreatorOptions<TArgs extends QueryArgs = QueryArgs> = BaseQueryCreatorOptions<TArgs> &\n (RequiresTransform<TArgs> extends true\n ? {\n /**\n * Transforms the raw HTTP response to the final response type.\n * **Required** because rawResponse type differs from response type.\n *\n * @example\n * ```ts\n * transformResponse: (raw) => raw.data\n * ```\n */\n transformResponse: (rawResponse: RawResponseType<TArgs>) => ResponseType<TArgs>;\n }\n : {\n /**\n * Transforms the raw HTTP response to the final response type.\n * Useful for unwrapping response wrappers (e.g., GraphQL's `{ data: ... }` format).\n *\n * @example\n * ```ts\n * transformResponse: (raw) => raw.data\n * ```\n */\n transformResponse?: (rawResponse: RawResponseType<TArgs>) => ResponseType<TArgs>;\n });\n\nexport type QueryCreator<TArgs extends QueryArgs> = {\n (...features: QueryFeature<TArgs>[]): Query<TArgs>;\n (queryConfig: QueryConfig, ...features: QueryFeature<TArgs>[]): Query<TArgs>;\n\n /**\n * Creates a new query creator with merged options.\n * The new creator inherits all options from the original and overrides them with the provided options.\n *\n * @example\n * ```ts\n * const originalCreator = myApiPost('/api/data');\n * const creatorWithRetry = originalCreator.clone({ retryFn: customRetryFn });\n * ```\n */\n clone: (additionalOptions: Partial<BaseQueryCreatorOptions<TArgs>>) => QueryCreator<TArgs>;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyQueryCreator = QueryCreator<any>;\n\nexport type QueryArgsOf<T extends AnyQueryCreator | AnyNewQuery> =\n T extends QueryCreator<infer TArgs> ? TArgs : T extends Query<infer TArgs> ? TArgs : never;\n\nexport type RunQueryCreator<TCreator extends AnyQueryCreator> = ReturnType<TCreator>;\n\nexport type QueryMethod = 'GET' | 'OPTIONS' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'TRACE' | 'CONNECT';\n\nexport type InternalCreateQueryCreatorOptions<TArgs extends QueryArgs> = {\n /**\n * The route of the query.\n * If the query has path params, the route should be a function that takes the path params as an argument.\n * Otherwise, it should be a string.\n */\n route: RouteType<TArgs>;\n\n method: QueryMethod;\n client: AnyCreateQueryClientResult;\n};\n\nexport type QueryConfig = {\n /** A custom id to use for this query. Only affects queries that can be cached. */\n key?: string;\n\n /**\n * If true, the query will not be executed automatically.\n * Does not affect mutations such as POST, PUT etc. since those are never executed automatically.\n */\n onlyManualExecution?: boolean;\n\n /**\n * If true, the query will not throw an error because a \"withArgs()\" feature is missing.\n */\n silenceMissingWithArgsFeatureError?: boolean;\n\n /**\n * A custom injector to use for this query.\n */\n injector?: Injector;\n};\n\nexport const splitQueryConfig = <TArgs extends QueryArgs>(args: (QueryFeature<TArgs> | QueryConfig)[]) => {\n let queryConfig: QueryConfig = {};\n let features: QueryFeature<TArgs>[] = [];\n\n const first = args[0];\n\n if (first) {\n if ('type' in first) {\n features = args as QueryFeature<TArgs>[];\n } else {\n [queryConfig, ...features] = args as [QueryConfig, ...QueryFeature<TArgs>[]];\n }\n }\n return { features, queryConfig };\n};\n\nexport const createQueryCreator = <TArgs extends QueryArgs>(\n options: CreateQueryCreatorOptions | undefined,\n internals: InternalCreateQueryCreatorOptions<TArgs>,\n): QueryCreator<TArgs> =>\n createBaseQueryCreator({\n options,\n internals,\n queryFactory: createQuery,\n });\n","import { Query, QueryArgs } from './query';\nimport { BaseQueryCreatorOptions, QueryConfig, QueryCreator, splitQueryConfig } from './query-creator';\nimport { QueryFeature } from './query-features';\n\nexport type BaseQueryCreatorFactoryOptions<TArgs extends QueryArgs, TOptions, TInternals> = {\n /** Creator-specific options (e.g., CreateQueryCreatorOptions or CreateGqlQueryCreatorOptions) */\n options: TOptions | undefined;\n\n /** Creator-specific internals (e.g., InternalCreateQueryCreatorOptions or InternalCreateGqlQueryCreatorOptions) */\n internals: TInternals;\n\n /** Factory function that creates the actual query */\n queryFactory: (config: {\n creator: TOptions | undefined;\n creatorInternals: TInternals;\n features: QueryFeature<TArgs>[];\n queryConfig: QueryConfig;\n }) => Query<TArgs>;\n};\n\nexport const createBaseQueryCreator = <TArgs extends QueryArgs, TOptions, TInternals>(\n config: BaseQueryCreatorFactoryOptions<TArgs, TOptions, TInternals>,\n): QueryCreator<TArgs> => {\n function queryCreator(...features: QueryFeature<TArgs>[]): Query<TArgs>;\n function queryCreator(queryConfig: QueryConfig, ...features: QueryFeature<TArgs>[]): Query<TArgs>;\n\n function queryCreator(...args: (QueryFeature<TArgs> | QueryConfig)[]): Query<TArgs> {\n const { features, queryConfig } = splitQueryConfig<TArgs>(args);\n\n return config.queryFactory({\n creator: config.options,\n creatorInternals: config.internals,\n features,\n queryConfig,\n });\n }\n\n // Add clone method to create a new creator with merged options\n // Cast to match QueryCreator's expected signature while preserving TOptions internally\n queryCreator.clone = (additionalOptions: Partial<BaseQueryCreatorOptions>) => {\n return createBaseQueryCreator({\n ...config,\n options: { ...config.options, ...additionalOptions } as TOptions,\n });\n };\n\n return queryCreator;\n};\n","import { FormViolationListView, FormViolationView } from '@ethlete/types';\n\nexport type ClassValidatorError = {\n statusCode: number;\n message: string[];\n error: string;\n};\n\nexport const isClassValidatorError = (error: unknown): error is ClassValidatorError => {\n return typeof error === 'object' && error !== null && 'statusCode' in error && 'message' in error && 'error' in error;\n};\n\nexport type SymfonyErrorTrace = {\n args: string[];\n class: string;\n file: string;\n function: string;\n line: number;\n namespace: string;\n short_class: string;\n type: string;\n};\n\nexport type SymfonyError = {\n class: string;\n detail: string;\n status: number;\n title: string;\n trace: SymfonyErrorTrace[];\n type: string;\n};\n\nexport const isSymfonyError = (error: unknown): error is SymfonyError => {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const symfonyError = error as SymfonyError;\n\n return (\n symfonyError.class !== undefined &&\n symfonyError.detail !== undefined &&\n symfonyError.status !== undefined &&\n symfonyError.title !== undefined &&\n symfonyError.trace !== undefined &&\n symfonyError.type !== undefined\n );\n};\n\nexport const isSymfonyPagerfantaOutOfRangeError = (error: unknown): error is SymfonyError => {\n if (!isSymfonyError(error)) {\n return false;\n }\n\n return error.class.startsWith('Pagerfanta') && error.class.endsWith('OutOfRangeCurrentPageException');\n};\n\nexport const isSymfonyFormViolationListError = (error: unknown): error is FormViolationListView => {\n return typeof error === 'object' && error !== null && 'violations' in error;\n};\n\nexport const isSymfonyListError = (error: unknown): error is FormViolationView[] => {\n return (\n !!error &&\n typeof error === 'object' &&\n Array.isArray(error) &&\n !!error.length &&\n typeof error[0] === 'object' &&\n 'message' in error[0] &&\n 'propertyPath' in error[0] &&\n 'invalidValue' in error[0]\n );\n};\n","export const buildErrorMessage = (code: string, message: string) => `[@ethlete\\\\query:${code}] ${message}`;\n\nexport class QueryError extends Error {\n data?: unknown;\n\n constructor(code: string, message: string, data?: unknown) {\n super(buildErrorMessage(code, message));\n this.name = 'QueryError';\n this.data = data;\n }\n}\n\nexport const invalidBaseRouteError = (data: unknown) =>\n new QueryError('001', 'The baseRoute must not end with a slash', data);\n\nexport const invalidRouteError = (data: unknown) => new QueryError('002', 'The route must start with a slash', data);\n\nexport const pathParamsMissingInRouteFunctionError = (data: unknown) =>\n new QueryError('003', 'The route is a function but pathParams are missing', data);\n\nexport const queryStateAlreadyHasKeyError = (data: unknown) =>\n new QueryError('004', 'The query state already contains the provided key', data);\n\nexport const queryStateDoesNotContainKeyError = (data: unknown) =>\n new QueryError('005', 'The query state does not contain the provided key', data);\n\nexport const queryStateCannotTransformError = (data: unknown) =>\n new QueryError('006', 'The query state cannot be transformed because it is not loading', data);\n\nexport const invalidBodyError = (data: unknown) => new QueryError('007', 'The body is not valid or upsupported', data);\n","import { isSymfonyPagerfantaOutOfRangeError } from '../../http/query-error-response-utils';\nimport { invalidBaseRouteError, invalidRouteError, pathParamsMissingInRouteFunctionError } from '../logger';\nimport { AnyRoute } from '../query';\nimport {\n BuildQueryStringConfig,\n Method,\n PathParams,\n QueryParams,\n RequestError,\n RequestHeaders,\n RequestRetryFn,\n} from './request.types';\n\nexport const isNaN = (value: unknown): boolean => typeof value === 'number' && Number.isNaN(value);\nexport const isEmptyString = (value: unknown): boolean => typeof value === 'string' && value.trim() === '';\n\nexport const isRequestError = <T = unknown>(error: unknown): error is RequestError<T> =>\n error instanceof Object && 'status' in error && 'statusText' in error && 'url' in error;\n\nexport const buildRoute = (options: {\n base: string;\n route: AnyRoute | null | undefined;\n pathParams?: PathParams;\n queryParams?: QueryParams;\n queryParamConfig?: BuildQueryStringConfig;\n}) => {\n if (options.base.endsWith('/')) {\n throw invalidBaseRouteError(options.base);\n }\n\n let route: string | null;\n\n if (typeof options.route === 'function') {\n if (!options.pathParams) {\n throw pathParamsMissingInRouteFunctionError(options.route({}));\n }\n\n route = options.route(options.pathParams);\n } else {\n route = options.route ?? null;\n }\n\n if (route && !route.startsWith('/')) {\n throw invalidRouteError(route);\n }\n\n if (options.queryParams) {\n const queryString = buildQueryString(options.queryParams, options.queryParamConfig);\n\n if (queryString) {\n route = route ? `${route}?${queryString}` : `/?${queryString}`;\n }\n }\n\n return `${options.base}${route ?? ''}`;\n};\n\nexport const buildQueryString = (params: QueryParams, config?: BuildQueryStringConfig): string | null => {\n const objectNotation = config?.objectNotation ?? 'bracket';\n const writeArrayIndexes = config?.writeArrayIndexes ?? false;\n const ignoredValues = config?.ignoredValues ?? [undefined, null, Infinity, -Infinity];\n const ignoredValuesFns = config?.ignoredValuesFns ?? [isNaN, isEmptyString];\n\n const queryParams: string[] = [];\n\n function processValue(key: string, value: unknown) {\n if (config?.objectNotation === 'json-stringify') {\n if (value === undefined) {\n return false;\n }\n\n if (ignoredValues.includes(value)) {\n return false;\n }\n\n if (ignoredValuesFns.some((fn) => fn(value))) {\n return false;\n }\n\n const encodedKey = encodeURIComponent(key);\n\n const val = typeof value === 'object' ? JSON.stringify(value) : value;\n\n const encodedValue = encodeURIComponent(val as string | number | boolean);\n\n queryParams.push(`${encodedKey}=${encodedValue}`);\n\n return true;\n } else if (Array.isArray(value)) {\n let currentFilteredIndex = 0;\n for (const arrayValue of value) {\n const nestedKey = writeArrayIndexes ? `${key}[${currentFilteredIndex}]` : `${key}[]`;\n\n const didAddValue = processValue(nestedKey, arrayValue);\n\n if (didAddValue) {\n currentFilteredIndex++;\n }\n }\n\n return null;\n } else if (typeof value === 'object' && value !== null) {\n for (const [objKey, val] of Object.entries(value)) {\n const nestedKey = objectNotation === 'dot' ? `${key}.${objKey}` : `${key}[${objKey}]`;\n processValue(nestedKey, val);\n }\n\n return null;\n } else {\n if (ignoredValues.includes(value)) {\n return false;\n }\n\n if (ignoredValuesFns.some((fn) => fn(value))) {\n return false;\n }\n\n const encodedKey = encodeURIComponent(key);\n const encodedValue = encodeURIComponent(value as string);\n\n queryParams.push(`${encodedKey}=${encodedValue}`);\n\n return true;\n }\n }\n\n for (const [key, val] of Object.entries(params)) {\n processValue(key, val);\n }\n\n return queryParams.length ? queryParams.join('&') : null;\n};\n\nexport const v2ExtractExpiresInSeconds = (headers: RequestHeaders) => {\n const cacheControl = headers['cache-control'];\n const age = headers['age'];\n const expires = headers['expires'];\n\n // In seconds\n let expiresIn: number | null = null;\n let maxAge: number | null = null;\n\n if (cacheControl?.includes('no-cache')) {\n return null;\n }\n\n if (cacheControl?.includes('max-age')) {\n const m = cacheControl.split('max-age=')[1];\n\n if (m) {\n maxAge = parseInt(m);\n }\n } else if (cacheControl?.includes('s-maxage')) {\n const m = cacheControl.split('s-maxage=')[1];\n\n if (m) {\n maxAge = parseInt(m);\n }\n }\n\n if (maxAge && age) {\n const ageSeconds = parseInt(age);\n\n expiresIn = maxAge - ageSeconds;\n } else if (maxAge) {\n expiresIn = maxAge / 2; // We assume the response is half way to its expiration\n } else if (expires) {\n // Used by some apis to tell the response will never expire\n // In this case we let the response expire after 1 hour\n if (expires === '-1') {\n expiresIn = 3600;\n } else {\n const expiresDate = new Date(expires);\n\n // check if the date is valid\n if (expiresDate.toString() !== 'Invalid Date') {\n expiresIn = Math.floor((expiresDate.getTime() - Date.now()) / 1000);\n }\n }\n }\n\n return expiresIn;\n};\n\nexport const buildTimestampFromSeconds = (seconds: number | null) => {\n if (seconds === null) {\n return null;\n }\n\n return new Date(Date.now() + seconds * 1000).getTime();\n};\n\nexport const serializeBody = (body: unknown): ArrayBuffer | URLSearchParams | Blob | FormData | string | null => {\n if (body === null || body === undefined) {\n return null;\n }\n\n if (\n body instanceof ArrayBuffer ||\n body instanceof Blob ||\n body instanceof FormData ||\n body instanceof URLSearchParams ||\n typeof body === 'string'\n ) {\n return body as ArrayBuffer | URLSearchParams | Blob | FormData | string;\n }\n\n if (typeof body === 'object' || typeof body === 'boolean' || Array.isArray(body)) {\n return JSON.stringify(body);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (body as any).toString();\n};\n\nexport const transformMethod = (config: { method: Method; transferVia?: 'GET' | 'POST' }) => {\n if (config.method === 'GQL_QUERY' || config.method === 'GQL_MUTATE') {\n if (!config.transferVia) {\n return 'POST';\n }\n\n return config.transferVia;\n }\n\n return config.method;\n};\n\nexport const detectContentTypeHeader = (body: unknown) => {\n // An empty body has no content type.\n if (body === null) {\n return null;\n }\n // FormData bodies rely on the browser's content type assignment.\n if (body instanceof FormData) {\n return null;\n }\n // Blobs usually have their own content type. If it doesn't, then\n // no type can be inferred.\n if (body instanceof Blob) {\n return body.type || null;\n }\n // Array buffers have unknown contents and thus no type can be inferred.\n if (body instanceof ArrayBuffer) {\n return null;\n }\n // Technically, strings could be a form of JSON data, but it's safe enough\n // to assume they're plain strings.\n if (typeof body === 'string') {\n return 'text/plain';\n }\n\n // Arrays, objects, boolean and numbers will be encoded as JSON.\n if (typeof body === 'object' || typeof body === 'number' || typeof body === 'boolean') {\n return 'application/json';\n }\n // No type could be inferred.\n return null;\n};\n\nexport const hasHeader = (headers: RequestHeaders, header: string) => {\n return Object.keys(headers).some((key) => key.toLowerCase() === header.toLowerCase());\n};\n\nexport const forEachHeader = (headers: RequestHeaders, callback: (value: string, key: string) => void) => {\n Object.entries(headers).forEach(([key, value]) => {\n callback(key, value);\n });\n};\n\nexport const parseAllXhrResponseHeaders = (xhr: XMLHttpRequest) => {\n const headers = xhr.getAllResponseHeaders();\n const parsedHeaders: RequestHeaders = {};\n\n for (const line of headers.split('\\n')) {\n const index = line.indexOf(':');\n if (index > 0) {\n const name = line.slice(0, index);\n const key = name.toLowerCase();\n const value = line.slice(index + 1).trim();\n\n parsedHeaders[key] = value;\n }\n }\n\n return parsedHeaders;\n};\n\nexport const getResponseUrl = (xhr: XMLHttpRequest): string | null => {\n if ('responseURL' in xhr && xhr.responseURL) {\n return xhr.responseURL;\n }\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL');\n }\n return null;\n};\n\nexport const v2ShouldRetryRequest: RequestRetryFn = (config) => {\n const defaultRetryDelay = 1000 + 1000 * config.currentRetryCount;\n\n if (config.currentRetryCount > 3) {\n return { retry: false };\n }\n\n if (!isRequestError(config.error)) {\n return { retry: false };\n }\n\n const { status, detail } = config.error;\n\n // Retry on 5xx errors\n if (status >= 500) {\n // Don't retry if a requested page is out of range\n if (isSymfonyPagerfantaOutOfRangeError(detail)) {\n return { retry: false };\n }\n\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Retry on 408 or 425 errors\n if (status === 408 || status === 425) {\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Retry on 429 errors\n if (status === 429) {\n const retryAfter =\n config.headers['retry-after'] ||\n config.headers['Retry-After'] ||\n config.headers['x-retry-after'] ||\n config.headers['X-Retry-After'];\n\n if (retryAfter) {\n const delay = parseInt(retryAfter) * 1000;\n return { retry: true, delay: Number.isNaN(delay) ? defaultRetryDelay : delay };\n }\n\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Code 0 usually means the internet connection is down. We retry in this case.\n // It could also be a CORS issue but that should not be the case in production.\n if ((status as number) === 0) {\n return { retry: true, delay: defaultRetryDelay };\n }\n\n return { retry: false };\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { Observable, Observer } from 'rxjs';\nimport { PartialXhrState, RequestConfig, RequestError, RequestEvent } from './request.types';\nimport {\n buildTimestampFromSeconds,\n detectContentTypeHeader,\n forEachHeader,\n getResponseUrl,\n hasHeader,\n parseAllXhrResponseHeaders,\n serializeBody,\n v2ExtractExpiresInSeconds,\n v2ShouldRetryRequest,\n} from './request.util';\n\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n\nexport const request = <Response = unknown>(config: RequestConfig): Observable<RequestEvent<Response>> => {\n const headers = config.headers || {};\n const responseType = config.responseType || 'json';\n const body = config.body || null;\n const url = config.urlWithParams.split('?')[0] || '';\n const retryFn = config.retryFn || v2ShouldRetryRequest;\n let currentRetryCount = 0;\n let retryTimeout: number | null = null;\n\n return new Observable((observer: Observer<RequestEvent<Response>>) => {\n const xhr = new XMLHttpRequest();\n const reqBody = serializeBody(body);\n\n const setupXhr = () => {\n xhr.open(config.method, config.urlWithParams);\n if (config.withCredentials) {\n xhr.withCredentials = true;\n }\n\n forEachHeader(headers, (name, value) => xhr.setRequestHeader(name, value));\n\n if (!hasHeader(headers, 'Accept')) {\n xhr.setRequestHeader('Accept', 'application/json, text/plain, */*');\n }\n\n if (!hasHeader(headers, 'Content-Type')) {\n const detectedType = detectContentTypeHeader(body);\n\n if (detectedType) {\n xhr.setRequestHeader('Content-Type', detectedType);\n }\n }\n\n xhr.responseType = responseType !== 'json' ? responseType : 'text';\n };\n\n setupXhr();\n\n const partialFromXhr = (): PartialXhrState => {\n const statusText = xhr.statusText || 'OK';\n const headers = parseAllXhrResponseHeaders(xhr);\n const _url = getResponseUrl(xhr) || url;\n\n return { headers, status: xhr.status, statusText, url: _url };\n };\n\n const handleRetry = (error: RequestError) => {\n const newRetryCount = currentRetryCount + 1;\n const { headers } = partialFromXhr();\n const { retry, delay } = retryFn({ currentRetryCount: newRetryCount, headers, error });\n\n if (!retry) {\n observer.next({ type: 'failure', headers, error });\n observer.complete();\n return;\n }\n\n const _delay = delay ?? 1000;\n observer.next({ type: 'delay-retry', headers, retryNumber: newRetryCount, retryDelay: _delay });\n\n retryTimeout = window.setTimeout(() => {\n setupXhr();\n xhr.send(reqBody);\n currentRetryCount = newRetryCount;\n observer.next({ type: 'start', headers, isRetry: true, retryNumber: currentRetryCount, retryDelay: _delay });\n }, _delay);\n };\n\n const onLoad = async () => {\n const { headers, statusText, url } = partialFromXhr();\n\n let { status } = partialFromXhr();\n\n let body: unknown | null = null;\n\n if (status !== 204) {\n body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;\n }\n\n if (status === 0) {\n status = body ? 200 : 0;\n }\n\n let ok = status >= 200 && status < 300;\n\n if (responseType === 'json' && typeof body === 'string') {\n const originalBody = body;\n body = body.replace(XSSI_PREFIX, '');\n try {\n body = body !== '' ? JSON.parse(body as string) : null;\n } catch (error) {\n body = originalBody;\n\n if (ok) {\n ok = false;\n body = { error, text: body };\n }\n }\n } else if (!ok && body instanceof Blob) {\n try {\n const text = await body.text();\n\n if (body.type === 'application/json') {\n body = JSON.parse(text);\n } else {\n body = text;\n }\n } catch (error) {\n // Ignore the error.\n }\n }\n\n if (ok) {\n const successEvent: RequestEvent<Response> = {\n type: 'success',\n headers,\n response: body as Response,\n };\n\n const expiresInSeconds = config.cacheAdapter?.(headers) ?? v2ExtractExpiresInSeconds(headers);\n const expiresInTimestamp = buildTimestampFromSeconds(expiresInSeconds);\n\n if (expiresInTimestamp) {\n successEvent.expiresInTimestamp = expiresInTimestamp;\n }\n\n observer.next(successEvent);\n\n observer.complete();\n } else {\n handleRetry({\n url,\n detail: body,\n status,\n statusText,\n httpErrorResponse: new HttpErrorResponse({\n error: body,\n status,\n statusText,\n url,\n }),\n });\n }\n };\n\n const onError = (error: Event) => {\n const { url } = partialFromXhr();\n\n handleRetry({\n url,\n detail: error,\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Unknown Error',\n httpErrorResponse: new HttpErrorResponse({\n error: error,\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Unknown Error',\n url,\n }),\n });\n };\n\n const onDownProgress = (event: ProgressEvent) => {\n const { headers } = partialFromXhr();\n\n const progress: RequestEvent = {\n type: 'download-progress',\n headers,\n progress: {\n current: event.loaded,\n },\n };\n\n if (event.lengthComputable) {\n const progressPercent = (event.loaded / event.total) * 100;\n progress.progress.percentage = Math.round(progressPercent * 100) / 100;\n progress.progress.total = event.total;\n }\n\n if (responseType === 'text' && !!xhr.responseText) {\n progress.partialText = xhr.responseText;\n }\n\n observer.next(progress);\n };\n\n const onUpProgress = (event: ProgressEvent) => {\n const { headers } = partialFromXhr();\n\n const progress: RequestEvent = {\n type: 'upload-progress',\n headers,\n progress: {\n current: event.loaded,\n },\n };\n\n if (event.lengthComputable) {\n const progressPercent = (event.loaded / event.total) * 100;\n progress.progress.percentage = Math.round(progressPercent * 100) / 100;\n progress.progress.total = event.total;\n }\n\n observer.next(progress);\n };\n\n xhr.addEventListener('load', onLoad);\n xhr.addEventListener('error', onError);\n xhr.addEventListener('timeout', onError);\n xhr.addEventListener('abort', onError);\n\n if (config.reportProgress) {\n xhr.addEventListener('progress', onDownProgress);\n\n if (reqBody !== null && xhr.upload) {\n xhr.upload.addEventListener('progress', onUpProgress);\n }\n }\n\n xhr.send(reqBody);\n observer.next({ type: 'start', headers });\n\n return () => {\n xhr.removeEventListener('error', onError);\n xhr.removeEventListener('abort', onError);\n xhr.removeEventListener('load', onLoad);\n xhr.removeEventListener('timeout', onError);\n\n if (retryTimeout) {\n window.clearTimeout(retryTimeout);\n }\n\n if (config.reportProgress) {\n xhr.removeEventListener('progress', onDownProgress);\n\n if (reqBody !== null && xhr.upload) {\n xhr.upload.removeEventListener('progress', onUpProgress);\n }\n }\n\n if (xhr.readyState !== xhr.DONE) {\n xhr.abort();\n }\n\n observer.next({ type: 'cancel', headers });\n };\n });\n};\n","import { HttpHeaders } from '@angular/common/http';\nimport { QueryArgs, RequestArgs } from './query';\nimport { QueryMethod } from './query-creator';\n\nexport const extractExpiresInSeconds = (headers: HttpHeaders) => {\n const cacheControl = headers.get('cache-control');\n const age = headers.get('age');\n const expires = headers.get('expires');\n\n // In seconds\n let expiresIn: number | null = null;\n let maxAge: number | null = null;\n\n if (cacheControl?.includes('no-cache')) {\n return null;\n }\n\n if (cacheControl?.includes('max-age')) {\n const m = cacheControl.split('max-age=')[1];\n\n if (m) {\n maxAge = parseInt(m);\n }\n } else if (cacheControl?.includes('s-maxage')) {\n const m = cacheControl.split('s-maxage=')[1];\n\n if (m) {\n maxAge = parseInt(m);\n }\n }\n\n if (maxAge && age) {\n const ageSeconds = parseInt(age);\n\n expiresIn = maxAge - ageSeconds;\n } else if (maxAge) {\n expiresIn = maxAge / 2; // We assume the response is half way to its expiration\n } else if (expires) {\n // Used by some apis to tell the response will never expire\n // In this case we let the response expire after 1 hour\n if (expires === '-1') {\n expiresIn = 3600;\n } else {\n const expiresDate = new Date(expires);\n\n // check if the date is valid\n if (expiresDate.toString() !== 'Invalid Date') {\n expiresIn = Math.floor((expiresDate.getTime() - Date.now()) / 1000);\n }\n }\n }\n\n return expiresIn;\n};\n\nexport const shouldCacheQuery = (method: QueryMethod) => {\n return method === 'GET' || method === 'OPTIONS' || method === 'HEAD';\n};\n\nexport const buildQueryCacheKey = (route: string, args: RequestArgs<QueryArgs> | undefined) => {\n // We need to hash the body in case it's a gql query and the query get's transported in the body\n const body = JSON.stringify(args?.body || {})\n // replace all curly braces with empty string\n .replace(/{|}/g, '')\n // replace new lines and whitespaces with empty string\n .replace(/\\s/g, '');\n\n const seed = `${route}_${body}`;\n\n let hash = 0;\n\n for (const char of seed) {\n hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;\n }\n\n // Force positive number hash.\n // 2147483647 = equivalent of Integer.MAX_VALUE.\n hash += 2147483647 + 1;\n\n return hash.toString();\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { clamp } from '@ethlete/core';\nimport { isSymfonyPagerfantaOutOfRangeError } from './query-error-response-utils';\n\nexport type ShouldRetryRequestOptions = {\n retryCount: number;\n error: HttpErrorResponse;\n};\n\nexport type ShouldRetryRequestResult =\n | {\n retry: false;\n }\n | {\n retry: true;\n delay: number;\n };\n\nexport type ShouldRetryRequestFn = (options: ShouldRetryRequestOptions) => ShouldRetryRequestResult;\n\nexport const shouldRetryRequest = (\n options: ShouldRetryRequestOptions | HttpErrorResponse,\n): ShouldRetryRequestResult => {\n const normalizedOptions =\n options instanceof HttpErrorResponse ? { retryCount: 0, error: options } : (options as ShouldRetryRequestOptions);\n const { retryCount, error } = normalizedOptions;\n const defaultRetryDelay = clamp(1000 + 1000 * retryCount, 1000, 5000);\n const { status, error: detail, headers } = error;\n\n // Code 0 usually means the internet connection is down. We retry in this case.\n // It could also be a CORS issue but that should not be the case in production.\n // We will retry in this case until the connection is back.\n if (status === 0) {\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Don't retry if we already retried 3 times\n if (retryCount > 3) {\n return { retry: false };\n }\n\n // Don't retry if it's not an http error\n if (!(error instanceof HttpErrorResponse)) {\n return { retry: false };\n }\n\n // Retry on 5xx errors (except 500 internal server error since those are usually not recoverable)\n if (status >= 501) {\n // Don't retry if a requested page is out of range\n if (isSymfonyPagerfantaOutOfRangeError(detail)) {\n return { retry: false };\n }\n\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Retry on 408 or 425 errors\n if (status === 408 || status === 425) {\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Retry on 429 errors\n if (status === 429) {\n const retryAfter = headers.get('retry-after') || headers.get('x-retry-after');\n\n if (retryAfter) {\n const delay = parseInt(retryAfter) * 1000;\n return { retry: true, delay: Number.isNaN(delay) ? defaultRetryDelay : delay };\n }\n\n return { retry: true, delay: defaultRetryDelay };\n }\n\n return { retry: false };\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport {\n isClassValidatorError,\n isSymfonyFormViolationListError,\n isSymfonyListError,\n} from './query-error-response-utils';\nimport { shouldRetryRequest, ShouldRetryRequestResult } from './query-retry-utils';\n\nexport type QueryErrorResponseList = {\n isList: true;\n errors: QueryErrorResponseItem[];\n};\n\nexport type QueryErrorResponseSingle = {\n isList: false;\n error: QueryErrorResponseItem;\n};\n\nexport type QueryErrorResponse = {\n raw: HttpErrorResponse;\n retryState: ShouldRetryRequestResult;\n code: number;\n} & (QueryErrorResponseList | QueryErrorResponseSingle);\n\nexport type QueryErrorResponseItem = {\n message: string;\n};\n\nexport const createQueryErrorResponse = (error: unknown): QueryErrorResponse => {\n let err = error instanceof HttpErrorResponse ? error : null;\n\n if (!err) {\n err = new HttpErrorResponse({\n error: error,\n status: 0,\n statusText: 'Unknown Error',\n });\n }\n const retryState = shouldRetryRequest(err);\n\n const detail = err.error;\n const errorList: QueryErrorResponseItem[] = [];\n\n if (isClassValidatorError(detail)) {\n for (const error of detail.message) {\n errorList.push({ message: error });\n }\n } else if (isSymfonyFormViolationListError(detail)) {\n for (const violation of detail.violations) {\n errorList.push({ message: violation.message });\n }\n } else if (isSymfonyListError(detail)) {\n for (const error of detail) {\n errorList.push({ message: error.message });\n }\n } else if (typeof detail === 'object' && !!detail && 'message' in detail && typeof detail.message === 'string') {\n errorList.push({ message: detail.message });\n } else if (typeof detail === 'object' && !!detail && 'detail' in detail && typeof detail.detail === 'string') {\n // Symfony error response (during development)\n errorList.push({ message: detail.detail });\n } else if (typeof detail === 'string') {\n errorList.push({ message: detail });\n } else if (Array.isArray(detail) && detail.length > 0 && typeof detail[0] === 'string') {\n for (const error of detail) {\n errorList.push({ message: error });\n }\n }\n\n if (errorList.length > 1) {\n return {\n isList: true,\n errors: errorList,\n raw: err,\n retryState,\n code: err.status,\n };\n } else {\n const singleError = errorList[0] ?? { message: err.message };\n\n return {\n isList: false,\n error: singleError,\n raw: err,\n retryState,\n code: err.status,\n };\n }\n};\n","import { HttpClient, HttpEvent, HttpEventType, HttpProgressEvent } from '@angular/common/http';\nimport { ErrorHandler, Signal, computed, signal } from '@angular/core';\nimport { Subscription, catchError, retry, tap, throwError, timer } from 'rxjs';\nimport { buildTimestampFromSeconds } from '../legacy/request';\nimport { QueryArgs, RequestArgs, ResponseType } from './query';\nimport { extractExpiresInSeconds } from './query-cache-utils';\nimport { CacheAdapterFn } from './query-client';\nimport { CreateQueryCreatorOptions, QueryMethod } from './query-creator';\nimport { QueryErrorResponse, createQueryErrorResponse } from './query-error-response';\nimport { QueryRepositoryDependencies } from './query-repository';\nimport { ShouldRetryRequestFn, ShouldRetryRequestOptions, shouldRetryRequest } from './query-retry-utils';\n\nexport const SPEED_BUFFER_TIME_IN_MS = 2000;\n\nexport type HttpRequestTransferCacheConfig =\n | boolean\n | {\n includeHeaders?: string[];\n };\n\nexport type HttpRequestResponseType = 'json' | 'text' | 'blob' | 'arraybuffer';\n\nexport type CreateHttpRequestDependencies = {\n /** The http client instance to use for the request */\n httpClient: HttpClient;\n\n /** The error handler instance to use for the request */\n ngErrorHandler: ErrorHandler;\n};\n\nexport type CreateHttpRequestOptions<TArgs extends QueryArgs> = {\n /** The HTTP method of the request */\n method: QueryMethod;\n\n /**\n * The full path of the request\n * @example 'https://api.example.com/v1/users'\n */\n fullPath: string;\n\n /** The data of the request */\n args?: RequestArgs<TArgs> | null;\n\n /** The dependencies of the request */\n dependencies: QueryRepositoryDependencies;\n\n /** The client options of the request */\n clientOptions?: CreateQueryCreatorOptions;\n\n /**\n * The cache adapter function to use for the request\n * @default extractExpiresInSeconds()\n */\n cacheAdapter?: CacheAdapterFn;\n\n /**\n * The retry function to use for the request\n * @default shouldRetryRequest()\n */\n retryFn?: ShouldRetryRequestFn;\n};\n\nexport type HttpRequestLoadingState = {\n /** The time when the request was executed in ms */\n executeTime: number;\n\n /** The progress of the request. Null if reportProgress is false or progress is not available / unsupported */\n progress: HttpRequestLoadingProgressState | null;\n};\n\nexport type HttpRequestLoadingProgressState = {\n /** The total number of bytes to be transferred */\n total: number;\n\n /** The number of bytes transferred */\n loaded: number;\n\n /** The percentage of the transfer that is completed */\n percentage: number;\n\n /** The speed of the transfer in bytes per millisecond */\n speed: number | null;\n\n /** The estimated remaining time in milliseconds */\n remainingTime: number | null;\n};\n\nexport type HttpRequest<TArgs extends QueryArgs> = {\n /** Executes the request */\n execute: (options?: { allowCache?: boolean }) => boolean;\n\n /** Destroys the request (cancels it if in progress) */\n destroy: () => boolean;\n\n /** The loading state of the request */\n loading: Signal<HttpRequestLoadingState | null>;\n\n /** The error state of the request */\n error: Signal<QueryErrorResponse | null>;\n\n /** The response state of the request */\n response: Signal<ResponseType<TArgs> | null>;\n\n /** The current event of the request */\n currentEvent: Signal<RequestHttpEvent<TArgs> | null>;\n\n /** Whether the request is stale or not aka the cache header has expired */\n isStale: Signal<boolean>;\n};\n\n/** A custom error event since the Angular http client does not provide a specific event for errors */\nexport type HttpErrorEvent = {\n type: 'error';\n error: QueryErrorResponse;\n};\n\nexport type RequestHttpEvent<TArgs extends QueryArgs> = HttpEvent<ResponseType<TArgs>> | HttpErrorEvent;\n\nexport const createHttpRequest = <TArgs extends QueryArgs>(options: CreateHttpRequestOptions<TArgs>) => {\n let currentStreamSubscription = Subscription.EMPTY;\n\n const { args, clientOptions, dependencies } = options;\n\n const currentEvent = signal<RequestHttpEvent<TArgs> | null>(null);\n const loading = signal<HttpRequestLoadingState | null>(null);\n const error = signal<QueryErrorResponse | null>(null);\n const response = signal<ResponseType<TArgs> | null>(null);\n\n const lastLoadEventTime = signal(0);\n const lastLoadEventAmount = signal(0);\n const lastExecuteTime = signal(0);\n const expiresIn = signal<number | null>(null);\n\n const isStale = computed(() => {\n const expiresInTs = expiresIn();\n\n return expiresInTs === null || expiresInTs < Date.now();\n });\n\n const createStream = () => {\n const headers = typeof args?.headers === 'function' ? args.headers() : args?.headers;\n\n return dependencies.httpClient\n .request(options.method, options.fullPath, {\n observe: 'events',\n body: args?.body,\n reportProgress: clientOptions?.reportProgress,\n withCredentials: clientOptions?.withCredentials,\n transferCache: clientOptions?.transferCache,\n responseType: clientOptions?.responseType || 'json',\n headers,\n })\n .pipe(\n tap((event) => updateState(event)),\n retry({\n delay: (error, retryCount) => {\n const retryOptions: ShouldRetryRequestOptions = { error, retryCount };\n\n const retryResult = options.retryFn?.(retryOptions) || shouldRetryRequest(retryOptions);\n\n if (!retryResult.retry) {\n return throwError(() => error);\n }\n\n return timer(retryResult.delay);\n },\n }),\n catchError((e) => {\n updateErrorState(e);\n\n return throwError(() => e);\n }),\n );\n };\n\n const execute = (options?: { allowCache?: boolean }) => {\n if (loading() || (!isStale() && options?.allowCache)) {\n // Do not execute if there is already a request in progress or caching is allowed\n return false;\n }\n\n currentStreamSubscription.unsubscribe();\n\n lastExecuteTime.set(Date.now());\n lastLoadEventTime.set(lastExecuteTime());\n\n loading.set({\n executeTime: lastExecuteTime(),\n progress: null,\n });\n error.set(null);\n expiresIn.set(null);\n\n const stream = createStream();\n\n currentStreamSubscription = stream.subscribe({\n error: () => {\n // Errors are already handled in updateErrorState via catchError\n // This empty handler prevents \"unhandled error\" warnings in tests\n },\n });\n\n return true;\n };\n\n const destroy = () => {\n if (currentStreamSubscription.closed) {\n return false;\n }\n\n currentStreamSubscription.unsubscribe();\n\n return true;\n };\n\n const updateState = (event: HttpEvent<ResponseType<TArgs>>) => {\n currentEvent.set(event);\n\n switch (event.type) {\n case HttpEventType.Response:\n {\n loading.set(null);\n response.set(event.body);\n\n const expiresInSeconds = options.cacheAdapter\n ? options.cacheAdapter(event.headers)\n : extractExpiresInSeconds(event.headers);\n const expiresInTimestamp = buildTimestampFromSeconds(expiresInSeconds);\n expiresIn.set(expiresInTimestamp);\n }\n break;\n\n case HttpEventType.UploadProgress:\n case HttpEventType.DownloadProgress:\n {\n updateLoadingState(event);\n }\n break;\n\n case HttpEventType.Sent:\n case HttpEventType.ResponseHeader:\n case HttpEventType.User:\n {\n // we don't care about these events\n }\n break;\n }\n };\n\n const updateErrorState = (errorResponse: unknown) => {\n const errorRes = createQueryErrorResponse(errorResponse);\n\n error.set(errorRes);\n loading.set(null);\n currentEvent.set({ type: 'error', error: errorRes });\n\n options.dependencies.ngErrorHandler.handleError(errorRes.raw);\n };\n\n const updateLoadingState = (event: HttpProgressEvent) => {\n if (event.total === undefined) {\n return;\n }\n\n const progress: HttpRequestLoadingProgressState = {\n total: event.total,\n loaded: event.loaded,\n percentage: (event.loaded / event.total) * 100,\n speed: null,\n remainingTime: null,\n };\n\n const state: HttpRequestLoadingState = {\n executeTime: lastExecuteTime(),\n progress,\n };\n\n const currentTime = Date.now();\n const elapsedTimeSinceLastEvent = currentTime - lastLoadEventTime();\n const elapsedTimeSinceLastExecute = currentTime - lastExecuteTime();\n const loadedAmount = event.loaded - lastLoadEventAmount();\n\n // We only want to calculate speed and remaining time after 2 seconds of the execution\n // This is to avoid showing incorrect speed and remaining time when the request is very fast\n if (elapsedTimeSinceLastExecute > SPEED_BUFFER_TIME_IN_MS) {\n const speed = (loadedAmount / elapsedTimeSinceLastEvent) * 1000;\n\n progress.speed = speed * 1000;\n progress.remainingTime = Math.round((event.total - event.loaded) / speed) * 1000;\n }\n\n lastLoadEventTime.set(currentTime);\n lastLoadEventAmount.set(event.loaded);\n\n loading.set(state);\n };\n\n const httpRequest: HttpRequest<TArgs> = {\n execute,\n destroy,\n loading: loading.asReadonly(),\n error: error.asReadonly(),\n response: response.asReadonly(),\n currentEvent: currentEvent.asReadonly(),\n isStale,\n };\n\n return httpRequest;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { computed, effect, inject, Injector, runInInjectionContext, Signal, signal, untracked } from '@angular/core';\nimport { AnyNewQuery, RequestArgs, ResponseType } from './query';\nimport { AnyQueryCreator, QueryArgsOf, RunQueryCreator } from './query-creator';\nimport { QueryErrorResponse } from './query-error-response';\nimport { queryStackWithArgsUsed, queryStackWithResponseUpdateUsed } from './query-errors';\nimport { QueryFeature, QueryFeatureType, withArgs } from './query-features';\n\nexport type QueryStackSubtle<TCreator extends AnyQueryCreator, TQuery extends AnyNewQuery> = {\n /** Create a new query with the given arguments. You should always prefer the `args` option instead of this. */\n runWithArgs: (\n args: RequestArgs<QueryArgsOf<TCreator>> | RequestArgs<QueryArgsOf<TCreator>>[] | null,\n ) => TQuery | null;\n};\n\nexport type QueryStack<TQuery extends AnyNewQuery, TCreator extends AnyQueryCreator, TTransform> = {\n /** Contains all queries in the stack. */\n queries: Signal<TQuery[]>;\n\n /** Contains the first query in the stack. */\n firstQuery: Signal<TQuery | null>;\n\n /** Contains the last query in the stack. Useful for getting current pagination values. */\n lastQuery: Signal<TQuery | null>;\n\n /** True if any query in the stack is loading. */\n anyLoading: Signal<boolean>;\n\n /** Count of queries currently loading */\n loadingCount: Signal<number>;\n\n /** True if ALL queries are loading */\n allLoading: Signal<boolean>;\n\n /** Progress tracking */\n loadingProgress: Signal<{ loaded: number; total: number }>;\n\n /** Contains the first error that occurred in the stack. */\n anyError: Signal<QueryErrorResponse | null>;\n\n /** All errors from all queries */\n errors: Signal<QueryErrorResponse[]>;\n\n /** Contains the responses of all queries in the stack. Will be `null` for queries that are loading or errored. */\n response: Signal<TTransform>;\n\n /** Executes all queries in the stack. */\n execute: (options?: { allowCache?: boolean }) => void;\n\n /** Destroys all queries in the stack and empties it. This should only be used if `append` is true. */\n clear: () => void;\n\n /** Retry all queries that have errors */\n retryFailed: () => void;\n\n /** Advanced query stack features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */\n subtle: QueryStackSubtle<TCreator, TQuery>;\n};\n\nexport type AnyQueryStack = QueryStack<AnyNewQuery, AnyQueryCreator, any>;\n\nexport type CreateQueryStackOptions<\n TCreator extends AnyQueryCreator,\n TDeps extends () => any,\n TTransform = (ResponseType<QueryArgsOf<TCreator>> | null)[],\n> = {\n /**\n * The query creator function that will be used to create the query stack.\n */\n queryCreator: TCreator;\n\n /**\n * The dependencies that should trigger a new query stack creation.\n * This function can be treated like a computed function. It reacts to signal changes.\n * The return value of this function will be passed to the `args` function.\n *\n * This option can be ignored if `append` is false.\n */\n dependencies?: TDeps;\n\n /**\n * The features that should be used for all queries in the stack.\n *\n * @throws If the `withArgs` feature is used. This feature is internally used.\n *\n * @example\n * // Due to limitations in TypeScript, you have to manually add the needed generic types if needed.\n * features: [E.withSuccessHandling<GetPostQueryArgs>({ handler: (post) => console.log(post.title) })]\n *\n * @example\n * // If typings are not needed, you can use the feature without generics.\n * features: [E.withPolling({ interval: 5000 })]\n */\n features?: QueryFeature<any>[];\n\n /**\n * The arguments to create queries with.\n * This function can be treated like a computed function. It reacts to signal changes.\n * If a signal changes, a new query will be created (and appended to the existing ones if `append` is true).\n * If this function returns `null`, the args will be ignored.\n * If this function returns an array, multiple queries will be created.\n *\n * @example\n * // One query\n * () => ({ queryParams: { postId: myId() } }),\n *\n * @example\n * // Multiple queries (these can of cause also be created using a loop)\n * () => [\n * { queryParams: { postId: myId() } },\n * { queryParams: { postId: myOtherId() } },\n * ],\n *\n * @example\n * // One query with dependencies\n * (deps) => ({ queryParams: { postId: myId(), limit: deps.limit } }),\n */\n args: (deps: ReturnType<TDeps>) => RequestArgs<QueryArgsOf<TCreator>> | RequestArgs<QueryArgsOf<TCreator>>[] | null;\n\n /**\n * If true, new queries will be appended to the existing ones. Otherwise, existing queries will be destroyed.\n * This should be used for things like infinite scrolling where already fetched queries should not be destroyed.\n */\n append?: boolean;\n\n /**\n * If append is true, this function will be called to merge the old and new queries.\n * Useful if you want to append the new queries in a specific order (e.g. at the beginning).\n */\n appendFn?: (\n oldQueries: RunQueryCreator<TCreator>[],\n newQueries: RunQueryCreator<TCreator>[],\n ) => {\n /** The new queries merged with the old ones. */\n queries: RunQueryCreator<TCreator>[];\n\n /** The last query in the new queries. */\n lastQuery: RunQueryCreator<TCreator> | null;\n };\n\n /**\n * Transforms the responses of all queries in the stack. Useful for merging or filtering responses.\n */\n transform?: (responses: ResponseType<QueryArgsOf<TCreator>>[]) => TTransform;\n\n /**\n * If true, prevents creating queries with identical args.\n * Useful for append mode to avoid duplicate data fetching.\n * @default true\n */\n deduplicateArgs?: boolean;\n\n /**\n * Custom function to generate a unique key from args for deduplication.\n * If not provided, uses JSON.stringify.\n */\n argsKeyFn?: (args: RequestArgs<QueryArgsOf<TCreator>> | null) => string;\n\n /**\n * Maximum number of queries to keep when append is true.\n * When limit is reached, queries will be removed based on removeStrategy.\n * @default Infinity\n */\n maxQueries?: number;\n\n /**\n * Strategy for removing queries when maxQueries is reached.\n * - 'oldest': Remove oldest queries first (FIFO)\n * - 'newest': Remove newest queries first (LIFO)\n * @default 'oldest'\n */\n removeStrategy?: 'oldest' | 'newest';\n};\n\n/** Transforms an array of arrays into a single array and filters out `null` values. */\nexport const transformArrayResponse = <T extends (unknown | null)[]>(responses: T) =>\n responses.filter((r) => !!r).flatMap((r) => r) as NonNullable<T[0]>[];\n\n/** Transforms an array of paginated responses into a single array and filters out `null` values. */\nexport const transformPaginatedResponse = <T extends ({ items: unknown[] } | null)[]>(responses: T) =>\n responses.filter((r) => !!r).flatMap((r) => r.items) as NonNullable<NonNullable<T[0]>['items']>;\n\nexport const createQueryStack = <\n TCreator extends AnyQueryCreator,\n TArgs extends QueryArgsOf<TCreator>,\n TDeps extends () => any,\n TTransform = (ResponseType<TArgs> | null)[],\n>(\n options: CreateQueryStackOptions<TCreator, TDeps, TTransform>,\n) => {\n type QueryType = RunQueryCreator<TCreator>;\n\n const {\n args,\n queryCreator,\n dependencies,\n append,\n features = [],\n appendFn = (oldQueries: QueryType[], newQueries: QueryType[]) => {\n const queries = [...oldQueries, ...newQueries];\n const lastQuery = newQueries[newQueries.length - 1] ?? oldQueries[oldQueries.length - 1] ?? null;\n\n return { queries, lastQuery };\n },\n transform,\n argsKeyFn,\n deduplicateArgs,\n maxQueries = Infinity,\n removeStrategy = 'oldest',\n } = options ?? {};\n\n const injector = inject(Injector);\n\n const queries = signal<QueryType[]>([]);\n const lastQuery = signal<QueryType | null>(null);\n const firstQuery = computed(() => queries()[0] ?? null);\n\n const hasWithArgsFeature = features.some((f) => f.type == QueryFeatureType.WITH_ARGS);\n const hasWithOptimisticUpdateFeature = features.some((f) => f.type == QueryFeatureType.WITH_RESPONSE_UPDATE);\n\n if (hasWithArgsFeature) {\n throw queryStackWithArgsUsed();\n }\n\n if (hasWithOptimisticUpdateFeature) {\n throw queryStackWithResponseUpdateUsed();\n }\n\n const runWithArgs = (args: RequestArgs<QueryArgsOf<TCreator>> | RequestArgs<QueryArgsOf<TCreator>>[] | null) => {\n if (args === null) return null;\n\n return untracked(() => {\n const newArgsArray = Array.isArray(args) ? args : [args];\n\n let filteredArgs = newArgsArray;\n if (deduplicateArgs !== false && append) {\n const keyFn = argsKeyFn ?? ((a) => JSON.stringify(a));\n const existingKeys = new Set(\n queries().map((q) => keyFn(q.args() as RequestArgs<QueryArgsOf<TCreator>> | null)),\n );\n\n filteredArgs = newArgsArray.filter((a) => {\n const key = keyFn(a);\n if (existingKeys.has(key)) return false;\n existingKeys.add(key);\n return true;\n });\n }\n\n const newQueries = runInInjectionContext(injector, () =>\n filteredArgs.map(\n (newArgsEntry) =>\n queryCreator(\n withArgs(() => newArgsEntry),\n ...features,\n ) as QueryType,\n ),\n );\n\n const oldQueries = queries();\n\n if (append) {\n const { queries: appendedQueries, lastQuery: lastAppendedQuery } = appendFn(oldQueries, newQueries);\n\n let finalQueries = appendedQueries;\n if (maxQueries && finalQueries.length > maxQueries) {\n const excessCount = finalQueries.length - maxQueries;\n\n const queriesToRemove =\n removeStrategy === 'newest' ? finalQueries.slice(-excessCount) : finalQueries.slice(0, excessCount);\n\n queriesToRemove.forEach((q) => q.subtle.destroy());\n\n finalQueries =\n removeStrategy === 'newest' ? finalQueries.slice(0, maxQueries) : finalQueries.slice(-maxQueries);\n }\n\n queries.set(finalQueries);\n lastQuery.set(lastAppendedQuery);\n return lastAppendedQuery;\n } else {\n const keyFn = argsKeyFn ?? ((a) => JSON.stringify(a));\n const newArgsKeys = new Set(newArgsArray.map((a) => keyFn(a)));\n\n const preservedQueries = oldQueries.filter((oldQuery) => {\n const oldKey = keyFn(oldQuery.args() as RequestArgs<QueryArgsOf<TCreator>> | null);\n return newArgsKeys.has(oldKey);\n });\n\n const preservedMap = new Map(\n preservedQueries.map((q) => [keyFn(q.args() as RequestArgs<QueryArgsOf<TCreator>> | null), q]),\n );\n\n const finalQueries = newArgsArray.map((newArgsEntry) => {\n const key = keyFn(newArgsEntry);\n const preserved = preservedMap.get(key);\n\n if (preserved) {\n return preserved;\n }\n\n return runInInjectionContext(\n injector,\n () =>\n queryCreator(\n withArgs(() => newArgsEntry),\n ...features,\n ) as QueryType,\n );\n });\n\n for (const oldQuery of oldQueries) {\n if (!finalQueries.includes(oldQuery)) {\n oldQuery.subtle.destroy();\n }\n }\n\n queries.set(finalQueries);\n\n const last = finalQueries[finalQueries.length - 1] ?? null;\n\n lastQuery.set(last);\n\n return last;\n }\n });\n };\n\n const clear = () => {\n for (const query of queries()) {\n query.subtle.destroy();\n }\n\n queries.set([]);\n lastQuery.set(null);\n };\n\n effect(() => {\n dependencies?.();\n\n untracked(() => clear());\n });\n\n effect(() => runWithArgs(args(dependencies?.())));\n\n const anyLoading = computed(() => queries().some((q) => q.loading()));\n\n const loadingCount = computed(() => queries().filter((q) => q.loading()).length);\n\n const allLoading = computed(() => {\n const qs = queries();\n return qs.length > 0 && qs.every((q) => q.loading());\n });\n\n const loadingProgress = computed(() => {\n const total = queries().length;\n const loaded = queries().filter((q) => !q.loading()).length;\n return { loaded, total };\n });\n\n const anyError = computed(\n () =>\n queries()\n .map((q) => q.error())\n .find((e) => e !== null) ?? null,\n );\n\n const errors = computed(() =>\n queries()\n .map((q) => q.error())\n .filter((e): e is QueryErrorResponse => e !== null),\n );\n\n const response = computed(() => {\n const responses = queries().map((q) => q.response());\n return transform?.(responses) ?? responses;\n }) as Signal<TTransform>;\n\n const execute = (options?: { allowCache?: boolean }) => {\n for (const query of queries()) {\n query.execute({ options: { allowCache: options?.allowCache } });\n }\n };\n\n const retryFailed = () => {\n for (const query of queries()) {\n if (query.error()) {\n query.execute({ options: { allowCache: false } });\n }\n }\n };\n\n const stack: QueryStack<QueryType, TCreator, TTransform> = {\n queries: queries.asReadonly(),\n lastQuery: lastQuery.asReadonly(),\n firstQuery,\n anyLoading,\n loadingCount,\n allLoading,\n loadingProgress,\n anyError,\n errors,\n response,\n execute,\n clear,\n retryFailed,\n subtle: {\n runWithArgs,\n },\n };\n\n return stack;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { computed, effect, isDevMode, Signal, signal, untracked } from '@angular/core';\nimport {\n ContentfulGqlLikePaginated,\n DynLikePaginated,\n GgLikePaginated,\n NormalizedPagination,\n Paginated,\n} from '@ethlete/types';\nimport { AnyNewQuery, Query, QueryArgs, RequestArgs, ResponseType } from './query';\nimport { AnyQueryCreator, QueryArgsOf, QueryCreator } from './query-creator';\nimport { QueryErrorResponse } from './query-error-response';\nimport {\n pagedQueryStackNextPageCalledWithoutPreviousPage,\n pagedQueryStackPageBiggerThanTotalPages,\n pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage,\n queryStackTotalQueriesAndExpectedQueriesMismatch,\n} from './query-errors';\nimport { QueryFeature } from './query-features';\nimport { shouldRetryRequest } from './query-retry-utils';\nimport { createQueryStack, transformArrayResponse } from './query-stack';\n\nexport const ethletePaginationAdapter = <T>(response: Paginated<T>) => {\n const pagination: NormalizedPagination<T> = {\n items: response.items,\n totalPages: response.totalPageCount,\n currentPage: response.currentPage,\n itemsPerPage: response.itemsPerPage,\n totalHits: response.totalHits,\n };\n\n return pagination;\n};\n\nexport const ggLikePaginationAdapter = <T>(response: GgLikePaginated<T>) => {\n const pagination: NormalizedPagination<T> = {\n items: response.items,\n totalPages: response.totalPageCount,\n currentPage: response.currentPage,\n itemsPerPage: response.itemsPerPage,\n totalHits: response.totalHits,\n };\n\n return pagination;\n};\n\nexport const dynLikePaginationAdapter = <T>(response: DynLikePaginated<T>) => {\n const pagination: NormalizedPagination<T> = {\n items: response.items,\n totalPages: response.totalPages,\n currentPage: response.currentPage,\n itemsPerPage: response.limit,\n totalHits: response.totalHits,\n };\n\n return pagination;\n};\n\nexport const contentfulGqlLikePaginationAdapter = <T>(response: ContentfulGqlLikePaginated<T>) => {\n const totalPages = Math.max(Math.ceil(response.total / response.limit), 1); // If there are no items, there is still one page\n const currentPage = Math.max(Math.ceil(response.skip / response.limit) + 1, 1);\n\n const pagination: NormalizedPagination<T> = {\n items: response.items,\n totalPages,\n currentPage,\n itemsPerPage: response.limit,\n totalHits: response.total,\n };\n\n return pagination;\n};\n\nexport const fakePaginationAdapter = (totalHits = 10) => {\n return <T>(response: T) => {\n const pagination: NormalizedPagination<T> = {\n items: [response],\n totalPages: totalHits,\n currentPage: 1,\n itemsPerPage: 1,\n totalHits,\n };\n\n return pagination;\n };\n};\n\nexport type CreatePagedQueryStackOptions<\n TArgs extends QueryArgs,\n TNormPagination extends NormalizedPagination<unknown>,\n> = {\n /**\n * The normalizer function that will be used to normalize the response to a format that the paged query can understand.\n *\n * There are some built-in normalizers that can be used:\n * - `ethletePaginationAdapter`\n * - `ggLikePaginationAdapter`\n * - `dynLikePaginationAdapter`\n * - `contentfulGqlLikePaginationAdapter`\n * - `fakePaginationAdapter` (for testing purposes)\n *\n * @param currentResponse The current response that was fetched.\n * @param allResponses All responses that were fetched till now including the current response and pagination.\n */\n responseNormalizer: (\n currentResponse: ResponseType<TArgs>,\n allResponses: NonNullable<ResponseType<TArgs>>[],\n ) => TNormPagination;\n\n /**\n * The query creator function that will be used to create the paged query.\n */\n queryCreator: QueryCreator<TArgs>;\n\n /**\n * The arguments to create the query.\n * The current page will be passed as an argument.\n * This function can be treated like a computed function. It reacts to signal changes.\n * If a signal changes, the paged query will be reset to the initial page.\n *\n * @example (page) => ({ queryParams: { page, limit:20 } }),\n *\n * @param page The page to fetch next. **Do not modify this argument.**\n * @param allResponses All responses that were fetched till now including pagination.\n */\n args: (page: number, allResponses: NonNullable<ResponseType<TArgs>>[]) => RequestArgs<TArgs> | null;\n\n /**\n * The features that should be used for all queries in the stack.\n *\n * @throws If the `withArgs` feature is used. This feature is internally used.\n *\n * @example\n * // Due to limitations in TypeScript, you have to manually add the needed generic types if needed.\n * features: [E.withSuccessHandling<GetPostQueryArgs>({ handler: (post) => console.log(post.title) })]\n *\n * @example\n * // If typings are not needed, you can use the feature without generics.\n * features: [E.withPolling({ interval: 5000 })]\n */\n features?: QueryFeature<any>[];\n\n /**\n * The page to start this paged query from.\n * @default 1\n */\n initialPage?: number;\n\n /**\n * If true, no queries will be executed while the paged query is loading.\n * This is useful if you need the current response to be used in the next query.\n */\n blockExecutionDuringLoading?: boolean;\n};\n\nexport type PagedQueryStackResetOptions = {\n /**\n * The page to reset this paged query to.\n * This will clear everything and start from this page.\n * @default 1 // or the value passed in the `initialPage` option when creating the paged query.\n */\n initialPage?: number;\n};\n\nexport type PagedQueryStackExecuteOptions<TNormPagination extends NormalizedPagination<unknown>> = {\n /**\n * If provided, only the queries that match the condition will be executed.\n * This will also execute the previous and next query to the one that matched the condition.\n * If not provided, all queries will be executed.\n *\n * @example\n * myPagedQuery.execute({ where: (item) => item.id === 4 });\n */\n where?: (item: TNormPagination['items'][number], index: number, array: TNormPagination['items']) => boolean;\n\n /**\n * If true, the cache will be used (if not expired) and the request will not be made.\n * @default false\n */\n allowCache?: boolean;\n};\n\nexport type PagedQueryStackDirection = 'next' | 'previous';\n\nexport type AnyPagedQueryStack = PagedQueryStack<AnyNewQuery, NormalizedPagination<unknown>>;\n\nexport type PagedQueryStack<TQuery extends AnyNewQuery, TNormPagination extends NormalizedPagination<unknown>> = {\n /**\n * The pagination of the last executed query in the paged query.\n */\n maxPagination: Signal<TNormPagination | null>;\n\n /**\n * The pagination of the first executed query in the paged query.\n */\n minPagination: Signal<TNormPagination | null>;\n\n /**\n * Whether the last page of the paged query is loaded or not.\n */\n isLastPageLoaded: Signal<boolean>;\n\n /**\n * Whether the first page of the paged query is loaded or not.\n */\n isFirstPageLoaded: Signal<boolean>;\n\n /**\n * Fetches the previous page of the paged query.\n *\n * @throws If the paged query is already at the first page.\n */\n fetchPreviousPage: () => TQuery | null;\n\n /**\n * Fetches the next page of the paged query.\n *\n * @throws If the paged query is already at the last page.\n */\n fetchNextPage: () => TQuery | null;\n\n /**\n * Whether the previous page can be fetched or not.\n *\n * This will be false if the paged query is already at the first page or if the paged query is loading.\n */\n canFetchPreviousPage: Signal<boolean>;\n\n /**\n * Whether the next page can be fetched or not.\n *\n * This will be false if the paged query is already at the last page or if the paged query is loading.\n */\n canFetchNextPage: Signal<boolean>;\n\n /**\n * The items of the paged query.\n */\n items: Signal<TNormPagination['items']>;\n\n /**\n * Whether the paged query is loading or not.\n */\n loading: Signal<boolean>;\n\n /**\n * The error that occurred during the last execution of the paged query.\n */\n error: Signal<QueryErrorResponse | null>;\n\n /**\n * The last query executed in the paged query.\n */\n lastQuery: Signal<Query<QueryArgsOf<TQuery>> | null>;\n\n /**\n * Whether the paged query is on its first load or not.\n */\n isFirstLoad: Signal<boolean>;\n\n /**\n * The queries in the paged query stack.\n */\n queries: Signal<TQuery[]>;\n\n /**\n * Resets the paged query to the initial page.\n */\n reset: (resetOptions?: PagedQueryStackResetOptions) => void;\n\n /**\n * Executes the paged query.\n */\n execute: (options?: PagedQueryStackExecuteOptions<TNormPagination>) => void;\n\n /**\n * The current direction of the paged query.\n */\n direction: Signal<PagedQueryStackDirection>;\n};\n\nexport const createPagedQueryStack = <\n TCreator extends AnyQueryCreator,\n TArgs extends QueryArgsOf<TCreator>,\n TNormPagination extends NormalizedPagination<unknown>,\n>(\n options: CreatePagedQueryStackOptions<TArgs, TNormPagination>,\n) => {\n const { responseNormalizer, queryCreator, features } = options;\n\n const currentPageArgs = signal<RequestArgs<TArgs> | null>(null);\n const initialPage = signal(options.initialPage ?? 1);\n const loadedMinPage = signal(initialPage());\n const loadedMaxPage = signal(initialPage());\n const lastResetTimestamp = signal(Date.now());\n\n const pageDirection = signal<PagedQueryStackDirection>('next');\n\n const stack = createQueryStack({\n args: () => null,\n queryCreator,\n append: true,\n features,\n appendFn: (oldQueries, newQueries) => {\n const newQuery = newQueries[0];\n const dir = pageDirection();\n\n if (!newQuery) {\n const lastQuery = oldQueries[oldQueries.length - 1] ?? null;\n return { queries: oldQueries, lastQuery };\n } else if (dir === 'previous') {\n return { queries: [newQuery, ...oldQueries], lastQuery: newQuery };\n } else {\n return { queries: [...oldQueries, newQuery], lastQuery: newQuery };\n }\n },\n transform: transformArrayResponse,\n });\n\n effect(() => {\n lastResetTimestamp();\n\n const args = options.args(initialPage(), []);\n\n untracked(() => {\n stack.clear();\n currentPageArgs.set(args);\n loadedMinPage.set(initialPage());\n loadedMaxPage.set(initialPage());\n stack.subtle.runWithArgs(args);\n });\n });\n\n const maxPagination = computed(() => {\n const res = stack.lastQuery()?.response();\n const all = stack.response();\n\n if (!res) return null;\n\n return responseNormalizer(res, all);\n });\n\n const minPagination = computed(() => {\n const res = stack.firstQuery()?.response();\n const all = stack.response();\n\n if (!res) return null;\n\n return responseNormalizer(res, all);\n });\n\n const isFirstPageLoaded = computed(() => {\n const min = minPagination();\n\n return min ? loadedMinPage() === min.currentPage : false;\n });\n\n const isLastPageLoaded = computed(() => {\n const max = maxPagination();\n\n return max ? loadedMaxPage() === max.totalPages : false;\n });\n\n const fetchPreviousPage = () => {\n const page = loadedMinPage() - 1;\n const allResponses = stack.response();\n\n if (!canFetchNewPage(page)) {\n return null;\n }\n\n if (page < 1) {\n if (isDevMode()) {\n throw pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage();\n }\n\n return null;\n }\n\n currentPageArgs.set(options.args(page, allResponses));\n loadedMinPage.set(page);\n pageDirection.set('previous');\n\n return stack.subtle.runWithArgs(currentPageArgs());\n };\n\n const fetchNextPage = () => {\n const page = loadedMaxPage() + 1;\n const currentPagination = maxPagination();\n const allResponses = stack.response();\n\n if (!canFetchNewPage(page)) {\n return null;\n }\n\n if (!currentPagination) {\n if (isDevMode()) {\n throw pagedQueryStackNextPageCalledWithoutPreviousPage();\n }\n\n return null;\n }\n\n if (page > currentPagination.totalPages) {\n if (isDevMode()) {\n throw pagedQueryStackPageBiggerThanTotalPages(page, currentPagination.totalPages);\n }\n\n return null;\n }\n\n currentPageArgs.set(options.args(page, allResponses));\n loadedMaxPage.set(page);\n pageDirection.set('next');\n\n return stack.subtle.runWithArgs(currentPageArgs());\n };\n\n const canFetchNewPage = (pageToLoad: number) => {\n const currentMaxPagination = maxPagination();\n const currentMinPagination = minPagination();\n\n if (!currentMaxPagination || !currentMinPagination) {\n return true;\n }\n\n const isOneMinusMinPagination = pageToLoad === currentMinPagination.currentPage - 1;\n const isOnePlusMaxPagination = pageToLoad === currentMaxPagination.currentPage + 1;\n\n if (!options.blockExecutionDuringLoading) {\n const totalQueries = stack.queries().length;\n const expectedQueries = Math.abs(loadedMaxPage() - loadedMinPage()) + 1;\n\n if (totalQueries !== expectedQueries) {\n if (isDevMode()) {\n throw queryStackTotalQueriesAndExpectedQueriesMismatch(totalQueries, expectedQueries);\n }\n }\n\n return true;\n }\n\n if (stack.anyLoading()) {\n return false;\n }\n\n return isOneMinusMinPagination || isOnePlusMaxPagination;\n };\n\n const reset = (resetOptions?: PagedQueryStackResetOptions) => {\n const page = resetOptions?.initialPage ?? initialPage();\n\n initialPage.set(page);\n pageDirection.set('next');\n lastResetTimestamp.set(Date.now());\n };\n\n const canFetchPreviousPage = computed(() => {\n const currentMinPagination = minPagination();\n\n if (!currentMinPagination) return false;\n\n return loadedMinPage() > 1;\n });\n const canFetchNextPage = computed(() => {\n const currentMaxPagination = maxPagination();\n\n return currentMaxPagination ? loadedMaxPage() < currentMaxPagination.totalPages : false;\n });\n\n const items = computed(() => {\n const res = stack.response();\n return res.map((r) => responseNormalizer(r, res).items).flat();\n });\n\n const isFirstLoad = computed(() => {\n return stack.queries().length === 1 && !!stack.lastQuery()?.loading();\n });\n\n const execute = (options?: PagedQueryStackExecuteOptions<TArgs>) => {\n const whereFn = options?.where;\n\n if (whereFn) {\n const queriesToExecute = new Set<Query<TArgs>>();\n const all = stack.response();\n\n for (const [index, query] of stack.queries().entries()) {\n const res = query.response();\n const err = query.error();\n const isErroredAndCanBeRetried = err && shouldRetryRequest(err.raw);\n\n if (isErroredAndCanBeRetried) {\n queriesToExecute.add(query);\n } else if (res) {\n if (responseNormalizer(res, all).items.some((item, i, a) => whereFn(item, i, a))) {\n queriesToExecute.add(query);\n\n // Also execute the previous and next query to the one that matched the condition.\n\n if (index !== 0) {\n const prevQuery = stack.queries()[index - 1];\n\n if (prevQuery) {\n queriesToExecute.add(prevQuery);\n }\n }\n\n if (index !== stack.queries().length - 1) {\n const nextQuery = stack.queries()[index + 1];\n\n if (nextQuery) {\n queriesToExecute.add(nextQuery);\n }\n }\n }\n }\n }\n\n for (const query of queriesToExecute) {\n query.execute({ options: { allowCache: options.allowCache } });\n }\n } else {\n stack.execute({ allowCache: options?.allowCache });\n }\n };\n\n const pagedQuery: PagedQueryStack<Query<TArgs>, TNormPagination> = {\n maxPagination,\n minPagination,\n fetchPreviousPage,\n fetchNextPage,\n canFetchPreviousPage,\n canFetchNextPage,\n items,\n direction: pageDirection.asReadonly(),\n loading: stack.anyLoading,\n error: stack.anyError,\n lastQuery: stack.lastQuery,\n isFirstLoad,\n queries: stack.queries,\n isLastPageLoaded,\n isFirstPageLoaded,\n reset,\n execute,\n };\n\n return pagedQuery;\n};\n","import { AuthProvider, AuthProviderCustomHeaderConfig } from './auth-provider.types';\n\nexport class CustomHeaderAuthProvider implements AuthProvider {\n get header() {\n return { [this._config.name]: this._config.value };\n }\n\n constructor(public _config: AuthProviderCustomHeaderConfig) {}\n\n cleanUp(): void {\n // noop\n }\n}\n","import { AuthProvider, AuthProviderBasicConfig } from './auth-provider.types';\n\nexport class BasicAuthProvider implements AuthProvider {\n get header() {\n return { Authorization: `Basic ${this._basicAuthString}` };\n }\n\n private get _basicAuthString() {\n return btoa(`${this._config.username}:${this._config.password}`);\n }\n\n constructor(public _config: AuthProviderBasicConfig) {}\n\n cleanUp(): void {\n // noop\n }\n}\n","import {\n CreateComputedOptions,\n Injector,\n Signal,\n assertInInjectionContext,\n computed,\n effect,\n inject,\n linkedSignal,\n runInInjectionContext,\n signal,\n untracked,\n} from '@angular/core';\nimport { ToObservableOptions, ToSignalOptions, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { computedTillTruthy, createDestroy } from '@ethlete/core';\nimport { Observable, Subscribable, of, pairwise, startWith, switchMap, takeUntil, tap } from 'rxjs';\nimport { AnyLegacyQuery } from '../interop';\nimport {\n AnyQueryCollection,\n AnyV2Query,\n QueryOf,\n QueryStateType,\n V2QueryState,\n extractQuery,\n filterQueryStates,\n isQuery,\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStateSuccess,\n} from '../query';\nimport { QueryDataOf } from '../query-creator';\n\nexport type QueryContainerConfig = {\n /**\n * If `true`, the previous query will be aborted when a new query is pushed into the container.\n * @default true // Only if the request can be cached (GET, OPTIONS, HEAD and GQL_QUERY). Otherwise false.\n */\n abortPrevious?: boolean;\n\n /**\n * If `true`, the query will be aborted when the container is destroyed.\n * @default true // Only if the request can be cached (GET, OPTIONS, HEAD and GQL_QUERY). Otherwise false.\n */\n abortOnDestroy?: boolean;\n\n /**\n * If `true`, the previous polling will be stopped when a new query is pushed into the container.\n * @default true // Only if the query has no other dependents and the request can be cached (GET, OPTIONS, HEAD and GQL_QUERY). Otherwise false.\n */\n stopPreviousPolling?: boolean;\n};\n\nexport type QueryFilterConfig = {\n /**\n * If `true`, the response will be cached until the next response is received or the query fails.\n * @default false\n */\n cacheResponse?: boolean;\n};\n\nexport const addQueryContainerHandling = (\n obs: Observable<AnyV2Query | AnyV2Query[] | AnyLegacyQuery | AnyLegacyQuery[] | null>,\n valueFn: () => AnyV2Query | AnyV2Query[] | AnyLegacyQuery | AnyLegacyQuery[] | null | undefined,\n config?: QueryContainerConfig,\n) => {\n assertInInjectionContext(addQueryContainerHandling);\n\n const { abortPrevious, abortOnDestroy, stopPreviousPolling } = config ?? {};\n\n const injector = inject(Injector);\n const destroy$ = createDestroy();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tNode = (injector as any)._tNode;\n const componentId = tNode?.index ?? -1;\n\n obs\n .pipe(\n takeUntil(destroy$),\n startWith(null),\n pairwise(),\n tap(([prevQuery, currQuery]) => {\n const cleanQuery = (q: AnyV2Query | AnyLegacyQuery | null | undefined) => {\n if (!q?._hasDependents() && ((abortPrevious === undefined && q?.canBeCached) || abortPrevious)) {\n q?.abort();\n }\n\n if (\n !q?._hasDependents() &&\n ((stopPreviousPolling === undefined && q?.canBeCached) || stopPreviousPolling) &&\n q?.isPolling\n ) {\n q?.stopPolling();\n }\n\n (q as unknown as AnyLegacyQuery)?.destroy?.();\n };\n\n if ((isQuery(prevQuery) || prevQuery === null) && (isQuery(currQuery) || currQuery === null)) {\n prevQuery?._removeDependent(componentId);\n currQuery?._addDependent(componentId);\n\n cleanQuery(prevQuery);\n } else if (\n (Array.isArray(prevQuery) || prevQuery === null) &&\n (Array.isArray(currQuery) || currQuery === null)\n ) {\n if (prevQuery) {\n for (let i = 0; i < prevQuery.length; i++) {\n prevQuery[i]?._removeDependent(componentId);\n }\n }\n\n if (currQuery) {\n for (let i = 0; i < currQuery.length; i++) {\n currQuery[i]?._addDependent(componentId);\n }\n }\n\n if (prevQuery) {\n for (let i = 0; i < prevQuery.length; i++) {\n cleanQuery(prevQuery[i]);\n }\n }\n } else if (\n (isQuery(prevQuery) && Array.isArray(currQuery)) ||\n (Array.isArray(prevQuery) && isQuery(currQuery))\n ) {\n throw new Error('Cannot mix queries and arrays of queries in the same query container.');\n }\n }),\n )\n .subscribe();\n\n destroy$.subscribe(() => {\n const query = valueFn();\n\n const handleQuery = (q: AnyV2Query | AnyLegacyQuery | null | undefined) => {\n q?._removeDependent(componentId);\n\n if (!q?._hasDependents() && ((q?.canBeCached && abortOnDestroy === undefined) || abortOnDestroy)) {\n q?.abort();\n (q as unknown as AnyLegacyQuery)?.destroy?.();\n }\n };\n\n if (isQuery(query)) {\n handleQuery(query);\n } else if (Array.isArray(query)) {\n for (const q of query) {\n handleQuery(q);\n }\n }\n });\n};\n\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Observable<T> | Subscribable<T>,\n): Signal<T | undefined>;\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Observable<T> | Subscribable<T>,\n options: NoInfer<ToSignalOptions<T | undefined>> & {\n initialValue?: undefined;\n requireSync?: false;\n } & QueryContainerConfig,\n): Signal<T | undefined>;\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Observable<T> | Subscribable<T>,\n options: NoInfer<ToSignalOptions<T | null>> & {\n initialValue?: null;\n requireSync?: false;\n } & QueryContainerConfig,\n): Signal<T | null>;\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Observable<T> | Subscribable<T>,\n options: NoInfer<ToSignalOptions<T>> & {\n initialValue?: undefined;\n requireSync: true;\n } & QueryContainerConfig,\n): Signal<T>;\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null, const U extends T>(\n source: Observable<T> | Subscribable<T>,\n options: NoInfer<ToSignalOptions<T | U>> & {\n initialValue: U;\n requireSync?: false;\n } & QueryContainerConfig,\n): Signal<T | U>;\n\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null, U = undefined>(\n source: Observable<T> | Subscribable<T>,\n options?: ToSignalOptions<T | U> & { initialValue?: U } & QueryContainerConfig,\n): Signal<T | U> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = toSignal(source, options as any);\n\n addQueryContainerHandling(source as Observable<T>, () => s() as T, options);\n\n return s as Signal<T | U>;\n}\n\nexport function effectComputed<T extends AnyV2Query | AnyLegacyQuery | AnyV2Query[] | AnyLegacyQuery[] | null>(\n computation: () => T,\n injector: Injector,\n) {\n let initialData = null;\n\n try {\n initialData = runInInjectionContext(injector, () => computation());\n } catch {\n // Ignore errors in the initial computation\n // Angular might throw an error if required inputs are read but not available yet\n }\n\n const lastResult = signal<T>(initialData as T);\n\n effect(() => {\n const data = runInInjectionContext(injector, () => computation());\n\n untracked(() => {\n if (data === lastResult()) return;\n\n lastResult.set(data);\n });\n });\n\n return lastResult.asReadonly();\n}\n\nexport function queryComputed<T extends AnyV2Query | AnyLegacyQuery | null>(\n computation: () => T,\n options?: CreateComputedOptions<T> & QueryContainerConfig & ToObservableOptions,\n): Signal<T> {\n const injector = inject(Injector);\n\n const c = effectComputed(computation, injector);\n const obs = toObservable(c, options);\n\n addQueryContainerHandling(obs, () => c(), options);\n\n return c;\n}\n\n/**\n * Creates a signal that will only be reactive until the first query is created.\n * All subsequent changes inside the computation will be ignored.\n */\nexport function queryComputedTillTruthy<T extends AnyV2Query | AnyLegacyQuery | null>(\n computation: () => T,\n options?: CreateComputedOptions<T> & QueryContainerConfig & ToObservableOptions,\n): Signal<T | null> {\n const injector = inject(Injector);\n\n const c = computedTillTruthy(effectComputed(computation, injector));\n const obs = toObservable(c, options);\n\n addQueryContainerHandling(obs, () => c(), options);\n\n return c;\n}\n\nexport function queryArrayComputed<T extends AnyV2Query[] | AnyLegacyQuery[] | null>(\n computation: () => T,\n options?: CreateComputedOptions<T> & QueryContainerConfig & ToObservableOptions,\n): Signal<T> {\n const injector = inject(Injector);\n\n const c = effectComputed(computation, injector);\n const obs = toObservable(c, options);\n\n addQueryContainerHandling(obs, () => c(), options);\n\n return c;\n}\n\nexport function toQuerySubject<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Signal<T>,\n options?: ToObservableOptions & QueryContainerConfig,\n): Observable<T> {\n const obs = toObservable(source, options);\n\n addQueryContainerHandling(obs, () => source(), options);\n\n return obs;\n}\n\nexport function queryStateSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>>(\n source: T,\n options?: QueryFilterConfig,\n) {\n const { cacheResponse } = options ?? {};\n\n const roSignal = toSignal(\n toObservable(source).pipe(\n switchMap((q) => extractQuery(q)?.state$ ?? of(null)),\n switchMap((state) => {\n if (cacheResponse) {\n return of(state).pipe(filterQueryStates([QueryStateType.Success, QueryStateType.Failure]));\n }\n\n return of(state);\n }),\n ),\n {\n initialValue: null,\n },\n ) as Signal<V2QueryState<QueryDataOf<QueryOf<ReturnType<T>>>> | null>;\n\n const rwSignal = linkedSignal<V2QueryState<QueryDataOf<QueryOf<ReturnType<T>>>> | null>(roSignal);\n\n return rwSignal;\n}\n\nexport type QueryStateSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>> =\n Signal<QueryDataOf<QueryOf<ReturnType<T>>> | null> & { reset: () => void };\n\nexport function queryStateResponseSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>>(\n source: T,\n options?: QueryFilterConfig,\n) {\n const s = queryStateSignal(source, options);\n\n const dataSignal = computed(() => {\n const state = s();\n\n return isQueryStateSuccess(state) ? state.response : null;\n });\n\n (dataSignal as QueryStateSignal<T>)['reset'] = () => {\n s.set(null);\n };\n\n return dataSignal as QueryStateSignal<T>;\n}\n\nexport function queryStateErrorSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>>(\n source: T,\n) {\n const s = queryStateSignal(source);\n\n return computed(() => {\n const state = s();\n\n return isQueryStateFailure(state) ? state.error : null;\n });\n}\n\nexport function queryStateLoadingSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>>(\n source: T,\n) {\n const s = queryStateSignal(source);\n\n return computed(() => {\n const state = s();\n\n return isQueryStateLoading(state) ? state : null;\n });\n}\n","export const deepFreeze = <T extends Record<string, unknown>>(object: T) => {\n // check if object is actually an object or frozen\n if (!object || typeof object !== 'object' || Object.isFrozen(object)) {\n return object;\n }\n\n // Retrieve the property names defined on object\n const propNames = Object.getOwnPropertyNames(object);\n\n // Freeze properties before freezing self\n\n for (const name of propNames) {\n const value = object[name];\n\n if (value && typeof value === 'object') {\n deepFreeze(value as T);\n }\n }\n\n return Object.freeze(object);\n};\n","/**\n * Dummy function for providing types while not breaking inference.\n * **This function always returns null.**\n * @see https://github.com/microsoft/TypeScript/issues/26242\n * @returns null\n */\nexport const def = <Data>() => null as unknown as Data;\n","import { assertInInjectionContext, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject } from 'rxjs';\nimport { EntityStore } from '../entity';\nimport { V2Query, computeQueryQueryParams } from '../query';\nimport { V2QueryClient, v2BuildQueryCacheKey, v2ShouldCacheQuery } from '../query-client';\nimport { QueryStore } from '../query-store';\nimport {\n AnyRoute,\n BaseArguments,\n GqlQueryConfig,\n RestQueryConfig,\n V2RouteType,\n WithConfig,\n WithHeaders,\n WithMock,\n} from '../query/query.types';\nimport { buildRoute } from '../request';\nimport { QueryContainerConfig, addQueryContainerHandling } from '../utils';\nimport { QueryPrepareFn } from './query-creator.types';\n\nexport class V2QueryCreator<\n Arguments extends BaseArguments | undefined,\n Response,\n Route extends V2RouteType<Arguments>,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n> {\n constructor(\n private _queryConfig:\n | RestQueryConfig<Route, Response, Arguments, Store, Data, Id>\n | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>,\n private _client: V2QueryClient,\n private _store: QueryStore,\n ) {}\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n prepare: QueryPrepareFn<Arguments, Response, Route, Store, Data, Id> = (\n args?: Arguments & WithHeaders & WithConfig & WithMock<Response>,\n ) => {\n const route = buildRoute({\n base: this._client.config.baseRoute,\n route: this._queryConfig.route as AnyRoute,\n pathParams: args?.pathParams,\n queryParams: computeQueryQueryParams({ config: this._queryConfig, client: this._client, args }),\n queryParamConfig: this._client.config.request?.queryParams,\n }) as Route;\n\n const cacheKey = (args?.config?.queryStoreCacheKey ?? '') + v2BuildQueryCacheKey(route as string, args);\n\n if (v2ShouldCacheQuery(this._queryConfig.method) && !args?.config?.skipQueryStore) {\n const existingQuery = this._store.get<V2Query<Response, Arguments, Route, Store, Data, Id>>(cacheKey);\n\n if (existingQuery) {\n return existingQuery;\n }\n }\n\n const query = new V2Query<Response, Arguments, Route, Store, Data, Id>(\n this._client,\n this._queryConfig,\n route,\n args ?? ({} as Arguments),\n cacheKey,\n );\n\n if (v2ShouldCacheQuery(this._queryConfig.method) && !args?.config?.skipQueryStore) {\n this._store.add(cacheKey, query);\n }\n\n this._store._dispatchQueryCreated(query);\n\n return query;\n };\n\n createSubject = (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => {\n assertInInjectionContext(this.createSubject);\n\n const subject = new BehaviorSubject<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n\n addQueryContainerHandling(subject, () => subject.getValue(), config);\n\n return subject;\n };\n\n createSignal = (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => {\n assertInInjectionContext(this.createSignal);\n\n const _signal = signal<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n\n addQueryContainerHandling(toObservable(_signal), () => _signal(), config);\n\n return _signal;\n };\n\n behaviorSubject = (initialValue?: ReturnType<typeof this.prepare> | null) =>\n new BehaviorSubject<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n}\n","import { Subject, fromEvent, take, takeUntil, timer } from 'rxjs';\nimport { AnyV2Query } from '../query';\n\nexport class QueryStore {\n /**\n * @internal\n */\n readonly _store = new Map<string, AnyV2Query>();\n\n private _garbageCollector: number | null = null;\n private _isInLowResourceMode = false;\n private _lastBlurTimestamp = Date.now();\n\n private _storeChange$ = new Subject<string>();\n private _queryCreated$ = new Subject<AnyV2Query>();\n\n readonly storeChange$ = this._storeChange$.asObservable();\n readonly queryCreated$ = this._queryCreated$.asObservable();\n\n constructor(\n private _config?: {\n enableChangeLogging?: boolean;\n enableGarbageCollectorLogging?: boolean;\n autoRefreshQueriesOnWindowFocus?: boolean;\n enableSmartPolling?: boolean;\n },\n ) {\n this._initSmartQueryHandling();\n }\n\n add(id: string, query: AnyV2Query) {\n this._store.set(id, query);\n\n this._initGarbageCollector();\n\n this._logState(id, query, 'SET');\n\n this._storeChange$.next(id);\n }\n\n get<T extends AnyV2Query>(id: string): T | null {\n return (this._store.get(id) as T) ?? null;\n }\n\n remove(id: string) {\n this._store.delete(id);\n\n this._logState(id, null, 'REMOVE');\n\n this._storeChange$.next(id);\n }\n\n forEach(callback: (value: AnyV2Query, key: string) => void) {\n for (const [key, query] of this._store) {\n callback(query, key);\n }\n }\n\n refreshQueriesInUse(config?: { ignoreCacheValidity?: boolean; purgeUnused?: boolean }) {\n const { ignoreCacheValidity, purgeUnused } = config ?? {};\n\n for (const [key, query] of this._store) {\n if (\n query.isInUse &&\n (query.isExpired || ignoreCacheValidity) &&\n query.autoRefreshOnConfig.queryClientDefaultHeadersChange\n ) {\n query.execute({ skipCache: true, _triggeredVia: 'auto' });\n } else if (purgeUnused && !query.isInUse) {\n this.remove(key);\n }\n }\n }\n\n /**\n * @internal\n */\n _dispatchQueryCreated(query: AnyV2Query) {\n this._queryCreated$.next(query);\n }\n\n private _initSmartQueryHandling() {\n const windowBlur$ = fromEvent<Event>(window, 'blur');\n const windowFocus$ = fromEvent<Event>(window, 'focus');\n\n windowBlur$.subscribe(() => {\n timer(5000)\n .pipe(takeUntil(windowFocus$), take(1))\n .subscribe(() => {\n this._lastBlurTimestamp = Date.now();\n this._isInLowResourceMode = true;\n this._stopGarbageCollector();\n\n if (this._config?.enableSmartPolling) {\n this.forEach((query) => {\n if (!query.isPolling || !query._enableSmartPolling) {\n return;\n }\n\n query.pausePolling();\n });\n }\n });\n });\n\n windowFocus$.subscribe(() => {\n if (!this._isInLowResourceMode) {\n return;\n }\n\n this._isInLowResourceMode = false;\n\n if (this._config?.enableSmartPolling || this._config?.autoRefreshQueriesOnWindowFocus) {\n this.forEach((query) => {\n if (this._config?.enableSmartPolling && query._isPollingPaused) {\n query.resumePolling();\n }\n\n if (Date.now() - this._lastBlurTimestamp > 15000) {\n if (\n this._config?.autoRefreshQueriesOnWindowFocus &&\n query.isExpired &&\n query.isInUse &&\n query.autoRefreshOnConfig.windowFocus\n ) {\n query.execute({ skipCache: true, _triggeredVia: 'auto' });\n }\n }\n });\n }\n\n this._initGarbageCollector();\n });\n }\n\n private _logState(key: string | null, item: AnyV2Query | null, operation: string) {\n if (!this._config?.enableChangeLogging) return;\n\n const stateAsJson: Record<string, AnyV2Query> = {};\n\n this._store.forEach((value, key) => {\n stateAsJson[key] = value;\n });\n\n console.log(`%c[${operation}] ${key}`, 'font-weight: bold');\n\n console.log({ operation, key, item });\n console.log(stateAsJson);\n }\n\n private _initGarbageCollector() {\n if (this._garbageCollector !== null) {\n return;\n }\n\n this._logGarbageCollector('Start');\n\n this._garbageCollector = window.setInterval(() => {\n this._runGarbageCollector();\n }, 15000);\n }\n\n private _stopGarbageCollector() {\n if (this._garbageCollector !== null) {\n window.clearInterval(this._garbageCollector);\n this._garbageCollector = null;\n this._logGarbageCollector('Stop');\n }\n }\n\n private _runGarbageCollector() {\n this._logGarbageCollector('Collecting...');\n\n this._store.forEach((item, key) => {\n if (item.isExpired && !item.isInUse) {\n this.remove(key);\n }\n });\n\n this._logGarbageCollector('Collection done');\n\n if (!this._store.size) {\n this._stopGarbageCollector();\n }\n }\n\n private _logGarbageCollector(action: string) {\n if (!this._config?.enableGarbageCollectorLogging) return;\n\n console.log(`%cGC: ${action}`, 'color: yellow; font-weight: bold');\n }\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { AuthProvider } from '../auth';\nimport { EntityStore } from '../entity';\nimport {\n BaseArguments,\n GqlQueryConfig,\n GqlQueryConfigWithoutMethod,\n QueryConfigWithoutMethod,\n RestQueryConfig,\n V2RouteType,\n} from '../query';\nimport { V2QueryCreator } from '../query-creator';\nimport { QueryStore } from '../query-store';\nimport { RequestHeaders, RequestHeadersMethodMap } from '../request';\nimport { V2QueryClientConfig } from './query-client.types';\n\nexport class V2QueryClient {\n /**\n * @internal\n */\n readonly _store: QueryStore;\n\n get config() {\n return this._clientConfig;\n }\n\n get authProvider() {\n return this._authProvider$.getValue() ?? this._clientConfig.parent?._authProvider$.getValue() ?? null;\n }\n get authProvider$() {\n return this._authProvider$.asObservable() ?? this._clientConfig.parent?._authProvider$.asObservable() ?? null;\n }\n private readonly _authProvider$ = new BehaviorSubject<AuthProvider | null>(null);\n\n constructor(private _clientConfig: V2QueryClientConfig) {\n this._store = new QueryStore({\n enableChangeLogging: _clientConfig.logging?.queryStateChanges,\n enableGarbageCollectorLogging: _clientConfig.logging?.queryStateGarbageCollector,\n autoRefreshQueriesOnWindowFocus: _clientConfig.request?.autoRefreshQueriesOnWindowFocus ?? true,\n enableSmartPolling: _clientConfig.request?.enableSmartPolling ?? true,\n });\n }\n\n get = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'GET',\n });\n\n post = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'POST',\n });\n\n put = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'PUT',\n });\n\n patch = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'PATCH',\n });\n\n delete = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'DELETE',\n });\n\n gqlQuery = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: GqlQueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'GQL_QUERY',\n });\n\n gqlMutate = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: GqlQueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'GQL_MUTATE',\n });\n\n fetch = <\n Route extends V2RouteType<Arguments>,\n Response,\n Arguments extends BaseArguments | undefined,\n Id,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n Data = Response,\n >(\n queryConfig:\n | RestQueryConfig<Route, Response, Arguments, Store, Data, Id>\n | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>,\n ) => new V2QueryCreator<Arguments, Response, Route, Store, Data, Id>(queryConfig, this, this._store);\n\n setAuthProvider = (authProvider: AuthProvider) => {\n if (this.authProvider) {\n this.authProvider?.cleanUp();\n }\n\n this._authProvider$.next(authProvider);\n };\n\n setDefaultHeaders = (config: {\n headers: RequestHeaders | RequestHeadersMethodMap | null;\n refreshQueriesInUse?: boolean;\n }) => {\n if (!this._clientConfig.request) {\n this._clientConfig.request = {\n headers: config.headers ?? undefined,\n };\n } else {\n this._clientConfig.request.headers = config.headers ?? undefined;\n }\n\n if (config.refreshQueriesInUse) {\n this._store.refreshQueriesInUse({ purgeUnused: true, ignoreCacheValidity: true });\n }\n };\n\n clearAuthProvider = () => {\n this.authProvider?.cleanUp();\n this._authProvider$.next(null);\n };\n\n _updateBaseRoute = (route: string) => {\n this._clientConfig.baseRoute = route;\n };\n}\n","import { BaseArguments } from '../query/query.types';\nimport { Method } from '../request';\n\nexport const v2ShouldCacheQuery = (method: Method) => {\n return method === 'GET' || method === 'OPTIONS' || method === 'HEAD' || method === 'GQL_QUERY';\n};\n\nexport const v2BuildQueryCacheKey = (route: string, args: BaseArguments | undefined) => {\n const variables = JSON.stringify(args?.variables || {})\n // replace all curly braces with empty string\n .replace(/{|}/g, '')\n // replace new lines and whitespaces with empty string\n .replace(/\\s/g, '');\n\n const seed = `${route}...${variables}`;\n\n let hash = 0;\n\n for (const char of seed) {\n hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;\n }\n\n // Force positive number hash.\n // 2147483647 = equivalent of Integer.MAX_VALUE.\n hash += 2147483647 + 1;\n\n return hash.toString();\n};\n","import {\n AnyCreateQueryClientResult,\n createBaseQueryCreator,\n CreateQueryCreatorOptions,\n gqlDataPropertyMissingInResponse,\n QueryCreator,\n RouteType,\n} from '../http';\nimport { createGqlQuery, GqlQueryArgs } from './gql-query';\n\nexport type CreateGqlQueryCreatorOptions<TArgs extends GqlQueryArgs> = Omit<\n CreateQueryCreatorOptions<TArgs>,\n 'route' | 'transformResponse'\n> & {\n route?: RouteType<TArgs>;\n\n /**\n * Optional custom transform function for GQL responses.\n * If not provided, the default { data: ... } unwrapping will be used.\n */\n transformResponse?: CreateQueryCreatorOptions<TArgs>['transformResponse'];\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyCreateGqlQueryCreatorOptions = CreateGqlQueryCreatorOptions<any>;\n\nexport type GqlQueryMethod = 'QUERY' | 'MUTATE';\nexport type GqlQueryTransport = 'GET' | 'POST';\n\nexport type InternalCreateGqlQueryCreatorOptions = {\n method: GqlQueryMethod;\n transport: GqlQueryTransport;\n client: AnyCreateQueryClientResult;\n query: string;\n};\n\nexport const createGqlQueryCreator = <TArgs extends GqlQueryArgs>(\n options: CreateGqlQueryCreatorOptions<TArgs> | undefined,\n internals: InternalCreateGqlQueryCreatorOptions,\n): QueryCreator<TArgs> =>\n createBaseQueryCreator({\n options: {\n ...options,\n // Use custom transformResponse if provided, otherwise use default GQL unwrapping\n transformResponse:\n options?.transformResponse ??\n ((rawResponse: unknown) => {\n if (rawResponse && typeof rawResponse === 'object' && 'data' in rawResponse) {\n return (rawResponse as { data: unknown }).data;\n }\n\n throw gqlDataPropertyMissingInResponse();\n }),\n } as CreateQueryCreatorOptions<TArgs>,\n internals,\n queryFactory: createGqlQuery,\n });\n","import { HttpHeaders } from '@angular/common/http';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { filter, of, Subscription, switchMap, take, tap } from 'rxjs';\nimport { AnyBearerAuthProvider } from '../auth';\nimport { AnyQuerySnapshot, QueryArgs, RequestArgs } from './query';\nimport { QueryDependencies } from './query-dependencies';\nimport { invalidStateInsideSecureExecuteFactory, tokensNotAvailableInsideAuthAndExec } from './query-errors';\nimport { InternalQueryExecute, QueryExecuteArgs } from './query-execute';\nimport { circularQueryDependencyChecker, resetExecuteState, setupQueryExecuteState } from './query-execute-utils';\nimport { QueryState } from './query-state';\n\nconst AUTH_HEADER = 'Authorization';\n\nexport type SecureExecuteFactoryOptions<TArgs extends QueryArgs> = {\n authProvider: AnyBearerAuthProvider;\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n transformAuthAndExec: (\n executeArgs: QueryExecuteArgs<TArgs> | undefined,\n tokens: { accessToken: string },\n headers: HttpHeaders,\n executeState: ReturnType<typeof setupQueryExecuteState>,\n ) => void;\n};\n\nexport const createSecureExecuteFactory = <TArgs extends QueryArgs>(\n options: SecureExecuteFactoryOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const executeState = setupQueryExecuteState();\n const circularChecker = circularQueryDependencyChecker();\n\n let authQuerySubscription = Subscription.EMPTY;\n let tokenRefreshSubscription = Subscription.EMPTY;\n\n const reset = () => {\n authQuerySubscription.unsubscribe();\n authQuerySubscription = Subscription.EMPTY;\n tokenRefreshSubscription.unsubscribe();\n tokenRefreshSubscription = Subscription.EMPTY;\n resetExecuteState({\n executeState,\n executeOptions: { deps: options.deps, state: options.state },\n });\n };\n\n const error = (query: AnyQuerySnapshot) => {\n const state = options.state;\n\n state.error.set(query.error());\n state.loading.set(null);\n state.rawResponse.set(null);\n state.latestHttpEvent.set(null);\n state.args.set(null);\n };\n\n const authAndExec = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n const args = executeArgs?.args;\n\n const headerProvider = () => {\n const accessToken = options.authProvider.accessToken();\n const baseHeaders = typeof args?.headers === 'function' ? args.headers() : args?.headers || new HttpHeaders();\n\n if (!accessToken) {\n throw tokensNotAvailableInsideAuthAndExec();\n }\n\n if (!baseHeaders.has(AUTH_HEADER)) {\n return baseHeaders.set(AUTH_HEADER, `Bearer ${accessToken}`);\n }\n\n return baseHeaders;\n };\n\n const accessToken = options.authProvider.accessToken();\n if (!accessToken) {\n throw tokensNotAvailableInsideAuthAndExec();\n }\n\n const tokens = { accessToken, refreshToken: options.authProvider.refreshToken() ?? '' };\n const headers = headerProvider();\n\n options.transformAuthAndExec(\n {\n ...executeArgs,\n args: {\n ...(args ?? {}),\n headers: headerProvider, // Pass header provider instead of static headers\n } as RequestArgs<TArgs>,\n },\n tokens,\n headers,\n executeState,\n );\n };\n\n const exec = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n circularChecker.check();\n\n // Make sure all effects are flushed before reading the args.\n // A withArgs feature effect might still be pending otherwise resulting in the wrong args being read.\n options.deps.effectScheduler.flush();\n\n const execArgsWithDefaults: QueryExecuteArgs<TArgs> = {\n args: executeArgs?.args ?? options.state.args(),\n options: executeArgs?.options,\n };\n\n authQuerySubscription.unsubscribe();\n authQuerySubscription = Subscription.EMPTY;\n tokenRefreshSubscription.unsubscribe();\n tokenRefreshSubscription = Subscription.EMPTY;\n\n tokenRefreshSubscription = options.authProvider.afterTokenRefresh$\n .pipe(\n filter(() => {\n const currentError = options.state.error();\n return currentError?.code === 401;\n }),\n take(1),\n tap(() => exec(execArgsWithDefaults)),\n )\n .subscribe();\n\n const latestQuery = options.authProvider.latestExecutedQuery();\n const authQuery = latestQuery?.snapshot;\n\n // This might happen if a secure query gets executed while the auth query has just been created.\n // This is due to the fact that the query state is being synced with the state inside the http request using effect.\n const isAuthQueryFreshlyExecuted = authQuery?.lastTimeExecutedAt() === null;\n\n if (!authQuery || authQuery.loading() || isAuthQueryFreshlyExecuted) {\n options.state.loading.set({ executeTime: Date.now(), progress: null });\n\n authQuerySubscription = toObservable(options.authProvider.latestExecutedQuery, {\n injector: options.deps.injector,\n })\n .pipe(\n switchMap((latestQuery) => {\n if (!latestQuery) return of(null);\n const query = latestQuery.snapshot;\n\n return toObservable(query.isAlive, { injector: options.deps.injector }).pipe(\n tap((isAlive) => {\n if (isAlive) return;\n\n if (query.error()) {\n error(query);\n } else if (query.response()) {\n authAndExec(execArgsWithDefaults);\n }\n }),\n );\n }),\n )\n .subscribe();\n } else if (authQuery.response()) {\n authAndExec(execArgsWithDefaults);\n } else if (authQuery.error()) {\n error(authQuery);\n } else {\n throw invalidStateInsideSecureExecuteFactory();\n }\n };\n\n exec['reset'] = reset;\n exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();\n\n return exec;\n};\n","import {\n CreateQueryExecuteOptions,\n InternalQueryExecute,\n QueryConfig,\n QueryDependencies,\n queryExecute,\n QueryState,\n RequestArgs,\n RouteType,\n} from '../http';\nimport { createSecureExecuteFactory } from '../http/secure-query-execute-factory';\nimport { GqlQueryArgs } from './gql-query';\nimport { AnyCreateGqlQueryCreatorOptions } from './gql-query-creator';\nimport { transformGql } from './gql-transformer';\nimport { InternalSecureCreateGqlQueryCreatorOptions } from './secure-gql-query-creator';\n\nexport type CreateSecureGqlQueryExecuteOptions<TArgs extends GqlQueryArgs> = {\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n creator?: AnyCreateGqlQueryCreatorOptions;\n creatorInternals: InternalSecureCreateGqlQueryCreatorOptions;\n queryConfig: QueryConfig;\n};\n\nexport const createSecureGqlExecuteFn = <TArgs extends GqlQueryArgs>(\n executeOptions: CreateSecureGqlQueryExecuteOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const [, injectAuthProvider] = executeOptions.creatorInternals.authProvider;\n const authProvider = injectAuthProvider();\n\n return createSecureExecuteFactory({\n authProvider,\n deps: executeOptions.deps,\n state: executeOptions.state,\n transformAuthAndExec: (executeArgs, _tokens, headers, executeState) => {\n const { args, options: runOptions } = executeArgs ?? {};\n\n const query = transformGql(executeOptions.creatorInternals.query);\n let gqlParams = query(args?.variables);\n\n if (args?.queryParams && executeOptions.creatorInternals.transport === 'GET') {\n gqlParams = { ...gqlParams, ...args.queryParams };\n }\n\n const computedArgs = { ...(args ?? ({} as RequestArgs<TArgs>)), headers };\n\n if (executeOptions.creatorInternals.transport === 'GET') {\n computedArgs.queryParams = gqlParams;\n } else {\n computedArgs.body = gqlParams;\n }\n\n const normalizedOpts: CreateQueryExecuteOptions<TArgs> = {\n ...executeOptions,\n creatorInternals: {\n client: executeOptions.creatorInternals.client,\n method: executeOptions.creatorInternals.method === 'QUERY' ? 'GET' : 'POST',\n route: (executeOptions.creator?.route ?? '') as RouteType<TArgs>,\n },\n };\n\n queryExecute({\n executeOptions: normalizedOpts,\n executeState,\n args: computedArgs,\n options: runOptions,\n isSecure: true,\n });\n },\n });\n};\n","import { createBaseQuery, CreateQueryOptions } from '../http';\nimport { GqlQueryArgs } from './gql-query';\nimport { InternalSecureCreateGqlQueryCreatorOptions } from './secure-gql-query-creator';\nimport { createSecureGqlExecuteFn } from './secure-gql-query-execute';\n\nexport type CreateSecureGqlQueryOptions<TArgs extends GqlQueryArgs> = Omit<\n CreateQueryOptions<TArgs>,\n 'creatorInternals'\n> & {\n creatorInternals: InternalSecureCreateGqlQueryCreatorOptions;\n};\n\nexport const createSecureGqlQuery = <TArgs extends GqlQueryArgs>(options: CreateSecureGqlQueryOptions<TArgs>) =>\n createBaseQuery({\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n features: options.features,\n queryConfig: options.queryConfig,\n executeFactory: createSecureGqlExecuteFn,\n });\n","import { AnyCreateBearerAuthProviderResult } from '../auth';\nimport { AnyCreateQueryClientResult, createBaseQueryCreator, QueryCreator } from '../http';\nimport { GqlQueryArgs } from './gql-query';\nimport { CreateGqlQueryCreatorOptions } from './gql-query-creator';\nimport { createSecureGqlQuery } from './secure-gql-query';\n\nexport type InternalSecureCreateGqlQueryCreatorOptions = {\n method: 'QUERY' | 'MUTATE';\n transport: 'GET' | 'POST';\n client: AnyCreateQueryClientResult;\n query: string;\n authProvider: AnyCreateBearerAuthProviderResult;\n};\n\nexport const createSecureGqlQueryCreator = <TArgs extends GqlQueryArgs>(\n options: CreateGqlQueryCreatorOptions<TArgs> | undefined,\n internals: InternalSecureCreateGqlQueryCreatorOptions,\n): QueryCreator<TArgs> =>\n createBaseQueryCreator({\n options: {\n ...options,\n // Use custom transformResponse if provided, otherwise use default GQL unwrapping\n transformResponse:\n options?.transformResponse ??\n ((rawResponse: unknown) => {\n if (rawResponse && typeof rawResponse === 'object' && 'data' in rawResponse) {\n return (rawResponse as { data: unknown }).data;\n }\n return rawResponse;\n }),\n },\n internals,\n queryFactory: createSecureGqlQuery,\n });\n","import { AnyCreateBearerAuthProviderResult } from '../auth';\nimport { AnyCreateQueryClientResult } from '../http';\nimport { GqlQueryArgs } from './gql-query';\nimport {\n createGqlQueryCreator,\n CreateGqlQueryCreatorOptions,\n GqlQueryMethod,\n GqlQueryTransport,\n} from './gql-query-creator';\nimport { GQL } from './gql-transformer';\nimport { createSecureGqlQueryCreator } from './secure-gql-query-creator';\n\nconst createGqlCreatorTemplate = (method: GqlQueryMethod, transport: GqlQueryTransport) => {\n return (client: AnyCreateQueryClientResult) => {\n return <TArgs extends GqlQueryArgs>(query: GQL, creatorOptions?: CreateGqlQueryCreatorOptions<TArgs>) =>\n createGqlQueryCreator<TArgs>(creatorOptions, {\n method,\n client,\n transport,\n query,\n });\n };\n};\n\nconst createSecureGqlCreatorTemplate = (method: GqlQueryMethod, transport: GqlQueryTransport) => {\n return (client: AnyCreateQueryClientResult, authProvider: AnyCreateBearerAuthProviderResult) => {\n return <TArgs extends GqlQueryArgs>(query: GQL, creatorOptions?: CreateGqlQueryCreatorOptions<TArgs>) =>\n createSecureGqlQueryCreator<TArgs>(creatorOptions, {\n method,\n client,\n transport,\n query,\n authProvider,\n });\n };\n};\n\n/** A query creator that creates a GQL query where the payload is sent via GET (query params) */\nexport const createGqlQueryViaGet = createGqlCreatorTemplate('QUERY', 'GET');\n\n/** A query creator that creates a secure GQL query where the payload is sent via GET (query params) */\nexport const createSecureGqlQueryViaGet = createSecureGqlCreatorTemplate('QUERY', 'GET');\n\n/** A query creator that creates a GQL query where the payload is sent via POST (body) */\nexport const createGqlQueryViaPost = createGqlCreatorTemplate('QUERY', 'POST');\n\n/** A query creator that creates a secure GQL query where the payload is sent via POST (body) */\nexport const createSecureGqlQueryViaPost = createSecureGqlCreatorTemplate('QUERY', 'POST');\n\n/** A query creator that creates a GQL mutation where the payload is sent via GET (query params) */\nexport const createGqlMutationViaGet = createGqlCreatorTemplate('MUTATE', 'GET');\n\n/** A query creator that creates a secure GQL mutation where the payload is sent via GET (query params) */\nexport const createSecureGqlMutationViaGet = createSecureGqlCreatorTemplate('MUTATE', 'GET');\n\n/** A query creator that creates a GQL mutation where the payload is sent via POST (body) */\nexport const createGqlMutationViaPost = createGqlCreatorTemplate('MUTATE', 'POST');\n\n/** A query creator that creates a secure GQL mutation where the payload is sent via POST (body) */\nexport const createSecureGqlMutationViaPost = createSecureGqlCreatorTemplate('MUTATE', 'POST');\n","import { effect, untracked } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport {\n filter,\n interval,\n map,\n Observable,\n of,\n ReplaySubject,\n shareReplay,\n skip,\n Subscription,\n switchMap,\n takeUntil,\n takeWhile,\n} from 'rxjs';\nimport { AnyNewQuery, Query, QueryArgs, QueryArgsOf, QueryExecutionState, RequestArgs, ResponseType } from '../../http';\nimport { EntityStore } from '../entity';\nimport {\n BaseArguments,\n ExecuteQueryOptions,\n Failure,\n filterFailure,\n filterSuccess,\n isQueryStateLoading,\n isQueryStateSuccess,\n Loading,\n PollConfig,\n Prepared,\n QueryAutoRefreshConfig,\n QueryEntityConfig,\n QueryStateMeta,\n QueryStateType,\n Success,\n takeUntilResponse,\n V2QueryState,\n V2RouteType,\n} from '../query';\nimport { RequestError } from '../request';\n\nexport type CreateLegacyQueryOptions<TArgs extends QueryArgs> = {\n query: Query<TArgs>;\n};\n\nexport const transformExecStateToQueryState = <TArgs extends QueryArgs>(\n execState: QueryExecutionState<TArgs> | null,\n): V2QueryState<ResponseType<TArgs>> => {\n const meta: QueryStateMeta = { id: -1, triggeredVia: 'program' };\n\n switch (execState?.type) {\n case 'loading': {\n const loading: Loading = {\n meta,\n type: QueryStateType.Loading,\n ...(execState.loading.progress\n ? {\n progress: {\n current: execState.loading.progress.loaded,\n percentage: execState.loading.progress.percentage,\n total: execState.loading.progress.total,\n },\n }\n : {}),\n };\n\n return loading;\n }\n case 'success': {\n const success: Success<ResponseType<TArgs>> = {\n headers: {},\n meta,\n response: execState.response,\n type: QueryStateType.Success,\n };\n\n return success;\n }\n case 'failure': {\n const error: Failure = {\n error: {\n detail: execState.error.raw.error,\n httpErrorResponse: execState.error.raw,\n status: execState.error.raw.status,\n statusText: execState.error.raw.statusText,\n url: execState.error.raw.url || '',\n },\n meta,\n type: QueryStateType.Failure,\n };\n\n return error;\n }\n default: {\n const prepared: Prepared = {\n meta,\n type: QueryStateType.Prepared,\n };\n\n return prepared;\n }\n }\n};\n\nexport const isLegacyQuery = <T extends AnyLegacyQuery>(query: unknown): query is T => {\n if (!query || typeof query !== 'object' || Array.isArray(query)) {\n return false;\n }\n\n if (!('newQuery' in query)) {\n return false;\n }\n\n return true;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyLegacyQuery = LegacyQuery<any, any, any, any, any, any, any>;\n\nexport class LegacyQuery<\n Response,\n Arguments extends BaseArguments | undefined,\n Route extends V2RouteType<Arguments>,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n TNewQuery extends AnyNewQuery,\n> {\n /**\n * @internal\n */\n _pollingSubscription: Subscription | null = null;\n /**\n * @internal\n */\n _currentPollConfig: PollConfig | null = null;\n\n /**\n * @internal\n */\n storeSyncEffect = effect(() => {\n const res = this.newQuery.response();\n\n untracked(() => {\n if (this.entity?.set) {\n const id = this.entity.id({ args: this._arguments, response: res });\n\n this.entity.set({\n args: this._arguments,\n response: res,\n id,\n store: this.entity.store,\n });\n }\n });\n });\n\n /**\n * @internal\n */\n _dependents: Record<number, number> = {};\n\n /**\n * @internal\n */\n _dependentsChanged$ = new ReplaySubject<Record<number, number>>();\n\n /**\n * @internal\n */\n _isPollingPaused = false;\n\n state$: Observable<V2QueryState<Data>>;\n\n get rawState() {\n return transformExecStateToQueryState(this.newQuery.executionState());\n }\n\n get isExpired() {\n return this.newQuery.subtle.request()?.isStale();\n }\n\n get isInUse() {\n return true;\n }\n\n /**\n * @internal\n */\n get _subscriberCount() {\n return 0;\n }\n\n get isPolling() {\n return !!this._pollingSubscription;\n }\n\n get autoRefreshOnConfig() {\n const transformed: Readonly<QueryAutoRefreshConfig> = {\n queryClientDefaultHeadersChange: false,\n windowFocus: false,\n };\n\n return transformed;\n }\n\n /**\n * @internal\n */\n get _enableSmartPolling() {\n return false;\n }\n\n get store() {\n return null;\n }\n\n get canBeCached() {\n return false;\n }\n\n get _isInMockMode() {\n return false;\n }\n\n constructor(\n public newQuery: TNewQuery,\n public _arguments: RequestArgs<QueryArgsOf<TNewQuery>>,\n public entity?: QueryEntityConfig<Store, Data, Response, Arguments, Id>,\n ) {\n this.state$ = toObservable(this.newQuery.executionState, { injector: this.newQuery.subtle.injector }).pipe(\n map((execState) => transformExecStateToQueryState(execState)),\n switchMap((s) => this._transformState(s)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n this.newQuery.subtle.destroyRef.onDestroy(() => this.destroy());\n }\n\n destroy() {\n this._pollingSubscription?.unsubscribe();\n this._pollingSubscription = null;\n this._dependentsChanged$.complete();\n this.newQuery.subtle.destroy();\n this.storeSyncEffect.destroy();\n }\n\n execute(options: ExecuteQueryOptions = {}) {\n untracked(() =>\n this.newQuery.execute({ args: this._arguments, options: { allowCache: options.skipCache !== true } }),\n );\n\n return this;\n }\n\n abort() {\n if (!isQueryStateLoading(this.rawState)) {\n return this;\n }\n\n this.newQuery.reset();\n\n return this;\n }\n\n poll(config: PollConfig) {\n if (this._pollingSubscription) {\n return this;\n }\n\n this._currentPollConfig = config;\n\n const interval$ = interval(config.interval);\n const poll$ = interval$.pipe(\n skip(config.triggerImmediately ? 0 : 1),\n takeUntil(config.takeUntil),\n takeWhile(() => !this._isPollingPaused),\n filter(() => !isQueryStateLoading(this.rawState)),\n );\n\n this._pollingSubscription = poll$.subscribe({\n next: () => this.execute({ skipCache: true, _triggeredVia: 'poll' }),\n complete: () => this.stopPolling(),\n });\n\n return this;\n }\n\n stopPolling() {\n this._pollingSubscription?.unsubscribe();\n this._pollingSubscription = null;\n this._currentPollConfig = null;\n\n return this;\n }\n\n pausePolling() {\n this._pollingSubscription?.unsubscribe();\n this._pollingSubscription = null;\n\n this._isPollingPaused = true;\n\n return this;\n }\n\n resumePolling() {\n if (!this._isPollingPaused || !this._currentPollConfig) {\n return this;\n }\n\n this._isPollingPaused = false;\n\n return this.poll({ ...this._currentPollConfig, triggerImmediately: true });\n }\n\n onSuccess(callback: (response: Data) => void) {\n this.state$.pipe(takeUntilResponse(), filterSuccess()).subscribe((state) => callback(state.response));\n return this;\n }\n\n onFailure(callback: (error: RequestError<unknown>) => void) {\n this.state$.pipe(takeUntilResponse(), filterFailure()).subscribe((state) => callback(state.error));\n return this;\n }\n\n /**\n * @internal\n */\n _addDependent(tNodeIndex: number) {\n if (!this._dependents[tNodeIndex]) {\n this._dependents[tNodeIndex] = 0;\n }\n\n this._dependents[tNodeIndex]++;\n\n this._dependentsChanged$.next(this._dependents);\n }\n\n /**\n * @internal\n */\n _removeDependent(tNodeIndex: number) {\n const count = this._dependents[tNodeIndex];\n if (count === undefined) {\n return;\n }\n\n if (this._dependents[tNodeIndex] !== undefined) {\n this._dependents[tNodeIndex]--;\n }\n\n if (count <= 1) {\n delete this._dependents[tNodeIndex];\n }\n\n this._dependentsChanged$.next(this._dependents);\n }\n\n /**\n * @internal\n */\n _hasDependents() {\n return Object.keys(this._dependents).length > 0;\n }\n\n /**\n * @internal\n */\n _transformState(s: V2QueryState<Response>): Observable<V2QueryState<Data>> {\n if (!isQueryStateSuccess(s) || !this.entity?.get) {\n return of(s) as Observable<V2QueryState<Data>>;\n }\n\n const id = this.entity.id({ args: this._arguments, response: s.response });\n\n return this.entity\n .get({ args: this._arguments, id, response: s.response, store: this.entity.store })\n .pipe(map((v) => ({ ...s, response: v })));\n }\n}\n","import { HttpHeaders } from '@angular/common/http';\nimport { effect, inject, Injector, runInInjectionContext, signal, untracked } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject } from 'rxjs';\nimport { AnyNewQuery, Query, QueryArgs, QueryCreator, RequestArgs, ResponseType } from '../../http';\nimport { EntityStore } from '../entity';\nimport { BaseArguments, QueryEntityConfig, V2QueryConfig, V2RouteType, WithHeaders, WithInjector } from '../query';\nimport { addQueryContainerHandling, QueryContainerConfig } from '../utils';\nimport { LegacyQuery } from './legacy-query';\n\nexport type LegacyArgumentsOfQueryArgs<T extends QueryArgs> = Omit<T, 'response' | 'headers'> & WithHeaders;\nexport type QueryArgsOfLegacyArguments<T extends BaseArguments | undefined, J> = Omit<T, 'mock' | 'headers'> & {\n headers?: HttpHeaders;\n response?: J;\n};\n\nexport type CreateLegacyQueryCreatorOptions<\n TArgs extends QueryArgs,\n Response,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n> = {\n creator: QueryCreator<TArgs>;\n\n /**\n * Object containing the query's entity store information.\n */\n entity?: QueryEntityConfig<Store, Data, Response, LegacyArgumentsOfQueryArgs<TArgs>, Id>;\n};\n\nexport type WithLegacyConfig = {\n /**\n * Additional configuration for this query.\n */\n config?: V2QueryConfig & {\n /**\n * If set to true, the query will be destroyed when it either succeeds or fails.\n */\n destroyOnResponse?: boolean;\n };\n};\n\nexport type LegacyQueryPrepareFn<\n Arguments extends BaseArguments | undefined,\n Response,\n Route extends V2RouteType<Arguments>,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n TNewQuery extends AnyNewQuery,\n> = (\n args: Arguments & WithHeaders & WithLegacyConfig & WithInjector,\n) => LegacyQuery<Response, Arguments, Route, Store, Data, Id, TNewQuery>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyLegacyQueryCreator = LegacyQueryCreator<any, any, any, any, any>;\n\nexport class LegacyQueryCreator<\n TArgs extends QueryArgs,\n Response extends ResponseType<TArgs>,\n Store extends EntityStore<unknown>,\n Id,\n Data = Response,\n> {\n constructor(public options: CreateLegacyQueryCreatorOptions<TArgs, Response, Store, Data, Id>) {}\n\n prepare: LegacyQueryPrepareFn<\n LegacyArgumentsOfQueryArgs<TArgs>,\n Response,\n V2RouteType<LegacyArgumentsOfQueryArgs<TArgs>>,\n Store,\n Data,\n Id,\n Query<TArgs>\n > = (args: LegacyArgumentsOfQueryArgs<TArgs> & WithHeaders & WithLegacyConfig & WithInjector) => {\n const injector = args?.injector ?? inject(Injector);\n\n let headers = new HttpHeaders();\n\n if (args?.headers) {\n Object.entries(args.headers).forEach(([key, value]) => {\n if (value) {\n headers = headers.set(key, value);\n }\n });\n }\n\n const queryArgs = {\n ...(args?.body ? { body: args.body } : {}),\n ...(args?.pathParams ? { pathParams: args.pathParams } : {}),\n ...(args?.queryParams ? { queryParams: args.queryParams } : {}),\n headers,\n } as RequestArgs<TArgs>;\n\n return runInInjectionContext(injector, () => {\n return untracked(() => {\n const newQuery = this.options.creator({\n onlyManualExecution: true,\n injector,\n silenceMissingWithArgsFeatureError: true,\n });\n\n const legacyQuery = new LegacyQuery<\n Response,\n LegacyArgumentsOfQueryArgs<TArgs>,\n V2RouteType<LegacyArgumentsOfQueryArgs<TArgs>>,\n Store,\n Data,\n Id,\n Query<TArgs>\n >(newQuery, queryArgs, this.options.entity);\n\n if (args?.config?.destroyOnResponse) {\n const destroyEffect = effect(() => {\n if (newQuery.executionState()?.type === 'success' || newQuery.executionState()?.type === 'failure') {\n legacyQuery.destroy();\n destroyEffect.destroy();\n }\n });\n }\n\n return legacyQuery;\n });\n });\n };\n createSubject = (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => {\n const subject = new BehaviorSubject<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n\n addQueryContainerHandling(subject, () => subject.getValue(), config);\n\n return subject;\n };\n createSignal = (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => {\n const _signal = signal<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n\n addQueryContainerHandling(toObservable(_signal), () => _signal(), config);\n\n return _signal;\n };\n\n behaviorSubject = this.createSubject;\n}\n\n/**\n * Creates a legacy query creator.\n *\n * **NOTE**: This is a temporary solution to support legacy queries. It will be removed in the future.\n *\n * **DO NOT TURN NEW QUERY CREATORS INTO LEGACY ONES MANUALLY. THIS IS ONLY NEEDED FOR MIGRATION PURPOSES.**\n */\nexport const createLegacyQueryCreator = <\n TArgs extends QueryArgs,\n Response extends ResponseType<TArgs>,\n Store extends EntityStore<unknown>,\n Id,\n Data = Response,\n>(\n options: CreateLegacyQueryCreatorOptions<TArgs, Response, Store, Data, Id>,\n): LegacyQueryCreator<TArgs, Response, Store, Id, Data> => {\n return new LegacyQueryCreator<TArgs, Response, Store, Id, Data>(options);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { assertInInjectionContext, isDevMode, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Paginated } from '@ethlete/types';\nimport { BehaviorSubject, Observable, filter, map, of, switchMap, takeWhile, tap } from 'rxjs';\nimport { transformGql } from '../../gql';\nimport { isSymfonyPagerfantaOutOfRangeError } from '../../http';\nimport { QueryForm } from '../../query-form';\nimport { EntityStore } from '../entity';\nimport { AnyLegacyQuery, isLegacyQuery } from '../interop';\nimport { V2QueryClient } from '../query-client';\nimport {\n AnyV2QueryCreator,\n QueryDataOf,\n QueryResponseOf,\n QueryStoreIdOf,\n QueryStoreOf,\n V2QueryArgsOf,\n V2QueryCreator,\n} from '../query-creator';\nimport { Method, RequestHeaders, RequestHeadersMethodMap, transformMethod } from '../request';\nimport { QueryContainerConfig, addQueryContainerHandling } from '../utils';\nimport {\n AnyGqlQueryConfig,\n AnyQueryCollection,\n AnyQueryCollectionData,\n AnyQueryCreatorCollection,\n AnyRestQueryConfig,\n AnyV2Query,\n BaseArguments,\n Cancelled,\n Failure,\n GqlQueryConfig,\n Loading,\n Prepared,\n QueryCollectionOf,\n QueryStateResponseOf,\n QueryStateType,\n ResetPageOnErrorOperatorConfig,\n Success,\n V2QueryState,\n V2RouteType,\n} from './query.types';\n\ntype OmitNull<T> = T extends null ? never : T;\n\nexport function filterSuccess() {\n return function <T extends V2QueryState | null, Response extends QueryStateResponseOf<OmitNull<T>>>(\n source: Observable<T>,\n ) {\n return source.pipe(filter((value) => isQueryStateSuccess(value))) as Observable<Success<Response>>;\n };\n}\n\nexport function ignoreAutoRefresh() {\n return function <T extends V2QueryState | null>(source: Observable<T>) {\n return source.pipe(filter((value) => !isAutoRefresh(value))) as Observable<T>;\n };\n}\n\nexport function filterFailure() {\n return function <T extends V2QueryState | null>(source: Observable<T>) {\n return source.pipe(filter((value) => isQueryStateFailure(value))) as Observable<Failure>;\n };\n}\n\nexport function filterQueryStates(allowedStates: QueryStateType[]) {\n return function <T extends V2QueryState | null>(source: Observable<T>) {\n return source.pipe(filter((value) => value && allowedStates.includes(value.type))) as Observable<T>;\n };\n}\n\nexport function takeUntilResponse(config?: { excludeNull?: boolean }) {\n return function <T extends V2QueryState | null>(source: Observable<T>) {\n return source.pipe(\n takeWhile((value) => {\n if (config?.excludeNull && value === null) {\n return false;\n }\n\n return isQueryStateLoading(value) || isQueryStatePrepared(value) || value === null;\n }, true),\n );\n };\n}\n\nexport function filterNull() {\n return function <T>(source: Observable<T>) {\n return source.pipe(filter((value): value is OmitNull<T> => value !== null));\n };\n}\n\nexport function switchQueryState() {\n return function <T extends AnyV2Query | AnyLegacyQuery | null, Data extends QueryDataOf<T>>(source: Observable<T>) {\n return source.pipe(switchMap((value) => value?.state$ ?? of(null))) as Observable<V2QueryState<Data> | null>;\n };\n}\n\nexport function switchQueryCollectionState() {\n return function <T extends AnyQueryCollection | null, Data extends AnyQueryCollectionData<OmitNull<T>>>(\n source: Observable<T>,\n ) {\n return source.pipe(switchMap((value) => value?.query.state$ ?? of(null))) as Observable<V2QueryState<Data> | null>;\n };\n}\n\nexport const resetPageOnError =\n <T extends AnyV2Query | AnyLegacyQuery | null | undefined, J extends QueryForm<any>>(\n config: ResetPageOnErrorOperatorConfig<J>,\n ) =>\n (source: Observable<T>) => {\n const { queryForm, pageControlKey = 'page' } = config;\n\n if (isDevMode() && !queryForm.form.controls[pageControlKey]) {\n console.warn(`resetPageOnError: queryForm.form.controls[\"${pageControlKey}\"] is undefined`);\n }\n\n return source.pipe(\n switchMap((q) => {\n if (!q) {\n return of(q);\n }\n\n return q.state$.pipe(\n tap((state) => {\n if (!isQueryStateFailure(state)) {\n return;\n }\n\n switch (state.error.status) {\n // The page is invalid (in prod mode, code is 416)\n case 416:\n queryForm.form.controls[pageControlKey]?.patchValue(1);\n break;\n\n // The page might be invalid (in dev mode, code is 500)\n case 500:\n if (isSymfonyPagerfantaOutOfRangeError(state.error.detail)) {\n queryForm.form.controls[pageControlKey].patchValue(1);\n }\n break;\n }\n }),\n takeUntilResponse(),\n );\n }),\n );\n };\n\nexport const isQueryStateLoading = (state: V2QueryState | null | undefined): state is Loading =>\n state?.type === QueryStateType.Loading;\n\nexport const isQueryStateSuccess = (state: V2QueryState | null | undefined): state is Success =>\n state?.type === QueryStateType.Success;\n\nexport const isQueryStateFailure = (state: V2QueryState | null | undefined): state is Failure =>\n state?.type === QueryStateType.Failure;\n\nexport const isQueryStateCancelled = (state: V2QueryState | null | undefined): state is Cancelled =>\n state?.type === QueryStateType.Cancelled;\n\nexport const isQueryStatePrepared = (state: V2QueryState | null | undefined): state is Prepared =>\n state?.type === QueryStateType.Prepared;\n\nexport const isAutoRefresh = (state: V2QueryState | null | undefined): boolean => state?.meta.triggeredVia === 'auto';\n\nexport const mergeHeaders = (...headers: Array<RequestHeaders | null | undefined>) => {\n return headers.reduce((acc, headers) => {\n if (!headers) {\n return acc;\n }\n\n return {\n ...acc,\n ...headers,\n };\n }, {});\n};\n\nexport const isGqlQueryConfig = <\n Response,\n Arguments extends BaseArguments | undefined,\n Route extends V2RouteType<Arguments> | undefined,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n>(\n config: unknown,\n): config is GqlQueryConfig<Route, Response, Arguments, Store, Data, Id> => {\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n return false;\n }\n\n if (!('query' in config)) {\n return false;\n }\n\n return true;\n};\n\nexport const isQuery = <T extends AnyV2Query | AnyLegacyQuery>(query: unknown): query is T => {\n if (!query || typeof query !== 'object' || Array.isArray(query)) {\n return false;\n }\n\n if (!('state$' in query)) {\n return false;\n }\n\n return true;\n};\n\nexport const isQueryCollection = <T extends AnyQueryCollection>(query: unknown): query is T => {\n if (!query || typeof query !== 'object' || Array.isArray(query)) {\n return false;\n }\n\n if (!('query' in query)) {\n return false;\n }\n\n return true;\n};\n\nexport const createQueryCollection = <T extends AnyQueryCreatorCollection, R extends QueryCollectionOf<T>>(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n queryMap: T,\n) => new BehaviorSubject<R | null>(null);\n\nexport const createQueryCollectionSubject = <T extends AnyQueryCreatorCollection, R extends QueryCollectionOf<T>>(\n queryMap: T,\n config?: QueryContainerConfig,\n) => {\n assertInInjectionContext(createQueryCollectionSubject);\n\n const subject = new BehaviorSubject<R | null>(null);\n\n addQueryContainerHandling(\n subject.pipe(map((s) => s?.query ?? null)),\n () => subject.getValue()?.query ?? null,\n config,\n );\n\n return subject;\n};\n\nexport const createQueryCollectionSignal = <T extends AnyQueryCreatorCollection, R extends QueryCollectionOf<T>>(\n queryMap: T,\n config?: QueryContainerConfig,\n) => {\n assertInInjectionContext(createQueryCollectionSignal);\n\n const _signal = signal<R | null>(null);\n\n addQueryContainerHandling(\n toObservable(_signal).pipe(map((s) => s?.query ?? null)),\n () => _signal()?.query ?? null,\n config,\n );\n\n return _signal;\n};\n\nexport const extractQuery = <T extends AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>(v: T) =>\n (isQuery(v) ? v : isLegacyQuery(v) ? v : v?.query) ?? null;\n\nexport const getDefaultHeaders = (\n headers: RequestHeaders | RequestHeadersMethodMap | null | undefined,\n method: Method,\n) => {\n if (!headers) {\n return {};\n }\n\n if (method in headers) {\n return (headers[method] ?? {}) as RequestHeaders;\n }\n\n return headers as RequestHeaders;\n};\n\nexport const castQueryCreatorTypes = <\n QC extends AnyV2QueryCreator,\n Arguments extends V2QueryArgsOf<QC>,\n Response extends QueryResponseOf<QC>,\n Store extends QueryStoreOf<QC>,\n Data extends QueryDataOf<QC>,\n Route extends V2RouteType<Arguments>,\n Id extends QueryStoreIdOf<QC>,\n OverrideArguments extends BaseArguments | undefined,\n OverrideResponse extends Response | undefined,\n>(config: {\n creator: QC;\n args?: OverrideArguments;\n response?: OverrideResponse;\n}) => {\n if (config.args?.pathParams) {\n console.error(config);\n\n throw new Error('Path params cannot be overridden in castQueryCreatorTypes. Create a new query creator instead.');\n }\n\n return config.creator as unknown as V2QueryCreator<OverrideArguments, OverrideResponse, Route, Store, Data, Id>;\n};\n\nexport const computeQueryMethod = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n}) => {\n let method: Method;\n\n if (isGqlQueryConfig(config.config)) {\n const transferVia = config.config.transferVia ?? config.client.config.request?.gql?.transferVia;\n method = transformMethod({ method: config.config.method, transferVia });\n } else {\n method = transformMethod({ method: config.config.method });\n }\n\n return method;\n};\n\nexport const computeQueryBody = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n method: Method;\n args?: BaseArguments;\n}) => {\n let body: unknown;\n\n if (\n config.method === 'GET' ||\n config.method === 'HEAD' ||\n config.method === 'OPTIONS' ||\n (isGqlQueryConfig(config.config) &&\n (config.config.transferVia === 'GET' ||\n (config.client.config.request?.gql?.transferVia === 'GET' && !config.config.transferVia)))\n ) {\n return undefined;\n }\n\n if (isGqlQueryConfig(config.config)) {\n const queryTemplate = config.config.query;\n const query = transformGql(queryTemplate);\n\n body = query(config.args?.variables);\n } else {\n body = config.args?.body;\n }\n\n return body;\n};\n\nexport const computeQueryAuthHeader = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n}) => {\n let authHeader: Record<string, string> | null = null;\n\n if (config.config.secure) {\n const header = config.client.authProvider?.header;\n\n if (header) {\n authHeader = header;\n }\n } else if (config.client.authProvider?.header) {\n if (config.config.secure === undefined || config.config.secure) {\n authHeader = config.client.authProvider.header;\n }\n }\n\n return authHeader;\n};\n\nexport const computeQueryHeaders = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n args?: BaseArguments;\n}) => {\n const authHeader = computeQueryAuthHeader(config);\n\n const mergedHeaders =\n mergeHeaders(\n getDefaultHeaders(config.client.config.request?.headers, config.config.method),\n authHeader,\n config.args?.headers,\n ) || undefined;\n\n return mergedHeaders;\n};\n\nexport const computeQueryQueryParams = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n args?: BaseArguments;\n}) => {\n if (\n isGqlQueryConfig(config.config) &&\n (config.config.transferVia === 'GET' ||\n (config.client.config.request?.gql?.transferVia === 'GET' && !config.config.transferVia))\n ) {\n const queryTemplate = config.config.query;\n const query = transformGql(queryTemplate);\n\n let params = query(config.args?.variables);\n\n if (config.args?.queryParams) {\n params = { ...params, ...config.args?.queryParams };\n }\n\n return params;\n }\n\n return config.args?.queryParams;\n};\n\nexport const paginatedEntityValueUpdater =\n <\n T extends Paginated<unknown>,\n Args extends BaseArguments,\n Entity,\n J extends T extends Paginated<infer X> ? X : never,\n >(\n findFn: (val: J, entity: Entity) => boolean,\n ) =>\n ({ response, rawResponse, entity }: { rawResponse: T; response: T; args: Args; entity: Entity }) => {\n const indexOfEntityRaw = rawResponse.items.findIndex((item) => findFn(item as J, entity));\n const indexOfEntity = response.items.findIndex((item) => findFn(item as J, entity));\n\n if (indexOfEntity === -1 || indexOfEntityRaw === -1) {\n return null;\n }\n\n const newRawResponse = {\n ...rawResponse,\n items: [\n ...rawResponse.items.slice(0, indexOfEntityRaw),\n entity,\n ...rawResponse.items.slice(indexOfEntityRaw + 1),\n ],\n };\n\n const newResponse = {\n ...response,\n items: [...response.items.slice(0, indexOfEntity), entity, ...response.items.slice(indexOfEntity + 1)],\n };\n\n return {\n response: newResponse,\n rawResponse: newRawResponse,\n };\n };\n","import { untracked } from '@angular/core';\nimport {\n BehaviorSubject,\n combineLatest,\n EMPTY,\n filter,\n interval,\n map,\n Observable,\n of,\n ReplaySubject,\n shareReplay,\n skip,\n Subject,\n Subscription,\n switchMap,\n take,\n takeUntil,\n takeWhile,\n tap,\n timer,\n} from 'rxjs';\nimport { isBearerAuthProvider } from '../auth';\nimport { EntityStore } from '../entity';\nimport { V2QueryClient, v2ShouldCacheQuery } from '../query-client';\nimport { request, RequestError, RequestEvent, RequestHeaders } from '../request';\nimport {\n BaseArguments,\n ExecuteQueryOptions,\n GqlQueryConfig,\n PollConfig,\n QueryAutoRefreshConfig,\n QueryStateMeta,\n QueryStateType,\n RestQueryConfig,\n V2QueryState,\n V2RouteType,\n} from './query.types';\nimport {\n computeQueryBody,\n computeQueryHeaders,\n computeQueryMethod,\n filterFailure,\n filterSuccess,\n isGqlQueryConfig,\n isQueryStateCancelled,\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStatePrepared,\n isQueryStateSuccess,\n switchQueryState,\n takeUntilResponse,\n} from './query.utils';\n\nlet _nextQueryId = 0;\n\nexport class V2Query<\n Response,\n Arguments extends BaseArguments | undefined,\n Route extends V2RouteType<Arguments>,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n> {\n readonly _id = _nextQueryId++;\n\n private _currentLocalId = 0;\n private _pollingSubscription: Subscription | null = null;\n private _onAbort$ = new Subject<void>();\n private _currentPollConfig: PollConfig | null = null;\n\n /**\n * @internal\n * Used to track which components depend on this query.\n * The key is the component's _tNode index.\n * The value is the number of times the component has subscribed to this query.\n * The value might increase since we cant distinguish between a component and a host directive applied to it.\n */\n _dependents: Record<number, number> = {};\n\n /**\n * @internal\n */\n _dependentsChanged$ = new ReplaySubject<Record<number, number>>();\n\n /**\n * @internal\n */\n _isPollingPaused = false;\n\n private _memoizedState$: Observable<V2QueryState<Data>> | null = null;\n\n private readonly _state$ = new BehaviorSubject<V2QueryState<Response>>({\n type: QueryStateType.Prepared,\n meta: { id: this._currentLocalId, triggeredVia: 'program' },\n });\n\n private get _nextId() {\n return ++this._currentLocalId;\n }\n\n get state$(): Observable<V2QueryState<Data>> {\n if (!this._memoizedState$) {\n this._memoizedState$ = this._state$.pipe(\n tap((s) => {\n if (!this._client.config.logging?.preparedQuerySubscriptions) return;\n\n if (isQueryStatePrepared(s)) {\n console.warn(\n `Query ${this._routeWithParams} was subscribed to in the prepared state. Did you forget to call .execute()?`,\n );\n }\n }),\n switchMap((s) => this._transformState(s)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n }\n return this._memoizedState$;\n }\n\n /**\n * The current state of the query.\n *\n * **Warning!** This differs from the `state$` observable in that it does not use the query store. Thus, the response data might be outdated.\n * Use `state$` (or `firstValueFrom(state$)`) the most up-to-date data.\n */\n get rawState() {\n return this._state$.value;\n }\n\n get isExpired() {\n if (isQueryStateLoading(this.rawState)) {\n return false;\n }\n\n if (\n isQueryStatePrepared(this.rawState) ||\n isQueryStateCancelled(this.rawState) ||\n isQueryStateFailure(this.rawState)\n ) {\n return true;\n }\n\n const ts = this.rawState.meta.expiresAt;\n\n if (!ts) {\n return true;\n }\n\n return ts < Date.now();\n }\n\n get isInUse() {\n return this._state$.observed || Object.keys(this._dependents).length > 0;\n }\n\n /**\n * @internal\n */\n get _subscriberCount() {\n return this._state$.observers.length;\n }\n\n get isPolling() {\n return !!this._pollingSubscription;\n }\n\n get autoRefreshOnConfig() {\n const base = this._queryConfig.autoRefreshOn ?? {};\n\n const transformed: Readonly<QueryAutoRefreshConfig> = {\n queryClientDefaultHeadersChange: base.queryClientDefaultHeadersChange ?? true,\n windowFocus: base.windowFocus ?? true,\n };\n\n return transformed;\n }\n\n /**\n * @internal\n */\n get _enableSmartPolling() {\n return this._queryConfig.enableSmartPolling ?? true;\n }\n\n get store() {\n return this._queryConfig.entity?.store ?? null;\n }\n\n get canBeCached() {\n return v2ShouldCacheQuery(this._queryConfig.method);\n }\n\n get _isInMockMode() {\n return !!this._arguments?.mock;\n }\n\n constructor(\n private readonly _client: V2QueryClient,\n\n /**\n * @internal\n */\n public readonly _queryConfig:\n | RestQueryConfig<Route, Response, Arguments, Store, Data, Id>\n | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>,\n\n /**\n * @internal\n */\n public readonly _routeWithParams: Route,\n\n /**\n * @internal\n */\n public readonly _arguments: Arguments,\n\n /**\n * @internal\n */\n public readonly _queryStoreKey: string,\n ) {}\n\n execute(options: ExecuteQueryOptions = {}) {\n const { skipCache = false, _triggeredVia: triggeredVia = 'program', cancelPrevious = false } = options;\n const { authProvider } = this._client;\n const queryConfig = this._queryConfig;\n\n if (!this.isExpired && !skipCache && isQueryStateSuccess(this.rawState)) {\n return this;\n }\n\n if (queryConfig.secure && !authProvider && !this._isInMockMode) {\n throw new Error('Cannot execute secure query without auth provider');\n }\n\n const id = this._nextId;\n const meta: QueryStateMeta = { id, triggeredVia };\n\n if (isQueryStateLoading(this.rawState)) {\n if (cancelPrevious) {\n this.abort();\n } else {\n return this;\n }\n }\n\n this._updateState({ type: QueryStateType.Loading, meta });\n\n if (this._isInMockMode) {\n this._mockRequest({}, meta, options);\n } else {\n let goSignal = of(true);\n\n if (\n authProvider &&\n isBearerAuthProvider(authProvider) &&\n queryConfig.secure &&\n !isQueryStateSuccess(authProvider.currentRefreshQuery?.rawState)\n ) {\n // On page load the query might be executed before the auth provider has been initialized.\n // In this case we need to wait for the auth provider to be ready before we can execute the query.\n goSignal = combineLatest([\n // The tokens might get set without a refresh query being created (e.g.) directly after login.\n authProvider.currentRefreshQuery$.pipe(switchQueryState(), takeUntilResponse()),\n authProvider.tokens$.pipe(take(1)),\n ]).pipe(\n takeUntil(this._onAbort$),\n switchMap(([state, tokens]) => {\n if (state && isQueryStateLoading(state)) {\n return EMPTY;\n }\n\n if (isQueryStateFailure(state)) {\n this._updateEntityState({ type: 'failure', error: state.error, headers: {} }, meta, options);\n return EMPTY;\n }\n\n if (!state && !(tokens?.token || tokens?.refreshToken)) {\n return EMPTY;\n }\n\n return of(true as const);\n }),\n take(1),\n );\n }\n\n goSignal\n .pipe(\n switchMap(() => {\n const method = computeQueryMethod({ config: queryConfig, client: this._client });\n const body = computeQueryBody({ config: queryConfig, client: this._client, args: this._arguments, method });\n const headers = computeQueryHeaders({ client: this._client, config: queryConfig, args: this._arguments });\n\n return request<Response>({\n urlWithParams: this._routeWithParams as string,\n method,\n body,\n headers,\n reportProgress: queryConfig.reportProgress,\n responseType: queryConfig.responseType,\n withCredentials: queryConfig.withCredentials,\n cacheAdapter: this._client.config.request?.cacheAdapter,\n retryFn: this._client.config.request?.retryFn,\n }).pipe(\n tap((state) => this._updateEntityState(state, meta, options)),\n takeUntil(this._onAbort$),\n );\n }),\n )\n\n .subscribe();\n }\n\n return this;\n }\n\n abort() {\n if (!isQueryStateLoading(this.rawState)) {\n return this;\n }\n\n this._onAbort$.next();\n\n this._updateState({\n type: QueryStateType.Cancelled,\n meta: { id: this.rawState.meta.id, triggeredVia: this.rawState.meta.triggeredVia },\n });\n\n return this;\n }\n\n poll(config: PollConfig) {\n if (this._pollingSubscription) {\n return this;\n }\n\n this._currentPollConfig = config;\n\n const interval$ = interval(config.interval);\n const poll$ = interval$.pipe(\n skip(config.triggerImmediately ? 0 : 1),\n takeUntil(config.takeUntil),\n takeWhile(() => !this._isPollingPaused),\n filter(() => !isQueryStateLoading(this._state$.value)),\n );\n\n this._pollingSubscription = poll$.subscribe({\n next: () => this.execute({ skipCache: true, _triggeredVia: 'poll' }),\n complete: () => this.stopPolling(),\n });\n\n return this;\n }\n\n stopPolling() {\n this._pollingSubscription?.unsubscribe();\n this._pollingSubscription = null;\n this._currentPollConfig = null;\n\n return this;\n }\n\n pausePolling() {\n this._pollingSubscription?.unsubscribe();\n this._pollingSubscription = null;\n\n this._isPollingPaused = true;\n\n return this;\n }\n\n resumePolling() {\n if (!this._isPollingPaused || !this._currentPollConfig) {\n return this;\n }\n\n this._isPollingPaused = false;\n\n return this.poll({ ...this._currentPollConfig, triggerImmediately: true });\n }\n\n onSuccess(callback: (response: Data) => void) {\n this.state$.pipe(takeUntilResponse(), filterSuccess()).subscribe((state) => callback(state.response));\n return this;\n }\n\n onFailure(callback: (error: RequestError<unknown>) => void) {\n this.state$.pipe(takeUntilResponse(), filterFailure()).subscribe((state) => callback(state.error));\n return this;\n }\n\n private _getBearerAuthProvider() {\n const authProvider = this._client.authProvider;\n\n if (authProvider && isBearerAuthProvider(authProvider)) {\n return authProvider;\n }\n\n return null;\n }\n\n private _updateEntityState(\n requestEvent: RequestEvent<Response>,\n meta: QueryStateMeta,\n options?: ExecuteQueryOptions,\n ) {\n switch (requestEvent.type) {\n case 'start':\n case 'delay-retry': {\n const { type, retryDelay, retryNumber } = requestEvent;\n const newMeta: QueryStateMeta = { ...meta, isWaitingForRetry: type === 'delay-retry', retryDelay, retryNumber };\n\n this._updateState({\n type: QueryStateType.Loading,\n meta: newMeta,\n });\n break;\n }\n\n case 'upload-progress':\n case 'download-progress': {\n this._updateState({\n type: QueryStateType.Loading,\n progress: requestEvent.progress,\n partialText: 'partialText' in requestEvent ? requestEvent.partialText : undefined,\n meta,\n });\n\n break;\n }\n\n case 'success': {\n const { response, expiresInTimestamp, headers } = requestEvent;\n const isGql = isGqlQueryConfig(this._queryConfig);\n const responseData =\n isGql && typeof response === 'object' && !!response && 'data' in response\n ? (response['data'] as Response)\n : (response as Response);\n\n if (this._queryConfig.entity && this._queryConfig.entity.set) {\n const id = this._queryConfig.entity?.id({ args: this._arguments, response: responseData });\n\n this._queryConfig.entity?.set({\n args: this._arguments,\n response: responseData,\n id,\n store: this._queryConfig.entity.store,\n });\n }\n\n this._updateState({\n type: QueryStateType.Success,\n response: responseData,\n headers: headers,\n meta: { ...meta, expiresAt: expiresInTimestamp },\n });\n\n break;\n }\n\n case 'failure': {\n const { error } = requestEvent;\n const failure = () => this._updateState({ type: QueryStateType.Failure, error, meta });\n const bearerAuthProvider = this._getBearerAuthProvider();\n\n if (\n !bearerAuthProvider ||\n options?._isUnauthorizedRetry ||\n error.status !== 401 ||\n !bearerAuthProvider.shouldRefreshOnUnauthorizedResponse\n ) {\n return failure();\n }\n\n const query = bearerAuthProvider._refreshQuery();\n if (!query) return failure();\n\n query.state$\n .pipe(\n takeUntilResponse(),\n takeUntil(this._onAbort$),\n tap((state) =>\n isQueryStateSuccess(state) ? this.execute({ ...options, _isUnauthorizedRetry: true }) : failure(),\n ),\n )\n .subscribe();\n\n break;\n }\n\n case 'cancel': {\n this._updateState({\n type: QueryStateType.Cancelled,\n meta,\n });\n\n break;\n }\n }\n }\n\n private _transformState(s: V2QueryState<Response>): Observable<V2QueryState<Data>> {\n if (!isQueryStateSuccess(s) || !this._queryConfig.entity?.get) {\n return of(s) as Observable<V2QueryState<Data>>;\n }\n\n const id = this._queryConfig.entity.id({ args: this._arguments, response: s.response });\n\n return this._queryConfig.entity\n .get({ args: this._arguments, id, response: s.response, store: this._queryConfig.entity.store })\n .pipe(map((v) => ({ ...s, response: v })));\n }\n\n private _updateState(s: V2QueryState<Response>) {\n // We need to use untracked here to avoid Angular's \"allowSignalWrites is false\" error when executing queries inside Angular's computed/effect signal functions.\n untracked(() => this._state$.next(s));\n }\n\n private _mockRequest(headers: RequestHeaders | undefined, meta: QueryStateMeta, options: ExecuteQueryOptions) {\n if (!this._arguments?.mock) return;\n\n const { delay = 200, error, response, retryIntoResponse = false, progress } = this._arguments.mock;\n const progressFileSize = progress?.fileSize ?? 1000000;\n const progressEventType = progress?.eventType ?? 'upload';\n const progressEventCount = progress?.eventCount ?? 5;\n const progressOmitTotal = progress?.omitTotal ?? false;\n const omitPartialText = progress?.omitPartialText ?? false;\n\n const finalResolveMock = () => {\n if (error) {\n this._updateEntityState({ error, headers: headers ?? {}, type: 'failure' }, meta, options);\n return;\n }\n\n this._updateEntityState(\n { response: response as Response, headers: headers ?? {}, type: 'success' },\n meta,\n options,\n );\n };\n\n if (progress) {\n interval(delay)\n .pipe(\n tap((a) => {\n if (a === progressEventCount + 1) {\n finalResolveMock();\n } else {\n const current = Math.min(progressFileSize * a, progressFileSize * progressEventCount);\n const percentage = (current / (progressFileSize * progressEventCount)) * 100;\n\n this._updateEntityState(\n {\n type: progressEventType === 'upload' ? 'upload-progress' : 'download-progress',\n headers: headers ?? {},\n progress: { current, ...(progressOmitTotal ? {} : { percentage, total: progressFileSize }) },\n partialText: omitPartialText ? undefined : `Partial text ${a}`,\n },\n meta,\n options,\n );\n }\n }),\n takeUntil(this._onAbort$),\n takeWhile((a) => a < progressEventCount + 1, true),\n )\n .subscribe();\n } else if (retryIntoResponse) {\n interval(delay)\n .pipe(\n tap((a) => {\n if (a === 3) {\n finalResolveMock();\n } else {\n const aModified = a + 1;\n this._updateEntityState(\n {\n type: 'delay-retry',\n headers: headers ?? {},\n retryDelay: 1000 + 1000 * aModified,\n retryNumber: aModified,\n },\n meta,\n options,\n );\n }\n }),\n takeUntil(this._onAbort$),\n takeWhile((a) => a < 3, true),\n )\n .subscribe();\n } else {\n timer(delay)\n .pipe(\n tap(() => finalResolveMock()),\n takeUntil(this._onAbort$),\n )\n .subscribe();\n }\n }\n\n /**\n * @internal\n */\n _addDependent(tNodeIndex: number) {\n if (!this._dependents[tNodeIndex]) {\n this._dependents[tNodeIndex] = 0;\n }\n\n this._dependents[tNodeIndex]++;\n\n this._dependentsChanged$.next(this._dependents);\n }\n\n /**\n * @internal\n */\n _removeDependent(tNodeIndex: number) {\n const count = this._dependents[tNodeIndex];\n if (count === undefined) {\n return;\n }\n\n if (this._dependents[tNodeIndex] !== undefined) {\n this._dependents[tNodeIndex]--;\n }\n\n if (count <= 1) {\n delete this._dependents[tNodeIndex];\n }\n\n this._dependentsChanged$.next(this._dependents);\n }\n\n /**\n * @internal\n */\n _hasDependents() {\n return Object.keys(this._dependents).length > 0;\n }\n}\n","import { AnyV2QueryCreator } from '../query-creator';\nimport { AuthProvider } from './auth-provider.types';\nimport { BasicAuthProvider } from './basic-auth-provider';\nimport { V2BearerAuthProvider } from './bearer-auth-provider';\nimport { CustomHeaderAuthProvider } from './custom-header-auth-provider';\n\nexport const isBasicAuthProvider = (authProvider: AuthProvider): authProvider is BasicAuthProvider =>\n authProvider instanceof BasicAuthProvider;\n\nexport const isBearerAuthProvider = <T extends AnyV2QueryCreator>(\n authProvider: AuthProvider,\n): authProvider is V2BearerAuthProvider<T> => authProvider instanceof V2BearerAuthProvider;\n\nexport const isCustomHeaderAuthProvider = (authProvider: AuthProvider): authProvider is CustomHeaderAuthProvider =>\n authProvider instanceof CustomHeaderAuthProvider;\n\nexport const decryptBearer = <Result = Record<string, unknown>>(token: string) => {\n try {\n const base64Url = token.split('.')[1];\n\n if (!base64Url) {\n return null;\n }\n\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n .join(''),\n );\n\n return JSON.parse(jsonPayload) as Result;\n } catch (error) {\n console.error(`Invalid bearer token: ${token}`, error);\n\n return null;\n }\n};\n","import { deleteCookie, getCookie, setCookie } from '@ethlete/core';\nimport { BehaviorSubject, Subject, takeUntil, tap, timer } from 'rxjs';\nimport {\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStateSuccess,\n switchQueryState,\n takeUntilResponse,\n} from '../query';\nimport { AnyV2QueryCreator, ConstructQuery, QueryResponseOf } from '../query-creator';\nimport {\n AuthBearerRefreshStrategy,\n AuthProvider,\n AuthProviderBearerConfig,\n TokenResponse,\n} from './auth-provider.types';\nimport { decryptBearer } from './auth-provider.utils';\n\nexport class V2BearerAuthProvider<T extends AnyV2QueryCreator> implements AuthProvider {\n private readonly _destroy$ = new Subject<boolean>();\n private readonly _currentRefreshQuery$ = new BehaviorSubject<ConstructQuery<T> | null>(null);\n\n private readonly _tokens$ = new BehaviorSubject<TokenResponse>({\n token: null,\n refreshToken: null,\n });\n\n get header() {\n return { Authorization: `Bearer ${this._tokens$.getValue().token}` };\n }\n\n get tokens$() {\n return this._tokens$.asObservable();\n }\n\n get tokens() {\n return this._tokens$.getValue();\n }\n\n get currentRefreshQuery$() {\n return this._currentRefreshQuery$.asObservable();\n }\n\n get currentRefreshQuery() {\n return this._currentRefreshQuery$.getValue();\n }\n\n get shouldRefreshOnUnauthorizedResponse() {\n return (\n !!this._config.refreshConfig &&\n (this._config.refreshConfig.refreshOnUnauthorizedResponse === undefined ||\n this._config.refreshConfig.refreshOnUnauthorizedResponse)\n );\n }\n\n constructor(public _config: AuthProviderBearerConfig<T>) {\n const cookieEnabled = _config.refreshConfig?.cookieEnabled ?? true;\n const cookieToken =\n _config.refreshConfig?.cookieName && cookieEnabled ? (getCookie(_config.refreshConfig.cookieName) ?? null) : null;\n\n this._tokens$.next({\n token: _config.token || null,\n refreshToken: _config.refreshConfig?.token || cookieToken || null,\n });\n\n if (!this.tokens.token && !this.tokens.refreshToken) {\n if (!_config.refreshConfig?.cookieName) {\n console.error(\n 'A BearerAuthProvider was created without token or refresh token. You should provide at least a cookieName where the refresh token might be stored.',\n );\n }\n\n return;\n }\n\n if (this.tokens.token) {\n this._prepareForRefresh();\n\n if (this.tokens.refreshToken && this._config.refreshConfig?.cookieName && cookieEnabled) {\n this._setCookie();\n }\n } else if (this.tokens.refreshToken) {\n this._refreshQuery();\n }\n }\n\n cleanUp(): void {\n this._destroy$.next(true);\n this._destroy$.unsubscribe();\n this._currentRefreshQuery$.next(null);\n\n if (this._config.refreshConfig?.cookieName) {\n this._deleteCookie();\n }\n }\n\n enableCookie() {\n if (!this._config.refreshConfig?.cookieName) {\n throw new Error('No cookie name was provided');\n }\n\n if (!this.tokens.refreshToken) {\n throw new Error('No refresh token was provided');\n }\n\n this._config.refreshConfig.cookieEnabled = true;\n\n this._setCookie();\n }\n\n disableCookie() {\n if (!this._config.refreshConfig?.cookieName) {\n throw new Error('No cookie name was provided');\n }\n\n this._config.refreshConfig.cookieEnabled = false;\n\n this._deleteCookie();\n }\n\n forceRefresh() {\n return this._refreshQuery();\n }\n\n private _setCookie() {\n if (!this._config.refreshConfig?.cookieName || !this.tokens.refreshToken) return;\n\n setCookie(\n this._config.refreshConfig.cookieName,\n this.tokens.refreshToken,\n this._config.refreshConfig.cookieExpiresInDays,\n this._config.refreshConfig.cookieDomain,\n this._config.refreshConfig.cookiePath,\n this._config.refreshConfig.cookieSameSite,\n );\n }\n\n private _deleteCookie() {\n if (!this._config.refreshConfig?.cookieName) return;\n\n deleteCookie(\n this._config.refreshConfig.cookieName,\n this._config.refreshConfig.cookiePath,\n this._config.refreshConfig.cookieDomain,\n );\n }\n\n private _prepareForRefresh() {\n if (!this.tokens.token || !this._config.refreshConfig) {\n return;\n }\n\n const bearer = decryptBearer(this.tokens.token);\n\n if (!bearer) {\n return;\n }\n\n const expiresInPropertyName = this._config.refreshConfig.expiresInPropertyName || 'exp';\n const expiresIn = bearer[expiresInPropertyName] as number | undefined;\n const fiveMinutes = 5 * 60 * 1000;\n const refreshBuffer = this._config.refreshConfig.refreshBuffer ?? fiveMinutes;\n\n if (expiresIn === undefined) {\n throw new Error(`Bearer token does not contain an '${expiresInPropertyName}' property`);\n }\n\n const remainingTime = new Date(expiresIn * 1000).getTime() - refreshBuffer - new Date().getTime();\n\n const strategy = this._config.refreshConfig.strategy ?? AuthBearerRefreshStrategy.BeforeExpiration;\n\n switch (strategy) {\n case AuthBearerRefreshStrategy.BeforeExpiration:\n timer(remainingTime)\n .pipe(takeUntil(this._destroy$))\n .subscribe(() => this._refreshQuery());\n break;\n }\n }\n\n /**\n * @internal\n */\n _refreshQuery() {\n const currentQuery = this._currentRefreshQuery$.getValue();\n\n if (isQueryStateLoading(currentQuery?.rawState)) {\n return currentQuery;\n }\n\n const currentRefreshToken = this.tokens.refreshToken;\n\n if (!currentRefreshToken || !this._config.refreshConfig) {\n return;\n }\n\n const args = this._config.refreshConfig.requestArgsAdapter?.({\n token: this.tokens.token,\n refreshToken: currentRefreshToken,\n }) ?? {\n body: { refreshToken: currentRefreshToken },\n };\n\n const query = this._config.refreshConfig.queryCreator\n .prepare(args)\n .execute({ skipCache: true, _isUnauthorizedRetry: true });\n\n this._currentRefreshQuery$.next(query as ConstructQuery<T>);\n\n this._currentRefreshQuery$\n .pipe(\n switchQueryState(),\n tap((state) => {\n if (isQueryStateSuccess(state)) {\n if (this._config.refreshConfig?.responseAdapter) {\n const tokens = this._config.refreshConfig.responseAdapter(state.response as QueryResponseOf<T>);\n\n this._tokens$.next(tokens);\n } else {\n this._tokens$.next({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n token: (state.response as any)['token'],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n refreshToken: (state.response as any)['refreshToken'],\n });\n }\n const cookieEnabled = this._config.refreshConfig?.cookieEnabled ?? true;\n\n if (this._config.refreshConfig?.cookieName && this.tokens.refreshToken && cookieEnabled) {\n this._setCookie();\n }\n\n this._prepareForRefresh();\n } else if (isQueryStateFailure(state)) {\n this._tokens$.next({ token: null, refreshToken: null });\n\n if (this._config.refreshConfig?.cookieName) {\n this._deleteCookie();\n }\n }\n }),\n takeUntilResponse(),\n takeUntil(this._destroy$),\n )\n .subscribe();\n\n return query;\n }\n}\n","import { signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { createProvider } from '@ethlete/core';\n\nexport const [provideInfinityQueryResponseDelay, injectInfinityQueryResponseDelay] = createProvider(\n () => {\n const enabled = signal(false);\n const enabled$ = toObservable(enabled);\n\n return {\n enabled,\n enabled$,\n };\n },\n { name: 'Infinity Query Response Delay' },\n);\n","import { BehaviorSubject, Observable, combineLatest, map, of, shareReplay, switchMap, tap } from 'rxjs';\nimport { AnyLegacyQueryCreator } from '../interop';\nimport { filterSuccess } from '../query';\nimport { AnyV2QueryCreator, ConstructQuery, QueryDataOf, V2QueryArgsOf } from '../query-creator';\nimport { InfinityQueryConfig, InfinityQueryParamLocation } from './infinity-query.types';\n\nexport class InfinityQuery<\n QueryCreator extends AnyV2QueryCreator | AnyLegacyQueryCreator,\n Query extends ConstructQuery<QueryCreator>,\n Args extends V2QueryArgsOf<QueryCreator>,\n QueryResponse extends QueryDataOf<QueryCreator>,\n InfinityResponse extends unknown[],\n> {\n private readonly _queries$ = new BehaviorSubject<Query[]>([]);\n private readonly _currentPage$ = new BehaviorSubject<number | null>(null);\n private readonly _currentCalculatedPage$ = new BehaviorSubject<number | null>(null);\n private readonly _totalPages$ = new BehaviorSubject<number | null>(null);\n private readonly _itemsPerPage$ = new BehaviorSubject<number>(10);\n\n private readonly _data$ = this._queries$.pipe(\n switchMap((queries) => {\n if (!queries.length) {\n return of([]);\n }\n\n return combineLatest(\n queries.map((query) =>\n query.state$.pipe(\n filterSuccess(),\n map((state) => ({ state, query })),\n ),\n ),\n );\n }),\n tap((stateMaps) => {\n const lastState = stateMaps[stateMaps.length - 1]?.state;\n const lastQuery = stateMaps[stateMaps.length - 1]?.query;\n\n if (!lastState || !lastQuery) {\n return;\n }\n\n const totalPages =\n this._config.response.totalPagesExtractor?.({\n response: lastState.response as QueryResponse,\n itemsPerPage: this.itemsPerPage,\n args: lastQuery._arguments,\n }) ??\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (lastState.response as any)?.totalPages ??\n null;\n\n this._totalPages$.next(totalPages);\n }),\n map((stateMaps) => {\n if (!stateMaps.length) {\n return null;\n }\n\n const fullData = stateMaps.reduce(\n (acc, stateMap) => {\n const valExtractFn = this._config?.response?.valueExtractor;\n let data = valExtractFn\n ? valExtractFn?.(stateMap.state.response as QueryResponse)\n : (stateMap.state.response as InfinityResponse);\n\n if (this._config.response.reverse) {\n data = [...data].reverse() as InfinityResponse;\n }\n\n if (this._config.response.appendItemsTo === 'start') {\n acc.unshift(...data);\n } else {\n acc.push(...data);\n }\n return acc;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [] as any as InfinityResponse,\n );\n\n return fullData;\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n private readonly _lastQuery$ = this._queries$.pipe(\n map((queries) => queries[queries.length - 1] ?? null),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n get currentPage$() {\n return this._currentPage$.asObservable();\n }\n\n get currentPage() {\n return this._currentPage$.getValue();\n }\n\n get currentCalculatedPage$() {\n return this._currentCalculatedPage$.asObservable();\n }\n\n get currentCalculatedPage() {\n return this._currentCalculatedPage$.getValue();\n }\n\n get totalPages$() {\n return this._totalPages$.asObservable();\n }\n\n get totalPages() {\n return this._totalPages$.getValue();\n }\n\n get itemsPerPage$() {\n return this._itemsPerPage$.asObservable();\n }\n\n get itemsPerPage() {\n return this._itemsPerPage$.getValue();\n }\n\n get data$() {\n return this._data$;\n }\n\n get currentQuery$() {\n return this._lastQuery$;\n }\n\n constructor(\n private _config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>,\n private _destroy$: Observable<boolean>,\n ) {\n this._itemsPerPage$.next(this._config.limitParam?.value ?? 10);\n }\n\n nextPage() {\n const newPage = (this._currentPage$.value ?? 0) + 1;\n const calculatedPage =\n this._config?.pageParam?.valueCalculator?.({\n page: newPage,\n totalPages: this.totalPages,\n itemsPerPage: this.itemsPerPage,\n }) ?? newPage;\n\n if (this.totalPages !== null && newPage > this.totalPages) {\n console.error(\n 'Cannot load more pages, already at the end. Make sure to not render the infinity query trigger using *ngIf canLoadMore',\n );\n return;\n }\n\n const args = this._prepareArgs(this._config, calculatedPage);\n\n const query = this._config.queryCreator.prepare(args).execute() as Query;\n\n if (this._config.pollingInterval) {\n query.poll({ interval: this._config.pollingInterval, takeUntil: this._destroy$ });\n }\n\n this._queries$.next([...this._queries$.value, query]);\n\n this._currentPage$.next(newPage);\n this._currentCalculatedPage$.next(calculatedPage);\n }\n\n reset(\n newConfig?: Omit<\n InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>,\n 'queryCreator' | 'response'\n >,\n ) {\n this._config = { ...this._config, ...(newConfig ?? {}) };\n\n this._currentPage$.next(null);\n this._currentCalculatedPage$.next(null);\n this._totalPages$.next(null);\n this._itemsPerPage$.next(this._config.limitParam?.value ?? 10);\n this._queries$.next([]);\n\n this.nextPage();\n }\n\n private _prepareArgs(config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>, page: number) {\n const pageParamLocation = this._getPageParamLocation(config?.pageParam?.location);\n\n const pageArgs = {\n [pageParamLocation]: {\n [config?.pageParam?.key ?? 'page']: page,\n },\n };\n\n const limitParamLocation = this._getPageParamLocation(config?.limitParam?.location);\n\n const limitArgs = {\n [limitParamLocation]: {\n [config?.limitParam?.key ?? 'limit']: config?.limitParam?.value ?? 10,\n },\n };\n\n const defaultConfig = config?.defaultArgs ?? {};\n\n const mergedArgs =\n pageParamLocation === limitParamLocation\n ? {\n ...defaultConfig,\n [pageParamLocation]: {\n ...(config?.defaultArgs?.[pageParamLocation] ?? {}),\n ...pageArgs[limitParamLocation],\n ...limitArgs[limitParamLocation],\n },\n }\n : {\n ...defaultConfig,\n [pageParamLocation]: {\n ...(config?.defaultArgs?.[pageParamLocation] ?? {}),\n ...pageArgs[pageParamLocation],\n },\n [limitParamLocation]: {\n ...(config?.defaultArgs?.[limitParamLocation] ?? {}),\n ...limitArgs[limitParamLocation],\n },\n };\n\n return mergedArgs;\n }\n\n private _getPageParamLocation(location: InfinityQueryParamLocation | undefined) {\n const loc = location ?? 'query';\n\n switch (loc) {\n case 'path':\n return 'pathParams';\n case 'query':\n return 'queryParams';\n case 'body':\n return 'body';\n case 'header':\n return 'headers';\n case 'variable':\n return 'variables';\n default:\n throw new Error(`Invalid pageParamLocation: ${loc}`);\n }\n }\n}\n","import { AnyLegacyQueryCreator } from '../interop';\nimport { AnyV2QueryCreator, QueryDataOf, V2QueryArgsOf } from '../query-creator';\nimport { InfinityQueryConfig, PageParamCalculatorOptions } from './infinity-query.types';\n\nexport const createInfinityQueryConfig = <\n QueryCreator extends AnyV2QueryCreator | AnyLegacyQueryCreator,\n Args extends V2QueryArgsOf<QueryCreator>,\n QueryResponse extends QueryDataOf<QueryCreator>,\n InfinityResponse extends unknown[],\n>(\n config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>,\n) => config;\n\nexport const skipPaginationPageParamCalculator = ({ page, itemsPerPage }: PageParamCalculatorOptions) =>\n itemsPerPage * (page - 1);\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ChangeDetectorRef,\n Directive,\n ErrorHandler,\n inject,\n InjectionToken,\n Input,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { createDestroy } from '@ethlete/core';\nimport { BehaviorSubject, combineLatest, Subject, takeUntil, tap, withLatestFrom } from 'rxjs';\nimport { InfinityQuery, InfinityQueryConfig, InfinityQueryOf } from '../infinite-query';\nimport { AnyLegacyQueryCreator, isLegacyQuery } from '../interop';\nimport {\n BaseArguments,\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStateSuccess,\n switchQueryState,\n} from '../query';\nimport { AnyV2QueryCreator, ConstructQuery } from '../query-creator';\nimport { RequestError } from '../request';\nimport {\n injectInfinityQueryResponseDelay,\n provideInfinityQueryResponseDelay,\n} from './infinity-query-response-delay-provider';\n\ntype InfinityQueryContext<\n Q extends InfinityQueryConfig<DirectiveQueryCreator, BaseArguments | undefined, any, unknown[]>,\n> = {\n $implicit: Q['response']['arrayType'] | null;\n etInfinityQuery: Q['response']['arrayType'] | null;\n loading: boolean;\n error: RequestError<unknown> | null;\n\n isFirstLoad: boolean;\n canLoadMore: boolean;\n currentPage: number | null;\n currentCalculatedPage: number | null;\n totalPages: number | null;\n itemsPerPage: number | null;\n\n currentQuery: ConstructQuery<Q['queryCreator']> | null;\n};\n\nexport const INFINITY_QUERY_TOKEN = new InjectionToken<InfinityQueryDirective<any>>('INFINITY_QUERY_TOKEN');\n\ntype DirectiveQueryCreator = AnyV2QueryCreator | AnyLegacyQueryCreator;\n\n@Directive({\n selector: '[etInfinityQuery]',\n exportAs: 'etInfinityQuery',\n\n providers: [\n { provide: INFINITY_QUERY_TOKEN, useExisting: InfinityQueryDirective },\n provideInfinityQueryResponseDelay(),\n ],\n})\nexport class InfinityQueryDirective<\n Q extends InfinityQueryConfig<DirectiveQueryCreator, BaseArguments | undefined, any, unknown[]>,\n> {\n private readonly _queryConfigChanged$ = new Subject<boolean>();\n private readonly _viewContext: InfinityQueryContext<Q> = {\n $implicit: null,\n etInfinityQuery: null,\n loading: false,\n error: null,\n\n isFirstLoad: false,\n canLoadMore: false,\n currentPage: null,\n currentCalculatedPage: null,\n totalPages: null,\n itemsPerPage: null,\n\n currentQuery: null,\n };\n private _infinityQueryInstance: InfinityQueryOf<Q> | null = null;\n\n private readonly _destroy$ = createDestroy();\n private readonly _cdr = inject(ChangeDetectorRef);\n private readonly _viewContainerRef = inject(ViewContainerRef);\n private readonly _mainTemplateRef = inject(TemplateRef<InfinityQueryContext<Q>>);\n private readonly _errorHandler = inject(ErrorHandler);\n private readonly _infinityQueryResponseDelay = injectInfinityQueryResponseDelay({ host: true });\n\n private readonly _data$ = new BehaviorSubject<Q['response']['arrayType']>([]);\n\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input('etInfinityQuery')\n get infinityQuery(): Q {\n return this._infinityQuery;\n }\n set infinityQuery(v: Q) {\n this._cleanup();\n\n if (v.enabled === false) {\n this._infinityQuery = v;\n this._infinityQueryInstance = null;\n return;\n }\n\n this._infinityQuery = v;\n this._infinityQueryInstance = this._setupInfinityQuery(v);\n this._infinityQueryInstance.nextPage();\n }\n private _infinityQuery!: Q;\n\n get context() {\n return this._viewContext;\n }\n\n get instance() {\n return this._infinityQueryInstance;\n }\n\n get data$() {\n return this._data$.asObservable();\n }\n\n data = toSignal(this._data$, { requireSync: true });\n\n static ngTemplateContextGuard<\n Q extends InfinityQueryConfig<DirectiveQueryCreator, BaseArguments | undefined, any, unknown[]>,\n >(dir: InfinityQueryDirective<Q>, ctx: unknown): ctx is InfinityQueryContext<Q> {\n return true;\n }\n\n constructor() {\n this._viewContainerRef.createEmbeddedView(this._mainTemplateRef, this._viewContext);\n }\n\n private _setupInfinityQuery(config: Q) {\n const instance = new InfinityQuery(config as any, this._destroy$) as InfinityQueryOf<Q>;\n\n combineLatest([\n instance.currentQuery$.pipe(switchQueryState(), withLatestFrom(instance.currentQuery$)),\n this._infinityQueryResponseDelay.enabled$,\n instance.data$,\n ])\n .pipe(\n tap(([[state, currentQuery], isDelayed, infinityArray]) => {\n this._viewContext.currentPage = instance.currentPage;\n this._viewContext.totalPages = instance.totalPages;\n this._viewContext.itemsPerPage = instance.itemsPerPage;\n this._viewContext.canLoadMore =\n (instance.totalPages !== null &&\n instance.currentPage !== null &&\n instance.totalPages > instance.currentPage) ||\n false;\n this._viewContext.currentCalculatedPage = instance.currentCalculatedPage;\n this._viewContext.currentQuery = currentQuery;\n\n if (isQueryStateLoading(state) || isDelayed || !infinityArray) {\n this._viewContext.loading = state ? state.meta.triggeredVia !== 'poll' : true;\n this._viewContext.error = null;\n this._viewContext.isFirstLoad = this.context.etInfinityQuery === null;\n } else if (isQueryStateFailure(state)) {\n this._viewContext.loading = false;\n this._viewContext.error = state.error;\n this._viewContext.isFirstLoad = false;\n\n if (isLegacyQuery(currentQuery)) {\n this._errorHandler.handleError(state.error.httpErrorResponse);\n }\n } else if (isQueryStateSuccess(state)) {\n this._viewContext.loading = false;\n this._viewContext.error = null;\n this._viewContext.isFirstLoad = false;\n this._viewContext.etInfinityQuery = this._viewContext.$implicit =\n infinityArray as Q['response']['arrayType'];\n this._data$.next(infinityArray);\n }\n\n this._cdr.markForCheck();\n }),\n takeUntil(this._destroy$),\n takeUntil(this._queryConfigChanged$),\n )\n .subscribe();\n\n return instance;\n }\n\n loadNextPage() {\n if (!this._infinityQueryInstance) {\n return;\n }\n\n if (this._viewContext.loading) {\n return;\n }\n\n this._infinityQueryInstance.nextPage();\n }\n\n reset(newConfig?: Omit<Q, 'queryCreator' | 'response'>) {\n if (!this._infinityQueryInstance) {\n return;\n }\n\n this._infinityQueryInstance.reset(newConfig as any);\n }\n\n private _cleanup() {\n this._queryConfigChanged$.next(true);\n\n this._viewContext.loading = false;\n this._viewContext.error = null;\n this._viewContext.etInfinityQuery = null;\n this._viewContext.$implicit = null;\n\n this._viewContext.isFirstLoad = false;\n this._viewContext.canLoadMore = false;\n this._viewContext.currentPage = null;\n this._viewContext.itemsPerPage = null;\n this._viewContext.totalPages = null;\n\n this._viewContext.currentQuery = null;\n\n this._data$.next([]);\n }\n}\n","import { computed, Directive, ElementRef, inject, input, OnDestroy, OnInit } from '@angular/core';\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\nimport { INFINITY_QUERY_TOKEN, InfinityQueryDirective } from './infinity-query.directive';\n\n@Directive({\n selector: '[etInfinityQueryTrigger], et-infinity-query-trigger',\n})\nexport class InfinityQueryTriggerDirective implements OnInit, OnDestroy {\n private _elementRef = inject(ElementRef<HTMLElement>);\n private _infinityQuery = inject(INFINITY_QUERY_TOKEN);\n\n private _destroy = new Subject<boolean>();\n private _observer: IntersectionObserver | null = null;\n\n click$ = fromEvent(this._elementRef.nativeElement, 'click');\n\n readonly scrollContainerSelector = input<string | null>(null);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n infinityQueryOverride = input<InfinityQueryDirective<any> | null>(null);\n\n infinityQuery = computed(() => this.infinityQueryOverride() ?? this._infinityQuery);\n\n ngOnInit(): void {\n const isInteractive = this._elementRef.nativeElement.tagName === 'BUTTON';\n\n if (isInteractive) {\n this.click$.pipe(takeUntil(this._destroy)).subscribe(() => this.infinityQuery().loadNextPage());\n } else {\n this._setupIntersectionObserver();\n }\n }\n\n ngOnDestroy(): void {\n this._destroy.next(true);\n this._destroy.unsubscribe();\n this._observer?.disconnect();\n }\n\n private _setupIntersectionObserver(): void {\n const scrollContainerSelector = this.scrollContainerSelector();\n this._observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n\n if (!entry) return;\n\n if (entry.isIntersecting && !this.infinityQuery().context.loading) {\n this.infinityQuery().loadNextPage();\n }\n },\n {\n root: scrollContainerSelector ? document.querySelector(scrollContainerSelector) : null,\n rootMargin: '0px',\n threshold: [0.25, 0.5, 0.75, 1],\n },\n );\n\n this._observer.observe(this._elementRef.nativeElement);\n }\n}\n","import {\n ChangeDetectorRef,\n Directive,\n ErrorHandler,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport { AnyLegacyQuery, isLegacyQuery } from '../interop';\nimport {\n AnyQueryCollection,\n AnyV2Query,\n QueryCollectionKeysOf,\n QueryOf,\n extractQuery,\n isQueryCollection,\n isQueryStateCancelled,\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStatePrepared,\n isQueryStateSuccess,\n} from '../query';\nimport { QueryDataOf } from '../query-creator';\nimport { RequestError, RequestProgress } from '../request';\nimport { queryStateSignal } from '../utils';\n\nexport type QueryDirectiveContext<Q extends QueryDirectiveType | null> = {\n /**\n * The queries's response data.\n */\n $implicit: QueryDataOf<QueryOf<Q>> | null;\n\n /**\n * The queries's response data.\n */\n etQuery: QueryDataOf<QueryOf<Q>> | null;\n\n /**\n * The query used inside this directive. Useful if for instance the query gets unwrapped via async pipe inside the directive.\n */\n query: QueryOf<Q> | null;\n\n /**\n * Is true when the query is triggered by user interaction.\n */\n loading: boolean;\n\n /**\n * Is true when the query is triggered by either polling or auto refresh event.\n */\n refreshing: boolean;\n\n /**\n * The query's progress state.\n */\n progress: RequestProgress | null;\n\n /**\n * The query's error state.\n */\n error: RequestError<unknown> | null;\n\n /**\n * The query's scope (only available when the query is a collection)\n */\n scope: QueryCollectionKeysOf<Q> | null;\n};\n\nexport type QueryDirectiveType = AnyV2Query | AnyLegacyQuery | AnyQueryCollection;\n\n@Directive({\n selector: '[etQuery]',\n})\nexport class QueryDirective<Q extends QueryDirectiveType | null> {\n private errorHandler = inject(ErrorHandler);\n private cdr = inject(ChangeDetectorRef);\n\n private readonly _viewContext: QueryDirectiveContext<Q> = {\n $implicit: null,\n etQuery: null,\n loading: false,\n refreshing: false,\n error: null,\n progress: null,\n scope: null,\n query: null,\n };\n\n query = input.required<Q>({ alias: 'etQuery' });\n\n cache = input(false, { alias: 'etQueryCache' });\n\n queryState = queryStateSignal(this.query);\n\n static ngTemplateContextGuard<Q extends QueryDirectiveType | null>(\n dir: QueryDirective<Q>,\n ctx: unknown,\n ): ctx is QueryDirectiveContext<Q> {\n return true;\n }\n\n constructor() {\n inject(ViewContainerRef).createEmbeddedView(inject(TemplateRef), this._viewContext);\n\n effect(() => {\n const query = extractQuery(this.query());\n\n untracked(() => {\n if (!query) {\n this._viewContext.$implicit = null;\n this._viewContext.etQuery = null;\n this._viewContext.loading = false;\n this._viewContext.refreshing = false;\n this._viewContext.error = null;\n this._viewContext.progress = null;\n this._viewContext.scope = null;\n this._viewContext.query = null;\n return;\n }\n\n if (isQueryStatePrepared(query.rawState) || isQueryStateCancelled(query.rawState)) {\n query.execute();\n }\n\n this._viewContext.scope = isQueryCollection(query) ? (query.type as QueryCollectionKeysOf<Q>) : null;\n this._viewContext.query = query as QueryOf<Q>;\n });\n });\n\n effect(() => {\n const state = this.queryState();\n const cache = this.cache();\n\n untracked(() => {\n if (isQueryStateLoading(state)) {\n this._viewContext.progress = state.progress ?? null;\n this._viewContext.refreshing = state.meta.triggeredVia === 'auto' || state.meta.triggeredVia === 'poll';\n\n if (!this._viewContext.refreshing) {\n this._viewContext.loading = true;\n }\n } else {\n this._viewContext.loading = false;\n this._viewContext.refreshing = false;\n this._viewContext.progress = null;\n }\n\n if (isQueryStateSuccess(state)) {\n this._viewContext.etQuery = state.response as QueryDataOf<QueryOf<Q>>;\n this._viewContext.$implicit = state.response as QueryDataOf<QueryOf<Q>>;\n } else if (!cache) {\n this._viewContext.etQuery = null;\n this._viewContext.$implicit = null;\n }\n\n if (isQueryStateFailure(state)) {\n this._viewContext.error = state.error;\n\n if (isLegacyQuery(extractQuery(this.query()))) {\n this.errorHandler.handleError(state.error.httpErrorResponse);\n }\n } else {\n this._viewContext.error = null;\n }\n\n this.cdr.markForCheck();\n });\n });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { AnyV2Query } from '../../query';\n\n@Pipe({ name: 'queryShortName' })\nexport class QueryShortNamePipe implements PipeTransform {\n transform(value: AnyV2Query) {\n const route = value._routeWithParams;\n\n if (typeof route === 'string') {\n // given an url that looks like this: https://api.github.com/repos/EladBezalel/etimo-achievements or https://api.github.com/repos/EladBezalel/etimo-achievements?test=1&test2=2\n // we want to extract the last 3 parts of the url, so we get: repos/EladBezalel/etimo-achievements\n\n const parts = route.split('/');\n\n if (parts.length > 3) {\n return `.../${parts.slice(parts.length - 3).join('/')}`;\n }\n\n return route;\n }\n\n return route as string;\n }\n}\n","import { InjectionToken, isDevMode } from '@angular/core';\nimport { V2QueryClient } from '../../query-client';\n\nexport type QueryClientDevtoolsOptions = {\n displayName?: string;\n client: V2QueryClient;\n};\n\nexport const QUERY_CLIENT_DEVTOOLS_TOKEN = new InjectionToken<QueryClientDevtoolsOptions[]>(\n 'QUERY_CLIENT_DEVTOOLS_TOKEN',\n);\n\nexport const provideQueryClientForDevtools = (queryClient: QueryClientDevtoolsOptions) => {\n if (!isDevMode()) {\n console.warn(\n 'You are using the Query Devtools in production mode. This increases the size of your bundle and should only be used for development purposes.',\n );\n }\n\n return {\n provide: QUERY_CLIENT_DEVTOOLS_TOKEN,\n useValue: queryClient,\n multi: true,\n };\n};\n","import { AsyncPipe, JsonPipe, NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n TrackByFunction,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { createDestroy, nextFrame } from '@ethlete/core';\nimport { BehaviorSubject, map, of, startWith, switchMap, takeUntil, tap } from 'rxjs';\nimport { BasicAuthProvider, CustomHeaderAuthProvider, isBearerAuthProvider } from '../../../auth';\nimport { QueryDirective } from '../../../directives';\nimport { EntityStore } from '../../../entity';\nimport { AnyV2Query, isGqlQueryConfig } from '../../../query';\nimport { QueryShortNamePipe } from '../../pipes';\nimport { QUERY_CLIENT_DEVTOOLS_TOKEN, QueryClientDevtoolsOptions } from '../../utils';\n\ntype QueryDevtoolsSnapLayout = 'full' | 'left' | 'right' | 'bottom' | 'top';\ntype QueryListMode = 'live' | 'history';\ntype QueryViewMode = 'query' | 'authProvider';\n\n@Component({\n selector: 'et-query-devtools',\n templateUrl: './query-devtools.component.html',\n styleUrls: ['./query-devtools.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.ShadowDom,\n host: {\n class: 'et-query-devtools',\n },\n imports: [AsyncPipe, JsonPipe, ReactiveFormsModule, NgClass, QueryShortNamePipe, QueryDirective],\n})\nexport class QueryDevtoolsComponent {\n private readonly _cdr = inject(ChangeDetectorRef);\n protected readonly _destroy$ = createDestroy();\n\n protected readonly queryClientConfigs = inject(QUERY_CLIENT_DEVTOOLS_TOKEN);\n\n protected readonly isOpen = signal(false);\n protected readonly isTranslucent = signal(false);\n protected readonly snapLayout = signal<QueryDevtoolsSnapLayout>('full');\n protected readonly queryListMode = signal<QueryListMode>('live');\n protected readonly viewMode = signal<QueryViewMode>('query');\n\n protected showResponse = signal(false);\n protected showRawResponse = signal(false);\n protected showQueryConfig = signal(false);\n protected showEntityStoreValue = signal(false);\n protected showArguments = signal(false);\n\n protected selectedClientIdCtrl = new FormControl(0);\n\n protected readonly selectedClientId = toSignal(\n this.selectedClientIdCtrl.valueChanges.pipe(startWith(this.selectedClientIdCtrl.value)),\n );\n protected readonly selectedQueryId = signal<number | null>(null);\n\n protected readonly selectedClientConfig = computed(() => {\n if (this.queryClientConfigs.length === 1) {\n return this.queryClientConfigs[0]!;\n }\n\n const index = this.selectedClientId() ?? 0;\n\n const cfg = this.queryClientConfigs[index];\n\n if (!cfg) {\n return this.queryClientConfigs[0]!;\n }\n\n return cfg;\n });\n\n protected readonly queryStore = computed(() => {\n const config = this.selectedClientConfig();\n\n return config.client._store;\n });\n\n protected readonly queryStore$ = toObservable(this.queryStore);\n\n private readonly _queries$ = new BehaviorSubject<AnyV2Query[]>([]);\n protected readonly queries = toSignal(this._queries$);\n\n protected readonly selectedQuery = computed(() => {\n const id = this.selectedQueryId();\n const mode = this.queryListMode();\n\n if (id === null || !mode) {\n return null;\n }\n\n if (mode === 'live') {\n return this.queries()?.find((q) => q._id === id) ?? null;\n }\n\n return this.queryHistory$.getValue()?.find((q) => q._id === id) ?? null;\n });\n\n protected readonly selectedQuery$ = toObservable(this.selectedQuery);\n\n protected selectedQueryEntityStore = computed(() => {\n const query = this.selectedQuery();\n\n if (!query) return null;\n\n return query.store as EntityStore<unknown> | null;\n });\n\n protected readonly selectedQueryEntityStore$ = toObservable(this.selectedQueryEntityStore);\n\n protected readonly selectedQueryEntityStoreValue$ = this.selectedQueryEntityStore$.pipe(\n switchMap(\n (s) =>\n s?._change$.pipe(\n startWith(''),\n map(() => {\n if (!s._dictionary) return null;\n\n return Array.from(s._dictionary).reduce(\n (obj, [key, value]) => {\n obj[key] = value;\n return obj;\n },\n {} as Record<string, unknown>,\n );\n }),\n ) ?? of(null),\n ),\n );\n\n protected readonly queryHistory$ = new BehaviorSubject<AnyV2Query[]>([]);\n\n protected readonly stringifiedQueryConfig = computed(() => {\n const query = this.selectedQuery();\n\n if (!query) return null;\n\n const cfg = query._queryConfig;\n const route =\n typeof cfg.route === 'string' ? cfg.route : cfg.route ? cfg.route({}).replace(/undefined/g, ':param') : null;\n\n const sharedCfg = {\n method: cfg.method,\n secure: cfg.secure,\n route,\n reportProgress: cfg.reportProgress,\n responseType: cfg.responseType,\n withCredentials: cfg.withCredentials,\n autoRefreshOn: cfg.autoRefreshOn,\n enableSmartPolling: cfg.enableSmartPolling,\n hasEntityStore: !!cfg.entity,\n };\n\n if (isGqlQueryConfig(cfg)) {\n return {\n ...sharedCfg,\n query: cfg.query,\n transferVia: cfg.transferVia,\n };\n }\n\n return {\n ...sharedCfg,\n };\n });\n\n protected readonly authProvider = toSignal(\n toObservable(this.selectedClientConfig).pipe(switchMap((c) => c.client.authProvider$)),\n );\n\n protected readonly authProviderDetails = computed(() => {\n const provider = this.authProvider();\n\n if (!provider) return null;\n\n if (provider instanceof CustomHeaderAuthProvider) {\n return {\n type: 'CustomHeaderAuthProvider',\n header: () => provider.header,\n provider: provider,\n config: {\n name: provider._config.name,\n value: provider._config.value,\n },\n } as const;\n } else if (provider instanceof BasicAuthProvider) {\n return {\n type: 'BasicAuthProvider',\n header: () => provider.header,\n provider: provider,\n config: {\n username: provider._config.username,\n password: provider._config.password,\n },\n } as const;\n } else if (isBearerAuthProvider(provider)) {\n const refreshCfg = provider._config.refreshConfig;\n\n return {\n type: 'BearerAuthProvider',\n header: () => provider.header,\n provider: provider,\n config: {\n token: provider._config.token,\n refreshConfig: {\n refreshOnUnauthorizedResponse: refreshCfg?.refreshOnUnauthorizedResponse ?? 'true (default)',\n token: refreshCfg?.token,\n cookieName: refreshCfg?.cookieName,\n cookieDomain: refreshCfg?.cookieDomain ?? 'current origin (default)',\n cookieExpiresInDays: refreshCfg?.cookieExpiresInDays ?? '30 (default)',\n cookiePath: refreshCfg?.cookiePath ?? '/ (default)',\n cookieEnabled: refreshCfg?.cookieEnabled ?? 'true (default)',\n cookieSameSite: refreshCfg?.cookieSameSite ?? 'lax (default)',\n refreshBuffer: refreshCfg?.refreshBuffer ?? '30000 (default)',\n expiresInPropertyName: refreshCfg?.expiresInPropertyName ?? 'exp (default)',\n strategy: refreshCfg?.strategy ?? 'AuthBearerRefreshStrategy.BeforeExpiration (default)',\n requestArgsAdapter: refreshCfg?.requestArgsAdapter ? 'custom' : 'default',\n responseAdapter: refreshCfg?.responseAdapter ? 'custom' : 'default',\n },\n },\n } as const;\n } else {\n return {\n type: 'UnknownAuthProvider',\n header: () => provider.header,\n provider: provider,\n config: {},\n } as const;\n }\n });\n\n constructor() {\n this.selectedClientIdCtrl.valueChanges\n .pipe(\n tap(() => this.clearQueryHistory()),\n takeUntil(this._destroy$),\n )\n .subscribe();\n\n this.selectedQuery$\n .pipe(\n switchMap((q) => q?._dependentsChanged$ ?? of(null)),\n tap(() => this._cdr.markForCheck()),\n takeUntilDestroyed(),\n )\n .subscribe();\n\n toObservable(this.authProviderDetails)\n .pipe(switchMap((ap) => (ap?.type === 'BearerAuthProvider' ? ap.provider.tokens$ : of(null))))\n .pipe(\n tap(() => this._cdr.markForCheck()),\n takeUntilDestroyed(),\n )\n .subscribe();\n\n this.queryStore$\n .pipe(\n switchMap((s) =>\n s.storeChange$.pipe(\n startWith(''),\n map(() => s._store),\n tap((s) => {\n untracked(() => {\n this._queries$.next(Array.from(s.values()));\n });\n }),\n takeUntil(this._destroy$),\n ),\n ),\n )\n .subscribe();\n\n this.queryStore$\n .pipe(\n switchMap((s) =>\n s.queryCreated$.pipe(\n tap((query) => {\n const currentHistory = this.queryHistory$.getValue();\n\n if (!currentHistory) return;\n\n const currentHistoryClone = [...currentHistory];\n\n if (!currentHistory.some((q) => q._id === query._id)) {\n currentHistoryClone.unshift(query);\n }\n\n currentHistoryClone.splice(50);\n\n this.queryHistory$.next(currentHistoryClone);\n }),\n takeUntil(this._destroy$),\n ),\n ),\n )\n .subscribe();\n\n this._queries$\n .pipe(\n tap((queries) => {\n const currentHistory = this.queryHistory$.getValue();\n\n if (!queries || !currentHistory) return;\n\n const currentHistoryClone = [...currentHistory];\n\n for (const query of queries) {\n if (!currentHistoryClone.some((q) => q._id === query._id)) {\n currentHistoryClone.unshift(query);\n }\n }\n\n currentHistoryClone.splice(50);\n\n this.queryHistory$.next(currentHistoryClone);\n }),\n takeUntil(this._destroy$),\n )\n .subscribe();\n\n effect(() => {\n const devtoolConfig = {\n isOpen: this.isOpen(),\n isTranslucent: this.isTranslucent(),\n snapLayout: this.snapLayout(),\n showResponse: this.showResponse(),\n showRawResponse: this.showRawResponse(),\n showQueryConfig: this.showQueryConfig(),\n showEntityStoreValue: this.showEntityStoreValue(),\n showArguments: this.showArguments(),\n selectedClientId: this.selectedClientId(),\n selectedQueryPath: this.selectedQueryId(),\n queryListMode: this.queryListMode(),\n viewMode: this.viewMode(),\n };\n\n window.localStorage.setItem('ethlete:query:devtools', JSON.stringify(devtoolConfig));\n });\n\n const initialConfig = window.localStorage.getItem('ethlete:query:devtools');\n\n if (initialConfig) {\n const parsed = JSON.parse(initialConfig);\n\n this.isOpen.set(parsed.isOpen ?? false);\n this.isTranslucent.set(parsed.isTranslucent ?? false);\n this.snapLayout.set(parsed.snapLayout ?? 'full');\n this.showResponse.set(parsed.showResponse ?? false);\n this.showRawResponse.set(parsed.showRawResponse ?? false);\n this.showQueryConfig.set(parsed.showQueryConfig ?? false);\n this.showEntityStoreValue.set(parsed.showEntityStoreValue ?? false);\n this.showArguments.set(parsed.showArguments ?? false);\n this.selectedClientIdCtrl.setValue(parsed.selectedClientId ?? 0);\n this.selectedQueryId.set(parsed.selectedQueryPath ?? null);\n this.queryListMode.set(parsed.queryListMode ?? 'live');\n this.viewMode.set(parsed.viewMode ?? 'query');\n }\n }\n\n protected trackByClient: TrackByFunction<QueryClientDevtoolsOptions> = (_, { client }) => client.config.baseRoute;\n protected trackByQuery: TrackByFunction<AnyV2Query> = (_, { _id }) => _id;\n\n protected toggleOpen() {\n this.isOpen.set(!this.isOpen());\n }\n\n protected toggleTranslucent() {\n this.isTranslucent.set(!this.isTranslucent());\n }\n\n protected toggleShowResponse() {\n this.showResponse.set(!this.showResponse());\n\n nextFrame(() => {\n this._cdr.markForCheck();\n });\n }\n\n protected toggleShowQueryConfig() {\n this.showQueryConfig.set(!this.showQueryConfig());\n }\n\n protected toggleShowRawResponse() {\n this.showRawResponse.set(!this.showRawResponse());\n }\n\n protected toggleShowEntityStoreValue() {\n this.showEntityStoreValue.set(!this.showEntityStoreValue());\n }\n\n protected toggleShowArguments() {\n this.showArguments.set(!this.showArguments());\n }\n\n protected selectSnapLayout(layout: QueryDevtoolsSnapLayout) {\n this.snapLayout.set(layout);\n }\n\n protected selectQueryListMode(mode: QueryListMode) {\n this.queryListMode.set(mode);\n }\n\n protected selectViewMode(mode: QueryViewMode) {\n this.viewMode.set(mode);\n }\n\n protected selectQuery(query: AnyV2Query) {\n this.selectedQueryId.set(query._id);\n }\n\n protected clearQueryHistory() {\n this.queryHistory$.next([]);\n }\n}\n","@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Query Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Inspector</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('live'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live Queries ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('history'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Query History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history' && viewMode() === 'query') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': viewMode() !== 'authProvider' }\"\n (click)=\"selectViewMode('authProvider')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Auth Provider\n </button>\n </div>\n\n @if (viewMode() === 'query') {\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else if (viewMode() === 'authProvider') {\n <div class=\"et-qd-auth-provider__viewer\">\n @if (authProviderDetails(); as details) {\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>Type</p>\n <pre>{{ details.type }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Header value</p>\n <pre>{{ details.header() | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Config</p>\n <pre>{{ details.config | json }}</pre>\n </div>\n\n @if (details.type === 'BearerAuthProvider') {\n <div class=\"et-qd-list-item\">\n <p>Tokens</p>\n <pre>{{ details.provider.tokens$ | async | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Should refresh on unauthorized response</p>\n <pre>{{ details.provider.shouldRefreshOnUnauthorizedResponse }}</pre>\n </div>\n\n <ng-container\n *etQuery=\"\n details.provider.currentRefreshQuery$ | async as response;\n loading as loading;\n error as error;\n query as query\n \"\n >\n <div class=\"et-qd-list-item\">\n <p>Refresh query response</p>\n\n <div>\n <button (click)=\"details.provider._refreshQuery()\" class=\"et-qd-chip et-qd-chip-bordered\">\n Refresh\n </button>\n </div>\n <pre>{{ response | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query loading</p>\n <pre>{{ loading }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query error</p>\n <pre>{{ error ?? 'null' }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <pre>{{ query?.state$ | async | json }}</pre>\n </div>\n </ng-container>\n }\n </div>\n } @else {\n <p>No auth provider set</p>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n","import { Observable, Subject, debounceTime, filter, map, shareReplay, startWith } from 'rxjs';\nimport { EntityKey, EntityStoreConfig } from './entity.types';\n\nclass EntityStoreError extends Error {\n constructor(\n message: string,\n public detail?: unknown,\n ) {\n super(message);\n this.name = 'EntityStoreError';\n }\n}\n\nfunction flatten<T>(arr: T[][]): T[] {\n return arr.reduce((acc, val) => acc.concat(val), []);\n}\n\nexport class EntityStore<T> {\n /**\n * @internal\n */\n readonly _dictionary = new Map<EntityKey, T>();\n\n /**\n * @internal\n */\n readonly _change$ = new Subject<EntityKey | EntityKey[]>();\n\n constructor(private readonly _config: EntityStoreConfig) {}\n\n select(key: EntityKey): Observable<T | null>;\n select(keys: EntityKey[]): Observable<T[]>;\n select(keys: EntityKey[][]): Observable<T[]>;\n select(keyOrKeys: EntityKey | EntityKey[] | EntityKey[][]): Observable<T | null> | Observable<T[]> {\n if (Array.isArray(keyOrKeys)) {\n const _keys = this._normalizeKeys(keyOrKeys);\n return this._selectMany(_keys as EntityKey[]);\n }\n\n return this._select(keyOrKeys);\n }\n\n /**\n * **Note:** Prefer `select` over `selectWhere` when possible.\n */\n selectWhere(predicate: (value: T) => boolean): Observable<T[]> {\n return this._change$.pipe(\n startWith(null),\n debounceTime(0),\n map(() => Array.from(this._dictionary.values()).filter(predicate)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n }\n\n set(key: EntityKey, value: T): void;\n set(keys: EntityKey[], values: T[]): void;\n set(keys: EntityKey[][], values: T[][]): void;\n set(keyOrKeys: EntityKey | EntityKey[] | EntityKey[][], valueOrValues: T | T[] | T[][]) {\n const _keys = this._normalizeKeys(keyOrKeys);\n\n if (Array.isArray(_keys)) {\n if (!Array.isArray(valueOrValues)) {\n throw new EntityStoreError('When setting multiple keys, values must be an array', {\n keyOrValues: _keys,\n valueOrValues,\n });\n }\n\n const _values = (Array.isArray(valueOrValues[0]) ? flatten(valueOrValues as T[][]) : valueOrValues) as T[];\n\n for (let i = 0; i < _keys.length; i++) {\n const k = _keys[i];\n const v = _values[i];\n\n if (k === undefined || v === undefined) continue;\n\n this._set(k, v);\n }\n } else {\n this._set(_keys, valueOrValues as T);\n }\n\n this._change$.next(_keys);\n }\n\n remove(key: EntityKey): void;\n remove(keys: EntityKey[]): void;\n remove(keys: EntityKey[][]): void;\n remove(keyOrKeys: EntityKey | EntityKey[] | EntityKey[][]) {\n const _keys = this._normalizeKeys(keyOrKeys);\n\n if (Array.isArray(_keys)) {\n for (const key of _keys) {\n this._remove(key);\n }\n } else {\n this._remove(_keys);\n }\n\n this._change$.next(_keys);\n }\n\n logState() {\n console.log('EntityStore:', this._config.name, {\n dictionary: this._dictionary,\n });\n }\n\n private _select(key: EntityKey): Observable<T | null> {\n if (this._config.logActions) {\n console.log('EntityStore: select', this._config.name, key);\n }\n\n return this._change$.pipe(\n startWith(null),\n filter((v) => {\n if (v === null) {\n return true;\n }\n\n if (Array.isArray(v)) {\n return v.includes(key);\n }\n\n return v === key;\n }),\n map(() => this._dictionary.get(key) ?? null),\n );\n }\n\n private _selectMany(keys: EntityKey[]): Observable<T[]> {\n if (this._config.logActions) {\n console.log('EntityStore: selectMany', this._config.name, keys);\n }\n\n return this._change$.pipe(\n startWith(null),\n filter((v) => {\n if (v === null) {\n return true;\n }\n\n if (Array.isArray(v)) {\n return keys.some((key) => v.includes(key));\n }\n\n return keys.includes(v);\n }),\n map(() => keys.map((key) => this._dictionary.get(key)).filter((value): value is T => value !== undefined)),\n );\n }\n\n private _set(key: EntityKey, value: T) {\n if (this._config.logActions) {\n console.log('EntityStore: set', this._config.name, key, value);\n }\n\n this._dictionary.set(key, value);\n }\n\n private _remove(key: EntityKey) {\n if (this._config.logActions) {\n console.log('EntityStore: remove', this._config.name, key);\n }\n\n this._dictionary.delete(key);\n }\n\n private _normalizeKeys(keys: EntityKey | EntityKey[] | EntityKey[][]): EntityKey | EntityKey[] {\n if (Array.isArray(keys)) {\n if (Array.isArray(keys[0])) {\n return flatten(keys as EntityKey[][]);\n }\n\n return keys as EntityKey[];\n }\n\n return keys;\n }\n}\n","import { Paginated } from '@ethlete/types';\nimport { map, of, switchMap, take, tap } from 'rxjs';\nimport { EntityStore } from './entity-store';\nimport { EntityKey, InsertFromConfig, RemoveFromConfig } from './entity.types';\n\nexport function mapToPaginated<T>(response: Paginated<T>) {\n return map((items) => ({ ...response, items }) as Paginated<T>);\n}\n\n// FIXME: This breaks if SubStoreType is an array\n/**\n * Use an other store to represent a property of the current entity.\n */\nexport const insertFrom = <\n OriginStoreType,\n OriginKeys extends keyof NonNullable<OriginStoreType>,\n SubStoreType extends NonNullable<OriginStoreType>[OriginKeys] extends Array<infer U>\n ? U\n : NonNullable<OriginStoreType>[OriginKeys],\n IdFn extends (value: NonNullable<OriginStoreType>) => EntityKey | EntityKey[],\n ComputedEntityType extends ReturnType<IdFn> extends Array<unknown>\n ? OriginStoreType\n : Omit<OriginStoreType, OriginKeys> & { [K in OriginKeys]: SubStoreType | null },\n>(\n store: EntityStore<SubStoreType>,\n { for: key, id }: InsertFromConfig<OriginStoreType, OriginKeys, IdFn>,\n) =>\n switchMap((value: OriginStoreType) => {\n if (!value) return of(null);\n\n const ids = id(value);\n\n if (Array.isArray(ids)) {\n return store.select(ids).pipe(map((data) => ({ ...value, [key]: data }) as ComputedEntityType));\n } else {\n return store.select(ids).pipe(map((data) => ({ ...value, [key]: data }) as ComputedEntityType));\n }\n });\n\n/**\n * Remove entities from a store based on a where function.\n */\nexport const removeFrom = <T>(store: EntityStore<T>, { where, id }: RemoveFromConfig<T>) => {\n store\n .selectWhere(where)\n .pipe(\n tap((entities) => store.remove(entities.map(id))),\n take(1),\n )\n .subscribe();\n};\n","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\nimport { DestroyRef, ErrorHandler, Injector } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { combineLatest, Observable, Subject } from 'rxjs';\nimport { buildRoute } from '../legacy';\nimport { createHttpRequest, HttpRequest } from './http-request';\nimport { QueryArgs, RequestArgs } from './query';\nimport { buildQueryCacheKey, shouldCacheQuery } from './query-cache-utils';\nimport { CreateQueryClientConfigOptions } from './query-client';\nimport { CreateQueryCreatorOptions, QueryMethod, RouteType } from './query-creator';\nimport { uncacheableRequestHasAllowCacheParam, uncacheableRequestHasCacheKeyParam } from './query-errors';\nimport { RunQueryExecuteOptions } from './query-execute-utils';\nimport { ShouldRetryRequestFn } from './query-retry-utils';\n\nexport type QueryRepositoryEvent =\n | {\n type: 'request-error';\n error: HttpErrorResponse;\n key: QueryKey;\n isSecure: boolean;\n request: HttpRequest<QueryArgs>;\n }\n | {\n type: 'request-success';\n key: QueryKey;\n isSecure: boolean;\n request: HttpRequest<QueryArgs>;\n };\n\nexport type QueryRepositoryRequestOptions<TArgs extends QueryArgs> = {\n /**\n * The route of the request.\n * @example '/users'\n * @example (args) => `/users/${args.userId}`\n */\n route: RouteType<TArgs>;\n\n /** The HTTP method of the request */\n method: QueryMethod;\n\n /** If the request is secure (needs authentication) */\n isSecure?: boolean;\n\n /** The data of the request */\n args?: RequestArgs<TArgs> | null;\n\n /** The query creator options of the request */\n creatorOptions?: CreateQueryCreatorOptions;\n\n /** Custom retry function for this specific request */\n retryFn?: ShouldRetryRequestFn;\n\n /** If set, this request's cache key will be prefixed with this key */\n key?: string;\n\n /** The previous tracking key of the request */\n previousKey?: QueryKey | null;\n\n /** The destroy ref to bind the request to. If the destroy ref is destroyed, the request will be destroyed as well. */\n consumerDestroyRef: DestroyRef;\n\n /** Configuration on how to run the query */\n runQueryOptions?: RunQueryExecuteOptions;\n};\n\nexport type QueryRepositoryItem<TArgs extends QueryArgs> = {\n /** The key of the request (either a cache key for cacheable requests or a UUID for uncacheable requests) */\n key: QueryKey;\n\n /** The request object */\n request: HttpRequest<TArgs>;\n};\n\n/**\n * The query repository is responsible for managing all requests and their consumers.\n * It will cache requests if they can be cached and reuse them if they are already cached.\n * It will also destroy requests if there are no more consumers left.\n */\nexport type QueryRepository = {\n /** Creates a new request. If the request is already cached, it will be reused. */\n request: <TArgs extends QueryArgs>(options: QueryRepositoryRequestOptions<TArgs>) => QueryRepositoryItem<TArgs>;\n\n /** Removes a consumer from a request by its key. Destroys the request if there are no more consumers left. */\n unbind: (key: QueryKey | null, consumerDestroyRef: DestroyRef) => boolean;\n\n /** Removes all secure requests and their consumers */\n unbindAllSecure: () => void;\n\n /** Observable stream of repository events (errors, successes, etc.) */\n events$: Observable<QueryRepositoryEvent>;\n};\n\n/** The key of a query (either a cache key for cacheable requests or a UUID for uncacheable requests) */\nexport type QueryKey = string;\n\n/** Runs .unbind() if the DestroyRef.onDestroy() gets called */\nexport type DestroyCleanupCallback = () => void;\n\n/** Keeps track of all places where the request gets used. Will be cleaned up and removed if there are no more consumers. */\ntype DestroyListenerMapItem = {\n consumers: Map<DestroyRef, DestroyCleanupCallback>;\n request: HttpRequest<QueryArgs>;\n isSecure: boolean;\n eventSubscription?: { unsubscribe: () => void };\n};\n\nexport type QueryRepositoryDependencies = {\n /** The HTTP client to use for the requests */\n httpClient: HttpClient;\n\n /** The error handler to use for the requests */\n ngErrorHandler: ErrorHandler;\n\n /** The injector to use for reactive operations like signal->observable conversions */\n injector: Injector;\n};\n\nexport type CreateQueryRepositoryConfig = CreateQueryClientConfigOptions & {\n /** The dependencies of the query repository */\n dependencies: QueryRepositoryDependencies;\n};\n\nconst generateUuid = () => crypto.randomUUID();\n\nexport const createQueryRepository = (config: CreateQueryRepositoryConfig): QueryRepository => {\n const cache = new Map<QueryKey, DestroyListenerMapItem>();\n const eventsSubject = new Subject<QueryRepositoryEvent>();\n\n const request = <TArgs extends QueryArgs>(options: QueryRepositoryRequestOptions<TArgs>) => {\n const { args, creatorOptions, runQueryOptions } = options;\n const shouldCache =\n creatorOptions?.subtle?.useQueryRepositoryCache === false\n ? false\n : shouldCacheQuery(options.method) || creatorOptions?.subtle?.useQueryRepositoryCache === true;\n\n if (!shouldCache && options.key) throw uncacheableRequestHasCacheKeyParam(options.key);\n if (!shouldCache && runQueryOptions?.allowCache) throw uncacheableRequestHasAllowCacheParam();\n\n const route = buildRoute({\n base: config.baseUrl,\n route: options.route,\n pathParams: args?.pathParams,\n queryParams: args?.queryParams,\n queryParamConfig: config.queryString,\n });\n\n const cacheKey = shouldCache\n ? buildQueryCacheKey(`${options.key ? options.key + '_' : ''}${route}`, {\n body: args?.body,\n queryParams: args?.queryParams,\n pathParams: args?.pathParams,\n headers: args?.headers,\n })\n : false;\n\n const trackingKey = cacheKey || generateUuid();\n\n const previousKey = options.previousKey;\n\n if (cacheKey !== previousKey && previousKey) {\n unbind(previousKey, options.consumerDestroyRef);\n }\n\n if (shouldCache && cacheKey) {\n const cacheEntry = cache.get(cacheKey);\n\n if (cacheEntry) {\n bind(cacheKey, options.consumerDestroyRef, cacheEntry.request, options.isSecure ?? false, true);\n\n if (!runQueryOptions?.allowCache || cacheEntry.request.isStale()) {\n cacheEntry.request.execute({ allowCache: runQueryOptions?.allowCache });\n }\n\n return { key: cacheKey, request: cacheEntry.request as HttpRequest<TArgs> };\n }\n }\n\n const request = createHttpRequest<TArgs>({\n fullPath: route,\n args,\n method: options.method,\n dependencies: config.dependencies,\n clientOptions: creatorOptions,\n cacheAdapter: config.cacheAdapter,\n retryFn: options.retryFn ?? config.retryFn,\n });\n\n request.execute();\n\n bind(trackingKey, options.consumerDestroyRef, request, options.isSecure ?? false, shouldCache);\n\n return { key: trackingKey, request };\n };\n\n const unbind = (key: QueryKey | null, consumerDestroyRef: DestroyRef) => {\n if (key === null) return false;\n\n const cacheEntry = cache.get(key);\n\n if (!cacheEntry) return false;\n\n cacheEntry.consumers.delete(consumerDestroyRef);\n\n if (cacheEntry.consumers.size === 0) {\n cacheEntry.request.destroy();\n cacheEntry.eventSubscription?.unsubscribe();\n cache.delete(key);\n }\n\n return true;\n };\n\n const unbindAllSecure = () => {\n for (const [key, cacheEntry] of cache.entries()) {\n if (cacheEntry.isSecure) {\n for (const consumerDestroyRef of cacheEntry.consumers.keys()) {\n unbind(key, consumerDestroyRef);\n }\n\n cacheEntry.eventSubscription?.unsubscribe();\n cache.delete(key);\n }\n }\n };\n\n const bind = (\n key: QueryKey,\n consumerDestroyRef: DestroyRef,\n request: HttpRequest<QueryArgs>,\n isSecure: boolean,\n allowReuse: boolean,\n ) => {\n const destroyListener = consumerDestroyRef.onDestroy(() => unbind(key, consumerDestroyRef));\n\n const cacheEntry = cache.get(key);\n\n if (cacheEntry && allowReuse) {\n cacheEntry.consumers.set(consumerDestroyRef, destroyListener);\n } else {\n const consumers: Map<DestroyRef, DestroyCleanupCallback> = new Map([]);\n\n consumers.set(consumerDestroyRef, destroyListener);\n\n const eventSubscription = combineLatest([\n toObservable(request.error, { injector: config.dependencies.injector }),\n toObservable(request.response, { injector: config.dependencies.injector }),\n ]).subscribe(([errorValue, responseValue]) => {\n if (errorValue?.raw instanceof HttpErrorResponse) {\n eventsSubject.next({\n type: 'request-error',\n error: errorValue.raw,\n key,\n isSecure,\n request,\n });\n } else if (responseValue !== null && !errorValue) {\n eventsSubject.next({\n type: 'request-success',\n key,\n isSecure,\n request,\n });\n }\n });\n\n cache.set(key, {\n consumers,\n request,\n isSecure,\n eventSubscription,\n });\n }\n };\n\n const repository: QueryRepository = {\n request,\n unbind,\n unbindAllSecure,\n events$: eventsSubject.asObservable(),\n };\n\n return repository;\n};\n","import { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { ErrorHandler, inject, Injector } from '@angular/core';\nimport { createRootProvider, ProviderResult } from '@ethlete/core';\nimport { BuildQueryStringConfig } from '../legacy';\nimport { createQueryRepository, QueryRepository } from './query-repository';\nimport { ShouldRetryRequestFn } from './query-retry-utils';\n\nexport type CacheAdapterFn = (headers: HttpHeaders) => number | null;\n\nexport type CreateQueryClientConfigOptions = {\n /**\n * The base URL of the client\n * @example 'https://api.example.com/v1'\n */\n baseUrl: string;\n\n /** Configuration for building query strings */\n queryString?: BuildQueryStringConfig;\n\n /** The name of the client */\n name: string;\n\n /**\n * The cache adapter function to use for the client.\n * It determines how long the response of a request can be cached.\n *\n * @default extractExpiresInSeconds()\n */\n cacheAdapter?: CacheAdapterFn;\n\n /**\n * The retry function to use for the client.\n * It determines if a request should be retried after it failed.\n *\n * @default shouldRetryRequest()\n */\n retryFn?: ShouldRetryRequestFn;\n};\n\nexport type QueryClient = {\n repository: QueryRepository;\n};\n\nexport type QueryClientRef = ProviderResult<QueryClient>;\nexport type AnyCreateQueryClientResult = QueryClientRef;\nexport type AnyQueryClient = NonNullable<ReturnType<AnyCreateQueryClientResult[1]>>;\n\nexport const createQueryClient = (options: CreateQueryClientConfigOptions): QueryClientRef =>\n createRootProvider(\n () => {\n const httpClient = inject(HttpClient);\n const ngErrorHandler = inject(ErrorHandler);\n const injector = inject(Injector);\n\n const repository = createQueryRepository({\n ...options,\n dependencies: { httpClient, ngErrorHandler, injector },\n });\n\n const client: QueryClient = {\n repository,\n };\n\n return client;\n },\n {\n name: `QueryClient_${options.name}`,\n },\n );\n","import { QueryArgs, RequestArgs } from './query';\nimport { CreateQueryExecuteOptions, InternalQueryExecute } from './query-execute';\nimport { queryExecute } from './query-execute-utils';\nimport { InternalSecureCreateQueryCreatorOptions } from './secure-query-creator';\nimport { createSecureExecuteFactory } from './secure-query-execute-factory';\n\nexport type CreateSecureQueryExecuteOptions<TArgs extends QueryArgs> = Omit<\n CreateQueryExecuteOptions<TArgs>,\n 'creatorInternals'\n> & {\n creatorInternals: InternalSecureCreateQueryCreatorOptions<TArgs>;\n};\n\nexport const createSecureExecuteFn = <TArgs extends QueryArgs>(\n executeOptions: CreateSecureQueryExecuteOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const [, injectAuthProvider] = executeOptions.creatorInternals.authProvider;\n const authProvider = injectAuthProvider();\n\n return createSecureExecuteFactory({\n authProvider,\n deps: executeOptions.deps,\n state: executeOptions.state,\n transformAuthAndExec: (executeArgs, _tokens, headers, executeState) => {\n const { options: runOptions } = executeArgs ?? {};\n const updatedArgs = { ...(executeArgs?.args ?? ({} as RequestArgs<TArgs>)), headers };\n\n queryExecute({\n executeOptions: executeOptions,\n executeState,\n args: updatedArgs,\n options: runOptions,\n isSecure: true,\n });\n },\n });\n};\n","import { createBaseQuery } from './base-query-factory';\nimport { CreateQueryOptions, QueryArgs } from './query';\nimport { InternalSecureCreateQueryCreatorOptions } from './secure-query-creator';\nimport { createSecureExecuteFn } from './secure-query-execute';\n\nexport type CreateSecureQueryOptions<TArgs extends QueryArgs> = Omit<CreateQueryOptions<TArgs>, 'creatorInternals'> & {\n creatorInternals: InternalSecureCreateQueryCreatorOptions<TArgs>;\n};\n\nexport const createSecureQuery = <TArgs extends QueryArgs>(options: CreateSecureQueryOptions<TArgs>) =>\n createBaseQuery({\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n features: options.features,\n queryConfig: options.queryConfig,\n executeFactory: createSecureExecuteFn,\n });\n","import { AnyCreateBearerAuthProviderResult } from '../auth';\nimport { createBaseQueryCreator } from './base-query-creator-factory';\nimport { QueryArgs } from './query';\nimport { CreateQueryCreatorOptions, InternalCreateQueryCreatorOptions, QueryCreator } from './query-creator';\nimport { createSecureQuery } from './secure-query';\n\nexport type InternalSecureCreateQueryCreatorOptions<TArgs extends QueryArgs> =\n InternalCreateQueryCreatorOptions<TArgs> & {\n authProvider: AnyCreateBearerAuthProviderResult;\n };\n\nexport const createSecureQueryCreator = <TArgs extends QueryArgs>(\n options: CreateQueryCreatorOptions | undefined,\n internals: InternalSecureCreateQueryCreatorOptions<TArgs>,\n): QueryCreator<TArgs> =>\n createBaseQueryCreator({\n options,\n internals,\n queryFactory: createSecureQuery,\n });\n","import { AnyCreateBearerAuthProviderResult } from '../auth';\nimport { QueryArgs } from './query';\nimport { AnyCreateQueryClientResult } from './query-client';\nimport {\n CreateQueryCreatorOptions,\n QueryCreator,\n QueryMethod,\n RequiresTransform,\n RouteType,\n createQueryCreator,\n} from './query-creator';\nimport { createSecureQueryCreator } from './secure-query-creator';\n\n// Conditional parameter type: when RequiresTransform is true, options must be provided; otherwise optional\ntype ConditionalOptions<TArgs extends QueryArgs> =\n RequiresTransform<TArgs> extends true\n ? [options: CreateQueryCreatorOptions<TArgs>]\n : [options?: CreateQueryCreatorOptions<TArgs>];\n\nconst createQueryTemplate = (method: QueryMethod) => {\n return (client: AnyCreateQueryClientResult) =>\n <TArgs extends QueryArgs>(route: RouteType<TArgs>, ...args: ConditionalOptions<TArgs>): QueryCreator<TArgs> =>\n createQueryCreator<TArgs>(args[0], { method, client, route });\n};\n\nconst createSecureQueryTemplate = (method: QueryMethod) => {\n return (client: AnyCreateQueryClientResult, authProvider: AnyCreateBearerAuthProviderResult) =>\n <TArgs extends QueryArgs>(route: RouteType<TArgs>, ...args: ConditionalOptions<TArgs>): QueryCreator<TArgs> =>\n createSecureQueryCreator<TArgs>(args[0], { method, client, authProvider, route });\n};\n\n/** A query creator that creates a GET query */\nexport const createGetQuery = createQueryTemplate('GET');\n\n/** A query creator that creates a secure GET query (requires authentication) */\nexport const createSecureGetQuery = createSecureQueryTemplate('GET');\n\n/** A query creator that creates a POST query */\nexport const createPostQuery = createQueryTemplate('POST');\n\n/** A query creator that creates a secure POST query (requires authentication) */\nexport const createSecurePostQuery = createSecureQueryTemplate('POST');\n\n/** A query creator that creates a PUT query */\nexport const createPutQuery = createQueryTemplate('PUT');\n\n/** A query creator that creates a secure PUT query (requires authentication) */\nexport const createSecurePutQuery = createSecureQueryTemplate('PUT');\n\n/** A query creator that creates a DELETE query */\nexport const createDeleteQuery = createQueryTemplate('DELETE');\n\n/** A query creator that creates a secure DELETE query (requires authentication) */\nexport const createSecureDeleteQuery = createSecureQueryTemplate('DELETE');\n\n/** A query creator that creates a PATCH query */\nexport const createPatchQuery = createQueryTemplate('PATCH');\n\n/** A query creator that creates a secure PATCH query (requires authentication) */\nexport const createSecurePatchQuery = createSecureQueryTemplate('PATCH');\n","import { DestroyRef, inject, isDevMode, signal, Signal } from '@angular/core';\n\ntype LeaderMessage =\n | {\n type: 'heartbeat';\n tabId: string;\n }\n | {\n type: 'tab-heartbeat';\n tabId: string;\n }\n | {\n type: 'leader-claim';\n tabId: string;\n }\n | {\n type: 'leader-release';\n tabId: string;\n }\n | {\n type: 'instance-register';\n tabId: string;\n }\n | {\n type: 'instance-unregister';\n tabId: string;\n };\n\nexport type InternalLeaderElection = {\n isLeader: Signal<boolean>;\n instanceCount: Signal<number>;\n becomeLeader: () => void;\n cleanup: () => void;\n};\n\nexport const setupLeaderElection = (): InternalLeaderElection => {\n const destroyRef = inject(DestroyRef);\n\n const channelName = 'ethlete-auth-leader';\n const heartbeatInterval = 1000;\n const leaderTimeout = 3000;\n const storageKey = 'ethlete-auth-leader-heartbeat';\n\n const tabId = `tab-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n const isLeader = signal(false);\n const instanceCount = signal(1);\n const knownTabs = new Map<string, number>();\n knownTabs.set(tabId, Date.now());\n\n let channel: BroadcastChannel | null = null;\n let heartbeatIntervalId: ReturnType<typeof setInterval> | null = null;\n let leaderCheckIntervalId: ReturnType<typeof setInterval> | null = null;\n\n if (typeof BroadcastChannel === 'undefined' || typeof localStorage === 'undefined') {\n isLeader.set(true);\n return {\n isLeader: isLeader.asReadonly(),\n instanceCount: instanceCount.asReadonly(),\n becomeLeader: () => {\n /* no-op */\n },\n cleanup: () => {\n /* no-op */\n },\n };\n }\n\n channel = new BroadcastChannel(channelName);\n\n channel.postMessage({ type: 'instance-register', tabId } as LeaderMessage);\n\n const updateLeaderHeartbeat = (newTabId: string = tabId) => {\n try {\n localStorage.setItem(storageKey, JSON.stringify({ tabId: newTabId, timestamp: Date.now() }));\n } catch (error) {\n if (isDevMode()) {\n console.error('Failed to update leader heartbeat:', error);\n }\n }\n };\n\n const getLeaderHeartbeat = (): { tabId: string; timestamp: number } | null => {\n try {\n const stored = localStorage.getItem(storageKey);\n if (!stored) return null;\n return JSON.parse(stored);\n } catch {\n return null;\n }\n };\n\n const becomeLeader = () => {\n if (isLeader()) return;\n\n isLeader.set(true);\n updateLeaderHeartbeat();\n\n const message: LeaderMessage = {\n type: 'leader-claim',\n tabId,\n };\n channel?.postMessage(message);\n };\n\n const releaseLeadership = () => {\n if (!isLeader()) return;\n\n isLeader.set(false);\n\n const message: LeaderMessage = {\n type: 'leader-release',\n tabId,\n };\n channel?.postMessage(message);\n };\n\n const checkLeaderStatus = () => {\n const heartbeat = getLeaderHeartbeat();\n const now = Date.now();\n\n if (!heartbeat || now - heartbeat.timestamp > leaderTimeout) {\n if (!isLeader()) {\n becomeLeader();\n }\n } else if (heartbeat.tabId === tabId) {\n if (!isLeader()) {\n isLeader.set(true);\n }\n updateLeaderHeartbeat();\n } else {\n if (isLeader()) {\n isLeader.set(false);\n }\n }\n };\n\n channel.onmessage = (event: MessageEvent<LeaderMessage>) => {\n const message = event.data;\n\n if (message.type === 'heartbeat') {\n if (message.tabId !== tabId) {\n knownTabs.set(message.tabId, Date.now());\n }\n if (message.tabId !== tabId && isLeader()) {\n const heartbeat = getLeaderHeartbeat();\n if (heartbeat && heartbeat.tabId === message.tabId) {\n releaseLeadership();\n }\n }\n } else if (message.type === 'tab-heartbeat') {\n if (message.tabId !== tabId) {\n knownTabs.set(message.tabId, Date.now());\n }\n } else if (message.type === 'instance-register') {\n if (message.tabId !== tabId) {\n knownTabs.set(message.tabId, Date.now());\n instanceCount.set(knownTabs.size);\n channel?.postMessage({ type: 'tab-heartbeat', tabId } as LeaderMessage);\n }\n } else if (message.type === 'instance-unregister') {\n if (message.tabId !== tabId) {\n knownTabs.delete(message.tabId);\n instanceCount.set(knownTabs.size);\n }\n } else if (message.type === 'leader-claim') {\n if (message.tabId !== tabId && isLeader()) {\n const heartbeat = getLeaderHeartbeat();\n if (heartbeat && heartbeat.tabId === message.tabId) {\n releaseLeadership();\n } else {\n const assertMessage: LeaderMessage = {\n type: 'heartbeat',\n tabId,\n };\n channel?.postMessage(assertMessage);\n }\n }\n } else if (message.type === 'leader-release') {\n if (message.tabId !== tabId) {\n setTimeout(() => checkLeaderStatus(), 100);\n }\n }\n };\n\n checkLeaderStatus();\n\n heartbeatIntervalId = setInterval(() => {\n knownTabs.set(tabId, Date.now());\n\n if (isLeader()) {\n updateLeaderHeartbeat();\n channel?.postMessage({ type: 'heartbeat', tabId } as LeaderMessage);\n } else {\n channel?.postMessage({ type: 'tab-heartbeat', tabId } as LeaderMessage);\n }\n\n const now = Date.now();\n let changed = false;\n for (const [id, lastSeen] of knownTabs) {\n if (id !== tabId && now - lastSeen > leaderTimeout) {\n knownTabs.delete(id);\n changed = true;\n }\n }\n if (changed) {\n instanceCount.set(knownTabs.size);\n }\n }, heartbeatInterval);\n\n leaderCheckIntervalId = setInterval(() => {\n checkLeaderStatus();\n }, heartbeatInterval);\n\n const handleVisibilityChange = () => {\n if (document.hidden && isLeader()) {\n // Tab is hidden but we're leader - keep leadership but other tabs will take over if we die\n } else if (!document.hidden && !isLeader()) {\n checkLeaderStatus();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n const cleanup = () => {\n if (heartbeatIntervalId) {\n clearInterval(heartbeatIntervalId);\n }\n if (leaderCheckIntervalId) {\n clearInterval(leaderCheckIntervalId);\n }\n\n channel?.postMessage({ type: 'instance-unregister', tabId } as LeaderMessage);\n\n releaseLeadership();\n\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n channel?.close();\n\n const heartbeat = getLeaderHeartbeat();\n if (heartbeat?.tabId === tabId) {\n try {\n localStorage.removeItem(storageKey);\n } catch {\n // Ignore\n }\n }\n };\n\n destroyRef.onDestroy(cleanup);\n\n return {\n isLeader: isLeader.asReadonly(),\n instanceCount: instanceCount.asReadonly(),\n becomeLeader,\n cleanup,\n };\n};\n","const ENCRYPTION_KEY_STORAGE = '__eth_ek';\n\nconst generateEncryptionKey = (): string => {\n const navigatorInfo =\n typeof navigator !== 'undefined'\n ? `${navigator.userAgent}${navigator.language}${screen.width}${screen.height}${screen.colorDepth}`\n : 'server';\n\n const random = Math.random().toString(36).substring(2, 15);\n\n return btoa(`${navigatorInfo}${random}`);\n};\n\nlet cachedKey: string | null = null;\n\nconst getEncryptionKey = (): string => {\n if (cachedKey) return cachedKey;\n\n if (typeof localStorage !== 'undefined') {\n const stored = localStorage.getItem(ENCRYPTION_KEY_STORAGE);\n if (stored) {\n cachedKey = stored;\n return stored;\n }\n\n const newKey = generateEncryptionKey();\n localStorage.setItem(ENCRYPTION_KEY_STORAGE, newKey);\n cachedKey = newKey;\n return newKey;\n }\n\n if (!cachedKey) {\n cachedKey = generateEncryptionKey();\n }\n return cachedKey;\n};\n\nconst xorCipher = (text: string, key: string): string => {\n let result = '';\n for (let i = 0; i < text.length; i++) {\n result += String.fromCharCode(text.charCodeAt(i) ^ key.charCodeAt(i % key.length));\n }\n return result;\n};\n\nexport const encryptToken = (token: string): string => {\n if (!token) return token;\n\n try {\n const key = getEncryptionKey();\n const encrypted = xorCipher(token, key);\n return btoa(encrypted);\n } catch {\n return token;\n }\n};\n\nexport const decryptToken = (encryptedToken: string): string => {\n if (!encryptedToken) return encryptedToken;\n\n try {\n const key = getEncryptionKey();\n const encrypted = atob(encryptedToken);\n return xorCipher(encrypted, key);\n } catch {\n return encryptedToken;\n }\n};\n\nexport const isEncrypted = (value: string): boolean => {\n if (!value) return false;\n\n const base64Regex = /^[A-Za-z0-9+/]+=*$/;\n if (!base64Regex.test(value)) return false;\n\n try {\n atob(value);\n return value.length > 20;\n } catch {\n return false;\n }\n};\n\nexport const resetEncryptionKey = (): void => {\n cachedKey = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(ENCRYPTION_KEY_STORAGE);\n }\n};\n","import { DestroyRef, effect, inject, isDevMode, WritableSignal } from '@angular/core';\nimport { QueryClient } from '../../http';\nimport { decryptToken, encryptToken } from '../utils';\n\ntype SyncMessage =\n | {\n type: 'tokens-updated';\n accessToken: string;\n refreshToken: string;\n }\n | {\n type: 'logout';\n };\n\nexport type MultiTabSyncConfig = {\n channelName?: string;\n syncTokens?: boolean;\n syncLogout?: boolean;\n};\n\nexport type InternalMultiTabSync = {\n cleanup: () => void;\n};\n\nexport const setupMultiTabSync = (\n config: MultiTabSyncConfig,\n accessToken: WritableSignal<string | null>,\n refreshToken: WritableSignal<string | null>,\n queryClient: QueryClient,\n): InternalMultiTabSync => {\n const destroyRef = inject(DestroyRef);\n\n const channelName = config.channelName ?? 'ethlete-auth-sync';\n const syncTokens = config.syncTokens ?? true;\n const syncLogout = config.syncLogout ?? true;\n\n let channel: BroadcastChannel | null = null;\n let isProcessingExternalUpdate = false;\n\n if (typeof BroadcastChannel === 'undefined') {\n if (isDevMode()) {\n console.warn('BroadcastChannel is not supported in this environment. Multi-tab sync will be disabled.');\n }\n return {\n cleanup: () => {\n // No cleanup needed when BroadcastChannel is not available\n },\n };\n }\n\n channel = new BroadcastChannel(channelName);\n\n channel.onmessage = (event: MessageEvent<SyncMessage>) => {\n const message = event.data;\n\n // Prevent infinite loops\n if (isProcessingExternalUpdate) return;\n\n isProcessingExternalUpdate = true;\n\n try {\n if (message.type === 'logout' && syncLogout) {\n accessToken.set(null);\n refreshToken.set(null);\n queryClient.repository.unbindAllSecure();\n } else if (message.type === 'tokens-updated' && syncTokens) {\n accessToken.set(decryptToken(message.accessToken));\n refreshToken.set(decryptToken(message.refreshToken));\n }\n } finally {\n isProcessingExternalUpdate = false;\n }\n };\n\n const cleanup = () => {\n channel?.close();\n };\n\n destroyRef.onDestroy(cleanup);\n\n if (syncTokens) {\n effect(() => {\n const access = accessToken();\n const refresh = refreshToken();\n\n if (access && refresh && !isProcessingExternalUpdate && channel) {\n const message: SyncMessage = {\n type: 'tokens-updated',\n accessToken: encryptToken(access),\n refreshToken: encryptToken(refresh),\n };\n channel.postMessage(message);\n }\n });\n }\n\n if (syncLogout) {\n let hadTokens = false;\n\n effect(() => {\n const access = accessToken();\n\n if (access) {\n hadTokens = true;\n } else if (hadTokens && !isProcessingExternalUpdate && channel) {\n const message: SyncMessage = {\n type: 'logout',\n };\n channel.postMessage(message);\n hadTokens = false;\n }\n });\n }\n\n return { cleanup };\n};\n","import {\n computed,\n DestroyRef,\n effect,\n inject,\n Injector,\n isDevMode,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { createRootProvider, isObject, ProviderResult } from '@ethlete/core';\nimport { Observable, Subject } from 'rxjs';\nimport {\n AnyCreateQueryClientResult,\n authExtractTokensResponseMissingAccessToken,\n authExtractTokensResponseMissingRefreshToken,\n authExtractTokensResponseNotObject,\n authProviderFeatureUsedMultipleTimes,\n QueryArgs,\n QueryClient,\n QueryRepository,\n QuerySnapshot,\n RequestArgs,\n RunQueryExecuteOptions,\n} from '../http';\nimport { decryptBearer } from '../legacy';\nimport {\n AnyQueryBuilder,\n AuthQueryBuilder,\n BearerAuthProviderTokens,\n TokenRefreshQueryBuilder,\n} from './bearer-auth-query-builders';\nimport {\n InactivityLogoutFeature,\n PersistentAuthFeature,\n TokenExpirationWarningFeature,\n TrackingFeature,\n} from './features';\nimport { setupLeaderElection, setupMultiTabSync } from './internal';\n\nexport { AnyQueryBuilder } from './bearer-auth-query-builders';\n\nexport const BearerAuthFeatureType = {\n PERSISTENT_AUTH: 'PERSISTENT_AUTH',\n TOKEN_EXPIRATION_WARNING: 'TOKEN_EXPIRATION_WARNING',\n INACTIVITY_LOGOUT: 'INACTIVITY_LOGOUT',\n TOKEN_REVOCATION: 'TOKEN_REVOCATION',\n TRACKING: 'TRACKING',\n} as const;\n\nexport type BearerAuthFeatureType = (typeof BearerAuthFeatureType)[keyof typeof BearerAuthFeatureType];\n\nexport type BearerAuthFeature<TBuilders extends readonly AnyQueryBuilder[], TBearerData> = {\n type: BearerAuthFeatureType;\n setup: (context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown;\n};\n\nexport type ExtractQueryKey<T> =\n T extends AuthQueryBuilder<infer K, any> // eslint-disable-line @typescript-eslint/no-explicit-any\n ? K\n : T extends TokenRefreshQueryBuilder<infer K, any> // eslint-disable-line @typescript-eslint/no-explicit-any\n ? K\n : never;\n\nexport type ExtractQueryArgs<T> =\n T extends AuthQueryBuilder<string, infer TArgs>\n ? TArgs\n : T extends TokenRefreshQueryBuilder<string, infer TArgs>\n ? TArgs\n : never;\n\nexport type QueryRegistry<TBuilders extends readonly AnyQueryBuilder[]> = {\n [K in ExtractQueryKey<TBuilders[number]>]: {\n execute: (\n args: RequestArgs<ExtractQueryArgs<Extract<TBuilders[number], { key: K }>>>,\n options?: RunQueryExecuteOptions,\n ) => QuerySnapshot<ExtractQueryArgs<Extract<TBuilders[number], { key: K }>>>;\n snapshot: Signal<QuerySnapshot<ExtractQueryArgs<Extract<TBuilders[number], { key: K }>>> | null>;\n };\n};\n\ntype HasFeatureType<\n TFeatures extends readonly unknown[],\n TType extends BearerAuthFeatureType,\n> = TFeatures extends readonly ((context: any) => any)[] // eslint-disable-line @typescript-eslint/no-explicit-any\n ? Extract<ReturnType<TFeatures[number]>, { type: TType }> extends never\n ? false\n : true\n : false;\n\ntype ExtractFeatureInstance<\n TFeatures extends readonly unknown[],\n TType extends BearerAuthFeatureType,\n> = TFeatures extends readonly ((context: any) => any)[] // eslint-disable-line @typescript-eslint/no-explicit-any\n ? Extract<ReturnType<TFeatures[number]>, { type: TType }> extends { type: TType; instance: infer TInstance }\n ? TInstance\n : never\n : never;\n\nexport type FeatureRegistry<\n TFeatures extends readonly unknown[],\n TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[],\n> = (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.PERSISTENT_AUTH> extends true\n ? { persistentAuth: PersistentAuthFeature }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.TOKEN_EXPIRATION_WARNING> extends true\n ? { tokenExpirationWarning: TokenExpirationWarningFeature }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.INACTIVITY_LOGOUT> extends true\n ? { inactivityLogout: InactivityLogoutFeature }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.TOKEN_REVOCATION> extends true\n ? { tokenRevocation: ExtractFeatureInstance<TFeatures, typeof BearerAuthFeatureType.TOKEN_REVOCATION> }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.TRACKING> extends true\n ? { tracking: TrackingFeature<TBuilders> }\n : unknown);\n\nexport type CreateBearerAuthProviderConfig<\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData,\n> = {\n /**\n * The name of the auth provider\n */\n name: string;\n\n /**\n * The query client tuple from createQueryClient\n */\n queryClientRef: AnyCreateQueryClientResult;\n\n /**\n * Query builders\n */\n queries: TBuilders;\n\n /**\n * Feature builders\n */\n features?: TFeatures;\n\n /**\n * A function that decrypts the bearer token\n * @default decryptBearer()\n */\n bearerDecryptFn?: (token: string) => TBearerData;\n\n /**\n * Multi-tab sync configuration\n * Set to false to disable\n * Leader election is automatically enabled when multiTabSync is enabled\n * @default { enabled: true, channelName: 'ethlete-auth-sync', syncTokens: true, syncLogout: true, leaderElection: true }\n */\n multiTabSync?:\n | false\n | {\n /**\n * Whether multi-tab sync is enabled\n * @default true\n */\n enabled?: boolean;\n\n /**\n * Channel name for BroadcastChannel\n * @default 'ethlete-auth-sync'\n */\n channelName?: string;\n\n /**\n * Whether to sync token updates across tabs\n * @default true\n */\n syncTokens?: boolean;\n\n /**\n * Whether to sync logout across tabs\n * @default true\n */\n syncLogout?: boolean;\n\n /**\n * Whether to use leader election for token refresh\n * When enabled, only one tab (the leader) will perform automatic token refreshes\n * @default true\n */\n leaderElection?: boolean;\n };\n};\n\nexport type BearerAuthProvider<\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData,\n> = {\n /**\n * Registry of all configured auth queries\n */\n queries: QueryRegistry<TBuilders>;\n\n /**\n * Registry of all configured features\n */\n features: FeatureRegistry<TFeatures, TBuilders>;\n\n /**\n * The current access token\n */\n accessToken: Signal<string | null>;\n\n /**\n * The current refresh token\n */\n refreshToken: Signal<string | null>;\n\n /**\n * The decrypted bearer data\n */\n bearerData: Signal<TBearerData | null>;\n\n /**\n * Whether the user is currently authenticated\n */\n isAuthenticated: Signal<boolean>;\n\n /**\n * The latest executed query (including internal triggers like auto-refresh)\n */\n latestExecutedQuery: Signal<{ key: ExtractQueryKey<TBuilders[number]>; snapshot: QuerySnapshot<QueryArgs> } | null>;\n\n /**\n * The latest non-internal query (user-triggered only)\n */\n latestNonInternalQuery: Signal<{\n key: ExtractQueryKey<TBuilders[number]>;\n snapshot: QuerySnapshot<QueryArgs>;\n } | null>;\n\n /**\n * Logout the user (clears all tokens and unbinds secure queries)\n */\n logout: () => void;\n\n /**\n * Observable that emits after a successful token refresh.\n * Secure queries can subscribe to this to re-execute themselves with the new token.\n */\n afterTokenRefresh$: Observable<void>;\n};\n\nexport type BearerAuthProviderFeatureContext<\n TBearerData = unknown,\n TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[],\n> = {\n refreshToken: WritableSignal<string | null>;\n afterTokenRefresh$: Observable<void>;\n accessToken: WritableSignal<string | null>;\n bearerData: Signal<TBearerData | null>;\n logout: () => void;\n injector: Injector;\n destroyRef: DestroyRef;\n setTokens: (access: string, refresh: string) => void;\n isLeader: () => boolean;\n leaderElection?: { isLeader: Signal<boolean>; instanceCount: Signal<number> };\n queries: QueryRegistry<TBuilders>;\n};\n\nexport type BearerAuthProviderQueryContext<\n TBearerData = unknown,\n TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[],\n> = {\n accessToken: WritableSignal<string | null>;\n refreshToken: WritableSignal<string | null>;\n bearerDecryptFn: ((token: string) => TBearerData) | undefined;\n queryClient: QueryClient;\n repository: QueryRepository;\n afterTokenRefresh$: Observable<void>;\n isLeader: () => boolean;\n queries: QueryRegistry<TBuilders>;\n};\n\nconst defaultExtractTokens = (response: unknown): BearerAuthProviderTokens => {\n if (!isObject(response)) {\n throw authExtractTokensResponseNotObject();\n }\n if (!('accessToken' in response) || typeof response['accessToken'] !== 'string') {\n throw authExtractTokensResponseMissingAccessToken();\n }\n if (!('refreshToken' in response) || typeof response['refreshToken'] !== 'string') {\n throw authExtractTokensResponseMissingRefreshToken();\n }\n return { accessToken: response['accessToken'], refreshToken: response['refreshToken'] };\n};\n\nconst setupBearerQueryRegistry = <TBuilders extends readonly AnyQueryBuilder[]>(\n builders: TBuilders,\n injector: Injector,\n latestExecutedQuery: WritableSignal<{ key: string; snapshot: QuerySnapshot<QueryArgs> } | null>,\n latestNonInternalQuery: WritableSignal<{ key: string; snapshot: QuerySnapshot<QueryArgs> } | null>,\n setTokens: (access: string, refresh: string) => void,\n) => {\n const queries = {} as QueryRegistry<TBuilders>;\n const querySnapshots = new Map<string, Signal<QuerySnapshot<QueryArgs> | null>>();\n\n for (const builder of builders) {\n const querySnapshot = signal<QuerySnapshot<QueryArgs> | null>(null);\n querySnapshots.set(builder.key, querySnapshot);\n\n const extractTokens = builder.config.extractTokens ?? defaultExtractTokens;\n\n effect(() => {\n const snapshot = querySnapshot();\n if (!snapshot) return;\n\n const response = snapshot.response();\n const loading = snapshot.loading();\n const error = snapshot.error();\n\n if (response && !loading && !error) {\n try {\n const tokens = extractTokens(response);\n setTokens(tokens.accessToken, tokens.refreshToken);\n } catch (extractError) {\n if (isDevMode()) {\n console.error(`Failed to extract tokens from ${builder.key} response:`, extractError);\n }\n }\n }\n });\n\n const execute = (args: RequestArgs<QueryArgs>, options?: { triggeredBy?: string }) => {\n const query = builder.config.queryCreator({\n onlyManualExecution: true,\n injector,\n });\n query.execute({ args, options });\n const snapshot = query.createSnapshot();\n\n latestExecutedQuery.set({ key: builder.key, snapshot });\n if (!snapshot.triggeredBy()) {\n latestNonInternalQuery.set({ key: builder.key, snapshot });\n }\n\n querySnapshot.set(snapshot);\n return snapshot;\n };\n\n queries[builder.key as ExtractQueryKey<TBuilders[number]>] = {\n execute,\n snapshot: querySnapshot.asReadonly(),\n } as unknown as QueryRegistry<TBuilders>[ExtractQueryKey<TBuilders[number]>];\n }\n\n return { queries, querySnapshots };\n};\n\nconst setupFeatures = <\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData,\n>(\n featureBuilders: TFeatures | undefined,\n context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>,\n) => {\n const features: Record<string, unknown> = {};\n\n if (!featureBuilders?.length) {\n return features;\n }\n\n const featureTypes = new Set<BearerAuthFeatureType>();\n\n for (const featureSetup of featureBuilders) {\n const feature = featureSetup(context) as BearerAuthFeature<TBuilders, TBearerData> & { instance: unknown };\n\n if (featureTypes.has(feature.type)) {\n throw authProviderFeatureUsedMultipleTimes(feature.type);\n }\n\n featureTypes.add(feature.type);\n const featureName = feature.type\n .toLowerCase()\n .split('_')\n .map((word, index) => (index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\n .join('');\n features[featureName] = feature.instance;\n }\n\n return features;\n};\n\nconst setupMultiTabSyncIfEnabled = (\n config: CreateBearerAuthProviderConfig<any, any, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n accessToken: WritableSignal<string | null>,\n refreshToken: WritableSignal<string | null>,\n queryClient: QueryClient,\n) => {\n const multiTabSyncConfig = config.multiTabSync;\n const multiTabSyncEnabled = multiTabSyncConfig !== false && (multiTabSyncConfig?.enabled ?? true);\n\n if (multiTabSyncEnabled) {\n setupMultiTabSync(\n {\n channelName: typeof multiTabSyncConfig === 'object' ? multiTabSyncConfig?.channelName : undefined,\n syncTokens: typeof multiTabSyncConfig === 'object' ? multiTabSyncConfig?.syncTokens : undefined,\n syncLogout: typeof multiTabSyncConfig === 'object' ? multiTabSyncConfig?.syncLogout : undefined,\n },\n accessToken,\n refreshToken,\n queryClient,\n );\n }\n};\n\nconst createLeaderElection = (\n config: CreateBearerAuthProviderConfig<any, any, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n) => {\n const multiTabSyncConfig = config.multiTabSync;\n const multiTabSyncEnabled = multiTabSyncConfig !== false && (multiTabSyncConfig?.enabled ?? true);\n const leaderElectionEnabled =\n multiTabSyncEnabled &&\n (typeof multiTabSyncConfig === 'object' ? (multiTabSyncConfig?.leaderElection ?? true) : true);\n const leaderElection = leaderElectionEnabled ? setupLeaderElection() : null;\n const isLeaderFn = () => (leaderElectionEnabled ? (leaderElection?.isLeader() ?? true) : true);\n const leaderElectionContext = leaderElection\n ? { isLeader: leaderElection.isLeader, instanceCount: leaderElection.instanceCount }\n : undefined;\n return { isLeaderFn, leaderElectionContext };\n};\n\nconst createBearerAuthProviderImpl = <\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData,\n>(\n config: CreateBearerAuthProviderConfig<TBuilders, TFeatures, TBearerData>,\n) => {\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n const queryClient = config.queryClientRef[1]();\n\n const accessToken = signal<string | null>(null);\n const refreshToken = signal<string | null>(null);\n const afterTokenRefresh$ = new Subject<void>();\n\n const bearerData = computed<TBearerData | null>(() => {\n const token = accessToken();\n if (!token) return null;\n\n try {\n return config.bearerDecryptFn?.(token) ?? decryptBearer<TBearerData>(token);\n } catch (error) {\n if (isDevMode()) {\n console.error('Failed to decrypt bearer token:', error);\n }\n return null;\n }\n });\n\n const isAuthenticated = computed(() => !!accessToken());\n const latestExecutedQuery = signal<{ key: string; snapshot: QuerySnapshot<QueryArgs> } | null>(null);\n const latestNonInternalQuery = signal<{ key: string; snapshot: QuerySnapshot<QueryArgs> } | null>(null);\n\n const setTokens = (access: string, refresh: string) => {\n accessToken.set(access);\n refreshToken.set(refresh);\n afterTokenRefresh$.next();\n };\n\n const { queries } = setupBearerQueryRegistry(\n config.queries,\n injector,\n latestExecutedQuery,\n latestNonInternalQuery,\n setTokens,\n );\n\n const logout = () => {\n accessToken.set(null);\n refreshToken.set(null);\n queryClient.repository.unbindAllSecure();\n };\n\n const isLeader = createLeaderElection(config);\n\n const querySetupContext: BearerAuthProviderQueryContext<TBearerData, TBuilders> = {\n accessToken,\n refreshToken,\n bearerDecryptFn: config.bearerDecryptFn,\n queryClient,\n repository: queryClient.repository,\n isLeader: isLeader.isLeaderFn,\n afterTokenRefresh$,\n queries: queries as unknown as QueryRegistry<TBuilders>,\n };\n\n for (const builder of config.queries) {\n builder.setup?.(querySetupContext);\n }\n\n const featureSetupContext: BearerAuthProviderFeatureContext<TBearerData, TBuilders> = {\n refreshToken,\n accessToken,\n bearerData,\n logout,\n injector,\n destroyRef,\n setTokens,\n isLeader: isLeader.isLeaderFn,\n leaderElection: isLeader.leaderElectionContext,\n afterTokenRefresh$,\n queries: queries as unknown as QueryRegistry<TBuilders>,\n };\n\n const features = setupFeatures(config.features, featureSetupContext);\n\n setupMultiTabSyncIfEnabled(config, accessToken, refreshToken, queryClient);\n\n return {\n queries,\n features: features as FeatureRegistry<TFeatures, TBuilders>,\n accessToken: accessToken.asReadonly(),\n refreshToken: refreshToken.asReadonly(),\n bearerData,\n isAuthenticated,\n latestExecutedQuery: latestExecutedQuery.asReadonly(),\n latestNonInternalQuery: latestNonInternalQuery.asReadonly(),\n logout,\n afterTokenRefresh$,\n } as BearerAuthProvider<TBuilders, TFeatures, TBearerData>;\n};\n\nexport const createBearerAuthProvider = <\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData = unknown,\n>(\n config: CreateBearerAuthProviderConfig<TBuilders, TFeatures, TBearerData>,\n) => createRootProvider(() => createBearerAuthProviderImpl(config), { name: `BearerAuthProvider_${config.name}` });\n\nexport type BearerAuthProviderRef<\n TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[] =\n readonly ((context: BearerAuthProviderFeatureContext<unknown, readonly AnyQueryBuilder[]>) => unknown)[],\n TBearerData = unknown,\n> = ProviderResult<BearerAuthProvider<TBuilders, TFeatures, TBearerData>>;\n\nexport type AnyCreateBearerAuthProviderResult = BearerAuthProviderRef<any, any, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\nexport type AnyBearerAuthProvider = NonNullable<ReturnType<AnyCreateBearerAuthProviderResult[1]>>;\n","import { isDevMode } from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { filter, of, switchMap, tap, timer } from 'rxjs';\nimport { QueryArgs, QueryCreator, RequestArgs, ResponseType } from '../http';\nimport { ShouldRetryRequestFn } from '../http/query-retry-utils';\nimport { decryptBearer } from '../legacy/auth';\nimport { BearerAuthProviderQueryContext } from './bearer-auth-provider';\n\nexport type BearerAuthProviderTokens = {\n accessToken: string;\n refreshToken: string;\n};\n\nexport type AuthQueryConfig<TArgs extends QueryArgs> = {\n queryCreator: QueryCreator<TArgs>;\n /**\n * Extracts tokens from the response.\n * @default (response) => response (assumes response has accessToken and refreshToken properties)\n */\n extractTokens?: (response: ResponseType<TArgs>) => BearerAuthProviderTokens;\n /**\n * Custom retry function for HTTP requests.\n * @internal Used internally by token refresh queries\n */\n retryFn?: ShouldRetryRequestFn;\n};\n\nexport type TokenRefreshQueryConfig<TArgs extends QueryArgs> = AuthQueryConfig<TArgs> & {\n /**\n * The property name in the decoded JWT that contains the expiration time (in seconds).\n * @default 'exp'\n */\n expiresInPropertyName?: string;\n\n /**\n * Strategy for determining when to refresh the token.\n * Can be either:\n * - A percentage (0-1) of the token's lifetime (e.g., 0.75 = refresh at 75% of lifetime)\n * - A fixed time in milliseconds before expiration\n * - An object with both percentage and min/max constraints\n * @default { percentage: 0.75, minBufferMs: 60000, maxBufferMs: 600000 }\n */\n refreshStrategy?:\n | number\n | {\n /**\n * Percentage of token lifetime before refresh (0-1)\n * @default 0.75\n */\n percentage?: number;\n /**\n * Minimum buffer time in ms (prevents too-early refresh for short-lived tokens)\n * @default 60000 (1 minute)\n */\n minBufferMs?: number;\n /**\n * Maximum buffer time in ms (prevents too-late refresh for long-lived tokens)\n * @default 600000 (10 minutes)\n */\n maxBufferMs?: number;\n };\n\n /**\n * Minimum interval between refresh attempts in milliseconds.\n * Prevents rapid refresh loops in case of issues.\n * @default 30000 (30 seconds)\n */\n minRefreshInterval?: number;\n\n /**\n * Whether to immediately refresh if token is already expired on startup.\n * @default true\n */\n refreshIfExpired?: boolean;\n\n /**\n * Configuration for retry behavior on failed refresh attempts.\n * @default { retryableStatusCodes: [0, 408, 425, 429, 500, 502, 503, 504], maxRetryDelayMs: 30000 }\n */\n retryConfig?: {\n /**\n * HTTP status codes that should trigger a retry.\n * Code 0 means network error (no internet).\n * @default [0, 408, 425, 429, 500, 502, 503, 504]\n */\n retryableStatusCodes?: number[];\n /**\n * Maximum delay between retries in milliseconds.\n * Uses exponential backoff up to this limit, then stays constant.\n * @default 30000 (30 seconds)\n */\n maxRetryDelayMs?: number;\n /**\n * Maximum number of retry attempts.\n * Set to 0 for unlimited retries.\n * @default 0 (unlimited)\n */\n maxAttempts?: number;\n };\n\n /**\n * Whether to automatically retry failed requests with 401 status after refreshing tokens.\n * @default true\n */\n autoRetryOn401?: boolean;\n};\n\nexport type AuthQueryBuilder<TKey extends string, TArgs extends QueryArgs> = {\n _type: 'authQuery';\n key: TKey;\n config: AuthQueryConfig<TArgs>;\n setup?: (context: BearerAuthProviderQueryContext) => void;\n};\n\nexport type TokenRefreshQueryBuilder<TKey extends string, TArgs extends QueryArgs> = {\n _type: 'tokenRefreshQuery';\n key: TKey;\n config: TokenRefreshQueryConfig<TArgs>;\n setup?: (context: BearerAuthProviderQueryContext) => void;\n};\n\nexport type AnyQueryBuilder =\n | AuthQueryBuilder<string, any> // eslint-disable-line @typescript-eslint/no-explicit-any\n | TokenRefreshQueryBuilder<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport const withAuthenticationQuery = <TKey extends string, TArgs extends QueryArgs>(\n key: TKey,\n config: AuthQueryConfig<TArgs>,\n setup?: (context: BearerAuthProviderQueryContext) => void,\n): AuthQueryBuilder<TKey, TArgs> => ({\n _type: 'authQuery',\n key,\n config: {\n ...config,\n queryCreator: config.queryCreator.clone({ subtle: { useQueryRepositoryCache: true } }),\n },\n setup,\n});\n\nexport const withRefreshQuery = <TKey extends string, TArgs extends QueryArgs>(\n key: TKey,\n config: TokenRefreshQueryConfig<TArgs>,\n): TokenRefreshQueryBuilder<TKey, TArgs> => {\n const retryableStatusCodes = config.retryConfig?.retryableStatusCodes ?? [0, 408, 425, 429, 500, 502, 503, 504];\n const maxRetryDelayMs = config.retryConfig?.maxRetryDelayMs ?? 30000; // 30 seconds\n const maxAttempts = config.retryConfig?.maxAttempts ?? 0; // 0 = unlimited\n\n const refreshRetryFn: ShouldRetryRequestFn = ({ error, retryCount }) => {\n const { status } = error;\n\n if (maxAttempts > 0 && retryCount >= maxAttempts) {\n return { retry: false };\n }\n\n if (!retryableStatusCodes.includes(status)) {\n return { retry: false };\n }\n\n if (status === 429) {\n const retryAfter = error.headers.get('retry-after') || error.headers.get('x-retry-after');\n if (retryAfter) {\n const delay = parseInt(retryAfter) * 1000;\n if (!Number.isNaN(delay)) {\n return { retry: true, delay: Math.min(delay, maxRetryDelayMs) };\n }\n }\n }\n\n const exponentialDelay = 1000 * Math.pow(2, retryCount);\n const delay = Math.min(exponentialDelay, maxRetryDelayMs);\n\n return { retry: true, delay };\n };\n\n const setup = (context: BearerAuthProviderQueryContext) => {\n const expiresInPropertyName = config.expiresInPropertyName ?? 'exp';\n const minRefreshInterval = config.minRefreshInterval ?? 30000; // 30 seconds default\n const refreshIfExpired = config.refreshIfExpired ?? true;\n\n let lastRefreshTime = 0;\n\n const executeRefresh = (triggeredInternally = true) => {\n const currentRefreshToken = context.refreshToken();\n if (!currentRefreshToken || !context.isLeader()) return;\n\n const now = Date.now();\n const timeSinceLastRefresh = now - lastRefreshTime;\n\n // Prevent too-frequent refreshes\n if (timeSinceLastRefresh < minRefreshInterval) return;\n\n lastRefreshTime = now;\n const refreshArgs = { body: { token: currentRefreshToken } } as RequestArgs<QueryArgs>;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n context.queries[key]!.execute(refreshArgs, {\n triggeredBy: triggeredInternally ? 'token-refresh' : undefined,\n });\n };\n\n const calculateRefreshBuffer = (tokenLifetimeMs: number): number => {\n if (typeof config.refreshStrategy === 'number') {\n return config.refreshStrategy;\n }\n\n const percentage = config.refreshStrategy?.percentage ?? 0.75;\n const minBufferMs = config.refreshStrategy?.minBufferMs ?? 60000; // 1 minute\n const maxBufferMs = config.refreshStrategy?.maxBufferMs ?? 600000; // 10 minutes\n\n const calculatedBuffer = tokenLifetimeMs * (1 - percentage);\n\n return Math.max(minBufferMs, Math.min(maxBufferMs, calculatedBuffer));\n };\n\n // Auto-refresh based on token expiration\n toObservable(context.accessToken)\n .pipe(\n switchMap((token) => {\n if (!token) return of(null);\n\n try {\n const bearerDataValue = context.bearerDecryptFn ? context.bearerDecryptFn(token) : decryptBearer(token);\n const expiresIn = (bearerDataValue as Record<string, unknown>)?.[expiresInPropertyName];\n\n if (typeof expiresIn !== 'number') {\n if (isDevMode()) {\n console.warn(`Token does not contain valid ${expiresInPropertyName} property for auto-refresh`);\n }\n return of(null);\n }\n\n const expiresAtMs = expiresIn * 1000;\n const now = Date.now();\n const tokenLifetimeMs = expiresAtMs - now;\n\n if (tokenLifetimeMs <= 0) {\n if (refreshIfExpired) {\n if (isDevMode()) {\n console.warn('Token is already expired, triggering immediate refresh');\n }\n return of(true);\n }\n return of(null);\n }\n\n const refreshBufferMs = calculateRefreshBuffer(tokenLifetimeMs);\n const timeUntilRefresh = tokenLifetimeMs - refreshBufferMs;\n\n if (timeUntilRefresh <= 0) {\n return of(true);\n }\n\n return timer(timeUntilRefresh).pipe(tap(() => true));\n } catch {\n return of(null);\n }\n }),\n takeUntilDestroyed(),\n )\n .subscribe((shouldRefresh) => {\n if (shouldRefresh) {\n executeRefresh(true);\n }\n });\n\n // Auto-retry on 401: Listen to repository events and trigger refresh on 401 errors\n const autoRetryOn401 = config.autoRetryOn401 ?? true;\n if (autoRetryOn401) {\n context.repository.events$\n .pipe(\n filter((event) => {\n // Only handle 401 errors for secure queries\n if (event.type !== 'request-error') return false;\n if (!event.isSecure) return false;\n if (event.error?.status !== 401) return false;\n\n return true;\n }),\n takeUntilDestroyed(),\n )\n .subscribe(() => {\n executeRefresh(true);\n });\n }\n };\n\n return {\n _type: 'tokenRefreshQuery',\n key,\n config: {\n ...config,\n queryCreator: config.queryCreator.clone({ retryFn: refreshRetryFn, subtle: { useQueryRepositoryCache: true } }),\n },\n setup,\n };\n};\n","import { DestroyRef, DOCUMENT, effect, inject, Signal, signal } from '@angular/core';\nimport { filter, fromEvent, interval, merge, switchMap, throttleTime, timer } from 'rxjs';\nimport { AnyQueryBuilder, BearerAuthFeatureType, BearerAuthProviderFeatureContext } from '../bearer-auth-provider';\n\nexport type InactivityLogoutConfig = {\n /**\n * Time in milliseconds of inactivity before auto-logout\n * @default 15 * 60 * 1000 (15 minutes)\n */\n inactivityTimeout?: number;\n /**\n * Events to track for activity detection\n * @default ['mousedown', 'keydown', 'scroll', 'touchstart']\n */\n activityEvents?: string[];\n /**\n * Custom activity check function (called periodically)\n * Return true if user is active\n */\n customActivityCheck?: () => boolean;\n};\n\nexport type InactivityLogoutFeature = {\n /**\n * Enable inactivity tracking\n */\n enable: () => void;\n /**\n * Disable inactivity tracking\n */\n disable: () => void;\n /**\n * Reset the inactivity timer (mark user as active)\n */\n resetTimer: () => void;\n /**\n * Whether inactivity tracking is enabled\n */\n enabled: Signal<boolean>;\n /**\n * Milliseconds until auto-logout (null if disabled or no token)\n */\n calculateTimeUntilLogout: () => number | null;\n};\n\nexport const withInactivityLogout = <TBuilders extends readonly AnyQueryBuilder[]>(\n config: InactivityLogoutConfig = {},\n) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n const inactivityTimeout = config.inactivityTimeout ?? 15 * 60 * 1000;\n const activityEvents = config.activityEvents ?? ['mousedown', 'keydown', 'scroll', 'touchstart'];\n const destroyRef = inject(DestroyRef);\n const document = inject(DOCUMENT);\n const enabled = signal(true);\n const lastActivityTime = signal(Date.now());\n\n const resetTimer = () => {\n lastActivityTime.set(Date.now());\n };\n\n const activityFromEvents$ = merge(...activityEvents.map((event) => fromEvent(document, event))).pipe(\n throttleTime(1000),\n );\n\n const activityFromCustomCheck$ = config.customActivityCheck\n ? interval(1000).pipe(filter(() => config.customActivityCheck?.() ?? false))\n : merge();\n\n const activity$ = merge(activityFromEvents$, activityFromCustomCheck$);\n\n const activitySubscription = activity$.subscribe(() => {\n if (enabled() && context.accessToken()) {\n resetTimer();\n }\n });\n\n const inactivityLogout$ = activity$.pipe(\n switchMap(() => timer(inactivityTimeout)),\n filter(() => enabled() && !!context.accessToken()),\n );\n\n const logoutSubscription = inactivityLogout$.subscribe(() => {\n context.logout();\n });\n\n effect(() => {\n const token = context.accessToken();\n if (token && enabled()) {\n resetTimer();\n }\n });\n\n const enable = () => {\n enabled.set(true);\n resetTimer();\n };\n\n const disable = () => {\n enabled.set(false);\n };\n\n const calculateTimeUntilLogout = () => {\n if (!enabled() || !context.accessToken()) {\n return null;\n }\n\n const elapsed = Date.now() - lastActivityTime();\n const remaining = inactivityTimeout - elapsed;\n\n return remaining > 0 ? remaining : 0;\n };\n\n resetTimer();\n\n destroyRef.onDestroy(() => {\n activitySubscription.unsubscribe();\n logoutSubscription.unsubscribe();\n });\n\n const instance: InactivityLogoutFeature = {\n enable,\n disable,\n resetTimer,\n enabled: enabled.asReadonly(),\n calculateTimeUntilLogout,\n };\n\n return {\n type: BearerAuthFeatureType.INACTIVITY_LOGOUT,\n instance,\n };\n };\n};\n","import { Signal, effect, signal } from '@angular/core';\nimport { deleteCookie as coreDeleteCookie, getCookie, getDomain, injectRoute, setCookie } from '@ethlete/core';\nimport { RequestArgs } from '../../http';\nimport {\n AnyQueryBuilder,\n BearerAuthFeatureType,\n BearerAuthProviderFeatureContext,\n ExtractQueryArgs,\n ExtractQueryKey,\n} from '../bearer-auth-provider';\nimport { decryptToken, encryptToken } from '../utils';\n\nexport type PersistentAuthConfig<\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n> = {\n /**\n * Default remember me state when no user preference is stored.\n * @default false\n */\n defaultRememberMe?: boolean;\n\n /**\n * Cookie configuration\n */\n cookie?: {\n /**\n * The cookie name where the refresh token is stored\n * @default 'etAuth'\n */\n name?: string;\n /**\n * The domain of the cookie. If not set, the current origin will be used.\n */\n domain?: string;\n /**\n * The days until the cookie expires (only used when rememberMe is true)\n * @default 30\n */\n expiresInDays?: number;\n /**\n * The path of the cookie\n * @default '/'\n */\n path?: string;\n /**\n * The same site property of the cookie\n * @default 'lax'\n */\n sameSite?: 'strict' | 'none' | 'lax';\n };\n\n /**\n * Auto-login configuration\n */\n autoLogin: {\n /**\n * The query key to use for auto-login (must reference a registered query)\n */\n queryKey: TKey;\n /**\n * A function that turns the token gotten from the cookie into the body for the auto-login request\n * @default (token) => ({ body: { token } })\n */\n buildArgs: (token: string) => RequestArgs<ExtractQueryArgs<Extract<TBuilders[number], { key: TKey }>>>;\n /**\n * An array of routes where the auto login via cookie should not be triggered.\n *\n * @default []\n */\n excludeRoutes?: string[];\n };\n};\n\nexport type PersistentAuthFeature = {\n /**\n * Current remember me state (session cookie vs persistent cookie)\n */\n rememberMe: Signal<boolean>;\n /**\n * Set remember me preference.\n * - true: Creates persistent cookie with expiresInDays\n * - false: Creates session cookie (deleted on browser close)\n */\n setRememberMe: (enabled: boolean) => void;\n /**\n * Try to login using stored cookie\n */\n tryLogin: () => void;\n};\n\nexport const withPersistentAuth = <\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n>(\n config: PersistentAuthConfig<TBuilders, TKey>,\n) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n const instance = createPersistentAuthFeature(config, context);\n return {\n type: BearerAuthFeatureType.PERSISTENT_AUTH,\n instance,\n };\n };\n};\n\nexport const createPersistentAuthFeature = <\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n>(\n config: PersistentAuthConfig<TBuilders, TKey>,\n context: BearerAuthProviderFeatureContext<unknown, TBuilders>,\n): PersistentAuthFeature => {\n const { refreshToken } = context;\n const cookieName = config.cookie?.name ?? 'etAuth';\n const rememberMeStorageKey = `${cookieName}-rememberMe`;\n const route = injectRoute();\n\n const initializeRememberMe = (): boolean => {\n const storedPreference = typeof localStorage !== 'undefined' ? localStorage.getItem(rememberMeStorageKey) : null;\n if (storedPreference !== null) {\n return storedPreference === 'true';\n }\n\n const existingCookie = getCookie(cookieName);\n if (existingCookie) {\n return true;\n }\n\n return config.defaultRememberMe ?? false;\n };\n\n const rememberMeSignal = signal(initializeRememberMe());\n\n effect(() => {\n const token = refreshToken();\n const rememberMe = rememberMeSignal();\n const domain = config.cookie?.domain ?? getDomain() ?? 'localhost';\n const path = config.cookie?.path ?? '/';\n const sameSite = config.cookie?.sameSite ?? 'lax';\n\n if (token) {\n const encryptedToken = encryptToken(token);\n if (rememberMe) {\n const expiresInDays = config.cookie?.expiresInDays ?? 30;\n setCookie(cookieName, encryptedToken, expiresInDays, domain, path, sameSite);\n } else {\n setCookie(cookieName, encryptedToken, null, domain, path, sameSite);\n }\n } else {\n coreDeleteCookie(cookieName, path, domain);\n }\n });\n\n const tryLogin = () => {\n const currentRoute = route();\n const excludeRoutes = config.autoLogin.excludeRoutes ?? [];\n const shouldExclude = excludeRoutes.some((r) => currentRoute.startsWith(r));\n\n if (shouldExclude) {\n return;\n }\n\n const storedToken = getCookie(cookieName);\n if (storedToken) {\n const decryptedToken = decryptToken(storedToken);\n const args = config.autoLogin.buildArgs(decryptedToken);\n context.queries[config.autoLogin.queryKey].execute(args, { triggeredBy: 'persistent-auth' });\n }\n };\n\n const setRememberMe = (enabled: boolean) => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(rememberMeStorageKey, String(enabled));\n }\n rememberMeSignal.set(enabled);\n };\n\n tryLogin();\n\n return {\n rememberMe: rememberMeSignal.asReadonly(),\n setRememberMe,\n tryLogin,\n };\n};\n","import { Signal, computed } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { combineLatest, interval, map } from 'rxjs';\nimport { AnyQueryBuilder, BearerAuthFeatureType, BearerAuthProviderFeatureContext } from '../bearer-auth-provider';\n\nexport type TokenExpirationWarningConfig = {\n /**\n * Time in milliseconds before token expiration to emit warning\n * @default 5 * 60 * 1000 (5 minutes)\n */\n warningThreshold?: number;\n /**\n * Interval in milliseconds to check for token expiration\n * @default 1000 (1 second)\n */\n checkInterval?: number;\n};\n\nexport type TokenExpirationWarningFeature = {\n /**\n * Signal that emits true when token is about to expire\n */\n isExpiringSoon: Signal<boolean>;\n /**\n * Time in milliseconds until token expires (null if no token or expired)\n */\n expiresIn: Signal<number | null>;\n /**\n * Timestamp when token expires (null if no token)\n */\n expiresAt: Signal<Date | null>;\n};\n\nexport const withTokenExpirationWarning = <TBuilders extends readonly AnyQueryBuilder[]>(\n config: NoInfer<TokenExpirationWarningConfig> = {},\n) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n const warningThreshold = config.warningThreshold ?? 5 * 60 * 1000;\n const checkInterval = config.checkInterval ?? 1000;\n const expiresAt = computed<Date | null>(() => {\n const decoded = context.bearerData() as { exp?: number; [key: string]: unknown } | null;\n if (!decoded) return null;\n\n const exp = decoded.exp;\n\n if (typeof exp !== 'number') return null;\n\n return new Date(exp * 1000);\n });\n\n const expiresIn$ = combineLatest([interval(checkInterval), toObservable(context.bearerData)]).pipe(\n map(() => {\n const expiry = expiresAt();\n if (!expiry) return null;\n\n const now = Date.now();\n const msUntilExpiry = expiry.getTime() - now;\n\n return msUntilExpiry > 0 ? msUntilExpiry : null;\n }),\n );\n\n const isExpiringSoon$ = expiresIn$.pipe(\n map((msUntilExpiry) => {\n if (msUntilExpiry === null) return false;\n return msUntilExpiry <= warningThreshold && msUntilExpiry > 0;\n }),\n );\n\n const expiresIn = toSignal(expiresIn$, { initialValue: null });\n const isExpiringSoon = toSignal(isExpiringSoon$, { initialValue: false });\n\n const instance: TokenExpirationWarningFeature = {\n expiresAt,\n expiresIn,\n isExpiringSoon,\n };\n\n return {\n type: BearerAuthFeatureType.TOKEN_EXPIRATION_WARNING,\n instance,\n };\n };\n};\n","import { effect, Signal, signal, untracked } from '@angular/core';\nimport { AnyQuerySnapshot, QuerySnapshot, RequestArgs } from '../../http';\nimport {\n AnyQueryBuilder,\n BearerAuthFeatureType,\n BearerAuthProviderFeatureContext,\n ExtractQueryArgs,\n ExtractQueryKey,\n} from '../bearer-auth-provider';\n\nexport type TokenRevocationConfig<\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n> = {\n /**\n * The query key to use for token revocation (must reference a registered query)\n */\n queryKey: TKey;\n /**\n * Function to build the revocation request args from tokens\n */\n buildArgs: (tokens: {\n accessToken: string | null;\n refreshToken: string | null;\n }) => RequestArgs<ExtractQueryArgs<Extract<TBuilders[number], { key: TKey }>>>;\n /**\n * Whether to revoke on logout\n * @default true\n */\n revokeOnLogout?: boolean;\n};\n\nexport type TokenRevocationFeature<TQuerySnapshot extends AnyQuerySnapshot> = {\n /**\n * Manually revoke the current tokens.\n * Returns `null` if there are no tokens to revoke\n * Returns the revocation query snapshot if revocation was attempted\n */\n revoke: () => TQuerySnapshot | null;\n /**\n * Enable automatic revocation on logout\n */\n enable: () => void;\n /**\n * Disable automatic revocation on logout\n */\n disable: () => void;\n /**\n * Whether automatic revocation is enabled\n */\n enabled: Signal<boolean>;\n};\n\nexport const withTokenRevocation = <\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n>(\n config: TokenRevocationConfig<TBuilders, TKey>,\n) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n type RevocationSnapshot = QuerySnapshot<ExtractQueryArgs<Extract<TBuilders[number], { key: TKey }>>>;\n\n const revokeOnLogout = config.revokeOnLogout ?? true;\n\n const enabled = signal(true);\n let previousAccessToken: string | null = null;\n let currentRevocationSnapshot: RevocationSnapshot | null = null;\n\n const revoke = () => {\n if (currentRevocationSnapshot?.isAlive()) return currentRevocationSnapshot;\n\n const accessToken = context.accessToken();\n const refreshToken = context.refreshToken();\n\n if (!accessToken && !refreshToken) {\n return null;\n }\n\n const args = config.buildArgs({ accessToken, refreshToken });\n\n currentRevocationSnapshot = context.queries[config.queryKey].execute(args, {\n triggeredBy: 'token-revocation',\n });\n\n return currentRevocationSnapshot;\n };\n\n const enable = () => {\n enabled.set(true);\n };\n\n const disable = () => {\n enabled.set(false);\n };\n\n if (revokeOnLogout) {\n effect(\n () => {\n const currentToken = context.accessToken();\n\n if (previousAccessToken && !currentToken && enabled()) {\n untracked(() => revoke());\n }\n\n previousAccessToken = currentToken;\n },\n { injector: context.injector },\n );\n }\n\n const instance: TokenRevocationFeature<RevocationSnapshot> = {\n revoke,\n enable,\n disable,\n enabled: enabled.asReadonly(),\n };\n\n return {\n type: BearerAuthFeatureType.TOKEN_REVOCATION,\n instance,\n };\n };\n};\n","import { effect, Signal } from '@angular/core';\nimport { QueryArgs, QueryErrorResponse, QuerySnapshot } from '../../http';\nimport {\n AnyQueryBuilder,\n BearerAuthFeatureType,\n BearerAuthProviderFeatureContext,\n ExtractQueryArgs,\n ExtractQueryKey,\n} from '../bearer-auth-provider';\n\nexport type TrackingEventName<TBuilders extends readonly AnyQueryBuilder[]> =\n | `${ExtractQueryKey<TBuilders[number]>}Execute`\n | `${ExtractQueryKey<TBuilders[number]>}Success`\n | `${ExtractQueryKey<TBuilders[number]>}Failure`\n | 'tokenRefreshSuccess'\n | 'logout'\n | 'leaderStatusChange'\n | 'leaderInstanceCountChange';\n\ntype ExtractKeyFromEventName<TEventName extends string> = TEventName extends `${infer K}Execute`\n ? K\n : TEventName extends `${infer K}Success`\n ? K\n : TEventName extends `${infer K}Failure`\n ? K\n : never;\n\ntype ExtractArgsForEvent<TBuilders extends readonly AnyQueryBuilder[], TEventName extends string> = ExtractQueryArgs<\n Extract<TBuilders[number], { key: ExtractKeyFromEventName<TEventName> }>\n>;\n\nexport type QueryExecuteEventData<TArgs extends QueryArgs = QueryArgs> = {\n queryKey: string;\n args: TArgs;\n};\n\nexport type QuerySuccessEventData<TArgs extends QueryArgs = QueryArgs> = {\n snapshot: QuerySnapshot<TArgs>;\n};\n\nexport type QueryFailureEventData = {\n error: QueryErrorResponse;\n};\n\nexport type TokenRefreshEventData = {\n automatic: boolean;\n};\n\nexport type LeaderStatusChangeEventData = {\n isLeader: boolean;\n};\n\nexport type LeaderInstanceCountChangeEventData = {\n count: number;\n};\n\nexport type TrackingEventDataMap<TBuilders extends readonly AnyQueryBuilder[]> = {\n [K in TrackingEventName<TBuilders>]: K extends `${string}Execute`\n ? QueryExecuteEventData<ExtractArgsForEvent<TBuilders, K>>\n : K extends `${string}Success`\n ? QuerySuccessEventData<ExtractArgsForEvent<TBuilders, K>>\n : K extends `${string}Failure`\n ? QueryFailureEventData\n : K extends 'tokenRefreshSuccess'\n ? TokenRefreshEventData\n : K extends 'logout'\n ? void\n : K extends 'leaderStatusChange'\n ? LeaderStatusChangeEventData\n : K extends 'leaderInstanceCountChange'\n ? LeaderInstanceCountChangeEventData\n : never;\n};\n\nexport type TrackingEventHandler<TData> = (data: TData) => void;\n\nexport type TrackingConfig<TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[]> = {\n /**\n * Whether to track internal events (auto token refresh, etc.)\n * @default true\n */\n trackInternalEvents?: boolean;\n\n /**\n * Event handlers to register immediately\n */\n on?: {\n [K in TrackingEventName<TBuilders>]?: TrackingEventHandler<TrackingEventDataMap<TBuilders>[K]>;\n };\n};\n\nexport type TrackingFeature<TBuilders extends readonly AnyQueryBuilder[]> = {\n /**\n * Register an event handler for a specific event\n * @returns Unsubscribe function\n */\n on<TEvent extends TrackingEventName<TBuilders>>(\n event: TEvent,\n handler: TrackingEventHandler<TrackingEventDataMap<TBuilders>[TEvent]>,\n ): () => void;\n\n /**\n * Unregister an event handler\n */\n off<TEvent extends TrackingEventName<TBuilders>>(\n event: TEvent,\n handler: TrackingEventHandler<TrackingEventDataMap<TBuilders>[TEvent]>,\n ): void;\n};\n\nexport const withTracking = <TBuilders extends readonly AnyQueryBuilder[]>(config?: TrackingConfig<TBuilders>) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n const instance = createTrackingFeature<TBuilders>(context, config);\n return {\n type: BearerAuthFeatureType.TRACKING,\n instance,\n };\n };\n};\n\nexport const createTrackingFeature = <TBuilders extends readonly AnyQueryBuilder[]>(\n context: BearerAuthProviderFeatureContext<unknown, TBuilders>,\n config?: TrackingConfig<TBuilders>,\n): TrackingFeature<TBuilders> => {\n const handlers = new Map<string, Set<TrackingEventHandler<any>>>(); // eslint-disable-line @typescript-eslint/no-explicit-any\n\n const on = <TEvent extends TrackingEventName<TBuilders>>(\n event: TEvent,\n handler: TrackingEventHandler<TrackingEventDataMap<TBuilders>[TEvent]>,\n ): (() => void) => {\n if (!handlers.has(event)) {\n handlers.set(event, new Set());\n }\n const eventHandlers = handlers.get(event);\n if (eventHandlers) {\n eventHandlers.add(handler);\n }\n\n return () => off(event, handler);\n };\n\n const off = <TEvent extends TrackingEventName<TBuilders>>(\n event: TEvent,\n handler: TrackingEventHandler<TrackingEventDataMap<TBuilders>[TEvent]>,\n ): void => {\n const eventHandlers = handlers.get(event);\n if (eventHandlers) {\n eventHandlers.delete(handler);\n if (eventHandlers.size === 0) {\n handlers.delete(event);\n }\n }\n };\n\n const fireHandlers = (event: string, data: unknown): void => {\n const eventHandlers = handlers.get(event);\n if (eventHandlers) {\n eventHandlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in tracking event handler for \"${event}\":`, error);\n }\n });\n }\n };\n\n type ForwardedMessage = { event: string; data: unknown };\n const forwardingChannel =\n context.leaderElection && typeof BroadcastChannel !== 'undefined'\n ? new BroadcastChannel('ethlete-auth-tracking')\n : null;\n\n if (forwardingChannel) {\n forwardingChannel.onmessage = (messageEvent: MessageEvent<ForwardedMessage>) => {\n if (context.isLeader()) {\n fireHandlers(messageEvent.data.event, messageEvent.data.data);\n }\n };\n context.destroyRef.onDestroy(() => forwardingChannel.close());\n }\n\n const emit = (event: string, data: unknown): void => {\n if (forwardingChannel && !context.isLeader()) {\n forwardingChannel.postMessage({ event, data } satisfies ForwardedMessage);\n return;\n }\n fireHandlers(event, data);\n };\n\n const emitDirect = (event: string, data: unknown): void => {\n fireHandlers(event, data);\n };\n\n const trackedQueries = new Map<string, { loading: boolean; lastResult: 'success' | 'error' | null }>();\n\n Object.entries(context.queries).forEach(([key, queryEntry]) => {\n const query = queryEntry as { snapshot: Signal<any>; execute: (...args: any[]) => any }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n effect(() => {\n const snapshot = query.snapshot();\n if (!snapshot) return;\n\n const triggeredBy = snapshot.triggeredBy();\n if (triggeredBy) return;\n\n const loading = snapshot.loading();\n const error = snapshot.error();\n const response = snapshot.response();\n\n const prevState = trackedQueries.get(key);\n\n if (response && !loading && !error && prevState?.lastResult !== 'success') {\n trackedQueries.set(key, { loading: false, lastResult: 'success' });\n emit(`${key}Success`, { snapshot });\n }\n\n if (error && !loading && prevState?.lastResult !== 'error') {\n trackedQueries.set(key, { loading: false, lastResult: 'error' });\n emit(`${key}Failure`, { error });\n }\n\n if (loading) {\n trackedQueries.set(key, { loading: true, lastResult: null });\n }\n });\n });\n\n let hadTokens = false;\n effect(() => {\n const accessToken = context.accessToken();\n const refreshToken = context.refreshToken();\n const hasTokens = !!(accessToken || refreshToken);\n\n if (hadTokens && !hasTokens) {\n emit('logout', undefined);\n }\n\n hadTokens = hasTokens;\n });\n\n context.afterTokenRefresh$.subscribe(() => {\n emit('tokenRefreshSuccess', {\n queryKey: 'refresh',\n snapshot: undefined,\n });\n });\n\n if (config?.on) {\n Object.entries(config.on).forEach(([event, handler]) => {\n if (handler) {\n on(event as TrackingEventName<TBuilders>, handler);\n }\n });\n }\n\n if (context.leaderElection) {\n const { isLeader: isLeaderSignal, instanceCount: instanceCountSignal } = context.leaderElection;\n\n effect(() => {\n emitDirect('leaderStatusChange', { isLeader: isLeaderSignal() } satisfies LeaderStatusChangeEventData);\n });\n\n effect(() => {\n emitDirect('leaderInstanceCountChange', {\n count: instanceCountSignal(),\n } satisfies LeaderInstanceCountChangeEventData);\n });\n }\n\n return {\n on,\n off,\n };\n};\n","import { HttpStatusCode } from '@angular/common/http';\n\nexport const parseHttpErrorCodeToTitleDe = (statusCode: HttpStatusCode) => {\n switch (statusCode) {\n case HttpStatusCode.BadRequest:\n return 'Ungültige Anfrage';\n case HttpStatusCode.Unauthorized:\n return 'Nicht autorisiert';\n case HttpStatusCode.PaymentRequired:\n return 'Zahlung erforderlich';\n case HttpStatusCode.Forbidden:\n return 'Verboten';\n case HttpStatusCode.NotFound:\n return 'Nicht gefunden';\n case HttpStatusCode.MethodNotAllowed:\n return 'Methode nicht erlaubt';\n case HttpStatusCode.NotAcceptable:\n return 'Nicht akzeptabel';\n case HttpStatusCode.ProxyAuthenticationRequired:\n return 'Proxy-Authentifizierung erforderlich';\n case HttpStatusCode.RequestTimeout:\n return 'Anforderungszeitüberschreitung';\n case HttpStatusCode.Conflict:\n return 'Konflikt';\n case HttpStatusCode.Gone:\n return 'Weg';\n case HttpStatusCode.LengthRequired:\n return 'Länge erforderlich';\n case HttpStatusCode.PreconditionFailed:\n return 'Vorbedingung fehlgeschlagen';\n case HttpStatusCode.PayloadTooLarge:\n return 'Nutzlast zu groß';\n case HttpStatusCode.UriTooLong:\n return 'URI zu lang';\n case HttpStatusCode.UnsupportedMediaType:\n return 'Nicht unterstützter Medientyp';\n case HttpStatusCode.RangeNotSatisfiable:\n return 'Bereich nicht zufriedenstellend';\n case HttpStatusCode.ExpectationFailed:\n return 'Erwartung fehlgeschlagen';\n case HttpStatusCode.ImATeapot:\n return 'Ich bin eine Teekanne';\n case HttpStatusCode.MisdirectedRequest:\n return 'Fehlgeleitete Anfrage';\n case HttpStatusCode.UnprocessableEntity:\n return 'Unverarbeitbare Entität';\n case HttpStatusCode.Locked:\n return 'Gesperrt';\n case HttpStatusCode.FailedDependency:\n return 'Fehlgeschlagene Abhängigkeit';\n case HttpStatusCode.TooEarly:\n return 'Zu früh';\n case HttpStatusCode.UpgradeRequired:\n return 'Upgrade erforderlich';\n case HttpStatusCode.PreconditionRequired:\n return 'Vorbedingung erforderlich';\n case HttpStatusCode.TooManyRequests:\n return 'Zu viele Anfragen';\n case HttpStatusCode.RequestHeaderFieldsTooLarge:\n return 'Anforderungskopffelder zu groß';\n case HttpStatusCode.UnavailableForLegalReasons:\n return 'Aus rechtlichen Gründen nicht verfügbar';\n case HttpStatusCode.InternalServerError:\n return 'Interner Serverfehler';\n case HttpStatusCode.NotImplemented:\n return 'Nicht implementiert';\n case HttpStatusCode.BadGateway:\n return 'Schlechtes Gateway';\n case HttpStatusCode.ServiceUnavailable:\n return 'Dienst nicht verfügbar';\n case HttpStatusCode.GatewayTimeout:\n return 'Gateway-Zeitüberschreitung';\n case HttpStatusCode.HttpVersionNotSupported:\n return 'HTTP-Version nicht unterstützt';\n case HttpStatusCode.VariantAlsoNegotiates:\n return 'Variante verhandelt auch';\n case HttpStatusCode.InsufficientStorage:\n return 'Unzureichender Speicher';\n case HttpStatusCode.LoopDetected:\n return 'Schleifenerkennung';\n case HttpStatusCode.NotExtended:\n return 'Nicht erweitert';\n case HttpStatusCode.NetworkAuthenticationRequired:\n return 'Netzwerkauthentifizierung erforderlich';\n default:\n return 'Etwas ist schief gelaufen';\n }\n};\n\nexport const parseHttpErrorCodeToMessageDe = (statusCode: HttpStatusCode) => {\n switch (statusCode) {\n case HttpStatusCode.BadRequest:\n return 'Entschuldigung, wir konnten Ihre Anfrage nicht bearbeiten. Bitte versuchen Sie es später erneut.';\n case HttpStatusCode.Unauthorized:\n return 'Sie sind nicht berechtigt, diese Aktion auszuführen. Bitte melden Sie sich an, um fortzufahren.';\n case HttpStatusCode.PaymentRequired:\n return 'Zur Ausführung dieser Aktion ist eine Zahlung erforderlich.';\n case HttpStatusCode.Forbidden:\n return 'Sie haben keine Berechtigung, diese Aktion auszuführen.';\n case HttpStatusCode.NotFound:\n return 'Die angeforderte Ressource wurde nicht gefunden.';\n case HttpStatusCode.MethodNotAllowed:\n return 'Die angeforderte Methode ist für diese Ressource nicht zulässig.';\n case HttpStatusCode.NotAcceptable:\n return 'Die angeforderte Ressource ist nicht in der Lage, eine Antwort zu generieren, die der Liste der akzeptablen Werte entspricht.';\n case HttpStatusCode.ProxyAuthenticationRequired:\n return 'Zur Ausführung dieser Aktion ist eine Proxy-Authentifizierung erforderlich.';\n case HttpStatusCode.RequestTimeout:\n return 'Der Server hat auf die Anforderung gewartet.';\n case HttpStatusCode.Conflict:\n return 'Die Anforderung steht im Widerspruch zum aktuellen Zustand der Ressource.';\n case HttpStatusCode.Gone:\n return 'Die angeforderte Ressource ist nicht mehr verfügbar und wird auch nicht mehr verfügbar sein.';\n case HttpStatusCode.LengthRequired:\n return 'Die Anforderung hat die Länge ihres Inhalts nicht angegeben, die von der angeforderten Ressource benötigt wird.';\n case HttpStatusCode.PreconditionFailed:\n return 'Der Server erfüllt eine der Voraussetzungen nicht, die der Anforderer an die Anforderung gestellt hat.';\n case HttpStatusCode.PayloadTooLarge:\n return 'Die Anforderung ist größer als der Server bereit oder in der Lage ist, zu verarbeiten.';\n case HttpStatusCode.UriTooLong:\n return 'Die bereitgestellte URL war für den Server zu lang, um sie zu verarbeiten.';\n case HttpStatusCode.UnsupportedMediaType:\n return 'Die Anforderungseinheit hat einen Medientyp, den der Server oder die Ressource nicht unterstützt.';\n case HttpStatusCode.RangeNotSatisfiable:\n return 'Der Client hat einen Teil der Datei angefordert, aber der Server kann diesen Teil nicht liefern.';\n case HttpStatusCode.ExpectationFailed:\n return 'Der Server kann die Anforderungen des Erwartung-Anforderungskopffelds nicht erfüllen.';\n case HttpStatusCode.ImATeapot:\n return 'Ich bin eine Teekanne.';\n case HttpStatusCode.MisdirectedRequest:\n return 'Die Anforderung wurde an einen Server gerichtet, der nicht in der Lage ist, eine Antwort zu generieren.';\n case HttpStatusCode.UnprocessableEntity:\n return 'Die Anforderung war gut formuliert, konnte aber aufgrund semantischer Fehler nicht befolgt werden.';\n case HttpStatusCode.Locked:\n return 'Die Ressource, auf die zugegriffen wird, ist gesperrt.';\n case HttpStatusCode.FailedDependency:\n return 'Die Anforderung ist aufgrund eines Fehlers einer vorherigen Anforderung fehlgeschlagen.';\n case HttpStatusCode.TooEarly:\n return 'Der Server ist nicht bereit, die Anforderung zu verarbeiten, weil der Benutzer nicht authentifiziert wurde.';\n case HttpStatusCode.UpgradeRequired:\n return 'Der Client sollte zu einem anderen Protokoll wie TLS/1.0 wechseln, das im Upgrade-Anforderungskopffeld angegeben ist.';\n case HttpStatusCode.PreconditionRequired:\n return 'Der Ursprungsserver erfordert, dass die Anforderung bedingt ist.';\n case HttpStatusCode.TooManyRequests:\n return 'Sie haben in einer bestimmten Zeit zu viele Anfragen gesendet. Bitte versuchen Sie es später erneut.';\n case HttpStatusCode.RequestHeaderFieldsTooLarge:\n return 'Der Server ist nicht bereit, die Anforderung zu verarbeiten, weil seine Kopffelder zu groß sind.';\n case HttpStatusCode.UnavailableForLegalReasons:\n return 'Die Ressource ist aufgrund einer rechtlichen Forderung nicht verfügbar.';\n case HttpStatusCode.InternalServerError:\n return 'Etwas ist schief gelaufen. Bitte versuchen Sie es später erneut.';\n case HttpStatusCode.NotImplemented:\n return 'Der Server unterstützt die zur Erfüllung der Anforderung erforderliche Funktionalität nicht.';\n case HttpStatusCode.BadGateway:\n return 'Etwas ist schief gelaufen. Bitte versuchen Sie es später erneut.';\n case HttpStatusCode.ServiceUnavailable:\n return 'Der Server kann die Anforderung derzeit nicht bearbeiten, da er vorübergehend überlastet oder gewartet wird.';\n case HttpStatusCode.GatewayTimeout:\n return 'Der Server hat beim Versuch, die Anforderung abzuschließen, keine rechtzeitige Antwort vom Server erhalten.';\n case HttpStatusCode.HttpVersionNotSupported:\n return 'Der Server unterstützt die in der Anforderung verwendete HTTP-Protokollversion nicht.';\n case HttpStatusCode.VariantAlsoNegotiates:\n return 'Der Server hat einen internen Konfigurationsfehler: Die ausgewählte Variantenressource ist so konfiguriert, dass sie sich selbst in die transparente Inhaltsverhandlung einbindet, und ist daher kein geeigneter Endpunkt im Verhandlungsprozess.';\n case HttpStatusCode.InsufficientStorage:\n return 'Die Methode konnte auf die Ressource nicht angewendet werden, weil der Server nicht in der Lage ist, die für die erfolgreiche Ausführung der Anforderung erforderliche Darstellung zu speichern.';\n case HttpStatusCode.LoopDetected:\n return 'Der Server hat eine Endlosschleife erkannt, während er die Anforderung verarbeitet.';\n case HttpStatusCode.NotExtended:\n return 'Weitere Erweiterungen der Anforderung sind erforderlich, damit der Server sie erfüllen kann.';\n case HttpStatusCode.NetworkAuthenticationRequired:\n return 'Sie müssen sich authentifizieren, um Zugang zum Netzwerk zu erhalten.';\n default:\n return 'Etwas ist schief gelaufen. Überprüfen Sie Ihre Internetverbindung und versuchen Sie es später erneut.';\n }\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToTitleDe } from './parse-http-error-code-de';\n\n@Pipe({\n name: 'parseHttpErrorCodeToTitleDe',\n})\nexport class ParseHttpErrorCodeToTitleDePipe implements PipeTransform {\n transform = parseHttpErrorCodeToTitleDe;\n}\n\n@Pipe({\n name: 'parseHttpErrorCodeToMessageDe',\n})\nexport class ParseHttpErrorCodeToMessageDePipe implements PipeTransform {\n transform = parseHttpErrorCodeToMessageDe;\n}\n","import { HttpStatusCode } from '@angular/common/http';\n\nexport const parseHttpErrorCodeToTitleEn = (statusCode: HttpStatusCode) => {\n switch (statusCode) {\n case HttpStatusCode.BadRequest:\n return 'Bad request';\n case HttpStatusCode.Unauthorized:\n return 'Unauthorized';\n case HttpStatusCode.PaymentRequired:\n return 'Payment required';\n case HttpStatusCode.Forbidden:\n return 'Forbidden';\n case HttpStatusCode.NotFound:\n return 'Not found';\n case HttpStatusCode.MethodNotAllowed:\n return 'Method not allowed';\n case HttpStatusCode.NotAcceptable:\n return 'Not acceptable';\n case HttpStatusCode.ProxyAuthenticationRequired:\n return 'Proxy authentication required';\n case HttpStatusCode.RequestTimeout:\n return 'Request timeout';\n case HttpStatusCode.Conflict:\n return 'Conflict';\n case HttpStatusCode.Gone:\n return 'Gone';\n case HttpStatusCode.LengthRequired:\n return 'Length required';\n case HttpStatusCode.PreconditionFailed:\n return 'Precondition failed';\n case HttpStatusCode.PayloadTooLarge:\n return 'Payload too large';\n case HttpStatusCode.UriTooLong:\n return 'URI too long';\n case HttpStatusCode.UnsupportedMediaType:\n return 'Unsupported media type';\n case HttpStatusCode.RangeNotSatisfiable:\n return 'Range not satisfiable';\n case HttpStatusCode.ExpectationFailed:\n return 'Expectation failed';\n case HttpStatusCode.ImATeapot:\n return 'I am a teapot';\n case HttpStatusCode.MisdirectedRequest:\n return 'Misdirected request';\n case HttpStatusCode.UnprocessableEntity:\n return 'Unprocessable entity';\n case HttpStatusCode.Locked:\n return 'Locked';\n case HttpStatusCode.FailedDependency:\n return 'Failed dependency';\n case HttpStatusCode.TooEarly:\n return 'Too early';\n case HttpStatusCode.UpgradeRequired:\n return 'Upgrade required';\n case HttpStatusCode.PreconditionRequired:\n return 'Precondition required';\n case HttpStatusCode.TooManyRequests:\n return 'Too many requests';\n case HttpStatusCode.RequestHeaderFieldsTooLarge:\n return 'Request header fields too large';\n case HttpStatusCode.UnavailableForLegalReasons:\n return 'Unavailable for legal reasons';\n case HttpStatusCode.InternalServerError:\n return 'Internal server error';\n case HttpStatusCode.NotImplemented:\n return 'Not implemented';\n case HttpStatusCode.BadGateway:\n return 'Bad gateway';\n case HttpStatusCode.ServiceUnavailable:\n return 'Service unavailable';\n case HttpStatusCode.GatewayTimeout:\n return 'Gateway timeout';\n case HttpStatusCode.HttpVersionNotSupported:\n return 'HTTP version not supported';\n case HttpStatusCode.VariantAlsoNegotiates:\n return 'Variant also negotiates';\n case HttpStatusCode.InsufficientStorage:\n return 'Insufficient storage';\n case HttpStatusCode.LoopDetected:\n return 'Loop detected';\n case HttpStatusCode.NotExtended:\n return 'Not extended';\n case HttpStatusCode.NetworkAuthenticationRequired:\n return 'Network authentication required';\n default:\n return 'Something went wrong';\n }\n};\n\nexport const parseHttpErrorCodeToMessageEn = (statusCode: HttpStatusCode) => {\n switch (statusCode) {\n case HttpStatusCode.BadRequest:\n return 'Sorry, we could not process your request. Please try again later.';\n case HttpStatusCode.Unauthorized:\n return 'You are not authorized to perform this action. Please log in to continue.';\n case HttpStatusCode.PaymentRequired:\n return 'Payment is required to complete this action.';\n case HttpStatusCode.Forbidden:\n return 'You do not have permission to perform this action.';\n case HttpStatusCode.NotFound:\n return 'The requested resource was not found.';\n case HttpStatusCode.MethodNotAllowed:\n return 'The requested method is not allowed for this resource.';\n case HttpStatusCode.NotAcceptable:\n return 'The requested resource is not capable of generating a response matching the list of acceptable values.';\n case HttpStatusCode.ProxyAuthenticationRequired:\n return 'Proxy authentication is required to complete this action.';\n case HttpStatusCode.RequestTimeout:\n return 'The server timed out waiting for the request.';\n case HttpStatusCode.Conflict:\n return 'The request conflicts with the current state of the resource.';\n case HttpStatusCode.Gone:\n return 'The requested resource is no longer available and will not be available again.';\n case HttpStatusCode.LengthRequired:\n return 'The request did not specify the length of its content, which is required by the requested resource.';\n case HttpStatusCode.PreconditionFailed:\n return 'The server does not meet one of the preconditions that the requester put on the request.';\n case HttpStatusCode.PayloadTooLarge:\n return 'The request is larger than the server is willing or able to process.';\n case HttpStatusCode.UriTooLong:\n return 'The URL provided was too long for the server to process.';\n case HttpStatusCode.UnsupportedMediaType:\n return 'The request entity has a media type which the server or resource does not support.';\n case HttpStatusCode.RangeNotSatisfiable:\n return 'The client has asked for a portion of the file, but the server cannot supply that portion.';\n case HttpStatusCode.ExpectationFailed:\n return 'The server cannot meet the requirements of the Expect request-header field.';\n case HttpStatusCode.ImATeapot:\n return 'I am a teapot.';\n case HttpStatusCode.MisdirectedRequest:\n return 'The request was directed at a server that is not able to produce a response.';\n case HttpStatusCode.UnprocessableEntity:\n return 'The request was well-formed but was unable to be followed due to semantic errors.';\n case HttpStatusCode.Locked:\n return 'The resource that is being accessed is locked.';\n case HttpStatusCode.FailedDependency:\n return 'The request failed due to failure of a previous request.';\n case HttpStatusCode.TooEarly:\n return 'The server is unwilling to process the request because the user has not been authenticated.';\n case HttpStatusCode.UpgradeRequired:\n return 'The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.';\n case HttpStatusCode.PreconditionRequired:\n return 'The origin server requires the request to be conditional.';\n case HttpStatusCode.TooManyRequests:\n return 'You have sent too many requests in a given amount of time. Please try again later.';\n case HttpStatusCode.RequestHeaderFieldsTooLarge:\n return 'The server is unwilling to process the request because its header fields are too large.';\n case HttpStatusCode.UnavailableForLegalReasons:\n return 'The resource is unavailable due to a legal demand.';\n case HttpStatusCode.InternalServerError:\n return 'Something went wrong on our end. Please try again later.';\n case HttpStatusCode.NotImplemented:\n return 'The server does not support the functionality required to fulfill the request.';\n case HttpStatusCode.BadGateway:\n return 'Something went wrong on our end. Please try again later.';\n case HttpStatusCode.ServiceUnavailable:\n return 'The server is currently unable to handle the request due to a temporary overload or maintenance of the server.';\n case HttpStatusCode.GatewayTimeout:\n return 'The server, while acting as a gateway or proxy, did not receive a timely response from the upstream server specified by the URL or some other auxiliary server it needed to access in attempting to complete the request.';\n case HttpStatusCode.HttpVersionNotSupported:\n return 'The server does not support the HTTP protocol version used in the request.';\n case HttpStatusCode.VariantAlsoNegotiates:\n return 'The server has an internal configuration error: the chosen variant resource is configured to engage in transparent content negotiation itself, and is therefore not a proper end point in the negotiation process.';\n case HttpStatusCode.InsufficientStorage:\n return 'The method could not be performed on the resource because the server is unable to store the representation needed to successfully complete the request.';\n case HttpStatusCode.LoopDetected:\n return 'The server detected an infinite loop while processing the request.';\n case HttpStatusCode.NotExtended:\n return 'Further extensions to the request are required for the server to fulfill it.';\n case HttpStatusCode.NetworkAuthenticationRequired:\n return 'You need to authenticate to gain network access.';\n default:\n return 'Something went wrong. Check your internet connection and try again later.';\n }\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleEn } from './parse-http-error-code-en';\n\n@Pipe({\n name: 'parseHttpErrorCodeToTitleEn',\n})\nexport class ParseHttpErrorCodeToTitleEnPipe implements PipeTransform {\n transform = parseHttpErrorCodeToTitleEn;\n}\n\n@Pipe({\n name: 'parseHttpErrorCodeToMessageEn',\n})\nexport class ParseHttpErrorCodeToMessageEnPipe implements PipeTransform {\n transform = parseHttpErrorCodeToMessageEn;\n}\n","export const transformToString = (value: unknown) => {\n if (typeof value === 'string') {\n return value;\n }\n\n return null;\n};\n\nexport const transformToStringArray = (value: unknown) => {\n if (Array.isArray(value)) {\n return value.map(transformToString).filter(Boolean) as string[];\n } else if (typeof value === 'string') {\n return [transformToString(value)] as string[];\n }\n\n return null;\n};\n\nexport const transformToNumber = (value: unknown) => {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n return Number(value);\n }\n return null;\n};\n\nexport const transformToNumberArray = (value: unknown) => {\n if (Array.isArray(value)) {\n return value.map(transformToNumber).filter((item) => item !== null) as number[];\n } else if (typeof value === 'number') {\n return [value] as number[];\n }\n\n return null;\n};\n\nexport const transformToBoolean = (value: unknown) => {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n return value === 'true' || value === '1';\n }\n return null;\n};\n\nexport const transformToBooleanArray = (value: unknown) => {\n if (Array.isArray(value)) {\n return value.map(transformToBoolean).filter((item) => item !== null) as boolean[];\n } else if (typeof value === 'string' || typeof value === 'boolean') {\n return [transformToBoolean(value)] as boolean[];\n }\n\n return null;\n};\n\nexport const transformToDate = (value: unknown) => {\n if (value instanceof Date) {\n return value;\n }\n if (typeof value === 'string') {\n const date = new Date(value);\n\n if (isNaN(date.getTime())) {\n return null;\n }\n\n return date;\n }\n return null;\n};\n\nexport const transformToDateArray = (value: unknown) => {\n if (Array.isArray(value)) {\n return value.map(transformToDate).filter((item) => item !== null) as Date[];\n } else if (typeof value === 'string' || value instanceof Date) {\n return [transformToDate(value)] as Date[];\n }\n\n return null;\n};\n\nexport type SortDirection = 'asc' | 'desc' | '';\n\nexport type Sort = {\n active: string;\n direction: SortDirection;\n};\n\nexport const transformToSort = (value: unknown): Sort | null => {\n if (typeof value === 'string') {\n const [active, direction] = value.split(':');\n\n if (!active) {\n return null;\n }\n\n return {\n active,\n direction: direction as 'asc' | 'desc',\n };\n }\n\n return null;\n};\n\nexport const transformToSortQueryParam = (value: unknown) => {\n if (typeof value === 'string') {\n return value;\n }\n if (value && typeof value === 'object' && 'active' in value && 'direction' in value) {\n const valAsSort = value as {\n active: string;\n direction: 'asc' | 'desc';\n };\n\n return valAsSort.direction ? `${valAsSort.active}:${valAsSort.direction}` : null;\n }\n\n return null;\n};\n","import { DestroyRef, NgZone, assertInInjectionContext, inject, isDevMode } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n ET_PROPERTY_REMOVED,\n clone,\n createDestroy,\n equal,\n injectQueryParamChanges,\n injectQueryParams,\n} from '@ethlete/core';\nimport { BehaviorSubject, Subject, debounceTime, map, merge, of, switchMap, takeUntil, tap, timer } from 'rxjs';\nimport {\n OptionalQueryFieldOptions,\n QueryFieldOptions,\n QueryFormGroup,\n QueryFormGroupControls,\n QueryFormObserveOptions,\n QueryFormValue,\n QueryFormValueEvent,\n QueryFormWriteOptions,\n} from './query-form.types';\nimport {\n Sort,\n transformToBoolean,\n transformToBooleanArray,\n transformToDate,\n transformToDateArray,\n transformToNumber,\n transformToNumberArray,\n transformToSort,\n transformToSortQueryParam,\n transformToStringArray,\n} from './query-form.utils';\n\nconst ET_ARR_PREFIX = 'ET_ARR__';\nconst ET_OBJ_PREFIX = 'ET_OBJ__';\nconst ET_PROP_NULL_VALUE = 'ET_NULL__';\n\nexport class QueryField<T> {\n get control() {\n return this.data.control;\n }\n\n constructor(public data: QueryFieldOptions<T>) {}\n}\n\nexport class SearchQueryField {\n get control() {\n return this.data.control;\n }\n\n data: QueryFieldOptions<string | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<string | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<string | null>(null),\n debounce: 300,\n disableDebounceIfFalsy: true,\n ...(_data ?? {}),\n };\n }\n}\n\nexport class SortQueryField {\n get control() {\n return this.data.control;\n }\n\n data: QueryFieldOptions<Sort | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<Sort | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<Sort | null>(null),\n queryParamToValueTransformFn: transformToSort,\n valueToQueryParamTransformFn: transformToSortQueryParam,\n ...(_data ?? {}),\n };\n }\n}\n\nexport class StringArrayQueryField<T extends string[]> {\n get control() {\n return this.data.control;\n }\n\n data: QueryFieldOptions<T | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<T | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<T | null>(null),\n queryParamToValueTransformFn: transformToStringArray as (val: unknown) => T | null,\n ...(_data ?? {}),\n };\n }\n}\n\nexport class BooleanArrayQueryField {\n get control() {\n return this.data.control;\n }\n\n data: QueryFieldOptions<boolean[] | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<boolean[] | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<boolean[] | null>(null),\n queryParamToValueTransformFn: transformToBooleanArray,\n ...(_data ?? {}),\n };\n }\n}\n\nexport class NumberArrayQueryField {\n get control() {\n return this.data.control;\n }\n\n data: QueryFieldOptions<number[] | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<number[] | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<number[] | null>(null),\n queryParamToValueTransformFn: transformToNumberArray,\n ...(_data ?? {}),\n };\n }\n}\n\nexport class DateQueryField {\n get control() {\n return this.data.control;\n }\n\n data: QueryFieldOptions<Date | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<Date | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<Date | null>(null),\n queryParamToValueTransformFn: transformToDate,\n ...(_data ?? {}),\n };\n }\n}\n\nexport class DateArrayQueryField {\n get control() {\n return this.data.control;\n }\n\n data: QueryFieldOptions<Date[] | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<Date[] | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<Date[] | null>(null),\n queryParamToValueTransformFn: transformToDateArray,\n ...(_data ?? {}),\n };\n }\n}\n\nconst IGNORED_FILTER_COUNT_FIELDS = ['page', 'skip', 'take', 'limit', 'sort', 'sortBy', 'sortOrder', 'query', 'search'];\n\nexport type QueryFormOptions = {\n /**\n * A prefix to use for the query parameters. This is useful when you have multiple query forms on the same page.\n */\n queryParamPrefix?: string | (() => string);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyQueryForm = QueryForm<any>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class QueryForm<T extends Record<string, QueryField<any>>> {\n private readonly _destroy$ = createDestroy();\n private readonly _unobserveTrigger$ = new Subject<boolean>();\n private readonly _router = inject(Router);\n private readonly _activatedRoute = inject(ActivatedRoute);\n private readonly _defaultValues = this._extractDefaultValues();\n private readonly _zone = inject(NgZone);\n private readonly _didValueChanges$ = new Subject<boolean>();\n\n private _isObserving = false;\n private _skipNextResets = false;\n\n private _queryParamChanges$ = toObservable(injectQueryParamChanges());\n private _queryParams = injectQueryParams();\n\n /**\n * The angular form group that contains all the fields.\n *\n * **Do not** use any of the following methods on this form group:\n * - `setValue`: Use `QueryForm.setValue` instead.\n * - `patchValue`: Use `QueryForm.patchValue` instead.\n * - `valueChanges`: Use `QueryForm.changes$` instead.\n * - `value`: Use `QueryForm.value` instead.\n * - `controls`: Use `QueryForm.controls` instead.\n */\n readonly form = this._setupFormGroup();\n\n private readonly _lastFormValue$ = new BehaviorSubject<QueryFormValue<T> | null>(null);\n private readonly _currentFormValue$ = new BehaviorSubject<QueryFormValue<T>>(this._formValue);\n\n private get _formValue() {\n return this.form.getRawValue() as QueryFormValue<T>;\n }\n\n private get _form() {\n return this.form as unknown as QueryFormGroup;\n }\n\n private readonly _changes$ = new BehaviorSubject<QueryFormValueEvent<T>>({\n previousValue: null,\n currentValue: this.form.getRawValue() as QueryFormValue<T>,\n });\n\n readonly changes$ = this._changes$.asObservable();\n readonly currentValue$ = this._changes$.pipe(map(({ currentValue }) => currentValue));\n readonly previousValue$ = this._changes$.pipe(map(({ previousValue }) => previousValue));\n\n readonly changes = toSignal(this.changes$);\n readonly currentValue = toSignal(this.currentValue$);\n readonly previousValue = toSignal(this.previousValue$);\n\n /**\n * The number of active filters.\n *\n * Excludes the following fields by default:\n * - `page`\n * - `skip`\n * - `take`\n * - `limit`\n * - `sort`\n * - `sortBy`\n * - `sortOrder`\n * - `query`\n * - `search`\n */\n readonly activeFilterCount$ = this.changes$.pipe(\n map(\n ({ currentValue }) =>\n Object.entries(currentValue)\n .map(([key, value]) => {\n if (IGNORED_FILTER_COUNT_FIELDS.includes(key) || this._fields[key]?.data.skipInFilterCount) {\n return true;\n }\n\n return this._isDefaultValue(key, value);\n })\n .filter((v) => v === false).length,\n ),\n );\n\n get controls() {\n return this.form.controls;\n }\n\n get value() {\n return this._changes$.value.currentValue;\n }\n\n get defaultFormValue() {\n return Object.entries(this._defaultValues).reduce((acc, [key]) => {\n acc[key as keyof QueryFormValue<T>] = this._getDefaultValue(key);\n\n return acc;\n }, {} as QueryFormValue<T>);\n }\n\n // with prefix eg. page should become ${prefix}-page\n constructor(\n private _fields: T,\n private _options?: QueryFormOptions,\n ) {\n assertInInjectionContext(QueryForm);\n\n inject(DestroyRef).onDestroy(() => this._cleanup());\n }\n\n observe(options?: QueryFormObserveOptions) {\n if (this._isObserving) {\n if (isDevMode()) {\n console.warn('QueryForm.observe() was called multiple times. This is not supported.');\n }\n return this;\n }\n\n this._isObserving = true;\n\n if (options?.syncOnNavigation !== false) {\n const didChanges = this.setFormValueFromUrlQueryParams({\n queryParams: this._queryParams(),\n });\n\n if (didChanges) {\n this._handleFormChange(true);\n }\n }\n\n merge(...Object.values(this._fields).map((field) => field.control.valueChanges), this._didValueChanges$)\n .pipe(\n debounceTime(0),\n tap(() => {\n this._handleFormChange();\n }),\n takeUntil(this._destroy$),\n takeUntil(this._unobserveTrigger$),\n )\n .subscribe();\n\n let changedFieldsInLastResetLoop: string[] = [];\n let currentUniqueChangedFields: string[] = [];\n\n this._currentFormValue$\n .pipe(\n map((currentValue) => {\n return {\n previousValue: clone(this._lastFormValue$.value),\n currentValue: clone(currentValue),\n };\n }),\n tap(({ currentValue, previousValue }) => {\n if (options?.writeToQueryParams !== false) {\n this._syncViaUrlQueryParams(currentValue, options?.replaceUrl);\n }\n\n const didResetValues = this._skipNextResets\n ? false\n : this._handleQueryFormResets(previousValue ?? null, currentValue);\n\n this._skipNextResets = false;\n\n const changedFields = Object.keys(currentValue).filter(\n (key) => !equal(previousValue?.[key], currentValue[key]),\n );\n\n if (changedFieldsInLastResetLoop.length) {\n changedFields.push(...changedFieldsInLastResetLoop);\n changedFieldsInLastResetLoop = [];\n }\n\n if (didResetValues) {\n this._didValueChanges$.next(true);\n changedFieldsInLastResetLoop = changedFields;\n }\n\n currentUniqueChangedFields = [...new Set(changedFields)];\n }),\n switchMap(({ currentValue, previousValue }) => {\n if (changedFieldsInLastResetLoop.length) return of(null).pipe(map(() => ({ currentValue, previousValue })));\n\n const debounceValues = currentUniqueChangedFields.map((key) => {\n const field = this._fields[key];\n\n if (!field) return null;\n\n if (field.data.disableDebounceIfFalsy === true && !currentValue[key]) {\n return null;\n }\n\n return field.data.debounce ?? null;\n });\n\n currentUniqueChangedFields = [];\n\n if (debounceValues.some((v) => v === null) || !debounceValues.length) {\n return of(null).pipe(map(() => ({ currentValue, previousValue })));\n }\n\n const shortestDebounceTime = Math.min(...debounceValues.filter((v): v is number => v !== null));\n\n return timer(shortestDebounceTime).pipe(map(() => ({ currentValue, previousValue })));\n }),\n tap(({ currentValue, previousValue }) => {\n if (changedFieldsInLastResetLoop.length) return;\n\n this._changes$.next({\n previousValue: previousValue ?? null,\n currentValue: currentValue,\n });\n }),\n takeUntil(this._destroy$),\n takeUntil(this._unobserveTrigger$),\n )\n .subscribe();\n\n if (options?.syncOnNavigation !== false) {\n this._queryParamChanges$\n .pipe(\n takeUntil(this._destroy$),\n takeUntil(this._unobserveTrigger$),\n tap((changes) => {\n const didValueChanges = this.setFormValueFromUrlQueryParams({ queryParams: changes });\n\n if (didValueChanges) {\n this._didValueChanges$.next(true);\n }\n }),\n )\n .subscribe();\n }\n\n return this;\n }\n\n private _handleQueryFormResets(previousValue: QueryFormValue<T> | null, currentValue: QueryFormValue<T>) {\n let didResetValues = false;\n\n for (const formFieldKey in this._fields) {\n const field = this._fields[formFieldKey];\n\n if (!field) continue;\n\n const resets = field.data.isResetBy;\n\n if (!resets) continue;\n\n const resetConditionKeys = Array.isArray(resets) ? resets : [resets];\n\n for (const resetConditionKey of resetConditionKeys) {\n if (!(resetConditionKey in this._fields)) {\n if (isDevMode()) {\n console.warn(`The field \"${resetConditionKey}\" is not defined in the QueryForm. Is it a typo?`, this);\n }\n\n continue;\n }\n\n if (\n previousValue &&\n currentValue &&\n !equal(previousValue[resetConditionKey], currentValue[resetConditionKey])\n ) {\n const defaultValueForKeyToReset = this._getDefaultValue(formFieldKey);\n const currentValueForKeyToReset = currentValue[formFieldKey];\n\n if (equal(defaultValueForKeyToReset, currentValueForKeyToReset)) {\n continue;\n }\n\n this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);\n\n didResetValues = true;\n\n break;\n }\n }\n }\n\n return didResetValues;\n }\n\n unobserve() {\n this._unobserveTrigger$.next(true);\n this._cleanup();\n }\n\n setFormValueFromUrlQueryParams(options: { queryParams: Record<string, unknown> }) {\n let didValueChanges = false;\n\n for (const [key, field] of Object.entries(this._fields)) {\n const value = options.queryParams[this._transformKeyToQueryParam(key)];\n\n const valueDoesNotExist = value === undefined;\n\n if (valueDoesNotExist) continue;\n\n const valueGotRemoved = value === ET_PROPERTY_REMOVED;\n\n if (valueGotRemoved) {\n const defaultValue = this._getDefaultValue(key);\n if (!equal(field.control.value, defaultValue)) {\n field.control.setValue(defaultValue, { emitEvent: false });\n didValueChanges = true;\n }\n\n continue;\n }\n let deserializedValue = value;\n\n if (field.data.queryParamToValueTransformFn) {\n deserializedValue = field.data.queryParamToValueTransformFn(value);\n } else if (!field.data.skipAutoTransform) {\n const defaultIsNum = typeof this._getDefaultValue(key) === 'number';\n const valueIsNum = !isNaN(Number(value));\n const valueContainsWhitespace = typeof value === 'string' && value.trim() !== value;\n const valueHasLeadingZero = typeof value === 'string' && value.startsWith('0');\n const valueEndsWithDot = typeof value === 'string' && value.endsWith('.');\n\n const defaultIsBool = this._getDefaultValue(key) === 'boolean';\n const valueIsBool = value === 'true' || value === 'false';\n\n if (value === ET_PROP_NULL_VALUE) {\n deserializedValue = null;\n } else if (\n defaultIsNum ||\n (valueIsNum && !valueContainsWhitespace && !valueHasLeadingZero && !valueEndsWithDot)\n ) {\n deserializedValue = transformToNumber(value);\n } else if (defaultIsBool || valueIsBool) {\n deserializedValue = transformToBoolean(value);\n }\n }\n\n const valueIsEqualToCurrent = equal(deserializedValue, field.control.value);\n\n if (valueIsEqualToCurrent) continue;\n\n field.control.setValue(deserializedValue, { emitEvent: false });\n didValueChanges = true;\n }\n\n return didValueChanges;\n }\n\n setValue(value: QueryFormValue<T>, options?: QueryFormWriteOptions) {\n this._form._setValue(value, options);\n\n if (options?.skipResets) {\n this._skipNextResets = true;\n }\n }\n\n patchValue(value: Partial<QueryFormValue<T>>, options?: QueryFormWriteOptions) {\n this._form._patchValue(value, options);\n\n if (options?.skipResets) {\n this._skipNextResets = true;\n }\n }\n\n resetFieldToDefault(key: keyof QueryFormValue<T>, options?: QueryFormWriteOptions) {\n const defaultValue = this._getDefaultValue(key as string);\n\n this.form.controls[key].setValue(defaultValue);\n\n if (options?.skipResets) {\n this._skipNextResets = true;\n }\n }\n\n resetFieldsToDefault(keys: (keyof QueryFormValue<T>)[], options?: QueryFormWriteOptions) {\n const defaults = keys.reduce(\n (acc, key) => {\n acc[key] = this._getDefaultValue(key as string);\n\n return acc;\n },\n {} as Partial<QueryFormValue<T>>,\n );\n\n this.patchValue(defaults);\n\n if (options?.skipResets) {\n this._skipNextResets = true;\n }\n }\n\n resetAllFieldsToDefault(options?: QueryFormWriteOptions & { skipFields?: (keyof QueryFormValue<T>)[] }) {\n const keys = Object.keys(this._fields) as (keyof QueryFormValue<T>)[];\n\n if (options?.skipFields) {\n for (const key of options.skipFields) {\n const index = keys.indexOf(key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n }\n }\n }\n\n this.resetFieldsToDefault(keys, options);\n }\n\n private _getDefaultValue(key: string) {\n const val = this._defaultValues[key];\n\n if (typeof val === 'string' && val.startsWith(ET_ARR_PREFIX)) {\n return JSON.parse(val.slice(ET_ARR_PREFIX.length));\n } else if (typeof val === 'string' && val.startsWith(ET_OBJ_PREFIX)) {\n return JSON.parse(val.slice(ET_OBJ_PREFIX.length));\n } else if (typeof val === 'function') {\n return val();\n } else if (val === ET_PROP_NULL_VALUE) {\n return null;\n }\n\n return val ?? null;\n }\n\n private _transformKeyToQueryParam(key: string) {\n if (!this._options?.queryParamPrefix) return key;\n\n const prefix =\n typeof this._options?.queryParamPrefix === 'string'\n ? this._options.queryParamPrefix\n : this._options.queryParamPrefix();\n\n return `${prefix}-${key}`;\n }\n\n private _isDefaultValue(key: string, value: unknown) {\n const normalizedValue = Array.isArray(value)\n ? `${ET_ARR_PREFIX}${JSON.stringify(value)}`\n : typeof value === 'object' && value !== null\n ? `${ET_OBJ_PREFIX}${JSON.stringify(value)}`\n : value === null\n ? ET_PROP_NULL_VALUE\n : value;\n\n return this._defaultValues[key] === normalizedValue;\n }\n\n private _setupFormGroup() {\n const group = new FormGroup({} as QueryFormGroupControls<T>) as unknown as QueryFormGroup;\n\n for (const [key, field] of Object.entries(this._fields)) {\n group.addControl(key, field.control);\n }\n\n group._patchValue = group.patchValue;\n group._setValue = group.setValue;\n\n group.patchValue = this.patchValue.bind(this);\n group.setValue = this.setValue.bind(this);\n\n return group as unknown as FormGroup<QueryFormGroupControls<T>>;\n }\n\n private _extractDefaultValues() {\n const defaultValues: Record<string, unknown> = {};\n\n for (const [key, field] of Object.entries(this._fields)) {\n const value = field.data.defaultValue !== undefined ? field.data.defaultValue : field.control.value;\n\n if (Array.isArray(value)) {\n defaultValues[key] = `${ET_ARR_PREFIX}${JSON.stringify(value)}`;\n } else if (typeof value === 'object' && value !== null) {\n defaultValues[key] = `${ET_OBJ_PREFIX}${JSON.stringify(value)}`;\n } else if (value === null) {\n defaultValues[key] = ET_PROP_NULL_VALUE;\n } else {\n defaultValues[key] = value;\n }\n }\n\n return defaultValues;\n }\n\n private _syncViaUrlQueryParams(values: QueryFormValue<T>, replaceUrl?: boolean) {\n const queryParams = { ...clone(this._activatedRoute.snapshot.queryParams) };\n\n for (const [key, value] of Object.entries(values)) {\n const queryParamKey = this._transformKeyToQueryParam(key);\n const field = this._fields[key];\n\n if (!field) {\n continue;\n }\n\n const isDefault = this._isDefaultValue(key, value);\n const writeDefaultToUrl = field.data.appendDefaultValueToUrl === true;\n const writeToUrl = field.data.appendToUrl !== false;\n\n if (!writeToUrl || (isDefault && !writeDefaultToUrl)) {\n queryParams[queryParamKey] = undefined;\n } else {\n queryParams[queryParamKey] = field.data.valueToQueryParamTransformFn\n ? field.data.valueToQueryParamTransformFn?.(value)\n : value === null\n ? ET_PROP_NULL_VALUE\n : value;\n }\n }\n\n this._zone.run(() => {\n queueMicrotask(() => {\n this._router.navigate([], {\n queryParams,\n replaceUrl,\n queryParamsHandling: 'merge',\n });\n });\n });\n }\n\n private _handleFormChange(forceOverwrite = false) {\n // Normalize values that have a valueToQueryParamTransformFn returning null/undefined to their\n // field default before capturing the new value. This prevents intermediate \"empty object\" states\n // (e.g. Sort emitting { active: '', direction: '' } when cleared) from being\n // emitted as distinct form values.\n for (const [key, field] of Object.entries(this._fields)) {\n if (!field.data.valueToQueryParamTransformFn) continue;\n const rawValue = (this._formValue as Record<string, unknown>)[key];\n if (this._isDefaultValue(key, rawValue)) continue;\n const serialized = field.data.valueToQueryParamTransformFn(rawValue);\n if (serialized !== null && serialized !== undefined) continue;\n this.form.controls[key]?.setValue(this._getDefaultValue(key), { emitEvent: false });\n }\n\n const currentVal = clone(this._currentFormValue$.value);\n const newVal = clone(this._formValue);\n\n if (equal(currentVal, newVal)) {\n return;\n }\n\n if (forceOverwrite) {\n this._lastFormValue$.next(newVal);\n } else {\n this._lastFormValue$.next(currentVal);\n }\n\n this._currentFormValue$.next(newVal);\n }\n\n private _cleanup() {\n if (!this._isObserving) return;\n\n this._isObserving = false;\n\n const queryParamKeys = Object.keys(this._fields);\n const queryParams = queryParamKeys.reduce(\n (acc, key) => {\n acc[this._transformKeyToQueryParam(key)] = undefined;\n return acc;\n },\n {} as Record<string, unknown>,\n );\n this._zone.run(() => {\n queueMicrotask(() => {\n this._router.navigate([], {\n queryParams,\n replaceUrl: true,\n queryParamsHandling: 'merge',\n });\n });\n });\n }\n}\n","import { RuntimeError } from '@ethlete/core';\n\n// codes 1000-1999\nexport const WebSocketRuntimeErrorCode = {\n // Web Socket Client\n ROOM_NOT_JOINED: 1000,\n MESSAGE_MALFORMED: 1001,\n} as const;\n\nexport type WebSocketRuntimeErrorCode = (typeof WebSocketRuntimeErrorCode)[keyof typeof WebSocketRuntimeErrorCode];\n\nexport const roomNotJoined = (room: string) => {\n return new RuntimeError(\n WebSocketRuntimeErrorCode.ROOM_NOT_JOINED,\n `Tried leaving the room \"${room}\" but it has not been joined.`,\n );\n};\n\nexport const messageMalformed = () => {\n return new RuntimeError(\n WebSocketRuntimeErrorCode.MESSAGE_MALFORMED,\n 'A message has been received but it is malformed (cannot be parsed as JSON).',\n );\n};\n","import {\n computed,\n DestroyRef,\n effect,\n inject,\n isDevMode,\n Signal,\n signal,\n untracked,\n WritableSignal,\n} from '@angular/core';\nimport { createRootProvider, previousSignalValue, ProviderResult } from '@ethlete/core';\nimport { io } from 'socket.io-client';\nimport { messageMalformed, roomNotJoined } from './web-socket-errors';\n\nexport type CreateWebSocketClientTransport = 'polling' | 'websocket' | 'webtransport';\n\nexport type CreateWebSocketClientConfigOptions = {\n /** A unique name for the client */\n name: string;\n\n /** The URL of the socket io server */\n url: string;\n\n /** A list of transports to try (in order). Engine.io always attempts to connect directly with the first one, provided the feature detection test for it passes. */\n transports?: CreateWebSocketClientTransport[];\n};\n\n/** A default socket io message view */\nexport type SocketMessageView<TMessageData = unknown> = {\n room: string;\n event: string;\n data: TMessageData;\n};\n\nexport type WebSocketClientSubtle = {\n /** Leave a socket io room */\n leaveRoom: (room: string) => void;\n};\n\nexport type WebSocketClient<TMessageData extends SocketMessageView> = {\n /**\n * Join a socket io room\n * If a function is passed, it will be evaluated in a reactive signal context.\n * If the function returns null, no room will be joined.\n * If the function returns a string, the previous room will be left and the new room will be joined.\n */\n joinRoom: (room: string | (() => string | null)) => Signal<WebSocketRoom<TMessageData> | null>;\n\n /** Whether the client is connected to the server */\n isConnected: Signal<boolean>;\n\n /** Advanced web socket features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */\n subtle: WebSocketClientSubtle;\n};\n\nexport type InternalWebSocketRoom<TMessageData extends SocketMessageView> = {\n latestMessage: WritableSignal<TMessageData | null>;\n};\n\nexport type WebSocketRoom<TMessageData extends SocketMessageView> = {\n /** The latest message received in the room */\n latestMessage: Signal<TMessageData | null>;\n};\n\nexport type WebSocketClientResult<TMessageData extends SocketMessageView = SocketMessageView> = ProviderResult<\n WebSocketClient<TMessageData>\n>;\n\nexport type AnyWebSocketClient<TMessageData extends SocketMessageView = SocketMessageView> =\n WebSocketClientResult<TMessageData>;\n\nexport const createWebSocketClient = <TMessageData extends SocketMessageView = SocketMessageView>(\n options: CreateWebSocketClientConfigOptions,\n): WebSocketClientResult<TMessageData> => {\n return createRootProvider(\n () => {\n const socket = io(options.url, {\n withCredentials: true,\n autoConnect: false,\n transports: options.transports,\n });\n\n const rooms = new Map<string, InternalWebSocketRoom<TMessageData>>();\n const isConnected = signal(false);\n\n const joinRoom = (room: string | (() => string | null)) => {\n const roomFn = typeof room === 'function' ? room : () => room;\n const pre = previousSignalValue(computed(() => roomFn()));\n const roomData = signal<InternalWebSocketRoom<TMessageData> | null>(null);\n\n const join = (name: string) => {\n socket.emit('join-room', name);\n\n const existingRoom = rooms.get(name);\n\n if (existingRoom) return existingRoom;\n\n const message = signal<TMessageData | null>(null);\n\n const newRoom: InternalWebSocketRoom<TMessageData> = {\n latestMessage: message,\n };\n\n rooms.set(name, newRoom);\n\n return newRoom;\n };\n\n effect(() => {\n const current = roomFn();\n\n untracked(() => {\n const previous = pre();\n\n if (previous === current) return;\n\n if (previous) leaveRoom(previous);\n\n if (current) {\n const joinedRoom = join(current);\n if (joinedRoom) roomData.set(joinedRoom);\n } else {\n roomData.set(null);\n }\n });\n });\n\n inject(DestroyRef).onDestroy(() => {\n const current = roomFn();\n\n if (current) {\n leaveRoom(current);\n roomData.set(null);\n }\n });\n\n return roomData.asReadonly() as Signal<WebSocketRoom<TMessageData> | null>;\n };\n\n const leaveRoom = (room: string) => {\n if (!rooms.has(room)) {\n if (isDevMode()) throw roomNotJoined(room);\n }\n\n socket.emit('leave-room', room);\n\n rooms.delete(room);\n };\n\n const setupWebSocketConnectionListener = () => {\n socket.on('connect', () => {\n isConnected.set(true);\n\n for (const room of rooms.keys()) {\n socket.emit('join-room', room);\n }\n });\n socket.on('disconnect', () => isConnected.set(false));\n };\n\n const setupWebSocketListener = () => {\n socket.onAny((data: string) => {\n try {\n const json = JSON.parse(data) as TMessageData;\n\n const room = rooms.get(json.room);\n\n if (room) room.latestMessage.set(json);\n } catch (error) {\n console.error(error);\n if (isDevMode()) throw messageMalformed();\n }\n });\n };\n\n inject(DestroyRef).onDestroy(() => socket.disconnect());\n\n setupWebSocketConnectionListener();\n setupWebSocketListener();\n socket.connect();\n\n const client: WebSocketClient<TMessageData> = {\n joinRoom,\n isConnected: isConnected.asReadonly(),\n subtle: {\n leaveRoom,\n },\n };\n\n return client;\n },\n {\n name: `WebSocketClient_${options.name}`,\n },\n );\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["ɵEffectScheduler","isNaN","coreDeleteCookie"],"mappings":"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"}
1
+ {"version":3,"file":"ethlete-query.mjs","sources":["../../../../libs/query/src/lib/auth/auth-guard.ts","../../../../libs/query/src/lib/devtools/query-devtools-features.ts","../../../../libs/query/src/lib/devtools/query-devtools-hook.ts","../../../../libs/query/src/lib/http/internal/gql-options-guard.ts","../../../../libs/query/src/lib/http/observable-signal.ts","../../../../libs/query/src/lib/http/query-context.ts","../../../../libs/query/src/lib/http/query-dependencies.ts","../../../../libs/query/src/lib/http/query-errors.ts","../../../../libs/query/src/lib/http/query-error-response-utils.ts","../../../../libs/query/src/lib/http/query-features.ts","../../../../libs/query/src/lib/http/query-state.ts","../../../../libs/query/src/lib/http/query-snapshot.ts","../../../../libs/query/src/lib/http/base-query-factory.ts","../../../../libs/query/src/lib/http/query-execute-utils.ts","../../../../libs/query/src/lib/http/query-execute.ts","../../../../libs/query/src/lib/http/query.ts","../../../../libs/query/src/lib/http/query-creator.ts","../../../../libs/query/src/lib/http/base-query-creator-factory.ts","../../../../libs/query/src/lib/http/internal/request-route.ts","../../../../libs/query/src/lib/http/query-cache-utils.ts","../../../../libs/query/src/lib/http/query-error-parsing.ts","../../../../libs/query/src/lib/http/query-error-response.ts","../../../../libs/query/src/lib/http/http-request.ts","../../../../libs/query/src/lib/http/query-stack.ts","../../../../libs/query/src/lib/http/paged-query-stack.ts","../../../../libs/query/src/lib/http/persistence/persisted-query-entry.ts","../../../../libs/query/src/lib/http/persistence/query-persistence-adapter.ts","../../../../libs/query/src/lib/http/persistence/query-persistence-config.ts","../../../../libs/query/src/lib/http/persistence/query-persistence-engine.ts","../../../../libs/query/src/lib/http/persistence/query-persistence-indexed-db.ts","../../../../libs/query/src/lib/http/query-invalidation.ts","../../../../libs/query/src/lib/http/query-error-html-utils.ts","../../../../libs/query/src/lib/http/query-error-parsers.ts","../../../../libs/query/src/lib/http/query-retry-utils.ts","../../../../libs/query/src/lib/http/sync/query-key-lock-manager.ts","../../../../libs/query/src/lib/http/sync/query-sync-engine.ts","../../../../libs/query/src/lib/http/sync/query-sync-message.ts","../../../../libs/query/src/lib/http/sync/query-sync-transport.ts","../../../../libs/query/src/lib/http/query-client-features.ts","../../../../libs/query/src/lib/http/query-repository.ts","../../../../libs/query/src/lib/http/query-client.ts","../../../../libs/query/src/lib/http/secure-query-execute-factory.ts","../../../../libs/query/src/lib/http/secure-query-execute.ts","../../../../libs/query/src/lib/http/secure-query.ts","../../../../libs/query/src/lib/http/secure-query-creator.ts","../../../../libs/query/src/lib/http/query-creator-templates.ts","../../../../libs/query/src/lib/http/query-snapshot-utils.ts","../../../../libs/query/src/lib/http/query-sequence.ts","../../../../libs/query/src/lib/http/query-signal-forms.ts","../../../../libs/query/src/lib/http/query-validator-core.ts","../../../../libs/query/src/lib/http/validate-with-query.ts","../../../../libs/query/src/lib/auth/bearer-auth-provider.ts","../../../../libs/query/src/lib/auth/bearer-auth-query-builders.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-inactivity-logout.ts","../../../../libs/query/src/lib/auth/internal/leader-election.ts","../../../../libs/query/src/lib/auth/utils/token-encryption.ts","../../../../libs/query/src/lib/auth/internal/multi-tab-sync.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-multi-tab-sync.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-persistent-auth.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-token-expiration-warning.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-token-revocation.ts","../../../../libs/query/src/lib/auth/features/bearer-auth-tracking.ts","../../../../libs/query/src/lib/devtools/query-devtools-faults.ts","../../../../libs/query/src/lib/devtools/query-devtools-form-links.ts","../../../../libs/query/src/lib/devtools/query-devtools-overrides.ts","../../../../libs/query/src/lib/devtools/query-devtools-stats.ts","../../../../libs/query/src/lib/devtools/query-devtools-tombstone.ts","../../../../libs/query/src/lib/devtools/query-devtools-registry.ts","../../../../libs/query/src/lib/gql/gql-transformer.ts","../../../../libs/query/src/lib/gql/gql-query-execute.ts","../../../../libs/query/src/lib/gql/gql-query.ts","../../../../libs/query/src/lib/gql/gql-query-creator.ts","../../../../libs/query/src/lib/gql/secure-gql-query-execute.ts","../../../../libs/query/src/lib/gql/secure-gql-query.ts","../../../../libs/query/src/lib/gql/secure-gql-query-creator.ts","../../../../libs/query/src/lib/gql/gql-query-creator-templates.ts","../../../../libs/query/src/lib/legacy/auth/custom-header-auth-provider.ts","../../../../libs/query/src/lib/legacy/auth/basic-auth-provider.ts","../../../../libs/query/src/lib/legacy/request/request.util.ts","../../../../libs/query/src/lib/legacy/request/request.ts","../../../../libs/query/src/lib/legacy/utils/data.utils.ts","../../../../libs/query/src/lib/legacy/utils/deep-freeze.util.ts","../../../../libs/query/src/lib/legacy/utils/def.util.ts","../../../../libs/query/src/lib/legacy/query-creator/query-creator.ts","../../../../libs/query/src/lib/legacy/query-store/query-store.ts","../../../../libs/query/src/lib/legacy/query-client/query-client.ts","../../../../libs/query/src/lib/legacy/query-client/query-client.utils.ts","../../../../libs/query/src/lib/legacy/interop/legacy-prepare-fallback.ts","../../../../libs/query/src/lib/legacy/interop/legacy-query.ts","../../../../libs/query/src/lib/legacy/interop/inert-query.ts","../../../../libs/query/src/lib/legacy/interop/legacy-query-creator.ts","../../../../libs/query/src/lib/legacy/query/query.utils.ts","../../../../libs/query/src/lib/legacy/query/query.ts","../../../../libs/query/src/lib/legacy/auth/auth-provider.utils.ts","../../../../libs/query/src/lib/legacy/auth/bearer-auth-provider.ts","../../../../libs/query/src/lib/legacy/directives/infinity-query-response-delay-provider.ts","../../../../libs/query/src/lib/legacy/infinite-query/infinity-query.ts","../../../../libs/query/src/lib/legacy/infinite-query/infinity-query.utils.ts","../../../../libs/query/src/lib/legacy/directives/infinity-query.directive.ts","../../../../libs/query/src/lib/legacy/directives/infinity-query-trigger.directive.ts","../../../../libs/query/src/lib/legacy/directives/query.directive.ts","../../../../libs/query/src/lib/legacy/devtools/pipes/query-short-name.pipe.ts","../../../../libs/query/src/lib/legacy/devtools/utils/query-client.utils.ts","../../../../libs/query/src/lib/legacy/devtools/components/query-devtools/query-devtools.component.ts","../../../../libs/query/src/lib/legacy/devtools/components/query-devtools/query-devtools.component.html","../../../../libs/query/src/lib/legacy/entity/entity-store.ts","../../../../libs/query/src/lib/legacy/entity/entity.utils.ts","../../../../libs/query/src/lib/legacy/logger/logger.ts","../../../../libs/query/src/lib/legacy/validate-with-v2-query.ts","../../../../libs/query/src/lib/pipes/parse-http-error-code-de.ts","../../../../libs/query/src/lib/pipes/parse-http-error-code-de.pipe.ts","../../../../libs/query/src/lib/pipes/parse-http-error-code-en.ts","../../../../libs/query/src/lib/pipes/parse-http-error-code-en.pipe.ts","../../../../libs/query/src/lib/query-form/query-form.utils.ts","../../../../libs/query/src/lib/query-form/query-form.ts","../../../../libs/query/src/lib/query-form-signals/query-form-signals.ts","../../../../libs/query/src/lib/query-form-signals/query-form-signals.fields.ts","../../../../libs/query/src/lib/ws/web-socket-errors.ts","../../../../libs/query/src/lib/ws/web-socket-client.ts","../../../../libs/query/src/ethlete-query.ts"],"sourcesContent":["import { computed, inject } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport {\n CanActivateFn,\n CanMatchFn,\n NavigationBehaviorOptions,\n RedirectCommand,\n Router,\n UrlTree,\n} from '@angular/router';\nimport { defer, filter, from, map, Observable, take } from 'rxjs';\nimport { AnyCreateBearerAuthProviderResult } from './bearer-auth-provider';\n\n/** Anything {@link createAuthGuard} accepts as a navigation target. */\nexport type AuthGuardTarget = string | readonly unknown[] | UrlTree | ((router: Router) => UrlTree);\n\nexport type AuthGuardConfig = {\n /**\n * Where a visitor without a session is sent. The attempted URL is appended as\n * {@link returnUrlParam}.\n */\n loginUrl: AuthGuardTarget;\n\n /**\n * Where `navigateAfterLogin()` and the anonymous guards go when no return URL was captured.\n * @default '/'\n */\n defaultUrl?: AuthGuardTarget;\n\n /**\n * The query param the attempted URL is written to on the way out and read back from on the way in.\n * Pass `false` to redirect without one, so a login always lands on {@link defaultUrl}.\n *\n * @default 'returnUrl'\n */\n returnUrlParam?: string | false;\n\n /**\n * How a guard's redirect navigates.\n * @default { replaceUrl: true }\n */\n navigationBehaviorOptions?: NavigationBehaviorOptions;\n};\n\nexport type AuthGuard = {\n /**\n * Requires a session. On a lazy route this is the one to use - a visitor without a session never\n * downloads the child bundle.\n */\n canMatch: CanMatchFn;\n\n /** Requires a session, as a `canActivate` guard. */\n canActivate: CanActivateFn;\n\n /** Requires _no_ session - keeps a signed-in visitor off the login route. */\n canMatchAnonymous: CanMatchFn;\n\n /** Requires _no_ session, as a `canActivate` guard. */\n canActivateAnonymous: CanActivateFn;\n\n /**\n * The URL the guard captured before redirecting here, or `null`. Call from an injection context.\n */\n returnUrl: () => string | null;\n\n /**\n * Navigates to {@link returnUrl}, or to the configured `defaultUrl` when there is none. Call from\n * an injection context; the navigation starts on subscribe.\n */\n navigateAfterLogin: () => Observable<boolean>;\n};\n\nconst DEFAULT_RETURN_URL_PARAM = 'returnUrl';\nconst DEFAULT_URL = '/';\n\nconst resolveTarget = (router: Router, target: AuthGuardTarget): UrlTree => {\n if (target instanceof UrlTree) return target;\n if (typeof target === 'function') return target(router);\n if (typeof target === 'string') return router.parseUrl(target);\n\n return router.createUrlTree([...target]);\n};\n\nconst withQueryParam = (tree: UrlTree, param: string, value: string) =>\n new UrlTree(tree.root, { ...tree.queryParams, [param]: value }, tree.fragment);\n\n// A return URL arrives in the query string, so it is only followed when it points back into this\n// app: a leading `//` is a protocol-relative URL to another origin, and anything not starting with\n// `/` would resolve against wherever the login page happens to sit.\nconst readReturnUrl = (router: Router, url: string, param: string | null) => {\n if (!param) return null;\n\n const value = router.parseUrl(url).queryParams[param];\n\n return typeof value === 'string' && value.startsWith('/') && !value.startsWith('//') ? value : null;\n};\n\n/**\n * The route guards for a {@link createBearerAuthProvider} session, and the redirect back once the\n * visitor signs in. Both halves share the return-URL param, so the two cannot drift apart.\n *\n * ```ts\n * export const authGuard = createAuthGuard(authProviderRef, { loginUrl: '/login' });\n *\n * export const ROUTES: Routes = [\n * { path: 'login', canMatch: [authGuard.canMatchAnonymous], loadComponent: … },\n * { path: 'app', canMatch: [authGuard.canMatch], loadChildren: … },\n * ];\n * ```\n *\n * A guard pends while a session restore is in flight rather than redirecting against a session that\n * is about to exist, so a hard reload of a protected URL stays on that URL.\n */\nexport const createAuthGuard = (providerRef: AnyCreateBearerAuthProviderResult, config: AuthGuardConfig): AuthGuard => {\n const param = config.returnUrlParam === false ? null : (config.returnUrlParam ?? DEFAULT_RETURN_URL_PARAM);\n const behavior = config.navigationBehaviorOptions ?? { replaceUrl: true };\n\n const guardFor = (requiresSession: boolean) => () => {\n const router = inject(Router);\n const provider = providerRef.inject();\n\n // Captured before the wait below: once the session settles the router has moved on, and the URL\n // the visitor actually asked for is no longer reachable from it.\n const attemptedUrl = router.currentNavigation()?.extractedUrl.toString() ?? router.url;\n\n const settled = computed(() => {\n const status = provider.sessionStatus();\n\n return status !== 'unknown' && status !== 'restoring';\n });\n\n const decide = () => {\n const authenticated = provider.sessionStatus() === 'authenticated';\n\n if (authenticated === requiresSession) return true;\n\n if (requiresSession) {\n const loginTree = resolveTarget(router, config.loginUrl);\n\n return new RedirectCommand(param ? withQueryParam(loginTree, param, attemptedUrl) : loginTree, behavior);\n }\n\n const returnUrl = readReturnUrl(router, attemptedUrl, param);\n\n return new RedirectCommand(\n returnUrl ? router.parseUrl(returnUrl) : resolveTarget(router, config.defaultUrl ?? DEFAULT_URL),\n behavior,\n );\n };\n\n if (settled()) return decide();\n\n return toObservable(settled).pipe(filter(Boolean), take(1), map(decide));\n };\n\n const requireSession = guardFor(true);\n const requireAnonymous = guardFor(false);\n\n return {\n canMatch: requireSession,\n canActivate: requireSession,\n canMatchAnonymous: requireAnonymous,\n canActivateAnonymous: requireAnonymous,\n\n returnUrl: () => {\n const router = inject(Router);\n\n return readReturnUrl(router, router.url, param);\n },\n\n navigateAfterLogin: () => {\n const router = inject(Router);\n\n return defer(() => {\n const returnUrl = readReturnUrl(router, router.url, param);\n\n return from(router.navigateByUrl(returnUrl ?? resolveTarget(router, config.defaultUrl ?? DEFAULT_URL)));\n });\n },\n };\n};\n","/**\n * One configured option of a feature, as the devtools render it (`interval · 5s`). Values are\n * pre-rendered strings so the panel never has to know a feature's option shape.\n */\nexport type QueryDevtoolsFeatureDetail = {\n label: string;\n value: string;\n};\n\n/**\n * A feature applied to a query, stack or auth provider, together with how it was configured. `type`\n * is the feature's `*_FEATURE_TYPE` constant (`WITH_POLLING`, `PERSISTENT_AUTH`, …).\n */\nexport type QueryDevtoolsFeature = {\n type: string;\n details: QueryDevtoolsFeatureDetail[];\n};\n\n/**\n * Describes how a feature was configured. Only ever called while building a devtools entry, so a\n * feature may render whatever it needs to here without paying for it when devtools are off.\n */\nexport type QueryDevtoolsFeatureDescriber = () => QueryDevtoolsFeatureDetail[];\n\n/** A feature as the devtools read it: its type plus its optional self-description. */\nexport type DescribableFeature = {\n type: string;\n devtools?: QueryDevtoolsFeatureDescriber;\n};\n\n/**\n * Turns the features applied at creation into their devtools representation.\n * @internal\n */\nexport const describeQueryDevtoolsFeatures = (\n features: readonly DescribableFeature[] | undefined,\n): QueryDevtoolsFeature[] =>\n features?.map((feature) => ({ type: feature.type, details: feature.devtools?.() ?? [] })) ?? [];\n\n/**\n * Renders a millisecond duration the way feature details spell one out - `500ms`, `1.5s`, `15m`.\n * @internal\n */\nexport const formatQueryDevtoolsDuration = (ms: number) => {\n if (!Number.isFinite(ms)) return String(ms);\n if (ms < 1000) return `${ms}ms`;\n\n const round = (value: number, unit: string) => `${Number(value.toFixed(1))}${unit}`;\n\n if (ms < 60_000) return round(ms / 1000, 's');\n if (ms < 3_600_000) return round(ms / 60_000, 'm');\n\n return round(ms / 3_600_000, 'h');\n};\n\n/**\n * The name of a function passed as `options.<key>`, or `null` when it is an inline lambda. An inline\n * `{ handler: (e) => … }` inherits the name `handler` from the key it is assigned to, which tells the\n * reader nothing - a reference to a declared function does.\n */\nconst queryDevtoolsFnName = (fn: unknown, key: string) => {\n const name = typeof fn === 'function' ? fn.name.replace(/^bound /, '') : '';\n\n return !name || name === key ? null : name;\n};\n\n/**\n * A detail for the function passed as `options.<key>`, omitted when it is an inline lambda.\n * @internal\n */\nexport const queryDevtoolsFnDetail = (fn: unknown, key: string): QueryDevtoolsFeatureDetail[] => {\n const name = queryDevtoolsFnName(fn, key);\n\n return name ? [{ label: key, value: name }] : [];\n};\n","import { AnyCreateQueryClientResult, QueryClient } from '../http/query-client';\nimport { CreateQueryCreatorOptions, QueryConfig } from '../http/query-creator';\nimport { QueryRepository } from '../http/query-repository';\nimport { QueryDevtoolsFeature } from './query-devtools-features';\nimport { QueryDevtoolsFormLinksHandle, QueryDevtoolsFormLinksRecorder } from './query-devtools-form-links';\nimport { QueryDevtoolsOverridesRecorder } from './query-devtools-overrides';\nimport { QueryDevtoolsStatsHandle, QueryDevtoolsStatsRecorder } from './query-devtools-stats';\n\n/**\n * The kind of object a {@link QueryDevtoolsEntry} describes. Part of the devtools contract consumed\n * by `<et-query-devtools>` - not a general-purpose query API.\n */\nexport type QueryDevtoolsEntryKind =\n 'query' | 'query-stack' | 'paged-query-stack' | 'query-sequence' | 'auth-provider' | 'ws-client' | 'query-form';\n\n/**\n * One chunk of a parsed query route: either literal text (`param: null`) or a path param, whose name\n * is in {@link QueryDevtoolsRoutePart.text}. Lets the devtools tell a route's static parts from its\n * dynamic ones and fill the latter in with the values a query actually used.\n */\nexport type QueryDevtoolsRoutePart = {\n text: string;\n param: string | null;\n};\n\n/**\n * One of a bearer auth provider's queries, described without instantiating it - which is what lets\n * tooling build the token-refresh request of a provider whose refresh query has not run yet.\n */\nexport type QueryDevtoolsAuthQuery = {\n key: string;\n\n /** `token-refresh` for the query registered via `withRefreshQuery`, `auth` for the rest. */\n kind: 'auth' | 'token-refresh';\n\n method: string;\n\n /** Stringified route with path params rendered as `:name`. */\n route: string;\n\n /** The args a token refresh sends for a given refresh token. Only set on the refresh query. */\n buildArgs?: (refreshToken: string) => { body?: unknown };\n};\n\n/**\n * Descriptive, mostly-static metadata about a registered devtools entry. The live, reactive state\n * is read from the entry's {@link QueryDevtoolsEntry.handle} instead.\n */\nexport type QueryDevtoolsEntryMeta = {\n /** Display name of the owning query client, where known. */\n clientName?: string;\n\n /** Base URL of the owning query client, where known. */\n clientBaseUrl?: string;\n\n /** Human readable display name (e.g. an auth provider or web socket client name). */\n name?: string;\n\n /** The connection URL, for web socket clients. */\n url?: string;\n\n /** The GraphQL document string, for GraphQL queries. */\n gqlQuery?: string;\n\n /** Stringified route with path params rendered as `:name`, for queries. */\n route?: string;\n\n /** The same route, split into its literal and path-param parts. */\n routeParts?: QueryDevtoolsRoutePart[];\n\n /** Human readable HTTP/GQL method, for queries (e.g. `GET`, `GQL QUERY`). */\n method?: string;\n\n /** The features applied at creation, with the options each was configured with. */\n features?: QueryDevtoolsFeature[];\n\n /** Whether the query authenticates through a bearer auth provider, for queries. */\n isSecure?: boolean;\n\n /** Name of the bearer auth provider a secure query authenticates with. */\n authProviderName?: string;\n\n /** The provider's own queries, for auth providers. */\n authQueries?: QueryDevtoolsAuthQuery[];\n\n /** The query config passed at creation, for queries. */\n queryConfig?: QueryConfig;\n\n /** The creator options passed at creation, for queries. */\n creator?: CreateQueryCreatorOptions;\n\n /** The owning client's repository, where known (queries and auth providers). */\n repository?: QueryRepository;\n\n /**\n * The owning client itself, where known (queries and auth providers). Read for state that hangs off\n * the client rather than the repository - the multi-tab sync engine, in particular.\n */\n client?: QueryClient;\n\n /**\n * The DOM element of the component/directive that created a query, when available. Used by the\n * devtools \"inspect\" tool to map a query back to its place in the live UI.\n */\n element?: HTMLElement | null;\n};\n\n/**\n * A single entry in the {@link queryDevtoolsEntries} registry. The `handle` is the live object\n * (query, stack, sequence or auth provider) so its signals stay reactive when read by the UI.\n */\nexport type QueryDevtoolsEntry = {\n id: string;\n kind: QueryDevtoolsEntryKind;\n meta: QueryDevtoolsEntryMeta;\n handle: unknown;\n createdAt: number;\n\n /**\n * When the query behind this entry was destroyed, or `null`/absent while it is still live. A\n * destroyed entry is kept as a tombstone - a frozen snapshot of what the query last held - so a\n * request that failed on the way out (a `401` that redirects to login and takes its component with\n * it) is still readable by the time the panel is opened. Its `handle` answers with constants and\n * every action on it is inert.\n */\n destroyedAt?: number | null;\n\n /**\n * What the entry has done since it was created - executions, requests, payload sizes. Present for\n * queries; stacks, sequences and auth providers aggregate the stats of the queries they own instead.\n */\n stats?: QueryDevtoolsStatsHandle;\n\n /** The query forms this entry's args read, for queries created with a `withArgs` feature. */\n formLinks?: QueryDevtoolsFormLinksHandle;\n\n /**\n * The response overrides armed on this entry, for queries. Unlike {@link stats}/{@link formLinks} -\n * whose write side is internal instrumentation the panel only ever reads - the panel itself is what\n * arms an override, so this exposes the full recorder rather than a read-only handle.\n */\n overrides?: QueryDevtoolsOverridesRecorder;\n};\n\n/**\n * What an instrumentation site hands to the registry. Raw values (`route`, `clientRef`) are rendered\n * into {@link QueryDevtoolsEntryMeta} by the registry rather than at the call site, so the code that\n * renders them is only reachable from {@link provideQueryDevtools}.\n */\nexport type QueryDevtoolsRegistration = {\n id?: string;\n kind: QueryDevtoolsEntryKind;\n handle: unknown;\n meta: QueryDevtoolsEntryMeta;\n\n /** The creator's route, stringified by the registry. */\n route?: unknown;\n\n /** The owning client, whose display name is derived by the registry. */\n clientRef?: AnyCreateQueryClientResult;\n\n /**\n * The bearer auth provider a secure query authenticates with, whose display name is derived by the\n * registry. Typed structurally so the registry does not have to import the auth layer it registers.\n */\n authProviderRef?: { token?: unknown };\n\n /** The auth provider's queries, whose routes are stringified by the registry. */\n authQueries?: (Omit<QueryDevtoolsAuthQuery, 'route'> & { route?: unknown })[];\n\n /** @see QueryDevtoolsEntry.stats */\n stats?: QueryDevtoolsStatsHandle;\n\n /** @see QueryDevtoolsEntry.formLinks */\n formLinks?: QueryDevtoolsFormLinksHandle;\n\n /** @see QueryDevtoolsEntry.overrides */\n overrides?: QueryDevtoolsOverridesRecorder;\n};\n\n/** The registry {@link provideQueryDevtools} installs. */\nexport type QueryDevtoolsRegistrar = (entry: QueryDevtoolsRegistration) => () => void;\n\nconst noop = () => undefined;\n\nlet registrar: QueryDevtoolsRegistrar | null = null;\n\n/**\n * Installs the real registry. Called by `provideQueryDevtools()`; nothing else may call it.\n * @internal\n */\nexport const setQueryDevtoolsRegistrar = (fn: QueryDevtoolsRegistrar) => {\n registrar = fn;\n};\n\n/**\n * Whether {@link provideQueryDevtools} has been called. When `false`, every `register*` call is a\n * no-op so the devtools instrumentation retains no references and adds no overhead in production.\n * @internal\n */\nexport const isQueryDevtoolsEnabled = () => registrar !== null;\n\n/**\n * Registers an entry with the devtools registry. Returns an unregister callback. A no-op (returning\n * a no-op callback) unless {@link provideQueryDevtools} has been called.\n * @internal\n */\nexport const registerQueryDevtoolsEntry = (entry: QueryDevtoolsRegistration): (() => void) =>\n registrar?.(entry) ?? noop;\n\nlet statsFactory: (() => QueryDevtoolsStatsRecorder) | null = null;\n\n/**\n * Installs the stats recorder factory. Called by `provideQueryDevtools()`; nothing else may call it.\n * @internal\n */\nexport const setQueryDevtoolsStatsFactory = (fn: () => QueryDevtoolsStatsRecorder) => {\n statsFactory = fn;\n};\n\n/**\n * A stats recorder for one entry, or `null` unless {@link provideQueryDevtools} has been called.\n *\n * Instrumentation sites must go through this instead of importing `createQueryDevtoolsStats`: a static\n * import pins the whole stats module (~1.4 kB) into every bundle that touches a query, and a runtime\n * `isQueryDevtoolsEnabled()` guard at the call site does not undo that. Reached only from the provider,\n * it is dead code in an app without devtools.\n * @internal\n */\nexport const createQueryDevtoolsStatsRecorder = (): QueryDevtoolsStatsRecorder | null => statsFactory?.() ?? null;\n\nlet formLinksFactory: (() => QueryDevtoolsFormLinksRecorder) | null = null;\n\n/**\n * Installs the form-links recorder factory. Called by `provideQueryDevtools()`; nothing else may call it.\n * @internal\n */\nexport const setQueryDevtoolsFormLinksFactory = (fn: () => QueryDevtoolsFormLinksRecorder) => {\n formLinksFactory = fn;\n};\n\n/**\n * A form-links recorder for one query, or `null` unless {@link provideQueryDevtools} has been called.\n * Reached only from the provider for the same reason {@link createQueryDevtoolsStatsRecorder} is.\n * @internal\n */\nexport const createQueryDevtoolsFormLinksRecorder = (): QueryDevtoolsFormLinksRecorder | null =>\n formLinksFactory?.() ?? null;\n\nlet overridesFactory: (() => QueryDevtoolsOverridesRecorder) | null = null;\n\n/**\n * Installs the overrides recorder factory. Called by `provideQueryDevtools()`; nothing else may call it.\n * @internal\n */\nexport const setQueryDevtoolsOverridesFactory = (fn: () => QueryDevtoolsOverridesRecorder) => {\n overridesFactory = fn;\n};\n\n/**\n * An overrides recorder for one query, or `null` unless {@link provideQueryDevtools} has been called.\n * Reached only from the provider for the same reason {@link createQueryDevtoolsStatsRecorder} is.\n * @internal\n */\nexport const createQueryDevtoolsOverridesRecorder = (): QueryDevtoolsOverridesRecorder | null =>\n overridesFactory?.() ?? null;\n\n/** The ids of the query forms read by the args build currently running, or `null` outside of one. */\nlet formLinkSink: Set<string> | null = null;\n\n/**\n * Runs `build` and reports which query forms it read. Nested builds are supported - the outer one\n * resumes collecting once the inner one is done.\n * @internal\n */\nexport const collectQueryFormLinks = <T>(build: () => T): { value: T; ids: string[] } => {\n const outer = formLinkSink;\n const sink = new Set<string>();\n\n formLinkSink = sink;\n\n try {\n return { value: build(), ids: [...sink] };\n } finally {\n formLinkSink = outer;\n }\n};\n\n/**\n * Records that a query form's committed value was read. The form calls this from its `value` signal, so\n * a read that happens while a query builds its args is what links the two - no naming convention, and\n * nothing to keep in sync when the args change.\n * @internal\n */\nexport const noteQueryFormRead = (id: string) => {\n formLinkSink?.add(id);\n};\n\n/** The request an upcoming attempt belongs to, for the fault resolver to match against. */\nexport type QueryDevtoolsFaultTarget = {\n /** Display name of the owning query client. Faults are armed per client. */\n clientName: string;\n\n method: string;\n url: string;\n};\n\n/** What the devtools want done with one upcoming attempt. */\nexport type QueryDevtoolsResolvedFault = {\n /** Extra latency in ms to wait out before the attempt starts. */\n latencyMs: number;\n\n /** The status to fail the attempt with instead of sending it, or `null` to let it through. */\n status: number | null;\n};\n\nlet faultResolver: ((target: QueryDevtoolsFaultTarget) => QueryDevtoolsResolvedFault | null) | null = null;\n\n/**\n * Installs the fault resolver. Called by `provideQueryDevtools()`; nothing else may call it.\n * @internal\n */\nexport const setQueryDevtoolsFaultResolver = (\n fn: (target: QueryDevtoolsFaultTarget) => QueryDevtoolsResolvedFault | null,\n) => {\n faultResolver = fn;\n};\n\n/**\n * Whether fault injection can do anything at all. Checked before building the wrapper that resolves a\n * fault per attempt, so a request in an app without devtools keeps the pipeline it always had.\n * @internal\n */\nexport const isQueryDevtoolsFaultInjectionEnabled = () => faultResolver !== null;\n\n/**\n * Resolves the fault to apply to one upcoming attempt, or `null` when nothing is armed. Consumes a\n * `failNext` budget, so call it exactly once per attempt.\n * @internal\n */\nexport const resolveQueryDevtoolsFault = (target: QueryDevtoolsFaultTarget): QueryDevtoolsResolvedFault | null =>\n faultResolver?.(target) ?? null;\n\nlet suppressStackRegistration = false;\n\n/**\n * Suppresses devtools registration for the next {@link createQueryStack} call. Used by\n * `createPagedQueryStack` so its backing stack is not registered as a separate `query-stack` entry.\n * @internal\n */\nexport const suppressNextQueryStackDevtools = () => {\n suppressStackRegistration = true;\n};\n\n/**\n * Reads and clears the suppress-next-stack flag. Always call this from `createQueryStack` (even when\n * devtools are disabled) so a suppression request never leaks into a later stack.\n * @internal\n */\nexport const consumeSuppressQueryStackDevtools = () => {\n const value = suppressStackRegistration;\n suppressStackRegistration = false;\n\n return value;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CreateGqlQueryOptions } from '../../gql/gql-query';\nimport { CreateQueryOptions, QueryArgs } from '../query';\n\n/**\n * Whether a create-query options object came from the gql layer - only gql's `creatorInternals` carries\n * a `transport`. Lives here because `base-query-factory` is what branches on it; `gql/gql-query`\n * re-exports it under its original public name.\n */\nexport const isCreateGqlQueryOptions = <TArgs extends QueryArgs>(\n options: CreateQueryOptions<TArgs> | CreateGqlQueryOptions<any>,\n): options is CreateGqlQueryOptions<any> => 'transport' in options.creatorInternals;\n","import { DestroyRef, Injector, Signal } from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\n\nexport type ObservableSignal<T> = Signal<T> & {\n /**\n * Converts this signal to an Observable.\n *\n * The observable lifetime is bounded by the signal owner's injector by default.\n * When an override injector is provided, the observable is bounded by whichever lifetime ends\n * first: `min(override injector lifetime, signal owner injector lifetime)`.\n */\n asObservable(options?: { injector?: Injector }): Observable<T>;\n};\n\nexport const wrapAsObservableSignal = <T>(source: Signal<T>, defaultInjector: Injector): ObservableSignal<T> => {\n const asObservable = (options?: { injector?: Injector }): Observable<T> => {\n const effectiveInjector = options?.injector ?? defaultInjector;\n const base$ = toObservable(source, { injector: effectiveInjector });\n\n if (options?.injector) {\n return base$.pipe(takeUntilDestroyed(defaultInjector.get(DestroyRef)));\n }\n\n return base$;\n };\n\n return Object.assign(source, { asObservable }) as unknown as ObservableSignal<T>;\n};\n","import { inject, InjectionToken } from '@angular/core';\nimport { defineStaticProvider } from '@ethlete/core';\nimport { QueryDependencies } from './query-dependencies';\n\nexport type QueryContext = {\n /** All query dependencies (client, injector, destroy refs, etc.) */\n deps: QueryDependencies;\n};\n\nconst QUERY_CONTEXT_TOKEN = new InjectionToken<QueryContext>('QUERY_CONTEXT');\n\nexport const createQueryContext = (context: QueryContext) =>\n defineStaticProvider(context, {\n name: 'Query Context',\n extraInjectionToken: QUERY_CONTEXT_TOKEN,\n });\n\nexport const injectQueryContext = () => inject(QUERY_CONTEXT_TOKEN);\n","import { HttpClient } from '@angular/common/http';\nimport {\n createEnvironmentInjector,\n DestroyRef,\n ElementRef,\n EnvironmentInjector,\n ErrorHandler,\n inject,\n Injector,\n} from '@angular/core';\nimport { AnyCreateQueryClientResult, QueryClient } from './query-client';\nimport { createQueryContext, QueryContext } from './query-context';\nimport { QueryConfig } from './query-creator';\n\nexport type SetupQueryDependenciesOptions = {\n /** The query client tuple from createQueryClient */\n client: AnyCreateQueryClientResult;\n\n /** Optional query configuration */\n queryConfig: QueryConfig | undefined;\n};\n\nexport type QueryDependencies = {\n /** The destroy ref of the query. */\n destroyRef: DestroyRef;\n\n /** The destroy ref of the scope the query is in (e.g. a component) */\n scopeDestroyRef: DestroyRef;\n\n /** The query client */\n client: QueryClient;\n\n /** The injector of the query */\n injector: EnvironmentInjector;\n\n /** The error handler */\n ngErrorHandler: ErrorHandler;\n\n /** The http client */\n httpClient: HttpClient;\n\n /**\n * The DOM element of the component/directive that created the query, when it was created in an\n * element (node) injection context. `null` for queries created in a root/environment context.\n * Used only by the devtools \"inspect\" tool.\n */\n hostElement: HTMLElement | null;\n};\n\nexport const setupQueryDependencies = (options: SetupQueryDependenciesOptions) => {\n const hostInjector = options.queryConfig?.injector ?? inject(Injector);\n const environmentInjector =\n options.queryConfig?.injector?.get(EnvironmentInjector) ?? hostInjector.get(EnvironmentInjector);\n\n const clientToken = options.client.token;\n\n const dependencies: QueryDependencies = {\n destroyRef: undefined as unknown as DestroyRef, // Will be set after injector creation\n scopeDestroyRef: hostInjector.get(DestroyRef),\n client: hostInjector.get<QueryClient>(clientToken),\n injector: undefined as unknown as EnvironmentInjector, // Will be set after injector creation\n ngErrorHandler: hostInjector.get(ErrorHandler),\n httpClient: hostInjector.get(HttpClient),\n hostElement: hostInjector.get(ElementRef, null, { optional: true })?.nativeElement ?? null,\n };\n\n const queryContext: QueryContext = {\n deps: dependencies,\n };\n\n const { provide: provideQueryContext } = createQueryContext(queryContext);\n\n const queryEnvironmentInjector = createEnvironmentInjector([provideQueryContext()], environmentInjector);\n\n dependencies.destroyRef = queryEnvironmentInjector.get(DestroyRef);\n dependencies.injector = queryEnvironmentInjector;\n\n // cleanup the environment injector when the scope (e.g. the component the query is in) is destroyed\n const scopeDestroyListener = dependencies.scopeDestroyRef.onDestroy(() => {\n try {\n queryEnvironmentInjector.destroy();\n } catch {\n // ignore\n }\n });\n\n dependencies.destroyRef.onDestroy(() => {\n // cleanup the scope destroy listener\n try {\n scopeDestroyListener();\n } catch {\n // ignore\n }\n });\n\n return dependencies;\n};\n","import { RuntimeError } from '@ethlete/core';\nimport { QueryFeatureType } from './query-features';\n\n// codes 0-999\nexport const QueryRuntimeErrorCode = {\n // Query\n QUERY_FEATURE_USED_MULTIPLE_TIMES: 0,\n\n // Query features\n WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION: 100,\n WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD: 101,\n WITH_AUTO_REFRESH_USED_ON_UNSUPPORTED_HTTP_METHOD: 102,\n WITH_AUTO_REFRESH_USED_IN_MANUAL_QUERY: 103,\n SILENCE_MISSING_WITH_ARGS_FEATURE_ERROR_USED_BUT_WITH_ARGS_PRESENT: 104,\n\n // Auth provider\n AUTH_EXTRACT_TOKENS_RESPONSE_NOT_OBJECT: 200,\n AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_ACCESS_TOKEN: 201,\n AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_REFRESH_TOKEN: 202,\n AUTH_PROVIDER_FEATURE_USED_MULTIPLE_TIMES: 203,\n\n // Query client\n QUERY_CLIENT_FEATURE_USED_MULTIPLE_TIMES: 250,\n\n // Query Repository\n UNCACHEABLE_REQUEST_HAS_CACHE_KEY_PARAM: 300,\n UNCACHEABLE_REQUEST_HAS_ALLOW_CACHE_PARAM: 301,\n\n // Paged Query Stack\n PAGED_QUERY_STACK_PAGE_BIGGER_THAN_TOTAL_PAGES: 400,\n PAGED_QUERY_STACK_NEXT_PAGE_CALLED_WITHOUT_PREVIOUS_PAGE: 401,\n PAGED_QUERY_STACK_PREVIOUS_PAGE_CALLED_BUT_ALREADY_AT_FIRST_PAGE: 402,\n\n // Query Stack\n QUERY_STACK_WITH_ARGS_USED: 500,\n QUERY_STACK_WITH_RESPONSE_UPDATE_USED: 501,\n QUERY_STACK_TOTAL_QUERIES_AND_EXPECTED_QUERIES_MISMATCH: 502,\n\n // GQL\n GQL_DATA_PROPERTY_MISSING_IN_RESPONSE: 600,\n\n // Secure Execute\n TOKENS_NOT_AVAILABLE_INSIDE_AUTH_AND_EXEC: 700,\n INVALID_STATE_INSIDE_SECURE_EXECUTE_FACTORY: 701,\n\n // Query Execution\n CIRCULAR_QUERY_DEPENDENCY: 800,\n\n // Query Sequence\n QUERY_SEQUENCE_ALREADY_RUNNING: 900,\n\n // Legacy interop\n LEGACY_PREPARE_WITHOUT_INJECTION_CONTEXT: 950,\n LEGACY_QUERY_STATE_ALREADY_HAS_KEY: 951,\n LEGACY_QUERY_STATE_DOES_NOT_CONTAIN_KEY: 952,\n LEGACY_QUERY_STATE_CANNOT_TRANSFORM: 953,\n LEGACY_INVALID_BODY: 954,\n} as const;\n\nexport type QueryRuntimeErrorCode = (typeof QueryRuntimeErrorCode)[keyof typeof QueryRuntimeErrorCode];\n\nexport const queryFeatureUsedMultipleTimes = (type: QueryFeatureType) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_FEATURE_USED_MULTIPLE_TIMES,\n `The query feature \"${type}()\" was used multiple times.`,\n );\n};\n\nexport const withArgsQueryFeatureMissingButRouteIsFunction = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.WITH_ARGS_QUERY_FEATURE_MISSING_BUT_ROUTE_IS_FUNCTION,\n `This queries route is a function, but a \"withArgs()\" feature is missing.`,\n );\n};\n\nexport const withPollingUsedOnUnsupportedHttpMethod = (method: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.WITH_POLLING_USED_ON_UNSUPPORTED_HTTP_METHOD,\n `This is a \"${method}\" request, \"withPolling()\" is only supported for GET, HEAD, OPTIONS requests and GQL queries.`,\n );\n};\n\nexport const withAutoRefreshUsedOnUnsupportedHttpMethod = (method: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.WITH_AUTO_REFRESH_USED_ON_UNSUPPORTED_HTTP_METHOD,\n `This is a \"${method}\" request, \"withAutoRefresh()\" is only supported for GET, HEAD, OPTIONS requests and GQL queries.`,\n );\n};\n\nexport const withAutoRefreshUsedInManualQuery = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.WITH_AUTO_REFRESH_USED_IN_MANUAL_QUERY,\n `\"withAutoRefresh()\" has been used inside a query that has \"onlyManualExecution\" set to true.` +\n ` If this is intentional, set \"ignoreOnlyManualExecution\" to true inside the auto refresh config.`,\n );\n};\n\nexport const silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.SILENCE_MISSING_WITH_ARGS_FEATURE_ERROR_USED_BUT_WITH_ARGS_PRESENT,\n `The \"silenceMissingWithArgsFeatureError\" config is set to true, but a \"withArgs()\" feature is present.`,\n );\n};\n\nexport const authExtractTokensResponseNotObject = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.AUTH_EXTRACT_TOKENS_RESPONSE_NOT_OBJECT,\n `The auth token extractor expects the response to be an object.`,\n );\n};\n\nexport const authExtractTokensResponseMissingAccessToken = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_ACCESS_TOKEN,\n `The auth token extractor expects the response to contain a string \"accessToken\" property.`,\n );\n};\n\nexport const authExtractTokensResponseMissingRefreshToken = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.AUTH_EXTRACT_TOKENS_RESPONSE_MISSING_REFRESH_TOKEN,\n `The auth token extractor expects the response to contain a string \"refreshToken\" property.`,\n );\n};\n\nexport const authProviderFeatureUsedMultipleTimes = (type: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.AUTH_PROVIDER_FEATURE_USED_MULTIPLE_TIMES,\n `Bearer auth feature \"${type}\" was used multiple times.`,\n );\n};\n\nexport const queryClientFeatureUsedMultipleTimes = (type: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_CLIENT_FEATURE_USED_MULTIPLE_TIMES,\n `Query client feature \"${type}\" was used multiple times.`,\n );\n};\n\nexport const uncacheableRequestHasCacheKeyParam = (key: string) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.UNCACHEABLE_REQUEST_HAS_CACHE_KEY_PARAM,\n `This request is uncacheable, but a cache key was provided: ${key}. Please remove it.`,\n );\n};\n\nexport const uncacheableRequestHasAllowCacheParam = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.UNCACHEABLE_REQUEST_HAS_ALLOW_CACHE_PARAM,\n `This request is uncacheable, but allowCache is set to true. Please remove it.`,\n );\n};\n\nexport const pagedQueryStackPageBiggerThanTotalPages = (page: number, totalPages: number) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.PAGED_QUERY_STACK_PAGE_BIGGER_THAN_TOTAL_PAGES,\n `The page \"${page}\" is bigger than the total pages \"${totalPages}\".`,\n );\n};\n\nexport const pagedQueryStackNextPageCalledWithoutPreviousPage = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.PAGED_QUERY_STACK_NEXT_PAGE_CALLED_WITHOUT_PREVIOUS_PAGE,\n `fetchNextPage() has been called but the current page is not yet loaded. Please call it after the previous page has been loaded.`,\n );\n};\n\nexport const pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.PAGED_QUERY_STACK_PREVIOUS_PAGE_CALLED_BUT_ALREADY_AT_FIRST_PAGE,\n `fetchPreviousPage() has been called but the current page is already the first page.`,\n );\n};\n\nexport const queryStackWithArgsUsed = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_STACK_WITH_ARGS_USED,\n `withArgs() has been used in a query stack or a paged query stack. This is not supported.`,\n );\n};\n\nexport const queryStackWithResponseUpdateUsed = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_STACK_WITH_RESPONSE_UPDATE_USED,\n `withResponseUpdate() has been used in a query stack or a paged query stack. This is not supported.`,\n );\n};\n\nexport const queryStackTotalQueriesAndExpectedQueriesMismatch = (totalQueries: number, expectedQueries: number) => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_STACK_TOTAL_QUERIES_AND_EXPECTED_QUERIES_MISMATCH,\n `The total queries \"${totalQueries}\" and the expected queries \"${expectedQueries}\" do not match. This usually happens if a query depends on the response of the previous query to calculate its pagination values. Set blockExecutionDuringLoading to true to prevent this.`,\n );\n};\n\nexport const gqlDataPropertyMissingInResponse = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.GQL_DATA_PROPERTY_MISSING_IN_RESPONSE,\n `The GraphQL response is missing the required \"data\" property. Please add a custom transformResponse param to the query creator to handle this response format.`,\n );\n};\n\nexport const tokensNotAvailableInsideAuthAndExec = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.TOKENS_NOT_AVAILABLE_INSIDE_AUTH_AND_EXEC,\n `Tokens are not available inside authAndExec.`,\n );\n};\n\nexport const invalidStateInsideSecureExecuteFactory = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.INVALID_STATE_INSIDE_SECURE_EXECUTE_FACTORY,\n `An invalid state occurred inside the secure execute factory.`,\n );\n};\n\nexport const circularQueryDependency = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.CIRCULAR_QUERY_DEPENDENCY,\n `Query was executed more than 5 times in less than 100ms. This is usually a sign of a circular dependency.`,\n );\n};\n\nexport const legacyPrepareWithoutInjectionContext = (\n creatorName: string | undefined,\n method: 'prepare' | 'createSubject' | 'createSignal' = 'prepare',\n) => {\n const label = creatorName ? `\"${creatorName}\"` : 'A legacy query creator';\n const example =\n method === 'prepare'\n ? ` search = (term: string) => myQuery.prepare({ queryParams: { term }, injector: this.injector });`\n : ` container = myQuery.${method}(null, { injector: this.injector });`;\n\n return new RuntimeError(\n QueryRuntimeErrorCode.LEGACY_PREPARE_WITHOUT_INJECTION_CONTEXT,\n `${label}.${method}() was called outside of an injection context. Unlike the v2 client, the legacy interop layer needs an injector to build the underlying query.\\n\\n` +\n `Capture one where a context does exist (field initializer, constructor) and pass it along:\\n\\n` +\n ` private injector = inject(Injector);\\n` +\n `${example}\\n\\n` +\n `Prefer an injector that outlives the call site. A component injector passed from a callback that can still fire after the component is gone leaves prepare() with a destroyed injector, which returns an inert query instead of executing.`,\n );\n};\n\nexport const querySequenceAlreadyRunning = () => {\n return new RuntimeError(\n QueryRuntimeErrorCode.QUERY_SEQUENCE_ALREADY_RUNNING,\n `run() was called on a query sequence that is already running. Wait for the current run to settle before starting another.`,\n );\n};\n","import { FormViolationListView, FormViolationView } from '@ethlete/types';\n\nexport type ClassValidatorError = {\n statusCode: number;\n message: string[];\n error: string;\n};\n\nexport const isClassValidatorError = (error: unknown): error is ClassValidatorError => {\n return typeof error === 'object' && error !== null && 'statusCode' in error && 'message' in error && 'error' in error;\n};\n\nexport type SymfonyErrorTrace = {\n args: string[];\n class: string;\n file: string;\n function: string;\n line: number;\n namespace: string;\n short_class: string;\n type: string;\n};\n\nexport type SymfonyError = {\n class: string;\n detail: string;\n status: number;\n title: string;\n trace: SymfonyErrorTrace[];\n type: string;\n};\n\nexport const isSymfonyError = (error: unknown): error is SymfonyError => {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const symfonyError = error as SymfonyError;\n\n return (\n symfonyError.class !== undefined &&\n symfonyError.detail !== undefined &&\n symfonyError.status !== undefined &&\n symfonyError.title !== undefined &&\n symfonyError.trace !== undefined &&\n symfonyError.type !== undefined\n );\n};\n\nexport const isSymfonyPagerfantaOutOfRangeError = (error: unknown): error is SymfonyError => {\n if (!isSymfonyError(error)) {\n return false;\n }\n\n return error.class.startsWith('Pagerfanta') && error.class.endsWith('OutOfRangeCurrentPageException');\n};\n\nexport const isSymfonyFormViolationListError = (error: unknown): error is FormViolationListView => {\n return typeof error === 'object' && error !== null && 'violations' in error;\n};\n\nexport const isSymfonyListError = (error: unknown): error is FormViolationView[] => {\n return (\n !!error &&\n typeof error === 'object' &&\n Array.isArray(error) &&\n !!error.length &&\n typeof error[0] === 'object' &&\n 'message' in error[0] &&\n 'propertyPath' in error[0] &&\n 'invalidValue' in error[0]\n );\n};\n","import { HttpEventType } from '@angular/common/http';\nimport { CreateEffectOptions, effect, Signal, untracked, WritableSignal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { getActiveConsumer, setActiveConsumer } from '@angular/core/primitives/signals';\nimport { filter } from 'rxjs';\nimport {\n formatQueryDevtoolsDuration,\n QueryDevtoolsFeatureDescriber,\n queryDevtoolsFnDetail,\n} from '../devtools/query-devtools-features';\nimport { HttpErrorEvent, RequestHttpEvent } from './http-request';\nimport { QueryArgs, RequestArgs, ResponseType } from './query';\nimport { QueryDependencies } from './query-dependencies';\nimport { QueryErrorResponse } from './query-error-response';\nimport { isSymfonyPagerfantaOutOfRangeError } from './query-error-response-utils';\nimport {\n withAutoRefreshUsedInManualQuery,\n withAutoRefreshUsedOnUnsupportedHttpMethod,\n withPollingUsedOnUnsupportedHttpMethod,\n} from './query-errors';\nimport { InternalQueryExecute } from './query-execute';\nimport { QueryKey } from './query-repository';\nimport { QueryState } from './query-state';\nimport { QueryKeyLockHold } from './sync/query-key-lock-manager';\n\n/**\n * Returning this inside a withArgs feature will reset the query args to null.\n * This will also pause polling and auto refresh until new args are set.\n */\nexport const CLEAR_QUERY_ARGS = /* @__PURE__ */ Symbol('CLEAR_QUERY_ARGS');\nexport type ClearQueryArgs = typeof CLEAR_QUERY_ARGS;\n\n/** A angular effect that can be nested inside another effect */\nexport const nestedEffect = (fn: () => void, options?: CreateEffectOptions) => {\n const activeConsumer = getActiveConsumer();\n\n setActiveConsumer(null);\n\n const eff = effect(() => {\n fn();\n }, options);\n\n setActiveConsumer(activeConsumer);\n\n return eff;\n};\n\nexport type QueryFeatureFlags = {\n hasWithArgsFeature: boolean;\n shouldAutoExecuteMethod: boolean;\n shouldAutoExecute: boolean;\n hasRouteFunction: boolean;\n onlyManualExecution?: boolean;\n\n /** @see BaseQueryCreatorOptions.multiTabSync */\n isMultiTabSyncEnabled: boolean;\n\n /** Human readable method name */\n method: string;\n};\n\nexport const QueryFeatureType = {\n WITH_ARGS: 'WITH_ARGS',\n WITH_LOGGING: 'WITH_LOGGING',\n WITH_ERROR_HANDLING: 'WITH_ERROR_HANDLING',\n WITH_SUCCESS_HANDLING: 'WITH_SUCCESS_HANDLING',\n WITH_POLLING: 'WITH_POLLING',\n WITH_AUTO_REFRESH: 'WITH_AUTO_REFRESH',\n WITH_RESPONSE_UPDATE: 'WITH_RESPONSE_UPDATE',\n WITH_PAGE_RESET_ON_ERROR: 'WITH_PAGE_RESET_ON_ERROR',\n} as const;\nexport type QueryFeatureType = (typeof QueryFeatureType)[keyof typeof QueryFeatureType];\n\nexport type QueryFeatureContext<TArgs extends QueryArgs> = {\n state: QueryState<TArgs>;\n execute: InternalQueryExecute<TArgs>;\n deps: QueryDependencies;\n flags: QueryFeatureFlags;\n};\n\nexport type QueryFeatureFn<TArgs extends QueryArgs> = (context: QueryFeatureContext<TArgs>) => void;\n\nexport type QueryFeature<TArgs extends QueryArgs> = {\n type: QueryFeatureType;\n fn: (context: QueryFeatureContext<TArgs>) => void;\n\n /** How the feature was configured, for the devtools. Only called while devtools are enabled. */\n devtools?: QueryDevtoolsFeatureDescriber;\n};\n\nexport const createQueryFeature = <TArgs extends QueryArgs>(config: {\n type: QueryFeatureType;\n fn: QueryFeatureFn<TArgs>;\n devtools?: QueryDevtoolsFeatureDescriber;\n}) => {\n return config as QueryFeature<TArgs>;\n};\n\n/**\n * A query feature that allows you to set the arguments of the query.\n * The arguments are read within a computed function, so you can use reactive values.\n *\n * To set the arguments to `null`, return the symbol `CLEAR_QUERY_ARGS`.\n * If you instead return `null`, the arguments won't change.\n *\n * Changing arguments will automatically trigger a new execution of the query if it is eligible for auto execution (e.g. a GET request).\n */\nexport const withArgs = <TArgs extends QueryArgs>(args: () => NoInfer<RequestArgs<TArgs>> | ClearQueryArgs | null) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_ARGS,\n fn: (context) => {\n // `state.args` is reactively backed by this source, so every reader (exec, polling,\n // auto-refresh) always sees the latest value with no pending-effect window. Sentinels are\n // resolved here: CLEAR -> null, `null` (\"don't change\") -> keep the previous value.\n let previous: RequestArgs<TArgs> | null = null;\n const resolve = () => {\n const value = args();\n\n if (value === CLEAR_QUERY_ARGS) {\n previous = null;\n\n return null;\n }\n\n if (value === null) return previous;\n\n previous = value;\n return value;\n };\n\n // Only ever non-null while the devtools are installed. Wrapping the source (rather than reading\n // `state.args` from the outside) is what puts the tracking window around the *evaluation* of the\n // args - a cached read of the computed runs nothing and would record no form at all.\n const formLinks = context.state.subtle.devtoolsFormLinks;\n\n context.state.subtle.setArgsSource(formLinks ? () => formLinks.track(resolve) : resolve);\n\n // Trigger (auto-)execution whenever the resolved args change.\n nestedEffect(\n () => {\n const currArgsNow = context.state.args();\n\n if (currArgsNow === null) return;\n\n untracked(() => {\n if (context.flags.shouldAutoExecute) context.execute({ args: currArgsNow });\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n\nexport type WithPollingFeatureOptions = {\n /** The interval in milliseconds at which the query should be executed */\n interval: number;\n\n /**\n * Whether the query should be executed initially.\n * By default, the query will be executed after the first interval.\n * @default false\n */\n executeInitially?: boolean;\n};\n\n/**\n * A query feature that will automatically execute the query at a given interval.\n * The interval will be cleared when the query is destroyed.\n * The interval will be reset when the arguments of the query change.\n *\n * With the {@link withMultiTabSync} client feature, the same query polled in several\n * tabs is only polled by *one* of them - the other tabs keep their interval running but skip each\n * tick, and get the data through response sharing instead. Which tab does the work is decided per\n * cache key via the Web Locks API, so it moves on its own when that tab is closed or goes into the\n * background.\n *\n * @throws If the query is not eligible for auto execution (e.g. a POST request)\n */\nexport const withPolling = <TArgs extends QueryArgs>(options: WithPollingFeatureOptions) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_POLLING,\n devtools: () => [\n { label: 'interval', value: formatQueryDevtoolsDuration(options.interval) },\n { label: 'execute initially', value: options.executeInitially ? 'yes' : 'no' },\n ],\n fn: (context) => {\n if (!context.flags.shouldAutoExecuteMethod) {\n throw withPollingUsedOnUnsupportedHttpMethod(context.flags.method);\n }\n\n let intervalId: number | null = null;\n\n const sync = context.deps.client.subtle.sync;\n const lockManager = sync?.isPollingDedupeEnabled && context.flags.isMultiTabSyncEnabled ? sync.lockManager : null;\n\n // Only ever set while dedup is active. A tick runs unless we know another tab is taking care of\n // it, so a key we do not have a hold for yet (nothing executed so far) still polls.\n let hold: QueryKeyLockHold | null = null;\n let heldKey: QueryKey | null = null;\n\n const acquire = (key: QueryKey | null) => {\n hold?.release();\n heldKey = key;\n hold = key === null || !lockManager ? null : lockManager.hold(key);\n };\n\n if (lockManager) {\n // The cache key follows the args, but only the repository can derive it - so this tracks the\n // key the last execution resolved to rather than the args themselves.\n nestedEffect(\n () => {\n const key = context.execute.currentRepositoryKey();\n\n untracked(() => acquire(key));\n },\n { injector: context.deps.injector },\n );\n\n // A hidden tab gets its timers throttled to about once a minute, which would starve the\n // visible tabs waiting behind it. Giving the lock up and asking again puts this tab behind\n // anyone already queued - and hands it straight back if nobody else wants the key.\n const handOverWhenHidden = () => {\n if (!document.hidden || !hold?.isHolder()) return;\n\n acquire(heldKey);\n };\n\n document.addEventListener('visibilitychange', handOverWhenHidden);\n\n context.deps.destroyRef.onDestroy(() => {\n document.removeEventListener('visibilitychange', handOverWhenHidden);\n hold?.release();\n });\n }\n\n nestedEffect(\n () => {\n const args = context.state.args();\n\n untracked(() => {\n if (intervalId !== null) clearInterval(intervalId);\n\n // Don't start polling if the query doesn't have args.\n // It should have args because a withArgs feature is present.\n if (args === null && context.flags.hasWithArgsFeature) return;\n\n if (options.executeInitially) {\n context.execute({ args });\n }\n\n intervalId = window.setInterval(() => {\n // The interval keeps running while another tab is the holder, so leadership arriving\n // mid-flight needs no restart and `executeInitially`/interval semantics stay identical.\n if (hold && !hold.isHolder()) return;\n\n context.execute({ args });\n }, options.interval);\n });\n },\n { injector: context.deps.injector },\n );\n\n context.deps.destroyRef.onDestroy(() => intervalId !== null && clearInterval(intervalId));\n },\n });\n};\n\nexport type WithLoggingFeatureOptions<TArgs extends QueryArgs> = {\n /** A function that will be called with the latest http event */\n logFn: (v: RequestHttpEvent<TArgs> | null) => void;\n};\n\n/** A query feature that can be used to log the latest http event */\nexport const withLogging = <TArgs extends QueryArgs>(options: WithLoggingFeatureOptions<TArgs>) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_LOGGING,\n devtools: () => queryDevtoolsFnDetail(options.logFn, 'logFn'),\n fn: (context) => {\n context.state.events$.pipe(takeUntilDestroyed(context.deps.destroyRef)).subscribe((event) => {\n options.logFn(event);\n });\n },\n });\n};\n\nexport type WithErrorHandlingFeatureOptions = {\n /** A function that will be called with the latest error */\n handler: (e: QueryErrorResponse) => void;\n};\n\n/** A query feature that can be used to handle errors */\nexport const withErrorHandling = <TArgs extends QueryArgs>(options: WithErrorHandlingFeatureOptions) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_ERROR_HANDLING,\n devtools: () => queryDevtoolsFnDetail(options.handler, 'handler'),\n fn: (context) => {\n context.state.events$\n .pipe(\n filter((event): event is HttpErrorEvent => event.type === 'error'),\n takeUntilDestroyed(context.deps.destroyRef),\n )\n .subscribe((event) => {\n options.handler(event.error);\n });\n },\n });\n};\n\nexport type WithSuccessHandlingFeatureOptions<TArgs extends QueryArgs> = {\n /** A function that will be called with the latest response */\n handler: (data: NonNullable<ResponseType<TArgs>>) => void;\n};\n\n/** A query feature that can be used to handle successful responses */\nexport const withSuccessHandling = <TArgs extends QueryArgs>(options: WithSuccessHandlingFeatureOptions<TArgs>) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_SUCCESS_HANDLING,\n devtools: () => queryDevtoolsFnDetail(options.handler, 'handler'),\n fn: (context) => {\n context.state.events$\n .pipe(\n filter((event) => event.type === HttpEventType.Response),\n takeUntilDestroyed(context.deps.destroyRef),\n )\n .subscribe(() => {\n options.handler(context.state.response() as NonNullable<ResponseType<TArgs>>);\n });\n },\n });\n};\n\nexport type WithAutoRefreshFeatureOptions = {\n /** The signals that should trigger a refresh of the query */\n onSignalChanges: Signal<unknown>[];\n\n /** Whether to ignore the `onlyManualExecution` query config flag */\n ignoreOnlyManualExecution?: boolean;\n};\n\n/**\n * A query feature that will automatically execute the query when any of the provided signals change\n * @throws If the query is not eligible for auto execution (e.g. a POST request)\n * @throws If the query has the `onlyManualExecution` query config flag set and `ignoreOnlyManualExecution` is not set\n */\nexport const withAutoRefresh = <TArgs extends QueryArgs>(options: WithAutoRefreshFeatureOptions) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_AUTO_REFRESH,\n devtools: () => [\n { label: 'signals', value: String(options.onSignalChanges.length) },\n ...(options.ignoreOnlyManualExecution ? [{ label: 'ignores manual only', value: 'yes' }] : []),\n ],\n fn: (context) => {\n if (!context.flags.shouldAutoExecuteMethod) {\n throw withAutoRefreshUsedOnUnsupportedHttpMethod(context.flags.method);\n }\n\n if (context.flags.onlyManualExecution && !options.ignoreOnlyManualExecution) {\n throw withAutoRefreshUsedInManualQuery();\n }\n\n nestedEffect(\n () => {\n for (const signal of options.onSignalChanges) {\n signal();\n }\n\n untracked(() => {\n const args = context.state.args();\n\n // Don't start polling if the query doesn't have args.\n // It should have args because a withArgs feature is present.\n if (args === null && context.flags.hasWithArgsFeature) return;\n\n context.execute({ args });\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n\nexport type WithResponseUpdateFeatureFnData<TArgs extends QueryArgs> = {\n /** The current response of the query */\n currentResponse: ResponseType<TArgs> | null;\n};\n\nexport type WithResponseUpdateFeatureOptions<TArgs extends QueryArgs> = {\n /**\n * A function that will be called with the latest response\n * If the function returns `null`, the response will not be updated.\n * Otherwise, the response will be updated with the returned value.\n * The function will be called in a reactive signal context.\n * If the query get's executed after the response was updated, the response will be set the the fresh data received from the server.\n *\n * This feature is most useful in combination with web sockets where the data received from the socket might be more up-to-date than the data received previously.\n *\n * @example\n * const matchEvents = mySocket.joinRoom('match-events');\n *\n * const myMatchQuery = getMatch(\n * withArgs(() => ({ matchId: 1 })),\n * withResponseUpdate(({ currentResponse }) => {\n * const matchEvent = matchEvents();\n *\n * if (!matchEvent) return null;\n *\n * // Do some checks here. This is just a very simple example.\n * // To apply partial updates, you can use the spread operator in combination with the current response.\n *\n * return matchEvent;\n * })\n * )\n */\n updater: (data: WithResponseUpdateFeatureFnData<TArgs>) => ResponseType<TArgs> | null;\n};\n\nexport const withResponseUpdate = <TArgs extends QueryArgs>(options: WithResponseUpdateFeatureOptions<TArgs>) => {\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_RESPONSE_UPDATE,\n devtools: () => queryDevtoolsFnDetail(options.updater, 'updater'),\n fn: (context) => {\n nestedEffect(\n () => {\n const currentResponse = untracked(() => context.state.response());\n const response = options.updater({ currentResponse });\n\n if (response === null) return;\n\n untracked(() => {\n context.state.rawResponse.set(response);\n });\n },\n { injector: context.deps.injector },\n );\n },\n });\n};\n\n/**\n * Whether an error means the requested page is out of range: HTTP `416`, or a\n * `500` carrying a Symfony/Pagerfanta out-of-range detail (the dev-mode shape).\n * Exported so it can also be used as the predicate of a `withErrorHandling` handler.\n */\nexport const isPageOutOfRangeError = (error: QueryErrorResponse) => {\n if (error.code === 416) return true;\n\n return error.code === 500 && isSymfonyPagerfantaOutOfRangeError(error.raw.error);\n};\n\nexport type WithPageResetOnErrorFeatureOptions = {\n /**\n * Which errors trigger the reset.\n * @default isPageOutOfRangeError (HTTP 416, or a dev-mode 500 Pagerfanta out-of-range error)\n */\n when?: (error: QueryErrorResponse) => boolean;\n} & (\n | {\n /** The writable page signal to reset. */\n page: WritableSignal<number>;\n /**\n * The value to reset the page to.\n * @default 1\n */\n resetTo?: number;\n reset?: never;\n }\n | {\n /**\n * Called when a matching error occurs. Reset whatever drives the page here —\n * a signal (`() => page.set(1)`) or a query form (`() => qf.resetFieldToDefault('page')`).\n */\n reset: () => void;\n page?: never;\n resetTo?: never;\n }\n);\n\n/**\n * A query feature that resets the page when the current page becomes out of range\n * - e.g. after a filter shrinks the result set below the current page. It reacts\n * to the query's error events and resets the page source; the normal reactive\n * re-execution then runs with the corrected page.\n *\n * Because query args are reactively sourced, this fixes the *source* (a signal or\n * query form field) rather than patching args directly - so the change sticks.\n *\n * @example\n * // signal-driven page\n * const users = getUsers(\n * withArgs(() => ({ queryParams: { page: page() } })),\n * withPageResetOnError({ page }),\n * );\n *\n * @example\n * // query-form-driven page\n * const users = getUsers(\n * withArgs(() => ({ queryParams: qf.value() })),\n * withPageResetOnError({ reset: () => qf.resetFieldToDefault('page') }),\n * );\n */\nexport const withPageResetOnError = <TArgs extends QueryArgs>(options: WithPageResetOnErrorFeatureOptions) => {\n const matches = options.when ?? isPageOutOfRangeError;\n\n return createQueryFeature<TArgs>({\n type: QueryFeatureType.WITH_PAGE_RESET_ON_ERROR,\n devtools: () => [\n { label: 'resets', value: options.reset ? 'custom callback' : 'page signal' },\n ...(options.reset ? [] : [{ label: 'reset to', value: String(options.resetTo ?? 1) }]),\n { label: 'when', value: options.when ? 'custom' : 'page out of range' },\n ],\n fn: (context) => {\n context.state.events$\n .pipe(\n filter((event): event is HttpErrorEvent => event.type === 'error'),\n takeUntilDestroyed(context.deps.destroyRef),\n )\n .subscribe((event) => {\n if (!matches(event.error)) return;\n\n if (options.reset) {\n options.reset();\n } else {\n options.page.set(options.resetTo ?? 1);\n }\n });\n },\n });\n};\n","import { HttpEventType } from '@angular/common/http';\nimport { Signal, WritableSignal, computed, linkedSignal, signal } from '@angular/core';\nimport { Observable, Subject, Subscription } from 'rxjs';\nimport { QueryDevtoolsFormLinksRecorder } from '../devtools/query-devtools-form-links';\nimport { QueryDevtoolsOverridesRecorder } from '../devtools/query-devtools-overrides';\nimport { QueryDevtoolsStatsRecorder } from '../devtools/query-devtools-stats';\nimport { HttpRequest, HttpRequestLoadingState, RequestHttpEvent } from './http-request';\nimport { QueryArgs, RawResponseType, RequestArgs, ResponseType } from './query';\nimport { QueryErrorResponse } from './query-error-response';\n\nexport type SetupQueryStateOptions<TArgs extends QueryArgs> = {\n transformResponse?: (rawResponse: RawResponseType<TArgs>) => ResponseType<TArgs>;\n\n /**\n * The devtools stats recorder to feed from this state's executions, or nothing when the devtools are\n * not installed.\n */\n devtoolsStats?: QueryDevtoolsStatsRecorder | null;\n\n /**\n * The recorder that notes which query forms the args source reads, or nothing when the devtools are\n * not installed.\n */\n devtoolsFormLinks?: QueryDevtoolsFormLinksRecorder | null;\n\n /**\n * The recorder of response overrides armed on this query, or nothing when the devtools are not\n * installed. Replayed against every response that settles into {@link QueryState.rawResponse}.\n */\n devtoolsOverrides?: QueryDevtoolsOverridesRecorder | null;\n};\n\nexport type QueryStateSubtle<TArgs extends QueryArgs> = {\n request: WritableSignal<HttpRequest<TArgs> | null>;\n rawResponse: WritableSignal<RawResponseType<TArgs> | null>;\n\n /**\n * Forwards the given request's discrete event stream onto the query-level `events$`.\n * Called by `queryExecute` whenever a request is (re-)executed.\n */\n bindRequestEvents: (request: HttpRequest<TArgs>) => void;\n\n /**\n * Installs the reactive source that backs `state.args`. The `withArgs` feature uses this so that\n * `state.args` always reflects the latest args (pulled from the reactive source on read) instead\n * of being push-updated by an effect that may not have run yet. Without a `withArgs` feature the\n * default source returns `null`.\n */\n setArgsSource: (source: () => RequestArgs<TArgs> | null) => void;\n\n /** @see SetupQueryStateOptions.devtoolsStats */\n devtoolsStats: QueryDevtoolsStatsRecorder | null;\n\n /** @see SetupQueryStateOptions.devtoolsFormLinks */\n devtoolsFormLinks: QueryDevtoolsFormLinksRecorder | null;\n};\n\nexport type QueryState<TArgs extends QueryArgs> = {\n rawResponse: WritableSignal<RawResponseType<TArgs> | null>;\n response: Signal<ResponseType<TArgs> | null>;\n args: WritableSignal<RequestArgs<TArgs> | null>;\n latestHttpEvent: WritableSignal<RequestHttpEvent<TArgs> | null>;\n loading: WritableSignal<HttpRequestLoadingState | null>;\n error: WritableSignal<QueryErrorResponse | null>;\n lastTimeExecutedAt: WritableSignal<number | null>;\n lastTriggeredBy: WritableSignal<string | null>;\n executionState: Signal<QueryExecutionState<TArgs> | null>;\n\n /**\n * A discrete, query-level stream of every request event, fed synchronously from the current\n * request's `events$` at the moment each event occurs. Side-effect features\n * (success/error/logging) subscribe to this instead of edge-detecting on the shared, resettable\n * `response`/`error`/`latestHttpEvent` signals - so they cannot miss a transition when the next\n * execution swaps the underlying request.\n */\n events$: Observable<RequestHttpEvent<TArgs>>;\n\n subtle: QueryStateSubtle<TArgs>;\n};\n\nexport type QueryExecutionStateSuccess<TArgs extends QueryArgs> = {\n type: 'success';\n response: ResponseType<TArgs>;\n};\n\nexport type QueryExecutionStateFailure = {\n type: 'failure';\n error: QueryErrorResponse;\n};\n\nexport type QueryExecutionStateLoadingWithNoResponse = {\n type: 'loading';\n hasCachedResponse: false;\n loading: HttpRequestLoadingState;\n};\n\nexport type QueryExecutionStateLoadingWithCachedResponse<TArgs extends QueryArgs> = {\n type: 'loading';\n hasCachedResponse: true;\n loading: HttpRequestLoadingState;\n cachedResponse: ResponseType<TArgs>;\n};\n\nexport type QueryExecutionStateLoading<TArgs extends QueryArgs> =\n QueryExecutionStateLoadingWithNoResponse | QueryExecutionStateLoadingWithCachedResponse<TArgs>;\n\nexport type QueryExecutionState<TArgs extends QueryArgs> =\n QueryExecutionStateSuccess<TArgs> | QueryExecutionStateFailure | QueryExecutionStateLoading<TArgs>;\n\nexport const setupQueryState = <TArgs extends QueryArgs>(options: SetupQueryStateOptions<TArgs>) => {\n const request = signal<HttpRequest<TArgs> | null>(null);\n\n const rawResponse = linkedSignal(() => {\n const raw = request()?.response() ?? null;\n return options.devtoolsOverrides ? (options.devtoolsOverrides.apply(raw) as typeof raw) : raw;\n });\n const response = computed(() => {\n const raw = rawResponse();\n if (raw === null) return null;\n return options.transformResponse ? options.transformResponse(raw) : (raw as ResponseType<TArgs>);\n });\n const loading = linkedSignal(() => request()?.loading() ?? null);\n const error = linkedSignal(() => request()?.error() ?? null);\n const latestHttpEvent = linkedSignal(() => request()?.currentEvent() ?? null);\n\n // `args` is reactively sourced: reads always reflect the latest value from the installed source\n // (e.g. the `withArgs` feature), so there is no stale window between a source change and an\n // effect writing it. It stays writable (reset / auth-error clear it via `.set(null)`); a manual\n // set is overridden again the next time the source's dependencies change.\n const argsSource = signal<() => RequestArgs<TArgs> | null>(() => null);\n const args = linkedSignal(() => argsSource()());\n const setArgsSource = (source: () => RequestArgs<TArgs> | null) => argsSource.set(source);\n\n const lastTimeExecutedAt = signal<number | null>(null);\n const lastTriggeredBy = signal<string | null>(null);\n\n const requestEvents$ = new Subject<RequestHttpEvent<TArgs>>();\n let requestEventsSubscription = Subscription.EMPTY;\n const bindRequestEvents = (request: HttpRequest<TArgs>) => {\n requestEventsSubscription.unsubscribe();\n requestEventsSubscription = request.events$.subscribe((event) => requestEvents$.next(event));\n };\n\n const executionState = computed<QueryExecutionState<TArgs> | null>(() => {\n const currentResponse = response();\n const currentError = error();\n const currentLoading = loading();\n\n if (currentLoading) {\n if (currentResponse) {\n return {\n type: 'loading',\n hasCachedResponse: true,\n loading: currentLoading,\n cachedResponse: currentResponse,\n };\n }\n\n return {\n type: 'loading',\n hasCachedResponse: false,\n loading: currentLoading,\n };\n } else if (currentError) {\n return {\n type: 'failure',\n error: currentError,\n };\n } else if (currentResponse !== null || latestHttpEvent()?.type === HttpEventType.Response) {\n // A response event having arrived is what makes the execution a success, not a truthy body: a 204 (or any\n // other empty payload) sets `response` to `null`, which would otherwise be indistinguishable from a query\n // that never ran - leaving `filterSuccess`, `onSuccess` and the success handlers waiting forever.\n return {\n type: 'success',\n response: currentResponse as ResponseType<TArgs>,\n };\n } else {\n return null;\n }\n });\n\n const state: QueryState<TArgs> = {\n rawResponse,\n response,\n args,\n latestHttpEvent,\n loading,\n error,\n lastTimeExecutedAt,\n lastTriggeredBy,\n executionState,\n events$: requestEvents$.asObservable(),\n subtle: {\n request,\n rawResponse,\n bindRequestEvents,\n setArgsSource,\n devtoolsStats: options.devtoolsStats ?? null,\n devtoolsFormLinks: options.devtoolsFormLinks ?? null,\n },\n };\n\n return state;\n};\n","import { HttpEventType } from '@angular/common/http';\nimport { effect, signal, untracked } from '@angular/core';\nimport { wrapAsObservableSignal } from './observable-signal';\nimport { QueryArgs, QuerySnapshot } from './query';\nimport { injectQueryContext } from './query-context';\nimport { QueryDependencies } from './query-dependencies';\nimport { InternalQueryExecute } from './query-execute';\nimport { QueryState, setupQueryState } from './query-state';\n\nexport type CreateQuerySnapshotOptions<TArgs extends QueryArgs> = {\n state: QueryState<TArgs>;\n execute: InternalQueryExecute<TArgs>;\n deps: QueryDependencies;\n};\n\nexport const createQuerySnapshotFn = <TArgs extends QueryArgs>(options: CreateQuerySnapshotOptions<TArgs>) => {\n const { state } = options;\n const context = injectQueryContext();\n\n const snapshotFn = () => {\n const snapshotState = setupQueryState<TArgs>({});\n const isAlive = signal(true);\n\n const killEffectRef = effect(\n () => {\n const currentLoading = state.loading();\n const currentError = state.error();\n const currentResponse = state.response();\n const currentArgs = state.args();\n const currentLatestHttpEvent = state.latestHttpEvent();\n const currentLastTimeExecutedAt = state.lastTimeExecutedAt();\n const currentLastTriggeredBy = state.lastTriggeredBy();\n\n untracked(() => {\n snapshotState.args.set(currentArgs);\n snapshotState.error.set(currentError);\n snapshotState.lastTimeExecutedAt.set(currentLastTimeExecutedAt);\n snapshotState.lastTriggeredBy.set(currentLastTriggeredBy);\n snapshotState.latestHttpEvent.set(currentLatestHttpEvent);\n snapshotState.loading.set(currentLoading);\n snapshotState.rawResponse.set(currentResponse);\n\n if (currentLoading) return;\n\n const hasCompletedResponse = currentLatestHttpEvent?.type === HttpEventType.Response;\n if (!hasCompletedResponse && !currentError) return;\n\n // kill the effect once loading is done and we either have a response or an error\n killEffectRef.destroy();\n isAlive.set(false);\n });\n },\n { injector: context.deps.injector },\n );\n\n const snapshot: QuerySnapshot<TArgs> = {\n args: wrapAsObservableSignal(snapshotState.args.asReadonly(), context.deps.injector),\n response: wrapAsObservableSignal(snapshotState.response, context.deps.injector),\n latestHttpEvent: wrapAsObservableSignal(snapshotState.latestHttpEvent.asReadonly(), context.deps.injector),\n loading: wrapAsObservableSignal(snapshotState.loading.asReadonly(), context.deps.injector),\n error: wrapAsObservableSignal(snapshotState.error.asReadonly(), context.deps.injector),\n lastTimeExecutedAt: wrapAsObservableSignal(snapshotState.lastTimeExecutedAt.asReadonly(), context.deps.injector),\n triggeredBy: wrapAsObservableSignal(snapshotState.lastTriggeredBy.asReadonly(), context.deps.injector),\n isAlive: wrapAsObservableSignal(isAlive.asReadonly(), context.deps.injector),\n id: wrapAsObservableSignal(options.execute.currentRepositoryKey, context.deps.injector),\n executionState: wrapAsObservableSignal(snapshotState.executionState, context.deps.injector),\n };\n\n return snapshot;\n };\n\n return snapshotFn;\n};\n","import { HttpEventType } from '@angular/common/http';\nimport { effect, runInInjectionContext } from '@angular/core';\nimport { describeQueryDevtoolsFeatures } from '../devtools/query-devtools-features';\nimport {\n createQueryDevtoolsFormLinksRecorder,\n createQueryDevtoolsOverridesRecorder,\n createQueryDevtoolsStatsRecorder,\n registerQueryDevtoolsEntry,\n} from '../devtools/query-devtools-hook';\nimport { CreateGqlQueryOptions } from '../gql/gql-query';\nimport { isCreateGqlQueryOptions } from './internal/gql-options-guard';\nimport { AnyCreateGqlQueryCreatorOptions, GqlQueryMethod } from '../gql/gql-query-creator';\nimport { HttpRequestLoadingState } from './http-request';\nimport { wrapAsObservableSignal } from './observable-signal';\nimport { CreateQueryOptions, Query, QueryArgs, RawResponseType, ReadonlyQuery, ResponseType } from './query';\nimport { QueryErrorResponse } from './query-error-response';\nimport { AnyCreateQueryClientResult } from './query-client';\nimport {\n CreateQueryCreatorOptions,\n InternalCreateQueryCreatorOptions,\n QueryConfig,\n QueryMethod,\n} from './query-creator';\nimport { QueryDependencies, setupQueryDependencies } from './query-dependencies';\nimport {\n queryFeatureUsedMultipleTimes,\n silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent,\n withArgsQueryFeatureMissingButRouteIsFunction,\n} from './query-errors';\nimport { InternalQueryExecute } from './query-execute';\nimport { QueryFeature, QueryFeatureContext, QueryFeatureFlags, QueryFeatureType } from './query-features';\nimport { createQuerySnapshotFn } from './query-snapshot';\nimport { QueryState, setupQueryState } from './query-state';\n\nexport const shouldAutoExecuteQuery = (method: QueryMethod) => {\n return method === 'GET' || method === 'HEAD' || method === 'OPTIONS';\n};\n\nexport const shouldAutoExecuteGqlQuery = (method: GqlQueryMethod) => {\n return method === 'QUERY';\n};\n\nexport const getQueryFeatureUsage = <TArgs extends QueryArgs>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: CreateQueryOptions<TArgs> | CreateGqlQueryOptions<any>,\n) => {\n const { creator, features, queryConfig, creatorInternals } = options;\n\n const hasWithArgsFeature = features.some((f) => f.type === QueryFeatureType.WITH_ARGS);\n const shouldAutoExecuteMethod = isCreateGqlQueryOptions(options)\n ? shouldAutoExecuteGqlQuery(options.creatorInternals.method)\n : shouldAutoExecuteQuery(options.creatorInternals.method);\n const hasRouteFunction =\n typeof (creatorInternals as InternalCreateQueryCreatorOptions<TArgs>)?.route === 'function' ||\n typeof (creator as AnyCreateGqlQueryCreatorOptions)?.route === 'function';\n const shouldAutoExecute = shouldAutoExecuteMethod && !queryConfig.onlyManualExecution;\n\n if (hasRouteFunction && !hasWithArgsFeature && !queryConfig.silenceMissingWithArgsFeatureError) {\n throw withArgsQueryFeatureMissingButRouteIsFunction();\n }\n\n if (hasWithArgsFeature && queryConfig.silenceMissingWithArgsFeatureError) {\n throw silenceMissingWithArgsFeatureErrorUsedButWithArgsPresent();\n }\n\n const featureFnContext: QueryFeatureFlags = {\n hasWithArgsFeature,\n shouldAutoExecuteMethod,\n shouldAutoExecute,\n hasRouteFunction,\n onlyManualExecution: queryConfig.onlyManualExecution,\n isMultiTabSyncEnabled: creator?.multiTabSync !== false,\n method: isCreateGqlQueryOptions(options)\n ? `GQL ${options.creatorInternals.method}`\n : options.creatorInternals.method,\n };\n\n return featureFnContext;\n};\n\nexport const applyQueryFeatures = <TArgs extends QueryArgs>(\n features: QueryFeature<TArgs>[],\n context: QueryFeatureContext<TArgs>,\n) => {\n const featureTypes = new Set<QueryFeatureType>();\n\n for (const feature of features) {\n if (featureTypes.has(feature.type)) {\n throw queryFeatureUsedMultipleTimes(feature.type);\n }\n\n featureTypes.add(feature.type);\n feature.fn(context);\n }\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const maybeExecute = (options: { flags: QueryFeatureFlags; execute: InternalQueryExecute<any> }) => {\n if (options.flags.shouldAutoExecute && !options.flags.hasRouteFunction && !options.flags.hasWithArgsFeature) {\n options.execute();\n }\n};\n\nexport type CreateQueryObjectOptions<TArgs extends QueryArgs> = {\n state: QueryState<TArgs>;\n deps: QueryDependencies;\n execute: InternalQueryExecute<TArgs>;\n};\n\nexport const createQueryObject = <TArgs extends QueryArgs>(options: CreateQueryObjectOptions<TArgs>) => {\n const { state, execute, deps } = options;\n\n const destroy = () => deps.injector.destroy();\n const setResponse = (response: ResponseType<TArgs>) => state.rawResponse.set(response as RawResponseType<TArgs>);\n const setLoading = (loading: HttpRequestLoadingState | null) => state.loading.set(loading);\n const setError = (error: QueryErrorResponse | null) => state.error.set(error);\n const createSnapshot = createQuerySnapshotFn({ state, execute, deps });\n\n // Pre-wrap all public signals once so both `query` and `roQuery` share the same instances.\n const wrappedArgs = wrapAsObservableSignal(state.args.asReadonly(), deps.injector);\n const wrappedResponse = wrapAsObservableSignal(state.response, deps.injector);\n const wrappedLatestHttpEvent = wrapAsObservableSignal(state.latestHttpEvent.asReadonly(), deps.injector);\n const wrappedLoading = wrapAsObservableSignal(state.loading.asReadonly(), deps.injector);\n const wrappedError = wrapAsObservableSignal(state.error.asReadonly(), deps.injector);\n const wrappedLastTimeExecutedAt = wrapAsObservableSignal(state.lastTimeExecutedAt.asReadonly(), deps.injector);\n const wrappedTriggeredBy = wrapAsObservableSignal(state.lastTriggeredBy.asReadonly(), deps.injector);\n const wrappedId = wrapAsObservableSignal(execute.currentRepositoryKey, deps.injector);\n const wrappedExecutionState = wrapAsObservableSignal(state.executionState, deps.injector);\n const wrappedRequest = wrapAsObservableSignal(state.subtle.request.asReadonly(), deps.injector);\n\n const asReadonly = () => {\n const roQuery: ReadonlyQuery<TArgs> = {\n args: wrappedArgs,\n response: wrappedResponse,\n latestHttpEvent: wrappedLatestHttpEvent,\n loading: wrappedLoading,\n error: wrappedError,\n lastTimeExecutedAt: wrappedLastTimeExecutedAt,\n triggeredBy: wrappedTriggeredBy,\n id: wrappedId,\n createSnapshot,\n executionState: wrappedExecutionState,\n };\n\n return roQuery;\n };\n\n const query: Query<TArgs> = {\n execute,\n args: wrappedArgs,\n response: wrappedResponse,\n latestHttpEvent: wrappedLatestHttpEvent,\n loading: wrappedLoading,\n error: wrappedError,\n lastTimeExecutedAt: wrappedLastTimeExecutedAt,\n triggeredBy: wrappedTriggeredBy,\n id: wrappedId,\n createSnapshot,\n reset: execute.reset,\n asReadonly,\n executionState: wrappedExecutionState,\n subtle: {\n destroy,\n setResponse,\n setLoading,\n setError,\n request: wrappedRequest,\n destroyRef: deps.scopeDestroyRef,\n injector: deps.injector,\n },\n };\n\n return query;\n};\n\nexport type ExecuteFactory<TArgs extends QueryArgs, TInternals> = (options: {\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n creator?: CreateQueryCreatorOptions;\n creatorInternals: TInternals;\n queryConfig: QueryConfig;\n}) => InternalQueryExecute<TArgs>;\n\nexport type CreateBaseQueryOptions<TArgs extends QueryArgs, TInternals> = {\n creator?: CreateQueryCreatorOptions;\n creatorInternals: TInternals;\n features: QueryFeature<TArgs>[];\n queryConfig: QueryConfig;\n executeFactory: ExecuteFactory<TArgs, TInternals>;\n};\n\nexport const createBaseQuery = <TArgs extends QueryArgs, TInternals extends { client: AnyCreateQueryClientResult }>(\n options: CreateBaseQueryOptions<TArgs, TInternals>,\n) => {\n const client = options.creatorInternals.client;\n\n const deps = setupQueryDependencies({\n client,\n queryConfig: options.queryConfig,\n });\n\n return runInInjectionContext(deps.injector, () => {\n const devtoolsStats = createQueryDevtoolsStatsRecorder();\n const devtoolsFormLinks = createQueryDevtoolsFormLinksRecorder();\n const devtoolsOverrides = createQueryDevtoolsOverridesRecorder();\n\n const state = setupQueryState<TArgs>({\n transformResponse: options.creator?.transformResponse,\n devtoolsStats,\n devtoolsFormLinks,\n devtoolsOverrides,\n });\n const flags = getQueryFeatureUsage(options as unknown as Parameters<typeof getQueryFeatureUsage>[0]);\n\n const execute = options.executeFactory({\n deps,\n state,\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n queryConfig: options.queryConfig,\n });\n\n const featureFnContext: QueryFeatureContext<TArgs> = {\n state,\n execute,\n flags,\n deps,\n };\n\n applyQueryFeatures(options.features, featureFnContext);\n\n maybeExecute({ execute, flags });\n\n const query = createQueryObject({ state, execute, deps });\n\n // Only ever non-null while the devtools are installed, so this whole block - the entry and the\n // per-response payload measuring behind it - is dead code in an app without them.\n if (devtoolsStats) {\n const statsSubscription = state.events$.subscribe((event) => {\n if (event.type === 'error') {\n devtoolsStats.recordError({ faulted: event.faulted, error: event.error });\n } else if (event.type === HttpEventType.Response) {\n devtoolsStats.recordResponse({ headers: event.headers, body: event.body });\n }\n });\n\n deps.destroyRef.onDestroy(() => statsSubscription.unsubscribe());\n\n // A retry happens inside the request, which is shared by every query hitting the same cache key -\n // so the recorder reads it off the request instead of being handed down into one. `recordRetry` is\n // idempotent per attempt, which is what makes reading a signal a safe way to count them.\n effect(() => {\n const retry = state.subtle.request()?.subtle.retryState();\n\n if (retry) devtoolsStats.recordRetry({ attempt: retry.attempt });\n });\n\n const unregister = registerQueryDevtoolsEntry({\n kind: 'query',\n handle: query,\n clientRef: client,\n stats: devtoolsStats,\n formLinks: devtoolsFormLinks ?? undefined,\n overrides: devtoolsOverrides ?? undefined,\n route:\n (options.creatorInternals as { route?: unknown }).route ??\n (options.creator as { route?: unknown } | undefined)?.route ??\n null,\n authProviderRef: (options.creatorInternals as { authProvider?: { token?: unknown } }).authProvider,\n meta: {\n clientBaseUrl: deps.client.baseUrl,\n method: flags.method,\n features: describeQueryDevtoolsFeatures(options.features),\n queryConfig: options.queryConfig,\n creator: options.creator,\n repository: deps.client.repository,\n client: deps.client,\n element: deps.hostElement,\n gqlQuery: (options.creatorInternals as { query?: string }).query,\n },\n });\n\n deps.destroyRef.onDestroy(unregister);\n }\n\n return query;\n });\n};\n","import { signal, WritableSignal } from '@angular/core';\nimport { QueryArgs, RequestArgs } from './query';\nimport { circularQueryDependency } from './query-errors';\nimport { CreateQueryExecuteOptions } from './query-execute';\n\nexport type ResetExecuteStateOptions<TArgs extends QueryArgs> = {\n executeOptions: Pick<CreateQueryExecuteOptions<TArgs>, 'state' | 'deps'>;\n executeState: QueryExecuteState;\n};\n\nexport const resetExecuteState = <TArgs extends QueryArgs>(options: ResetExecuteStateOptions<TArgs>) => {\n const { executeState, executeOptions: opts } = options;\n const { state } = opts;\n\n opts.deps.client.repository.unbind(executeState.previousKey(), opts.deps.destroyRef);\n\n state.args.set(null);\n state.error.set(null);\n state.latestHttpEvent.set(null);\n state.loading.set(null);\n state.rawResponse.set(null);\n state.lastTimeExecutedAt.set(null);\n state.lastTriggeredBy.set(null);\n};\n\nexport type QueryExecuteState = {\n previousKey: WritableSignal<string | null>;\n};\n\nexport const setupQueryExecuteState = (): QueryExecuteState => {\n return {\n previousKey: signal(null),\n };\n};\n\nexport type RunQueryExecuteOptions = {\n allowCache?: boolean;\n triggeredBy?: string;\n};\n\nexport type QueryExecuteOptions<TArgs extends QueryArgs> = {\n executeOptions: CreateQueryExecuteOptions<TArgs>;\n executeState: QueryExecuteState;\n\n args: RequestArgs<TArgs> | null;\n options?: RunQueryExecuteOptions;\n\n isSecure?: boolean;\n\n /** @see QueryRepositoryRequestOptions.isRefreshable */\n isRefreshable?: boolean;\n};\n\nexport const queryExecute = <TArgs extends QueryArgs>(options: QueryExecuteOptions<TArgs>) => {\n const { executeOptions, args, executeState, options: runQueryOptions, isSecure, isRefreshable } = options;\n const { deps, state, creator, creatorInternals, queryConfig } = executeOptions;\n\n const { key, request, executed } = deps.client.repository.request({\n route: creatorInternals.route,\n method: creatorInternals.method,\n args,\n creatorOptions: creator,\n retryFn: creator?.retryFn,\n consumerDestroyRef: deps.destroyRef,\n key: queryConfig.key,\n previousKey: executeState.previousKey(),\n runQueryOptions,\n isSecure,\n isRefreshable,\n silenceUncacheableAllowCacheError: queryConfig.silenceUncacheableAllowCacheError,\n });\n\n executeState.previousKey.set(key);\n state.lastTimeExecutedAt.set(Date.now());\n state.lastTriggeredBy.set(runQueryOptions?.triggeredBy ?? null);\n state.subtle.request.set(request);\n state.subtle.bindRequestEvents(request);\n state.subtle.devtoolsStats?.recordExecution({ didRequest: executed, body: args?.body, url: request.url });\n};\n\nexport const circularQueryDependencyChecker = () => {\n let lastTriggerTs = 0;\n let illegalWrites = 0;\n\n // Typing this as number will throw an type error during testing since it is of type Timeout in a node env.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let timeout: any = null;\n\n const check = () => {\n const now = performance.now();\n\n if (now - lastTriggerTs < 100) {\n illegalWrites++;\n\n if (illegalWrites > 5) {\n throw circularQueryDependency();\n }\n }\n\n lastTriggerTs = now;\n\n if (timeout) clearTimeout(timeout);\n\n timeout = setTimeout(() => {\n illegalWrites = 0;\n }, 100);\n };\n\n return {\n check,\n };\n};\n","import { Signal } from '@angular/core';\nimport { QueryArgs, RequestArgs } from './query';\nimport { CreateQueryCreatorOptions, InternalCreateQueryCreatorOptions, QueryConfig } from './query-creator';\nimport { QueryDependencies } from './query-dependencies';\nimport {\n circularQueryDependencyChecker,\n queryExecute,\n resetExecuteState,\n RunQueryExecuteOptions,\n setupQueryExecuteState,\n} from './query-execute-utils';\nimport { QueryKey } from './query-repository';\nimport { QueryState } from './query-state';\n\nexport type CreateQueryExecuteOptions<TArgs extends QueryArgs> = {\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n creator?: CreateQueryCreatorOptions;\n creatorInternals: InternalCreateQueryCreatorOptions<TArgs>;\n queryConfig: QueryConfig;\n};\n\nexport type QueryExecuteArgs<TArgs extends QueryArgs> = {\n args?: RequestArgs<TArgs> | null;\n options?: RunQueryExecuteOptions;\n};\n\nexport type InternalQueryExecute<TArgs extends QueryArgs> = {\n (executeArgs?: QueryExecuteArgs<TArgs>): void;\n reset: () => void;\n currentRepositoryKey: Signal<QueryKey | null>;\n};\n\nexport type QueryExecute<TArgs extends QueryArgs> = (executeArgs?: QueryExecuteArgs<TArgs>) => void;\n\nexport const createExecuteFn = <TArgs extends QueryArgs>(\n executeOptions: CreateQueryExecuteOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const executeState = setupQueryExecuteState();\n const circularChecker = circularQueryDependencyChecker();\n\n const reset = () => resetExecuteState({ executeState, executeOptions });\n\n const exec = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n circularChecker.check();\n\n const { args = executeOptions.state.args(), options } = executeArgs ?? {};\n\n queryExecute({ executeOptions, executeState, args, options });\n };\n\n exec['reset'] = reset;\n\n exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();\n\n return exec;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { HttpHeaders } from '@angular/common/http';\nimport { DestroyRef, Injector } from '@angular/core';\nimport { createBaseQuery } from './base-query-factory';\nimport { HttpRequest, HttpRequestLoadingState, RequestHttpEvent } from './http-request';\nimport { ObservableSignal } from './observable-signal';\nimport { CreateQueryCreatorOptions, InternalCreateQueryCreatorOptions, QueryConfig } from './query-creator';\nimport { QueryErrorResponse } from './query-error-response';\nimport { createExecuteFn, QueryExecute } from './query-execute';\nimport { QueryFeature } from './query-features';\nimport { QueryExecutionState } from './query-state';\n\nexport type QueryArgs = {\n response?: any;\n rawResponse?: any;\n pathParams?: Record<string, string | number>;\n queryParams?: any;\n body?: any;\n headers?: HttpHeaders | (() => HttpHeaders);\n};\n\nexport type ResponseType<T extends QueryArgs | null> = T extends QueryArgs ? T['response'] : never;\nexport type RawResponseType<T extends QueryArgs | null> = T extends QueryArgs\n ? T['rawResponse'] extends undefined\n ? T['response']\n : T['rawResponse']\n : never;\nexport type PathParamsType<T extends QueryArgs | null> = T extends QueryArgs ? T['pathParams'] : never;\nexport type QueryParamsType<T extends QueryArgs | null> = T extends QueryArgs ? T['queryParams'] : never;\nexport type BodyType<T extends QueryArgs | null> = T extends QueryArgs ? T['body'] : never;\n\nexport type RequestArgs<T extends QueryArgs | null> = T extends QueryArgs ? Omit<T, 'response'> : never;\n\n/**\n * The empty request-args object, typed to satisfy `RequestArgs<TArgs>` for a query that takes no\n * arguments - its `QueryArgs` is just `{ response: T }`, so `RequestArgs` resolves to `{}`.\n *\n * Only needed in generic code, where `TArgs` is still a type parameter and TS therefore cannot see\n * that `{}` is the whole of it. Against a concrete query, omit the argument instead: both\n * `query.execute()` and the auth registry's `execute()` already take none.\n *\n * @example\n * const runAnything = <TArgs extends QueryArgs>(query: Query<TArgs>) =>\n * query.execute({ args: emptyQueryArgs<TArgs>() });\n */\nexport const emptyQueryArgs = <TArgs extends QueryArgs>() => ({}) as RequestArgs<TArgs>;\n\nexport type CreateQueryOptions<TArgs extends QueryArgs> = {\n creator?: CreateQueryCreatorOptions;\n creatorInternals: InternalCreateQueryCreatorOptions<TArgs>;\n features: QueryFeature<TArgs>[];\n queryConfig: QueryConfig;\n};\n\nexport type QueryBase<TArgs extends QueryArgs> = {\n /** The arguments of the last execution of the query. Will be `null` if the query has never been executed */\n args: ObservableSignal<RequestArgs<TArgs> | null>;\n\n /**\n * The latest response of the query. Will be `null` if the query has never been executed.\n * Responses are cached until a new response is received.\n * If a response is present but the next execution of the query fails, the response will be set to `null` again.\n */\n response: ObservableSignal<ResponseType<TArgs> | null>;\n\n /** The latest Angular HTTP client native http event that occurred during the last execution of the query. Will be `null` if no event occurred. */\n latestHttpEvent: ObservableSignal<RequestHttpEvent<TArgs> | null>;\n\n /** The loading state of the query. Will be `null` if the query currently isn't loading. */\n loading: ObservableSignal<HttpRequestLoadingState | null>;\n\n /** The error that occurred during the last execution of the query. Will be `null` if no error occurred. */\n error: ObservableSignal<QueryErrorResponse | null>;\n\n /** The time the query was last executed at. Will be `null` if the query has never been executed. */\n lastTimeExecutedAt: ObservableSignal<number | null>;\n\n /** Who or what triggered the last execution. Will be `null` for user-triggered executions. */\n triggeredBy: ObservableSignal<string | null>;\n\n /** The id of the query */\n id: ObservableSignal<string | null>;\n\n /** The current state of the query. Will be `null` if the query has never been executed. */\n executionState: ObservableSignal<QueryExecutionState<TArgs> | null>;\n};\n\n/** A snapshot of a query state at a specific point in time */\nexport type QuerySnapshot<TArgs extends QueryArgs> = QueryBase<TArgs> & {\n /** This signal is `true` until the latest execution of the query has completed in any way (success, error, or cancellation) */\n isAlive: ObservableSignal<boolean>;\n};\n\nexport type AnyQuerySnapshot = QuerySnapshot<any>;\nexport type AnyNewQuery = Query<any>;\n\nexport type QuerySubtle<TArgs extends QueryArgs> = {\n /** Destroys the query and cleans up all resources. The query should not be used after this method is called. */\n destroy: () => void;\n\n /** Manually sets the response of the query. This will not trigger a new execution of the query. */\n setResponse: (response: ResponseType<TArgs>) => void;\n\n /**\n * Manually forces the loading state of the query. Overridden on the next execution. Intended for\n * devtools / testing UI states - not for application logic.\n */\n setLoading: (loading: HttpRequestLoadingState | null) => void;\n\n /**\n * Manually forces the error state of the query. Overridden on the next execution. Intended for\n * devtools / testing UI states - not for application logic.\n */\n setError: (error: QueryErrorResponse | null) => void;\n\n /** The currently underlying HTTP request of the query. Will be `null` if the query has never been executed. */\n request: ObservableSignal<HttpRequest<TArgs> | null>;\n\n /** The destroy reference used to clean up the query when it is no longer needed */\n destroyRef: DestroyRef;\n\n /** The Angular injector used to resolve dependencies for the query */\n injector: Injector;\n};\n\nexport type Query<TArgs extends QueryArgs> = QueryBase<TArgs> & {\n /** Executes the query */\n execute: QueryExecute<TArgs>;\n\n /** Creates an immutable snapshot of the current query state */\n createSnapshot: () => QuerySnapshot<TArgs>;\n\n /** Resets the query state to its initial state */\n reset: () => void;\n\n /** Returns a readonly version of the query */\n asReadonly: () => ReadonlyQuery<TArgs>;\n\n /** Advanced query features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */\n subtle: QuerySubtle<TArgs>;\n};\n\nexport type ReadonlyQuery<TArgs extends QueryArgs> = Omit<Query<TArgs>, 'execute' | 'subtle' | 'reset' | 'asReadonly'>;\n\nexport const createQuery = <TArgs extends QueryArgs>(options: CreateQueryOptions<TArgs>) =>\n createBaseQuery({\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n features: options.features,\n queryConfig: options.queryConfig,\n executeFactory: createExecuteFn,\n });\n","import { Injector } from '@angular/core';\nimport { createBaseQueryCreator } from './base-query-creator-factory';\nimport { HttpRequestResponseType, HttpRequestTransferCacheConfig } from './http-request';\nimport { AnyNewQuery, PathParamsType, Query, QueryArgs, RawResponseType, ResponseType, createQuery } from './query';\nimport { AnyCreateQueryClientResult } from './query-client';\nimport { QueryFeature } from './query-features';\nimport { ShouldRetryRequestFn } from './query-retry-utils';\n\nexport type RouteType<TArgs extends QueryArgs> =\n PathParamsType<TArgs> extends { [key: string]: unknown } ? (args: TArgs['pathParams']) => RouteString : RouteString;\n\nexport type RouteString = `/${string}`;\n\nexport type BaseQueryCreatorOptionsSubtle = {\n /**\n * If true, the request will be forced to be cached (saved inside the query repository).\n * Can be used to e.g. cache GQL queries transported via POST\n *\n * - `true` means the request will always be cached\n * - `false` means the request will never be cached\n * - `undefined` means the request will be cached if the method is GET, OPTIONS or HEAD\n *\n * This says nothing about whether the request may be re-run: `refreshQueriesInUse()` and\n * `invalidateQueries()` still only fire reads.\n */\n useQueryRepositoryCache?: boolean;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport type BaseQueryCreatorOptions<TArgs extends QueryArgs = QueryArgs> = {\n /**\n * If true, the query loading state will include progress information.\n * This is useful for file uploads and downloads.\n *\n * **Warning**: Upload progress events are not supported by browsers when using the fetch API, such as with `provideHttpClient(withFetch())`.\n * In this case, you should use the older XHR implementation by omitting `withFetch()`. But take into account that XHR is not supported in server-side rendering environments.\n *\n * @see https://angular.dev/guide/http/making-requests#receiving-raw-progress-events\n *\n * @default false\n */\n reportProgress?: boolean;\n\n /**\n * The response type of the query.\n * @default 'json'\n */\n responseType?: HttpRequestResponseType;\n\n /**\n * Whether to include credentials (cookies) in the request or not.\n * @default false\n */\n withCredentials?: boolean;\n\n /**\n * This property accepts either a boolean to enable/disable transferring cache for eligible\n * requests performed using `HttpClient`, or an object, which allows to configure cache\n * parameters, such as which headers should be included (no headers are included by default).\n *\n * Setting this property will override the options passed to `provideClientHydration()` for this\n * particular request\n */\n transferCache?: HttpRequestTransferCacheConfig;\n\n /**\n * Custom retry function for this specific query creator.\n * If provided, overrides the retry function configured at the client level.\n *\n * @default the client's `retryFn`, else the `withDefaultRetry()` policy, else no retry\n */\n retryFn?: ShouldRetryRequestFn;\n\n /**\n * How long (in ms) this query's cache entry is kept after its last consumer was destroyed.\n * Overrides the client level `keepUnusedFor`. Use `0` for responses that should never outlive their\n * consumer (very large payloads, or data that must not be shown stale).\n *\n * @default Client's keepUnusedFor (5 minutes)\n */\n keepUnusedFor?: number;\n\n /**\n * Whether this query takes part in the client's multi-tab sync, when the client has it enabled at\n * all. Set to `false` to keep the query tab-local: its responses are neither broadcast to nor\n * accepted from other tabs, and - because dedup is only safe while the suppressed tab still gets\n * the data - every tab polls it itself again.\n *\n * The case for opting out is payload cost: every shared response is structured-cloned per receiving\n * tab, so a very large body polled at a short interval is better left alone. Has no effect unless\n * the client has the {@link withMultiTabSync} feature.\n *\n * @default true\n */\n multiTabSync?: boolean;\n\n /**\n * Whether this query's responses may be kept on disk, when the client has the\n * {@link withQueryPersistence} feature at all.\n *\n * Three states, because secure queries start on the other side of the default:\n * - left unset, a **public** query persists and a **secure** (authenticated) one does not - putting a\n * logged in user's data on the device is a decision per endpoint, not a blanket one,\n * - `true` persists it either way. On a secure query this is the opt-in; pair it with the knowledge\n * that a logout removes every persisted secure response again,\n * - `false` keeps the query memory-only. Worth it for very large payloads, for data that must not be\n * shown stale even for the moment it takes to revalidate, and for anything the app considers too\n * sensitive to store.\n *\n * @default true for public queries, false for secure ones\n */\n persistence?: boolean;\n\n /** Advanced query creator features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */\n subtle?: BaseQueryCreatorOptionsSubtle;\n};\n\ntype HasKey<T, K extends PropertyKey> = K extends keyof T\n ? undefined extends T[K]\n ? K extends keyof Required<T>\n ? true\n : false\n : true\n : false;\n\n/**\n * Determines if rawResponse type differs from response type.\n * Returns true if rawResponse is explicitly defined and differs from response.\n */\nexport type RequiresTransform<TArgs extends QueryArgs> =\n HasKey<TArgs, 'rawResponse'> extends false\n ? false\n : RawResponseType<TArgs> extends ResponseType<TArgs>\n ? ResponseType<TArgs> extends RawResponseType<TArgs>\n ? false\n : true\n : true;\n\nexport type CreateQueryCreatorOptions<TArgs extends QueryArgs = QueryArgs> = BaseQueryCreatorOptions<TArgs> &\n (RequiresTransform<TArgs> extends true\n ? {\n /**\n * Transforms the raw HTTP response to the final response type.\n * **Required** because rawResponse type differs from response type.\n *\n * @example\n * ```ts\n * transformResponse: (raw) => raw.data\n * ```\n */\n transformResponse: (rawResponse: RawResponseType<TArgs>) => ResponseType<TArgs>;\n }\n : {\n /**\n * Transforms the raw HTTP response to the final response type.\n * Useful for unwrapping response wrappers (e.g., GraphQL's `{ data: ... }` format).\n *\n * @example\n * ```ts\n * transformResponse: (raw) => raw.data\n * ```\n */\n transformResponse?: (rawResponse: RawResponseType<TArgs>) => ResponseType<TArgs>;\n });\n\nexport type QueryCreator<TArgs extends QueryArgs> = {\n (...features: QueryFeature<TArgs>[]): Query<TArgs>;\n (queryConfig: QueryConfig, ...features: QueryFeature<TArgs>[]): Query<TArgs>;\n\n /**\n * Creates a new query creator with merged options.\n * The new creator inherits all options from the original and overrides them with the provided options.\n *\n * @example\n * ```ts\n * const originalCreator = myApiPost('/api/data');\n * const creatorWithRetry = originalCreator.clone({ retryFn: customRetryFn });\n * ```\n */\n clone: (additionalOptions: Partial<BaseQueryCreatorOptions<TArgs>>) => QueryCreator<TArgs>;\n\n /**\n * What the creator was built with - `route`, `method` and the client for an HTTP creator, the\n * GraphQL document for a GraphQL one.\n *\n * Advanced: for tooling that has to describe a query (the devtools' Insomnia export builds an auth\n * provider's token-refresh request from it) without instantiating one.\n */\n subtle: {\n creatorInternals: Record<string, unknown>;\n creatorOptions: Record<string, unknown> | undefined;\n };\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyQueryCreator = QueryCreator<any>;\n\nexport type QueryArgsOf<T extends AnyQueryCreator | AnyNewQuery> =\n T extends QueryCreator<infer TArgs> ? TArgs : T extends Query<infer TArgs> ? TArgs : never;\n\nexport type RunQueryCreator<TCreator extends AnyQueryCreator> = ReturnType<TCreator>;\n\nexport type QueryMethod = 'GET' | 'OPTIONS' | 'HEAD' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'TRACE' | 'CONNECT';\n\nexport type InternalCreateQueryCreatorOptions<TArgs extends QueryArgs> = {\n /**\n * The route of the query.\n * If the query has path params, the route should be a function that takes the path params as an argument.\n * Otherwise, it should be a string.\n */\n route: RouteType<TArgs>;\n\n method: QueryMethod;\n client: AnyCreateQueryClientResult;\n};\n\nexport type QueryConfig = {\n /** A custom id to use for this query. Only affects queries that can be cached. */\n key?: string;\n\n /**\n * If true, the query will not be executed automatically.\n * Does not affect mutations such as POST, PUT etc. since those are never executed automatically.\n */\n onlyManualExecution?: boolean;\n\n /**\n * If true, the query will not throw an error because a \"withArgs()\" feature is missing.\n */\n silenceMissingWithArgsFeatureError?: boolean;\n\n /**\n * If true, executing with `allowCache` on a request that cannot be cached is ignored instead of throwing\n * `ET301`.\n *\n * For the legacy interop layer: v2 had a single `skipCache` for every method, so it forwards `allowCache`\n * without being able to tell a cacheable request from an uncacheable one. Application code should not set\n * this - on a hand-written `execute()` the error it silences is a real mistake.\n */\n silenceUncacheableAllowCacheError?: boolean;\n\n /**\n * A custom injector to use for this query.\n */\n injector?: Injector;\n};\n\nexport const splitQueryConfig = <TArgs extends QueryArgs>(args: (QueryFeature<TArgs> | QueryConfig)[]) => {\n let queryConfig: QueryConfig = {};\n let features: QueryFeature<TArgs>[] = [];\n\n const first = args[0];\n\n if (first) {\n if ('type' in first) {\n features = args as QueryFeature<TArgs>[];\n } else {\n [queryConfig, ...features] = args as [QueryConfig, ...QueryFeature<TArgs>[]];\n }\n }\n return { features, queryConfig };\n};\n\nexport const createQueryCreator = <TArgs extends QueryArgs>(\n options: CreateQueryCreatorOptions | undefined,\n internals: InternalCreateQueryCreatorOptions<TArgs>,\n): QueryCreator<TArgs> =>\n createBaseQueryCreator({\n options,\n internals,\n queryFactory: createQuery,\n });\n","import { Query, QueryArgs } from './query';\nimport { BaseQueryCreatorOptions, QueryConfig, QueryCreator, splitQueryConfig } from './query-creator';\nimport { QueryFeature } from './query-features';\n\nexport type BaseQueryCreatorFactoryOptions<TArgs extends QueryArgs, TOptions, TInternals> = {\n /** Creator-specific options (e.g., CreateQueryCreatorOptions or CreateGqlQueryCreatorOptions) */\n options: TOptions | undefined;\n\n /** Creator-specific internals (e.g., InternalCreateQueryCreatorOptions or InternalCreateGqlQueryCreatorOptions) */\n internals: TInternals;\n\n /** Factory function that creates the actual query */\n queryFactory: (config: {\n creator: TOptions | undefined;\n creatorInternals: TInternals;\n features: QueryFeature<TArgs>[];\n queryConfig: QueryConfig;\n }) => Query<TArgs>;\n};\n\nexport const createBaseQueryCreator = <TArgs extends QueryArgs, TOptions, TInternals>(\n config: BaseQueryCreatorFactoryOptions<TArgs, TOptions, TInternals>,\n): QueryCreator<TArgs> => {\n function queryCreator(...features: QueryFeature<TArgs>[]): Query<TArgs>;\n function queryCreator(queryConfig: QueryConfig, ...features: QueryFeature<TArgs>[]): Query<TArgs>;\n\n function queryCreator(...args: (QueryFeature<TArgs> | QueryConfig)[]): Query<TArgs> {\n const { features, queryConfig } = splitQueryConfig<TArgs>(args);\n\n return config.queryFactory({\n creator: config.options,\n creatorInternals: config.internals,\n features,\n queryConfig,\n });\n }\n\n // Add clone method to create a new creator with merged options\n // Cast to match QueryCreator's expected signature while preserving TOptions internally\n queryCreator.clone = (additionalOptions: Partial<BaseQueryCreatorOptions>) => {\n return createBaseQueryCreator({\n ...config,\n options: { ...config.options, ...additionalOptions } as TOptions,\n });\n };\n\n queryCreator.subtle = {\n creatorInternals: config.internals as Record<string, unknown>,\n creatorOptions: config.options as Record<string, unknown> | undefined,\n };\n\n return queryCreator;\n};\n","import { RuntimeError } from '@ethlete/core';\n\n/**\n * Route building, query-string serialization and the token clock - shared by the current generation and\n * the legacy V2 client, which re-exports them under their original names.\n */\n\n// codes 1-99 of the shared 0-999 `@ethlete/query` range - see `query-errors.ts` for the rest\nexport const RouteRuntimeErrorCode = {\n INVALID_BASE_ROUTE: 1,\n INVALID_ROUTE: 2,\n PATH_PARAMS_MISSING_IN_ROUTE_FUNCTION: 3,\n} as const;\n\nexport type RouteRuntimeErrorCode = (typeof RouteRuntimeErrorCode)[keyof typeof RouteRuntimeErrorCode];\n\nexport const invalidBaseRouteError = (data: unknown) =>\n new RuntimeError(RouteRuntimeErrorCode.INVALID_BASE_ROUTE, 'The baseRoute must not end with a slash', data);\n\nexport const invalidRouteError = (data: unknown) =>\n new RuntimeError(RouteRuntimeErrorCode.INVALID_ROUTE, 'The route must start with a slash', data);\n\nexport const pathParamsMissingInRouteFunctionError = (data: unknown) =>\n new RuntimeError(\n RouteRuntimeErrorCode.PATH_PARAMS_MISSING_IN_ROUTE_FUNCTION,\n 'The route is a function but pathParams are missing',\n data,\n );\n\nexport type QueryParams = object;\nexport type PathParams = Record<string, string | number>;\n\n/** A literal route, or a function building one from path params. Structurally the legacy `AnyRoute`. */\nexport type RouteInput = ((pathParams: PathParams) => string) | `/${string}`;\n\nexport type BuildQueryStringConfig = {\n /**\n * Object notation to use for nested objects.\n *\n * @example\n * // dot notation\n * { foo: { bar: 'baz' } } => \"foo.bar=baz\"\n *\n * @example\n * // bracket notation\n * { foo: { bar: 'baz' } } => \"foo[bar]=baz\"\n *\n * @example\n * // json-stringify notation\n * { foo: { bar: 'baz' } } => \"foo={\\\"bar\\\":\\\"baz\\\"}\"\n *\n * @default 'bracket'\n */\n objectNotation?: 'dot' | 'bracket' | 'json-stringify';\n\n /**\n * Whether to write array indexes in bracket notation.\n *\n * @example\n * // true\n * { foo: ['bar', 'baz'] } => \"foo[0]=bar&foo[1]=baz\"\n *\n * @example\n * // false\n * { foo: ['bar', 'baz'] } => \"foo[]=bar&foo[]=baz\"\n *\n * @default false\n */\n writeArrayIndexes?: boolean;\n\n /**\n * A list of values that should be ignored when building the query string.\n *\n * Also have a look at `ignoredValuesFns`.\n *\n * @default [undefined, null, Infinity, -Infinity]\n */\n ignoredValues?: Array<unknown>;\n\n /**\n * A list of functions that should be used to determine whether a value should be ignored when building the query string.\n *\n * Also have a look at `ignoredValues`.\n *\n * @default [isNaN, isEmptyString]\n */\n ignoredValuesFns?: Array<(value: unknown) => boolean>;\n};\n\nexport const isNaN = (value: unknown): boolean => typeof value === 'number' && Number.isNaN(value);\nexport const isEmptyString = (value: unknown) => typeof value === 'string' && value.trim() === '';\n\nexport const buildQueryString = (params: QueryParams, config?: BuildQueryStringConfig): string | null => {\n const objectNotation = config?.objectNotation ?? 'bracket';\n const writeArrayIndexes = config?.writeArrayIndexes ?? false;\n const ignoredValues = config?.ignoredValues ?? [undefined, null, Infinity, -Infinity];\n const ignoredValuesFns = config?.ignoredValuesFns ?? [isNaN, isEmptyString];\n\n const queryParams: string[] = [];\n\n function processValue(key: string, value: unknown) {\n if (config?.objectNotation === 'json-stringify') {\n if (value === undefined) {\n return false;\n }\n\n if (ignoredValues.includes(value)) {\n return false;\n }\n\n if (ignoredValuesFns.some((fn) => fn(value))) {\n return false;\n }\n\n const encodedKey = encodeURIComponent(key);\n\n const val = typeof value === 'object' ? JSON.stringify(value) : value;\n\n const encodedValue = encodeURIComponent(val as string | number | boolean);\n\n queryParams.push(`${encodedKey}=${encodedValue}`);\n\n return true;\n } else if (Array.isArray(value)) {\n let currentFilteredIndex = 0;\n for (const arrayValue of value) {\n const nestedKey = writeArrayIndexes ? `${key}[${currentFilteredIndex}]` : `${key}[]`;\n\n const didAddValue = processValue(nestedKey, arrayValue);\n\n if (didAddValue) {\n currentFilteredIndex++;\n }\n }\n\n return null;\n } else if (typeof value === 'object' && value !== null) {\n for (const [objKey, val] of Object.entries(value)) {\n const nestedKey = objectNotation === 'dot' ? `${key}.${objKey}` : `${key}[${objKey}]`;\n processValue(nestedKey, val);\n }\n\n return null;\n } else {\n if (ignoredValues.includes(value)) {\n return false;\n }\n\n if (ignoredValuesFns.some((fn) => fn(value))) {\n return false;\n }\n\n const encodedKey = encodeURIComponent(key);\n const encodedValue = encodeURIComponent(value as string);\n\n queryParams.push(`${encodedKey}=${encodedValue}`);\n\n return true;\n }\n }\n\n for (const [key, val] of Object.entries(params)) {\n processValue(key, val);\n }\n\n return queryParams.length ? queryParams.join('&') : null;\n};\n\nexport const buildRoute = (options: {\n base: string;\n route: RouteInput | null | undefined;\n pathParams?: PathParams;\n queryParams?: QueryParams;\n queryParamConfig?: BuildQueryStringConfig;\n}) => {\n if (options.base.endsWith('/')) {\n throw invalidBaseRouteError(options.base);\n }\n\n let route: string | null;\n\n if (typeof options.route === 'function') {\n if (!options.pathParams) {\n throw pathParamsMissingInRouteFunctionError(options.route({}));\n }\n\n route = options.route(options.pathParams);\n } else {\n route = options.route ?? null;\n }\n\n if (route && !route.startsWith('/')) {\n throw invalidRouteError(route);\n }\n\n if (options.queryParams) {\n const queryString = buildQueryString(options.queryParams, options.queryParamConfig);\n\n if (queryString) {\n route = route ? `${route}?${queryString}` : `/?${queryString}`;\n }\n }\n\n return `${options.base}${route ?? ''}`;\n};\n\nexport const buildTimestampFromSeconds = (seconds: number | null) => {\n if (seconds === null) {\n return null;\n }\n\n return new Date(Date.now() + seconds * 1000).getTime();\n};\n\n/** Reads a bearer token's payload. */\nexport const decryptBearer = <Result = Record<string, unknown>>(token: string) => {\n try {\n const base64Url = token.split('.')[1];\n\n if (!base64Url) {\n return null;\n }\n\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n const jsonPayload = decodeURIComponent(\n atob(base64)\n .split('')\n .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2))\n .join(''),\n );\n\n return JSON.parse(jsonPayload) as Result;\n } catch (error) {\n console.error(`Invalid bearer token: ${token}`, error);\n\n return null;\n }\n};\n","import { HttpHeaders } from '@angular/common/http';\nimport { QueryArgs, RequestArgs } from './query';\nimport { QueryMethod } from './query-creator';\n\nexport const extractExpiresInSeconds = (headers: HttpHeaders) => {\n const cacheControl = headers.get('cache-control');\n const age = headers.get('age');\n const expires = headers.get('expires');\n\n // In seconds\n let expiresIn: number | null = null;\n let maxAge: number | null = null;\n\n if (cacheControl?.includes('no-cache')) {\n return null;\n }\n\n if (cacheControl?.includes('max-age')) {\n const m = cacheControl.split('max-age=')[1];\n\n if (m) {\n maxAge = parseInt(m);\n }\n } else if (cacheControl?.includes('s-maxage')) {\n const m = cacheControl.split('s-maxage=')[1];\n\n if (m) {\n maxAge = parseInt(m);\n }\n }\n\n if (maxAge && age) {\n const ageSeconds = parseInt(age);\n\n expiresIn = maxAge - ageSeconds;\n } else if (maxAge) {\n expiresIn = maxAge / 2; // We assume the response is half way to its expiration\n } else if (expires) {\n // Used by some apis to tell the response will never expire\n // In this case we let the response expire after 1 hour\n if (expires === '-1') {\n expiresIn = 3600;\n } else {\n const expiresDate = new Date(expires);\n\n // check if the date is valid\n if (expiresDate.toString() !== 'Invalid Date') {\n expiresIn = Math.floor((expiresDate.getTime() - Date.now()) / 1000);\n }\n }\n }\n\n return expiresIn;\n};\n\nexport const shouldCacheQuery = (method: QueryMethod) => {\n return method === 'GET' || method === 'OPTIONS' || method === 'HEAD';\n};\n\nexport const buildQueryCacheKey = (route: string, args: RequestArgs<QueryArgs> | undefined) => {\n // We need to hash the body in case it's a gql query and the query get's transported in the body\n const body = JSON.stringify(args?.body || {})\n // replace all curly braces with empty string\n .replace(/{|}/g, '')\n // replace new lines and whitespaces with empty string\n .replace(/\\s/g, '');\n\n const seed = `${route}_${body}`;\n\n let hash = 0;\n\n for (const char of seed) {\n hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;\n }\n\n // Force positive number hash.\n // 2147483647 = equivalent of Integer.MAX_VALUE.\n hash += 2147483647 + 1;\n\n return hash.toString();\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { ShouldRetryRequestFn, ShouldRetryRequestOptions, ShouldRetryRequestResult } from './query-retry-utils';\n\n/**\n * Turns an error response body into the messages a UI should show, or `null` when the body is not\n * the shape this parser knows - in which case the next parser gets a turn, and the built-in\n * `string` / `{ message }` / `{ detail }` ladder after them.\n *\n * Returning an **empty array** means \"this is my shape, but there is nothing readable in it\": no\n * further parser runs and the `HttpErrorResponse`'s own message is used.\n *\n * @example\n * registerQueryErrorParser((detail) =>\n * isObject(detail) && 'errorCode' in detail ? [translate(detail.errorCode)] : null,\n * );\n */\nexport type QueryErrorParser = (detail: unknown, response: HttpErrorResponse) => string[] | null;\n\nconst parsers: QueryErrorParser[] = [];\n\n/**\n * Adds a parser to the pipeline `createQueryErrorResponse` runs, ahead of the built-in ladder.\n * Registering the same function twice is a no-op, and parsers run in registration order.\n *\n * The built-in ones are installed by the {@link withHtmlErrorParsing} / {@link withSymfonyErrors}\n * query client features - reach for this directly only for an API shape the SDK does not know.\n */\nexport const registerQueryErrorParser = (parser: QueryErrorParser) => {\n if (!parsers.includes(parser)) parsers.push(parser);\n};\n\n/** @internal */\nexport const runQueryErrorParsers = (detail: unknown, response: HttpErrorResponse) => {\n for (const parser of parsers) {\n const messages = parser(detail, response);\n\n if (messages) return messages;\n }\n\n return null;\n};\n\nconst NO_RETRY: ShouldRetryRequestResult = { retry: false };\n\nlet defaultRetryFn: ShouldRetryRequestFn | null = null;\n\n/**\n * Installs the retry policy used by every request that does not bring its own `retryFn`. Installed\n * by the {@link withDefaultRetry} query client feature; without it nothing is retried automatically.\n */\nexport const setDefaultQueryRetryFn = (fn: ShouldRetryRequestFn) => {\n defaultRetryFn = fn;\n};\n\n/** @internal */\nexport const runDefaultQueryRetry = (options: ShouldRetryRequestOptions) => defaultRetryFn?.(options) ?? NO_RETRY;\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { runDefaultQueryRetry, runQueryErrorParsers } from './query-error-parsing';\nimport { ShouldRetryRequestResult } from './query-retry-utils';\n\nexport type QueryErrorResponseList = {\n isList: true;\n errors: QueryErrorResponseItem[];\n};\n\nexport type QueryErrorResponseSingle = {\n isList: false;\n error: QueryErrorResponseItem;\n};\n\nexport type QueryErrorResponse = {\n raw: HttpErrorResponse;\n retryState: ShouldRetryRequestResult;\n code: number;\n} & (QueryErrorResponseList | QueryErrorResponseSingle);\n\nexport type QueryErrorResponseItem = {\n message: string;\n};\n\nexport const isQueryErrorResponse = (error: unknown): error is QueryErrorResponse => {\n return typeof error === 'object' && error !== null && 'raw' in error && 'retryState' in error && 'isList' in error;\n};\n\n/**\n * Every message carried by an error, flattened into a plain list - one entry for a single error,\n * one per violation for a list (a form response with several field violations), empty for `null`.\n *\n * The single/list split exists because that is how APIs answer; UI almost never wants to branch on\n * it. Reach for this when rendering, and keep {@link QueryErrorResponse} for anything that needs\n * the status code or the raw response.\n *\n * @example\n * ```html\n * @for (message of queryErrorMessages(myQuery.error()); track message) {\n * <p class=\"error\">{{ message }}</p>\n * }\n * ```\n */\nexport const queryErrorMessages = (error: QueryErrorResponse | null | undefined): string[] => {\n if (!error) return [];\n\n return error.isList ? error.errors.map((item) => item.message) : [error.error.message];\n};\n\n/**\n * The first message of an error, or `null` when there is none - the single-line counterpart to\n * {@link queryErrorMessages}, for a toast or a form-field hint.\n */\nexport const queryErrorMessage = (error: QueryErrorResponse | null | undefined): string | null =>\n queryErrorMessages(error)[0] ?? null;\n\nexport const createQueryErrorResponse = (error: unknown): QueryErrorResponse => {\n let err = error instanceof HttpErrorResponse ? error : null;\n\n if (!err) {\n err = new HttpErrorResponse({\n error: error,\n status: 0,\n statusText: 'Unknown Error',\n });\n }\n const retryState = runDefaultQueryRetry({ retryCount: 0, error: err });\n\n const detail = err.error;\n const errorList: QueryErrorResponseItem[] = [];\n const parsed = runQueryErrorParsers(detail, err);\n\n if (parsed) {\n for (const message of parsed) {\n errorList.push({ message });\n }\n } else if (typeof detail === 'object' && !!detail && 'message' in detail && typeof detail.message === 'string') {\n errorList.push({ message: detail.message });\n } else if (typeof detail === 'object' && !!detail && 'detail' in detail && typeof detail.detail === 'string') {\n // Symfony error response (during development)\n errorList.push({ message: detail.detail });\n } else if (typeof detail === 'string') {\n errorList.push({ message: detail });\n } else if (Array.isArray(detail) && detail.length > 0 && typeof detail[0] === 'string') {\n for (const error of detail) {\n errorList.push({ message: error });\n }\n }\n\n if (errorList.length > 1) {\n return {\n isList: true,\n errors: errorList,\n raw: err,\n retryState,\n code: err.status,\n };\n } else {\n const singleError = errorList[0] ?? { message: err.message };\n\n return {\n isList: false,\n error: singleError,\n raw: err,\n retryState,\n code: err.status,\n };\n }\n};\n","import {\n HttpClient,\n HttpErrorResponse,\n HttpEvent,\n HttpEventType,\n HttpHeaders,\n HttpProgressEvent,\n} from '@angular/common/http';\nimport { ErrorHandler, Signal, signal } from '@angular/core';\nimport { Observable, Subject, Subscription, catchError, defer, retry, switchMap, tap, throwError, timer } from 'rxjs';\nimport { isQueryDevtoolsFaultInjectionEnabled, resolveQueryDevtoolsFault } from '../devtools/query-devtools-hook';\nimport { buildTimestampFromSeconds } from './internal/request-route';\nimport { QueryArgs, RequestArgs, ResponseType } from './query';\nimport { extractExpiresInSeconds } from './query-cache-utils';\nimport { CacheAdapterFn } from './query-client';\nimport { CreateQueryCreatorOptions, QueryMethod } from './query-creator';\nimport { QueryErrorResponse, createQueryErrorResponse } from './query-error-response';\nimport { QueryRepositoryDependencies } from './query-repository';\nimport { runDefaultQueryRetry } from './query-error-parsing';\nimport { ShouldRetryRequestFn, ShouldRetryRequestOptions } from './query-retry-utils';\n\nexport const SPEED_BUFFER_TIME_IN_MS = 2000;\n\nexport type HttpRequestTransferCacheConfig =\n | boolean\n | {\n includeHeaders?: string[];\n };\n\nexport type HttpRequestResponseType = 'json' | 'text' | 'blob' | 'arraybuffer';\n\nexport type CreateHttpRequestDependencies = {\n /** The http client instance to use for the request */\n httpClient: HttpClient;\n\n /** The error handler instance to use for the request */\n ngErrorHandler: ErrorHandler;\n};\n\nexport type CreateHttpRequestOptions<TArgs extends QueryArgs> = {\n /** The HTTP method of the request */\n method: QueryMethod;\n\n /**\n * The full path of the request\n * @example 'https://api.example.com/v1/users'\n */\n fullPath: string;\n\n /** The data of the request */\n args?: RequestArgs<TArgs> | null;\n\n /** The dependencies of the request */\n dependencies: QueryRepositoryDependencies;\n\n /** The client options of the request */\n clientOptions?: CreateQueryCreatorOptions;\n\n /** Display name of the owning query client. Scopes devtools fault injection, which is armed per client. */\n clientName?: string;\n\n /**\n * Headers configured on the query client, applied to every request it makes. Per-request\n * `args.headers` are merged on top and win per header name.\n *\n * @see CreateQueryClientConfigOptions.headers\n */\n clientHeaders?: HttpHeaders | (() => HttpHeaders);\n\n /**\n * The cache adapter function to use for the request\n * @default extractExpiresInSeconds()\n */\n cacheAdapter?: CacheAdapterFn;\n\n /**\n * The retry function to use for the request\n * @default the `withDefaultRetry()` policy, or no retry at all without that client feature\n */\n retryFn?: ShouldRetryRequestFn;\n};\n\nexport type HttpRequestLoadingState = {\n /** The time when the request was executed in ms */\n executeTime: number;\n\n /** The progress of the request. Null if reportProgress is false or progress is not available / unsupported */\n progress: HttpRequestLoadingProgressState | null;\n};\n\nexport type HttpRequestLoadingProgressState = {\n /** The total number of bytes to be transferred */\n total: number;\n\n /** The number of bytes transferred */\n loaded: number;\n\n /** The percentage of the transfer that is completed */\n percentage: number;\n\n /** The speed of the transfer in bytes per second */\n speed: number | null;\n\n /** The estimated remaining time in milliseconds */\n remainingTime: number | null;\n};\n\n/**\n * A retry the request has scheduled and is waiting out. Present only during the backoff itself - the\n * attempt that follows clears it - which is what lets a slow request be told apart from one that is\n * sitting out a delay.\n */\nexport type HttpRequestRetryState = {\n /** The attempt the backoff leads up to, 1-based: the first retry is attempt 2. */\n attempt: number;\n\n /** The delay the retry policy asked for, in ms. */\n delayMs: number;\n\n /** When the attempt starts, as a timestamp. */\n startsAt: number;\n\n /** The status of the response that caused the retry, or 0 when the request never reached the server. */\n status: number;\n};\n\n/**\n * Advanced request internals. **Not part of the general public contract** - do not build\n * application logic on top of these.\n */\nexport type HttpRequestSubtle<TArgs extends QueryArgs> = {\n /**\n * Adopts a response this request never made itself - the same request settled in another tab and\n * its result arrived over the multi-tab sync channel.\n *\n * Deliberately silent: it writes the state signals but emits nothing on {@link HttpRequest.events$}\n * (and leaves {@link HttpRequest.currentEvent} alone), because that stream means \"this request\n * settled over HTTP\". The repository's `request-success` event - which is what broadcasts in the\n * first place - hangs off it, so emitting here would bounce the response back and forth between\n * tabs forever. The cost is that event-driven features (`withSuccessHandling`, `withLogging`) stay\n * quiet for shared responses; everything signal-driven updates as usual.\n *\n * `loading` is left untouched: the caller is responsible for not applying over an in-flight\n * request, and clearing it here would claim a request finished when it has not.\n */\n applyExternalResponse: (options: { body: ResponseType<TArgs>; expiresAt: number | null }) => void;\n\n /**\n * When this request last adopted a response from another tab, or `null` if it never did. Read by the\n * query devtools to show which entries are being kept up to date from elsewhere.\n */\n lastExternalResponseAt: Signal<number | null>;\n\n /**\n * Adopts a response from a previous session, read back from the client's persisted store while this\n * request is on its way - so a reload (or a cold start with no network) renders the last known data\n * instead of an empty loading state.\n *\n * Silent for the same reason as {@link applyExternalResponse}: `events$` means \"this request settled\n * over HTTP\", and the repository's `request-success` hangs off it, so emitting here would both\n * re-persist and broadcast a disk read.\n *\n * Unlike `applyExternalResponse` it leaves {@link HttpRequest.error} alone. Hydration commonly\n * happens *after* the request it revalidates with has already failed - that is the offline case - and\n * clearing the error there would report a failed revalidation as a success.\n */\n applyPersistedResponse: (options: { body: ResponseType<TArgs>; expiresAt: number | null }) => void;\n\n /**\n * When this request adopted a response from the persisted store, or `null` if it never did. Read by\n * the query devtools to show which entries are showing data from a previous session.\n */\n lastPersistedResponseAt: Signal<number | null>;\n\n /**\n * The headers this request sends, resolved the way an execution resolves them: the client's headers\n * with the per-request ones merged on top. Read by the query devtools to export a request that can be\n * replayed outside the app.\n *\n * Throws whatever a header provider function throws - a secure query's provider, for one, requires an\n * access token to be available.\n */\n resolveHeaders: () => HttpHeaders | undefined;\n\n /**\n * How many HTTP attempts the current execution has made, counting from 1. Anything above that is the\n * retry policy having fired. Reset by the next execution, so it keeps reading `3` after a request\n * that took three attempts to succeed.\n */\n attempts: Signal<number>;\n\n /** The retry currently being waited out, or `null` when none is. @see HttpRequestRetryState */\n retryState: Signal<HttpRequestRetryState | null>;\n\n /**\n * How long the last settled execution took, measured from the `execute()` that started it - so it\n * covers every attempt and the backoff between them, not just the last round trip. `null` until one\n * has settled, and untouched by a response adopted from another tab or from disk, neither of which\n * this request spent any time on.\n */\n lastDurationMs: Signal<number | null>;\n};\n\nexport type HttpRequest<TArgs extends QueryArgs> = {\n /** The HTTP method of the request. */\n method: QueryMethod;\n\n /** The full URL of the request (base + path + query params). */\n url: string;\n\n /**\n * The args this request was built from - the resolved path params, query params, body and headers\n * behind {@link HttpRequest.url}. Read by the query devtools to show what a query actually sent,\n * which a query executed imperatively (`execute({ args })`) does not keep on its own `args` signal.\n */\n args: RequestArgs<TArgs> | null;\n\n /**\n * Executes the request.\n *\n * `force` runs it even when one is already in flight (the in-flight one is cancelled) or the\n * cached response is still fresh - used by `refreshQueriesInUse` after something outside the\n * request changed, such as a client-level header.\n */\n execute: (options?: { allowCache?: boolean; force?: boolean }) => boolean;\n\n /** Destroys the request (cancels it if in progress) */\n destroy: () => boolean;\n\n /** The loading state of the request */\n loading: Signal<HttpRequestLoadingState | null>;\n\n /** The error state of the request */\n error: Signal<QueryErrorResponse | null>;\n\n /** The response state of the request */\n response: Signal<ResponseType<TArgs> | null>;\n\n /** The current event of the request */\n currentEvent: Signal<RequestHttpEvent<TArgs> | null>;\n\n /**\n * A discrete stream of every event of this request, emitted synchronously at the moment the\n * event is processed (including the terminal Response / error event). Unlike the `currentEvent`\n * signal, this never coalesces or gets reset, so consumers cannot miss a transition. Completes\n * when the request is destroyed.\n */\n events$: Observable<RequestHttpEvent<TArgs>>;\n\n /**\n * Whether the request is stale or not aka the cache header has expired.\n *\n * This is a plain getter function (evaluated on each call), not a reactive signal, because\n * staleness depends on wall-clock time rather than on any tracked signal.\n */\n isStale: () => boolean;\n\n /**\n * The timestamp (ms) at which the cached response goes stale, or `null` when the request is not\n * cacheable / has no freshness window. Exposed for devtools freshness countdowns.\n */\n expiresAt: Signal<number | null>;\n\n /** Advanced request internals. */\n subtle: HttpRequestSubtle<TArgs>;\n};\n\n/** A custom error event since the Angular http client does not provide a specific event for errors */\nexport type HttpErrorEvent = {\n type: 'error';\n error: QueryErrorResponse;\n\n /**\n * Whether this error is a devtools fault the panel armed, rather than a real server failure - the\n * fact `lastResponseWasFaulted` (`query-devtools-stats.ts`) is built from.\n */\n faulted?: boolean;\n};\n\nexport type RequestHttpEvent<TArgs extends QueryArgs> = HttpEvent<ResponseType<TArgs>> | HttpErrorEvent;\n\nexport const createHttpRequest = <TArgs extends QueryArgs>(options: CreateHttpRequestOptions<TArgs>) => {\n let currentStreamSubscription = Subscription.EMPTY;\n\n const { args, clientOptions, dependencies } = options;\n\n const currentEvent = signal<RequestHttpEvent<TArgs> | null>(null);\n const event$ = new Subject<RequestHttpEvent<TArgs>>();\n const loading = signal<HttpRequestLoadingState | null>(null);\n const error = signal<QueryErrorResponse | null>(null);\n const response = signal<ResponseType<TArgs> | null>(null);\n\n const lastLoadEventTime = signal(0);\n const lastLoadEventAmount = signal(0);\n const lastExecuteTime = signal(0);\n const expiresIn = signal<number | null>(null);\n const attempts = signal(1);\n const retryState = signal<HttpRequestRetryState | null>(null);\n const lastDurationMs = signal<number | null>(null);\n\n // Set at the top of every `sendWithFaults` attempt (including unfaulted ones), so it always reflects\n // whichever attempt most recently settled - not just the first one, or a stale earlier attempt's fault.\n let lastAttemptFaulted = false;\n\n // NOTE: This must be a plain function, not a `computed`. The freshness check compares against\n // `Date.now()`, which is not reactive, so a memoized computed would only ever recompute when\n // `expiresIn` changes - once it evaluated to `false` (fresh) it would stay `false` forever, even\n // after the window elapsed, turning every `allowCache` execute into a permanent cache hit.\n const isStale = () => {\n const expiresInTs = expiresIn();\n\n return expiresInTs === null || expiresInTs < Date.now();\n };\n\n // Resolved per execution rather than once at creation, so a client whose headers are a function\n // reading a signal (a preview token, a tenant id) sees the current value on every re-run.\n const resolveHeaders = () => {\n const clientHeaders = typeof options.clientHeaders === 'function' ? options.clientHeaders() : options.clientHeaders;\n const argHeaders = typeof args?.headers === 'function' ? args.headers() : args?.headers;\n\n if (!clientHeaders) return argHeaders;\n if (!argHeaders) return clientHeaders;\n\n // `set` replaces every value of that name, so a per-request header fully overrides the\n // client-level one instead of being appended next to it.\n return argHeaders.keys().reduce((merged, key) => merged.set(key, argHeaders.getAll(key) ?? []), clientHeaders);\n };\n\n const send = (headers: HttpHeaders | undefined) =>\n dependencies.httpClient.request(options.method, options.fullPath, {\n observe: 'events' as const,\n body: args?.body,\n reportProgress: clientOptions?.reportProgress,\n withCredentials: clientOptions?.withCredentials,\n transferCache: clientOptions?.transferCache,\n responseType: clientOptions?.responseType || 'json',\n headers,\n });\n\n /**\n * Wraps the request in the fault the devtools have armed for this client, if any.\n *\n * Inside a `defer` so a fault is resolved per subscription rather than per execution - which is what\n * makes `retry` re-roll it, so an armed \"fail the next two attempts\" lets the third one through like a\n * flaky server would. Injected latency delays the attempt rather than its response, so the loading\n * state genuinely lasts that long and a retry waits it out too.\n *\n * A faulted attempt always goes through `timer`, even at zero latency: no real request can fail in the\n * same tick it was started in, and settling synchronously inside `execute()` would let an injected\n * failure land before the caller has finished wiring the request up.\n */\n const sendWithFaults = (headers: HttpHeaders | undefined) =>\n defer(() => {\n const fault = resolveQueryDevtoolsFault({\n clientName: options.clientName ?? '',\n method: options.method,\n url: options.fullPath,\n });\n\n lastAttemptFaulted = !!fault && fault.status !== null;\n\n if (!fault) return send(headers);\n\n const { status } = fault;\n\n const attempt$ =\n status === null\n ? send(headers)\n : throwError(\n () =>\n new HttpErrorResponse({\n status,\n statusText: 'Injected by the query devtools',\n url: options.fullPath,\n error: { message: `Injected ${status} (query devtools)` },\n }),\n );\n\n return timer(fault.latencyMs).pipe(switchMap(() => attempt$));\n });\n\n const createStream = () => {\n const headers = resolveHeaders();\n const source$ = isQueryDevtoolsFaultInjectionEnabled() ? sendWithFaults(headers) : send(headers);\n\n return source$.pipe(\n tap((event) => updateState(event)),\n retry({\n delay: (error, retryCount) => {\n const retryOptions: ShouldRetryRequestOptions = { error, retryCount };\n\n const retryResult = options.retryFn?.(retryOptions) || runDefaultQueryRetry(retryOptions);\n\n if (!retryResult.retry) {\n return throwError(() => error);\n }\n\n // rxjs counts retries from 1, so the attempt this delay leads up to is one further along.\n const attempt = retryCount + 1;\n\n retryState.set({\n attempt,\n delayMs: retryResult.delay,\n startsAt: Date.now() + retryResult.delay,\n status: error instanceof HttpErrorResponse ? error.status : 0,\n });\n\n return timer(retryResult.delay).pipe(\n tap(() => {\n retryState.set(null);\n attempts.set(attempt);\n }),\n );\n },\n }),\n catchError((e) => {\n updateErrorState(e);\n\n return throwError(() => e);\n }),\n );\n };\n\n const execute = (options?: { allowCache?: boolean; force?: boolean }) => {\n if (!options?.force && (loading() || (!isStale() && options?.allowCache))) {\n // Do not execute if there is already a request in progress or caching is allowed\n return false;\n }\n\n currentStreamSubscription.unsubscribe();\n\n lastExecuteTime.set(Date.now());\n lastLoadEventTime.set(lastExecuteTime());\n lastLoadEventAmount.set(0);\n\n loading.set({\n executeTime: lastExecuteTime(),\n progress: null,\n });\n error.set(null);\n expiresIn.set(null);\n attempts.set(1);\n retryState.set(null);\n\n const stream = createStream();\n\n currentStreamSubscription = stream.subscribe({\n error: () => {\n // Errors are already handled in updateErrorState via catchError\n // This empty handler prevents \"unhandled error\" warnings in tests\n },\n });\n\n return true;\n };\n\n const destroy = () => {\n const wasActive = !currentStreamSubscription.closed;\n\n currentStreamSubscription.unsubscribe();\n // A request destroyed mid-backoff never runs the attempt it was waiting for, so leaving the state\n // set would keep a \"retrying in …\" readout counting down for a request that is gone.\n retryState.set(null);\n event$.complete();\n\n return wasActive;\n };\n\n const updateState = (event: HttpEvent<ResponseType<TArgs>>) => {\n switch (event.type) {\n case HttpEventType.Response:\n {\n loading.set(null);\n response.set(event.body);\n lastDurationMs.set(Date.now() - lastExecuteTime());\n\n const expiresInSeconds = options.cacheAdapter\n ? options.cacheAdapter(event.headers)\n : extractExpiresInSeconds(event.headers);\n const expiresInTimestamp = buildTimestampFromSeconds(expiresInSeconds);\n expiresIn.set(expiresInTimestamp);\n }\n break;\n\n case HttpEventType.UploadProgress:\n case HttpEventType.DownloadProgress:\n {\n updateLoadingState(event);\n }\n break;\n\n case HttpEventType.Sent:\n case HttpEventType.ResponseHeader:\n case HttpEventType.User:\n {\n // we don't care about these events\n }\n break;\n }\n\n currentEvent.set(event);\n event$.next(event);\n };\n\n const updateErrorState = (errorResponse: unknown) => {\n const errorRes = createQueryErrorResponse(errorResponse);\n\n error.set(errorRes);\n loading.set(null);\n lastDurationMs.set(Date.now() - lastExecuteTime());\n\n const errorEvent: HttpErrorEvent = { type: 'error', error: errorRes, faulted: lastAttemptFaulted };\n currentEvent.set(errorEvent);\n event$.next(errorEvent);\n\n options.dependencies.ngErrorHandler.handleError(errorRes.raw);\n };\n\n const updateLoadingState = (event: HttpProgressEvent) => {\n if (event.total === undefined) {\n return;\n }\n\n const progress: HttpRequestLoadingProgressState = {\n total: event.total,\n loaded: event.loaded,\n percentage: (event.loaded / event.total) * 100,\n speed: null,\n remainingTime: null,\n };\n\n const state: HttpRequestLoadingState = {\n executeTime: lastExecuteTime(),\n progress,\n };\n\n const currentTime = Date.now();\n const elapsedTimeSinceLastEvent = currentTime - lastLoadEventTime();\n const elapsedTimeSinceLastExecute = currentTime - lastExecuteTime();\n const loadedAmount = event.loaded - lastLoadEventAmount();\n\n // An event in the same millisecond as the last one, or one that carries no new bytes, has no rate\n // to report - dividing by either zero yields Infinity or NaN. Such an event also keeps the\n // baseline where it is, so the next one measures across the wider window instead of restarting.\n const isMeasurable = elapsedTimeSinceLastEvent > 0 && loadedAmount > 0;\n\n // We only want to calculate speed and remaining time after 2 seconds of the execution\n // This is to avoid showing incorrect speed and remaining time when the request is very fast\n if (isMeasurable && elapsedTimeSinceLastExecute > SPEED_BUFFER_TIME_IN_MS) {\n const bytesPerSecond = (loadedAmount / elapsedTimeSinceLastEvent) * 1000;\n\n progress.speed = bytesPerSecond;\n progress.remainingTime = Math.round((event.total - event.loaded) / bytesPerSecond) * 1000;\n }\n\n if (isMeasurable) {\n lastLoadEventTime.set(currentTime);\n lastLoadEventAmount.set(event.loaded);\n }\n\n loading.set(state);\n };\n\n const lastExternalResponseAt = signal<number | null>(null);\n\n const applyExternalResponse = (externalResponse: { body: ResponseType<TArgs>; expiresAt: number | null }) => {\n response.set(externalResponse.body);\n expiresIn.set(externalResponse.expiresAt);\n error.set(null);\n lastExternalResponseAt.set(Date.now());\n };\n\n const lastPersistedResponseAt = signal<number | null>(null);\n\n const applyPersistedResponse = (persistedResponse: { body: ResponseType<TArgs>; expiresAt: number | null }) => {\n response.set(persistedResponse.body);\n expiresIn.set(persistedResponse.expiresAt);\n lastPersistedResponseAt.set(Date.now());\n };\n\n const httpRequest: HttpRequest<TArgs> = {\n method: options.method,\n url: options.fullPath,\n args: args ?? null,\n execute,\n destroy,\n loading: loading.asReadonly(),\n error: error.asReadonly(),\n response: response.asReadonly(),\n currentEvent: currentEvent.asReadonly(),\n events$: event$.asObservable(),\n isStale,\n expiresAt: expiresIn.asReadonly(),\n subtle: {\n applyExternalResponse,\n lastExternalResponseAt: lastExternalResponseAt.asReadonly(),\n applyPersistedResponse,\n lastPersistedResponseAt: lastPersistedResponseAt.asReadonly(),\n resolveHeaders,\n attempts: attempts.asReadonly(),\n retryState: retryState.asReadonly(),\n lastDurationMs: lastDurationMs.asReadonly(),\n },\n };\n\n return httpRequest;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n computed,\n DestroyRef,\n effect,\n inject,\n Injector,\n runInInjectionContext,\n Signal,\n signal,\n untracked,\n} from '@angular/core';\nimport { describeQueryDevtoolsFeatures } from '../devtools/query-devtools-features';\nimport {\n consumeSuppressQueryStackDevtools,\n isQueryDevtoolsEnabled,\n registerQueryDevtoolsEntry,\n} from '../devtools/query-devtools-hook';\nimport { AnyNewQuery, RequestArgs, ResponseType } from './query';\nimport { AnyQueryCreator, QueryArgsOf, RunQueryCreator } from './query-creator';\nimport { QueryErrorResponse } from './query-error-response';\nimport { queryStackWithArgsUsed, queryStackWithResponseUpdateUsed } from './query-errors';\nimport { QueryFeature, QueryFeatureType, withArgs } from './query-features';\n\nexport type QueryStackSubtle<TCreator extends AnyQueryCreator, TQuery extends AnyNewQuery> = {\n /** Create a new query with the given arguments. You should always prefer the `args` option instead of this. */\n runWithArgs: (\n args: RequestArgs<QueryArgsOf<TCreator>> | RequestArgs<QueryArgsOf<TCreator>>[] | null,\n ) => TQuery | null;\n};\n\nexport type QueryStack<TQuery extends AnyNewQuery, TCreator extends AnyQueryCreator, TTransform> = {\n /** Contains all queries in the stack. */\n queries: Signal<TQuery[]>;\n\n /** Contains the first query in the stack. */\n firstQuery: Signal<TQuery | null>;\n\n /** Contains the last query in the stack. Useful for getting current pagination values. */\n lastQuery: Signal<TQuery | null>;\n\n /** True if any query in the stack is loading. */\n anyLoading: Signal<boolean>;\n\n /** Count of queries currently loading */\n loadingCount: Signal<number>;\n\n /** True if ALL queries are loading */\n allLoading: Signal<boolean>;\n\n /** Progress tracking */\n loadingProgress: Signal<{ loaded: number; total: number }>;\n\n /** Contains the first error that occurred in the stack. */\n anyError: Signal<QueryErrorResponse | null>;\n\n /** All errors from all queries */\n errors: Signal<QueryErrorResponse[]>;\n\n /** Contains the responses of all queries in the stack. Will be `null` for queries that are loading or errored. */\n response: Signal<TTransform>;\n\n /** Executes all queries in the stack. */\n execute: (options?: { allowCache?: boolean }) => void;\n\n /** Destroys all queries in the stack and empties it. This should only be used if `append` is true. */\n clear: () => void;\n\n /** Retry all queries that have errors */\n retryFailed: () => void;\n\n /** Advanced query stack features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */\n subtle: QueryStackSubtle<TCreator, TQuery>;\n};\n\nexport type AnyQueryStack = QueryStack<AnyNewQuery, AnyQueryCreator, any>;\n\nexport type CreateQueryStackOptions<\n TCreator extends AnyQueryCreator,\n TDeps extends () => any,\n TTransform = (ResponseType<QueryArgsOf<TCreator>> | null)[],\n> = {\n /**\n * The query creator function that will be used to create the query stack.\n */\n queryCreator: TCreator;\n\n /**\n * The dependencies that should trigger a new query stack creation.\n * This function can be treated like a computed function. It reacts to signal changes.\n * The return value of this function will be passed to the `args` function.\n *\n * This option can be ignored if `append` is false.\n */\n dependencies?: TDeps;\n\n /**\n * The features that should be used for all queries in the stack.\n *\n * @throws If the `withArgs` feature is used. This feature is internally used.\n *\n * @example\n * // Due to limitations in TypeScript, you have to manually add the needed generic types if needed.\n * features: [E.withSuccessHandling<GetPostQueryArgs>({ handler: (post) => console.log(post.title) })]\n *\n * @example\n * // If typings are not needed, you can use the feature without generics.\n * features: [E.withPolling({ interval: 5000 })]\n */\n features?: QueryFeature<any>[];\n\n /**\n * The arguments to create queries with.\n * This function can be treated like a computed function. It reacts to signal changes.\n * If a signal changes, a new query will be created (and appended to the existing ones if `append` is true).\n * If this function returns `null`, the args will be ignored.\n * If this function returns an array, multiple queries will be created.\n *\n * @example\n * // One query\n * () => ({ queryParams: { postId: myId() } }),\n *\n * @example\n * // Multiple queries (these can of cause also be created using a loop)\n * () => [\n * { queryParams: { postId: myId() } },\n * { queryParams: { postId: myOtherId() } },\n * ],\n *\n * @example\n * // One query with dependencies\n * (deps) => ({ queryParams: { postId: myId(), limit: deps.limit } }),\n */\n args: (deps: ReturnType<TDeps>) => RequestArgs<QueryArgsOf<TCreator>> | RequestArgs<QueryArgsOf<TCreator>>[] | null;\n\n /**\n * If true, new queries will be appended to the existing ones. Otherwise, existing queries will be destroyed.\n * This should be used for things like infinite scrolling where already fetched queries should not be destroyed.\n */\n append?: boolean;\n\n /**\n * If append is true, this function will be called to merge the old and new queries.\n * Useful if you want to append the new queries in a specific order (e.g. at the beginning).\n */\n appendFn?: (\n oldQueries: RunQueryCreator<TCreator>[],\n newQueries: RunQueryCreator<TCreator>[],\n ) => {\n /** The new queries merged with the old ones. */\n queries: RunQueryCreator<TCreator>[];\n\n /** The last query in the new queries. */\n lastQuery: RunQueryCreator<TCreator> | null;\n };\n\n /**\n * Transforms the responses of all queries in the stack. Useful for merging or filtering responses.\n * A response is `null` while its query is loading or errored, so a transform runs on nulls before\n * anything has settled.\n */\n transform?: (responses: (ResponseType<QueryArgsOf<TCreator>> | null)[]) => TTransform;\n\n /**\n * If true, prevents creating queries with identical args.\n * Useful for append mode to avoid duplicate data fetching.\n * @default true\n */\n deduplicateArgs?: boolean;\n\n /**\n * Custom function to generate a unique key from args for deduplication.\n * If not provided, uses JSON.stringify.\n */\n argsKeyFn?: (args: RequestArgs<QueryArgsOf<TCreator>> | null) => string;\n\n /**\n * Maximum number of queries to keep when append is true.\n * When limit is reached, queries will be removed based on removeStrategy.\n * @default Infinity\n */\n maxQueries?: number;\n\n /**\n * Strategy for removing queries when maxQueries is reached.\n * - 'oldest': Remove oldest queries first (FIFO)\n * - 'newest': Remove newest queries first (LIFO)\n * @default 'oldest'\n */\n removeStrategy?: 'oldest' | 'newest';\n};\n\n/** Transforms an array of arrays into a single array and filters out `null` values. */\nexport const transformArrayResponse = <T extends (unknown | null)[]>(responses: T) =>\n responses.filter((r) => !!r).flatMap((r) => r) as NonNullable<T[0]>[];\n\n/** Transforms an array of paginated responses into a single array and filters out `null` values. */\nexport const transformPaginatedResponse = <T extends ({ items: unknown[] } | null)[]>(responses: T) =>\n responses.filter((r) => !!r).flatMap((r) => r.items) as NonNullable<NonNullable<T[0]>['items']>;\n\nexport const createQueryStack = <\n TCreator extends AnyQueryCreator,\n TArgs extends QueryArgsOf<TCreator>,\n TDeps extends () => any,\n TTransform = (ResponseType<TArgs> | null)[],\n>(\n options: CreateQueryStackOptions<TCreator, TDeps, TTransform>,\n) => {\n type QueryType = RunQueryCreator<TCreator>;\n\n const {\n args,\n queryCreator,\n dependencies,\n append,\n features = [],\n appendFn = (oldQueries: QueryType[], newQueries: QueryType[]) => {\n const queries = [...oldQueries, ...newQueries];\n const lastQuery = newQueries[newQueries.length - 1] ?? oldQueries[oldQueries.length - 1] ?? null;\n\n return { queries, lastQuery };\n },\n transform,\n argsKeyFn,\n deduplicateArgs,\n maxQueries = Infinity,\n removeStrategy = 'oldest',\n } = options ?? {};\n\n const injector = inject(Injector);\n\n const queries = signal<QueryType[]>([]);\n const lastQuery = signal<QueryType | null>(null);\n const firstQuery = computed(() => queries()[0] ?? null);\n\n const hasWithArgsFeature = features.some((f) => f.type === QueryFeatureType.WITH_ARGS);\n const hasWithOptimisticUpdateFeature = features.some((f) => f.type === QueryFeatureType.WITH_RESPONSE_UPDATE);\n\n if (hasWithArgsFeature) {\n throw queryStackWithArgsUsed();\n }\n\n if (hasWithOptimisticUpdateFeature) {\n throw queryStackWithResponseUpdateUsed();\n }\n\n const runWithArgs = (args: RequestArgs<QueryArgsOf<TCreator>> | RequestArgs<QueryArgsOf<TCreator>>[] | null) => {\n if (args === null) return null;\n\n return untracked(() => {\n const newArgsArray = Array.isArray(args) ? args : [args];\n\n let filteredArgs = newArgsArray;\n if (deduplicateArgs !== false && append) {\n const keyFn = argsKeyFn ?? ((a) => JSON.stringify(a));\n const existingKeys = new Set(\n queries().map((q) => keyFn(q.args() as RequestArgs<QueryArgsOf<TCreator>> | null)),\n );\n\n filteredArgs = newArgsArray.filter((a) => {\n const key = keyFn(a);\n if (existingKeys.has(key)) return false;\n existingKeys.add(key);\n return true;\n });\n }\n\n const newQueries = runInInjectionContext(injector, () =>\n filteredArgs.map(\n (newArgsEntry) =>\n queryCreator(\n withArgs(() => newArgsEntry),\n ...features,\n ) as QueryType,\n ),\n );\n\n const oldQueries = queries();\n\n if (append) {\n const { queries: appendedQueries, lastQuery: lastAppendedQuery } = appendFn(oldQueries, newQueries);\n\n let finalQueries = appendedQueries;\n if (maxQueries && finalQueries.length > maxQueries) {\n const excessCount = finalQueries.length - maxQueries;\n\n const queriesToRemove =\n removeStrategy === 'newest' ? finalQueries.slice(-excessCount) : finalQueries.slice(0, excessCount);\n\n queriesToRemove.forEach((q) => q.subtle.destroy());\n\n finalQueries =\n removeStrategy === 'newest' ? finalQueries.slice(0, maxQueries) : finalQueries.slice(-maxQueries);\n }\n\n queries.set(finalQueries);\n\n // After the eviction, not before: `removeStrategy: 'newest'` destroys the query `appendFn`\n // just returned, and `lastQuery` must never point at a query that is no longer in the stack.\n const last =\n lastAppendedQuery && finalQueries.includes(lastAppendedQuery)\n ? lastAppendedQuery\n : (finalQueries[finalQueries.length - 1] ?? null);\n\n lastQuery.set(last);\n\n return last;\n } else {\n const keyFn = argsKeyFn ?? ((a) => JSON.stringify(a));\n const newArgsKeys = new Set(newArgsArray.map((a) => keyFn(a)));\n\n const preservedQueries = oldQueries.filter((oldQuery) => {\n const oldKey = keyFn(oldQuery.args() as RequestArgs<QueryArgsOf<TCreator>> | null);\n return newArgsKeys.has(oldKey);\n });\n\n const preservedMap = new Map(\n preservedQueries.map((q) => [keyFn(q.args() as RequestArgs<QueryArgsOf<TCreator>> | null), q]),\n );\n\n const finalQueries = newArgsArray.map((newArgsEntry) => {\n const key = keyFn(newArgsEntry);\n const preserved = preservedMap.get(key);\n\n if (preserved) {\n return preserved;\n }\n\n return runInInjectionContext(\n injector,\n () =>\n queryCreator(\n withArgs(() => newArgsEntry),\n ...features,\n ) as QueryType,\n );\n });\n\n for (const oldQuery of oldQueries) {\n if (!finalQueries.includes(oldQuery)) {\n oldQuery.subtle.destroy();\n }\n }\n\n queries.set(finalQueries);\n\n const last = finalQueries[finalQueries.length - 1] ?? null;\n\n lastQuery.set(last);\n\n return last;\n }\n });\n };\n\n const clear = () => {\n for (const query of queries()) {\n query.subtle.destroy();\n }\n\n queries.set([]);\n lastQuery.set(null);\n };\n\n effect(() => {\n dependencies?.();\n\n untracked(() => clear());\n });\n\n effect(() => runWithArgs(args(dependencies?.())));\n\n const anyLoading = computed(() => queries().some((q) => q.loading()));\n\n const loadingCount = computed(() => queries().filter((q) => q.loading()).length);\n\n const allLoading = computed(() => {\n const qs = queries();\n return qs.length > 0 && qs.every((q) => q.loading());\n });\n\n const loadingProgress = computed(() => {\n const total = queries().length;\n const loaded = queries().filter((q) => !q.loading()).length;\n return { loaded, total };\n });\n\n const anyError = computed(\n () =>\n queries()\n .map((q) => q.error())\n .find((e) => e !== null) ?? null,\n );\n\n const errors = computed(() =>\n queries()\n .map((q) => q.error())\n .filter((e): e is QueryErrorResponse => e !== null),\n );\n\n const response = computed(() => {\n const responses = queries().map((q) => q.response());\n return transform?.(responses) ?? responses;\n }) as Signal<TTransform>;\n\n const execute = (options?: { allowCache?: boolean }) => {\n for (const query of queries()) {\n query.execute({ options: { allowCache: options?.allowCache } });\n }\n };\n\n const retryFailed = () => {\n for (const query of queries()) {\n if (query.error()) {\n query.execute({ options: { allowCache: false } });\n }\n }\n };\n\n const stack: QueryStack<QueryType, TCreator, TTransform> = {\n queries: queries.asReadonly(),\n lastQuery: lastQuery.asReadonly(),\n firstQuery,\n anyLoading,\n loadingCount,\n allLoading,\n loadingProgress,\n anyError,\n errors,\n response,\n execute,\n clear,\n retryFailed,\n subtle: {\n runWithArgs,\n },\n };\n\n const skipDevtools = consumeSuppressQueryStackDevtools();\n\n if (isQueryDevtoolsEnabled() && !skipDevtools) {\n const unregister = registerQueryDevtoolsEntry({\n kind: 'query-stack',\n handle: stack,\n meta: {\n features: describeQueryDevtoolsFeatures(features),\n },\n });\n\n inject(DestroyRef).onDestroy(unregister);\n }\n\n return stack;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { computed, DestroyRef, effect, inject, isDevMode, Signal, signal, untracked } from '@angular/core';\nimport { describeQueryDevtoolsFeatures } from '../devtools/query-devtools-features';\nimport {\n isQueryDevtoolsEnabled,\n registerQueryDevtoolsEntry,\n suppressNextQueryStackDevtools,\n} from '../devtools/query-devtools-hook';\nimport {\n ContentfulGqlLikePaginated,\n DynLikePaginated,\n GgLikePaginated,\n NormalizedPagination,\n Paginated,\n} from '@ethlete/types';\nimport { AnyNewQuery, Query, QueryArgs, RequestArgs, ResponseType } from './query';\nimport { AnyQueryCreator, QueryArgsOf, QueryCreator } from './query-creator';\nimport { QueryErrorResponse } from './query-error-response';\nimport {\n pagedQueryStackNextPageCalledWithoutPreviousPage,\n pagedQueryStackPageBiggerThanTotalPages,\n pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage,\n queryStackTotalQueriesAndExpectedQueriesMismatch,\n} from './query-errors';\nimport { QueryFeature } from './query-features';\nimport { createQueryStack, transformArrayResponse } from './query-stack';\n\nexport const ethletePaginationAdapter = <T>(response: Paginated<T>) => {\n const pagination: NormalizedPagination<T> = {\n items: response.items,\n totalPages: response.totalPageCount,\n currentPage: response.currentPage,\n itemsPerPage: response.itemsPerPage,\n totalHits: response.totalHits,\n };\n\n return pagination;\n};\n\nexport const ggLikePaginationAdapter = <T>(response: GgLikePaginated<T>) => {\n const pagination: NormalizedPagination<T> = {\n items: response.items,\n totalPages: response.totalPageCount,\n currentPage: response.currentPage,\n itemsPerPage: response.itemsPerPage,\n totalHits: response.totalHits,\n };\n\n return pagination;\n};\n\nexport const dynLikePaginationAdapter = <T>(response: DynLikePaginated<T>) => {\n const pagination: NormalizedPagination<T> = {\n items: response.items,\n totalPages: response.totalPages,\n currentPage: response.currentPage,\n itemsPerPage: response.limit,\n totalHits: response.totalHits,\n };\n\n return pagination;\n};\n\nexport const contentfulGqlLikePaginationAdapter = <T>(response: ContentfulGqlLikePaginated<T>) => {\n const totalPages = Math.max(Math.ceil(response.total / response.limit), 1); // If there are no items, there is still one page\n const currentPage = Math.max(Math.ceil(response.skip / response.limit) + 1, 1);\n\n const pagination: NormalizedPagination<T> = {\n items: response.items,\n totalPages,\n currentPage,\n itemsPerPage: response.limit,\n totalHits: response.total,\n };\n\n return pagination;\n};\n\nexport const fakePaginationAdapter = (totalHits = 10) => {\n return <T>(response: T) => {\n const pagination: NormalizedPagination<T> = {\n items: [response],\n totalPages: totalHits,\n currentPage: 1,\n itemsPerPage: 1,\n totalHits,\n };\n\n return pagination;\n };\n};\n\nexport type CreatePagedQueryStackOptions<\n TArgs extends QueryArgs,\n TNormPagination extends NormalizedPagination<unknown>,\n> = {\n /**\n * The normalizer function that will be used to normalize the response to a format that the paged query can understand.\n *\n * There are some built-in normalizers that can be used:\n * - `ethletePaginationAdapter`\n * - `ggLikePaginationAdapter`\n * - `dynLikePaginationAdapter`\n * - `contentfulGqlLikePaginationAdapter`\n * - `fakePaginationAdapter` (for testing purposes)\n *\n * @param currentResponse The current response that was fetched.\n * @param allResponses All responses that were fetched till now including the current response and pagination.\n */\n responseNormalizer: (\n currentResponse: ResponseType<TArgs>,\n allResponses: NonNullable<ResponseType<TArgs>>[],\n ) => TNormPagination;\n\n /**\n * The query creator function that will be used to create the paged query.\n */\n queryCreator: QueryCreator<TArgs>;\n\n /**\n * The arguments to create the query.\n * The current page will be passed as an argument.\n * This function can be treated like a computed function. It reacts to signal changes.\n * If a signal changes, the paged query will be reset to the initial page.\n *\n * @example (page) => ({ queryParams: { page, limit:20 } }),\n *\n * @param page The page to fetch next. **Do not modify this argument.**\n * @param allResponses All responses that were fetched till now including pagination.\n */\n args: (page: number, allResponses: NonNullable<ResponseType<TArgs>>[]) => RequestArgs<TArgs> | null;\n\n /**\n * The features that should be used for all queries in the stack.\n *\n * @throws If the `withArgs` feature is used. This feature is internally used.\n *\n * @example\n * // Due to limitations in TypeScript, you have to manually add the needed generic types if needed.\n * features: [E.withSuccessHandling<GetPostQueryArgs>({ handler: (post) => console.log(post.title) })]\n *\n * @example\n * // If typings are not needed, you can use the feature without generics.\n * features: [E.withPolling({ interval: 5000 })]\n */\n features?: QueryFeature<any>[];\n\n /**\n * The page to start this paged query from.\n * @default 1\n */\n initialPage?: number;\n\n /**\n * If true, no queries will be executed while the paged query is loading.\n * This is useful if you need the current response to be used in the next query.\n *\n * This governs the `fetchNextPage()` / `fetchPreviousPage()` methods only. The\n * `canFetchNextPage` / `canFetchPreviousPage` signals are `false` while any page loads either way,\n * so a UI bound to them never issues the concurrent call this option would allow.\n */\n blockExecutionDuringLoading?: boolean;\n};\n\nexport type PagedQueryStackResetOptions = {\n /**\n * The page to reset this paged query to.\n * This will clear everything and start from this page.\n * @default 1 // or the value passed in the `initialPage` option when creating the paged query.\n */\n initialPage?: number;\n};\n\nexport type PagedQueryStackExecuteOptions<TNormPagination extends NormalizedPagination<unknown>> = {\n /**\n * If provided, only the queries that match the condition will be executed.\n * This will also execute the previous and next query to the one that matched the condition.\n * If not provided, all queries will be executed.\n *\n * @example\n * myPagedQuery.execute({ where: (item) => item.id === 4 });\n */\n where?: (item: TNormPagination['items'][number], index: number, array: TNormPagination['items']) => boolean;\n\n /**\n * If true, the cache will be used (if not expired) and the request will not be made.\n * @default false\n */\n allowCache?: boolean;\n};\n\nexport type PagedQueryStackDirection = 'next' | 'previous';\n\nexport type AnyPagedQueryStack = PagedQueryStack<AnyNewQuery, NormalizedPagination<unknown>>;\n\nexport type PagedQueryStack<TQuery extends AnyNewQuery, TNormPagination extends NormalizedPagination<unknown>> = {\n /**\n * The pagination of the last executed query in the paged query.\n */\n maxPagination: Signal<TNormPagination | null>;\n\n /**\n * The pagination of the first executed query in the paged query.\n */\n minPagination: Signal<TNormPagination | null>;\n\n /**\n * Whether the last page of the paged query is loaded or not.\n */\n isLastPageLoaded: Signal<boolean>;\n\n /**\n * Whether the first page of the paged query is loaded or not.\n */\n isFirstPageLoaded: Signal<boolean>;\n\n /**\n * Fetches the previous page of the paged query.\n *\n * @throws If the paged query is already at the first page.\n */\n fetchPreviousPage: () => TQuery | null;\n\n /**\n * Fetches the next page of the paged query.\n *\n * @throws If the paged query is already at the last page.\n */\n fetchNextPage: () => TQuery | null;\n\n /**\n * Whether the previous page can be fetched or not.\n *\n * This will be false if the paged query is already at the first page or if the paged query is loading.\n */\n canFetchPreviousPage: Signal<boolean>;\n\n /**\n * Whether the next page can be fetched or not.\n *\n * This will be false if the paged query is already at the last page or if the paged query is loading.\n */\n canFetchNextPage: Signal<boolean>;\n\n /**\n * The items of the paged query.\n */\n items: Signal<TNormPagination['items']>;\n\n /**\n * Whether the paged query is loading or not.\n */\n loading: Signal<boolean>;\n\n /**\n * The error that occurred during the last execution of the paged query.\n */\n error: Signal<QueryErrorResponse | null>;\n\n /**\n * The last query executed in the paged query.\n */\n lastQuery: Signal<Query<QueryArgsOf<TQuery>> | null>;\n\n /**\n * Whether the paged query is on its first load or not.\n */\n isFirstLoad: Signal<boolean>;\n\n /**\n * The queries in the paged query stack.\n */\n queries: Signal<TQuery[]>;\n\n /**\n * Resets the paged query to the initial page.\n */\n reset: (resetOptions?: PagedQueryStackResetOptions) => void;\n\n /**\n * Executes the paged query.\n */\n execute: (options?: PagedQueryStackExecuteOptions<TNormPagination>) => void;\n\n /**\n * The current direction of the paged query.\n */\n direction: Signal<PagedQueryStackDirection>;\n};\n\nexport const createPagedQueryStack = <\n TCreator extends AnyQueryCreator,\n TArgs extends QueryArgsOf<TCreator>,\n TNormPagination extends NormalizedPagination<unknown>,\n>(\n options: CreatePagedQueryStackOptions<TArgs, TNormPagination>,\n) => {\n const { responseNormalizer, queryCreator, features } = options;\n\n const currentPageArgs = signal<RequestArgs<TArgs> | null>(null);\n const initialPage = signal(options.initialPage ?? 1);\n const loadedMinPage = signal(initialPage());\n const loadedMaxPage = signal(initialPage());\n const resetTrigger = signal(0);\n\n const pageDirection = signal<PagedQueryStackDirection>('next');\n\n suppressNextQueryStackDevtools();\n const stack = createQueryStack({\n args: () => null,\n queryCreator,\n append: true,\n features,\n appendFn: (oldQueries, newQueries) => {\n const newQuery = newQueries[0];\n const dir = pageDirection();\n\n if (!newQuery) {\n const lastQuery = oldQueries[oldQueries.length - 1] ?? null;\n\n return { queries: oldQueries, lastQuery };\n } else if (dir === 'previous') {\n return { queries: [newQuery, ...oldQueries], lastQuery: newQuery };\n } else {\n return { queries: [...oldQueries, newQuery], lastQuery: newQuery };\n }\n },\n transform: transformArrayResponse,\n });\n\n effect(() => {\n resetTrigger();\n\n const args = options.args(initialPage(), []);\n\n untracked(() => {\n stack.clear();\n currentPageArgs.set(args);\n loadedMinPage.set(initialPage());\n loadedMaxPage.set(initialPage());\n stack.subtle.runWithArgs(args);\n });\n });\n\n const maxPagination = computed(() => {\n const res = stack.lastQuery()?.response();\n const all = stack.response();\n\n if (!res) return null;\n\n return responseNormalizer(res, all);\n });\n\n const minPagination = computed(() => {\n const res = stack.firstQuery()?.response();\n const all = stack.response();\n\n if (!res) return null;\n\n return responseNormalizer(res, all);\n });\n\n const isFirstPageLoaded = computed(() => {\n const min = minPagination();\n\n return min ? loadedMinPage() === 1 : false;\n });\n\n const isLastPageLoaded = computed(() => {\n const max = maxPagination();\n\n return max ? loadedMaxPage() === max.totalPages : false;\n });\n\n const fetchPreviousPage = () => {\n const page = loadedMinPage() - 1;\n const allResponses = stack.response();\n\n if (!canFetchNewPage(page)) {\n return null;\n }\n\n if (page < 1) {\n if (isDevMode()) {\n throw pagedQueryStackPreviousPageCalledButAlreadyAtFirstPage();\n }\n\n return null;\n }\n\n currentPageArgs.set(options.args(page, allResponses));\n loadedMinPage.set(page);\n pageDirection.set('previous');\n\n return stack.subtle.runWithArgs(currentPageArgs());\n };\n\n const fetchNextPage = () => {\n const page = loadedMaxPage() + 1;\n const currentPagination = maxPagination();\n const allResponses = stack.response();\n\n if (!canFetchNewPage(page)) {\n return null;\n }\n\n if (!currentPagination) {\n if (isDevMode()) {\n throw pagedQueryStackNextPageCalledWithoutPreviousPage();\n }\n\n return null;\n }\n\n if (page > currentPagination.totalPages) {\n if (isDevMode()) {\n throw pagedQueryStackPageBiggerThanTotalPages(page, currentPagination.totalPages);\n }\n\n return null;\n }\n\n currentPageArgs.set(options.args(page, allResponses));\n loadedMaxPage.set(page);\n pageDirection.set('next');\n\n return stack.subtle.runWithArgs(currentPageArgs());\n };\n\n const canFetchNewPage = (pageToLoad: number) => {\n const currentMaxPagination = maxPagination();\n const currentMinPagination = minPagination();\n\n if (!currentMaxPagination || !currentMinPagination) {\n return true;\n }\n\n const isOneMinusMinPagination = pageToLoad === currentMinPagination.currentPage - 1;\n const isOnePlusMaxPagination = pageToLoad === currentMaxPagination.currentPage + 1;\n\n if (!options.blockExecutionDuringLoading) {\n const totalQueries = stack.queries().length;\n const expectedQueries = Math.abs(loadedMaxPage() - loadedMinPage()) + 1;\n\n if (totalQueries !== expectedQueries) {\n if (isDevMode()) {\n throw queryStackTotalQueriesAndExpectedQueriesMismatch(totalQueries, expectedQueries);\n }\n }\n\n return true;\n }\n\n if (stack.anyLoading()) {\n return false;\n }\n\n return isOneMinusMinPagination || isOnePlusMaxPagination;\n };\n\n const reset = (resetOptions?: PagedQueryStackResetOptions) => {\n const page = resetOptions?.initialPage ?? initialPage();\n\n initialPage.set(page);\n pageDirection.set('next');\n resetTrigger.update((v) => v + 1);\n };\n\n const canFetchPreviousPage = computed(() => {\n const currentMinPagination = minPagination();\n\n if (!currentMinPagination || stack.anyLoading()) return false;\n\n return loadedMinPage() > 1;\n });\n const canFetchNextPage = computed(() => {\n const currentMaxPagination = maxPagination();\n\n if (!currentMaxPagination || stack.anyLoading()) return false;\n\n return loadedMaxPage() < currentMaxPagination.totalPages;\n });\n\n const items = computed(() => {\n const res = stack.response();\n return res.map((r) => responseNormalizer(r, res).items).flat();\n });\n\n const isFirstLoad = computed(() => {\n return stack.queries().length === 1 && !!stack.lastQuery()?.loading();\n });\n\n const execute = (options?: PagedQueryStackExecuteOptions<TArgs>) => {\n const whereFn = options?.where;\n\n if (whereFn) {\n const queriesToExecute = new Set<Query<TArgs>>();\n const all = stack.response();\n\n for (const [index, query] of stack.queries().entries()) {\n const res = query.response();\n const err = query.error();\n\n if (err) {\n queriesToExecute.add(query);\n } else if (res) {\n if (responseNormalizer(res, all).items.some((item, i, a) => whereFn(item, i, a))) {\n queriesToExecute.add(query);\n\n // Also execute the previous and next query to the one that matched the condition.\n\n if (index !== 0) {\n const prevQuery = stack.queries()[index - 1];\n\n if (prevQuery) {\n queriesToExecute.add(prevQuery);\n }\n }\n\n if (index !== stack.queries().length - 1) {\n const nextQuery = stack.queries()[index + 1];\n\n if (nextQuery) {\n queriesToExecute.add(nextQuery);\n }\n }\n }\n }\n }\n\n for (const query of queriesToExecute) {\n query.execute({ options: { allowCache: options.allowCache } });\n }\n } else {\n stack.execute({ allowCache: options?.allowCache });\n }\n };\n\n const pagedQuery: PagedQueryStack<Query<TArgs>, TNormPagination> = {\n maxPagination,\n minPagination,\n fetchPreviousPage,\n fetchNextPage,\n canFetchPreviousPage,\n canFetchNextPage,\n items,\n direction: pageDirection.asReadonly(),\n loading: stack.anyLoading,\n error: stack.anyError,\n lastQuery: stack.lastQuery,\n isFirstLoad,\n queries: stack.queries,\n isLastPageLoaded,\n isFirstPageLoaded,\n reset,\n execute,\n };\n\n if (isQueryDevtoolsEnabled()) {\n const unregister = registerQueryDevtoolsEntry({\n kind: 'paged-query-stack',\n handle: pagedQuery,\n meta: {\n features: describeQueryDevtoolsFeatures(features),\n },\n });\n\n inject(DestroyRef).onDestroy(unregister);\n }\n\n return pagedQuery;\n};\n","import { QueryMethod } from '../query-creator';\nimport { QueryKey } from '../query-repository';\n\n/**\n * Schema version of the persisted store, owned by this library. Bumping it makes the storage adapter\n * throw away everything it holds and start over, which is the correct response to a change in the\n * *record* shape - an older record could not be read by the new code.\n *\n * This is not the version an app bumps when its *response* shapes change; that is\n * {@link QueryPersistenceConfig.version}, kept per entry so the engine can drop foreign entries\n * without wiping the store.\n */\nexport const QUERY_PERSISTENCE_STORE_VERSION = 1;\n\n/**\n * Everything known about a persisted response except the response itself. Small enough that the\n * engine keeps all of it in memory for the whole session, which is what lets it decide staleness,\n * eviction order and the logout purge without reading a single body back.\n */\nexport type PersistedQueryEntryMeta = {\n /** The cache key the response belongs to - the same key every tab derives for that query. */\n key: QueryKey;\n\n /** When the entry was written, in ms. Drives {@link QueryPersistenceConfig.maxAge} and eviction order. */\n persistedAt: number;\n\n /**\n * Timestamp (ms) at which the response goes stale, or `null` when it has no freshness window.\n * Stored and restored verbatim: it is a server-derived instant, so a value from a previous session\n * is simply in the past. It never suppresses the request a hydrated entry makes - see\n * {@link QueryRepository.applyPersistedResponse}.\n */\n expiresAt: number | null;\n\n /**\n * Whether the entry belongs to a secure (authenticated) request. Tracked so a logout can purge\n * exactly those entries from disk at the moment the in-memory ones go.\n */\n isSecure: boolean;\n\n /** @see QueryPersistenceConfig.version */\n version: number;\n\n /** The full URL of the request, including query params. For the devtools and write-time filtering. */\n url: string;\n\n /** The HTTP method of the request. Always a cacheable read method. */\n method: QueryMethod;\n};\n\n/** A persisted response, ready to be written to (or as it came out of) the store. */\nexport type PersistedQueryEntry = PersistedQueryEntryMeta & {\n /** The raw response body, exactly as the request received it. */\n body: unknown;\n};\n\n/**\n * What a {@link QueryPersistenceAdapter.read} returns on a hit. Wrapped rather than returned bare so\n * a stored body that happens to be `null` cannot be mistaken for a miss.\n */\nexport type PersistedQueryBody = {\n body: unknown;\n};\n","import { QueryKey } from '../query-repository';\nimport { PersistedQueryBody, PersistedQueryEntry, PersistedQueryEntryMeta } from './persisted-query-entry';\n\n/**\n * Where a query client keeps its persisted responses. The default is IndexedDB\n * ({@link createIndexedDbQueryPersistenceAdapter}); an app can supply its own to store responses\n * somewhere else entirely - `localStorage`, the origin private file system, a native store behind a\n * Capacitor plugin.\n *\n * Adapters are deliberately dumb: they read and write what they are handed and nothing else. Every\n * policy decision - how old a body may be, how many are kept, what happens on a logout - is made by\n * the persistence engine, so a custom adapter cannot get any of it subtly wrong.\n *\n * Every method may reject. The engine treats a failing read as a miss and a failing write as a full\n * disk (it prunes and retries once, then stops writing for the session), so an adapter never needs to\n * swallow its own errors.\n */\nexport type QueryPersistenceAdapter = {\n /**\n * Returns the metadata of every entry in the store, without their bodies. Called once per client,\n * at startup - the one bulk read there is.\n */\n loadIndex: () => Promise<PersistedQueryEntryMeta[]>;\n\n /** Reads a single body back, or `null` when the store does not hold that key. */\n read: (key: QueryKey) => Promise<PersistedQueryBody | null>;\n\n /**\n * Writes entries, replacing any it already holds under the same key. Called with a batch, since the\n * engine coalesces writes - an adapter backed by transactions should use one for the whole batch.\n */\n write: (entries: PersistedQueryEntry[]) => Promise<void>;\n\n /** Removes entries by key. Keys the store does not hold are ignored, not an error. */\n remove: (keys: QueryKey[]) => Promise<void>;\n\n /** Empties the store. */\n clear: () => Promise<void>;\n\n /**\n * Whether the underlying storage exists in this environment. `false` means every method is an inert\n * no-op - no IndexedDB (the server, or a browser denying storage access), in which case queries\n * behave exactly as they do without persistence.\n */\n isSupported: boolean;\n};\n\nconst resolveEmptyIndex = () => Promise.resolve<PersistedQueryEntryMeta[]>([]);\nconst resolveNull = () => Promise.resolve(null);\nconst resolveVoid = () => Promise.resolve();\n\n/**\n * An adapter that stores nothing, for environments without storage. Kept as a real adapter rather\n * than a `null` the engine has to check for, so there is only one code path.\n */\nexport const createNoopQueryPersistenceAdapter = (): QueryPersistenceAdapter => ({\n loadIndex: resolveEmptyIndex,\n read: resolveNull,\n write: resolveVoid,\n remove: resolveVoid,\n clear: resolveVoid,\n isSupported: false,\n});\n","import { QueryMethod } from '../query-creator';\nimport { QueryKey } from '../query-repository';\nimport { QueryPersistenceAdapter } from './query-persistence-adapter';\n\n/** A response that is about to be written to disk, as seen by {@link QueryPersistenceConfig.filter}. */\nexport type QueryPersistenceCandidate = {\n /** The cache key the response is held under. */\n key: QueryKey;\n\n /** The full URL of the request, including query params. */\n url: string;\n\n /** The HTTP method. Always a cacheable read method. */\n method: QueryMethod;\n\n /** Whether the response belongs to a secure (authenticated) request. */\n isSecure: boolean;\n};\n\n/**\n * Keeps a query client's successful reads on disk, so a reload - or a cold start without a network -\n * renders the last known data instead of a loading state.\n *\n * @see withQueryPersistence\n */\nexport type QueryPersistenceConfig = {\n /**\n * The name of the underlying store (an IndexedDB database, by default). One per client, so two\n * clients never overwrite each other's entries.\n *\n * @default `et-query-persistence-${client name}`\n */\n storageName?: string;\n\n /**\n * The version of the *response shapes* this app persists. Every entry is written under it, and an\n * entry written under a different one is dropped rather than hydrated.\n *\n * Bump it in the same commit that changes what a response looks like - a renamed field, a different\n * pagination envelope - so a returning user's disk copy cannot be handed to code that no longer\n * understands it. Rolling back works too: the old build ignores what the new one wrote.\n *\n * @default 1\n */\n version?: number;\n\n /**\n * How old (in ms) a persisted response may be and still be shown. Anything older is dropped at\n * startup and never hydrated.\n *\n * This is the only bound on how stale the *first paint* after a cold start can be, and it is\n * independent of both server freshness (`cacheAdapter` / `expiresAt`, which decides whether a read\n * may skip the network) and {@link CreateQueryClientConfigOptions.keepUnusedFor} (which is about\n * memory within one session). A hydrated response is always revalidated, so this is about how\n * plausible the data has to be to be worth showing at all.\n *\n * @default 86400000 (24 hours)\n */\n maxAge?: number;\n\n /**\n * How many responses may be kept at once. When a write pushes the store over the cap, the least\n * recently written entries are removed until it fits.\n *\n * Keeps a query whose cache key changes constantly - search-as-you-type produces one per keystroke -\n * from filling the user's disk with results nobody will ask for again.\n *\n * @default 50\n */\n maxEntries?: number;\n\n /**\n * How long (in ms) writes are collected before being flushed in one batch. A query polled every\n * second must not mean a store transaction every second; only the newest body per key is written.\n *\n * Pending writes are always flushed immediately when the tab is hidden or unloaded, so a reload\n * right after a fetch still finds the data regardless of this.\n *\n * @default 1000\n */\n writeDelay?: number;\n\n /**\n * Where to store responses. Defaults to IndexedDB\n * ({@link createIndexedDbQueryPersistenceAdapter}); supply your own to store them somewhere else.\n * Passed as a function, it is only called in a browser.\n */\n adapter?: QueryPersistenceAdapter | (() => QueryPersistenceAdapter);\n\n /**\n * Narrows what may be written, on top of the per-query\n * {@link BaseQueryCreatorOptions.persistence} flag. Returning `false` keeps that response\n * memory-only.\n *\n * @example\n * // Never persist anything under /admin, wherever it is queried from.\n * filter: ({ url }) => !new URL(url).pathname.startsWith('/admin')\n */\n filter?: (candidate: QueryPersistenceCandidate) => boolean;\n};\n\n/** @see QueryPersistenceConfig.maxAge */\nexport const DEFAULT_QUERY_PERSISTENCE_MAX_AGE = 86_400_000;\n\n/** @see QueryPersistenceConfig.maxEntries */\nexport const DEFAULT_QUERY_PERSISTENCE_MAX_ENTRIES = 50;\n\n/** @see QueryPersistenceConfig.writeDelay */\nexport const DEFAULT_QUERY_PERSISTENCE_WRITE_DELAY = 1000;\n\n/** @see QueryPersistenceConfig.version */\nexport const DEFAULT_QUERY_PERSISTENCE_VERSION = 1;\n","import { isDevMode } from '@angular/core';\nimport { QueryKey, QueryRepository, QueryRepositoryEvent } from '../query-repository';\nimport { PersistedQueryBody, PersistedQueryEntry, PersistedQueryEntryMeta } from './persisted-query-entry';\nimport { QueryPersistenceAdapter } from './query-persistence-adapter';\nimport {\n DEFAULT_QUERY_PERSISTENCE_MAX_AGE,\n DEFAULT_QUERY_PERSISTENCE_MAX_ENTRIES,\n DEFAULT_QUERY_PERSISTENCE_VERSION,\n DEFAULT_QUERY_PERSISTENCE_WRITE_DELAY,\n QueryPersistenceConfig,\n} from './query-persistence-config';\n\n/**\n * The per-client machinery behind the {@link withQueryPersistence} feature: it writes\n * successful reads to the store, reads them back into cache entries a consumer just created, and owns\n * every policy around that - staleness, the entry cap, and the purge a logout triggers.\n *\n * Reachable via `client.subtle.persistence`, and `null` on a client that turned persistence off (or on\n * the server).\n */\nexport type QueryPersistenceEngine = {\n /**\n * Resolves once the store's index has been read, after which a cold cache entry can be hydrated\n * without waiting. Entries created before that are hydrated as soon as it resolves, so nothing is\n * lost by not awaiting it - see {@link QueryClient.whenPersistenceReady}.\n */\n whenReady: Promise<void>;\n\n /** Writes everything still queued, now. */\n flush: () => Promise<void>;\n\n /** Removes every persisted response of this client. */\n clear: () => Promise<void>;\n\n /** The metadata of everything the store holds, for the devtools. Bodies are not read. */\n indexEntries: () => PersistedQueryEntryMeta[];\n\n /** Stops listening, flushes one last time. */\n destroy: () => void;\n};\n\nexport type CreateQueryPersistenceEngineOptions = {\n config: QueryPersistenceConfig;\n repository: QueryRepository;\n adapter: QueryPersistenceAdapter;\n};\n\nexport const createQueryPersistenceEngine = (options: CreateQueryPersistenceEngineOptions): QueryPersistenceEngine => {\n const { config, repository, adapter } = options;\n\n const version = config.version ?? DEFAULT_QUERY_PERSISTENCE_VERSION;\n const maxAge = config.maxAge ?? DEFAULT_QUERY_PERSISTENCE_MAX_AGE;\n const maxEntries = config.maxEntries ?? DEFAULT_QUERY_PERSISTENCE_MAX_ENTRIES;\n const writeDelay = config.writeDelay ?? DEFAULT_QUERY_PERSISTENCE_WRITE_DELAY;\n\n /** What the store holds, without the bodies. Every policy decision is made against this. */\n const index = new Map<QueryKey, PersistedQueryEntryMeta>();\n\n /** Coalesced writes, newest body per key, flushed as one batch. */\n const pendingWrites = new Map<QueryKey, PersistedQueryEntry>();\n\n /** Cache entries that were created before the index finished loading. */\n const pendingHydrations = new Set<QueryKey>();\n\n let writeTimer: ReturnType<typeof setTimeout> | undefined;\n let isReady = false;\n let isDestroyed = false;\n let areWritesDisabled = false;\n let isSecurePurgeDeferred = false;\n let markReady!: () => void;\n\n const whenReady = new Promise<void>((resolve) => (markReady = resolve));\n\n /**\n * Every task that touches the store runs through here, one at a time. A flush is already async by\n * the time the batch leaves for disk, so a logout purge or a clear starting in that window would\n * otherwise have the write land behind it and put the data back.\n */\n let storeChain: Promise<unknown> = Promise.resolve();\n\n const enqueue = <T>(task: () => Promise<T>) => {\n const run = storeChain.catch(() => undefined).then(task);\n\n storeChain = run.catch(() => undefined);\n\n return run;\n };\n\n const isExpired = (meta: PersistedQueryEntryMeta, now = Date.now()) => meta.persistedAt + maxAge <= now;\n\n const metaOf = ({ body: _body, ...meta }: PersistedQueryEntry): PersistedQueryEntryMeta => meta;\n\n const removeKeys = async (keys: QueryKey[]) => {\n if (!keys.length) return;\n\n // Disk first, index second: an entry dropped from the index but still on disk would be invisible\n // forever - never hydrated, never counted against the cap, never cleaned up. Leaving it indexed\n // after a failed removal just means the next flush tries again.\n await adapter.remove(keys);\n\n for (const key of keys) {\n index.delete(key);\n }\n };\n\n const enforceMaxEntries = async () => {\n if (index.size <= maxEntries) return;\n\n const byAge = Array.from(index.values()).sort((a, b) => a.persistedAt - b.persistedAt);\n const excess = byAge.slice(0, index.size - maxEntries).map((meta) => meta.key);\n\n await removeKeys(excess);\n };\n\n const purgeSecure = () => {\n // Dropping the queued bodies is not deferred like the disk half below: a flush scheduled before\n // the logout would otherwise still be holding them when it runs, and put the data back on disk\n // moments after it left memory.\n for (const [key, entry] of pendingWrites) {\n if (entry.isSecure) pendingWrites.delete(key);\n }\n\n return enqueue(async () => {\n const secureKeys = Array.from(index.values())\n .filter((meta) => meta.isSecure)\n .map((meta) => meta.key);\n\n await removeKeys(secureKeys);\n });\n };\n\n const start = async () => {\n if (!adapter.isSupported) {\n isReady = true;\n markReady();\n\n return;\n }\n\n // An unreadable store is treated as an empty one rather than as a reason to give up on writing: the\n // write path has its own failure handling, and whatever broke here may not affect it.\n const storedIndex = await adapter.loadIndex().catch((): PersistedQueryEntryMeta[] => []);\n\n const now = Date.now();\n const droppedKeys: QueryKey[] = [];\n\n for (const meta of storedIndex) {\n if (meta.version !== version || isExpired(meta, now)) {\n droppedKeys.push(meta.key);\n } else {\n index.set(meta.key, meta);\n }\n }\n\n try {\n // Nothing survived - the usual reason being a bumped `version`, i.e. a deploy whose response\n // shapes changed. Emptying the store outright also collects anything the index does not know\n // about, which a key-by-key removal cannot.\n if (droppedKeys.length && !index.size) {\n await enqueue(() => adapter.clear());\n } else if (droppedKeys.length) {\n await enqueue(() => removeKeys(droppedKeys));\n }\n\n // The cap is otherwise only applied by a write, so a store left over the limit - by a deploy\n // that lowered `maxEntries`, or by several tabs writing against their own index - would stay\n // that way until this session happens to write something.\n await enqueue(enforceMaxEntries);\n } catch {\n // Pruning is opportunistic: `maxAge` is re-checked before every hydration, so a failure here\n // costs disk space, never correctness.\n }\n\n isReady = true;\n markReady();\n\n if (isSecurePurgeDeferred) {\n isSecurePurgeDeferred = false;\n await purgeSecure().catch(() => undefined);\n }\n\n const queued = Array.from(pendingHydrations);\n pendingHydrations.clear();\n\n for (const key of queued) {\n void hydrate(key);\n }\n };\n\n const hydrate = async (key: QueryKey) => {\n const meta = index.get(key);\n\n if (!meta || isExpired(meta)) return;\n\n let stored: PersistedQueryBody | null;\n\n try {\n stored = await adapter.read(key);\n } catch {\n return;\n }\n\n if (!stored) {\n // The store disagrees with the index - another tab removed the entry in between. Believe the\n // store.\n index.delete(key);\n\n return;\n }\n\n // Whether this still makes sense is the repository's call: it applies the body only while the\n // entry exists and has no response of its own yet, so a network response that won the race, a\n // sibling tab that got there first, and a destroyed query all end here harmlessly.\n repository.applyPersistedResponse({ key, body: stored.body, expiresAt: meta.expiresAt });\n };\n\n const runFlush = async () => {\n clearTimeout(writeTimer);\n writeTimer = undefined;\n\n if (!pendingWrites.size) return;\n\n const entries = Array.from(pendingWrites.values());\n pendingWrites.clear();\n\n if (areWritesDisabled) return;\n\n try {\n await adapter.write(entries);\n } catch {\n // The realistic failure is a full quota. Free the oldest half and give it exactly one more go -\n // repeated retries against a disk that is genuinely full would just burn transactions.\n try {\n const oldestHalf = Array.from(index.values())\n .sort((a, b) => a.persistedAt - b.persistedAt)\n .slice(0, Math.ceil(index.size / 2))\n .map((meta) => meta.key);\n\n await removeKeys(oldestHalf);\n await adapter.write(entries);\n } catch (error) {\n areWritesDisabled = true;\n\n if (isDevMode()) {\n console.warn(\n '[@ethlete/query] Persisting query responses failed twice and has been disabled for this session.',\n error,\n );\n }\n\n return;\n }\n }\n\n for (const entry of entries) {\n index.set(entry.key, metaOf(entry));\n }\n\n await enforceMaxEntries().catch(() => undefined);\n };\n\n const flush = () => enqueue(runFlush);\n\n const scheduleFlush = () => {\n if (writeTimer !== undefined || areWritesDisabled || isDestroyed) return;\n\n writeTimer = setTimeout(() => void flush(), writeDelay);\n };\n\n const queueWrite = (event: Extract<QueryRepositoryEvent, { type: 'request-success' }>) => {\n if (!adapter.isSupported || areWritesDisabled) return;\n\n const body = event.request.response();\n\n // Only data is worth persisting. A settle without a body (a 204, or a response type the request\n // never resolved) has nothing to hand back on a cold start.\n if (body === null || body === undefined) return;\n\n const candidate = {\n key: event.key,\n url: event.request.url,\n method: event.request.method,\n isSecure: event.isSecure,\n };\n\n if (config.filter && !config.filter(candidate)) return;\n\n pendingWrites.set(event.key, {\n ...candidate,\n body,\n expiresAt: event.request.expiresAt(),\n persistedAt: Date.now(),\n version,\n });\n\n scheduleFlush();\n };\n\n const handleEvent = (event: QueryRepositoryEvent) => {\n if (event.type === 'unbind-all-secure') {\n // A logout before the index has loaded still has to purge - the entries are on disk, this tab\n // simply does not know their keys yet.\n if (!isReady) {\n isSecurePurgeDeferred = true;\n } else {\n void purgeSecure().catch(() => undefined);\n }\n\n return;\n }\n\n if (event.type === 'entry-created') {\n if (!event.isCached || !event.isPersistEnabled) return;\n\n if (isReady) {\n void hydrate(event.key);\n } else {\n pendingHydrations.add(event.key);\n }\n\n return;\n }\n\n if (event.type === 'request-success' && event.isCached && event.isPersistEnabled) queueWrite(event);\n };\n\n const eventSubscription = repository.events$.subscribe(handleEvent);\n\n const clear = () => {\n clearTimeout(writeTimer);\n writeTimer = undefined;\n pendingWrites.clear();\n\n return enqueue(async () => {\n index.clear();\n\n await adapter.clear();\n });\n };\n\n const destroy = () => {\n isDestroyed = true;\n eventSubscription.unsubscribe();\n clearTimeout(writeTimer);\n writeTimer = undefined;\n\n // Best effort: a client is usually destroyed because the app is going away, and whatever settled\n // in the last second is exactly what the next start would want.\n void flush();\n };\n\n void start();\n\n return {\n whenReady,\n flush,\n clear,\n indexEntries: () => Array.from(index.values()),\n destroy,\n };\n};\n","import { QueryKey } from '../query-repository';\nimport {\n PersistedQueryBody,\n PersistedQueryEntry,\n PersistedQueryEntryMeta,\n QUERY_PERSISTENCE_STORE_VERSION,\n} from './persisted-query-entry';\nimport { createNoopQueryPersistenceAdapter, QueryPersistenceAdapter } from './query-persistence-adapter';\n\n/**\n * Metadata and bodies are two object stores rather than one: the engine reads *all* of the metadata at\n * startup and a body only when a query actually asks for it, so keeping them apart means the startup\n * read never deserializes a single response.\n */\nconst META_STORE = 'meta';\nconst BODY_STORE = 'bodies';\n\ntype PersistedBodyRecord = {\n key: QueryKey;\n body: unknown;\n};\n\nconst toPromise = <T>(request: IDBRequest<T>) =>\n new Promise<T>((resolve, reject) => {\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => reject(request.error);\n });\n\n/**\n * Resolves when every write in the transaction is durable. Waiting on the transaction rather than on\n * the individual requests is what surfaces a full disk: a `QuotaExceededError` aborts the whole\n * transaction, which is exactly the signal the engine acts on.\n */\nconst whenComplete = (transaction: IDBTransaction) =>\n new Promise<void>((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n transaction.onabort = () => reject(transaction.error);\n });\n\nexport type CreateIndexedDbQueryPersistenceAdapterOptions = {\n /** The name of the IndexedDB database. One per query client. */\n storageName: string;\n};\n\n/**\n * The default storage backend for the {@link withQueryPersistence} feature: an IndexedDB\n * database per query client.\n *\n * IndexedDB rather than `localStorage` because it stores structured clones - no serialization pass,\n * and no new constraint on what a response body may contain beyond the one multi-tab sync already\n * imposes - and because response bodies are far too large for a 5MB quota shared with everything else\n * on the origin.\n */\nexport const createIndexedDbQueryPersistenceAdapter = (\n options: CreateIndexedDbQueryPersistenceAdapterOptions,\n): QueryPersistenceAdapter => {\n if (typeof indexedDB === 'undefined') return createNoopQueryPersistenceAdapter();\n\n let databasePromise: Promise<IDBDatabase> | null = null;\n\n const openDatabase = () =>\n new Promise<IDBDatabase>((resolve, reject) => {\n const openRequest = indexedDB.open(options.storageName, QUERY_PERSISTENCE_STORE_VERSION);\n\n openRequest.onupgradeneeded = () => {\n const database = openRequest.result;\n\n // Nothing is migrated on a schema change. The store is a cache of things the server can hand\n // out again, so dropping it costs one request per query and keeps the upgrade path a line long.\n for (const storeName of Array.from(database.objectStoreNames)) {\n database.deleteObjectStore(storeName);\n }\n\n database.createObjectStore(META_STORE, { keyPath: 'key' });\n database.createObjectStore(BODY_STORE, { keyPath: 'key' });\n };\n\n openRequest.onsuccess = () => {\n const database = openRequest.result;\n\n // A tab running a newer deploy needs every older connection to go away before it can upgrade\n // the schema. Closing on demand - and forgetting the connection, so the next call reopens -\n // keeps this tab from blocking it indefinitely.\n database.onversionchange = () => {\n database.close();\n databasePromise = null;\n };\n\n resolve(database);\n };\n\n openRequest.onerror = () => reject(openRequest.error);\n\n // The mirror image of the above: another tab is holding a connection open and not letting go, so\n // this upgrade would hang. Failing fast degrades to \"no persistence in this tab\" instead.\n openRequest.onblocked = () =>\n reject(new Error(`[@ethlete/query] Opening \"${options.storageName}\" was blocked by another tab.`));\n });\n\n const database = () => (databasePromise ??= openDatabase());\n\n const loadIndex = async () => {\n const db = await database();\n const transaction = db.transaction(META_STORE, 'readonly');\n\n return await toPromise(transaction.objectStore(META_STORE).getAll() as IDBRequest<PersistedQueryEntryMeta[]>);\n };\n\n const read = async (key: QueryKey): Promise<PersistedQueryBody | null> => {\n const db = await database();\n const transaction = db.transaction(BODY_STORE, 'readonly');\n const record = await toPromise(\n transaction.objectStore(BODY_STORE).get(key) as IDBRequest<PersistedBodyRecord | undefined>,\n );\n\n return record ? { body: record.body } : null;\n };\n\n const write = async (entries: PersistedQueryEntry[]) => {\n if (!entries.length) return;\n\n const db = await database();\n const transaction = db.transaction([META_STORE, BODY_STORE], 'readwrite');\n const meta = transaction.objectStore(META_STORE);\n const bodies = transaction.objectStore(BODY_STORE);\n\n for (const { body, ...entryMeta } of entries) {\n meta.put(entryMeta);\n bodies.put({ key: entryMeta.key, body } satisfies PersistedBodyRecord);\n }\n\n await whenComplete(transaction);\n };\n\n const remove = async (keys: QueryKey[]) => {\n if (!keys.length) return;\n\n const db = await database();\n const transaction = db.transaction([META_STORE, BODY_STORE], 'readwrite');\n const meta = transaction.objectStore(META_STORE);\n const bodies = transaction.objectStore(BODY_STORE);\n\n for (const key of keys) {\n meta.delete(key);\n bodies.delete(key);\n }\n\n await whenComplete(transaction);\n };\n\n const clear = async () => {\n const db = await database();\n const transaction = db.transaction([META_STORE, BODY_STORE], 'readwrite');\n\n transaction.objectStore(META_STORE).clear();\n transaction.objectStore(BODY_STORE).clear();\n\n await whenComplete(transaction);\n };\n\n return { loadIndex, read, write, remove, clear, isSupported: true };\n};\n","import { QueryMethod } from './query-creator';\nimport { QueryRepositoryRefreshFilterFn } from './query-repository';\n\n/** A query of this client that an invalidation is deciding about. */\nexport type QueryInvalidationCandidate = {\n /** The HTTP method of the query. Always a cacheable read method. */\n method: QueryMethod;\n\n /** The full URL of the query, including its query params. */\n url: string;\n};\n\n/**\n * Decides whether a query should be refreshed by an invalidation.\n * @see QueryInvalidationOptions.filter\n */\nexport type QueryInvalidationFilterFn = (query: QueryInvalidationCandidate) => boolean;\n\n/** @see QueryClient.invalidateQueries */\nexport type QueryInvalidationOptions = {\n /**\n * Narrows the invalidation to one part of the API. Given relative it is resolved against the\n * client's `baseUrl`, exactly like a query route; an absolute URL is taken as it is.\n *\n * Matching is boundary aware rather than a plain prefix test, so `/players` covers `/players`,\n * `/players/1` and `/players?page=2` - but not `/players-archive`.\n */\n url?: string;\n /**\n * Narrows the invalidation further, on the built `{ method, url }` of each candidate. Runs after\n * `url` when both are given.\n *\n * **Not broadcast** - a function cannot cross a `BroadcastChannel`, so the other tabs narrow by\n * `url` alone and invalidate a superset. Pair it with `otherTabs: false` when the two must agree.\n *\n * @example\n * // Everything below /players, except the one list the current route is already refetching itself.\n * client.invalidateQueries({ url: '/players', filter: (query) => !query.url.includes('page=1') });\n */\n filter?: QueryInvalidationFilterFn;\n\n /**\n * Whether the user's other tabs invalidate the same queries. Requires\n * the {@link withMultiTabSync} client feature, and is ignored without it.\n *\n * @default true\n */\n otherTabs?: boolean;\n};\n\n/**\n * Resolves an {@link QueryInvalidationOptions.url} to the absolute form request URLs are built in, so\n * the comparison - and the message the other tabs receive - never depends on who resolves it.\n */\nexport const resolveInvalidationUrl = (baseUrl: string, url: string) => {\n const absolute = url.startsWith('/') ? `${baseUrl}${url}` : url;\n\n // A trailing slash would put the boundary check below one character past where the URL actually\n // ends, which is the one way `/players/` could fail to match `/players/1`.\n return absolute.endsWith('/') ? absolute.slice(0, -1) : absolute;\n};\n\n/**\n * Whether a query URL is the invalidated one or sits below it. The check on what follows the prefix\n * is what keeps `/players` from matching `/players-archive`, which a `startsWith` alone would.\n */\nexport const isUnderInvalidatedUrl = (queryUrl: string, invalidatedUrl: string) => {\n if (!queryUrl.startsWith(invalidatedUrl)) return false;\n\n const rest = queryUrl.slice(invalidatedUrl.length);\n\n return rest === '' || rest.startsWith('/') || rest.startsWith('?') || rest.startsWith('#');\n};\n\n/**\n * Turns an invalidation into the filter the repository refreshes by, or `undefined` when nothing\n * narrows it - \"everything in use\" is the repository's own cheapest path.\n */\nexport const createQueryInvalidationFilter = (options: {\n url: string | null;\n filter?: QueryInvalidationFilterFn;\n}): QueryRepositoryRefreshFilterFn | undefined => {\n const { url, filter } = options;\n\n if (!url && !filter) return undefined;\n\n return (request) => {\n if (url && !isUnderInvalidatedUrl(request.url, url)) return false;\n\n return filter ? filter({ method: request.method, url: request.url }) : true;\n };\n};\n","/**\n * An error body can be an HTML page instead of JSON: a proxy's 502, a load balancer's maintenance page, a\n * platform's \"service temporarily unavailable\". The markup is never worth showing, but the sentence inside it\n * usually is - this file pulls that sentence out.\n *\n * Parsing is done with string matching rather than `DOMParser` on purpose: it must work during SSR, and the\n * markup must never reach a DOM. What comes back is plain text, so a template can bind it as text like any\n * other error message.\n */\n\n/** A full document, however sloppily written. */\nconst HTML_DOCUMENT_PATTERN = /<!doctype\\s+html|<html[\\s>]|<head[\\s>]|<body[\\s>]/i;\n\n/** A fragment - matched only as a balanced pair, so a message that merely mentions `<p>` is not markup. */\nconst HTML_ELEMENT_PATTERN = /<(h[1-6]|p|div|title|pre)\\b[^>]*>[\\s\\S]*<\\/\\1>/i;\n\n/** Carries no readable text, and `<style>` in particular would otherwise flood the fallback. */\nconst HTML_NOISE_PATTERN = /<(script|style|noscript|svg|iframe|template)\\b[^>]*>[\\s\\S]*?<\\/\\1>/gi;\n\nconst HTML_COMMENT_PATTERN = /<!--[\\s\\S]*?-->/g;\n\nconst HTML_TAG_PATTERN = /<[^>]*>/g;\n\nconst HTML_ENTITY_PATTERN = /&(#x[0-9a-f]+|#[0-9]+|[a-z][a-z0-9]*);/gi;\n\nconst HTML_BODY_PATTERN = /<body\\b[^>]*>([\\s\\S]*?)<\\/body>/i;\n\nconst HTML_HEADING_PATTERN = /<h([1-6])\\b[^>]*>([\\s\\S]*?)<\\/h\\1>/i;\n\nconst HTML_TITLE_PATTERN = /<title\\b[^>]*>([\\s\\S]*?)<\\/title>/i;\n\nconst HTML_PARAGRAPH_PATTERN = /<p\\b[^>]*>([\\s\\S]*?)<\\/p>/gi;\n\n/**\n * The entities an error page actually uses. A complete table would be kilobytes for no gain - anything missing\n * is left as written, which is still readable.\n */\nconst HTML_ENTITIES: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n nbsp: ' ',\n ensp: ' ',\n emsp: ' ',\n thinsp: ' ',\n shy: '',\n ndash: '–',\n mdash: '-',\n hellip: '…',\n lsquo: '‘',\n rsquo: '’',\n ldquo: '“',\n rdquo: '”',\n laquo: '«',\n raquo: '»',\n bull: '•',\n middot: '·',\n deg: '°',\n copy: '©',\n reg: '®',\n trade: '™',\n euro: '€',\n pound: '£',\n auml: 'ä',\n ouml: 'ö',\n uuml: 'ü',\n Auml: 'Ä',\n Ouml: 'Ö',\n Uuml: 'Ü',\n szlig: 'ß',\n};\n\n/** Long enough for a real explanation, short enough that a dumped stack trace can't become the message. */\nconst MAX_MESSAGE_LENGTH = 300;\n\nconst MAX_CODE_POINT = 0x10ffff;\n\nconst decodeHtmlEntities = (value: string) =>\n value.replace(HTML_ENTITY_PATTERN, (match, entity: string) => {\n if (entity.startsWith('#')) {\n const isHex = entity[1] === 'x' || entity[1] === 'X';\n const codePoint = Number.parseInt(isHex ? entity.slice(2) : entity.slice(1), isHex ? 16 : 10);\n\n // `String.fromCodePoint` throws on anything out of range, and a malformed page is exactly where that shows up.\n return Number.isInteger(codePoint) && codePoint > 0 && codePoint <= MAX_CODE_POINT\n ? String.fromCodePoint(codePoint)\n : match;\n }\n\n return HTML_ENTITIES[entity] ?? HTML_ENTITIES[entity.toLowerCase()] ?? match;\n });\n\n/**\n * Tags are dropped before entities are decoded, so an escaped `&lt;script&gt;` in the page's text can never\n * turn back into markup on the way out.\n */\nconst toPlainText = (html: string) =>\n decodeHtmlEntities(html.replace(HTML_TAG_PATTERN, ' ')).replace(/\\s+/g, ' ').trim();\n\nconst truncate = (value: string) =>\n value.length <= MAX_MESSAGE_LENGTH ? value : `${value.slice(0, MAX_MESSAGE_LENGTH - 1).trimEnd()}…`;\n\nconst matchText = (html: string, pattern: RegExp, group: number) => {\n const text = pattern.exec(html)?.[group];\n\n return text ? toPlainText(text) || null : null;\n};\n\nconst paragraphTexts = (html: string) => {\n const texts: string[] = [];\n\n for (const match of html.matchAll(HTML_PARAGRAPH_PATTERN)) {\n const text = toPlainText(match[1] ?? '');\n\n if (text) texts.push(text);\n }\n\n return texts;\n};\n\n/**\n * Whether a value is an HTML error page rather than a message meant to be read as-is.\n *\n * Deliberately strict: a document marker, or a balanced element pair. A message containing a stray `<` or a\n * lone `<br>` stays a message.\n */\nexport const isHtmlErrorPayload = (value: unknown): value is string =>\n typeof value === 'string' && (HTML_DOCUMENT_PATTERN.test(value) || HTML_ELEMENT_PATTERN.test(value));\n\n/**\n * The HTML of an error body, or `null` when the body isn't an error page.\n *\n * Two shapes carry one: the raw string body of any failed response, and the `{ error, text }` wrapper\n * Angular's XHR backend produces when a `200` response fails to parse as JSON - which is how a proxy handing\n * back an HTML page with a success status arrives.\n */\nexport const htmlErrorPayload = (body: unknown): string | null => {\n if (isHtmlErrorPayload(body)) return body;\n\n if (typeof body === 'object' && !!body && 'text' in body && isHtmlErrorPayload(body.text)) {\n return body.text;\n }\n\n return null;\n};\n\n/**\n * The readable message inside an HTML error page, or `null` when it has none.\n *\n * Prefers what a page puts its message in: the first heading (or the `<title>` when there is no heading),\n * followed by the first paragraph that says something new. Falls back to the page's flattened text, so an\n * unusually structured page still yields something. The result is always plain text, and always short enough\n * to sit in a toast.\n *\n * @example\n * extractHtmlErrorMessage('<h1>Service Unavailable</h1><p>The server is restarting.</p>');\n * // 'Service Unavailable: The server is restarting.'\n */\nexport const extractHtmlErrorMessage = (html: string): string | null => {\n const document = html.replace(HTML_COMMENT_PATTERN, ' ').replace(HTML_NOISE_PATTERN, ' ');\n const body = HTML_BODY_PATTERN.exec(document)?.[1] ?? document;\n\n const headline = matchText(body, HTML_HEADING_PATTERN, 2) ?? matchText(document, HTML_TITLE_PATTERN, 1);\n const detail = paragraphTexts(body).find((text) => text !== headline) ?? null;\n\n if (headline && detail) {\n // A headline that already ends in punctuation is a sentence, not a label.\n const separator = /[.!?:]$/.test(headline) ? ' ' : ': ';\n\n return truncate(`${headline}${separator}${detail}`);\n }\n\n const message = headline ?? detail ?? toPlainText(body);\n\n return message ? truncate(message) : null;\n};\n","import { extractHtmlErrorMessage, htmlErrorPayload } from './query-error-html-utils';\nimport { QueryErrorParser } from './query-error-parsing';\nimport {\n isClassValidatorError,\n isSymfonyFormViolationListError,\n isSymfonyListError,\n} from './query-error-response-utils';\n\n/**\n * Recovers the sentence inside an HTML error page (a proxy's 502, a maintenance page) and drops the\n * markup. Installed by {@link withHtmlErrorParsing}.\n *\n * A page with no readable text parses to no messages at all, which leaves the `HttpErrorResponse`'s\n * own message in place - still better than a wall of tags.\n */\nexport const htmlQueryErrorParser: QueryErrorParser = (detail) => {\n const html = htmlErrorPayload(detail);\n\n if (!html) return null;\n\n const message = extractHtmlErrorMessage(html);\n\n return message ? [message] : [];\n};\n\n/**\n * Reads the error shapes a Symfony/API-Platform backend and a NestJS class-validator pipeline answer\n * with: a form violation list, a bare violation array, and `{ message: string[] }`. Installed by\n * {@link withSymfonyErrors}.\n */\nexport const symfonyQueryErrorParser: QueryErrorParser = (detail) => {\n if (isClassValidatorError(detail)) return [...detail.message];\n if (isSymfonyFormViolationListError(detail)) return detail.violations.map((violation) => violation.message);\n if (isSymfonyListError(detail)) return detail.map((error) => error.message);\n\n return null;\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { clamp } from '@ethlete/core';\nimport { isSymfonyPagerfantaOutOfRangeError } from './query-error-response-utils';\n\nexport type ShouldRetryRequestOptions = {\n retryCount: number;\n error: HttpErrorResponse;\n};\n\nexport type ShouldRetryRequestResult =\n | {\n retry: false;\n }\n | {\n retry: true;\n delay: number;\n };\n\nexport type ShouldRetryRequestFn = (options: ShouldRetryRequestOptions) => ShouldRetryRequestResult;\n\nexport const shouldRetryRequest = (\n options: ShouldRetryRequestOptions | HttpErrorResponse,\n): ShouldRetryRequestResult => {\n const normalizedOptions =\n options instanceof HttpErrorResponse ? { retryCount: 0, error: options } : (options as ShouldRetryRequestOptions);\n const { retryCount, error } = normalizedOptions;\n const defaultRetryDelay = clamp(1000 + 1000 * retryCount, 1000, 5000);\n const { status, error: detail, headers } = error;\n\n // Code 0 usually means the internet connection is down. We retry in this case.\n // It could also be a CORS issue but that should not be the case in production.\n // We will retry in this case until the connection is back.\n if (status === 0) {\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Don't retry if we already retried 3 times\n if (retryCount > 3) {\n return { retry: false };\n }\n\n // Don't retry if it's not an http error\n if (!(error instanceof HttpErrorResponse)) {\n return { retry: false };\n }\n\n // Retry on 5xx errors (except 500 internal server error since those are usually not recoverable)\n if (status >= 501) {\n // Don't retry if a requested page is out of range\n if (isSymfonyPagerfantaOutOfRangeError(detail)) {\n return { retry: false };\n }\n\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Retry on 408 or 425 errors\n if (status === 408 || status === 425) {\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Retry on 429 errors\n if (status === 429) {\n const retryAfter = headers.get('retry-after') || headers.get('x-retry-after');\n\n if (retryAfter) {\n const delay = parseInt(retryAfter) * 1000;\n\n return { retry: true, delay: Number.isNaN(delay) ? defaultRetryDelay : delay };\n }\n\n return { retry: true, delay: defaultRetryDelay };\n }\n\n return { retry: false };\n};\n","import { Signal, signal } from '@angular/core';\n\n/** A single outstanding request for the lock of one key. */\nexport type QueryKeyLockHold = {\n /**\n * Whether this tab currently holds the lock. Starts `false` - the lock is granted asynchronously,\n * and while another tab holds it this stays `false` until that tab goes away.\n */\n isHolder: Signal<boolean>;\n\n /**\n * Gives the lock up, or cancels the request while it is still queued. Idempotent, so it is safe to\n * call from both a cleanup path and an explicit handoff.\n */\n release: () => void;\n};\n\n/**\n * Where a tab stands on one key: `holder` means it is the tab doing the work, `standby` that it is\n * queued behind another tab and skipping the work in the meantime.\n */\nexport type QueryKeyLockState = 'holder' | 'standby';\n\n/**\n * Elects one tab per key, so work that only one tab needs to do (polling a cache key) happens once\n * per browser instead of once per tab.\n *\n * Backed by the Web Locks API, which solves the parts that make hand-rolled leader election\n * unpleasant: requests queue FIFO, and a holder that closes, crashes or navigates away releases its\n * lock automatically - no heartbeats, no split-brain window.\n */\nexport type QueryKeyLockManager = {\n /** Requests the lock for `key`. */\n hold: (key: string) => QueryKeyLockHold;\n\n /**\n * Whether the Web Locks API backs this manager. When `false` every caller is immediately the\n * holder of every key, which degrades to \"every tab does the work itself\".\n */\n isSupported: boolean;\n\n /**\n * Every key this tab has an outstanding hold for, and where it stands on it. Reactive, and read by\n * the query devtools to answer \"why isn't this tab polling?\" - not part of the general contract.\n */\n keyStates: Signal<Record<string, QueryKeyLockState>>;\n};\n\nconst noop = () => undefined;\n\n/** Shared because it never changes: without Web Locks, every hold is granted and never lost. */\nconst alwaysHolder: QueryKeyLockHold = { isHolder: /* @__PURE__ */ signal(true).asReadonly(), release: noop };\nconst noKeyStates = /* @__PURE__ */ signal<Record<string, QueryKeyLockState>>({}).asReadonly();\n\nexport const createQueryKeyLockManager = (namespace: string): QueryKeyLockManager => {\n const locks = typeof navigator === 'undefined' ? undefined : navigator.locks;\n\n if (!locks) return { hold: () => alwaysHolder, isSupported: false, keyStates: noKeyStates };\n\n const activeHolds = new Set<{ key: string; isHolder: Signal<boolean> }>();\n const keyStates = signal<Record<string, QueryKeyLockState>>({});\n\n // Recomputed imperatively rather than derived: the set of holds is not itself reactive, and the\n // three moments it can change (requested, granted, released) are all right here.\n const publishKeyStates = () => {\n const states: Record<string, QueryKeyLockState> = {};\n\n for (const activeHold of activeHolds) {\n if (activeHold.isHolder()) {\n states[activeHold.key] = 'holder';\n } else if (!states[activeHold.key]) {\n states[activeHold.key] = 'standby';\n }\n }\n\n keyStates.set(states);\n };\n\n const hold = (key: string): QueryKeyLockHold => {\n const isHolder = signal(false);\n const abortController = new AbortController();\n const activeHold = { key, isHolder: isHolder.asReadonly() };\n\n let releaseHeldLock: (() => void) | null = null;\n let isReleased = false;\n\n activeHolds.add(activeHold);\n publishKeyStates();\n\n const release = () => {\n if (isReleased) return;\n\n isReleased = true;\n isHolder.set(false);\n activeHolds.delete(activeHold);\n publishKeyStates();\n\n // Exactly one of these applies: the lock is ours, so resolving the promise the platform is\n // waiting on hands it to the next tab in line - or the request is still queued, and aborting\n // takes it out of the queue.\n if (releaseHeldLock) {\n releaseHeldLock();\n } else {\n abortController.abort();\n }\n };\n\n locks\n .request(`${namespace}:${key}`, { signal: abortController.signal }, () => {\n // Aborting a request the platform has already granted does nothing, so a release that raced\n // the grant lands here instead: take the lock and give it straight back.\n if (isReleased) return Promise.resolve();\n\n isHolder.set(true);\n publishKeyStates();\n\n return new Promise<void>((resolve) => {\n releaseHeldLock = resolve;\n });\n })\n .catch(() => {\n // A queued request that gets aborted rejects with an `AbortError`, which is the normal way a\n // standby hold ends. Nothing to recover from in either case - this tab is simply not the\n // holder, which is what the signal already says.\n isHolder.set(false);\n });\n\n return { isHolder: activeHold.isHolder, release };\n };\n\n return { hold, isSupported: true, keyStates: keyStates.asReadonly() };\n};\n","import { shouldCacheQuery } from '../query-cache-utils';\nimport { createQueryInvalidationFilter } from '../query-invalidation';\nimport { QueryRepository, QueryRepositoryEvent } from '../query-repository';\nimport { QueryKeyLockManager } from './query-key-lock-manager';\nimport { QueryMultiTabSyncConfig } from './query-sync-config';\nimport { QuerySyncMessage } from './query-sync-message';\nimport { QuerySyncTransport } from './query-sync-transport';\n\n/**\n * The per-client machinery behind the {@link withMultiTabSync} feature: it broadcasts\n * what settles in this tab, applies what settles in the others, and owns the lock manager that\n * decides which tab polls a given cache key.\n *\n * Reachable from query features via `deps.client.subtle.sync`, and `null` on a client that did not\n * enable sync (or on the server).\n */\nexport type QuerySyncEngine = {\n /**\n * Whether polling should be deduplicated across tabs. Already accounts for response sharing being\n * a prerequisite, so a feature can act on this alone.\n */\n isPollingDedupeEnabled: boolean;\n\n /** Elects the one tab responsible for a cache key. */\n lockManager: QueryKeyLockManager;\n\n /**\n * Tells the other tabs to refresh the queries they have in use below `url`, or all of them for\n * `null`. What {@link QueryClient.invalidateQueries} broadcasts.\n */\n postInvalidation: (url: string | null) => void;\n\n /** Stops broadcasting and listening, and closes the channel. */\n destroy: () => void;\n};\n\nexport type CreateQuerySyncEngineOptions = {\n config: QueryMultiTabSyncConfig;\n repository: QueryRepository;\n transport: QuerySyncTransport;\n lockManager: QueryKeyLockManager;\n};\n\nexport const createQuerySyncEngine = (options: CreateQuerySyncEngineOptions): QuerySyncEngine => {\n const { config, repository, transport, lockManager } = options;\n\n const syncResponses = config.syncResponses ?? true;\n const refreshOnMutation = config.refreshOnMutation ?? true;\n\n // Suppressing a poll is only safe while the suppressed tab still gets the data, so dedup without\n // response sharing would just make a tab stop updating. Enforced here rather than documented.\n const isPollingDedupeEnabled =\n (config.dedupePolling ?? true) && syncResponses && transport.isSupported && lockManager.isSupported;\n\n const mutationFilter = typeof refreshOnMutation === 'object' ? refreshOnMutation.filter : null;\n\n const broadcast = (event: QueryRepositoryEvent) => {\n if (event.type !== 'request-success' || !event.isMultiTabSyncEnabled) return;\n\n if (event.isCached) {\n if (!syncResponses) return;\n\n transport.post({\n type: 'response',\n key: event.key,\n body: event.request.response(),\n expiresAt: event.request.expiresAt(),\n });\n\n return;\n }\n\n // Everything else is either a mutation or a read that opted out of the cache. Only the former is\n // worth telling the other tabs about - and an uncacheable read has no shared key to send anyway.\n if (!refreshOnMutation || shouldCacheQuery(event.request.method)) return;\n\n transport.post({ type: 'mutation', method: event.request.method, url: event.request.url });\n };\n\n const apply = (message: QuerySyncMessage) => {\n if (message.type === 'response') {\n if (!syncResponses) return;\n\n repository.applyExternalResponse({ key: message.key, body: message.body, expiresAt: message.expiresAt });\n\n return;\n }\n\n // An invalidation is something the other tab's app code asked for explicitly, so unlike the\n // mutation heuristic it is not something `refreshOnMutation: false` opts out of.\n if (message.type === 'invalidate') {\n repository.refreshInUse(createQueryInvalidationFilter({ url: message.url }), {\n type: 'invalidation',\n url: message.url,\n otherTab: true,\n });\n\n return;\n }\n\n if (!refreshOnMutation) return;\n\n const mutation = { method: message.method, url: message.url };\n\n repository.refreshInUse(mutationFilter ? (request) => mutationFilter(mutation, request) : undefined, {\n type: 'mutation',\n url: message.url,\n otherTab: true,\n });\n };\n\n const postInvalidation = (url: string | null) => transport.post({ type: 'invalidate', url });\n\n const eventSubscription = repository.events$.subscribe(broadcast);\n const unlisten = transport.listen(apply);\n\n const destroy = () => {\n unlisten();\n eventSubscription.unsubscribe();\n transport.destroy();\n };\n\n return { isPollingDedupeEnabled, lockManager, postInvalidation, destroy };\n};\n","import { QueryMethod } from '../query-creator';\nimport { QueryKey } from '../query-repository';\n\n/**\n * Version of the cross-tab message protocol. A tab ignores messages carrying a version it does not\n * know rather than guessing at a shape it has never seen - the realistic case being a user with the\n * previous deploy still open next to a freshly loaded one.\n *\n * Bump this whenever {@link QuerySyncMessage} changes in a way an older tab could misread. Skew\n * *within* one version (a response body whose shape changed server-side) is accepted risk, the same\n * as it is for the bearer auth token sync.\n *\n * Adding a whole new message *type* is not such a change and must not bump it: an older tab already\n * drops what it does not recognize (see {@link unwrapQuerySyncMessage}), whereas a bump would make it\n * drop the types it does know as well.\n */\nexport const QUERY_SYNC_PROTOCOL_VERSION = 1;\n\n/** A cacheable request settled successfully in another tab. */\nexport type QuerySyncResponseMessage = {\n type: 'response';\n\n /** The cache key of the entry the response belongs to. Deterministic across tabs. */\n key: QueryKey;\n\n /** The response body, structured-cloned by the channel. */\n body: unknown;\n\n /** Timestamp (ms) at which the response goes stale, or `null` when it has no freshness window. */\n expiresAt: number | null;\n};\n\n/** A mutation settled successfully in another tab. */\nexport type QuerySyncMutationMessage = {\n type: 'mutation';\n\n /** The HTTP method of the mutation. */\n method: QueryMethod;\n\n /** The full URL the mutation was sent to. */\n url: string;\n};\n\n/** Another tab was told to invalidate queries, explicitly. */\nexport type QuerySyncInvalidateMessage = {\n type: 'invalidate';\n\n /**\n * The absolute URL the invalidation was narrowed to, or `null` for every query in use. Already\n * resolved by the tab that sent it - the two tabs run the same client, so its `baseUrl` is ours.\n */\n url: string | null;\n};\n\nexport type QuerySyncMessage = QuerySyncResponseMessage | QuerySyncMutationMessage | QuerySyncInvalidateMessage;\n\n/** What actually travels over the channel: a message plus the protocol version that produced it. */\nexport type QuerySyncEnvelope = QuerySyncMessage & { v: number };\n\nexport const wrapQuerySyncMessage = (message: QuerySyncMessage): QuerySyncEnvelope => ({\n ...message,\n v: QUERY_SYNC_PROTOCOL_VERSION,\n});\n\n/**\n * Validates an incoming channel payload and unwraps it, returning `null` for anything this tab\n * cannot safely act on: a foreign protocol version, or something that is not one of our messages at\n * all (a browser extension or another library posting on a colliding channel name).\n */\nexport const unwrapQuerySyncMessage = (data: unknown): QuerySyncMessage | null => {\n if (typeof data !== 'object' || data === null) return null;\n\n const raw = data as Record<string, unknown>;\n\n if (raw['v'] !== QUERY_SYNC_PROTOCOL_VERSION) return null;\n\n const type = raw['type'];\n const key = raw['key'];\n const method = raw['method'];\n const url = raw['url'];\n const expiresAt = raw['expiresAt'];\n\n if (type === 'response' && typeof key === 'string') {\n return {\n type: 'response',\n key,\n body: raw['body'],\n expiresAt: typeof expiresAt === 'number' ? expiresAt : null,\n };\n }\n\n if (type === 'mutation' && typeof method === 'string' && typeof url === 'string') {\n return { type: 'mutation', method: method as QueryMethod, url };\n }\n\n if (type === 'invalidate' && (typeof url === 'string' || url === null)) {\n return { type: 'invalidate', url };\n }\n\n return null;\n};\n","import { isDevMode } from '@angular/core';\nimport { QuerySyncMessage, unwrapQuerySyncMessage, wrapQuerySyncMessage } from './query-sync-message';\n\nexport type QuerySyncMessageListener = (message: QuerySyncMessage) => void;\n\n/**\n * The channel a query client talks to its other tabs over. Wraps `BroadcastChannel` so the message\n * envelope, the version check and the \"not available here\" case all live in one place.\n */\nexport type QuerySyncTransport = {\n /** Broadcasts a message to every other tab listening on the same channel. */\n post: (message: QuerySyncMessage) => void;\n\n /** Registers a listener for messages from other tabs. Returns an unlisten function. */\n listen: (listener: QuerySyncMessageListener) => () => void;\n\n /** Closes the underlying channel and drops every listener. */\n destroy: () => void;\n\n /**\n * Whether a real channel backs this transport. `false` means every method is a no-op - no\n * `BroadcastChannel` in this environment (the server, or a very old browser).\n */\n isSupported: boolean;\n};\n\nconst noop = () => undefined;\n\nexport const createQuerySyncTransport = (channelName: string): QuerySyncTransport => {\n if (typeof BroadcastChannel === 'undefined') {\n return { post: noop, listen: () => noop, destroy: noop, isSupported: false };\n }\n\n const channel = new BroadcastChannel(channelName);\n const listeners = new Set<QuerySyncMessageListener>();\n\n // One `onmessage` fanning out to a Set rather than letting each caller own the property: the sync\n // engine and (later) other internals all need to listen, and the last one to assign would win.\n channel.onmessage = (event: MessageEvent<unknown>) => {\n const message = unwrapQuerySyncMessage(event.data);\n\n if (!message) return;\n\n for (const listener of listeners) {\n listener(message);\n }\n };\n\n const post = (message: QuerySyncMessage) => {\n try {\n channel.postMessage(wrapQuerySyncMessage(message));\n } catch (error) {\n // A body the structured clone algorithm cannot handle throws `DataCloneError`. Swallowing it\n // keeps the repository event subscription this runs inside alive - the only cost of a\n // non-cloneable response is that the other tabs do not learn about it.\n if (isDevMode()) {\n console.warn(`[@ethlete/query] Could not broadcast a message on \"${channelName}\".`, error);\n }\n }\n };\n\n const listen = (listener: QuerySyncMessageListener) => {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n };\n\n const destroy = () => {\n listeners.clear();\n channel.close();\n };\n\n return { post, listen, destroy, isSupported: true };\n};\n","import { DestroyRef } from '@angular/core';\nimport {\n formatQueryDevtoolsDuration,\n QueryDevtoolsFeatureDescriber,\n queryDevtoolsFnDetail,\n} from '../devtools/query-devtools-features';\nimport { htmlQueryErrorParser, symfonyQueryErrorParser } from './query-error-parsers';\nimport { registerQueryErrorParser, setDefaultQueryRetryFn } from './query-error-parsing';\nimport { shouldRetryRequest } from './query-retry-utils';\nimport { createIndexedDbQueryPersistenceAdapter } from './persistence/query-persistence-indexed-db';\nimport { QueryPersistenceConfig } from './persistence/query-persistence-config';\nimport { createQueryPersistenceEngine, QueryPersistenceEngine } from './persistence/query-persistence-engine';\nimport { QueryRepository } from './query-repository';\nimport { createQueryKeyLockManager } from './sync/query-key-lock-manager';\nimport { QueryMultiTabSyncConfig } from './sync/query-sync-config';\nimport { createQuerySyncEngine, QuerySyncEngine } from './sync/query-sync-engine';\nimport { createQuerySyncTransport } from './sync/query-sync-transport';\n\nexport const QueryClientFeatureType = {\n PERSISTENCE: 'PERSISTENCE',\n MULTI_TAB_SYNC: 'MULTI_TAB_SYNC',\n HTML_ERROR_PARSING: 'HTML_ERROR_PARSING',\n SYMFONY_ERRORS: 'SYMFONY_ERRORS',\n DEFAULT_RETRY: 'DEFAULT_RETRY',\n ETHLETE_API_ERRORS: 'ETHLETE_API_ERRORS',\n} as const;\n\nexport type QueryClientFeatureType = (typeof QueryClientFeatureType)[keyof typeof QueryClientFeatureType];\n\n/** What a query client hands to its features while it is being created. */\nexport type QueryClientFeatureContext = {\n /** The name the client was created with. */\n clientName: string;\n\n /** The client's repository. */\n repository: QueryRepository;\n\n /** The destroy ref of the injector the client was created in. */\n destroyRef: DestroyRef;\n\n /** Whether the client runs in a browser. Features must stay inert on the server. */\n isBrowser: boolean;\n};\n\nexport type QueryClientMultiTabSyncFeature = {\n type: typeof QueryClientFeatureType.MULTI_TAB_SYNC;\n instance: QuerySyncEngine | null;\n\n /** How the feature was configured, for the devtools. Only called while devtools are enabled. */\n devtools?: QueryDevtoolsFeatureDescriber;\n};\n\nexport type QueryClientPersistenceFeature = {\n type: typeof QueryClientFeatureType.PERSISTENCE;\n instance: QueryPersistenceEngine | null;\n\n /** How the feature was configured, for the devtools. Only called while devtools are enabled. */\n devtools?: QueryDevtoolsFeatureDescriber;\n};\n\n/**\n * A feature that only installs error-pipeline behavior. It has no per-client instance: how an error\n * body is read, and whether a failed request is retried, is a property of the app rather than of one\n * client.\n */\nexport type QueryClientErrorPipelineFeature = {\n type:\n | typeof QueryClientFeatureType.HTML_ERROR_PARSING\n | typeof QueryClientFeatureType.SYMFONY_ERRORS\n | typeof QueryClientFeatureType.DEFAULT_RETRY\n | typeof QueryClientFeatureType.ETHLETE_API_ERRORS;\n instance: null;\n};\n\nexport type QueryClientFeature =\n QueryClientMultiTabSyncFeature | QueryClientPersistenceFeature | QueryClientErrorPipelineFeature;\n\nexport type QueryClientFeatureFn = (context: QueryClientFeatureContext) => QueryClientFeature;\n\nconst describeRefreshOnMutation = (config: QueryMultiTabSyncConfig['refreshOnMutation']) => {\n if (config === false) return 'no';\n if (config === true || config === undefined) return 'every query in use';\n\n return 'filtered';\n};\n\n/**\n * Coordinates a query client with its own instances in the user's **other tabs**, over a\n * `BroadcastChannel` and the Web Locks API. Three things happen once it is on:\n *\n * 1. a successful read is shared, so the same query shows the same data in every tab without a\n * second request,\n * 2. the same cache key polled in several tabs is polled by one of them, the others being fed the\n * result,\n * 3. a successful mutation in one tab refreshes what the other tabs currently have on screen.\n *\n * Always inert on the server, and a no-op in a browser without `BroadcastChannel`.\n *\n * The one thing it requires is that response bodies survive a structured clone, which JSON always\n * does; a body that cannot be cloned is warned about in dev mode and simply not shared. Individual\n * queries can stay tab-local via {@link BaseQueryCreatorOptions.multiTabSync} — worth doing for very\n * large payloads on a short polling interval.\n *\n * @example\n * const MY_CLIENT = createQueryClient({\n * name: 'my-api',\n * baseUrl: 'https://api.example.com',\n * features: [withMultiTabSync()],\n * });\n */\nexport const withMultiTabSync =\n (config?: QueryMultiTabSyncConfig): QueryClientFeatureFn =>\n ({ clientName, repository, destroyRef, isBrowser }) => {\n // There are no other tabs to talk to on the server, and a per-request injector must not open a\n // channel it would then have to remember to close.\n if (!isBrowser) return { type: QueryClientFeatureType.MULTI_TAB_SYNC, instance: null };\n\n const syncConfig = config ?? {};\n const channelName = syncConfig.channelName ?? `et-query-sync-${clientName}`;\n\n const sync = createQuerySyncEngine({\n config: syncConfig,\n repository,\n transport: createQuerySyncTransport(channelName),\n // Keyed off the channel, not the client name: the channel is what says \"these clients\n // are the same client, in different tabs\", so the locks have to agree with it.\n lockManager: createQueryKeyLockManager(`et-query-poll:${channelName}`),\n });\n\n destroyRef.onDestroy(sync.destroy);\n\n return {\n type: QueryClientFeatureType.MULTI_TAB_SYNC,\n instance: sync,\n devtools: () => [\n { label: 'channel', value: channelName },\n { label: 'share responses', value: syncConfig.syncResponses === false ? 'no' : 'yes' },\n { label: 'dedupe polling', value: syncConfig.dedupePolling === false ? 'no' : 'yes' },\n { label: 'refresh on mutation', value: describeRefreshOnMutation(syncConfig.refreshOnMutation) },\n ],\n };\n };\n\n/**\n * Keeps a query client's successful reads on disk (IndexedDB), so a reload renders the last known\n * data right away instead of a loading state — and so does a cold start with no network at all.\n *\n * A hydrated response is **always** revalidated: persisted data fills a cache entry while its request\n * is already on its way, and never replaces something newer. What the user sees is last week's list\n * immediately, then this week's a moment later; offline, they see last week's list plus the error.\n *\n * Bounded by design: only successful reads are stored, **secure responses need an explicit\n * {@link BaseQueryCreatorOptions.persistence} on the query** (and are removed again on logout),\n * nothing older than `maxAge` is ever shown, and at most `maxEntries` responses are kept. Always\n * inert on the server and in a browser without IndexedDB.\n *\n * Bump {@link QueryPersistenceConfig.version} in the commit that changes what a response looks like —\n * that is what stops a returning user's disk copy from reaching code that can no longer read it.\n *\n * @example\n * const MY_CLIENT = createQueryClient({\n * name: 'my-api',\n * baseUrl: 'https://api.example.com',\n * features: [withQueryPersistence()],\n * });\n */\nexport const withQueryPersistence =\n (config?: QueryPersistenceConfig): QueryClientFeatureFn =>\n ({ clientName, repository, destroyRef, isBrowser }) => {\n // A per-request injector has no disk to read and no session to remember, and `transferCache`\n // already covers the SSR hand-off to the browser.\n if (!isBrowser) return { type: QueryClientFeatureType.PERSISTENCE, instance: null };\n\n const persistenceConfig = config ?? {};\n\n const engine = createQueryPersistenceEngine({\n config: persistenceConfig,\n repository,\n adapter:\n (typeof persistenceConfig.adapter === 'function' ? persistenceConfig.adapter() : persistenceConfig.adapter) ??\n createIndexedDbQueryPersistenceAdapter({\n storageName: persistenceConfig.storageName ?? `et-query-persistence-${clientName}`,\n }),\n });\n\n // Writes are coalesced, so the tab going away is the one moment they cannot wait: a reload right\n // after a fetch is exactly the case persistence exists for. `visibilitychange` is what fires\n // reliably on mobile, where `pagehide` sometimes does not.\n const flush = () => void engine.flush();\n const flushWhenHidden = () => {\n if (document.visibilityState === 'hidden') flush();\n };\n\n document.addEventListener('visibilitychange', flushWhenHidden);\n window.addEventListener('pagehide', flush);\n\n destroyRef.onDestroy(() => {\n document.removeEventListener('visibilitychange', flushWhenHidden);\n window.removeEventListener('pagehide', flush);\n engine.destroy();\n });\n\n return {\n type: QueryClientFeatureType.PERSISTENCE,\n instance: engine,\n devtools: () => [\n { label: 'store', value: persistenceConfig.storageName ?? `et-query-persistence-${clientName}` },\n { label: 'version', value: String(persistenceConfig.version ?? 1) },\n { label: 'max age', value: formatQueryDevtoolsDuration(persistenceConfig.maxAge ?? 86_400_000) },\n { label: 'max entries', value: String(persistenceConfig.maxEntries ?? 50) },\n { label: 'write delay', value: formatQueryDevtoolsDuration(persistenceConfig.writeDelay ?? 1000) },\n ...(persistenceConfig.adapter ? [{ label: 'adapter', value: 'custom' }] : []),\n ...queryDevtoolsFnDetail(persistenceConfig.filter, 'filter'),\n ],\n };\n };\n\n/**\n * Teaches the error pipeline to read an **HTML error page** - the 502 a proxy answers with, a\n * maintenance page, anything that is markup rather than JSON. Without it such a body is not\n * inspected at all and the error carries the `HttpErrorResponse`'s own message.\n *\n * The extractor and its entity table are ~0.9 kB gz that an app talking to a JSON-only API never\n * needs, which is why it is opt-in.\n *\n * @example\n * const MY_CLIENT = createQueryClient({\n * name: 'my-api',\n * baseUrl: 'https://api.example.com',\n * features: [withHtmlErrorParsing()],\n * });\n */\nexport const withHtmlErrorParsing = (): QueryClientFeatureFn => () => {\n registerQueryErrorParser(htmlQueryErrorParser);\n\n return { type: QueryClientFeatureType.HTML_ERROR_PARSING, instance: null };\n};\n\n/**\n * Teaches the error pipeline the shapes a Symfony/API-Platform backend and a NestJS class-validator\n * pipeline answer with: a form violation list (`{ violations: [...] }`), a bare violation array, and\n * `{ message: string[] }`. Without it a form response with several field violations is read by the\n * built-in ladder, which sees no `message` string and falls back to the response's own message.\n *\n * @example\n * const MY_CLIENT = createQueryClient({\n * name: 'my-api',\n * baseUrl: 'https://api.example.com',\n * features: [withSymfonyErrors()],\n * });\n */\nexport const withSymfonyErrors = (): QueryClientFeatureFn => () => {\n registerQueryErrorParser(symfonyQueryErrorParser);\n\n return { type: QueryClientFeatureType.SYMFONY_ERRORS, instance: null };\n};\n\n/**\n * Installs the SDK's default retry policy for every request that does not bring its own `retryFn`:\n * retry a connection failure indefinitely, a 5xx above 500, a 408/425, and a 429 (honouring\n * `retry-after`), up to three times with a backing-off delay - and never a Pagerfanta out-of-range\n * page.\n *\n * Without it nothing is retried automatically and `error.retryState` always reads `{ retry: false }`.\n * A per-client or per-creator `retryFn` keeps working either way.\n *\n * @example\n * const MY_CLIENT = createQueryClient({\n * name: 'my-api',\n * baseUrl: 'https://api.example.com',\n * features: [withDefaultRetry()],\n * });\n */\nexport const withDefaultRetry = (): QueryClientFeatureFn => () => {\n setDefaultQueryRetryFn(shouldRetryRequest);\n\n return { type: QueryClientFeatureType.DEFAULT_RETRY, instance: null };\n};\n\n/**\n * Everything the error pipeline used to do before it became opt-in: {@link withHtmlErrorParsing},\n * {@link withSymfonyErrors} and {@link withDefaultRetry} in one feature. The soft landing for an app\n * talking to an Ethlete API - and the right default for any Symfony backend behind a proxy.\n *\n * Prefer the individual features once you know which of the three the API actually needs; each one\n * left out is code the app stops shipping.\n *\n * @example\n * const MY_CLIENT = createQueryClient({\n * name: 'my-api',\n * baseUrl: 'https://api.example.com',\n * features: [withEthleteApiErrors()],\n * });\n */\nexport const withEthleteApiErrors = (): QueryClientFeatureFn => () => {\n registerQueryErrorParser(htmlQueryErrorParser);\n registerQueryErrorParser(symfonyQueryErrorParser);\n setDefaultQueryRetryFn(shouldRetryRequest);\n\n return { type: QueryClientFeatureType.ETHLETE_API_ERRORS, instance: null };\n};\n","import { randomId } from '@ethlete/core';\nimport { HttpClient, HttpErrorResponse, HttpEventType } from '@angular/common/http';\nimport { DestroyRef, ErrorHandler, Injector, Signal, signal } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { buildRoute } from './internal/request-route';\nimport { createHttpRequest, HttpRequest } from './http-request';\nimport { QueryArgs, RequestArgs } from './query';\nimport { buildQueryCacheKey, shouldCacheQuery } from './query-cache-utils';\nimport { CreateQueryClientConfigOptions } from './query-client';\nimport { CreateQueryCreatorOptions, QueryMethod, RouteType } from './query-creator';\nimport { uncacheableRequestHasAllowCacheParam, uncacheableRequestHasCacheKeyParam } from './query-errors';\nimport { RunQueryExecuteOptions } from './query-execute-utils';\nimport { ShouldRetryRequestFn } from './query-retry-utils';\n\n/**\n * Why a batch of in-use entries was refreshed. The answer to \"why did this refetch?\", which the query\n * devtools spell out per query - the entries themselves only ever see a forced execution.\n */\nexport type QueryRefreshCause = {\n /**\n * - `refresh` - {@link QueryClient.refreshQueriesInUse}, which narrows nothing.\n * - `invalidation` - {@link QueryClient.invalidateQueries}.\n * - `mutation` - the multi-tab sync engine reacting to a mutation another tab made.\n */\n type: 'refresh' | 'invalidation' | 'mutation';\n\n /** The URL the refresh was narrowed to (an invalidation's scope, a mutation's URL), or `null`. */\n url: string | null;\n\n /** Whether another tab asked for it rather than this one. */\n otherTab: boolean;\n};\n\n/**\n * What tore a cache entry down: the last consumer went away (`unbind`), its `keepUnusedFor` window ran\n * out (`expired`), it was the least recently orphaned entry over the cap (`unused-cap`), a logout\n * dropped every secure entry (`logout`), or something evicted it by hand (`manual`).\n */\nexport type QueryRepositoryEntryDestroyedCause = 'unbind' | 'expired' | 'unused-cap' | 'logout' | 'manual';\n\nexport type QueryRepositoryEvent =\n | {\n type: 'request-error';\n error: HttpErrorResponse;\n key: QueryKey;\n isSecure: boolean;\n request: HttpRequest<QueryArgs>;\n }\n | {\n type: 'request-success';\n key: QueryKey;\n isSecure: boolean;\n request: HttpRequest<QueryArgs>;\n\n /**\n * Whether the request is held in the cache under a key every tab derives identically (a hash of\n * route + args) rather than a per-request UUID. `false` for mutations and anything else\n * uncacheable - which is exactly what tells the multi-tab sync engine whether a settled request\n * is a shareable read or a mutation other tabs should react to.\n */\n isCached: boolean;\n\n /** @see BaseQueryCreatorOptions.multiTabSync */\n isMultiTabSyncEnabled: boolean;\n\n /**\n * Whether this response may be written to the client's persisted store. Already accounts for\n * secure requests needing an explicit opt-in.\n *\n * @see BaseQueryCreatorOptions.persistence\n */\n isPersistEnabled: boolean;\n }\n | {\n /**\n * A cache entry was created - the query behind it had nothing to bind to, so this is the moment a\n * response from a previous session can still be of use. The persistence engine answers it by\n * reading the key back from disk.\n *\n * Only ever emitted for entries that did not exist before; a consumer binding to an entry that is\n * already there is not one of these.\n */\n type: 'entry-created';\n\n key: QueryKey;\n\n /** @see QueryRepositoryEvent.isCached */\n isCached: boolean;\n\n /** @see QueryRepositoryEvent.isPersistEnabled */\n isPersistEnabled: boolean;\n }\n | {\n /**\n * A batch of in-use entries was re-executed at once. Emitted for every\n * {@link QueryRepository.refreshInUse} call, including one that matched nothing - \"the\n * invalidation ran and hit no query\" is an answer too.\n */\n type: 'queries-refreshed';\n\n cause: QueryRefreshCause;\n\n /** The requests that were re-executed, in cache order. */\n requests: HttpRequest<QueryArgs>[];\n }\n | {\n /**\n * A cache entry was torn down: its request is destroyed and the key is gone from the cache.\n * Emitted after the deletion, and for every teardown path there is - which is what makes \"why\n * did this entry disappear\" answerable at all. {@link unbindAllSecure} emits one of these per\n * entry as well as its own `unbind-all-secure`.\n *\n * The repository keeps no record of its own; a consumer that wants a history of destroyed\n * entries (the devtools panel) is the one that keeps it.\n */\n type: 'entry-destroyed';\n\n key: QueryKey;\n isSecure: boolean;\n method: QueryMethod;\n url: string;\n\n cause: QueryRepositoryEntryDestroyedCause;\n }\n | {\n /**\n * Every secure entry was torn down at once - a logout. Emitted after the cache is cleared so\n * secure queries can drop the state they hold themselves; the repository only owns the\n * requests, not the `response` signal of the query objects bound to them.\n */\n type: 'unbind-all-secure';\n };\n\nexport type QueryRepositoryRequestOptions<TArgs extends QueryArgs> = {\n /**\n * The route of the request.\n * @example '/users'\n * @example (args) => `/users/${args.userId}`\n */\n route: RouteType<TArgs>;\n\n /** The HTTP method of the request */\n method: QueryMethod;\n\n /** If the request is secure (needs authentication) */\n isSecure?: boolean;\n\n /** The data of the request */\n args?: RequestArgs<TArgs> | null;\n\n /** The query creator options of the request */\n creatorOptions?: CreateQueryCreatorOptions;\n\n /** Custom retry function for this specific request */\n retryFn?: ShouldRetryRequestFn;\n\n /** If set, this request's cache key will be prefixed with this key */\n key?: string;\n\n /** The previous tracking key of the request */\n previousKey?: QueryKey | null;\n\n /** The destroy ref to bind the request to. If the destroy ref is destroyed, the request will be destroyed as well. */\n consumerDestroyRef: DestroyRef;\n\n /** Configuration on how to run the query */\n runQueryOptions?: RunQueryExecuteOptions;\n\n /** @see QueryConfig.silenceUncacheableAllowCacheError */\n silenceUncacheableAllowCacheError?: boolean;\n\n /**\n * Whether re-running the request on its own is safe, i.e. whether {@link QueryRepository.refreshInUse}\n * may fire it again. Defaults to the method being a read (`GET`/`HEAD`/`OPTIONS`); the GraphQL\n * execute path passes `true` for a query transported via `POST`.\n */\n isRefreshable?: boolean;\n};\n\nexport type QueryRepositoryItem<TArgs extends QueryArgs> = {\n /** The key of the request (either a cache key for cacheable requests or a UUID for uncacheable requests) */\n key: QueryKey;\n\n /** The request object */\n request: HttpRequest<TArgs>;\n\n /**\n * Whether this call started a network request. `false` when a fresh cache entry answered it, or when\n * an identical request was already in flight - the consumer is bound to that request either way and\n * still gets its response.\n */\n executed: boolean;\n};\n\n/**\n * A read-only snapshot of a single cache entry, exposed via {@link QueryRepositorySubtle.cacheEntries}\n * for devtools inspection. The raw cache `Map` is never exposed.\n */\nexport type QueryRepositoryCacheEntry = {\n /** The cache key of the entry. */\n key: QueryKey;\n\n /** Whether the entry belongs to a secure (authenticated) request. */\n isSecure: boolean;\n\n /** How many consumers currently hold a binding to the entry. */\n consumerCount: number;\n\n /**\n * Whether the entry has no consumers left and is only being kept around for its\n * `keepUnusedFor` window. Such an entry is not a leak - it is waiting to be reused by a\n * consumer that comes back.\n */\n isUnused: boolean;\n\n /** The underlying HTTP request. */\n request: HttpRequest<QueryArgs>;\n};\n\n/**\n * Advanced repository internals used by the query devtools. **Not part of the general public\n * contract** - do not build application logic on top of these.\n */\nexport type QueryRepositorySubtle = {\n /** Returns a read-only snapshot of every entry currently held in the cache. */\n cacheEntries: () => QueryRepositoryCacheEntry[];\n\n /** A version counter bumped whenever the cache changes (bind / unbind / unbindAllSecure). */\n cacheVersion: Signal<number>;\n\n /**\n * Destroys and removes a single cache entry by key, regardless of its consumers. Intended for\n * devtools cache management - consumers still holding the query will get a fresh request on their\n * next execution.\n */\n evict: (key: QueryKey) => void;\n};\n\n/**\n * Narrows which in-use entries a {@link QueryRepository.refreshInUse} call refreshes. Returning\n * `false` leaves the entry alone.\n */\nexport type QueryRepositoryRefreshFilterFn = (request: HttpRequest<QueryArgs>) => boolean;\n\n/** @see QueryRepository.applyExternalResponse */\nexport type ApplyExternalResponseOptions = {\n /** The cache key the response belongs to. */\n key: QueryKey;\n\n /** The response body, as received from the other tab. */\n body: unknown;\n\n /** Timestamp (ms) at which the response goes stale, or `null` when it has no freshness window. */\n expiresAt: number | null;\n};\n\n/** @see QueryRepository.applyPersistedResponse */\nexport type ApplyPersistedResponseOptions = {\n /** The cache key the response belongs to. */\n key: QueryKey;\n\n /** The response body, as it was read back from the store. */\n body: unknown;\n\n /**\n * Timestamp (ms) at which the response goes stale, as it was when the response was persisted - so\n * usually in the past, which is exactly right: the entry revalidates and the data is shown meanwhile.\n */\n expiresAt: number | null;\n};\n\n/**\n * The query repository is responsible for managing all requests and their consumers.\n * It will cache requests if they can be cached and reuse them if they are already cached.\n * It will also destroy requests if there are no more consumers left.\n */\nexport type QueryRepository = {\n /** Creates a new request. If the request is already cached, it will be reused. */\n request: <TArgs extends QueryArgs>(options: QueryRepositoryRequestOptions<TArgs>) => QueryRepositoryItem<TArgs>;\n\n /** Removes a consumer from a request by its key. Destroys the request if there are no more consumers left. */\n unbind: (key: QueryKey | null, consumerDestroyRef: DestroyRef) => boolean;\n\n /** Removes all secure requests and their consumers */\n unbindAllSecure: () => void;\n\n /**\n * Re-executes every cacheable entry that still has consumers, bypassing the cache and restarting\n * in-flight requests. Entries kept only for their `keepUnusedFor` window are skipped - nobody is\n * looking at them, and they revalidate on their own when a consumer binds again.\n *\n * Pass a filter to narrow it down to a subset of those entries, and a cause to describe what asked\n * for it - which is what the devtools report as the reason a query refetched.\n *\n * @see QueryClient.refreshQueriesInUse\n */\n refreshInUse: (filter?: QueryRepositoryRefreshFilterFn, cause?: QueryRefreshCause) => void;\n\n /**\n * Writes a response that another tab received onto the matching cache entry, so the same query\n * shows the same data everywhere without a second network request.\n *\n * Returns whether it was applied. It is skipped when\n * - no entry exists for the key: cold entries are never seeded on speculation, that would be\n * unbounded memory for data nobody in this tab is looking at,\n * - the entry's creator opted out of {@link BaseQueryCreatorOptions.multiTabSync},\n * - or the entry has a request in flight, which is at least as fresh and overwrites this anyway.\n *\n * Entries sitting out their `keepUnusedFor` window without consumers *are* updated - it costs\n * nothing and means a returning consumer renders data that is current rather than merely recent.\n */\n applyExternalResponse: (options: ApplyExternalResponseOptions) => boolean;\n\n /**\n * Writes a response from a previous session - read back from the client's persisted store - onto a\n * cache entry that has nothing of its own yet.\n *\n * Returns whether it was applied. It is skipped when\n * - no entry exists for the key: the entry was destroyed again while the store was being read,\n * - the entry's creator opted out of {@link BaseQueryCreatorOptions.persistence},\n * - or the entry already holds a response - from its own request, or from another tab. Persisted data\n * only ever fills a gap; it never replaces something newer.\n *\n * Note that the entry's request is *not* stopped: hydration happens while it is already in flight, so\n * persisted data is always shown alongside a revalidation rather than instead of one. An entry whose\n * request already failed keeps its error, which is what makes the offline case honest - the data is\n * from disk, and the attempt to refresh it did fail.\n */\n applyPersistedResponse: (options: ApplyPersistedResponseOptions) => boolean;\n\n /** Observable stream of repository events (errors, successes, etc.) */\n events$: Observable<QueryRepositoryEvent>;\n\n /** Advanced repository internals used by the query devtools. */\n subtle: QueryRepositorySubtle;\n};\n\n/** The key of a query (either a cache key for cacheable requests or a UUID for uncacheable requests) */\nexport type QueryKey = string;\n\n/** Runs .unbind() if the DestroyRef.onDestroy() gets called */\nexport type DestroyCleanupCallback = () => void;\n\n/**\n * Keeps track of all places where the request gets used. Once the last consumer is gone the entry is\n * either destroyed right away or kept for `keepUnusedFor` milliseconds so a consumer that comes back\n * (e.g. via browser back navigation) finds its data already there.\n */\ntype DestroyListenerMapItem = {\n consumers: Map<DestroyRef, DestroyCleanupCallback>;\n request: HttpRequest<QueryArgs>;\n isSecure: boolean;\n eventSubscription?: { unsubscribe: () => void };\n\n /** Whether the entry lives under a cache key other tabs derive identically. */\n isCached: boolean;\n\n /** @see QueryRepositoryRequestOptions.isRefreshable */\n isRefreshable: boolean;\n\n /** @see BaseQueryCreatorOptions.multiTabSync */\n isMultiTabSyncEnabled: boolean;\n\n /** @see QueryRepositoryEvent.isPersistEnabled */\n isPersistEnabled: boolean;\n\n /** How long this entry survives without consumers. `0` destroys it immediately. */\n keepUnusedFor: number;\n\n /** When the entry lost its last consumer - drives the eviction order of the unused-entry cap. */\n unusedSince?: number;\n\n /** Pending eviction of an unused entry, cancelled as soon as a consumer binds again. */\n evictTimer?: ReturnType<typeof setTimeout>;\n};\n\ntype BindEntryOptions = {\n key: QueryKey;\n consumerDestroyRef: DestroyRef;\n request: HttpRequest<QueryArgs>;\n isSecure: boolean;\n\n /**\n * Whether the entry may be shared with other consumers of the same key. Uncacheable requests get a\n * per-request UUID key and are never reused.\n */\n isCached: boolean;\n\n /** @see QueryRepositoryRequestOptions.isRefreshable */\n isRefreshable: boolean;\n\n isMultiTabSyncEnabled: boolean;\n isPersistEnabled: boolean;\n keepUnusedFor: number;\n};\n\nexport type QueryRepositoryDependencies = {\n /** The HTTP client to use for the requests */\n httpClient: HttpClient;\n\n /** The error handler to use for the requests */\n ngErrorHandler: ErrorHandler;\n\n /** The injector to use for reactive operations like signal->observable conversions */\n injector: Injector;\n};\n\nexport type CreateQueryRepositoryConfig = CreateQueryClientConfigOptions & {\n /** The dependencies of the query repository */\n dependencies: QueryRepositoryDependencies;\n\n /**\n * Whether unused entries may be retained at all. `false` forces `keepUnusedFor` to `0` everywhere,\n * regardless of client or creator configuration - used to disable retention on the server, where a\n * per-request injector must not hold response bodies (and a pending timer) for minutes.\n * @default true\n */\n retentionEnabled?: boolean;\n};\n\nconst generateUuid = () => randomId();\n\n/** @see CreateQueryClientConfigOptions.keepUnusedFor */\nexport const DEFAULT_KEEP_UNUSED_FOR = 300_000;\n\n/**\n * Hard cap on entries kept without consumers, per client. Retention is opportunistic, so a runaway\n * count (a search-as-you-type query produces a new cache key per keystroke, and each one goes through\n * `unbind`) must never grow unbounded - the least recently orphaned entries are dropped first.\n */\nexport const MAX_UNUSED_ENTRIES = 50;\n\nexport const createQueryRepository = (config: CreateQueryRepositoryConfig): QueryRepository => {\n const cache = new Map<QueryKey, DestroyListenerMapItem>();\n const eventsSubject = new Subject<QueryRepositoryEvent>();\n\n // Bumped on every cache mutation so the devtools cache view can react. Cheap enough to keep\n // unconditional - it is a single integer signal with no readers unless the devtools are open.\n const cacheVersion = signal(0);\n const bumpCacheVersion = () => cacheVersion.update((v) => v + 1);\n\n const resolveKeepUnusedFor = (creatorOptions: CreateQueryCreatorOptions | undefined, shouldCache: boolean) => {\n if (config.retentionEnabled === false || !shouldCache) return 0;\n\n return Math.max(0, creatorOptions?.keepUnusedFor ?? config.keepUnusedFor ?? DEFAULT_KEEP_UNUSED_FOR);\n };\n\n const request = <TArgs extends QueryArgs>(options: QueryRepositoryRequestOptions<TArgs>) => {\n const { args, creatorOptions, runQueryOptions } = options;\n const shouldCache =\n creatorOptions?.subtle?.useQueryRepositoryCache === false\n ? false\n : shouldCacheQuery(options.method) || creatorOptions?.subtle?.useQueryRepositoryCache === true;\n\n const isRefreshable = shouldCache && (options.isRefreshable ?? shouldCacheQuery(options.method));\n\n if (!shouldCache && options.key) throw uncacheableRequestHasCacheKeyParam(options.key);\n\n // `allowCache` is never read on the uncacheable path below - there is no cache entry to reuse - so this throw\n // is purely a guard against a mistake in hand-written code. The legacy interop opts out of it.\n if (!shouldCache && runQueryOptions?.allowCache && !options.silenceUncacheableAllowCacheError) {\n throw uncacheableRequestHasAllowCacheParam();\n }\n\n const route = buildRoute({\n base: config.baseUrl,\n route: options.route,\n pathParams: args?.pathParams,\n queryParams: args?.queryParams,\n queryParamConfig: config.queryString,\n });\n\n const cacheKey = shouldCache\n ? buildQueryCacheKey(`${options.key ? options.key + '_' : ''}${route}`, {\n body: args?.body,\n queryParams: args?.queryParams,\n pathParams: args?.pathParams,\n headers: args?.headers,\n })\n : false;\n\n const trackingKey = cacheKey || generateUuid();\n const keepUnusedFor = resolveKeepUnusedFor(creatorOptions, shouldCache);\n const isMultiTabSyncEnabled = creatorOptions?.multiTabSync !== false;\n const isSecure = options.isSecure ?? false;\n\n // A secure response needs an explicit `persistence: true` to reach the disk: leaving an\n // authenticated user's data there is a decision per endpoint, not a default. Everything else\n // persists unless it opted out.\n const isPersistEnabled =\n creatorOptions?.persistence === true || (creatorOptions?.persistence !== false && !isSecure);\n\n const previousKey = options.previousKey;\n\n if (cacheKey !== previousKey && previousKey) {\n unbind(previousKey, options.consumerDestroyRef);\n }\n\n if (shouldCache && cacheKey) {\n const cacheEntry = cache.get(cacheKey);\n\n if (cacheEntry) {\n // The entry may have been sitting out its `keepUnusedFor` window - a consumer binding again\n // makes it live, so the pending eviction must go.\n cancelEviction(cacheEntry);\n\n bind({\n key: cacheKey,\n consumerDestroyRef: options.consumerDestroyRef,\n request: cacheEntry.request,\n isSecure,\n isCached: true,\n isRefreshable,\n isMultiTabSyncEnabled,\n isPersistEnabled,\n keepUnusedFor,\n });\n\n const executed =\n !runQueryOptions?.allowCache || cacheEntry.request.isStale()\n ? cacheEntry.request.execute({ allowCache: runQueryOptions?.allowCache })\n : false;\n\n return { key: cacheKey, request: cacheEntry.request as HttpRequest<TArgs>, executed };\n }\n }\n\n const request = createHttpRequest<TArgs>({\n fullPath: route,\n args,\n method: options.method,\n dependencies: config.dependencies,\n clientOptions: creatorOptions,\n clientName: config.name,\n clientHeaders: config.headers,\n cacheAdapter: config.cacheAdapter,\n retryFn: options.retryFn ?? config.retryFn,\n });\n\n const executed = request.execute();\n\n bind({\n key: trackingKey,\n consumerDestroyRef: options.consumerDestroyRef,\n request,\n isSecure,\n isCached: shouldCache,\n isRefreshable,\n isMultiTabSyncEnabled,\n isPersistEnabled,\n keepUnusedFor,\n });\n\n // Announced after the entry is bound and its request is on its way, because the one thing that acts\n // on it - hydration from the persisted store - is only ever allowed to fill a gap this request has\n // not filled itself.\n eventsSubject.next({ type: 'entry-created', key: trackingKey, isCached: shouldCache, isPersistEnabled });\n\n return { key: trackingKey, request, executed };\n };\n\n /** Tears an entry down for good, whether it currently has consumers or not. */\n const destroyEntry = (\n key: QueryKey,\n cacheEntry: DestroyListenerMapItem,\n cause: QueryRepositoryEntryDestroyedCause,\n ) => {\n const { method, url } = cacheEntry.request;\n\n clearTimeout(cacheEntry.evictTimer);\n cacheEntry.request.destroy();\n cacheEntry.eventSubscription?.unsubscribe();\n cache.delete(key);\n\n eventsSubject.next({ type: 'entry-destroyed', key, isSecure: cacheEntry.isSecure, method, url, cause });\n };\n\n const cancelEviction = (cacheEntry: DestroyListenerMapItem) => {\n if (cacheEntry.evictTimer === undefined) return;\n\n clearTimeout(cacheEntry.evictTimer);\n cacheEntry.evictTimer = undefined;\n cacheEntry.unusedSince = undefined;\n };\n\n /** Drops the least recently orphaned unused entries until the cap is respected again. */\n const enforceUnusedEntryLimit = () => {\n const unused = Array.from(cache.entries()).filter(([, entry]) => entry.consumers.size === 0);\n\n if (unused.length <= MAX_UNUSED_ENTRIES) return;\n\n unused.sort(([, a], [, b]) => (a.unusedSince ?? 0) - (b.unusedSince ?? 0));\n\n for (const [key, entry] of unused.slice(0, unused.length - MAX_UNUSED_ENTRIES)) {\n destroyEntry(key, entry, 'unused-cap');\n }\n };\n\n const retain = (key: QueryKey, cacheEntry: DestroyListenerMapItem) => {\n cacheEntry.unusedSince = Date.now();\n cacheEntry.evictTimer = setTimeout(() => evict(key, 'expired'), cacheEntry.keepUnusedFor);\n\n enforceUnusedEntryLimit();\n };\n\n const unbind = (key: QueryKey | null, consumerDestroyRef: DestroyRef) => {\n if (key === null) return false;\n\n const cacheEntry = cache.get(key);\n\n if (!cacheEntry) return false;\n\n cacheEntry.consumers.delete(consumerDestroyRef);\n\n if (cacheEntry.consumers.size === 0) {\n // Only data is worth keeping around: an entry that never produced a response has nothing to\n // hand back to a returning consumer, so it is aborted immediately as it always was.\n if (cacheEntry.keepUnusedFor > 0 && cacheEntry.request.response() !== null) {\n retain(key, cacheEntry);\n } else {\n destroyEntry(key, cacheEntry, 'unbind');\n }\n }\n\n bumpCacheVersion();\n\n return true;\n };\n\n const unbindAllSecure = () => {\n for (const [key, cacheEntry] of cache.entries()) {\n if (!cacheEntry.isSecure) continue;\n\n // Force the teardown instead of routing through `unbind`: a logged out session must not leave a\n // retained response body behind waiting out its `keepUnusedFor` window.\n cacheEntry.consumers.clear();\n destroyEntry(key, cacheEntry, 'logout');\n }\n\n bumpCacheVersion();\n eventsSubject.next({ type: 'unbind-all-secure' });\n };\n\n const refreshInUse = (filter?: QueryRepositoryRefreshFilterFn, cause?: QueryRefreshCause) => {\n const refreshed: HttpRequest<QueryArgs>[] = [];\n\n for (const cacheEntry of cache.values()) {\n if (cacheEntry.consumers.size === 0) continue;\n\n // Re-firing a mutation would be a side effect nobody asked for, so only reads are refreshed:\n // a cacheable method, or a GQL query transported via POST. Opting into the cache alone does not\n // qualify - the auth queries do that for a stable cache key, and replaying a login POST would\n // end the session.\n if (!cacheEntry.isRefreshable) continue;\n\n if (filter && !filter(cacheEntry.request)) continue;\n\n refreshed.push(cacheEntry.request);\n cacheEntry.request.execute({ force: true });\n }\n\n eventsSubject.next({\n type: 'queries-refreshed',\n cause: cause ?? { type: 'refresh', url: null, otherTab: false },\n requests: refreshed,\n });\n };\n\n const applyExternalResponse = (options: ApplyExternalResponseOptions) => {\n const cacheEntry = cache.get(options.key);\n\n if (!cacheEntry || !cacheEntry.isMultiTabSyncEnabled) return false;\n\n if (cacheEntry.request.loading()) return false;\n\n cacheEntry.request.subtle.applyExternalResponse({ body: options.body, expiresAt: options.expiresAt });\n\n return true;\n };\n\n const applyPersistedResponse = (options: ApplyPersistedResponseOptions) => {\n const cacheEntry = cache.get(options.key);\n\n if (!cacheEntry || !cacheEntry.isPersistEnabled) return false;\n\n // The store is read asynchronously, so by now the request may well have settled, or another tab may\n // have fed the entry. Either way what is here is newer than what was on disk.\n if (cacheEntry.request.response() !== null) return false;\n\n cacheEntry.request.subtle.applyPersistedResponse({ body: options.body, expiresAt: options.expiresAt });\n\n return true;\n };\n\n const bind = (options: BindEntryOptions) => {\n const {\n key,\n consumerDestroyRef,\n request,\n isSecure,\n isCached,\n isRefreshable,\n isMultiTabSyncEnabled,\n isPersistEnabled,\n keepUnusedFor,\n } = options;\n\n const destroyListener = consumerDestroyRef.onDestroy(() => unbind(key, consumerDestroyRef));\n\n const cacheEntry = cache.get(key);\n\n if (cacheEntry && isCached) {\n cacheEntry.consumers.set(consumerDestroyRef, destroyListener);\n } else {\n const consumers: Map<DestroyRef, DestroyCleanupCallback> = new Map([]);\n\n consumers.set(consumerDestroyRef, destroyListener);\n\n // Drive repository events off the request's discrete, terminal event stream rather than\n // recombining the `error` + `response` signals via combineLatest (which could observe stale\n // pairings). Each settle emits exactly one terminal event.\n const eventSubscription = request.events$.subscribe((event) => {\n if (event.type === 'error') {\n if (event.error.raw instanceof HttpErrorResponse) {\n eventsSubject.next({ type: 'request-error', error: event.error.raw, key, isSecure, request });\n }\n } else if (event.type === HttpEventType.Response) {\n eventsSubject.next({\n type: 'request-success',\n key,\n isSecure,\n request,\n isCached,\n isMultiTabSyncEnabled,\n isPersistEnabled,\n });\n }\n });\n\n cache.set(key, {\n consumers,\n request,\n isSecure,\n eventSubscription,\n keepUnusedFor,\n isCached,\n isRefreshable,\n isMultiTabSyncEnabled,\n isPersistEnabled,\n });\n }\n\n bumpCacheVersion();\n };\n\n const cacheEntries = (): QueryRepositoryCacheEntry[] =>\n Array.from(cache.entries()).map(([key, entry]) => ({\n key,\n isSecure: entry.isSecure,\n consumerCount: entry.consumers.size,\n isUnused: entry.consumers.size === 0,\n request: entry.request,\n }));\n\n const evict = (key: QueryKey, cause: 'expired' | 'manual' = 'manual') => {\n const entry = cache.get(key);\n\n if (!entry) return;\n\n destroyEntry(key, entry, cause);\n bumpCacheVersion();\n };\n\n const repository: QueryRepository = {\n request,\n unbind,\n unbindAllSecure,\n refreshInUse,\n applyExternalResponse,\n applyPersistedResponse,\n events$: eventsSubject.asObservable(),\n subtle: {\n cacheEntries,\n cacheVersion: cacheVersion.asReadonly(),\n evict,\n },\n };\n\n return repository;\n};\n","import { isPlatformBrowser } from '@angular/common';\nimport { HttpClient, HttpHeaders } from '@angular/common/http';\nimport { DestroyRef, ErrorHandler, inject, Injector, PLATFORM_ID } from '@angular/core';\nimport { defineRootProvider, ProviderDefinition } from '@ethlete/core';\nimport { describeQueryDevtoolsFeatures, QueryDevtoolsFeature } from '../devtools/query-devtools-features';\nimport { isQueryDevtoolsEnabled } from '../devtools/query-devtools-hook';\nimport { BuildQueryStringConfig } from './internal/request-route';\nimport { createQueryInvalidationFilter, QueryInvalidationOptions, resolveInvalidationUrl } from './query-invalidation';\nimport { QueryPersistenceEngine } from './persistence/query-persistence-engine';\nimport {\n QueryClientFeature,\n QueryClientFeatureFn,\n QueryClientFeatureType,\n QueryClientPersistenceFeature,\n QueryClientMultiTabSyncFeature,\n} from './query-client-features';\nimport { queryClientFeatureUsedMultipleTimes } from './query-errors';\nimport { createQueryRepository, QueryRepository } from './query-repository';\nimport { ShouldRetryRequestFn } from './query-retry-utils';\nimport { QuerySyncEngine } from './sync/query-sync-engine';\n\nexport type CacheAdapterFn = (headers: HttpHeaders) => number | null;\n\nexport type CreateQueryClientConfigOptions = {\n /**\n * The base URL of the client\n * @example 'https://api.example.com/v1'\n */\n baseUrl: string;\n\n /** Configuration for building query strings */\n queryString?: BuildQueryStringConfig;\n\n /**\n * Headers sent with every request of this client - an API token, a tenant id, a preview\n * credential. Per-query `args.headers` are merged on top and win per header name.\n *\n * Pass a function to make them dynamic: it is called on every execution, so reading a signal\n * inside means later requests pick the new value up on their own.\n *\n * Client headers are deliberately **not** part of the cache key: they are the same for every\n * query of the client, so including them would only ever churn the whole cache at once. That\n * means already-resolved queries keep their response when the headers change - call\n * {@link QueryClient.refreshQueriesInUse} to re-run them (the v3 equivalent of v2's\n * `setDefaultHeaders({ refreshQueriesInUse: true })`).\n *\n * @example\n * const previewToken = signal<string | null>(null);\n *\n * const MY_CLIENT = createQueryClient({\n * name: 'my-api',\n * baseUrl: 'https://api.example.com',\n * headers: () => {\n * const token = previewToken();\n * return token ? new HttpHeaders({ 'X-Preview-Token': token }) : new HttpHeaders();\n * },\n * });\n *\n * export const provideMyClient = toProvideFn(MY_CLIENT);\n * export const injectMyClient = toInjectFn(MY_CLIENT);\n */\n headers?: HttpHeaders | (() => HttpHeaders);\n\n /** The name of the client */\n name: string;\n\n /**\n * The cache adapter function to use for the client.\n * It determines how long the response of a request can be cached.\n *\n * @default extractExpiresInSeconds()\n */\n cacheAdapter?: CacheAdapterFn;\n\n /**\n * The retry function to use for the client.\n * It determines if a request should be retried after it failed.\n *\n * @default the `withDefaultRetry()` policy, or no retry at all without that client feature\n */\n retryFn?: ShouldRetryRequestFn;\n\n /**\n * How long (in ms) a cache entry is kept after its last consumer was destroyed.\n *\n * Within that window a query that mounts again - a list page reached via browser back navigation,\n * for instance - binds to the existing entry and renders its previous response immediately while it\n * revalidates in the background, instead of starting from a loading state. Unlike the header derived\n * freshness TTL (`cacheAdapter`) this is independent of `cache-control`, so it also applies to\n * private/authenticated responses.\n *\n * Set to `0` to destroy entries as soon as their last consumer goes away. Only entries that\n * actually hold a response are retained, and at most 50 unused entries are kept per client\n * (least recently orphaned dropped first). Always `0` on the server.\n *\n * Can be overridden per query creator.\n *\n * @default 300000 (5 minutes)\n */\n keepUnusedFor?: number;\n\n /**\n * Opt-in subsystems of this client. Nothing is on by default - a client without features ships\n * neither the multi-tab sync engine nor the persistence engine at all.\n *\n * - {@link withMultiTabSync} coordinates the client with its own instances in the user's other tabs,\n * - {@link withQueryPersistence} keeps successful reads on disk so a reload renders them right away,\n * - {@link withHtmlErrorParsing} reads the sentence out of an HTML error page,\n * - {@link withSymfonyErrors} reads Symfony / class-validator violation lists,\n * - {@link withDefaultRetry} retries connection failures, 5xx, 408/425 and 429,\n * - {@link withEthleteApiErrors} is the three error features above in one.\n *\n * Each feature may be used at most once. The error-pipeline features are installed process-wide\n * rather than per client - which body shapes an app understands is a property of the app.\n *\n * @example\n * const MY_CLIENT = createQueryClient({\n * name: 'my-api',\n * baseUrl: 'https://api.example.com',\n * features: [withMultiTabSync(), withQueryPersistence(), withEthleteApiErrors()],\n * });\n */\n features?: readonly QueryClientFeatureFn[];\n};\n\n/**\n * Advanced client internals. **Not part of the general public contract** - do not build application\n * logic on top of these.\n */\nexport type QueryClientSubtle = {\n /**\n * The multi-tab sync engine, or `null` when this client has no {@link withMultiTabSync} feature (or\n * runs on the server). Query features reach it through `deps.client`.\n */\n sync: QuerySyncEngine | null;\n\n /**\n * The persisted response store, or `null` when this client has no {@link withQueryPersistence}\n * feature (or runs on the server).\n */\n persistence: QueryPersistenceEngine | null;\n\n /**\n * The client's features and the options each was configured with, for the devtools panel. Empty\n * unless `provideQueryDevtools()` is used.\n */\n devtoolsFeatures: QueryDevtoolsFeature[];\n};\n\nexport type QueryClient = {\n repository: QueryRepository;\n\n /** The base URL the client was configured with. */\n baseUrl: string;\n\n /**\n * Re-executes every cacheable request this client currently has consumers for, bypassing the\n * cache and restarting the ones still in flight.\n *\n * The case this exists for is a change to something every request carries but nothing tracks -\n * typically a client-level header (see {@link CreateQueryClientConfigOptions.headers}). Setting\n * the new value only affects *subsequent* requests, so anything already resolved keeps data\n * fetched under the old one until this is called.\n *\n * Only reads are refreshed - `GET`/`HEAD`/`OPTIONS` and GraphQL queries transported via `POST`:\n * re-firing a mutation nobody asked for would be a far worse surprise than a stale read. A `POST`\n * that merely opted into the repository cache stays untouched.\n *\n * @see QueryClient.invalidateQueries for the case where the *data* went stale rather than the\n * request, which is the one that also concerns the user's other tabs.\n */\n refreshQueriesInUse: () => void;\n\n /**\n * Re-executes the queries this client has consumers for whose data the caller knows to be out of\n * date - after a mutation, or a push message saying something changed server-side - and tells the\n * user's other tabs to do the same.\n *\n * Narrow it by `url`, by `filter`, or leave it open to invalidate everything in use:\n *\n * @example\n * await createPlayer.execute({ body });\n *\n * client.invalidateQueries({ url: '/players' }); // /players, /players/1, /players?page=2\n * client.invalidateQueries(); // everything on screen, here and in the other tabs\n *\n * Same set as {@link QueryClient.refreshQueriesInUse}: reads with at least one\n * consumer, cache bypassed, in-flight requests restarted. Entries sitting out their `keepUnusedFor`\n * window are deliberately left alone - they revalidate on their own when a consumer binds again,\n * and refreshing what nobody is looking at is how an invalidation turns into a request storm.\n *\n * Reaching the other tabs needs the {@link withMultiTabSync} client feature; without it this is a\n * local call, and `otherTabs: false` makes it one deliberately.\n */\n invalidateQueries: (options?: QueryInvalidationOptions) => void;\n\n /**\n * Removes every response this client persisted (see {@link withQueryPersistence}). Resolves once\n * the store is empty; a no-op when the client has no persistence feature.\n *\n * What it is for is a switch of *who* is using the app - a different user logging in on a shared\n * device - where the previous session's public data should not be waiting for them. A logout already\n * removes persisted **secure** responses on its own.\n */\n clearPersistedQueries: () => Promise<void>;\n\n /**\n * Resolves once persisted responses are available to hydrate cache entries with, or right away when\n * persistence is off or the code runs on the server.\n *\n * Nothing needs to await this - a query created before it resolves is hydrated as soon as it does.\n * It exists for the app that would rather delay its first paint than show a loading state it knows it\n * has data for.\n *\n * @example\n * provideAppInitializer(() => injectMyClient().whenPersistenceReady)\n */\n whenPersistenceReady: Promise<void>;\n\n /** Advanced client internals. */\n subtle: QueryClientSubtle;\n};\n\nexport type QueryClientRef = ProviderDefinition<QueryClient>;\nexport type AnyCreateQueryClientResult = QueryClientRef;\nexport type AnyQueryClient = NonNullable<ReturnType<AnyCreateQueryClientResult['inject']>>;\n\nexport const createQueryClient = (options: CreateQueryClientConfigOptions): QueryClientRef =>\n defineRootProvider(\n () => {\n const httpClient = inject(HttpClient);\n const ngErrorHandler = inject(ErrorHandler);\n const injector = inject(Injector);\n const isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n const repository = createQueryRepository({\n ...options,\n // Retaining unused entries on the server would pin response bodies (and a pending timer) inside\n // a per-request injector for the whole window, so retention is browser only.\n retentionEnabled: isBrowser,\n dependencies: { httpClient, ngErrorHandler, injector },\n });\n\n const destroyRef = inject(DestroyRef);\n\n let sync: QuerySyncEngine | null = null;\n let persistenceEngine: QueryPersistenceEngine | null = null;\n const appliedFeatures: QueryClientFeature[] = [];\n\n if (options.features?.length) {\n const seen = new Set<QueryClientFeatureType>();\n\n for (const featureFn of options.features) {\n const feature = featureFn({ clientName: options.name, repository, destroyRef, isBrowser });\n\n if (seen.has(feature.type)) throw queryClientFeatureUsedMultipleTimes(feature.type);\n seen.add(feature.type);\n appliedFeatures.push(feature);\n\n if (feature.type === QueryClientFeatureType.MULTI_TAB_SYNC) {\n sync = (feature as QueryClientMultiTabSyncFeature).instance;\n } else if (feature.type === QueryClientFeatureType.PERSISTENCE) {\n persistenceEngine = (feature as QueryClientPersistenceFeature).instance;\n }\n }\n }\n\n const client: QueryClient = {\n repository,\n baseUrl: options.baseUrl,\n refreshQueriesInUse: () => repository.refreshInUse(),\n invalidateQueries: (invalidation) => {\n const url = invalidation?.url ? resolveInvalidationUrl(options.baseUrl, invalidation.url) : null;\n\n repository.refreshInUse(createQueryInvalidationFilter({ url, filter: invalidation?.filter }), {\n type: 'invalidation',\n url,\n otherTab: false,\n });\n\n // The resolved URL is what travels: the other tabs are the same client, so they would\n // resolve it identically, and a message that needs no interpretation cannot drift.\n if (invalidation?.otherTabs ?? true) sync?.postInvalidation(url);\n },\n clearPersistedQueries: () => persistenceEngine?.clear() ?? Promise.resolve(),\n whenPersistenceReady: persistenceEngine?.whenReady ?? Promise.resolve(),\n subtle: {\n sync,\n persistence: persistenceEngine,\n devtoolsFeatures: isQueryDevtoolsEnabled() ? describeQueryDevtoolsFeatures(appliedFeatures) : [],\n },\n };\n\n return client;\n },\n {\n name: `QueryClient_${options.name}`,\n },\n );\n","import { HttpHeaders } from '@angular/common/http';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { filter, merge, of, Subscription, switchMap, take, tap } from 'rxjs';\nimport { AnyBearerAuthProvider } from '../auth';\nimport { AnyQuerySnapshot, QueryArgs, RequestArgs } from './query';\nimport { QueryDependencies } from './query-dependencies';\nimport { invalidStateInsideSecureExecuteFactory, tokensNotAvailableInsideAuthAndExec } from './query-errors';\nimport { InternalQueryExecute, QueryExecuteArgs } from './query-execute';\nimport { circularQueryDependencyChecker, resetExecuteState, setupQueryExecuteState } from './query-execute-utils';\nimport { QueryState } from './query-state';\n\nconst AUTH_HEADER = 'Authorization';\n\nexport type SecureExecuteFactoryOptions<TArgs extends QueryArgs> = {\n authProvider: AnyBearerAuthProvider;\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n /**\n * Whether the query runs itself rather than only on an explicit `execute()` - the same condition\n * `maybeExecute` and the `withArgs` feature use. Only those are re-run once a new session starts;\n * re-firing a mutation on the next login would repeat it behind the user's back.\n */\n autoExecutes: boolean;\n transformAuthAndExec: (\n executeArgs: QueryExecuteArgs<TArgs> | undefined,\n tokens: { accessToken: string },\n headers: HttpHeaders,\n executeState: ReturnType<typeof setupQueryExecuteState>,\n ) => void;\n};\n\nexport const createSecureExecuteFactory = <TArgs extends QueryArgs>(\n options: SecureExecuteFactoryOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const executeState = setupQueryExecuteState();\n const circularChecker = circularQueryDependencyChecker();\n\n let authQuerySubscription = Subscription.EMPTY;\n let tokenRefreshSubscription = Subscription.EMPTY;\n let tokenWaitSubscription = Subscription.EMPTY;\n let sessionRestartSubscription = Subscription.EMPTY;\n\n let hasExecuted = false;\n let lastExecuteArgs: QueryExecuteArgs<TArgs> | undefined;\n\n const reset = () => {\n authQuerySubscription.unsubscribe();\n authQuerySubscription = Subscription.EMPTY;\n tokenRefreshSubscription.unsubscribe();\n tokenRefreshSubscription = Subscription.EMPTY;\n tokenWaitSubscription.unsubscribe();\n tokenWaitSubscription = Subscription.EMPTY;\n sessionRestartSubscription.unsubscribe();\n sessionRestartSubscription = Subscription.EMPTY;\n resetExecuteState({\n executeState,\n executeOptions: { deps: options.deps, state: options.state },\n });\n };\n\n // A logout tears down the secure entries in the repository, but the query object holding one keeps\n // its own `response`/`error` signals - so without this a component still mounted after logout goes\n // on rendering the previous user's data until something calls `reset()` by hand.\n //\n // Resetting alone leaves it idle for good though: a self-executing query runs once, at creation,\n // and nothing runs it again - so anything still mounted across a logout has to be re-armed for\n // the next session. That re-arm waits on the token instead of re-running here: `logout()` clears\n // `latestExecutedQuery` and `executionState` only *after* emitting this event, so everything read\n // synchronously still describes the session that just ended.\n options.deps.client.repository.events$\n .pipe(\n filter((event) => event.type === 'unbind-all-secure'),\n takeUntilDestroyed(options.deps.destroyRef),\n )\n .subscribe(() => {\n const shouldRestart = hasExecuted && options.autoExecutes;\n const restartArgs = lastExecuteArgs;\n\n reset();\n\n if (!shouldRestart) return;\n\n sessionRestartSubscription = toObservable(options.authProvider.accessToken, {\n injector: options.deps.injector,\n })\n .pipe(\n filter(Boolean),\n take(1),\n tap(() => exec(restartArgs)),\n )\n .subscribe();\n });\n\n const error = (query: AnyQuerySnapshot) => {\n const state = options.state;\n\n state.error.set(query.error());\n state.loading.set(null);\n state.rawResponse.set(null);\n state.latestHttpEvent.set(null);\n state.args.set(null);\n };\n\n const authAndExec = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n const args = executeArgs?.args;\n\n const headerProvider = () => {\n const accessToken = options.authProvider.accessToken();\n const baseHeaders = typeof args?.headers === 'function' ? args.headers() : args?.headers || new HttpHeaders();\n\n if (!accessToken) {\n throw tokensNotAvailableInsideAuthAndExec();\n }\n\n if (!baseHeaders.has(AUTH_HEADER)) {\n return baseHeaders.set(AUTH_HEADER, `Bearer ${accessToken}`);\n }\n\n return baseHeaders;\n };\n\n const accessToken = options.authProvider.accessToken();\n if (!accessToken) {\n throw tokensNotAvailableInsideAuthAndExec();\n }\n\n const tokens = { accessToken, refreshToken: options.authProvider.refreshToken() ?? '' };\n const headers = headerProvider();\n\n options.transformAuthAndExec(\n {\n ...executeArgs,\n args: {\n ...(args ?? {}),\n headers: headerProvider, // Pass header provider instead of static headers\n } as RequestArgs<TArgs>,\n },\n tokens,\n headers,\n executeState,\n );\n };\n\n // The auth query completing and the access token being populated happen on two\n // different reactive timelines: the token is set by a separate token-extraction\n // effect (see `setupBearerQueryRegistry`), and for cross-client / secure auth\n // queries the completion is delivered through several nested `toObservable` hops.\n // Calling `authAndExec` purely because the auth query is \"done\" therefore races\n // the token and can run while it is still null. Gate on the token signal instead:\n // execute immediately if it is already available, otherwise wait for it.\n const authAndExecWhenTokenReady = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n if (options.authProvider.accessToken()) {\n authAndExec(executeArgs);\n\n return;\n }\n\n tokenWaitSubscription.unsubscribe();\n tokenWaitSubscription = toObservable(options.authProvider.accessToken, {\n injector: options.deps.injector,\n })\n .pipe(\n filter(Boolean),\n take(1),\n tap(() => authAndExec(executeArgs)),\n )\n .subscribe();\n };\n\n const exec = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n circularChecker.check();\n\n const execArgsWithDefaults: QueryExecuteArgs<TArgs> = {\n args: executeArgs?.args ?? options.state.args(),\n options: executeArgs?.options,\n };\n\n hasExecuted = true;\n lastExecuteArgs = execArgsWithDefaults;\n\n authQuerySubscription.unsubscribe();\n authQuerySubscription = Subscription.EMPTY;\n tokenRefreshSubscription.unsubscribe();\n tokenRefreshSubscription = Subscription.EMPTY;\n tokenWaitSubscription.unsubscribe();\n tokenWaitSubscription = Subscription.EMPTY;\n sessionRestartSubscription.unsubscribe();\n sessionRestartSubscription = Subscription.EMPTY;\n\n tokenRefreshSubscription = options.authProvider.afterTokenRefresh$\n .pipe(\n filter(() => {\n const currentError = options.state.error();\n return currentError?.code === 401;\n }),\n take(1),\n tap(() => exec(execArgsWithDefaults)),\n )\n .subscribe();\n\n // `setTokens()` seeds an auth session from outside the query registry (an SSO/OIDC callback, a\n // native shell) - no query ever runs for `latestExecutedQuery` to report, so a successful token\n // seed is treated as an auth query that already resolved.\n if (options.authProvider.executionState()?.type === 'tokenSeed') {\n authAndExecWhenTokenReady(execArgsWithDefaults);\n\n return;\n }\n\n const latestQuery = options.authProvider.latestExecutedQuery();\n const authQuery = latestQuery?.snapshot;\n\n // This might happen if a secure query gets executed while the auth query has just been created.\n // This is due to the fact that the query state is being synced with the state inside the http request using effect.\n const isAuthQueryFreshlyExecuted = authQuery?.lastTimeExecutedAt() === null;\n\n if (!authQuery || authQuery.loading() || isAuthQueryFreshlyExecuted) {\n options.state.loading.set({ executeTime: Date.now(), progress: null });\n\n const latestExecutedQuery$ = toObservable(options.authProvider.latestExecutedQuery, {\n injector: options.deps.injector,\n }).pipe(\n switchMap((latestQuery) => {\n if (!latestQuery) return of(null);\n const query = latestQuery.snapshot;\n\n return toObservable(query.isAlive, { injector: options.deps.injector }).pipe(\n tap((isAlive) => {\n if (isAlive) return;\n\n if (query.error()) {\n error(query);\n } else if (query.response()) {\n authAndExecWhenTokenReady(execArgsWithDefaults);\n }\n }),\n );\n }),\n );\n\n // A `setTokens()` call that lands while this is already waiting (e.g. the SSO redirect\n // resolves after this secure query mounted) never touches `latestExecutedQuery` either -\n // wake up on `executionState` becoming a token seed too.\n const tokenSeed$ = toObservable(options.authProvider.executionState, {\n injector: options.deps.injector,\n }).pipe(\n filter((state) => state?.type === 'tokenSeed'),\n take(1),\n tap(() => authAndExecWhenTokenReady(execArgsWithDefaults)),\n );\n\n authQuerySubscription = merge(latestExecutedQuery$, tokenSeed$).subscribe();\n } else if (authQuery.response()) {\n authAndExecWhenTokenReady(execArgsWithDefaults);\n } else if (authQuery.error()) {\n error(authQuery);\n } else {\n throw invalidStateInsideSecureExecuteFactory();\n }\n };\n\n exec['reset'] = reset;\n exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();\n\n return exec;\n};\n","import { shouldAutoExecuteQuery } from './base-query-factory';\nimport { QueryArgs, RequestArgs } from './query';\nimport { CreateQueryExecuteOptions, InternalQueryExecute } from './query-execute';\nimport { queryExecute } from './query-execute-utils';\nimport { InternalSecureCreateQueryCreatorOptions } from './secure-query-creator';\nimport { createSecureExecuteFactory } from './secure-query-execute-factory';\n\nexport type CreateSecureQueryExecuteOptions<TArgs extends QueryArgs> = Omit<\n CreateQueryExecuteOptions<TArgs>,\n 'creatorInternals'\n> & {\n creatorInternals: InternalSecureCreateQueryCreatorOptions<TArgs>;\n};\n\nexport const createSecureExecuteFn = <TArgs extends QueryArgs>(\n executeOptions: CreateSecureQueryExecuteOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const authProvider = executeOptions.creatorInternals.authProvider.inject();\n\n return createSecureExecuteFactory({\n authProvider,\n deps: executeOptions.deps,\n state: executeOptions.state,\n autoExecutes:\n shouldAutoExecuteQuery(executeOptions.creatorInternals.method) && !executeOptions.queryConfig.onlyManualExecution,\n transformAuthAndExec: (executeArgs, _tokens, headers, executeState) => {\n const { options: runOptions } = executeArgs ?? {};\n const updatedArgs = { ...(executeArgs?.args ?? ({} as RequestArgs<TArgs>)), headers };\n\n queryExecute({\n executeOptions: executeOptions,\n executeState,\n args: updatedArgs,\n options: runOptions,\n isSecure: true,\n });\n },\n });\n};\n","import { createBaseQuery } from './base-query-factory';\nimport { CreateQueryOptions, QueryArgs } from './query';\nimport { InternalSecureCreateQueryCreatorOptions } from './secure-query-creator';\nimport { createSecureExecuteFn } from './secure-query-execute';\n\nexport type CreateSecureQueryOptions<TArgs extends QueryArgs> = Omit<CreateQueryOptions<TArgs>, 'creatorInternals'> & {\n creatorInternals: InternalSecureCreateQueryCreatorOptions<TArgs>;\n};\n\nexport const createSecureQuery = <TArgs extends QueryArgs>(options: CreateSecureQueryOptions<TArgs>) =>\n createBaseQuery({\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n features: options.features,\n queryConfig: options.queryConfig,\n executeFactory: createSecureExecuteFn,\n });\n","import { AnyCreateBearerAuthProviderResult } from '../auth';\nimport { createBaseQueryCreator } from './base-query-creator-factory';\nimport { QueryArgs } from './query';\nimport { CreateQueryCreatorOptions, InternalCreateQueryCreatorOptions, QueryCreator } from './query-creator';\nimport { createSecureQuery } from './secure-query';\n\nexport type InternalSecureCreateQueryCreatorOptions<TArgs extends QueryArgs> =\n InternalCreateQueryCreatorOptions<TArgs> & {\n authProvider: AnyCreateBearerAuthProviderResult;\n };\n\nexport const createSecureQueryCreator = <TArgs extends QueryArgs>(\n options: CreateQueryCreatorOptions | undefined,\n internals: InternalSecureCreateQueryCreatorOptions<TArgs>,\n): QueryCreator<TArgs> =>\n createBaseQueryCreator({\n options,\n internals,\n queryFactory: createSecureQuery,\n });\n","import { AnyCreateBearerAuthProviderResult } from '../auth';\nimport { QueryArgs } from './query';\nimport { AnyCreateQueryClientResult } from './query-client';\nimport {\n CreateQueryCreatorOptions,\n QueryCreator,\n QueryMethod,\n RequiresTransform,\n RouteType,\n createQueryCreator,\n} from './query-creator';\nimport { createSecureQueryCreator } from './secure-query-creator';\n\n// Conditional parameter type: when RequiresTransform is true, options must be provided; otherwise optional\ntype ConditionalOptions<TArgs extends QueryArgs> =\n RequiresTransform<TArgs> extends true\n ? [options: CreateQueryCreatorOptions<TArgs>]\n : [options?: CreateQueryCreatorOptions<TArgs>];\n\nconst createQueryTemplate = (method: QueryMethod) => {\n return (client: AnyCreateQueryClientResult) =>\n <TArgs extends QueryArgs>(route: RouteType<TArgs>, ...args: ConditionalOptions<TArgs>): QueryCreator<TArgs> =>\n createQueryCreator<TArgs>(args[0], { method, client, route });\n};\n\nconst createSecureQueryTemplate = (method: QueryMethod) => {\n return (client: AnyCreateQueryClientResult, authProvider: AnyCreateBearerAuthProviderResult) =>\n <TArgs extends QueryArgs>(route: RouteType<TArgs>, ...args: ConditionalOptions<TArgs>): QueryCreator<TArgs> =>\n createSecureQueryCreator<TArgs>(args[0], { method, client, authProvider, route });\n};\n\n/** A query creator that creates a GET query */\nexport const createGetQuery = /* @__PURE__ */ createQueryTemplate('GET');\n\n/** A query creator that creates a secure GET query (requires authentication) */\nexport const createSecureGetQuery = /* @__PURE__ */ createSecureQueryTemplate('GET');\n\n/** A query creator that creates a POST query */\nexport const createPostQuery = /* @__PURE__ */ createQueryTemplate('POST');\n\n/** A query creator that creates a secure POST query (requires authentication) */\nexport const createSecurePostQuery = /* @__PURE__ */ createSecureQueryTemplate('POST');\n\n/** A query creator that creates a PUT query */\nexport const createPutQuery = /* @__PURE__ */ createQueryTemplate('PUT');\n\n/** A query creator that creates a secure PUT query (requires authentication) */\nexport const createSecurePutQuery = /* @__PURE__ */ createSecureQueryTemplate('PUT');\n\n/** A query creator that creates a DELETE query */\nexport const createDeleteQuery = /* @__PURE__ */ createQueryTemplate('DELETE');\n\n/** A query creator that creates a secure DELETE query (requires authentication) */\nexport const createSecureDeleteQuery = /* @__PURE__ */ createSecureQueryTemplate('DELETE');\n\n/** A query creator that creates a PATCH query */\nexport const createPatchQuery = /* @__PURE__ */ createQueryTemplate('PATCH');\n\n/** A query creator that creates a secure PATCH query (requires authentication) */\nexport const createSecurePatchQuery = /* @__PURE__ */ createSecureQueryTemplate('PATCH');\n","import { filter, firstValueFrom } from 'rxjs';\nimport { Query, QueryArgs, QuerySnapshot } from './query';\nimport { QueryExecuteArgs } from './query-execute';\n\n/**\n * Executes the query and resolves once that execution has settled (response or error received).\n * The returned snapshot is frozen to the awaited execution, so a later execution can't swap the\n * `response()` / `error()` you read from it.\n *\n * Designed for imperative flows that need a mutation's outcome in place - e.g. a signal-forms\n * `submit()` action mapping server violations onto the form via `mapViolationsToFormErrors`.\n *\n * The promise stays pending if the execution is cancelled (e.g. `reset()`) and the query is never\n * executed again - the snapshot settles with whichever execution completes next.\n */\nexport const executeUntilSettled = async <TArgs extends QueryArgs>(\n query: Query<TArgs>,\n executeArgs?: QueryExecuteArgs<TArgs>,\n): Promise<QuerySnapshot<TArgs>> => {\n query.execute(executeArgs);\n\n const snapshot = query.createSnapshot();\n\n await firstValueFrom(snapshot.isAlive.asObservable().pipe(filter((isAlive) => !isAlive)));\n\n return snapshot;\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { DestroyRef, inject, Signal, signal, WritableSignal } from '@angular/core';\nimport { isQueryDevtoolsEnabled, registerQueryDevtoolsEntry } from '../devtools/query-devtools-hook';\nimport { AnyNewQuery, AnyQuerySnapshot, Query, QueryArgs, RequestArgs, ResponseType } from './query';\nimport { QueryErrorResponse } from './query-error-response';\nimport { querySequenceAlreadyRunning } from './query-errors';\nimport { executeUntilSettled } from './query-snapshot-utils';\n\n/** The last element of a tuple type - the response of the step a `.then()` callback follows. */\ntype LastOf<T extends unknown[]> = T extends [...unknown[], infer L] ? L : never;\n\n/** The current lifecycle phase of a query sequence. */\nexport type QuerySequenceStatus = 'idle' | 'running' | 'success' | 'error';\n\n/** The args a sequence step supplies to its query - the same `{ args }` shape `query.execute()` takes. */\nexport type QuerySequenceStepArgs<TArgs extends QueryArgs> = {\n args: RequestArgs<TArgs>;\n};\n\n/**\n * The outcome of a settled {@link QuerySequence.run}.\n *\n * A discriminated union: on success `responses` is the fully-typed tuple of every step's response;\n * on failure `failedAt` is the zero-based index of the step that errored and `error` is its\n * normalized {@link QueryErrorResponse}. `snapshots` always holds the settled snapshots of every\n * step that ran - up to and including the failing one.\n */\nexport type QuerySequenceResult<TResponses extends unknown[]> =\n | { ok: true; responses: TResponses; snapshots: AnyQuerySnapshot[] }\n | { ok: false; failedAt: number; error: QueryErrorResponse; snapshots: AnyQuerySnapshot[] };\n\n/**\n * An imperative waterfall of dependent queries - usually mutations (`POST`/`PUT`/`PATCH`/`DELETE`)\n * where each call needs the previous call's response.\n *\n * Build the chain once (e.g. as a component field) with {@link querySequence} and `.then()`, then\n * trigger it with {@link run}. Each step runs via `executeUntilSettled`, threading the previous\n * step's response into the next; the first error aborts the rest. The progress signals mirror\n * `createQueryStack`, so a template can drive a stepper without manual bookkeeping.\n */\nexport type QuerySequence<TResponses extends unknown[]> = {\n /**\n * Appends a dependent step. `mapArgs` runs at {@link run} time and receives the previous step's\n * (unwrapped, non-null on success) response plus the typed tuple of all responses so far, so a\n * later step can still reach an earlier one's data.\n */\n then: <TArgs extends QueryArgs>(\n query: Query<TArgs>,\n mapArgs: (previousResponse: LastOf<TResponses>, responses: TResponses) => QuerySequenceStepArgs<TArgs>,\n ) => QuerySequence<[...TResponses, ResponseType<TArgs>]>;\n\n /** The current lifecycle phase - `idle` before the first run, then `running` → `success` | `error`. */\n status: Signal<QuerySequenceStatus>;\n\n /** `true` while a run is in flight. */\n running: Signal<boolean>;\n\n /** The 1-based index of the in-flight step, or `0` when idle. */\n currentStep: Signal<number>;\n\n /** The static number of steps in the sequence. */\n total: number;\n\n /** The query objects backing each step, in order. Useful for devtools / advanced introspection. */\n queries: AnyNewQuery[];\n\n /** The error of the step that failed, or `null` while running / on success. */\n error: Signal<QueryErrorResponse | null>;\n\n /** The zero-based index of the step that failed, or `null` while running / on success. */\n failedAt: Signal<number | null>;\n\n /** The settled snapshots of every step that has run, grows as the waterfall progresses. */\n snapshots: Signal<AnyQuerySnapshot[]>;\n\n /**\n * The resolved input args each step was run with, grows as the waterfall progresses. The value at\n * index `i` is what {@link QuerySequence.then}'s `mapArgs` produced for step `i` at run time.\n */\n stepArgs: Signal<unknown[]>;\n\n /** The responses of every step that has succeeded, grows as the waterfall progresses. */\n responses: Signal<Partial<TResponses>>;\n\n /**\n * Runs every step in order, resolving once the waterfall settles.\n *\n * Resets the progress signals, then awaits each step in turn - stopping at the first error and\n * resolving with `{ ok: false, failedAt, error }`, or `{ ok: true, responses }` when all steps\n * succeed. Re-runnable (e.g. behind a retry button); throws {@link querySequenceAlreadyRunning}\n * if a run is already in flight.\n *\n * Cancellation caveat (inherited from `executeUntilSettled`): if the host scope is destroyed\n * mid-flight the in-flight query is torn down and this promise never settles.\n */\n run: () => Promise<QuerySequenceResult<TResponses>>;\n};\n\ntype InternalStep = {\n query: AnyNewQuery;\n produceArgs: (previousResponse: unknown, responses: unknown[]) => QuerySequenceStepArgs<QueryArgs>;\n};\n\ntype SequenceState = {\n status: WritableSignal<QuerySequenceStatus>;\n running: WritableSignal<boolean>;\n currentStep: WritableSignal<number>;\n error: WritableSignal<QueryErrorResponse | null>;\n failedAt: WritableSignal<number | null>;\n snapshots: WritableSignal<AnyQuerySnapshot[]>;\n stepArgs: WritableSignal<unknown[]>;\n responses: WritableSignal<unknown[]>;\n};\n\nconst createSequenceState = (): SequenceState => ({\n status: signal<QuerySequenceStatus>('idle'),\n running: signal(false),\n currentStep: signal(0),\n error: signal<QueryErrorResponse | null>(null),\n failedAt: signal<number | null>(null),\n snapshots: signal<AnyQuerySnapshot[]>([]),\n stepArgs: signal<unknown[]>([]),\n responses: signal<unknown[]>([]),\n});\n\n/**\n * A stable holder the devtools registry keeps as a sequence entry's handle. Because `.then()`\n * returns a fresh {@link QuerySequence} object per link (all sharing one {@link SequenceState}),\n * `current` is updated to the latest link so the UI always reads the fully-built sequence.\n * @internal\n */\nexport type QuerySequenceDevtoolsHandle = { current: QuerySequence<any> };\n\nconst buildSequence = <TResponses extends unknown[]>(\n steps: InternalStep[],\n state: SequenceState,\n devtoolsHandle?: QuerySequenceDevtoolsHandle,\n): QuerySequence<TResponses> => {\n const run = async (): Promise<QuerySequenceResult<TResponses>> => {\n if (state.running()) throw querySequenceAlreadyRunning();\n\n state.status.set('running');\n state.running.set(true);\n state.currentStep.set(0);\n state.error.set(null);\n state.failedAt.set(null);\n state.snapshots.set([]);\n state.stepArgs.set([]);\n state.responses.set([]);\n\n const snapshots: AnyQuerySnapshot[] = [];\n const stepArgs: unknown[] = [];\n const responses: unknown[] = [];\n let previousResponse: unknown = undefined;\n\n for (const [i, step] of steps.entries()) {\n state.currentStep.set(i + 1);\n\n const { args } = step.produceArgs(previousResponse, responses);\n stepArgs.push(args);\n state.stepArgs.set([...stepArgs]);\n const snapshot = await executeUntilSettled(step.query, { args });\n\n snapshots.push(snapshot);\n state.snapshots.set([...snapshots]);\n\n const error = snapshot.error();\n\n if (error) {\n state.status.set('error');\n state.error.set(error);\n state.failedAt.set(i);\n state.running.set(false);\n\n return { ok: false, failedAt: i, error, snapshots };\n }\n\n const response = snapshot.response();\n responses.push(response);\n state.responses.set([...responses]);\n previousResponse = response;\n }\n\n state.status.set('success');\n state.running.set(false);\n\n return { ok: true, responses: responses as TResponses, snapshots };\n };\n\n const sequence: QuerySequence<TResponses> = {\n then: (query, mapArgs) =>\n buildSequence(\n [\n ...steps,\n { query, produceArgs: (previousResponse, responses) => mapArgs(previousResponse as any, responses as any) },\n ],\n state,\n devtoolsHandle,\n ) as any,\n status: state.status.asReadonly(),\n running: state.running.asReadonly(),\n currentStep: state.currentStep.asReadonly(),\n total: steps.length,\n queries: steps.map((s) => s.query),\n error: state.error.asReadonly(),\n failedAt: state.failedAt.asReadonly(),\n snapshots: state.snapshots.asReadonly(),\n stepArgs: state.stepArgs.asReadonly(),\n responses: state.responses.asReadonly() as Signal<Partial<TResponses>>,\n run,\n };\n\n if (devtoolsHandle) devtoolsHandle.current = sequence;\n\n return sequence;\n};\n\n/**\n * Starts an imperative waterfall of dependent queries. Chain the remaining steps with `.then()`\n * and trigger it with `.run()` - see {@link QuerySequence}.\n *\n * The seed step's `args` are produced lazily (at `run()` time), so the sequence can safely live as\n * a component field while still reading current signal values on each run.\n *\n * @example\n * ```ts\n * readonly checkout = querySequence(this.createOrder, () => ({ args: { body: this.order() } }))\n * .then(this.createPayment, (order) => ({ args: { body: { orderId: order.id } } }))\n * .then(this.confirmOrder, (payment, [order]) => ({\n * args: { pathParams: { paymentId: payment.id }, body: { orderRef: order.id } },\n * }));\n *\n * async submit() {\n * const result = await this.checkout.run();\n * if (!result.ok) return this.handle(result.error);\n * const [order, payment, confirmation] = result.responses;\n * }\n * ```\n */\nexport const querySequence = <TArgs extends QueryArgs>(\n query: Query<TArgs>,\n seedArgs: () => QuerySequenceStepArgs<TArgs>,\n): QuerySequence<[ResponseType<TArgs>]> => {\n const devtoolsHandle: QuerySequenceDevtoolsHandle | undefined = isQueryDevtoolsEnabled()\n ? { current: null as unknown as QuerySequence<any> }\n : undefined;\n\n const seed = buildSequence<[ResponseType<TArgs>]>(\n [{ query, produceArgs: () => seedArgs() }],\n createSequenceState(),\n devtoolsHandle,\n );\n\n if (devtoolsHandle) {\n const unregister = registerQueryDevtoolsEntry({\n kind: 'query-sequence',\n handle: devtoolsHandle,\n meta: {},\n });\n\n // Sequences have no destroy hook; tie cleanup to the creating scope when there is one.\n try {\n inject(DestroyRef).onDestroy(unregister);\n } catch {\n // Created outside an injection context - the entry lives for the app's lifetime.\n }\n }\n\n return seed;\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { FieldTree, ReadonlyFieldTree, ValidationError } from '@angular/forms/signals';\nimport { FormViolationView } from '@ethlete/types';\nimport { createQueryErrorResponse, isQueryErrorResponse } from './query-error-response';\nimport { isSymfonyFormViolationListError, isSymfonyListError } from './query-error-response-utils';\n\n/** `kind` of a `ValidationError` created from a single server violation. */\nexport const SERVER_VIOLATION_ERROR_KIND = 'etServerViolation';\n\n/** `kind` of the form-level fallback error created when a failed request carries no violations. */\nexport const SERVER_ERROR_KIND = 'etServerError';\n\n/** A signal-forms validation error created from a single server violation. */\nexport type ServerViolationValidationError = ValidationError.WithOptionalFieldTree & {\n kind: typeof SERVER_VIOLATION_ERROR_KIND;\n message: string;\n /** The violation this error was created from. */\n violation: FormViolationView;\n};\n\n/** The form-level fallback error for a failed request that carries no violations. */\nexport type ServerValidationError = ValidationError.WithOptionalFieldTree & {\n kind: typeof SERVER_ERROR_KIND;\n message: string;\n};\n\n/**\n * Extracts the violation list from a failed request in any of the shapes it may reach you:\n * a `QueryErrorResponse` (from `query.error()` or a settled snapshot), a raw `HttpErrorResponse`,\n * an already-unwrapped error body, or a plain violation array. Returns `[]` when the error\n * carries no violations.\n */\nexport const extractFormViolations = (error: unknown): FormViolationView[] => {\n if (!error) return [];\n\n const body = isQueryErrorResponse(error) ? error.raw.error : error instanceof HttpErrorResponse ? error.error : error;\n\n if (isSymfonyFormViolationListError(body)) {\n return body.violations;\n }\n\n if (isSymfonyListError(body)) {\n return body;\n }\n\n return [];\n};\n\nexport type MapViolationsToFormErrorsOptions<TModel> = {\n /**\n * The field tree the violation property paths are resolved against - usually the form root\n * (or the `field` passed to a signal-forms `submit()` action).\n */\n fieldTree: FieldTree<TModel>;\n\n /**\n * The failed request's error in any shape `extractFormViolations` accepts: a\n * `QueryErrorResponse`, a raw `HttpErrorResponse`, an error body, or a violation array.\n */\n error: unknown;\n\n /**\n * Rewrites a violation's property path before it is resolved against the field tree - use it\n * when the API's payload shape differs from the form model. Return `null` to treat the\n * violation as unmapped.\n */\n rewritePath?: (path: string, violation: FormViolationView) => string | null;\n\n /**\n * Overrides how a violation whose path doesn't resolve to a field is turned into an error.\n * Return `null` to drop the violation. By default an unmapped violation becomes a form-level\n * error (no `fieldTree`), which signal forms attaches to the submitted field.\n */\n onUnmappedViolation?: (violation: FormViolationView) => ValidationError.WithOptionalFieldTree | null;\n};\n\n/**\n * Maps a failed request's violations onto a signal-forms field tree as validation errors -\n * the bridge between an API's violation list (`@ethlete/types` `FormViolationView`) and\n * signal forms.\n *\n * Each violation's `propertyPath` (e.g. `items[2].name`) is resolved against `fieldTree`; a\n * resolved violation becomes a `ServerViolationValidationError` bound to that field, an\n * unresolved one becomes a form-level error (customizable via `onUnmappedViolation`). A failed\n * request that carries no violations at all degrades to form-level `ServerValidationError`s\n * built from the normalized error message - so returning this function's result from a\n * `submit()` action never silently succeeds on failure.\n *\n * ```ts\n * await submit(this.form, async (field) => {\n * const snapshot = await executeUntilSettled(this.createPost, { args: { body: field().value() } });\n * const error = snapshot.error();\n *\n * if (!error) return;\n *\n * return mapViolationsToFormErrors({ fieldTree: field, error });\n * });\n * ```\n */\nexport const mapViolationsToFormErrors = <TModel>(\n options: MapViolationsToFormErrorsOptions<TModel>,\n): ValidationError.WithOptionalFieldTree[] => {\n const { fieldTree, error, rewritePath, onUnmappedViolation } = options;\n\n if (error === null || error === undefined) return [];\n\n const violations = extractFormViolations(error);\n\n if (!violations.length) {\n // An empty violation array is an explicit \"nothing to map\" - only unrecognized error\n // shapes degrade to the form-level fallback.\n if (Array.isArray(error) && !error.length) return [];\n\n return createFallbackErrors(error);\n }\n\n const errors: ValidationError.WithOptionalFieldTree[] = [];\n\n for (const violation of violations) {\n const rawPath = violation.propertyPath;\n const path = rawPath && rewritePath ? rewritePath(rawPath, violation) : rawPath;\n const resolvedFieldTree = path ? resolveFieldTreePath(fieldTree, path) : null;\n\n if (resolvedFieldTree) {\n const mappedError: ServerViolationValidationError = {\n kind: SERVER_VIOLATION_ERROR_KIND,\n message: violation.message,\n fieldTree: resolvedFieldTree,\n violation,\n };\n\n errors.push(mappedError);\n } else if (onUnmappedViolation) {\n const customError = onUnmappedViolation(violation);\n\n if (customError) {\n errors.push(customError);\n }\n } else {\n const unmappedError: ServerViolationValidationError = {\n kind: SERVER_VIOLATION_ERROR_KIND,\n message: violation.message,\n violation,\n };\n\n errors.push(unmappedError);\n }\n }\n\n return errors;\n};\n\nconst createFallbackErrors = (error: unknown): ServerValidationError[] => {\n const queryError = isQueryErrorResponse(error) ? error : createQueryErrorResponse(error);\n\n if (queryError.isList) {\n return queryError.errors.map((item) => ({ kind: SERVER_ERROR_KIND, message: item.message }));\n }\n\n return [{ kind: SERVER_ERROR_KIND, message: queryError.error.message }];\n};\n\n/** Splits a property path like `items[2].name` or `translations['de'].title` into its segments. */\nconst parsePropertyPath = (path: string) => {\n return path\n .replace(/\\[(['\"]?)([^\\]]*?)\\1\\]/g, '.$2')\n .split('.')\n .filter((segment) => segment.length > 0);\n};\n\nconst resolveFieldTreePath = <TModel>(\n fieldTree: FieldTree<TModel>,\n path: string,\n): ReadonlyFieldTree<unknown> | null => {\n let current: unknown = fieldTree;\n\n for (const segment of parsePropertyPath(path)) {\n if (current === null || (typeof current !== 'object' && typeof current !== 'function')) {\n return null;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n // A field tree node is callable (calling it returns the field state) - anything else means the\n // path left the tree (e.g. an index past the array's current length).\n return typeof current === 'function' ? (current as ReadonlyFieldTree<unknown>) : null;\n};\n","import { Resource, Signal } from '@angular/core';\nimport {\n FieldContext,\n FieldTree,\n LogicFn,\n PathKind,\n SchemaPath,\n SchemaPathRules,\n TreeValidationResult,\n validateAsync,\n} from '@angular/forms/signals';\nimport { FormViolationView } from '@ethlete/types';\nimport { extractFormViolations, mapViolationsToFormErrors } from './query-signal-forms';\n\n// Shared core for the query-backed async validators (`validateWithQuery` /\n// `validateWithV2Query`). Everything except how the query is executed - the `factory` that turns\n// the debounced params into a `Resource` - is identical between the v2 and v3 variants, so it is\n// factored here and imported by both. This module is intentionally NOT part of the `http` barrel;\n// it is internal plumbing consumed by direct path (the legacy variant already imports from `http`).\n\n/** Default debounce (ms) applied before a validate request runs, mirroring `selectOptionsFrom*Query`. */\nexport const DEFAULT_QUERY_VALIDATION_DEBOUNCE = 300;\n\n/**\n * Turns a failed validate request into field errors - the default `onError` mapping shared by both\n * validators. Reuses the existing `mapViolationsToFormErrors` bridge: a `422` violation list is\n * resolved onto the child fields by `propertyPath`, while a network / non-violation error degrades\n * to a non-swallowed form-level error. A caller-supplied `mapViolations` overrides only the\n * violation → error step (it receives the already-extracted violations).\n */\nexport const mapQueryValidationError = <TValue, TPathKind extends PathKind>(\n error: unknown,\n ctx: FieldContext<TValue, TPathKind>,\n mapViolations?: (violations: FormViolationView[], ctx: FieldContext<TValue, TPathKind>) => TreeValidationResult,\n): TreeValidationResult => {\n // Angular's `resource()` wraps a thrown non-`Error` (our `QueryErrorResponse` / `HttpErrorResponse`)\n // into an `Error` and stashes the original on `.cause`, so unwrap it before extraction.\n const cause = error instanceof Error && error.cause !== undefined ? error.cause : error;\n\n if (mapViolations) {\n return mapViolations(extractFormViolations(cause), ctx);\n }\n\n // `ctx.fieldTree` is the (read-only) tree of the validated field; `propertyPath`s resolve against\n // it. The cast bridges `ReadonlyFieldTree` → `FieldTree` - `mapViolationsToFormErrors` only walks\n // and reads the tree, never mutates it.\n return mapViolationsToFormErrors({ fieldTree: ctx.fieldTree as unknown as FieldTree<TValue>, error: cause });\n};\n\n/** Config shared by both validators, minus the query engine specifics each variant layers on top. */\nexport type QueryValidatorCoreConfig<TValue, TParams, TResult, TPathKind extends PathKind> = {\n /** Builds the request params from the field context - runs reactively on the field value. */\n params: (ctx: FieldContext<TValue, TPathKind>) => TParams;\n /**\n * Creates the `Resource` that runs the query for the current (debounced) params. The only piece\n * that differs between the v2 and v3 variants.\n */\n factory: (params: Signal<TParams | undefined>) => Resource<TResult | undefined>;\n /** Debounce before the request runs, in ms. @default {@link DEFAULT_QUERY_VALIDATION_DEBOUNCE} */\n debounce?: number;\n /** Gate the validation - return `false` to skip the request (e.g. an empty or invalid value). */\n when?: LogicFn<TValue, boolean, TPathKind>;\n /** Override the default violation → error mapping. Receives the extracted violation list. */\n mapViolations?: (violations: FormViolationView[], ctx: FieldContext<TValue, TPathKind>) => TreeValidationResult;\n};\n\n/**\n * Binds a query-backed async validator to `path` via `validateAsync`. Success (`204` / any `2xx`\n * with no violation body) reports no errors; a failed request is mapped by\n * {@link mapQueryValidationError}. Async validation only runs once the field's synchronous\n * validators pass and while `when` holds - signal forms feeds the `factory` `undefined` params when\n * the request shouldn't run, so the resource stays idle.\n */\nexport const applyQueryAsyncValidator = <TValue, TParams, TResult, TPathKind extends PathKind = PathKind.Root>(\n path: SchemaPath<TValue, SchemaPathRules.Supported, TPathKind>,\n config: QueryValidatorCoreConfig<TValue, TParams, TResult, TPathKind>,\n) => {\n validateAsync<TValue, TParams, TResult, TPathKind>(path, {\n params: config.params,\n debounce: config.debounce ?? DEFAULT_QUERY_VALIDATION_DEBOUNCE,\n factory: config.factory,\n when: config.when,\n onSuccess: () => null,\n onError: (error, ctx) => mapQueryValidationError(error, ctx, config.mapViolations),\n });\n};\n","import { Resource, resource } from '@angular/core';\nimport { FieldContext, PathKind, SchemaPath, SchemaPathRules, TreeValidationResult } from '@angular/forms/signals';\nimport { FormViolationView } from '@ethlete/types';\nimport { AnyQueryCreator, QueryArgsOf } from './query-creator';\nimport { RequestArgs, ResponseType } from './query';\nimport { executeUntilSettled } from './query-snapshot-utils';\nimport { applyQueryAsyncValidator } from './query-validator-core';\n\n/** Config for {@link validateWithQuery}. */\nexport type ValidateWithQueryConfig<TCreator extends AnyQueryCreator, TValue, TPathKind extends PathKind> = {\n /**\n * The query creator to run (e.g. a secure `createPostQuery` validate route). Like a query stack,\n * the query is created **once** and re-executes reactively - never per keystroke. Running it\n * through the query client is the point: auth, base route, caching and error normalization all\n * apply, unlike a raw `httpResource`.\n */\n queryCreator: TCreator;\n /**\n * Builds the request args from the field context. Runs reactively on the field value (debounced),\n * exactly like `validateAsync`'s `params` - e.g.\n * `(ctx) => ({ pathParams: { id }, body: { ...ctx.value() } })`.\n */\n args: (ctx: FieldContext<TValue, TPathKind>) => RequestArgs<QueryArgsOf<TCreator>>;\n /** Debounce before the request runs, in ms. @default 300 */\n debounce?: number;\n /** Gate the validation - return `false` to skip the request (e.g. an empty or invalid value). */\n when?: (ctx: FieldContext<TValue, TPathKind>) => boolean;\n /**\n * Override the default violation → error mapping. Receives the violations extracted from the\n * failed request; return the errors to report (targeting child fields via their `fieldTree`).\n * Defaults to `mapViolationsToFormErrors`, resolving each violation's `propertyPath` against the\n * validated field.\n */\n mapViolations?: (violations: FormViolationView[], ctx: FieldContext<TValue, TPathKind>) => TreeValidationResult;\n};\n\n/**\n * Binds a query-backed async validator to a signal-forms field, adapting an `@ethlete/query` v3\n * query into what `validateAsync` consumes. The query runs through the query client - so bearer\n * auth, base route, caching and Symfony error normalization all apply - where a raw `httpResource`\n * would fire unauthenticated and bypass the pipeline.\n *\n * On the current v3 `QueryClient` / `createPostQuery` creators; the `validateWithV2Query` twin\n * covers the legacy `V2QueryClient`. The query is created once and re-executed (debounced) as the\n * field value changes, only after the field's synchronous validators pass. A `204` / successful\n * response reports no errors; a `422 FormViolationListView` maps each violation onto its child\n * field by `propertyPath`; a network / other error degrades to a non-swallowed form-level error.\n *\n * Call it from a schema definition, the same place you'd call `validateAsync`:\n *\n * ```ts\n * const schema = schema<OpportunityEmail>((p) => {\n * validateWithQuery(p, {\n * queryCreator: postOpportunityEmailValidate,\n * args: (ctx) => ({ pathParams: { opportunityId }, body: { ...ctx.value() } }),\n * });\n * });\n * ```\n */\nexport const validateWithQuery = <TCreator extends AnyQueryCreator, TValue, TPathKind extends PathKind = PathKind.Root>(\n path: SchemaPath<TValue, SchemaPathRules.Supported, TPathKind>,\n config: ValidateWithQueryConfig<TCreator, TValue, TPathKind>,\n) => {\n type TArgs = QueryArgsOf<TCreator>;\n type TParams = RequestArgs<TArgs>;\n type TResult = ResponseType<TArgs>;\n\n applyQueryAsyncValidator<TValue, TParams, TResult, TPathKind>(path, {\n params: config.args,\n debounce: config.debounce,\n when: config.when,\n mapViolations: config.mapViolations,\n factory: (params) => {\n // Created once, exactly like a query stack. A POST validate route doesn't auto-execute, so\n // the resource loader drives it - each params change re-executes with the new args. Those args\n // reach the query through `execute()`, never `withArgs()`, so a function route has to be told\n // the missing feature is intentional or creating the query throws ET100.\n const query = config.queryCreator({ silenceMissingWithArgsFeatureError: true });\n\n return resource<TResult | undefined, TParams | undefined>({\n params: () => params(),\n loader: async ({ params: requestArgs }) => {\n const snapshot = await executeUntilSettled(query, { args: requestArgs as TParams });\n const error = snapshot.error();\n\n // A failed request (e.g. 422) is thrown so it lands in `onError`, where the violations are\n // mapped onto the fields. A `204` / success settles with no error and no violations.\n if (error) {\n throw error;\n }\n\n return snapshot.response() ?? undefined;\n },\n }) as Resource<TResult | undefined>;\n },\n });\n};\n","import {\n computed,\n DestroyRef,\n effect,\n inject,\n Injector,\n isDevMode,\n Signal,\n signal,\n untracked,\n WritableSignal,\n} from '@angular/core';\nimport { defineRootProvider, injectUnsavedChangesCoordinator, isObject, ProviderDefinition } from '@ethlete/core';\nimport { Observable, Subject } from 'rxjs';\nimport {\n DescribableFeature,\n describeQueryDevtoolsFeatures,\n QueryDevtoolsFeatureDescriber,\n} from '../devtools/query-devtools-features';\nimport { isQueryDevtoolsEnabled, registerQueryDevtoolsEntry } from '../devtools/query-devtools-hook';\nimport {\n AnyCreateQueryClientResult,\n authExtractTokensResponseMissingAccessToken,\n authExtractTokensResponseMissingRefreshToken,\n authExtractTokensResponseNotObject,\n authProviderFeatureUsedMultipleTimes,\n createQueryErrorResponse,\n Query,\n QueryArgs,\n QueryClient,\n QueryErrorResponse,\n QueryRepository,\n QuerySnapshot,\n RequestArgs,\n RunQueryExecuteOptions,\n} from '../http';\nimport { decryptBearer } from '../http/internal/request-route';\nimport {\n AnyQueryBuilder,\n AuthQueryBuilder,\n BearerAuthProviderTokens,\n TokenRefreshQueryBuilder,\n} from './bearer-auth-query-builders';\nimport {\n BearerAuthMultiTabSyncFeature,\n InactivityLogoutFeature,\n PersistentAuthFeature,\n TokenExpirationWarningFeature,\n TrackingFeature,\n} from './features';\n\nexport { AnyQueryBuilder } from './bearer-auth-query-builders';\n\nexport type BearerAuthExecutionStateLoading<TType extends string = string> = {\n type: TType;\n state: 'loading';\n};\n\nexport type BearerAuthExecutionStateSuccess<TType extends string = string> = {\n type: TType;\n state: 'success';\n response: unknown;\n};\n\nexport type BearerAuthExecutionStateError<TType extends string = string> = {\n type: TType;\n state: 'error';\n error: QueryErrorResponse;\n};\n\nexport type BearerAuthExecutionStateLogout = {\n type: 'logout';\n state: 'success';\n};\n\nexport type BearerAuthExecutionStateTokenSeed = {\n type: 'tokenSeed';\n state: 'success';\n};\n\nexport type BearerAuthExecutionState<TType extends string = string> =\n | BearerAuthExecutionStateLoading<TType>\n | BearerAuthExecutionStateSuccess<TType>\n | BearerAuthExecutionStateError<TType>\n | BearerAuthExecutionStateLogout\n | BearerAuthExecutionStateTokenSeed;\n\n/**\n * Whether this tab has a session, and whether it is still finding out.\n *\n * - `unknown` - the provider has not finished its own startup yet. Never observed from a component.\n * - `restoring` - a session restore is in flight (`withPersistentAuth`'s auto-login).\n * - `authenticated` - tokens are applied.\n * - `anonymous` - no session, and nothing is trying to get one.\n */\nexport type BearerAuthSessionStatus = 'unknown' | 'restoring' | 'authenticated' | 'anonymous';\n\n/**\n * Why the session ended. A user-initiated logout must stay put; a session that ended on its own\n * usually returns the user to where they were, so the two cannot be told apart by state alone.\n */\nexport type BearerAuthSessionEndCause =\n /** `logout()` called with no cause - a user clicking \"log out\". */\n | 'user'\n /** `withInactivityLogout`'s timer elapsed. */\n | 'inactivity'\n /** A token refresh failed for good, so the tab can no longer renew the session. */\n | 'expired'\n /** Another tab logged out and `withBearerAuthMultiTabSync` carried it here. */\n | 'otherTab';\n\nexport const BearerAuthFeatureType = {\n PERSISTENT_AUTH: 'PERSISTENT_AUTH',\n TOKEN_EXPIRATION_WARNING: 'TOKEN_EXPIRATION_WARNING',\n INACTIVITY_LOGOUT: 'INACTIVITY_LOGOUT',\n TOKEN_REVOCATION: 'TOKEN_REVOCATION',\n TRACKING: 'TRACKING',\n MULTI_TAB_SYNC: 'MULTI_TAB_SYNC',\n} as const;\n\nexport type BearerAuthFeatureType = (typeof BearerAuthFeatureType)[keyof typeof BearerAuthFeatureType];\n\nexport type BearerAuthFeature<TBuilders extends readonly AnyQueryBuilder[], TBearerData> = {\n type: BearerAuthFeatureType;\n setup: (context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown;\n\n /** How the feature was configured, for the devtools. Only called while devtools are enabled. */\n devtools?: QueryDevtoolsFeatureDescriber;\n};\n\n/**\n * What a feature gets before the provider's queries are wired up. Only the tokens, the client and the\n * two session entry points exist this early - everything else is built on top of what early setup\n * returns.\n *\n * Advanced: only a feature that has to run before the auth queries are wired needs this.\n */\nexport type BearerAuthProviderEarlySetupContext = {\n accessToken: WritableSignal<string | null>;\n refreshToken: WritableSignal<string | null>;\n queryClient: QueryClient;\n\n /**\n * The provider's own name. A feature that reaches outside the tab - a `BroadcastChannel`, a Web Lock,\n * a storage key - must namespace it with this, or two providers on the same origin share it.\n */\n name: string;\n\n /**\n * Applies a token pair the way a successful auth query does - including the `afterTokenRefresh$`\n * emission that retries secure queries which failed with a 401. Prefer this over writing\n * {@link accessToken} and {@link refreshToken}, which only changes what the next request sends.\n */\n applyTokens: (access: string, refresh: string) => void;\n\n /** Ends the session, exactly as the provider's own `logout()` does. */\n logout: (cause?: BearerAuthSessionEndCause) => void;\n};\n\n/**\n * How a tab that is not the leader gets a refresh out of the tab that is. Contributed by\n * `withBearerAuthMultiTabSync`; absent when every tab refreshes for itself.\n */\nexport type BearerAuthRefreshCoordination = {\n /** Asks the leader tab to refresh the session's tokens now. */\n request: () => void;\n\n /** Emits in the leader tab whenever another tab asked for a refresh. */\n requests$: Observable<void>;\n};\n\n/** The parts of the provider an early setup can contribute. */\nexport type BearerAuthProviderEarlySetupResult = {\n isLeader?: () => boolean;\n leaderElection?: { isLeader: Signal<boolean>; instanceCount: Signal<number> };\n refreshCoordination?: BearerAuthRefreshCoordination;\n};\n\n/**\n * A feature builder that additionally runs before the auth queries are set up. The auth queries read\n * `isLeader` while being wired, so a feature that decides who the leader is cannot wait for the\n * regular feature pass.\n */\nexport type BearerAuthProviderEarlySetup = {\n earlySetup?: (context: BearerAuthProviderEarlySetupContext) => BearerAuthProviderEarlySetupResult;\n};\n\nexport type ExtractQueryKey<T> =\n T extends AuthQueryBuilder<infer K, any> // eslint-disable-line @typescript-eslint/no-explicit-any\n ? K\n : T extends TokenRefreshQueryBuilder<infer K, any> // eslint-disable-line @typescript-eslint/no-explicit-any\n ? K\n : never;\n\nexport type ExtractQueryArgs<T> =\n T extends AuthQueryBuilder<string, infer TArgs>\n ? TArgs\n : T extends TokenRefreshQueryBuilder<string, infer TArgs>\n ? TArgs\n : never;\n\nexport type QueryRegistryEntry<TArgs extends QueryArgs> = {\n /**\n * Executes the auth query. `args` may be omitted for a query that takes none - its\n * `RequestArgs` is `{}`, which generic helper code cannot produce without a cast.\n */\n execute: (args?: RequestArgs<TArgs>, options?: RunQueryExecuteOptions) => QuerySnapshot<TArgs>;\n snapshot: Signal<QuerySnapshot<TArgs> | null>;\n};\n\nexport type QueryRegistry<TBuilders extends readonly AnyQueryBuilder[]> = {\n [K in ExtractQueryKey<TBuilders[number]>]: QueryRegistryEntry<\n ExtractQueryArgs<Extract<TBuilders[number], { key: K }>>\n >;\n};\n\ntype HasFeatureType<\n TFeatures extends readonly unknown[],\n TType extends BearerAuthFeatureType,\n> = TFeatures extends readonly ((context: any) => any)[] // eslint-disable-line @typescript-eslint/no-explicit-any\n ? Extract<ReturnType<TFeatures[number]>, { type: TType }> extends never\n ? false\n : true\n : false;\n\ntype ExtractFeatureInstance<\n TFeatures extends readonly unknown[],\n TType extends BearerAuthFeatureType,\n> = TFeatures extends readonly ((context: any) => any)[] // eslint-disable-line @typescript-eslint/no-explicit-any\n ? Extract<ReturnType<TFeatures[number]>, { type: TType }> extends { type: TType; instance: infer TInstance }\n ? TInstance\n : never\n : never;\n\nexport type FeatureRegistry<\n TFeatures extends readonly unknown[],\n TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[],\n> = (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.PERSISTENT_AUTH> extends true\n ? { persistentAuth: PersistentAuthFeature }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.TOKEN_EXPIRATION_WARNING> extends true\n ? { tokenExpirationWarning: TokenExpirationWarningFeature }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.INACTIVITY_LOGOUT> extends true\n ? { inactivityLogout: InactivityLogoutFeature }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.TOKEN_REVOCATION> extends true\n ? { tokenRevocation: ExtractFeatureInstance<TFeatures, typeof BearerAuthFeatureType.TOKEN_REVOCATION> }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.TRACKING> extends true\n ? { tracking: TrackingFeature<TBuilders> }\n : unknown) &\n (HasFeatureType<TFeatures, typeof BearerAuthFeatureType.MULTI_TAB_SYNC> extends true\n ? { multiTabSync: BearerAuthMultiTabSyncFeature }\n : unknown);\n\nexport type CreateBearerAuthProviderConfig<\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData,\n> = {\n /**\n * The name of the auth provider\n */\n name: string;\n\n /**\n * The query client tuple from createQueryClient\n */\n queryClientRef: AnyCreateQueryClientResult;\n\n /**\n * Query builders\n */\n queries: TBuilders;\n\n /**\n * Feature builders\n */\n features?: TFeatures;\n\n /**\n * A function that decrypts the bearer token\n * @default decryptBearer()\n */\n bearerDecryptFn?: (token: string) => TBearerData;\n};\n\nexport type BearerAuthProvider<\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData,\n> = {\n /**\n * Registry of all configured auth queries\n */\n queries: QueryRegistry<TBuilders>;\n\n /**\n * Registry of all configured features\n */\n features: FeatureRegistry<TFeatures, TBuilders>;\n\n /**\n * The current access token\n */\n accessToken: Signal<string | null>;\n\n /**\n * The current refresh token\n */\n refreshToken: Signal<string | null>;\n\n /**\n * The decrypted bearer data\n */\n bearerData: Signal<TBearerData | null>;\n\n /**\n * Whether the user is currently authenticated\n */\n isAuthenticated: Signal<boolean>;\n\n /**\n * The latest executed query (including internal triggers like auto-refresh)\n */\n latestExecutedQuery: Signal<{ key: ExtractQueryKey<TBuilders[number]>; snapshot: QuerySnapshot<QueryArgs> } | null>;\n\n /**\n * The latest non-internal query (user-triggered only)\n */\n latestNonInternalQuery: Signal<{\n key: ExtractQueryKey<TBuilders[number]>;\n snapshot: QuerySnapshot<QueryArgs>;\n } | null>;\n\n /**\n * The current execution state of the auth provider.\n * Tracks the latest auth operation (login, autoLogin, tokenRefresh, logout, revocation) with its state and payload.\n */\n executionState: Signal<BearerAuthExecutionState<\n ExtractQueryKey<TBuilders[number]> | 'autoLogin' | 'tokenRefresh' | 'logout' | 'revocation' | 'tokenSeed'\n > | null>;\n\n /**\n * Whether this tab has a session, and whether it is still finding out - the signal to gate an app\n * shell on. Unlike {@link executionState} it always has a value, it answers only this one question,\n * and it reaches `anonymous` even when nothing ever executed (no cookie to restore from).\n */\n sessionStatus: Signal<BearerAuthSessionStatus>;\n\n /**\n * Why the last session ended, or `null` while one is running and before the first ever ended.\n * Cleared as soon as tokens are applied again.\n */\n sessionEndCause: Signal<BearerAuthSessionEndCause | null>;\n\n /**\n * Seeds the provider with tokens that were issued outside of it - an SSO/OIDC callback that\n * arrives with both tokens in the URL, a token handed over by a native shell, a test harness.\n *\n * Behaves like a successful auth query: the tokens are applied, `bearerData` / `isAuthenticated`\n * update, `executionState` becomes `{ type: 'tokenSeed', state: 'success' }` (secure queries treat\n * this the same as a resolved auth query and run normally), and (unless disabled) other tabs are\n * synced. Without it the only way in is to execute the refresh query with the refresh token and\n * throw the access token away.\n *\n * Does **not** persist anything by itself - `withPersistentAuth` picks the tokens up through the\n * same signals it watches for query-issued ones.\n */\n setTokens: (accessToken: string, refreshToken: string) => void;\n\n /**\n * Logout the user (clears all tokens and unbinds secure queries). The optional cause is published\n * as {@link sessionEndCause}; it defaults to `'user'`, so a plain `logout()` reads as a click.\n */\n logout: (cause?: BearerAuthSessionEndCause) => void;\n\n /**\n * Observable that emits after a successful token refresh.\n * Secure queries can subscribe to this to re-execute themselves with the new token.\n */\n afterTokenRefresh$: Observable<void>;\n};\n\nexport type BearerAuthProviderFeatureContext<\n TBearerData = unknown,\n TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[],\n> = {\n refreshToken: WritableSignal<string | null>;\n afterTokenRefresh$: Observable<void>;\n accessToken: WritableSignal<string | null>;\n bearerData: Signal<TBearerData | null>;\n logout: (cause?: BearerAuthSessionEndCause) => void;\n injector: Injector;\n destroyRef: DestroyRef;\n setTokens: (access: string, refresh: string) => void;\n isLeader: () => boolean;\n leaderElection?: { isLeader: Signal<boolean>; instanceCount: Signal<number> };\n queries: QueryRegistry<TBuilders>;\n executionState: WritableSignal<BearerAuthExecutionState | null>;\n sessionStatus: Signal<BearerAuthSessionStatus>;\n sessionEndCause: Signal<BearerAuthSessionEndCause | null>;\n};\n\nexport type BearerAuthProviderQueryContext<\n TBearerData = unknown,\n TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[],\n> = {\n accessToken: WritableSignal<string | null>;\n refreshToken: WritableSignal<string | null>;\n bearerDecryptFn: ((token: string) => TBearerData) | undefined;\n queryClient: QueryClient;\n repository: QueryRepository;\n afterTokenRefresh$: Observable<void>;\n isLeader: () => boolean;\n refreshCoordination: BearerAuthRefreshCoordination | undefined;\n\n /** Ends the session, exactly as the provider's own `logout()` does. */\n logout: (cause?: BearerAuthSessionEndCause) => void;\n queries: QueryRegistry<TBuilders>;\n\n /** Whether any execution that can issue tokens is still running, across every registry key. */\n hasTokenIssuingExecutionInFlight: Signal<boolean>;\n};\n\nconst defaultExtractTokens = (response: unknown): BearerAuthProviderTokens => {\n if (!isObject(response)) {\n throw authExtractTokensResponseNotObject();\n }\n if (!('accessToken' in response) || typeof response['accessToken'] !== 'string') {\n throw authExtractTokensResponseMissingAccessToken();\n }\n if (!('refreshToken' in response) || typeof response['refreshToken'] !== 'string') {\n throw authExtractTokensResponseMissingRefreshToken();\n }\n return { accessToken: response['accessToken'], refreshToken: response['refreshToken'] };\n};\n\nconst deriveExecutionStateType = (builder: AnyQueryBuilder, triggeredBy: string | undefined) => {\n if (triggeredBy === 'persistent-auth') return 'autoLogin';\n if (builder._type === 'tokenRefreshQuery') return 'tokenRefresh';\n if (triggeredBy === 'token-revocation') return 'revocation';\n return builder.key;\n};\n\ntype BearerQueryRegistryContext = {\n injector: Injector;\n latestExecutedQuery: WritableSignal<{ key: string; snapshot: QuerySnapshot<QueryArgs> } | null>;\n latestNonInternalQuery: WritableSignal<{ key: string; snapshot: QuerySnapshot<QueryArgs> } | null>;\n applyTokens: (access: string, refresh: string) => void;\n executionState: WritableSignal<BearerAuthExecutionState | null>;\n sessionStatus: WritableSignal<BearerAuthSessionStatus>;\n isAuthenticated: Signal<boolean>;\n};\n\n/** An execution in progress. `id` is `null` for the ones that cannot issue tokens (a revocation). */\ntype CurrentExecution = { id: number | null; type: string; snapshot: QuerySnapshot<QueryArgs> };\n\nconst setupBearerQueryRegistry = <TBuilders extends readonly AnyQueryBuilder[]>(\n builders: TBuilders,\n context: BearerQueryRegistryContext,\n) => {\n const { injector, latestExecutedQuery, latestNonInternalQuery, applyTokens, executionState, sessionStatus } = context;\n const queries = {} as QueryRegistry<TBuilders>;\n const querySnapshots = new Map<string, Signal<QuerySnapshot<QueryArgs> | null>>();\n\n // Supersession is provider-wide, not per key. Within one key the reused query already handles it,\n // but a token refresh landing while a login is in flight would otherwise apply its tokens over the\n // login's and report its own outcome as the session's - two writers, two different executions.\n let latestExecutionId = 0;\n const currentExecutions: Signal<CurrentExecution | null>[] = [];\n\n for (const builder of builders) {\n const querySnapshot = signal<QuerySnapshot<QueryArgs> | null>(null);\n querySnapshots.set(builder.key, querySnapshot);\n\n const extractTokens = builder.config.extractTokens ?? defaultExtractTokens;\n\n // A 2xx whose body carries no usable tokens is a failed execution, not a successful one - the\n // state effect below reads this so it cannot report `success` for an attempt that left the tab\n // unauthenticated.\n const extractionError = signal<QueryErrorResponse | null>(null);\n\n const currentExecution = signal<CurrentExecution | null>(null);\n currentExecutions.push(currentExecution);\n\n const isSuperseded = (execution: CurrentExecution) => execution.id !== null && execution.id !== latestExecutionId;\n\n // Runs before the state effect below, which reads the extraction error this one writes. Angular\n // runs effects in creation order, so the two must stay in this order.\n effect(() => {\n const execution = currentExecution();\n if (!execution) return;\n\n const { snapshot } = execution;\n const response = snapshot.response();\n const loading = snapshot.loading();\n const error = snapshot.error();\n\n if (response && !loading && !error && !isSuperseded(execution)) {\n try {\n const tokens = extractTokens(response);\n extractionError.set(null);\n applyTokens(tokens.accessToken, tokens.refreshToken);\n } catch (extractError) {\n extractionError.set(createQueryErrorResponse(extractError));\n\n if (isDevMode()) {\n console.error(`Failed to extract tokens from ${builder.key} response:`, extractError);\n }\n }\n }\n });\n\n effect(() => {\n const execution = currentExecution();\n if (!execution) return;\n\n const { type, snapshot } = execution;\n const response = snapshot.response();\n const loading = snapshot.loading();\n const error = snapshot.error();\n\n if (loading || isSuperseded(execution)) return;\n\n if (error) {\n executionState.set({ type, state: 'error', error });\n } else if (response) {\n const failedExtraction = extractionError();\n\n if (failedExtraction) {\n executionState.set({ type, state: 'error', error: failedExtraction });\n } else {\n executionState.set({ type, state: 'success', response });\n }\n }\n\n // Keyed on `isAlive` rather than on the branches above: a cancelled restore produces neither a\n // response nor an error, and would otherwise leave `sessionStatus` at `restoring` forever.\n if (type === 'autoLogin' && !snapshot.isAlive() && !untracked(context.isAuthenticated)) {\n sessionStatus.set('anonymous');\n }\n });\n\n // One query per builder, reused by every execution. A query owns a child injector, a devtools\n // entry and a repository binding holding the request and response bodies - creating one per login\n // attempt or token refresh grows all of that for as long as the tab lives.\n let query: Query<QueryArgs> | null = null;\n\n const execute = (args?: RequestArgs<QueryArgs>, options?: { triggeredBy?: string }) => {\n query ??= builder.config.queryCreator({ onlyManualExecution: true, injector });\n\n extractionError.set(null);\n query.execute({ args, options });\n const snapshot = query.createSnapshot();\n\n const stateType = deriveExecutionStateType(builder, options?.triggeredBy);\n const isRevocation = stateType === 'revocation';\n\n if (!isRevocation) {\n latestExecutedQuery.set({ key: builder.key, snapshot });\n if (!snapshot.triggeredBy()) {\n latestNonInternalQuery.set({ key: builder.key, snapshot });\n }\n }\n executionState.set({ type: stateType, state: 'loading' });\n\n if (stateType === 'autoLogin') {\n sessionStatus.set('restoring');\n }\n\n currentExecution.set({ id: isRevocation ? null : ++latestExecutionId, type: stateType, snapshot });\n querySnapshot.set(snapshot);\n return snapshot;\n };\n\n queries[builder.key as ExtractQueryKey<TBuilders[number]>] = {\n execute,\n snapshot: querySnapshot.asReadonly(),\n } as unknown as QueryRegistry<TBuilders>[ExtractQueryKey<TBuilders[number]>];\n }\n\n const hasTokenIssuingExecutionInFlight = computed(() =>\n currentExecutions.some((execution) => {\n const current = execution();\n\n return !!current && current.id !== null && current.snapshot.isAlive();\n }),\n );\n\n return { queries, querySnapshots, hasTokenIssuingExecutionInFlight };\n};\n\nconst setupFeatures = <\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData,\n>(\n featureBuilders: TFeatures | undefined,\n context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>,\n) => {\n const features: Record<string, unknown> = {};\n\n /** The features as applied, in order - what the devtools describe. */\n const applied: DescribableFeature[] = [];\n\n if (!featureBuilders?.length) {\n return { features, applied };\n }\n\n const featureTypes = new Set<BearerAuthFeatureType>();\n\n for (const featureSetup of featureBuilders) {\n const feature = featureSetup(context) as BearerAuthFeature<TBuilders, TBearerData> &\n DescribableFeature & { instance: unknown };\n\n if (featureTypes.has(feature.type)) {\n throw authProviderFeatureUsedMultipleTimes(feature.type);\n }\n\n featureTypes.add(feature.type);\n const featureName = feature.type\n .toLowerCase()\n .split('_')\n .map((word, index) => (index === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1)))\n .join('');\n features[featureName] = feature.instance;\n applied.push({ type: feature.type, devtools: feature.devtools });\n }\n\n return { features, applied };\n};\n\n/**\n * Describes the provider's queries for the devtools from what their creators were built with, so a\n * refresh request can be exported before the refresh query has ever run.\n */\nconst describeAuthQueries = (builders: readonly AnyQueryBuilder[]) =>\n builders.map((builder) => {\n const internals = builder.config.queryCreator.subtle.creatorInternals as { route?: unknown; method?: string };\n const isRefresh = builder._type === 'tokenRefreshQuery';\n\n return {\n key: builder.key,\n kind: (isRefresh ? 'token-refresh' : 'auth') as 'auth' | 'token-refresh',\n method: internals.method ?? 'POST',\n route: internals.route,\n buildArgs: isRefresh ? builder.buildArgs : undefined,\n };\n });\n\nconst alwaysLeader = () => true;\n\nconst runEarlyFeatureSetup = (\n featureBuilders: readonly unknown[] | undefined,\n context: BearerAuthProviderEarlySetupContext,\n) => {\n let isLeaderFn: () => boolean = alwaysLeader;\n let leaderElectionContext: BearerAuthProviderFeatureContext['leaderElection'];\n let refreshCoordination: BearerAuthRefreshCoordination | undefined;\n\n for (const featureBuilder of featureBuilders ?? []) {\n const earlySetup = (featureBuilder as BearerAuthProviderEarlySetup).earlySetup;\n\n if (!earlySetup) continue;\n\n const result = earlySetup(context);\n\n isLeaderFn = result.isLeader ?? isLeaderFn;\n leaderElectionContext = result.leaderElection ?? leaderElectionContext;\n refreshCoordination = result.refreshCoordination ?? refreshCoordination;\n }\n\n return { isLeaderFn, leaderElectionContext, refreshCoordination };\n};\n\nconst createBearerAuthProviderImpl = <\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData,\n>(\n config: CreateBearerAuthProviderConfig<TBuilders, TFeatures, TBearerData>,\n) => {\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n const queryClient = config.queryClientRef.inject();\n const unsavedChanges = injectUnsavedChangesCoordinator();\n\n const accessToken = signal<string | null>(null);\n const refreshToken = signal<string | null>(null);\n const afterTokenRefresh$ = new Subject<void>();\n\n const bearerData = computed<TBearerData | null>(() => {\n const token = accessToken();\n if (!token) return null;\n\n try {\n return config.bearerDecryptFn?.(token) ?? decryptBearer<TBearerData>(token);\n } catch (error) {\n if (isDevMode()) {\n console.error('Failed to decrypt bearer token:', error);\n }\n return null;\n }\n });\n\n const isAuthenticated = computed(() => !!accessToken());\n const latestExecutedQuery = signal<{ key: string; snapshot: QuerySnapshot<QueryArgs> } | null>(null);\n const latestNonInternalQuery = signal<{ key: string; snapshot: QuerySnapshot<QueryArgs> } | null>(null);\n const executionState = signal<BearerAuthExecutionState | null>(null);\n const sessionStatus = signal<BearerAuthSessionStatus>('unknown');\n const sessionEndCause = signal<BearerAuthSessionEndCause | null>(null);\n\n const applyTokens = (access: string, refresh: string) => {\n accessToken.set(access);\n refreshToken.set(refresh);\n sessionStatus.set('authenticated');\n sessionEndCause.set(null);\n afterTokenRefresh$.next();\n };\n\n // Public entry point only - a query-driven login already reports its own, more specific\n // executionState (e.g. `{ type: 'login', state: 'success' }`) via setupBearerQueryRegistry's\n // execute(), so that internal path calls applyTokens directly to avoid stomping it with this.\n const setTokens = (access: string, refresh: string) => {\n applyTokens(access, refresh);\n executionState.set({ type: 'tokenSeed', state: 'success' });\n };\n\n const { queries, hasTokenIssuingExecutionInFlight } = setupBearerQueryRegistry(config.queries, {\n injector,\n latestExecutedQuery,\n latestNonInternalQuery,\n applyTokens,\n executionState,\n sessionStatus,\n isAuthenticated,\n });\n\n const logout = (cause: BearerAuthSessionEndCause = 'user') => {\n accessToken.set(null);\n refreshToken.set(null);\n queryClient.repository.unbindAllSecure();\n latestExecutedQuery.set(null);\n latestNonInternalQuery.set(null);\n executionState.set({ type: 'logout', state: 'success' });\n sessionStatus.set('anonymous');\n sessionEndCause.set(cause);\n\n // Unsaved edits can no longer be saved once the session is gone. Guarding them past this point\n // only strands a \"discard your changes?\" dialog over the login page the app redirects to, and\n // leaves the tab locked against closing. See `injectUnsavedChangesCoordinator`.\n unsavedChanges.abandonAll('logout');\n };\n\n const isLeader = runEarlyFeatureSetup(config.features, {\n accessToken,\n refreshToken,\n queryClient,\n name: config.name,\n applyTokens,\n logout,\n });\n\n const querySetupContext: BearerAuthProviderQueryContext<TBearerData, TBuilders> = {\n accessToken,\n refreshToken,\n bearerDecryptFn: config.bearerDecryptFn,\n queryClient,\n repository: queryClient.repository,\n isLeader: isLeader.isLeaderFn,\n refreshCoordination: isLeader.refreshCoordination,\n logout,\n afterTokenRefresh$,\n queries: queries as unknown as QueryRegistry<TBuilders>,\n hasTokenIssuingExecutionInFlight,\n };\n\n for (const builder of config.queries) {\n builder.setup?.(querySetupContext);\n }\n\n const featureSetupContext: BearerAuthProviderFeatureContext<TBearerData, TBuilders> = {\n refreshToken,\n accessToken,\n bearerData,\n logout,\n injector,\n destroyRef,\n setTokens,\n isLeader: isLeader.isLeaderFn,\n leaderElection: isLeader.leaderElectionContext,\n afterTokenRefresh$,\n queries: queries as unknown as QueryRegistry<TBuilders>,\n executionState,\n sessionStatus: sessionStatus.asReadonly(),\n sessionEndCause: sessionEndCause.asReadonly(),\n };\n\n const { features, applied: appliedFeatures } = setupFeatures(config.features, featureSetupContext);\n\n // Runs after the features, because `withPersistentAuth` starts its auto-login during setup. Still\n // `unknown` here means nothing is trying to restore a session, so there is nothing to wait for.\n if (sessionStatus() === 'unknown') {\n sessionStatus.set('anonymous');\n }\n\n const provider = {\n queries,\n features: features as FeatureRegistry<TFeatures, TBuilders>,\n accessToken: accessToken.asReadonly(),\n refreshToken: refreshToken.asReadonly(),\n bearerData,\n isAuthenticated,\n latestExecutedQuery: latestExecutedQuery.asReadonly(),\n latestNonInternalQuery: latestNonInternalQuery.asReadonly(),\n executionState: executionState.asReadonly(),\n sessionStatus: sessionStatus.asReadonly(),\n sessionEndCause: sessionEndCause.asReadonly(),\n setTokens,\n logout,\n afterTokenRefresh$,\n } as BearerAuthProvider<TBuilders, TFeatures, TBearerData>;\n\n if (isQueryDevtoolsEnabled()) {\n const unregister = registerQueryDevtoolsEntry({\n kind: 'auth-provider',\n handle: provider,\n clientRef: config.queryClientRef,\n authQueries: describeAuthQueries(config.queries),\n meta: {\n name: config.name,\n clientBaseUrl: queryClient.baseUrl,\n repository: queryClient.repository,\n client: queryClient,\n features: describeQueryDevtoolsFeatures(appliedFeatures),\n },\n });\n\n destroyRef.onDestroy(unregister);\n }\n\n return provider;\n};\n\nexport const createBearerAuthProvider = <\n TBuilders extends readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[],\n TBearerData = unknown,\n>(\n config: CreateBearerAuthProviderConfig<TBuilders, TFeatures, TBearerData>,\n) => defineRootProvider(() => createBearerAuthProviderImpl(config), { name: `BearerAuthProvider_${config.name}` });\n\nexport type BearerAuthProviderRef<\n TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[],\n TFeatures extends readonly ((context: BearerAuthProviderFeatureContext<TBearerData, TBuilders>) => unknown)[] =\n readonly ((context: BearerAuthProviderFeatureContext<unknown, readonly AnyQueryBuilder[]>) => unknown)[],\n TBearerData = unknown,\n> = ProviderDefinition<BearerAuthProvider<TBuilders, TFeatures, TBearerData>>;\n\nexport type AnyCreateBearerAuthProviderResult = BearerAuthProviderRef<any, any, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n/**\n * The exact provider type behind a `createBearerAuthProvider` result - query keys, feature registry\n * and bearer data all preserved.\n *\n * Prefer this over {@link AnyBearerAuthProvider} whenever the provider is reachable as a value, e.g.\n * when passing one into a helper:\n *\n * ```ts\n * export const myApiAuthProviderRef = createBearerAuthProvider({ ... });\n * export type MyApiAuthProvider = BearerAuthProviderOf<typeof myApiAuthProviderRef>;\n *\n * const doLogin = (provider: MyApiAuthProvider) => provider.queries.login({ body: { ... } });\n * ```\n */\nexport type BearerAuthProviderOf<TRef extends AnyCreateBearerAuthProviderResult> = NonNullable<\n ReturnType<TRef['inject']>\n>;\n\nexport type AnyBearerAuthProvider = Omit<\n NonNullable<ReturnType<AnyCreateBearerAuthProviderResult['inject']>>,\n 'queries'\n> & {\n /**\n * Registry of all configured auth queries.\n *\n * Deliberately untyped here: with unknown builders the mapped type degrades to an index\n * signature, and `noPropertyAccessFromIndexSignature` then rejects `provider.queries.login`\n * (TS4111) - forcing every call site into bracket access or a hand-written structural contract.\n * Use {@link BearerAuthProviderOf} where the concrete provider is reachable and the keys survive.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n queries: any;\n};\n","import { effect, isDevMode } from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { filter, of, switchMap, tap, timer } from 'rxjs';\nimport { QueryArgs, QueryCreator, QueryErrorResponse, RequestArgs, ResponseType } from '../http';\nimport { ShouldRetryRequestFn } from '../http/query-retry-utils';\nimport { decryptBearer } from '../http/internal/request-route';\nimport { BearerAuthProviderQueryContext } from './bearer-auth-provider';\n\nexport type BearerAuthProviderTokens = {\n accessToken: string;\n refreshToken: string;\n};\n\nexport type AuthQueryConfig<TArgs extends QueryArgs> = {\n queryCreator: QueryCreator<TArgs>;\n /**\n * Extracts tokens from the response.\n * @default (response) => response (assumes response has accessToken and refreshToken properties)\n */\n extractTokens?: (response: ResponseType<TArgs>) => BearerAuthProviderTokens;\n /**\n * Custom retry function for HTTP requests.\n * @internal Used internally by token refresh queries\n */\n retryFn?: ShouldRetryRequestFn;\n};\n\nexport type TokenRefreshQueryConfig<TArgs extends QueryArgs> = AuthQueryConfig<TArgs> & {\n /**\n * The property name in the decoded JWT that contains the expiration time (in seconds).\n * @default 'exp'\n */\n expiresInPropertyName?: string;\n\n /**\n * Strategy for determining when to refresh the token.\n * Can be either:\n * - A percentage (0-1) of the token's lifetime (e.g., 0.75 = refresh at 75% of lifetime)\n * - A fixed time in milliseconds before expiration\n * - An object with both percentage and min/max constraints\n * @default { percentage: 0.75, minBufferMs: 60000, maxBufferMs: 600000 }\n */\n refreshStrategy?:\n | number\n | {\n /**\n * Percentage of token lifetime before refresh (0-1)\n * @default 0.75\n */\n percentage?: number;\n /**\n * Minimum buffer time in ms (prevents too-early refresh for short-lived tokens)\n * @default 60000 (1 minute)\n */\n minBufferMs?: number;\n /**\n * Maximum buffer time in ms (prevents too-late refresh for long-lived tokens)\n * @default 600000 (10 minutes)\n */\n maxBufferMs?: number;\n };\n\n /**\n * Minimum interval between the *proactive* refreshes the expiry timer schedules, in milliseconds.\n * Prevents rapid refresh loops in case of issues.\n *\n * A refresh a 401 asked for is never throttled by this - a token revoked seconds after a proactive\n * refresh is exactly when the request must go out. Those are deduplicated instead: one refresh is\n * in flight at a time.\n *\n * @default 30000 (30 seconds)\n */\n minRefreshInterval?: number;\n\n /**\n * Whether to immediately refresh if token is already expired on startup.\n * @default true\n */\n refreshIfExpired?: boolean;\n\n /**\n * Configuration for retry behavior on failed refresh attempts.\n * @default { retryableStatusCodes: [0, 408, 425, 429, 500, 502, 503, 504], maxRetryDelayMs: 30000 }\n */\n retryConfig?: {\n /**\n * HTTP status codes that should trigger a retry.\n * Code 0 means network error (no internet).\n * @default [0, 408, 425, 429, 500, 502, 503, 504]\n */\n retryableStatusCodes?: number[];\n /**\n * Maximum delay between retries in milliseconds.\n * Uses exponential backoff up to this limit, then stays constant.\n * @default 30000 (30 seconds)\n */\n maxRetryDelayMs?: number;\n /**\n * Maximum number of retry attempts.\n * Set to 0 for unlimited retries.\n * @default 0 (unlimited)\n */\n maxAttempts?: number;\n };\n\n /**\n * Whether to automatically retry failed requests with 401 status after refreshing tokens.\n * @default true\n */\n autoRetryOn401?: boolean;\n\n /**\n * What to do once the refresh query has failed for good - `retryConfig` decides what is retried,\n * this decides what a failure that survived it means.\n *\n * Defaults to ending the session for any status `retryConfig.retryableStatusCodes` does not list:\n * those are the failures that could still succeed later, everything else leaves the tab holding a\n * token the server will not renew. Without this the session would look valid while every secure\n * query 401s.\n *\n * @example\n * withRefreshQuery('refresh', {\n * queryCreator: refresh,\n * onRefreshFailure: ({ error, logout }) => {\n * if (error.code !== 503) logout();\n * },\n * });\n */\n onRefreshFailure?: (failure: RefreshFailure) => void;\n};\n\n/** What {@link TokenRefreshQueryConfig.onRefreshFailure} is handed when a refresh gives up. */\nexport type RefreshFailure = {\n /** The error the refresh query ended on. */\n error: QueryErrorResponse;\n\n /**\n * Ends the session, exactly as the provider's own `logout()` does, reporting `sessionEndCause`\n * as `'expired'`.\n */\n logout: () => void;\n};\n\nexport type AuthQueryBuilder<TKey extends string, TArgs extends QueryArgs> = {\n _type: 'authQuery';\n key: TKey;\n config: AuthQueryConfig<TArgs>;\n setup?: (context: BearerAuthProviderQueryContext) => void;\n};\n\nexport type TokenRefreshQueryBuilder<TKey extends string, TArgs extends QueryArgs> = {\n _type: 'tokenRefreshQuery';\n key: TKey;\n config: TokenRefreshQueryConfig<TArgs>;\n setup?: (context: BearerAuthProviderQueryContext) => void;\n\n /**\n * The args a refresh sends for a given refresh token, so the devtools can describe the request\n * without running it.\n * @internal\n */\n buildArgs: (refreshToken: string) => RequestArgs<QueryArgs>;\n};\n\nexport type AnyQueryBuilder =\n | AuthQueryBuilder<string, any> // eslint-disable-line @typescript-eslint/no-explicit-any\n | TokenRefreshQueryBuilder<string, any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n\nexport const withAuthenticationQuery = <TKey extends string, TArgs extends QueryArgs>(\n key: TKey,\n config: AuthQueryConfig<TArgs>,\n setup?: (context: BearerAuthProviderQueryContext) => void,\n): AuthQueryBuilder<TKey, TArgs> => ({\n _type: 'authQuery',\n key,\n config: {\n ...config,\n // A spent credential entry must not sit out a retention window: the request body holds the\n // username and password, the response the tokens it was exchanged for.\n queryCreator: config.queryCreator.clone({ keepUnusedFor: 0, subtle: { useQueryRepositoryCache: true } }),\n },\n setup,\n});\n\nexport const withRefreshQuery = <TKey extends string, TArgs extends QueryArgs>(\n key: TKey,\n config: TokenRefreshQueryConfig<TArgs>,\n): TokenRefreshQueryBuilder<TKey, TArgs> => {\n const retryableStatusCodes = config.retryConfig?.retryableStatusCodes ?? [0, 408, 425, 429, 500, 502, 503, 504];\n const maxRetryDelayMs = config.retryConfig?.maxRetryDelayMs ?? 30000; // 30 seconds\n const maxAttempts = config.retryConfig?.maxAttempts ?? 0; // 0 = unlimited\n\n const refreshRetryFn: ShouldRetryRequestFn = ({ error, retryCount }) => {\n const { status } = error;\n\n if (maxAttempts > 0 && retryCount >= maxAttempts) {\n return { retry: false };\n }\n\n if (!retryableStatusCodes.includes(status)) {\n return { retry: false };\n }\n\n if (status === 429) {\n const retryAfter = error.headers.get('retry-after') || error.headers.get('x-retry-after');\n if (retryAfter) {\n const delay = parseInt(retryAfter) * 1000;\n if (!Number.isNaN(delay)) {\n return { retry: true, delay: Math.min(delay, maxRetryDelayMs) };\n }\n }\n }\n\n const exponentialDelay = 1000 * Math.pow(2, retryCount);\n const delay = Math.min(exponentialDelay, maxRetryDelayMs);\n\n return { retry: true, delay };\n };\n\n const buildArgs = (refreshToken: string) => ({ body: { token: refreshToken } }) as RequestArgs<QueryArgs>;\n\n const setup = (context: BearerAuthProviderQueryContext) => {\n const expiresInPropertyName = config.expiresInPropertyName ?? 'exp';\n const minRefreshInterval = config.minRefreshInterval ?? 30000; // 30 seconds default\n const refreshIfExpired = config.refreshIfExpired ?? true;\n\n let lastRefreshTime = 0;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const refreshQuery = () => context.queries[key]!;\n\n const executeRefresh = (reason: 'scheduled' | 'unauthorized') => {\n const currentRefreshToken = context.refreshToken();\n if (!currentRefreshToken) return;\n\n if (!context.isLeader()) {\n // Only the leader may spend a single-use refresh token, but the event is still real - hand it\n // over instead of dropping it, or this tab waits out the leader's timer with a dead token.\n context.refreshCoordination?.request();\n\n return;\n }\n\n // Any token-issuing execution, not just another refresh: a login already in flight is about to\n // issue a token pair of its own, and the refresh token this would spend belongs to the session\n // that login is replacing.\n if (context.hasTokenIssuingExecutionInFlight()) return;\n\n if (reason === 'scheduled') {\n const now = Date.now();\n\n if (now - lastRefreshTime < minRefreshInterval) return;\n\n lastRefreshTime = now;\n }\n\n refreshQuery().execute(buildArgs(currentRefreshToken), { triggeredBy: 'token-refresh' });\n };\n\n const calculateRefreshBuffer = (tokenLifetimeMs: number) => {\n if (typeof config.refreshStrategy === 'number') {\n return config.refreshStrategy;\n }\n\n const percentage = config.refreshStrategy?.percentage ?? 0.75;\n const minBufferMs = config.refreshStrategy?.minBufferMs ?? 60000; // 1 minute\n const maxBufferMs = config.refreshStrategy?.maxBufferMs ?? 600000; // 10 minutes\n\n const calculatedBuffer = tokenLifetimeMs * (1 - percentage);\n\n return Math.max(minBufferMs, Math.min(maxBufferMs, calculatedBuffer));\n };\n\n // Auto-refresh based on token expiration\n toObservable(context.accessToken)\n .pipe(\n switchMap((token) => {\n if (!token) return of(null);\n\n try {\n const bearerDataValue = context.bearerDecryptFn ? context.bearerDecryptFn(token) : decryptBearer(token);\n const expiresIn = (bearerDataValue as Record<string, unknown>)?.[expiresInPropertyName];\n\n if (typeof expiresIn !== 'number') {\n if (isDevMode()) {\n console.warn(`Token does not contain valid ${expiresInPropertyName} property for auto-refresh`);\n }\n\n return of(null);\n }\n\n const expiresAtMs = expiresIn * 1000;\n const now = Date.now();\n const tokenLifetimeMs = expiresAtMs - now;\n\n if (tokenLifetimeMs <= 0) {\n if (refreshIfExpired) {\n if (isDevMode()) {\n console.warn('Token is already expired, triggering immediate refresh');\n }\n\n return of(true);\n }\n\n return of(null);\n }\n\n const refreshBufferMs = calculateRefreshBuffer(tokenLifetimeMs);\n const timeUntilRefresh = tokenLifetimeMs - refreshBufferMs;\n\n if (timeUntilRefresh <= 0) {\n return of(true);\n }\n\n return timer(timeUntilRefresh).pipe(tap(() => true));\n } catch {\n return of(null);\n }\n }),\n takeUntilDestroyed(),\n )\n .subscribe((shouldRefresh) => {\n if (shouldRefresh) {\n executeRefresh('scheduled');\n }\n });\n\n context.refreshCoordination?.requests$.pipe(takeUntilDestroyed()).subscribe(() => executeRefresh('unauthorized'));\n\n const onRefreshFailure =\n config.onRefreshFailure ??\n (({ error, logout }: RefreshFailure) => {\n if (!retryableStatusCodes.includes(error.code)) logout();\n });\n\n effect(() => {\n const snapshot = refreshQuery().snapshot();\n\n if (!snapshot || snapshot.loading()) return;\n\n const error = snapshot.error();\n\n if (!error) return;\n\n onRefreshFailure({ error, logout: () => context.logout('expired') });\n });\n\n // Auto-retry on 401: Listen to repository events and trigger refresh on 401 errors\n const autoRetryOn401 = config.autoRetryOn401 ?? true;\n if (autoRetryOn401) {\n context.repository.events$\n .pipe(\n filter((event) => {\n // Only handle 401 errors for secure queries\n if (event.type !== 'request-error') return false;\n if (!event.isSecure) return false;\n if (event.error?.status !== 401) return false;\n\n return true;\n }),\n takeUntilDestroyed(),\n )\n .subscribe(() => {\n executeRefresh('unauthorized');\n });\n }\n };\n\n return {\n _type: 'tokenRefreshQuery',\n key,\n config: {\n ...config,\n queryCreator: config.queryCreator.clone({\n retryFn: refreshRetryFn,\n keepUnusedFor: 0,\n subtle: { useQueryRepositoryCache: true },\n }),\n },\n setup,\n buildArgs,\n };\n};\n","import { DestroyRef, DOCUMENT, effect, inject, Signal, signal } from '@angular/core';\nimport { filter, fromEvent, interval, merge, switchMap, throttleTime, timer } from 'rxjs';\nimport { formatQueryDevtoolsDuration } from '../../devtools/query-devtools-features';\nimport { AnyQueryBuilder, BearerAuthFeatureType, BearerAuthProviderFeatureContext } from '../bearer-auth-provider';\n\nexport type InactivityLogoutConfig = {\n /**\n * Time in milliseconds of inactivity before auto-logout\n * @default 15 * 60 * 1000 (15 minutes)\n */\n inactivityTimeout?: number;\n /**\n * Events to track for activity detection\n * @default ['mousedown', 'keydown', 'scroll', 'touchstart']\n */\n activityEvents?: string[];\n /**\n * Custom activity check function (called periodically)\n * Return true if user is active\n */\n customActivityCheck?: () => boolean;\n};\n\nexport type InactivityLogoutFeature = {\n /**\n * Enable inactivity tracking\n */\n enable: () => void;\n /**\n * Disable inactivity tracking\n */\n disable: () => void;\n /**\n * Reset the inactivity timer (mark user as active)\n */\n resetTimer: () => void;\n /**\n * Whether inactivity tracking is enabled\n */\n enabled: Signal<boolean>;\n /**\n * Milliseconds until auto-logout (null if disabled or no token)\n */\n calculateTimeUntilLogout: () => number | null;\n};\n\nexport const withInactivityLogout = <TBuilders extends readonly AnyQueryBuilder[]>(\n config: InactivityLogoutConfig = {},\n) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n const inactivityTimeout = config.inactivityTimeout ?? 15 * 60 * 1000;\n const activityEvents = config.activityEvents ?? ['mousedown', 'keydown', 'scroll', 'touchstart'];\n const destroyRef = inject(DestroyRef);\n const document = inject(DOCUMENT);\n const enabled = signal(true);\n const lastActivityTime = signal(Date.now());\n\n const resetTimer = () => {\n lastActivityTime.set(Date.now());\n };\n\n const activityFromEvents$ = merge(...activityEvents.map((event) => fromEvent(document, event))).pipe(\n throttleTime(1000),\n );\n\n const activityFromCustomCheck$ = config.customActivityCheck\n ? interval(1000).pipe(filter(() => config.customActivityCheck?.() ?? false))\n : merge();\n\n const activity$ = merge(activityFromEvents$, activityFromCustomCheck$);\n\n const activitySubscription = activity$.subscribe(() => {\n if (enabled() && context.accessToken()) {\n resetTimer();\n }\n });\n\n const inactivityLogout$ = activity$.pipe(\n switchMap(() => timer(inactivityTimeout)),\n filter(() => enabled() && !!context.accessToken()),\n );\n\n const logoutSubscription = inactivityLogout$.subscribe(() => {\n context.logout('inactivity');\n });\n\n effect(() => {\n const token = context.accessToken();\n if (token && enabled()) {\n resetTimer();\n }\n });\n\n const enable = () => {\n enabled.set(true);\n resetTimer();\n };\n\n const disable = () => {\n enabled.set(false);\n };\n\n const calculateTimeUntilLogout = () => {\n if (!enabled() || !context.accessToken()) {\n return null;\n }\n\n const elapsed = Date.now() - lastActivityTime();\n const remaining = inactivityTimeout - elapsed;\n\n return remaining > 0 ? remaining : 0;\n };\n\n resetTimer();\n\n destroyRef.onDestroy(() => {\n activitySubscription.unsubscribe();\n logoutSubscription.unsubscribe();\n });\n\n const instance: InactivityLogoutFeature = {\n enable,\n disable,\n resetTimer,\n enabled: enabled.asReadonly(),\n calculateTimeUntilLogout,\n };\n\n return {\n type: BearerAuthFeatureType.INACTIVITY_LOGOUT,\n instance,\n devtools: () => [\n { label: 'timeout', value: formatQueryDevtoolsDuration(inactivityTimeout) },\n { label: 'activity events', value: activityEvents.join(', ') },\n ...(config.customActivityCheck ? [{ label: 'custom activity check', value: 'yes' }] : []),\n ],\n };\n };\n};\n","import { DestroyRef, effect, inject, signal, Signal } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\nimport { createQueryKeyLockManager } from '../../http/sync/query-key-lock-manager';\n\n/**\n * Namespace and key of the one lock the whole election is: whoever holds it is the leader, and every\n * other tab of the app is queued behind it. The lock name is what the instance count is derived from,\n * so the two can never disagree about who is taking part. Both carry the provider's name, so two\n * providers reachable from one origin elect a leader each instead of one between them.\n */\nconst LEADER_LOCK_NAMESPACE = 'ethlete-auth';\nconst leaderLockKey = (name: string) => `leader:${name}`;\nconst leaderLockName = (name: string) => `${LEADER_LOCK_NAMESPACE}:${leaderLockKey(name)}`;\n\n/**\n * Web Locks has no \"someone joined\" event, so tabs announce themselves on this channel. Two messages\n * per tab lifetime, in place of the heartbeat this used to run once a second. It also carries a\n * follower's request for a refresh, which is the other thing a tab can only say to the leader.\n */\nconst presenceChannelName = (name: string) => `ethlete-auth-leader:${name}`;\n\ntype LeaderChannelMessage = { type: 'presence' } | { type: 'refresh-requested' };\n\nexport type InternalLeaderElection = {\n /**\n * Whether this tab is the one doing the work only one tab should do - the proactive token refresh.\n *\n * Starts `false` and flips on the next microtask when nothing else holds the lock: the platform\n * grants asynchronously, and the refresh this gates runs off a timer, so nothing observes the gap.\n */\n isLeader: Signal<boolean>;\n\n /**\n * How many tabs of this app currently take part in the election. Telemetry only - `withTracking`\n * emits it - and best-effort: it is recounted when a tab announces itself, says goodbye, or takes\n * over the leadership, not on a timer. A tab that *crashes* without being the leader is therefore\n * still counted until the next of those happens.\n */\n instanceCount: Signal<number>;\n\n /**\n * Whether the browser has the Web Locks API. Without it there is no election at all: every tab\n * holds, so every tab reads as the leader and {@link instanceCount} stays at one.\n */\n isSupported: boolean;\n\n /**\n * Asks the leader to refresh the session's tokens. What a tab that hit a 401 does instead of\n * refreshing itself, which would spend a single-use refresh token the leader also holds.\n */\n requestRefresh: () => void;\n\n /** Emits in the leader tab whenever another tab called {@link requestRefresh}. */\n refreshRequests$: Observable<void>;\n\n /** Releases the lock and leaves the channel. Idempotent, and also run on destroy. */\n cleanup: () => void;\n};\n\nconst countLeaderRequests = (snapshot: LockManagerSnapshot, lockName: string) => {\n const isLeaderLock = (info: LockInfo) => info.name === lockName;\n\n // Held plus pending is exactly the tab count: every tab requests this one lock, one gets it and the\n // rest queue. The platform drops a crashed tab from both lists on its own.\n return (snapshot.held?.filter(isLeaderLock).length ?? 0) + (snapshot.pending?.filter(isLeaderLock).length ?? 0);\n};\n\n/**\n * Elects the one tab that refreshes the session's tokens, over the\n * [Web Locks API](https://developer.mozilla.org/docs/Web/API/Web_Locks_API).\n *\n * The lock does the whole job: requests queue FIFO, so the tab that has been waiting longest takes\n * over, and a holder that closes, crashes or navigates away has its lock released by the platform.\n * No heartbeat, no timeout to tune, and no window in which two tabs both believe they are the leader.\n *\n * Degrades to \"this tab is the leader\" without Web Locks - the same single-tab behavior the previous\n * `localStorage` implementation fell back to, and the only safe default: a session that refreshes its\n * token in every tab is wasteful, one that refreshes it in none logs the user out.\n */\nexport const setupLeaderElection = (options: { name: string }): InternalLeaderElection => {\n const destroyRef = inject(DestroyRef);\n\n const lockName = leaderLockName(options.name);\n const lockManager = createQueryKeyLockManager(LEADER_LOCK_NAMESPACE);\n const hold = lockManager.hold(leaderLockKey(options.name));\n const instanceCount = signal(1);\n const refreshRequests = new Subject<void>();\n\n const noop = () => {\n /* nothing was set up */\n };\n\n // `hold.isHolder` is already `true` in this case, so the tab reads as the leader it effectively is,\n // and asks nobody else for a refresh.\n if (!lockManager.isSupported) {\n return {\n isLeader: hold.isHolder,\n instanceCount: instanceCount.asReadonly(),\n isSupported: false,\n requestRefresh: noop,\n refreshRequests$: refreshRequests.asObservable(),\n cleanup: noop,\n };\n }\n\n const channel =\n typeof BroadcastChannel === 'undefined' ? null : new BroadcastChannel(presenceChannelName(options.name));\n\n let isDestroyed = false;\n\n const recount = async () => {\n const snapshot = await navigator.locks.query();\n\n if (isDestroyed) return;\n\n // Never below one: the snapshot can be taken before this tab's own request is registered, and a\n // count of zero would say the app is not running in the tab reading it.\n instanceCount.set(Math.max(countLeaderRequests(snapshot, lockName), 1));\n };\n\n const announce = () => channel?.postMessage({ type: 'presence' } satisfies LeaderChannelMessage);\n\n const requestRefresh = () => channel?.postMessage({ type: 'refresh-requested' } satisfies LeaderChannelMessage);\n\n if (channel) {\n channel.onmessage = (event: MessageEvent<unknown>) => {\n const message = event.data as LeaderChannelMessage | null;\n\n if (message?.type === 'presence') {\n void recount();\n\n return;\n }\n\n // Every tab hears the request; only the one that may spend the refresh token acts on it.\n if (message?.type === 'refresh-requested' && hold.isHolder()) {\n refreshRequests.next();\n }\n };\n }\n\n effect(() => {\n if (!hold.isHolder()) return;\n\n // Becoming the leader means the previous one went away. A tab that closed normally announced it\n // itself, one that crashed did not - so this is the moment to tell the others for free.\n announce();\n void recount();\n });\n\n announce();\n void recount();\n\n const cleanup = () => {\n if (isDestroyed) return;\n\n isDestroyed = true;\n\n // Release before the goodbye: the tabs that recount on it should no longer see this one queued.\n hold.release();\n announce();\n channel?.close();\n refreshRequests.complete();\n };\n\n destroyRef.onDestroy(cleanup);\n\n return {\n isLeader: hold.isHolder,\n instanceCount: instanceCount.asReadonly(),\n isSupported: true,\n requestRefresh,\n refreshRequests$: refreshRequests.asObservable(),\n cleanup,\n };\n};\n","const ENCRYPTION_KEY_STORAGE = '__eth_ek';\n\nconst generateEncryptionKey = () => {\n const navigatorInfo =\n typeof navigator !== 'undefined'\n ? `${navigator.userAgent}${navigator.language}${screen.width}${screen.height}${screen.colorDepth}`\n : 'server';\n\n const random = Math.random().toString(36).substring(2, 15);\n\n return btoa(`${navigatorInfo}${random}`);\n};\n\nlet cachedKey: string | null = null;\n\nconst getEncryptionKey = () => {\n if (cachedKey) return cachedKey;\n\n if (typeof localStorage !== 'undefined') {\n const stored = localStorage.getItem(ENCRYPTION_KEY_STORAGE);\n if (stored) {\n cachedKey = stored;\n\n return stored;\n }\n\n const newKey = generateEncryptionKey();\n localStorage.setItem(ENCRYPTION_KEY_STORAGE, newKey);\n cachedKey = newKey;\n\n return newKey;\n }\n\n if (!cachedKey) {\n cachedKey = generateEncryptionKey();\n }\n return cachedKey;\n};\n\nconst xorCipher = (text: string, key: string) => {\n let result = '';\n for (let i = 0; i < text.length; i++) {\n result += String.fromCharCode(text.charCodeAt(i) ^ key.charCodeAt(i % key.length));\n }\n return result;\n};\n\nexport const encryptToken = (token: string) => {\n if (!token) return token;\n\n try {\n const key = getEncryptionKey();\n const encrypted = xorCipher(token, key);\n return btoa(encrypted);\n } catch {\n return token;\n }\n};\n\nexport const decryptToken = (encryptedToken: string) => {\n if (!encryptedToken) return encryptedToken;\n\n try {\n const key = getEncryptionKey();\n const encrypted = atob(encryptedToken);\n return xorCipher(encrypted, key);\n } catch {\n return encryptedToken;\n }\n};\n\nexport const isEncrypted = (value: string) => {\n if (!value) return false;\n\n const base64Regex = /^[A-Za-z0-9+/]+=*$/;\n if (!base64Regex.test(value)) return false;\n\n try {\n atob(value);\n return value.length > 20;\n } catch {\n return false;\n }\n};\n\nexport const resetEncryptionKey = () => {\n cachedKey = null;\n if (typeof localStorage !== 'undefined') {\n localStorage.removeItem(ENCRYPTION_KEY_STORAGE);\n }\n};\n","import { DestroyRef, effect, inject, isDevMode, Signal } from '@angular/core';\nimport { BearerAuthSessionEndCause } from '../bearer-auth-provider';\nimport { decryptToken, encryptToken } from '../utils';\n\ntype SyncMessage =\n | {\n type: 'tokens-updated';\n accessToken: string;\n refreshToken: string;\n }\n | {\n type: 'logout';\n };\n\nexport type MultiTabSyncConfig = {\n channelName?: string;\n syncTokens?: boolean;\n syncLogout?: boolean;\n};\n\n/**\n * What the sync needs of the provider: the tokens to watch for outgoing messages, and the provider's own\n * two entry points to write an incoming one through.\n */\nexport type MultiTabSyncContext = {\n accessToken: Signal<string | null>;\n refreshToken: Signal<string | null>;\n\n /** The provider's name, which the default channel name is derived from. */\n name: string;\n\n /**\n * Applies an incoming token pair. Must be the provider's `applyTokens` rather than a write to the\n * token signals: a tab that received tokens has to emit `afterTokenRefresh$` too, or its secure\n * queries that already failed with a 401 never retry.\n */\n applyTokens: (access: string, refresh: string) => void;\n\n /**\n * Ends the session on an incoming logout. Must be the provider's own `logout`, so a tab that was\n * logged out elsewhere reports `{ type: 'logout' }` and abandons its unsaved changes like the tab\n * the logout started in.\n */\n logout: (cause?: BearerAuthSessionEndCause) => void;\n};\n\nexport type InternalMultiTabSync = {\n cleanup: () => void;\n};\n\n/**\n * The channel a provider syncs on unless the consumer names one. Carries the provider's name, so two\n * providers reachable from the same origin do not push each other's tokens around.\n */\nexport const defaultSyncChannelName = (name: string) => `ethlete-auth-sync:${name}`;\n\n/** How a logout is recorded in {@link lastSyncedState}, where a token pair records its two tokens. */\nconst LOGGED_OUT = 'logout';\n\nconst tokenState = (access: string, refresh: string) => `${access}\\0${refresh}`;\n\nexport const setupMultiTabSync = (config: MultiTabSyncConfig, context: MultiTabSyncContext): InternalMultiTabSync => {\n const destroyRef = inject(DestroyRef);\n\n const channelName = config.channelName ?? defaultSyncChannelName(context.name);\n const syncTokens = config.syncTokens ?? true;\n const syncLogout = config.syncLogout ?? true;\n\n if (typeof BroadcastChannel === 'undefined') {\n if (isDevMode()) {\n console.warn('BroadcastChannel is not supported in this environment. Multi-tab sync will be disabled.');\n }\n\n return {\n cleanup: () => {\n // No cleanup needed when BroadcastChannel is not available\n },\n };\n }\n\n const channel = new BroadcastChannel(channelName);\n\n // The session state this tab last sent or received, which is what stops an incoming message from being\n // echoed straight back out. A flag cleared once the message handler returns cannot do that job: the\n // broadcasting effects below run after it, so they would always see it cleared.\n let lastSyncedState: string | null = null;\n\n let hadTokens = false;\n\n channel.onmessage = (event: MessageEvent<SyncMessage>) => {\n const message = event.data;\n\n if (message.type === 'logout' && syncLogout) {\n lastSyncedState = LOGGED_OUT;\n hadTokens = false;\n context.logout('otherTab');\n\n return;\n }\n\n if (message.type !== 'tokens-updated' || !syncTokens) return;\n\n const access = decryptToken(message.accessToken);\n const refresh = decryptToken(message.refreshToken);\n\n if (!access || !refresh) return;\n\n lastSyncedState = tokenState(access, refresh);\n hadTokens = true;\n context.applyTokens(access, refresh);\n };\n\n const cleanup = () => {\n channel.close();\n };\n\n destroyRef.onDestroy(cleanup);\n\n if (syncTokens) {\n effect(() => {\n const access = context.accessToken();\n const refresh = context.refreshToken();\n\n if (!access || !refresh) return;\n\n const state = tokenState(access, refresh);\n\n if (state === lastSyncedState) return;\n\n lastSyncedState = state;\n\n const message: SyncMessage = {\n type: 'tokens-updated',\n accessToken: encryptToken(access),\n refreshToken: encryptToken(refresh),\n };\n\n channel.postMessage(message);\n });\n }\n\n if (syncLogout) {\n effect(() => {\n const access = context.accessToken();\n\n if (access) {\n hadTokens = true;\n\n return;\n }\n\n if (!hadTokens) return;\n\n hadTokens = false;\n\n if (lastSyncedState === LOGGED_OUT) return;\n\n lastSyncedState = LOGGED_OUT;\n\n const message: SyncMessage = { type: 'logout' };\n\n channel.postMessage(message);\n });\n }\n\n return { cleanup };\n};\n","import { Signal, signal } from '@angular/core';\nimport {\n AnyQueryBuilder,\n BearerAuthFeatureType,\n BearerAuthProviderEarlySetup,\n BearerAuthProviderEarlySetupContext,\n BearerAuthProviderFeatureContext,\n} from '../bearer-auth-provider';\nimport { defaultSyncChannelName, setupLeaderElection, setupMultiTabSync } from '../internal';\n\nexport type BearerAuthMultiTabSyncConfig = {\n /**\n * Channel name for BroadcastChannel. Defaults to a channel of the provider's own, so two providers\n * reachable from the same origin do not sync each other's sessions.\n * @default `ethlete-auth-sync:<provider name>`\n */\n channelName?: string;\n\n /**\n * Whether to sync token updates across tabs\n * @default true\n */\n syncTokens?: boolean;\n\n /**\n * Whether to sync logout across tabs\n * @default true\n */\n syncLogout?: boolean;\n\n /**\n * Whether to elect one tab to perform the automatic token refreshes. With this off every tab\n * refreshes on its own.\n * @default true\n */\n leaderElection?: boolean;\n};\n\nexport type BearerAuthMultiTabSyncFeature = {\n /** Whether this tab is the one performing the automatic token refresh. */\n isLeader: Signal<boolean>;\n\n /** How many tabs of this app currently take part in the election. Telemetry only. */\n instanceCount: Signal<number>;\n\n /**\n * How {@link isLeader} was decided. `election` - a Web Locks election is running and exactly one\n * tab reads as the leader. `off` - `leaderElection: false`, so every tab refreshes and every tab\n * reads as the leader. `unsupported` - the browser has no Web Locks, which has the same effect,\n * and leaves {@link instanceCount} at one.\n */\n leadership: 'election' | 'off' | 'unsupported';\n};\n\nconst SINGLE_TAB = /* @__PURE__ */ (() => {\n const isLeader = signal(true).asReadonly();\n const instanceCount = signal(1).asReadonly();\n\n return { isLeader, instanceCount, leadership: 'off' } satisfies BearerAuthMultiTabSyncFeature;\n})();\n\n/**\n * Keeps one browser session consistent across the user's tabs: a login in one tab logs the others in,\n * a logout logs them out, and only one tab (the leader) performs the automatic token refresh so a\n * single-use refresh token is not spent twice.\n *\n * Off by default - a single-tab app, a kiosk or an embedded webview ships neither the\n * `BroadcastChannel` sync nor the Web Locks leader election without it. Degrades to \"this tab is the\n * leader\" in a browser without Web Locks, and warns in dev mode without `BroadcastChannel`.\n *\n * Without this feature every tab is its own leader, which is exactly right when there is only one.\n *\n * @example\n * export const AUTH_PROVIDER = createBearerAuthProvider({\n * name: 'my-auth',\n * queryClientRef: MY_CLIENT,\n * queries: [loginQuery, refreshQuery],\n * features: [withBearerAuthMultiTabSync()],\n * });\n *\n * // provider.features.multiTabSync.isLeader()\n */\nexport const withBearerAuthMultiTabSync = <TBuilders extends readonly AnyQueryBuilder[]>(\n config: BearerAuthMultiTabSyncConfig = {},\n) => {\n let instance: BearerAuthMultiTabSyncFeature = SINGLE_TAB;\n let channelName = config.channelName ?? '';\n\n const setup = (_context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => ({\n type: BearerAuthFeatureType.MULTI_TAB_SYNC,\n instance,\n devtools: () => [\n { label: 'channel', value: channelName },\n { label: 'tokens', value: config.syncTokens === false ? 'tab local' : 'synced' },\n { label: 'logout', value: config.syncLogout === false ? 'tab local' : 'synced' },\n {\n label: 'leader election',\n value: config.leaderElection === false ? 'every tab refreshes' : 'one tab refreshes',\n },\n ],\n });\n\n // The elected leader gates the auth queries' automatic refresh, which is wired up before the\n // regular feature setup runs - so this half has to happen earlier than `setup`.\n const earlySetup: BearerAuthProviderEarlySetup['earlySetup'] = (context: BearerAuthProviderEarlySetupContext) => {\n channelName = config.channelName ?? defaultSyncChannelName(context.name);\n\n setupMultiTabSync(\n { channelName, syncTokens: config.syncTokens, syncLogout: config.syncLogout },\n {\n accessToken: context.accessToken,\n refreshToken: context.refreshToken,\n name: context.name,\n applyTokens: context.applyTokens,\n logout: context.logout,\n },\n );\n\n if (config.leaderElection === false) return {};\n\n const election = setupLeaderElection({ name: context.name });\n\n instance = {\n isLeader: election.isLeader,\n instanceCount: election.instanceCount,\n leadership: election.isSupported ? 'election' : 'unsupported',\n };\n\n return {\n isLeader: () => election.isLeader(),\n leaderElection: instance,\n refreshCoordination: { request: election.requestRefresh, requests$: election.refreshRequests$ },\n };\n };\n\n return Object.assign(setup, { earlySetup });\n};\n","import { Signal, effect, signal } from '@angular/core';\nimport { deleteCookie as coreDeleteCookie, getCookie, getDomain, injectRoute, setCookie } from '@ethlete/core';\nimport { RequestArgs } from '../../http';\nimport {\n AnyQueryBuilder,\n BearerAuthFeatureType,\n BearerAuthProviderFeatureContext,\n ExtractQueryArgs,\n ExtractQueryKey,\n} from '../bearer-auth-provider';\nimport { decryptToken, encryptToken } from '../utils';\n\nexport type PersistentAuthConfig<\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n> = {\n /**\n * Default remember me state when no user preference is stored.\n * @default false\n */\n defaultRememberMe?: boolean;\n\n /**\n * Cookie configuration\n */\n cookie?: {\n /**\n * The cookie name where the refresh token is stored\n * @default 'etAuth'\n */\n name?: string;\n /**\n * The domain of the cookie. If not set, the current origin will be used.\n */\n domain?: string;\n /**\n * The days until the cookie expires (only used when rememberMe is true)\n * @default 30\n */\n expiresInDays?: number;\n /**\n * The path of the cookie\n * @default '/'\n */\n path?: string;\n /**\n * The same site property of the cookie\n * @default 'lax'\n */\n sameSite?: 'strict' | 'none' | 'lax';\n };\n\n /**\n * Auto-login configuration\n */\n autoLogin: {\n /**\n * The query key to use for auto-login (must reference a registered query)\n */\n queryKey: TKey;\n /**\n * A function that turns the token gotten from the cookie into the body for the auto-login request\n * @default (token) => ({ body: { token } })\n */\n buildArgs: (token: string) => RequestArgs<ExtractQueryArgs<Extract<TBuilders[number], { key: TKey }>>>;\n /**\n * An array of routes where the auto login via cookie should not be triggered.\n *\n * @default []\n */\n excludeRoutes?: string[];\n };\n};\n\nexport type PersistentAuthFeature = {\n /**\n * Current remember me state (session cookie vs persistent cookie)\n */\n rememberMe: Signal<boolean>;\n /**\n * Set remember me preference.\n * - true: Creates persistent cookie with expiresInDays\n * - false: Creates session cookie (deleted on browser close)\n */\n setRememberMe: (enabled: boolean) => void;\n /**\n * Try to login using stored cookie\n */\n tryLogin: () => void;\n};\n\nexport const withPersistentAuth = <\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n>(\n config: PersistentAuthConfig<TBuilders, TKey>,\n) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n const instance = createPersistentAuthFeature(config, context);\n return {\n type: BearerAuthFeatureType.PERSISTENT_AUTH,\n instance,\n devtools: () => [\n { label: 'cookie', value: config.cookie?.name ?? 'etAuth' },\n { label: 'remembered for', value: `${config.cookie?.expiresInDays ?? 30}d` },\n { label: 'same site', value: config.cookie?.sameSite ?? 'lax' },\n { label: 'remember me default', value: config.defaultRememberMe ? 'yes' : 'no' },\n { label: 'auto login', value: config.autoLogin.queryKey },\n ...(config.autoLogin.excludeRoutes?.length\n ? [{ label: 'excluded routes', value: config.autoLogin.excludeRoutes.join(', ') }]\n : []),\n ],\n };\n };\n};\n\nexport const createPersistentAuthFeature = <\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n>(\n config: PersistentAuthConfig<TBuilders, TKey>,\n context: BearerAuthProviderFeatureContext<unknown, TBuilders>,\n): PersistentAuthFeature => {\n const { refreshToken, executionState } = context;\n const cookieName = config.cookie?.name ?? 'etAuth';\n const rememberMeStorageKey = `${cookieName}-rememberMe`;\n const route = injectRoute();\n\n const initializeRememberMe = () => {\n const storedPreference = typeof localStorage !== 'undefined' ? localStorage.getItem(rememberMeStorageKey) : null;\n if (storedPreference !== null) {\n return storedPreference === 'true';\n }\n\n const existingCookie = getCookie(cookieName);\n if (existingCookie) {\n return true;\n }\n\n return config.defaultRememberMe ?? false;\n };\n\n const rememberMeSignal = signal(initializeRememberMe());\n\n const cookieDomain = () => config.cookie?.domain ?? getDomain() ?? 'localhost';\n const cookiePath = () => config.cookie?.path ?? '/';\n\n const removeCookie = () => coreDeleteCookie(cookieName, cookiePath(), cookieDomain());\n\n effect(() => {\n const token = refreshToken();\n const rememberMe = rememberMeSignal();\n\n // A missing token is not a reason to drop the cookie. It is missing on every startup - `tryLogin`\n // reads the cookie synchronously and the auto-login only resolves a tick later - so deleting here\n // would throw away a 30-day refresh token before it was ever used. Deletion is driven by the events\n // that actually end a session instead, below.\n if (!token) return;\n\n const expiresInDays = rememberMe ? (config.cookie?.expiresInDays ?? 30) : null;\n\n setCookie(\n cookieName,\n encryptToken(token),\n expiresInDays,\n cookieDomain(),\n cookiePath(),\n config.cookie?.sameSite ?? 'lax',\n );\n });\n\n effect(() => {\n const state = executionState();\n\n if (!state) return;\n\n if (state.type === 'logout') {\n removeCookie();\n\n return;\n }\n\n // A token the server itself rejected is worth nothing on the next visit; anything else (offline, a\n // 500, an aborted startup) leaves it in place so a reload can try again.\n const wasRejected =\n state.state === 'error' &&\n (state.type === 'tokenRefresh' || state.type === 'autoLogin') &&\n (state.error.code === 401 || state.error.code === 403);\n\n if (wasRejected) removeCookie();\n });\n\n const tryLogin = () => {\n const currentRoute = route();\n const excludeRoutes = config.autoLogin.excludeRoutes ?? [];\n const shouldExclude = excludeRoutes.some((r) => currentRoute.startsWith(r));\n\n if (shouldExclude) {\n return;\n }\n\n const storedToken = getCookie(cookieName);\n if (storedToken) {\n const decryptedToken = decryptToken(storedToken);\n const args = config.autoLogin.buildArgs(decryptedToken);\n context.queries[config.autoLogin.queryKey].execute(args, { triggeredBy: 'persistent-auth' });\n }\n };\n\n const setRememberMe = (enabled: boolean) => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(rememberMeStorageKey, String(enabled));\n }\n rememberMeSignal.set(enabled);\n };\n\n tryLogin();\n\n return {\n rememberMe: rememberMeSignal.asReadonly(),\n setRememberMe,\n tryLogin,\n };\n};\n","import { Signal, computed } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { combineLatest, interval, map } from 'rxjs';\nimport { formatQueryDevtoolsDuration } from '../../devtools/query-devtools-features';\nimport { AnyQueryBuilder, BearerAuthFeatureType, BearerAuthProviderFeatureContext } from '../bearer-auth-provider';\n\nexport type TokenExpirationWarningConfig = {\n /**\n * Time in milliseconds before token expiration to emit warning\n * @default 5 * 60 * 1000 (5 minutes)\n */\n warningThreshold?: number;\n /**\n * Interval in milliseconds to check for token expiration\n * @default 1000 (1 second)\n */\n checkInterval?: number;\n};\n\nexport type TokenExpirationWarningFeature = {\n /**\n * Signal that emits true when token is about to expire\n */\n isExpiringSoon: Signal<boolean>;\n /**\n * Time in milliseconds until token expires (null if no token or expired)\n */\n expiresIn: Signal<number | null>;\n /**\n * Timestamp when token expires (null if no token)\n */\n expiresAt: Signal<Date | null>;\n};\n\nexport const withTokenExpirationWarning = <TBuilders extends readonly AnyQueryBuilder[]>(\n config: NoInfer<TokenExpirationWarningConfig> = {},\n) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n const warningThreshold = config.warningThreshold ?? 5 * 60 * 1000;\n const checkInterval = config.checkInterval ?? 1000;\n const expiresAt = computed<Date | null>(() => {\n const decoded = context.bearerData() as { exp?: number; [key: string]: unknown } | null;\n if (!decoded) return null;\n\n const exp = decoded.exp;\n\n if (typeof exp !== 'number') return null;\n\n return new Date(exp * 1000);\n });\n\n const expiresIn$ = combineLatest([interval(checkInterval), toObservable(context.bearerData)]).pipe(\n map(() => {\n const expiry = expiresAt();\n if (!expiry) return null;\n\n const now = Date.now();\n const msUntilExpiry = expiry.getTime() - now;\n\n return msUntilExpiry > 0 ? msUntilExpiry : null;\n }),\n );\n\n const isExpiringSoon$ = expiresIn$.pipe(\n map((msUntilExpiry) => {\n if (msUntilExpiry === null) return false;\n return msUntilExpiry <= warningThreshold && msUntilExpiry > 0;\n }),\n );\n\n const expiresIn = toSignal(expiresIn$, { initialValue: null });\n const isExpiringSoon = toSignal(isExpiringSoon$, { initialValue: false });\n\n const instance: TokenExpirationWarningFeature = {\n expiresAt,\n expiresIn,\n isExpiringSoon,\n };\n\n return {\n type: BearerAuthFeatureType.TOKEN_EXPIRATION_WARNING,\n instance,\n devtools: () => [\n { label: 'warn before', value: formatQueryDevtoolsDuration(warningThreshold) },\n { label: 'check every', value: formatQueryDevtoolsDuration(checkInterval) },\n ],\n };\n };\n};\n","import { effect, Signal, signal, untracked } from '@angular/core';\nimport { AnyQuerySnapshot, QuerySnapshot, RequestArgs } from '../../http';\nimport {\n AnyQueryBuilder,\n BearerAuthFeatureType,\n BearerAuthProviderFeatureContext,\n ExtractQueryArgs,\n ExtractQueryKey,\n} from '../bearer-auth-provider';\n\nexport type TokenRevocationConfig<\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n> = {\n /**\n * The query key to use for token revocation (must reference a registered query)\n */\n queryKey: TKey;\n /**\n * Function to build the revocation request args from tokens\n */\n buildArgs: (tokens: {\n accessToken: string | null;\n refreshToken: string | null;\n }) => RequestArgs<ExtractQueryArgs<Extract<TBuilders[number], { key: TKey }>>>;\n /**\n * Whether to revoke on logout\n * @default true\n */\n revokeOnLogout?: boolean;\n};\n\nexport type TokenRevocationFeature<TQuerySnapshot extends AnyQuerySnapshot> = {\n /**\n * Manually revoke the current tokens.\n * Returns `null` if there are no tokens to revoke\n * Returns the revocation query snapshot if revocation was attempted\n */\n revoke: () => TQuerySnapshot | null;\n /**\n * Enable automatic revocation on logout\n */\n enable: () => void;\n /**\n * Disable automatic revocation on logout\n */\n disable: () => void;\n /**\n * Whether automatic revocation is enabled\n */\n enabled: Signal<boolean>;\n};\n\nexport const withTokenRevocation = <\n TBuilders extends readonly AnyQueryBuilder[],\n TKey extends ExtractQueryKey<TBuilders[number]> = ExtractQueryKey<TBuilders[number]>,\n>(\n config: TokenRevocationConfig<TBuilders, TKey>,\n) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n type RevocationSnapshot = QuerySnapshot<ExtractQueryArgs<Extract<TBuilders[number], { key: TKey }>>>;\n\n const revokeOnLogout = config.revokeOnLogout ?? true;\n\n const enabled = signal(true);\n let previousAccessToken: string | null = null;\n let previousRefreshToken: string | null = null;\n let currentRevocationSnapshot: RevocationSnapshot | null = null;\n\n const revokeWithTokens = (accessToken: string | null, refreshToken: string | null) => {\n if (currentRevocationSnapshot?.isAlive()) return currentRevocationSnapshot;\n\n if (!accessToken && !refreshToken) {\n return null;\n }\n\n const args = config.buildArgs({ accessToken, refreshToken });\n\n context.executionState.set({ type: 'revocation', state: 'loading' });\n\n currentRevocationSnapshot = context.queries[config.queryKey].execute(args, {\n triggeredBy: 'token-revocation',\n });\n\n return currentRevocationSnapshot;\n };\n\n const revoke = () => {\n return revokeWithTokens(context.accessToken(), context.refreshToken());\n };\n\n const enable = () => {\n enabled.set(true);\n };\n\n const disable = () => {\n enabled.set(false);\n };\n\n if (revokeOnLogout) {\n effect(\n () => {\n const currentToken = context.accessToken();\n const currentRefreshToken = context.refreshToken();\n\n if (previousAccessToken && !currentToken && enabled()) {\n untracked(() => revokeWithTokens(previousAccessToken, previousRefreshToken));\n }\n\n previousAccessToken = currentToken;\n previousRefreshToken = currentRefreshToken;\n },\n { injector: context.injector },\n );\n }\n\n const instance: TokenRevocationFeature<RevocationSnapshot> = {\n revoke,\n enable,\n disable,\n enabled: enabled.asReadonly(),\n };\n\n return {\n type: BearerAuthFeatureType.TOKEN_REVOCATION,\n instance,\n devtools: () => [\n { label: 'query', value: config.queryKey },\n { label: 'on logout', value: revokeOnLogout ? 'yes' : 'no' },\n ],\n };\n };\n};\n","import { effect, isDevMode, Signal, untracked } from '@angular/core';\nimport { QueryArgs, QueryErrorResponse, QuerySnapshot } from '../../http';\nimport {\n AnyQueryBuilder,\n BearerAuthFeatureType,\n BearerAuthProviderFeatureContext,\n BearerAuthSessionEndCause,\n ExtractQueryArgs,\n ExtractQueryKey,\n} from '../bearer-auth-provider';\n\nexport type TrackingEventName<TBuilders extends readonly AnyQueryBuilder[]> =\n | `${ExtractQueryKey<TBuilders[number]>}Execute`\n | `${ExtractQueryKey<TBuilders[number]>}Success`\n | `${ExtractQueryKey<TBuilders[number]>}Failure`\n | 'tokenRefreshSuccess'\n | 'logout'\n | 'leaderStatusChange'\n | 'leaderInstanceCountChange';\n\ntype ExtractKeyFromEventName<TEventName extends string> = TEventName extends `${infer K}Execute`\n ? K\n : TEventName extends `${infer K}Success`\n ? K\n : TEventName extends `${infer K}Failure`\n ? K\n : never;\n\ntype ExtractArgsForEvent<TBuilders extends readonly AnyQueryBuilder[], TEventName extends string> = ExtractQueryArgs<\n Extract<TBuilders[number], { key: ExtractKeyFromEventName<TEventName> }>\n>;\n\nexport type QueryExecuteEventData<TArgs extends QueryArgs = QueryArgs> = {\n queryKey: string;\n args: TArgs;\n};\n\nexport type QuerySuccessEventData<TArgs extends QueryArgs = QueryArgs> = {\n snapshot: QuerySnapshot<TArgs>;\n};\n\nexport type QueryFailureEventData = {\n error: QueryErrorResponse;\n};\n\nexport type TokenRefreshEventData = {\n automatic: boolean;\n};\n\nexport type LogoutEventData = {\n cause: BearerAuthSessionEndCause | null;\n};\n\nexport type LeaderStatusChangeEventData = {\n isLeader: boolean;\n};\n\nexport type LeaderInstanceCountChangeEventData = {\n count: number;\n};\n\nexport type TrackingEventDataMap<TBuilders extends readonly AnyQueryBuilder[]> = {\n [K in TrackingEventName<TBuilders>]: K extends `${string}Execute`\n ? QueryExecuteEventData<ExtractArgsForEvent<TBuilders, K>>\n : K extends `${string}Success`\n ? QuerySuccessEventData<ExtractArgsForEvent<TBuilders, K>>\n : K extends `${string}Failure`\n ? QueryFailureEventData\n : K extends 'tokenRefreshSuccess'\n ? TokenRefreshEventData\n : K extends 'logout'\n ? LogoutEventData\n : K extends 'leaderStatusChange'\n ? LeaderStatusChangeEventData\n : K extends 'leaderInstanceCountChange'\n ? LeaderInstanceCountChangeEventData\n : never;\n};\n\nexport type TrackingEventHandler<TData> = (data: TData) => void;\n\nexport type TrackingConfig<TBuilders extends readonly AnyQueryBuilder[] = readonly AnyQueryBuilder[]> = {\n /**\n * Whether to track internal events (auto token refresh, etc.)\n * @default true\n */\n trackInternalEvents?: boolean;\n\n /**\n * Event handlers to register immediately\n */\n on?: {\n [K in TrackingEventName<TBuilders>]?: TrackingEventHandler<TrackingEventDataMap<TBuilders>[K]>;\n };\n};\n\nexport type TrackingFeature<TBuilders extends readonly AnyQueryBuilder[]> = {\n /**\n * Register an event handler for a specific event\n * @returns Unsubscribe function\n */\n on<TEvent extends TrackingEventName<TBuilders>>(\n event: TEvent,\n handler: TrackingEventHandler<TrackingEventDataMap<TBuilders>[TEvent]>,\n ): () => void;\n\n /**\n * Unregister an event handler\n */\n off<TEvent extends TrackingEventName<TBuilders>>(\n event: TEvent,\n handler: TrackingEventHandler<TrackingEventDataMap<TBuilders>[TEvent]>,\n ): void;\n};\n\nexport const withTracking = <TBuilders extends readonly AnyQueryBuilder[]>(config?: TrackingConfig<TBuilders>) => {\n return (context: BearerAuthProviderFeatureContext<unknown, TBuilders>) => {\n const instance = createTrackingFeature<TBuilders>(context, config);\n const handledEvents = Object.keys(config?.on ?? {});\n\n return {\n type: BearerAuthFeatureType.TRACKING,\n instance,\n devtools: () => [\n { label: 'internal events', value: config?.trackInternalEvents === false ? 'ignored' : 'tracked' },\n ...(handledEvents.length ? [{ label: 'handlers', value: handledEvents.join(', ') }] : []),\n ],\n };\n };\n};\n\nexport const createTrackingFeature = <TBuilders extends readonly AnyQueryBuilder[]>(\n context: BearerAuthProviderFeatureContext<unknown, TBuilders>,\n config?: TrackingConfig<TBuilders>,\n): TrackingFeature<TBuilders> => {\n const handlers = new Map<string, Set<TrackingEventHandler<any>>>(); // eslint-disable-line @typescript-eslint/no-explicit-any\n\n const on = <TEvent extends TrackingEventName<TBuilders>>(\n event: TEvent,\n handler: TrackingEventHandler<TrackingEventDataMap<TBuilders>[TEvent]>,\n ): (() => void) => {\n if (!handlers.has(event)) {\n handlers.set(event, new Set());\n }\n const eventHandlers = handlers.get(event);\n if (eventHandlers) {\n eventHandlers.add(handler);\n }\n\n return () => off(event, handler);\n };\n\n const off = <TEvent extends TrackingEventName<TBuilders>>(\n event: TEvent,\n handler: TrackingEventHandler<TrackingEventDataMap<TBuilders>[TEvent]>,\n ) => {\n const eventHandlers = handlers.get(event);\n if (eventHandlers) {\n eventHandlers.delete(handler);\n if (eventHandlers.size === 0) {\n handlers.delete(event);\n }\n }\n };\n\n const fireHandlers = (event: string, data: unknown) => {\n const eventHandlers = handlers.get(event);\n if (eventHandlers) {\n eventHandlers.forEach((handler) => {\n try {\n handler(data);\n } catch (error) {\n console.error(`Error in tracking event handler for \"${event}\":`, error);\n }\n });\n }\n };\n\n type ForwardedMessage = { event: string; data: unknown };\n const forwardingChannel =\n context.leaderElection && typeof BroadcastChannel !== 'undefined'\n ? new BroadcastChannel('ethlete-auth-tracking')\n : null;\n\n if (forwardingChannel) {\n forwardingChannel.onmessage = (messageEvent: MessageEvent<ForwardedMessage>) => {\n if (context.isLeader()) {\n fireHandlers(messageEvent.data.event, messageEvent.data.data);\n }\n };\n context.destroyRef.onDestroy(() => forwardingChannel.close());\n }\n\n const emit = (event: string, data: unknown) => {\n if (forwardingChannel && !context.isLeader()) {\n try {\n forwardingChannel.postMessage({ event, data } satisfies ForwardedMessage);\n\n return;\n } catch (error) {\n // Some payloads cannot leave the tab they were made in: a query snapshot is a bundle of\n // signals, and the structured clone algorithm throws on functions. Firing the handlers here\n // is the lesser evil - the event reaches a handler in the wrong tab rather than taking the\n // effect it was emitted from down with it.\n if (isDevMode()) {\n console.warn(`[@ethlete/query] Could not forward the \"${event}\" tracking event to the leader tab.`, error);\n }\n }\n }\n\n fireHandlers(event, data);\n };\n\n const emitDirect = (event: string, data: unknown) => {\n fireHandlers(event, data);\n };\n\n const trackedQueries = new Map<string, { loading: boolean; lastResult: 'success' | 'error' | null }>();\n\n Object.entries(context.queries).forEach(([key, queryEntry]) => {\n const query = queryEntry as { snapshot: Signal<any>; execute: (...args: any[]) => any }; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n effect(() => {\n const snapshot = query.snapshot();\n if (!snapshot) return;\n\n const triggeredBy = snapshot.triggeredBy();\n if (triggeredBy) return;\n\n const loading = snapshot.loading();\n const error = snapshot.error();\n const response = snapshot.response();\n\n const prevState = trackedQueries.get(key);\n\n if (response && !loading && !error && prevState?.lastResult !== 'success') {\n trackedQueries.set(key, { loading: false, lastResult: 'success' });\n emit(`${key}Success`, { snapshot });\n }\n\n if (error && !loading && prevState?.lastResult !== 'error') {\n trackedQueries.set(key, { loading: false, lastResult: 'error' });\n emit(`${key}Failure`, { error });\n }\n\n if (loading) {\n trackedQueries.set(key, { loading: true, lastResult: null });\n }\n });\n });\n\n let hadTokens = false;\n effect(() => {\n const accessToken = context.accessToken();\n const refreshToken = context.refreshToken();\n const hasTokens = !!(accessToken || refreshToken);\n\n if (hadTokens && !hasTokens) {\n emit('logout', { cause: untracked(context.sessionEndCause) });\n }\n\n hadTokens = hasTokens;\n });\n\n context.afterTokenRefresh$.subscribe(() => {\n emit('tokenRefreshSuccess', {\n queryKey: 'refresh',\n snapshot: undefined,\n });\n });\n\n if (config?.on) {\n Object.entries(config.on).forEach(([event, handler]) => {\n if (handler) {\n on(event as TrackingEventName<TBuilders>, handler);\n }\n });\n }\n\n if (context.leaderElection) {\n const { isLeader: isLeaderSignal, instanceCount: instanceCountSignal } = context.leaderElection;\n\n effect(() => {\n emitDirect('leaderStatusChange', { isLeader: isLeaderSignal() } satisfies LeaderStatusChangeEventData);\n });\n\n effect(() => {\n emitDirect('leaderInstanceCountChange', {\n count: instanceCountSignal(),\n } satisfies LeaderInstanceCountChangeEventData);\n });\n }\n\n return {\n on,\n off,\n };\n};\n","import { Signal, signal } from '@angular/core';\nimport { QueryDevtoolsFaultTarget, QueryDevtoolsResolvedFault } from './query-devtools-hook';\n\n/**\n * A fault armed on one query client from the devtools panel. Unlike the panel's forced states - which\n * write a query's signals directly - an armed fault is applied inside the request pipeline, so retries,\n * error handling features and the cache all see it exactly as they would see a real one.\n */\nexport type QueryDevtoolsFault = {\n /** Extra latency in ms added before every attempt starts. `0` disables it. */\n latencyMs: number;\n\n /**\n * How many upcoming attempts fail before the client is let through again, counted down as they are\n * consumed. `0` disables it.\n */\n failNext: number;\n\n /** The percentage of attempts that fail, rolled per attempt. `0` disables it, `100` fails everything. */\n failRate: number;\n\n /** The status an injected failure responds with. */\n status: number;\n};\n\n/** The neutral fault: nothing armed. */\nexport const EMPTY_QUERY_DEVTOOLS_FAULT: QueryDevtoolsFault = {\n latencyMs: 0,\n failNext: 0,\n failRate: 0,\n status: 503,\n};\n\n/**\n * Statuses worth injecting, and whether the SDK's default retry policy retries them. A picker built from\n * this cannot arm a 500 and then leave you wondering why no retry fired.\n * @see runDefaultQueryRetry\n */\nexport const QUERY_DEVTOOLS_FAULT_STATUSES: { status: number; label: string; retryable: boolean }[] = [\n { status: 0, label: 'Network error', retryable: true },\n { status: 400, label: 'Bad Request', retryable: false },\n { status: 401, label: 'Unauthorized', retryable: false },\n { status: 403, label: 'Forbidden', retryable: false },\n { status: 404, label: 'Not Found', retryable: false },\n { status: 408, label: 'Request Timeout', retryable: true },\n { status: 429, label: 'Too Many Requests', retryable: true },\n { status: 500, label: 'Internal Server Error', retryable: false },\n { status: 502, label: 'Bad Gateway', retryable: true },\n { status: 503, label: 'Service Unavailable', retryable: true },\n];\n\nconst faults = /* @__PURE__ */ signal<Record<string, QueryDevtoolsFault>>({});\n\n/**\n * The faults armed per client name, consumed by the `<et-query-devtools>` UI. Clients with nothing armed\n * are absent rather than present with an {@link EMPTY_QUERY_DEVTOOLS_FAULT}.\n */\nexport const queryDevtoolsFaults: Signal<Record<string, QueryDevtoolsFault>> = /* @__PURE__ */ faults.asReadonly();\n\n/** Whether anything at all is armed on a fault. */\nexport const isQueryDevtoolsFaultArmed = (fault: QueryDevtoolsFault) =>\n fault.latencyMs > 0 || fault.failNext > 0 || fault.failRate > 0;\n\n/**\n * Arms (or updates) the fault of one client. Only the given fields change; the rest keep their current\n * value. A client whose resulting fault has nothing armed is dropped from {@link queryDevtoolsFaults}.\n *\n * Part of the devtools contract consumed by `<et-query-devtools>`; a fault is a debugging tool, not\n * something an application should arm on itself.\n */\nexport const setQueryDevtoolsFault = (options: { clientName: string; patch: Partial<QueryDevtoolsFault> }) => {\n const { clientName, patch } = options;\n\n faults.update((current) => {\n const next = { ...(current[clientName] ?? EMPTY_QUERY_DEVTOOLS_FAULT), ...patch };\n\n if (!isQueryDevtoolsFaultArmed(next)) {\n const { [clientName]: _removed, ...rest } = current;\n\n return rest;\n }\n\n return { ...current, [clientName]: next };\n });\n};\n\n/**\n * Disarms every fault of one client, or of all clients when no name is given.\n *\n * @see setQueryDevtoolsFault\n */\nexport const clearQueryDevtoolsFaults = (clientName?: string) =>\n faults.update((current) => {\n if (clientName === undefined) return {};\n\n const { [clientName]: _removed, ...rest } = current;\n\n return rest;\n });\n\n/**\n * Resolves what to do with one upcoming attempt, consuming a `failNext` budget in the process - so this\n * must be called once per attempt and never speculatively.\n *\n * Installed as the fault resolver by `provideQueryDevtools()`; nothing else may call it.\n * @internal\n */\nexport const resolveQueryDevtoolsFaultForAttempt = (\n target: QueryDevtoolsFaultTarget,\n): QueryDevtoolsResolvedFault | null => {\n const fault = faults()[target.clientName];\n\n if (!fault || !isQueryDevtoolsFaultArmed(fault)) return null;\n\n let shouldFail = false;\n\n if (fault.failNext > 0) {\n shouldFail = true;\n setQueryDevtoolsFault({ clientName: target.clientName, patch: { failNext: fault.failNext - 1 } });\n } else if (fault.failRate > 0) {\n shouldFail = Math.random() * 100 < fault.failRate;\n }\n\n return {\n latencyMs: fault.latencyMs,\n status: shouldFail ? fault.status : null,\n };\n};\n","import { Signal, signal, untracked } from '@angular/core';\nimport { collectQueryFormLinks } from './query-devtools-hook';\n\n/** Which query forms a query reads while it builds its args. */\nexport type QueryDevtoolsFormLinksHandle = {\n /**\n * The devtools ids of the query forms this query's args have read. Empty for a query whose args read\n * none.\n *\n * Accumulates rather than being rebuilt per evaluation: a form's `value` is a memoized signal, so an\n * args build that re-runs for an unrelated reason reads the cached value without going through the\n * form again. Dropping the id there would make the link flicker; a form that a conditional branch\n * stops reading keeps its link until the query is recreated instead.\n */\n ids: Signal<readonly string[]>;\n};\n\n/** The write side, used by the code that evaluates a query's args. */\nexport type QueryDevtoolsFormLinksRecorder = QueryDevtoolsFormLinksHandle & {\n /** Runs `build`, recording every query form whose value it reads. */\n track: <T>(build: () => T) => T;\n};\n\n/**\n * Records which query forms feed one query's args, so the devtools can answer \"which query does this\n * form drive?\" from the reads themselves rather than from a naming convention.\n * @internal\n */\nexport const createQueryDevtoolsFormLinks = (): QueryDevtoolsFormLinksRecorder => {\n const ids = signal<readonly string[]>([]);\n\n return {\n ids: ids.asReadonly(),\n track: (build) => {\n const collected = collectQueryFormLinks(build);\n\n // Args are built inside a reactive computation, which may not write to a signal - `untracked`\n // lifts that restriction, and skipping the write unless something is new keeps the panel from\n // being notified on every evaluation.\n untracked(() => {\n const known = ids();\n const added = collected.ids.filter((id) => !known.includes(id));\n\n if (added.length) ids.set([...known, ...added]);\n });\n\n return collected.value;\n },\n };\n};\n","import { Signal, signal } from '@angular/core';\n\n/**\n * A JSON-pointer-style path into a response body: object keys and array indices, root first. Captured\n * by the devtools panel from wherever the user opened the overrides menu in the value explorer.\n */\nexport type JsonPath = (string | number)[];\n\n/**\n * One path-addressed edit an override registry replays against the live response on every fetch. Unlike\n * the panel's raw-JSON JIT editor, an op describes *how* to change a value rather than freezing the\n * whole body, which is what lets it survive a refetch that returns a differently-valued but same-shaped\n * response.\n *\n * `reset` is never stored or replayed - arming one clears the other ops already armed at its path or\n * anywhere below it instead, so the panel's \"reset this value\" action and its \"arm an edit\" actions\n * share one entry point. Resetting a container therefore undoes a \"fill recursively\" run, whose ops\n * sit on the leaves rather than on the container itself.\n *\n * On the preset ops, `custom` - when present - is the exact value replayed, and `preset` is only the\n * label it was generated under. Values are generated once at arm time and stored, never re-rolled\n * inside apply, so a refetch replays the same response instead of reshuffling it.\n */\nexport type OverrideOp =\n | { type: 'set'; path: JsonPath; value: unknown }\n | {\n type: 'stringPreset';\n path: JsonPath;\n preset: 'short' | 'long' | 'longWord' | 'unicode' | 'custom';\n custom?: string;\n }\n | { type: 'numberPreset'; path: JsonPath; preset: 'zero' | 'negative' | 'huge' | 'custom'; custom?: number }\n | { type: 'booleanFlip'; path: JsonPath }\n | {\n type: 'datePreset';\n path: JsonPath;\n preset: 'now' | 'plusDay' | 'minusDay' | 'farFuture' | 'farPast' | 'invalid';\n }\n | { type: 'duplicateArrayItem'; path: JsonPath; index: number }\n | { type: 'duplicateArray'; path: JsonPath }\n | { type: 'paginationResize'; path: JsonPath; mode: 'shrink' | 'extend'; amount: number }\n | { type: 'reset'; path: JsonPath };\n\n/** One op armed on a query, with the id its owning {@link QueryDevtoolsOverridesHandle} lists it under. */\nexport type QueryDevtoolsOverrideEntry = { id: string; op: OverrideOp };\n\n/** The read side of an overrides recorder, as a {@link QueryDevtoolsEntry} exposes it to the panel. */\nexport type QueryDevtoolsOverridesHandle = {\n /** Every op currently armed on this query, oldest first - the order {@link applyQueryDevtoolsOverrides} replays them in. */\n list: Signal<readonly QueryDevtoolsOverrideEntry[]>;\n\n /** Disarms one op by id. */\n clear: (id: string) => void;\n\n /** Disarms every op on this query. */\n clearAll: () => void;\n};\n\n/** The write side, used by the instrumentation inside the query itself. */\nexport type QueryDevtoolsOverridesRecorder = QueryDevtoolsOverridesHandle & {\n /**\n * Arms a new op, or - for `{ type: 'reset' }` - disarms whatever op(s) already sit at that path or\n * below it instead of adding one.\n */\n arm: (op: OverrideOp) => void;\n\n /**\n * Replays every armed op against `raw`, in arming order, and returns the result. An op whose path no\n * longer resolves against `raw` is skipped rather than thrown - see {@link applyQueryDevtoolsOverrides}.\n * @internal\n */\n apply: (raw: unknown) => unknown;\n};\n\nconst isPathAtOrBelow = (path: JsonPath, root: JsonPath) =>\n path.length >= root.length && root.every((step, index) => step === path[index]);\n\n/**\n * Whether any of `entries` is armed at `path` or anywhere below it - what the panel's menu asks before\n * offering \"Reset\", so the destructive action is hidden where it would be a silent no-op.\n */\nexport const hasQueryDevtoolsOverridesAtPath = (entries: readonly QueryDevtoolsOverrideEntry[], path: JsonPath) =>\n entries.some((entry) => isPathAtOrBelow(entry.op.path, path));\n\ntype PathResolution =\n | { ok: true; exists: boolean; value: unknown }\n | {\n ok: false;\n };\n\n/**\n * Walks `path` into `root`, stopping as soon as a step's container doesn't exist. An empty path\n * resolves to `root` itself, which is how an op targets the response's top-level value.\n */\nconst resolvePath = (root: unknown, path: JsonPath): PathResolution => {\n if (path.length === 0) return { ok: true, exists: true, value: root };\n\n let current = root;\n\n for (let index = 0; index < path.length - 1; index++) {\n if (current === null || typeof current !== 'object') return { ok: false };\n\n const step = path[index] as string | number;\n const container = current as Record<string | number, unknown>;\n\n if (!(step in container)) return { ok: false };\n\n current = container[step];\n }\n\n if (current === null || typeof current !== 'object') return { ok: false };\n\n const key = path[path.length - 1] as string | number;\n const container = current as Record<string | number, unknown>;\n const exists = key in container;\n\n return { ok: true, exists, value: exists ? container[key] : undefined };\n};\n\n/**\n * Returns a copy of `root` with `value` written at `path`, cloning only the containers along the way -\n * every sibling branch keeps its original reference. The final path segment does not need to already\n * exist (a `set` can add a new key); every segment before it does.\n */\nconst withValueAtPath = (root: unknown, path: JsonPath, value: unknown): unknown => {\n if (path.length === 0) return value;\n\n const [head, ...rest] = path as [string | number, ...JsonPath];\n\n if (Array.isArray(root)) {\n const next = [...root];\n next[head as number] = withValueAtPath(root[head as number], rest, value);\n\n return next;\n }\n\n const container = root && typeof root === 'object' ? (root as Record<string, unknown>) : {};\n return { ...container, [head]: withValueAtPath(container[head], rest, value) };\n};\n\nconst IDENTITY_KEY_PATTERNS = [/^id$/i, /(^|[a-z])Id$/, /^uuid$/i, /^key$/i];\n\nconst isIdentityKey = (key: string) => IDENTITY_KEY_PATTERNS.some((pattern) => pattern.test(key));\n\n/** Whether every sibling in `array` that has `key` holds a distinct string/number value for it. */\nconst isSiblingUniqueKey = (array: readonly unknown[], key: string) => {\n const seen = new Set<unknown>();\n\n for (const item of array) {\n const value = (item as Record<string, unknown> | null)?.[key];\n if (value === undefined) continue;\n if (typeof value !== 'string' && typeof value !== 'number') return false;\n if (seen.has(value)) return false;\n seen.add(value);\n }\n\n return seen.size > 0;\n};\n\nconst nextNumericId = (array: readonly unknown[], key: string) => {\n let max = -Infinity;\n\n for (const item of array) {\n const value = (item as Record<string, unknown> | null)?.[key];\n if (typeof value === 'number' && value > max) max = value;\n }\n\n return Number.isFinite(max) ? max + 1 : 1;\n};\n\nconst nextStringId = (array: readonly unknown[], key: string, base: string) => {\n const existing = new Set(array.map((item) => (item as Record<string, unknown> | null)?.[key]));\n\n let suffix = 1;\n while (existing.has(`${base}-copy-${suffix}`)) suffix++;\n\n return `${base}-copy-${suffix}`;\n};\n\n/**\n * Clones `item` (a plain object array element) with every identity-shaped field replaced by a fresh\n * value, so a duplicated row never collides with the one it was copied from. A field counts as identity\n * when its key looks like one (`id`, `fooId`, `uuid`, `key`) or every sibling in `siblings` holds a\n * distinct value for it - without this, `track` bindings and detail-by-id lookups can't tell the copy\n * from the original.\n */\nexport const smartDuplicateArrayItem = (item: unknown, siblings: readonly unknown[]): unknown => {\n if (!item || typeof item !== 'object' || Array.isArray(item)) return item;\n\n const source = item as Record<string, unknown>;\n const result: Record<string, unknown> = { ...source };\n\n for (const key of Object.keys(source)) {\n const value = source[key];\n\n if (!isIdentityKey(key) && !isSiblingUniqueKey(siblings, key)) continue;\n\n if (typeof value === 'number') result[key] = nextNumericId(siblings, key);\n else if (typeof value === 'string') result[key] = nextStringId(siblings, key, value);\n }\n\n return result;\n};\n\nconst duplicateOneArrayItem = (array: readonly unknown[], index: number): unknown[] => {\n const copy = smartDuplicateArrayItem(array[index], array);\n const next = [...array];\n next.splice(index + 1, 0, copy);\n return next;\n};\n\nconst duplicateWholeArray = (array: readonly unknown[]): unknown[] => {\n let result = [...array];\n\n for (const item of array) result = [...result, smartDuplicateArrayItem(item, result)];\n\n return result;\n};\n\n/**\n * The shape of a paginated response this module knows how to resize, matching the variants declared in\n * `@ethlete/types`' pagination types.\n */\ntype PaginationShape = 'gg-like' | 'dyn-like' | 'normalized' | 'contentful-gql-like';\n\n/**\n * Whether `value` structurally matches one of the pagination shapes shrink/extend know how to resize -\n * an `items` array plus a recognized combination of total/page/limit counters. Exported so the panel's\n * menu can offer shrink/extend only where it would actually apply.\n */\nexport const detectPaginationShape = (value: unknown): PaginationShape | null => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null;\n\n const obj = value as Record<string, unknown>;\n if (!Array.isArray(obj['items'])) return null;\n\n const hasNumbers = (...keys: string[]) => keys.every((key) => typeof obj[key] === 'number');\n\n if (hasNumbers('totalHits', 'currentPage', 'totalPageCount', 'itemsPerPage')) return 'gg-like';\n if (hasNumbers('totalHits', 'currentPage', 'totalPages', 'limit')) return 'dyn-like';\n if (hasNumbers('totalPages', 'totalHits', 'currentPage', 'itemsPerPage')) return 'normalized';\n if (hasNumbers('limit', 'skip', 'total')) return 'contentful-gql-like';\n\n return null;\n};\n\nconst DATE_KEY_PATTERN = /date|At$|Timestamp/i;\nconst ISO_DATE_PATTERN = /^\\d{4}-\\d{2}-\\d{2}([T ]\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\n/**\n * Whether a leaf is offered date presets instead of string presets: its key looks date-shaped\n * (`date`, `fooAt`, `fooTimestamp`) and its value round-trips through `Date.parse`, or the value\n * itself matches an ISO-8601 date/datetime pattern regardless of what its key is called. Exported so\n * the panel's menu can decide which preset list to show without duplicating the check.\n */\nexport const isDateShapedLeaf = (key: string | number | null, value: unknown) => {\n if (typeof value !== 'string') return false;\n if (typeof key === 'string' && DATE_KEY_PATTERN.test(key) && !Number.isNaN(Date.parse(value))) return true;\n\n return ISO_DATE_PATTERN.test(value);\n};\n\n/**\n * Every path under `value` (relative to it, not absolute) whose leaf is of `kind` - the paths a \"fill\n * recursively\" menu action turns into one `set`-family op each. Exported so the panel's menu builds the\n * op list with the exact same walk the docs describe, rather than a second, possibly-drifted one.\n */\nexport const collectLeafPaths = (value: unknown, kind: 'string' | 'number' | 'boolean'): JsonPath[] => {\n const paths: JsonPath[] = [];\n\n const walk = (node: unknown, path: JsonPath) => {\n if (Array.isArray(node)) {\n node.forEach((item, index) => walk(item, [...path, index]));\n\n return;\n }\n\n if (node && typeof node === 'object') {\n for (const [key, child] of Object.entries(node)) walk(child, [...path, key]);\n\n return;\n }\n\n if (typeof node === kind) paths.push(path);\n };\n\n walk(value, []);\n\n return paths;\n};\n\nconst resizePagination = (\n value: Record<string, unknown>,\n shape: PaginationShape,\n mode: 'shrink' | 'extend',\n amount: number,\n): Record<string, unknown> => {\n const items = value['items'] as unknown[];\n\n let nextItems: unknown[];\n\n if (mode === 'shrink') {\n nextItems = items.slice(0, Math.max(0, items.length - amount));\n } else if (items.length === 0) {\n // Nothing to clone a new item from - degrade to a no-op rather than inventing data out of thin air.\n nextItems = items;\n } else {\n nextItems = items;\n for (let i = 0; i < amount; i++) {\n nextItems = [...nextItems, smartDuplicateArrayItem(items[i % items.length], nextItems)];\n }\n }\n\n const delta = nextItems.length - items.length;\n const result: Record<string, unknown> = { ...value, items: nextItems };\n\n if (shape === 'gg-like') {\n result['totalHits'] = (value['totalHits'] as number) + delta;\n result['totalPageCount'] = Math.max(\n 1,\n Math.ceil((result['totalHits'] as number) / ((value['itemsPerPage'] as number) || 1)),\n );\n } else if (shape === 'dyn-like') {\n result['totalHits'] = (value['totalHits'] as number) + delta;\n result['totalPages'] = Math.max(1, Math.ceil((result['totalHits'] as number) / ((value['limit'] as number) || 1)));\n } else if (shape === 'normalized') {\n result['totalHits'] = (value['totalHits'] as number) + delta;\n result['totalPages'] = Math.max(\n 1,\n Math.ceil((result['totalHits'] as number) / ((value['itemsPerPage'] as number) || 1)),\n );\n } else {\n result['total'] = (value['total'] as number) + delta;\n }\n\n return result;\n};\n\nconst STRING_PRESETS = {\n short: 'Ab',\n long: /* @__PURE__ */ 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt. '.repeat(\n 4,\n ),\n longWord: 'Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz',\n unicode: 'مرحبا بالعالم 👋 日本語テスト 🎉 Ñoño',\n} as const;\n\nconst stringPresetValue = (preset: 'short' | 'long' | 'longWord' | 'unicode' | 'custom', custom: string | undefined) =>\n custom ?? (preset === 'custom' ? '' : STRING_PRESETS[preset]);\n\nconst NUMBER_PRESETS = {\n zero: 0,\n negative: -1,\n huge: Number.MAX_SAFE_INTEGER,\n} as const;\n\nconst numberPresetValue = (preset: 'zero' | 'negative' | 'huge' | 'custom', custom: number | undefined) =>\n custom ?? (preset === 'custom' ? 0 : NUMBER_PRESETS[preset]);\n\nconst pickRandom = <T>(values: readonly T[]) => values[Math.floor(Math.random() * values.length)] as T;\n\nconst randomIntBetween = (min: number, max: number) => min + Math.floor(Math.random() * (max - min + 1));\n\nconst randomHex = (length: number) => {\n let out = '';\n while (out.length < length) out += Math.random().toString(16).slice(2);\n return out.slice(0, length);\n};\n\nconst SHORT_WORDS = ['Ok', 'Ada', 'Fig', 'Kiwi', 'Nova', 'Echo', 'Amber', 'Delta', 'Mango', 'Quartz', 'Zephyr'];\n\nconst LOREM_SENTENCE =\n 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ';\n\nconst LONG_COMPOUNDS = [\n 'Rindfleischetikettierungsüberwachungsaufgabenübertragungsgesetz',\n 'Donaudampfschifffahrtsgesellschaftskapitänskajütenschlüssel',\n 'Kraftfahrzeughaftpflichtversicherungsbescheinigung',\n];\n\nconst UNICODE_SAMPLES = [\n 'مرحبا بالعالم 👋 اختبار النص',\n '日本語テスト 🎉 カタカナとひらがな',\n '한국어 테스트 💡 조합형 한글',\n 'עברית מימין לשמאל 🚀 בדיקה',\n 'Ñoño über façade — Ω≈ç√∫ 🧪',\n];\n\n/**\n * Generates a fresh sample value for a string preset, so filling twenty fields yields twenty different\n * values instead of twenty identical ones. Call it at arm time and store the result in the op's\n * `custom` field - generating inside apply would reshuffle the response on every refetch. `longWord`\n * is a single unbreakable token (a compound word, a URL, a hex blob) - it tests overflow, where\n * `long` tests wrapping.\n */\nexport const generateQueryDevtoolsStringPreset = (preset: 'short' | 'long' | 'longWord' | 'unicode') => {\n switch (preset) {\n case 'short':\n return pickRandom(SHORT_WORDS);\n case 'long': {\n const length = randomIntBetween(80, 480);\n return LOREM_SENTENCE.repeat(Math.ceil(length / LOREM_SENTENCE.length))\n .slice(0, length)\n .trimEnd();\n }\n case 'longWord':\n return pickRandom([\n () => pickRandom(LONG_COMPOUNDS),\n () =>\n `https://api.example.com/v2/resources/${randomHex(24)}/attachments?signature=${randomHex(randomIntBetween(24, 96))}`,\n () => randomHex(randomIntBetween(64, 160)),\n ])();\n case 'unicode':\n return pickRandom(UNICODE_SAMPLES);\n }\n};\n\n/**\n * Generates a fresh sample value for a number preset - same arm-time contract as\n * {@link generateQueryDevtoolsStringPreset}. `negative` and `huge` vary in magnitude so a batch fill\n * produces varied digit counts; `zero` is always `0`.\n */\nexport const generateQueryDevtoolsNumberPreset = (preset: 'zero' | 'negative' | 'huge') => {\n switch (preset) {\n case 'zero':\n return 0;\n case 'negative': {\n const magnitude = 10 ** randomIntBetween(0, 8);\n return -randomIntBetween(magnitude, magnitude * 10 - 1);\n }\n case 'huge': {\n const magnitude = 10 ** randomIntBetween(9, 15);\n return Math.min(randomIntBetween(magnitude, magnitude * 10 - 1), Number.MAX_SAFE_INTEGER);\n }\n }\n};\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\n\n/** `invalid` is deliberately unparseable - \"the API sent a date my code can't parse\" is a real bug class. */\nconst datePresetValue = (preset: 'now' | 'plusDay' | 'minusDay' | 'farFuture' | 'farPast' | 'invalid') => {\n switch (preset) {\n case 'now':\n return new Date().toISOString();\n case 'plusDay':\n return new Date(Date.now() + DAY_MS).toISOString();\n case 'minusDay':\n return new Date(Date.now() - DAY_MS).toISOString();\n case 'farFuture':\n return new Date('2099-01-01T00:00:00.000Z').toISOString();\n case 'farPast':\n return new Date(0).toISOString();\n case 'invalid':\n return 'not-a-date';\n }\n};\n\nconst applyOp = (root: unknown, op: OverrideOp): { root: unknown; ok: boolean } => {\n if (op.type === 'reset') return { root, ok: true };\n\n const resolution = resolvePath(root, op.path);\n if (!resolution.ok) return { root, ok: false };\n\n switch (op.type) {\n case 'set':\n return { root: withValueAtPath(root, op.path, op.value), ok: true };\n\n case 'booleanFlip':\n if (!resolution.exists || typeof resolution.value !== 'boolean') return { root, ok: false };\n return { root: withValueAtPath(root, op.path, !resolution.value), ok: true };\n\n case 'stringPreset':\n if (!resolution.exists) return { root, ok: false };\n return { root: withValueAtPath(root, op.path, stringPresetValue(op.preset, op.custom)), ok: true };\n\n case 'numberPreset':\n if (!resolution.exists) return { root, ok: false };\n return { root: withValueAtPath(root, op.path, numberPresetValue(op.preset, op.custom)), ok: true };\n\n case 'datePreset':\n if (!resolution.exists) return { root, ok: false };\n return { root: withValueAtPath(root, op.path, datePresetValue(op.preset)), ok: true };\n\n case 'duplicateArrayItem':\n if (!Array.isArray(resolution.value) || op.index < 0 || op.index >= resolution.value.length) {\n return { root, ok: false };\n }\n return { root: withValueAtPath(root, op.path, duplicateOneArrayItem(resolution.value, op.index)), ok: true };\n\n case 'duplicateArray':\n if (!Array.isArray(resolution.value)) return { root, ok: false };\n return { root: withValueAtPath(root, op.path, duplicateWholeArray(resolution.value)), ok: true };\n\n case 'paginationResize': {\n const shape = detectPaginationShape(resolution.value);\n if (!shape) return { root, ok: false };\n return {\n root: withValueAtPath(\n root,\n op.path,\n resizePagination(resolution.value as Record<string, unknown>, shape, op.mode, op.amount),\n ),\n ok: true,\n };\n }\n }\n};\n\n/**\n * Replays `entries` against `raw`, in order, and reports which ones no longer resolve. Shared by the\n * pipeline (which only needs {@link value}) and the panel's menu (which previews a value and marks stale\n * ops before arming a new one) - one implementation, so the two cannot drift.\n */\nexport const applyQueryDevtoolsOverrides = (\n entries: readonly QueryDevtoolsOverrideEntry[],\n raw: unknown,\n): { value: unknown; staleIds: string[] } => {\n let root = raw;\n const staleIds: string[] = [];\n\n for (const entry of entries) {\n const applied = applyOp(root, entry.op);\n root = applied.root;\n if (!applied.ok) staleIds.push(entry.id);\n }\n\n return { value: root, staleIds };\n};\n\n/**\n * Accumulates the response overrides armed on one query, for the devtools panel. Only ever created\n * while {@link provideQueryDevtools} is installed - like {@link createQueryDevtoolsStats}, an app\n * without devtools pays nothing for it.\n * @internal\n */\nexport const createQueryDevtoolsOverrides = (): QueryDevtoolsOverridesRecorder => {\n const list = signal<QueryDevtoolsOverrideEntry[]>([]);\n let counter = 0;\n\n const arm = (op: OverrideOp) => {\n if (op.type === 'reset') {\n list.update((current) => current.filter((entry) => !isPathAtOrBelow(entry.op.path, op.path)));\n\n return;\n }\n\n list.update((current) => [...current, { id: `override-${++counter}`, op }]);\n };\n\n const clear = (id: string) => list.update((current) => current.filter((entry) => entry.id !== id));\n const clearAll = () => list.set([]);\n const apply = (raw: unknown) => applyQueryDevtoolsOverrides(list(), raw).value;\n\n return { list: list.asReadonly(), arm, clear, clearAll, apply };\n};\n","import { HttpHeaders } from '@angular/common/http';\nimport { Signal, signal } from '@angular/core';\nimport { QueryErrorResponse, queryErrorMessages } from '../http/query-error-response';\n\n/**\n * What a query did over its lifetime, as the devtools panel accounts for it: how often it ran, how many\n * of those runs reached the network, and how much payload they moved.\n */\nexport type QueryDevtoolsStats = {\n /** How often the query executed, whether or not that reached the network. */\n executions: number;\n\n /**\n * How many of those executions started a request. The remainder were answered by a fresh cache entry\n * or joined a request that was already in flight.\n */\n requests: number;\n\n /** How many responses arrived over the network. */\n responses: number;\n\n /** How many requests failed. */\n errors: number;\n\n /**\n * How many attempts the retry policy added on top of the first one. A request that succeeded on its\n * third attempt counts two.\n */\n retries: number;\n\n /** The total size of every response body received. */\n receivedBytes: number;\n\n /** The total size of every request body sent. */\n sentBytes: number;\n\n /**\n * Whether any byte count had to be measured from a body instead of read from a `content-length`\n * header. A serialized body is the decoded payload, so it does not account for transport compression -\n * the real transfer was probably smaller.\n */\n hasEstimatedBytes: boolean;\n\n /** When the query executed for the first time. */\n firstExecutedAt: number | null;\n\n /** When its last response arrived. */\n lastResponseAt: number | null;\n\n /**\n * How long the last response took, measured from the execution that preceded it - so it includes the\n * retry delays and the queueing wall clock time, not just the round trip.\n */\n lastDurationMs: number | null;\n\n /** The sum of every response's duration, which together with {@link responses} gives the average. */\n totalDurationMs: number;\n\n /**\n * Whether the query's last completed run ended in a devtools fault rather than a real server\n * response or failure - the fact the panel's tamper indicator badges on. Cleared by the next real\n * response; a run that exhausts its retries on a real error also clears it, since nothing about that\n * outcome was altered by the devtools.\n */\n lastResponseWasFaulted: boolean;\n};\n\nconst EMPTY_STATS: QueryDevtoolsStats = {\n executions: 0,\n requests: 0,\n responses: 0,\n errors: 0,\n retries: 0,\n receivedBytes: 0,\n sentBytes: 0,\n hasEstimatedBytes: false,\n firstExecutedAt: null,\n lastResponseAt: null,\n lastDurationMs: null,\n totalDurationMs: 0,\n lastResponseWasFaulted: false,\n};\n\n/** A payload whose transferred size is to be measured, plus the headers it came with (if any). */\nexport type QueryDevtoolsPayload = {\n headers?: HttpHeaders | null;\n body: unknown;\n};\n\n/**\n * How one run of a query ended. `aborted` is a run whose query started another request before the\n * response arrived - the previous request's events are unbound at that point, so the response it was\n * waiting for can no longer reach it.\n */\nexport type QueryDevtoolsRunStatus = 'pending' | 'success' | 'error' | 'aborted';\n\n/**\n * How a run failed, kept on the run itself. The query's own `error` signal is the live one, but it is\n * blanked whenever the query resets - a logout resets every secure query - so it cannot be read back\n * after the fact. This is the copy that survives.\n */\nexport type QueryDevtoolsRunError = {\n /** The HTTP status code, or 0 for a failure that never reached a response. */\n code: number;\n\n /** Every message the error carried, flattened. @see queryErrorMessages */\n messages: string[];\n\n /**\n * The error response body. Only the newest few runs keep theirs, under the same budget as\n * {@link QueryDevtoolsRun.response}.\n */\n body: unknown;\n\n /** Whether {@link body} still holds this run's error body. */\n hasBody: boolean;\n};\n\n/**\n * A single run of a query, kept alongside the running totals so overlapping runs stay tellable apart -\n * which is what turns \"ran 40 times\" into \"ran 40 times in two seconds\".\n */\nexport type QueryDevtoolsRun = {\n /**\n * Position in the query's lifetime, 1-based. Keeps climbing past the runs the buffer has dropped, so\n * it is a stable identity as well as a run number.\n */\n index: number;\n\n startedAt: number;\n\n /** When the run ended, or `null` while it is still in flight. */\n endedAt: number | null;\n\n status: QueryDevtoolsRunStatus;\n\n /**\n * Whether this run is a request of the query's own. A response that arrives without one was produced\n * by something else - a poll, another consumer of the same cache entry, another tab - and is recorded\n * as an instant, since only its arrival time is knowable.\n */\n didRequest: boolean;\n\n /**\n * The URL this run went to. Kept per run rather than read off the query: a query whose args changed\n * between runs would otherwise label every older run with the URL it happens to hold now.\n */\n url: string | null;\n\n /**\n * How many HTTP attempts this run took - 1 unless the retry policy fired, and 0 for a run that made no\n * request of its own. Which is what tells a slow response apart from one that was retried into place.\n */\n attempts: number;\n\n /** The size of the request body this run sent. */\n sentBytes: number;\n\n /** The size of the response body it received, or 0 until one has. */\n receivedBytes: number;\n\n /**\n * The response body, so one run can be diffed against another. Only the newest few runs keep theirs -\n * a polling query would otherwise retain every response it ever received.\n */\n response: unknown;\n\n /** Whether {@link response} still holds this run's body; a dropped and an empty body both read `null`. */\n hasResponse: boolean;\n\n /** How the run failed, or `null` for one that did not. */\n error: QueryDevtoolsRunError | null;\n};\n\n/** The read side of a stats recorder, as a {@link QueryDevtoolsEntry} exposes it to the panel. */\nexport type QueryDevtoolsStatsHandle = {\n /** The live stats. */\n current: Signal<QueryDevtoolsStats>;\n\n /** The query's most recent runs, oldest first. Bounded - older runs are dropped as new ones arrive. */\n runs: Signal<readonly QueryDevtoolsRun[]>;\n\n /** Clears every counter, so a measurement can be scoped to a single interaction. */\n reset: () => void;\n};\n\n/** The write side, used by the instrumentation inside the query itself. */\nexport type QueryDevtoolsStatsRecorder = QueryDevtoolsStatsHandle & {\n recordExecution: (options: {\n /** Whether the execution started a request, as reported by the repository. */\n didRequest: boolean;\n\n /** The request body it sent, for the outgoing byte count. */\n body?: unknown;\n\n /** The URL it went to. @see QueryDevtoolsRun.url */\n url?: string;\n }) => void;\n\n recordResponse: (payload: QueryDevtoolsPayload) => void;\n\n recordError: (options?: {\n /** Whether the error is a devtools fault rather than a real failure. */\n faulted?: boolean;\n\n /** The failure itself, for {@link QueryDevtoolsRun.error}. */\n error?: QueryErrorResponse;\n }) => void;\n\n /**\n * Raises the attempt count of the run in flight. Idempotent per attempt, so a caller driven off a\n * signal may report the same attempt more than once without inflating {@link QueryDevtoolsStats.retries}.\n */\n recordRetry: (options: { attempt: number }) => void;\n};\n\nconst textEncoder = typeof TextEncoder === 'function' ? /* @__PURE__ */ new TextEncoder() : null;\n\nconst byteLengthOf = (text: string) => textEncoder?.encode(text).length ?? text.length;\n\nconst estimateBodySize = (body: unknown) => {\n if (body === null || body === undefined) return 0;\n if (typeof body === 'string') return byteLengthOf(body);\n if (typeof Blob !== 'undefined' && body instanceof Blob) return body.size;\n if (body instanceof ArrayBuffer) return body.byteLength;\n if (ArrayBuffer.isView(body)) return body.byteLength;\n if (typeof FormData !== 'undefined' && body instanceof FormData) return 0;\n\n try {\n return byteLengthOf(JSON.stringify(body) ?? '');\n } catch {\n // A body holding a circular reference or a BigInt has no serialized size to report.\n return 0;\n }\n};\n\n/** How many runs a query keeps. Enough to see a stampede or a chain without growing unbounded. */\nconst RUN_HISTORY = 25;\n\n/**\n * How many of those runs keep a body - a response, or the body an error came with. Bodies dominate what\n * the buffer retains, which is why this is far below {@link RUN_HISTORY} and why raising it is a memory\n * decision the app has to make for itself.\n */\nconst DEFAULT_RESPONSE_HISTORY = 5;\n\nlet responseHistory = DEFAULT_RESPONSE_HISTORY;\n\n/**\n * How many bodies each query retains - {@link QueryDevtoolsOptions.responseHistory}, or `5`. Only a run\n * that still holds one can be an end of a response diff, so the panel reads this to say why an older run\n * can no longer be picked.\n *\n * Part of the devtools contract. **Not part of the general public contract.**\n */\nexport const queryDevtoolsResponseHistory = () => responseHistory;\n\n/**\n * Sets how many bodies each query retains. Called by `provideQueryDevtools()`; nothing else may call it.\n * @internal\n */\nexport const setQueryDevtoolsResponseHistory = (count: number | undefined) => {\n responseHistory = count === undefined ? DEFAULT_RESPONSE_HISTORY : Math.max(1, Math.floor(count));\n};\n\n/** The index of the newest run still in flight, or -1 when none is. */\nconst lastPendingRunIndex = (runs: readonly QueryDevtoolsRun[]) => {\n for (let index = runs.length - 1; index >= 0; index--) {\n if (runs[index]?.status === 'pending') return index;\n }\n\n return -1;\n};\n\n/**\n * Drops the body of every run past the newest {@link queryDevtoolsResponseHistory} that hold one - a\n * response body and an error body count against the same budget, since a run only ever has one of the\n * two. Mutates the array it is given, which is always one this module just built.\n */\nconst trimRetainedBodies = (runs: QueryDevtoolsRun[]) => {\n const budget = responseHistory;\n let kept = 0;\n\n for (let index = runs.length - 1; index >= 0; index--) {\n const run = runs[index];\n\n if (!run || (!run.hasResponse && !run.error?.hasBody)) continue;\n if (++kept <= budget) continue;\n\n runs[index] = {\n ...run,\n response: null,\n hasResponse: false,\n error: run.error?.hasBody ? { ...run.error, body: null, hasBody: false } : run.error,\n };\n }\n\n return runs;\n};\n\n/**\n * The size of a payload in bytes, and whether that size is the one that went over the wire. Only a\n * `content-length` header is exact; everything else is measured by serializing the body.\n *\n * Part of the devtools contract - the panel measures the cache and the event log with it. **Not part of\n * the general public contract.**\n */\nexport const measureQueryDevtoolsPayload = (payload: QueryDevtoolsPayload): { bytes: number; isExact: boolean } => {\n const contentLength = Number(payload.headers?.get('content-length'));\n\n if (Number.isFinite(contentLength) && contentLength > 0) return { bytes: contentLength, isExact: true };\n\n return { bytes: estimateBodySize(payload.body), isExact: false };\n};\n\n/**\n * Accumulates what a query does, for the devtools panel. Only ever created while\n * {@link provideQueryDevtools} is installed - measuring a body's size serializes it, which no app\n * without devtools should pay for.\n * @internal\n */\nexport const createQueryDevtoolsStats = (): QueryDevtoolsStatsRecorder => {\n const stats = signal(EMPTY_STATS);\n const runs = signal<readonly QueryDevtoolsRun[]>([]);\n\n // The baseline the next response's duration is measured against. Deliberately not part of the stats:\n // a duration is only ever reported once the response it belongs to has arrived.\n let lastExecutionAt: number | null = null;\n\n // The URL of the last execution, whether or not it requested - so a response that arrives without a run\n // of the query's own is still attributed to the URL the query was pointed at.\n let lastUrl: string | null = null;\n\n let runCounter = 0;\n\n const appendRun = (run: Omit<QueryDevtoolsRun, 'index'>, previous: readonly QueryDevtoolsRun[]) => {\n const appended: QueryDevtoolsRun = { ...run, index: ++runCounter };\n\n runs.set(trimRetainedBodies([...previous, appended].slice(-RUN_HISTORY)));\n };\n\n /**\n * Ends the newest run still in flight. A response with no run of the query's own waiting for it came\n * from elsewhere (see {@link QueryDevtoolsRun.didRequest}), so it is recorded as an instant instead.\n */\n const endRun = (end: {\n endedAt: number;\n status: 'success' | 'error';\n receivedBytes: number;\n response: unknown;\n hasResponse: boolean;\n error: QueryDevtoolsRunError | null;\n }) => {\n const current = runs();\n const pending = lastPendingRunIndex(current);\n\n if (pending === -1) {\n appendRun(\n { ...end, startedAt: end.endedAt, didRequest: false, url: lastUrl, sentBytes: 0, attempts: 0 },\n current,\n );\n\n return;\n }\n\n runs.set(trimRetainedBodies(current.map((run, index) => (index === pending ? { ...run, ...end } : run))));\n };\n\n const recordExecution: QueryDevtoolsStatsRecorder['recordExecution'] = ({ didRequest, body, url }) => {\n const now = Date.now();\n const sent = didRequest ? measureQueryDevtoolsPayload({ body }) : null;\n\n lastExecutionAt = now;\n lastUrl = url ?? null;\n\n stats.update((current) => ({\n ...current,\n executions: current.executions + 1,\n requests: current.requests + (didRequest ? 1 : 0),\n sentBytes: current.sentBytes + (sent?.bytes ?? 0),\n hasEstimatedBytes: current.hasEstimatedBytes || (!!sent?.bytes && !sent.isExact),\n firstExecutedAt: current.firstExecutedAt ?? now,\n }));\n\n // An execution answered from the cache, or one that joined a request already in flight, starts no\n // run of its own - the response it eventually gets (if any) is what records one.\n if (!didRequest) return;\n\n appendRun(\n {\n startedAt: now,\n endedAt: null,\n status: 'pending',\n didRequest: true,\n url: lastUrl,\n attempts: 1,\n sentBytes: sent?.bytes ?? 0,\n receivedBytes: 0,\n response: null,\n hasResponse: false,\n error: null,\n },\n runs().map((run) => (run.status === 'pending' ? { ...run, status: 'aborted', endedAt: now } : run)),\n );\n };\n\n const recordResponse = (payload: QueryDevtoolsPayload) => {\n const now = Date.now();\n const received = measureQueryDevtoolsPayload(payload);\n const duration = lastExecutionAt === null ? null : now - lastExecutionAt;\n\n stats.update((current) => ({\n ...current,\n responses: current.responses + 1,\n receivedBytes: current.receivedBytes + received.bytes,\n hasEstimatedBytes: current.hasEstimatedBytes || (received.bytes > 0 && !received.isExact),\n lastResponseAt: now,\n lastDurationMs: duration,\n totalDurationMs: current.totalDurationMs + (duration ?? 0),\n lastResponseWasFaulted: false,\n }));\n\n endRun({\n endedAt: now,\n status: 'success',\n receivedBytes: received.bytes,\n response: payload.body,\n hasResponse: true,\n error: null,\n });\n };\n\n const recordError: QueryDevtoolsStatsRecorder['recordError'] = (options) => {\n const error = options?.error;\n\n stats.update((current) => ({\n ...current,\n errors: current.errors + 1,\n lastResponseWasFaulted: options?.faulted ?? false,\n }));\n\n endRun({\n endedAt: Date.now(),\n status: 'error',\n receivedBytes: 0,\n response: null,\n hasResponse: false,\n error: error\n ? {\n code: error.code,\n messages: queryErrorMessages(error),\n body: error.raw.error,\n hasBody: error.raw.error !== null && error.raw.error !== undefined,\n }\n : null,\n });\n };\n\n const recordRetry: QueryDevtoolsStatsRecorder['recordRetry'] = ({ attempt }) => {\n const current = runs();\n const pending = lastPendingRunIndex(current);\n const run = current[pending];\n\n // Nothing in flight means the retry belongs to a request this query is not the one waiting on, and an\n // attempt already accounted for is the caller reporting the same one twice.\n if (!run || attempt <= run.attempts) return;\n\n stats.update((state) => ({ ...state, retries: state.retries + (attempt - run.attempts) }));\n runs.set(current.map((entry, index) => (index === pending ? { ...entry, attempts: attempt } : entry)));\n };\n\n const reset = () => {\n lastExecutionAt = null;\n lastUrl = null;\n runCounter = 0;\n stats.set(EMPTY_STATS);\n runs.set([]);\n };\n\n return {\n current: stats.asReadonly(),\n runs: runs.asReadonly(),\n reset,\n recordExecution,\n recordResponse,\n recordError,\n recordRetry,\n };\n};\n\n/**\n * Adds up the stats of several entries, for a stack's or a client's total. `lastDurationMs` is taken from\n * whichever entry responded most recently rather than summed.\n */\nexport const sumQueryDevtoolsStats = (\n handles: readonly (QueryDevtoolsStatsHandle | undefined)[],\n): QueryDevtoolsStats => {\n const total = { ...EMPTY_STATS };\n\n for (const handle of handles) {\n if (!handle) continue;\n\n const stats = handle.current();\n\n total.executions += stats.executions;\n total.requests += stats.requests;\n total.responses += stats.responses;\n total.errors += stats.errors;\n total.retries += stats.retries;\n total.receivedBytes += stats.receivedBytes;\n total.sentBytes += stats.sentBytes;\n total.totalDurationMs += stats.totalDurationMs;\n total.hasEstimatedBytes = total.hasEstimatedBytes || stats.hasEstimatedBytes;\n\n if (\n stats.firstExecutedAt !== null &&\n (total.firstExecutedAt === null || stats.firstExecutedAt < total.firstExecutedAt)\n ) {\n total.firstExecutedAt = stats.firstExecutedAt;\n }\n\n if (\n stats.lastResponseAt !== null &&\n (total.lastResponseAt === null || stats.lastResponseAt > total.lastResponseAt)\n ) {\n total.lastResponseAt = stats.lastResponseAt;\n total.lastDurationMs = stats.lastDurationMs;\n }\n }\n\n return total;\n};\n","import { QueryDevtoolsEntry } from './query-devtools-hook';\n\n/**\n * How many destroyed queries the registry keeps. A tombstone holds the last response body it captured,\n * so the list is capped for the same reason the repository caps its unused entries.\n */\nexport const MAX_QUERY_DEVTOOLS_TOMBSTONES = 50;\n\nconst frozen =\n <T>(value: T) =>\n () =>\n value;\n\nconst noop = () => undefined;\n\n/**\n * Reads one signal off a handle that is being destroyed. A query whose injector is already gone can\n * throw here, and losing one field is better than losing the whole tombstone.\n */\nconst read = <T>(get: () => T, fallback: T): T => {\n try {\n return get();\n } catch {\n return fallback;\n }\n};\n\ntype LiveRequest = {\n method: string;\n url: string;\n args: unknown;\n loading: () => unknown;\n error: () => unknown;\n response: () => unknown;\n currentEvent: () => unknown;\n expiresAt: () => number | null;\n subtle: {\n retryState: () => unknown;\n attempts: () => number;\n lastDurationMs: () => number | null;\n resolveHeaders: () => unknown;\n lastPersistedResponseAt: () => number | null;\n lastExternalResponseAt: () => number | null;\n };\n};\n\ntype LiveQuery = {\n id: () => string | null;\n args: () => unknown;\n response: () => unknown;\n error: () => unknown;\n latestHttpEvent: () => unknown;\n loading: () => unknown;\n lastTimeExecutedAt: () => number | null;\n triggeredBy: () => string | null;\n executionState: () => unknown;\n subtle: { request: () => LiveRequest | null };\n};\n\n/**\n * A destroyed query's last state, shaped like the query itself: every signal the panel reads is\n * replaced by a function returning the value it held when the query went away, and every action is a\n * no-op. Rendering a tombstone therefore costs the panel no second code path - the drawer reads\n * `entry.handle` exactly as it does for a live query, and gates its actions on\n * {@link QueryDevtoolsEntry.destroyedAt} instead.\n *\n * The captured request is a plain copy, not the request itself: the real one is destroyed the moment\n * its cache entry is, and holding it would keep its subscriptions and its cache entry alive.\n */\nexport const snapshotQueryDevtoolsHandle = (handle: unknown): unknown => {\n const query = handle as LiveQuery | null;\n\n if (!query || typeof query !== 'object') return handle;\n\n const live = read(() => query.subtle?.request() ?? null, null);\n\n const request = live\n ? {\n method: live.method,\n url: live.url,\n args: live.args,\n execute: () => false,\n destroy: () => false,\n isStale: frozen(false),\n loading: frozen(null),\n error: read(() => frozen(live.error()), frozen(null)),\n response: read(() => frozen(live.response()), frozen(null)),\n currentEvent: read(() => frozen(live.currentEvent()), frozen(null)),\n expiresAt: read(() => frozen(live.expiresAt()), frozen(null)),\n subtle: {\n retryState: frozen(null),\n attempts: read(() => frozen(live.subtle.attempts()), frozen(1)),\n lastDurationMs: read(() => frozen(live.subtle.lastDurationMs()), frozen(null)),\n resolveHeaders: read(() => frozen(live.subtle.resolveHeaders()), frozen(undefined)),\n lastPersistedResponseAt: read(() => frozen(live.subtle.lastPersistedResponseAt()), frozen(null)),\n lastExternalResponseAt: read(() => frozen(live.subtle.lastExternalResponseAt()), frozen(null)),\n },\n }\n : null;\n\n return {\n id: read(() => frozen(query.id()), frozen(null)),\n args: read(() => frozen(query.args()), frozen(null)),\n response: read(() => frozen(query.response()), frozen(null)),\n error: read(() => frozen(query.error()), frozen(null)),\n latestHttpEvent: read(() => frozen(query.latestHttpEvent()), frozen(null)),\n lastTimeExecutedAt: read(() => frozen(query.lastTimeExecutedAt()), frozen(null)),\n triggeredBy: read(() => frozen(query.triggeredBy()), frozen(null)),\n executionState: read(() => frozen(query.executionState()), frozen(null)),\n // A tombstone never loads: a forced loading state captured mid-flight would spin forever.\n loading: frozen(null),\n execute: () => false,\n reset: noop,\n subtle: {\n request: frozen(request),\n destroy: noop,\n setResponse: noop,\n setLoading: noop,\n setError: noop,\n },\n };\n};\n\n/**\n * The entry a destroyed query leaves behind: the same id, kind and metadata, a frozen\n * {@link snapshotQueryDevtoolsHandle} in place of the live query, and no `element` - a DOM node whose\n * component is gone must not be kept alive by the panel.\n *\n * `stats` is carried over as-is. The recorder closes over its own signals rather than over the query,\n * so the run history that makes a failed request readable survives without retaining anything.\n */\nexport const tombstoneOf = (entry: QueryDevtoolsEntry, destroyedAt: number): QueryDevtoolsEntry => {\n const { element: _element, ...meta } = entry.meta;\n\n return {\n id: entry.id,\n kind: entry.kind,\n meta,\n handle: snapshotQueryDevtoolsHandle(entry.handle),\n createdAt: entry.createdAt,\n destroyedAt,\n stats: entry.stats,\n };\n};\n","import { EnvironmentProviders, isDevMode, makeEnvironmentProviders, Signal, signal } from '@angular/core';\nimport { AnyCreateQueryClientResult } from '../http/query-client';\nimport {\n QueryDevtoolsEntry,\n QueryDevtoolsRegistration,\n QueryDevtoolsRoutePart,\n setQueryDevtoolsFaultResolver,\n setQueryDevtoolsFormLinksFactory,\n setQueryDevtoolsOverridesFactory,\n setQueryDevtoolsRegistrar,\n setQueryDevtoolsStatsFactory,\n} from './query-devtools-hook';\nimport { resolveQueryDevtoolsFaultForAttempt } from './query-devtools-faults';\nimport { createQueryDevtoolsFormLinks } from './query-devtools-form-links';\nimport { createQueryDevtoolsOverrides } from './query-devtools-overrides';\nimport { createQueryDevtoolsStats, setQueryDevtoolsResponseHistory } from './query-devtools-stats';\nimport { MAX_QUERY_DEVTOOLS_TOMBSTONES, tombstoneOf } from './query-devtools-tombstone';\n\nconst entries = /* @__PURE__ */ signal<QueryDevtoolsEntry[]>([]);\n\n/**\n * The reactive list of every registered devtools entry, consumed by the `<et-query-devtools>` UI.\n */\nexport const queryDevtoolsEntries: Signal<QueryDevtoolsEntry[]> = /* @__PURE__ */ entries.asReadonly();\n\n// Per-descriptor counter used to derive stable, reload-deterministic ids. Reset on page load (module\n// re-eval), so the same queries created in the same order get the same ids across reloads - which is\n// what lets the devtools restore the selected query after a reload.\nconst idCounters = /* @__PURE__ */ new Map<string, number>();\n\nconst descriptorOf = (entry: Pick<QueryDevtoolsEntry, 'kind' | 'meta'>) => {\n const { kind, meta } = entry;\n\n if (kind === 'query') return `query|${meta.clientName ?? ''}|${meta.method ?? ''}|${meta.route ?? ''}`;\n if (kind === 'auth-provider') return `auth-provider|${meta.name ?? ''}`;\n if (kind === 'ws-client') return `ws-client|${meta.name ?? ''}`;\n if (kind === 'query-form') return `query-form|${meta.name ?? ''}`;\n\n return kind;\n};\n\n/**\n * Wraps a path param name where a route function interpolated it. A NUL cannot occur in a route, so\n * a marked-up route stays unambiguously parseable.\n */\nconst PARAM_MARKER = '\\u0000';\n\n/**\n * Stands in for the path params object a route function expects, recording every param it reads as\n * `\\0<name>\\0` in the returned route. A route that transforms what it reads (`p.id.slice(2)`) still\n * yields a usable route - the recorded name is transformed along with it.\n */\nconst paramRecorder = () =>\n new Proxy(\n {},\n {\n get: (_, prop) => (typeof prop === 'string' ? `${PARAM_MARKER}${prop}${PARAM_MARKER}` : undefined),\n },\n );\n\n/** Splits a recorded route into its literal chunks and the path params interleaved between them. */\nconst parseRecordedRoute = (recorded: string): QueryDevtoolsRoutePart[] =>\n recorded\n .split(PARAM_MARKER)\n // Markers are balanced, so every odd chunk is a param name and every even one is literal text.\n .map((text, index): QueryDevtoolsRoutePart => ({ text, param: index % 2 === 1 ? text : null }))\n .filter((part) => part.text !== '');\n\n/**\n * Parses a query creator route into its literal and path-param parts, so the devtools can show which\n * segments of a route are dynamic and fill them in with the values a query actually used.\n * @internal\n */\nexport const parseQueryRoute = (route: unknown): QueryDevtoolsRoutePart[] => {\n if (route === undefined || route === null) return [];\n\n try {\n if (typeof route === 'function') {\n return parseRecordedRoute((route as (args: unknown) => string)(paramRecorder()));\n }\n\n return [{ text: String(route), param: null }];\n } catch {\n return [{ text: typeof route === 'function' ? '(dynamic route)' : String(route), param: null }];\n }\n};\n\n/** Renders parsed route parts as a template, e.g. `/team/:teamId/players`. */\nexport const stringifyQueryRouteParts = (parts: QueryDevtoolsRoutePart[]) =>\n parts.map((part) => (part.param ? `:${part.param}` : part.text)).join('');\n\n/**\n * Extracts the human readable client name from a query client tuple. The client's DI token is named\n * `QueryClient_<name>`, so we strip the prefix to recover the original name.\n * @internal\n */\nexport const getQueryClientName = (client: AnyCreateQueryClientResult) => {\n const token = client.token;\n const desc = token?.toString?.() ?? '';\n\n return desc.replace('InjectionToken ', '').replace('QueryClient_', '') || 'unknown';\n};\n\n/**\n * The provider name behind a bearer auth provider definition, recovered from its DI token the way\n * {@link getQueryClientName} recovers a client's.\n * @internal\n */\nexport const getBearerAuthProviderName = (ref: { token?: unknown }) => {\n const desc = String(ref.token ?? '');\n\n return desc.replace('InjectionToken ', '').replace('BearerAuthProvider_', '') || 'unknown';\n};\n\n/**\n * Ids are derived deterministically from a stable descriptor + a per-descriptor sequence number, so\n * they survive a page reload (letting the UI restore the selected entry) instead of being random.\n */\nconst registerEntry = (registration: QueryDevtoolsRegistration): (() => void) => {\n const meta = { ...registration.meta };\n\n if (registration.route !== undefined) {\n meta.routeParts = parseQueryRoute(registration.route);\n meta.route = stringifyQueryRouteParts(meta.routeParts);\n }\n\n if (registration.clientRef) meta.clientName = getQueryClientName(registration.clientRef);\n\n if (registration.authProviderRef) {\n meta.isSecure = true;\n meta.authProviderName = getBearerAuthProviderName(registration.authProviderRef);\n }\n\n if (registration.authQueries) {\n meta.authQueries = registration.authQueries.map((authQuery) => ({\n ...authQuery,\n route: stringifyQueryRouteParts(parseQueryRoute(authQuery.route)),\n }));\n }\n\n let id = registration.id;\n\n if (!id) {\n const descriptor = descriptorOf({ kind: registration.kind, meta });\n const seq = idCounters.get(descriptor) ?? 0;\n idCounters.set(descriptor, seq + 1);\n id = `${descriptor}#${seq}`;\n }\n\n const fullEntry: QueryDevtoolsEntry = {\n id,\n kind: registration.kind,\n handle: registration.handle,\n meta,\n createdAt: Date.now(),\n stats: registration.stats,\n formLinks: registration.formLinks,\n overrides: registration.overrides,\n };\n\n // A registration that brings its own id can repeat one a tombstone still holds; the live entry wins.\n entries.update((list) => [...list.filter((e) => !(e.id === id && e.destroyedAt)), fullEntry]);\n\n return () =>\n entries.update((list) => {\n const index = list.findIndex((e) => e.id === fullEntry.id);\n\n if (index === -1) return list;\n\n const next = list.slice();\n\n // Only queries leave a tombstone. A stack, sequence, form or auth provider is a container whose\n // interesting state is the queries it owns - each of which tombstones on its own.\n if (fullEntry.kind !== 'query') {\n next.splice(index, 1);\n\n return next;\n }\n\n next[index] = tombstoneOf(fullEntry, Date.now());\n\n return capTombstones(next);\n });\n};\n\n/** Drops the oldest tombstones once there are more than {@link MAX_QUERY_DEVTOOLS_TOMBSTONES} of them. */\nconst capTombstones = (list: QueryDevtoolsEntry[]) => {\n const excess = list.filter((e) => e.destroyedAt).length - MAX_QUERY_DEVTOOLS_TOMBSTONES;\n\n if (excess <= 0) return list;\n\n const doomed = new Set(\n list\n .filter((e) => e.destroyedAt)\n .sort((a, b) => (a.destroyedAt ?? 0) - (b.destroyedAt ?? 0))\n .slice(0, excess),\n );\n\n return list.filter((e) => !doomed.has(e));\n};\n\n/**\n * Forgets destroyed entries the registry is holding - the panel's \"clear gone\" action. Pass the ids to\n * drop to forget only those; with no argument every tombstone goes. Live entries are untouched.\n */\nexport const clearQueryDevtoolsTombstones = (ids?: Iterable<string>) => {\n const doomed = ids ? new Set(ids) : null;\n\n entries.update((list) => list.filter((e) => !e.destroyedAt || (doomed ? !doomed.has(e.id) : false)));\n};\n\nexport type QueryDevtoolsOptions = {\n /**\n * How many of each query's most recent runs keep their response (or error) body, which is what the\n * panel's response diff compares. Defaults to `5`. Bodies dominate what the run buffer retains, so\n * raise this only as far as the reach you actually need - a polling query holds one per run.\n */\n responseHistory?: number;\n};\n\n/**\n * Enables the `@ethlete/query` devtools. Add this to your application providers (e.g. in\n * `bootstrapApplication`) to make query clients, queries, stacks, sequences and auth providers\n * appear in the `<et-query-devtools>` panel.\n *\n * When omitted, all devtools instrumentation is a no-op: the registry is never installed, so nothing\n * is retained at runtime and the registry itself is dropped from the bundle.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideQueryDevtools()],\n * });\n * ```\n */\nexport const provideQueryDevtools = (options?: QueryDevtoolsOptions): EnvironmentProviders => {\n setQueryDevtoolsResponseHistory(options?.responseHistory);\n setQueryDevtoolsRegistrar(registerEntry);\n setQueryDevtoolsStatsFactory(createQueryDevtoolsStats);\n setQueryDevtoolsFormLinksFactory(createQueryDevtoolsFormLinks);\n setQueryDevtoolsOverridesFactory(createQueryDevtoolsOverrides);\n setQueryDevtoolsFaultResolver(resolveQueryDevtoolsFaultForAttempt);\n\n if (!isDevMode()) {\n console.warn(\n 'You are using the Query Devtools in production mode. This increases the size of your bundle and should only be used for development purposes.',\n );\n }\n\n return makeEnvironmentProviders([]);\n};\n","import { isDevMode } from '@angular/core';\n\nconst getOpName = /(query|mutation) ?([\\w\\d-_]+)? ?\\(.*?\\)? \\{/;\n\nexport type TransformedGqlQuery = {\n query: string;\n variables?: string;\n operationName?: string;\n};\n\nexport type GqlTransformer = (variables: Record<string, unknown> | null | undefined) => TransformedGqlQuery;\n\nexport const transformGql = (str: string | string[]): GqlTransformer => {\n const normalizedStr = Array.isArray(str) ? str.join('') : str;\n\n const name = getOpName.exec(normalizedStr);\n\n return (variables: Record<string, unknown> | null | undefined): TransformedGqlQuery => {\n const data: TransformedGqlQuery = { query: normalizedStr };\n\n if (variables) {\n data['variables'] = JSON.stringify(variables);\n }\n\n if (name && name.length) {\n const operationName = name[2];\n if (operationName) {\n data['operationName'] = operationName;\n }\n }\n\n if (!isDevMode()) {\n // minify the query\n data.query = data.query.replace(/\\s+/g, ' ').trim();\n }\n\n return data;\n };\n};\n\nexport type GQL = string & { readonly __gql: unique symbol };\n\nexport const gql = (strings: TemplateStringsArray, ...values: unknown[]): GQL => {\n const str = strings.reduce((acc, cur, i) => {\n return acc + cur + (values[i] ?? '');\n }, '');\n return str as GQL;\n};\n","import {\n circularQueryDependencyChecker,\n CreateQueryExecuteOptions,\n InternalQueryExecute,\n QueryArgs,\n QueryConfig,\n QueryDependencies,\n queryExecute,\n QueryExecuteArgs,\n QueryState,\n RequestArgs,\n resetExecuteState,\n RouteType,\n setupQueryExecuteState,\n} from '../http';\nimport { GqlQueryArgs } from './gql-query';\nimport { AnyCreateGqlQueryCreatorOptions, InternalCreateGqlQueryCreatorOptions } from './gql-query-creator';\nimport { transformGql } from './gql-transformer';\n\nexport type CreateGqlQueryExecuteOptions<TArgs extends QueryArgs> = {\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n creator?: AnyCreateGqlQueryCreatorOptions;\n creatorInternals: InternalCreateGqlQueryCreatorOptions;\n queryConfig: QueryConfig;\n};\n\nexport const createGqlExecuteFn = <TArgs extends GqlQueryArgs>(\n executeOptions: CreateGqlQueryExecuteOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const executeState = setupQueryExecuteState();\n const circularChecker = circularQueryDependencyChecker();\n\n const reset = () => resetExecuteState({ executeState, executeOptions });\n\n const exec = (executeArgs?: QueryExecuteArgs<TArgs>) => {\n circularChecker.check();\n\n const { args = executeOptions.state.args(), options } = executeArgs ?? {};\n\n const query = transformGql(executeOptions.creatorInternals.query);\n let gqlParams = query(args?.variables);\n\n if (args?.queryParams && executeOptions.creatorInternals.transport === 'GET') {\n gqlParams = { ...gqlParams, ...args.queryParams };\n }\n\n const computedArgs = args ?? ({} as RequestArgs<TArgs>);\n\n if (executeOptions.creatorInternals.transport === 'GET') {\n computedArgs.queryParams = gqlParams;\n } else {\n computedArgs.body = gqlParams;\n }\n\n const normalizedOpts: CreateQueryExecuteOptions<TArgs> = {\n creator: {\n ...(executeOptions.creator ?? {}),\n subtle: {\n ...(executeOptions.creator?.subtle ?? {}),\n useQueryRepositoryCache:\n executeOptions.creator?.subtle?.useQueryRepositoryCache ??\n executeOptions.creatorInternals.method === 'QUERY',\n },\n },\n creatorInternals: {\n client: executeOptions.creatorInternals.client,\n method: executeOptions.creatorInternals.transport,\n route: (executeOptions.creator?.route ?? '') as RouteType<TArgs>,\n },\n deps: executeOptions.deps,\n queryConfig: executeOptions.queryConfig,\n state: executeOptions.state,\n };\n\n queryExecute({\n executeOptions: normalizedOpts,\n executeState,\n args: computedArgs,\n options,\n isRefreshable: executeOptions.creatorInternals.method === 'QUERY',\n });\n };\n\n exec['reset'] = reset;\n\n exec['currentRepositoryKey'] = executeState.previousKey.asReadonly();\n\n return exec;\n};\n","import { createBaseQuery, CreateQueryOptions, QueryArgs } from '../http';\nimport { CreateGqlQueryCreatorOptions, InternalCreateGqlQueryCreatorOptions } from './gql-query-creator';\nimport { createGqlExecuteFn } from './gql-query-execute';\n\nexport type GqlQueryArgs<TResponse = unknown> = QueryArgs & {\n response: TResponse;\n rawResponse?: { data: TResponse };\n variables?: Record<string, unknown>;\n};\n\nexport type CreateGqlQueryOptions<TArgs extends GqlQueryArgs> = Omit<\n CreateQueryOptions<TArgs>,\n 'creator' | 'creatorInternals'\n> & {\n creator?: CreateGqlQueryCreatorOptions<TArgs>;\n creatorInternals: InternalCreateGqlQueryCreatorOptions;\n};\n\nexport type GqlVariablesType<T extends GqlQueryArgs | null> = T extends GqlQueryArgs ? T['variables'] : never;\n\nexport { isCreateGqlQueryOptions } from '../http/internal/gql-options-guard';\n\nexport const createGqlQuery = <TArgs extends GqlQueryArgs>(options: CreateGqlQueryOptions<TArgs>) =>\n createBaseQuery({\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n features: options.features,\n queryConfig: options.queryConfig,\n executeFactory: createGqlExecuteFn,\n });\n","import {\n AnyCreateQueryClientResult,\n createBaseQueryCreator,\n CreateQueryCreatorOptions,\n gqlDataPropertyMissingInResponse,\n QueryCreator,\n RouteType,\n} from '../http';\nimport { createGqlQuery, GqlQueryArgs } from './gql-query';\n\nexport type CreateGqlQueryCreatorOptions<TArgs extends GqlQueryArgs> = Omit<\n CreateQueryCreatorOptions<TArgs>,\n 'route' | 'transformResponse'\n> & {\n route?: RouteType<TArgs>;\n\n /**\n * Optional custom transform function for GQL responses.\n * If not provided, the default { data: ... } unwrapping will be used.\n */\n transformResponse?: CreateQueryCreatorOptions<TArgs>['transformResponse'];\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyCreateGqlQueryCreatorOptions = CreateGqlQueryCreatorOptions<any>;\n\nexport type GqlQueryMethod = 'QUERY' | 'MUTATE';\nexport type GqlQueryTransport = 'GET' | 'POST';\n\nexport type InternalCreateGqlQueryCreatorOptions = {\n method: GqlQueryMethod;\n transport: GqlQueryTransport;\n client: AnyCreateQueryClientResult;\n query: string;\n};\n\nexport const createGqlQueryCreator = <TArgs extends GqlQueryArgs>(\n options: CreateGqlQueryCreatorOptions<TArgs> | undefined,\n internals: InternalCreateGqlQueryCreatorOptions,\n): QueryCreator<TArgs> =>\n createBaseQueryCreator({\n options: {\n ...options,\n // Use custom transformResponse if provided, otherwise use default GQL unwrapping\n transformResponse:\n options?.transformResponse ??\n ((rawResponse: unknown) => {\n if (rawResponse && typeof rawResponse === 'object' && 'data' in rawResponse) {\n return (rawResponse as { data: unknown }).data;\n }\n\n throw gqlDataPropertyMissingInResponse();\n }),\n } as CreateQueryCreatorOptions<TArgs>,\n internals,\n queryFactory: createGqlQuery,\n });\n","import {\n CreateQueryExecuteOptions,\n InternalQueryExecute,\n QueryConfig,\n QueryDependencies,\n queryExecute,\n QueryState,\n RequestArgs,\n RouteType,\n shouldAutoExecuteGqlQuery,\n} from '../http';\nimport { createSecureExecuteFactory } from '../http/secure-query-execute-factory';\nimport { GqlQueryArgs } from './gql-query';\nimport { AnyCreateGqlQueryCreatorOptions } from './gql-query-creator';\nimport { transformGql } from './gql-transformer';\nimport { InternalSecureCreateGqlQueryCreatorOptions } from './secure-gql-query-creator';\n\nexport type CreateSecureGqlQueryExecuteOptions<TArgs extends GqlQueryArgs> = {\n deps: QueryDependencies;\n state: QueryState<TArgs>;\n creator?: AnyCreateGqlQueryCreatorOptions;\n creatorInternals: InternalSecureCreateGqlQueryCreatorOptions;\n queryConfig: QueryConfig;\n};\n\nexport const createSecureGqlExecuteFn = <TArgs extends GqlQueryArgs>(\n executeOptions: CreateSecureGqlQueryExecuteOptions<TArgs>,\n): InternalQueryExecute<TArgs> => {\n const authProvider = executeOptions.creatorInternals.authProvider.inject();\n\n return createSecureExecuteFactory({\n authProvider,\n deps: executeOptions.deps,\n state: executeOptions.state,\n autoExecutes:\n shouldAutoExecuteGqlQuery(executeOptions.creatorInternals.method) &&\n !executeOptions.queryConfig.onlyManualExecution,\n transformAuthAndExec: (executeArgs, _tokens, headers, executeState) => {\n const { args, options: runOptions } = executeArgs ?? {};\n\n const query = transformGql(executeOptions.creatorInternals.query);\n let gqlParams = query(args?.variables);\n\n if (args?.queryParams && executeOptions.creatorInternals.transport === 'GET') {\n gqlParams = { ...gqlParams, ...args.queryParams };\n }\n\n const computedArgs = { ...(args ?? ({} as RequestArgs<TArgs>)), headers };\n\n if (executeOptions.creatorInternals.transport === 'GET') {\n computedArgs.queryParams = gqlParams;\n } else {\n computedArgs.body = gqlParams;\n }\n\n const normalizedOpts: CreateQueryExecuteOptions<TArgs> = {\n ...executeOptions,\n creatorInternals: {\n client: executeOptions.creatorInternals.client,\n method: executeOptions.creatorInternals.method === 'QUERY' ? 'GET' : 'POST',\n route: (executeOptions.creator?.route ?? '') as RouteType<TArgs>,\n },\n };\n\n queryExecute({\n executeOptions: normalizedOpts,\n executeState,\n args: computedArgs,\n options: runOptions,\n isSecure: true,\n });\n },\n });\n};\n","import { createBaseQuery, CreateQueryOptions } from '../http';\nimport { GqlQueryArgs } from './gql-query';\nimport { InternalSecureCreateGqlQueryCreatorOptions } from './secure-gql-query-creator';\nimport { createSecureGqlExecuteFn } from './secure-gql-query-execute';\n\nexport type CreateSecureGqlQueryOptions<TArgs extends GqlQueryArgs> = Omit<\n CreateQueryOptions<TArgs>,\n 'creatorInternals'\n> & {\n creatorInternals: InternalSecureCreateGqlQueryCreatorOptions;\n};\n\nexport const createSecureGqlQuery = <TArgs extends GqlQueryArgs>(options: CreateSecureGqlQueryOptions<TArgs>) =>\n createBaseQuery({\n creator: options.creator,\n creatorInternals: options.creatorInternals,\n features: options.features,\n queryConfig: options.queryConfig,\n executeFactory: createSecureGqlExecuteFn,\n });\n","import { AnyCreateBearerAuthProviderResult } from '../auth';\nimport { AnyCreateQueryClientResult, createBaseQueryCreator, QueryCreator } from '../http';\nimport { GqlQueryArgs } from './gql-query';\nimport { CreateGqlQueryCreatorOptions } from './gql-query-creator';\nimport { createSecureGqlQuery } from './secure-gql-query';\n\nexport type InternalSecureCreateGqlQueryCreatorOptions = {\n method: 'QUERY' | 'MUTATE';\n transport: 'GET' | 'POST';\n client: AnyCreateQueryClientResult;\n query: string;\n authProvider: AnyCreateBearerAuthProviderResult;\n};\n\nexport const createSecureGqlQueryCreator = <TArgs extends GqlQueryArgs>(\n options: CreateGqlQueryCreatorOptions<TArgs> | undefined,\n internals: InternalSecureCreateGqlQueryCreatorOptions,\n): QueryCreator<TArgs> =>\n createBaseQueryCreator({\n options: {\n ...options,\n // Use custom transformResponse if provided, otherwise use default GQL unwrapping\n transformResponse:\n options?.transformResponse ??\n ((rawResponse: unknown) => {\n if (rawResponse && typeof rawResponse === 'object' && 'data' in rawResponse) {\n return (rawResponse as { data: unknown }).data;\n }\n return rawResponse;\n }),\n },\n internals,\n queryFactory: createSecureGqlQuery,\n });\n","import { AnyCreateBearerAuthProviderResult } from '../auth';\nimport { AnyCreateQueryClientResult } from '../http';\nimport { GqlQueryArgs } from './gql-query';\nimport {\n createGqlQueryCreator,\n CreateGqlQueryCreatorOptions,\n GqlQueryMethod,\n GqlQueryTransport,\n} from './gql-query-creator';\nimport { GQL } from './gql-transformer';\nimport { createSecureGqlQueryCreator } from './secure-gql-query-creator';\n\nconst createGqlCreatorTemplate = (method: GqlQueryMethod, transport: GqlQueryTransport) => {\n return (client: AnyCreateQueryClientResult) => {\n return <TArgs extends GqlQueryArgs>(query: GQL, creatorOptions?: CreateGqlQueryCreatorOptions<TArgs>) =>\n createGqlQueryCreator<TArgs>(creatorOptions, {\n method,\n client,\n transport,\n query,\n });\n };\n};\n\nconst createSecureGqlCreatorTemplate = (method: GqlQueryMethod, transport: GqlQueryTransport) => {\n return (client: AnyCreateQueryClientResult, authProvider: AnyCreateBearerAuthProviderResult) => {\n return <TArgs extends GqlQueryArgs>(query: GQL, creatorOptions?: CreateGqlQueryCreatorOptions<TArgs>) =>\n createSecureGqlQueryCreator<TArgs>(creatorOptions, {\n method,\n client,\n transport,\n query,\n authProvider,\n });\n };\n};\n\n/** A query creator that creates a GQL query where the payload is sent via GET (query params) */\nexport const createGqlQueryViaGet = /* @__PURE__ */ createGqlCreatorTemplate('QUERY', 'GET');\n\n/** A query creator that creates a secure GQL query where the payload is sent via GET (query params) */\nexport const createSecureGqlQueryViaGet = /* @__PURE__ */ createSecureGqlCreatorTemplate('QUERY', 'GET');\n\n/** A query creator that creates a GQL query where the payload is sent via POST (body) */\nexport const createGqlQueryViaPost = /* @__PURE__ */ createGqlCreatorTemplate('QUERY', 'POST');\n\n/** A query creator that creates a secure GQL query where the payload is sent via POST (body) */\nexport const createSecureGqlQueryViaPost = /* @__PURE__ */ createSecureGqlCreatorTemplate('QUERY', 'POST');\n\n/** A query creator that creates a GQL mutation where the payload is sent via GET (query params) */\nexport const createGqlMutationViaGet = /* @__PURE__ */ createGqlCreatorTemplate('MUTATE', 'GET');\n\n/** A query creator that creates a secure GQL mutation where the payload is sent via GET (query params) */\nexport const createSecureGqlMutationViaGet = /* @__PURE__ */ createSecureGqlCreatorTemplate('MUTATE', 'GET');\n\n/** A query creator that creates a GQL mutation where the payload is sent via POST (body) */\nexport const createGqlMutationViaPost = /* @__PURE__ */ createGqlCreatorTemplate('MUTATE', 'POST');\n\n/** A query creator that creates a secure GQL mutation where the payload is sent via POST (body) */\nexport const createSecureGqlMutationViaPost = /* @__PURE__ */ createSecureGqlCreatorTemplate('MUTATE', 'POST');\n","import { AuthProvider, AuthProviderCustomHeaderConfig } from './auth-provider.types';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class CustomHeaderAuthProvider implements AuthProvider {\n constructor(public _config: AuthProviderCustomHeaderConfig) {}\n get header() {\n return { [this._config.name]: this._config.value };\n }\n\n cleanUp() {\n // noop\n }\n}\n","import { AuthProvider, AuthProviderBasicConfig } from './auth-provider.types';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class BasicAuthProvider implements AuthProvider {\n constructor(public _config: AuthProviderBasicConfig) {}\n get header() {\n return { Authorization: `Basic ${this.basicAuthString}` };\n }\n\n cleanUp() {\n // noop\n }\n\n private get basicAuthString() {\n return btoa(`${this._config.username}:${this._config.password}`);\n }\n}\n","import { isSymfonyPagerfantaOutOfRangeError } from '../../http/query-error-response-utils';\nimport { Method, RequestError, RequestHeaders, RequestRetryFn } from './request.types';\n\nexport {\n buildQueryString,\n buildRoute,\n buildTimestampFromSeconds,\n isEmptyString,\n isNaN,\n} from '../../http/internal/request-route';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isRequestError = <T = unknown>(error: unknown): error is RequestError<T> =>\n error instanceof Object && 'status' in error && 'statusText' in error && 'url' in error;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const v2ExtractExpiresInSeconds = (headers: RequestHeaders) => {\n const cacheControl = headers['cache-control'];\n const age = headers['age'];\n const expires = headers['expires'];\n\n // In seconds\n let expiresIn: number | null = null;\n let maxAge: number | null = null;\n\n if (cacheControl?.includes('no-cache')) {\n return null;\n }\n\n if (cacheControl?.includes('max-age')) {\n const m = cacheControl.split('max-age=')[1];\n\n if (m) {\n maxAge = parseInt(m);\n }\n } else if (cacheControl?.includes('s-maxage')) {\n const m = cacheControl.split('s-maxage=')[1];\n\n if (m) {\n maxAge = parseInt(m);\n }\n }\n\n if (maxAge && age) {\n const ageSeconds = parseInt(age);\n\n expiresIn = maxAge - ageSeconds;\n } else if (maxAge) {\n expiresIn = maxAge / 2; // We assume the response is half way to its expiration\n } else if (expires) {\n // Used by some apis to tell the response will never expire\n // In this case we let the response expire after 1 hour\n if (expires === '-1') {\n expiresIn = 3600;\n } else {\n const expiresDate = new Date(expires);\n\n // check if the date is valid\n if (expiresDate.toString() !== 'Invalid Date') {\n expiresIn = Math.floor((expiresDate.getTime() - Date.now()) / 1000);\n }\n }\n }\n\n return expiresIn;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const serializeBody = (body: unknown): ArrayBuffer | URLSearchParams | Blob | FormData | string | null => {\n if (body === null || body === undefined) {\n return null;\n }\n\n if (\n body instanceof ArrayBuffer ||\n body instanceof Blob ||\n body instanceof FormData ||\n body instanceof URLSearchParams ||\n typeof body === 'string'\n ) {\n return body as ArrayBuffer | URLSearchParams | Blob | FormData | string;\n }\n\n if (typeof body === 'object' || typeof body === 'boolean' || Array.isArray(body)) {\n return JSON.stringify(body);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (body as any).toString();\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const transformMethod = (config: { method: Method; transferVia?: 'GET' | 'POST' }) => {\n if (config.method === 'GQL_QUERY' || config.method === 'GQL_MUTATE') {\n if (!config.transferVia) {\n return 'POST';\n }\n\n return config.transferVia;\n }\n\n return config.method;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const detectContentTypeHeader = (body: unknown) => {\n // An empty body has no content type.\n if (body === null) {\n return null;\n }\n // FormData bodies rely on the browser's content type assignment.\n if (body instanceof FormData) {\n return null;\n }\n // Blobs usually have their own content type. If it doesn't, then\n // no type can be inferred.\n if (body instanceof Blob) {\n return body.type || null;\n }\n // Array buffers have unknown contents and thus no type can be inferred.\n if (body instanceof ArrayBuffer) {\n return null;\n }\n // Technically, strings could be a form of JSON data, but it's safe enough\n // to assume they're plain strings.\n if (typeof body === 'string') {\n return 'text/plain';\n }\n\n // Arrays, objects, boolean and numbers will be encoded as JSON.\n if (typeof body === 'object' || typeof body === 'number' || typeof body === 'boolean') {\n return 'application/json';\n }\n // No type could be inferred.\n return null;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const hasHeader = (headers: RequestHeaders, header: string) => {\n return Object.keys(headers).some((key) => key.toLowerCase() === header.toLowerCase());\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const forEachHeader = (headers: RequestHeaders, callback: (value: string, key: string) => void) => {\n Object.entries(headers).forEach(([key, value]) => {\n callback(key, value);\n });\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const parseAllXhrResponseHeaders = (xhr: XMLHttpRequest) => {\n const headers = xhr.getAllResponseHeaders();\n const parsedHeaders: RequestHeaders = {};\n\n for (const line of headers.split('\\n')) {\n const index = line.indexOf(':');\n if (index > 0) {\n const name = line.slice(0, index);\n const key = name.toLowerCase();\n const value = line.slice(index + 1).trim();\n\n parsedHeaders[key] = value;\n }\n }\n\n return parsedHeaders;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const getResponseUrl = (xhr: XMLHttpRequest): string | null => {\n if ('responseURL' in xhr && xhr.responseURL) {\n return xhr.responseURL;\n }\n if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {\n return xhr.getResponseHeader('X-Request-URL');\n }\n return null;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const v2ShouldRetryRequest: RequestRetryFn = (config) => {\n const defaultRetryDelay = 1000 + 1000 * config.currentRetryCount;\n\n if (config.currentRetryCount > 3) {\n return { retry: false };\n }\n\n if (!isRequestError(config.error)) {\n return { retry: false };\n }\n\n const { status, detail } = config.error;\n\n // Retry on 5xx errors\n if (status >= 500) {\n // Don't retry if a requested page is out of range\n if (isSymfonyPagerfantaOutOfRangeError(detail)) {\n return { retry: false };\n }\n\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Retry on 408 or 425 errors\n if (status === 408 || status === 425) {\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Retry on 429 errors\n if (status === 429) {\n const retryAfter =\n config.headers['retry-after'] ||\n config.headers['Retry-After'] ||\n config.headers['x-retry-after'] ||\n config.headers['X-Retry-After'];\n\n if (retryAfter) {\n const delay = parseInt(retryAfter) * 1000;\n\n return { retry: true, delay: Number.isNaN(delay) ? defaultRetryDelay : delay };\n }\n\n return { retry: true, delay: defaultRetryDelay };\n }\n\n // Code 0 usually means the internet connection is down. We retry in this case.\n // It could also be a CORS issue but that should not be the case in production.\n if ((status as number) === 0) {\n return { retry: true, delay: defaultRetryDelay };\n }\n\n return { retry: false };\n};\n","import { HttpErrorResponse } from '@angular/common/http';\nimport { Observable, Observer } from 'rxjs';\nimport { PartialXhrState, RequestConfig, RequestError, RequestEvent } from './request.types';\nimport {\n buildTimestampFromSeconds,\n detectContentTypeHeader,\n forEachHeader,\n getResponseUrl,\n hasHeader,\n parseAllXhrResponseHeaders,\n serializeBody,\n v2ExtractExpiresInSeconds,\n v2ShouldRetryRequest,\n} from './request.util';\n\nconst XSSI_PREFIX = /^\\)\\]\\}',?\\n/;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const request = <Response = unknown>(config: RequestConfig): Observable<RequestEvent<Response>> => {\n const headers = config.headers || {};\n const responseType = config.responseType || 'json';\n const body = config.body || null;\n const url = config.urlWithParams.split('?')[0] || '';\n const retryFn = config.retryFn || v2ShouldRetryRequest;\n let currentRetryCount = 0;\n let retryTimeout: number | null = null;\n\n return new Observable((observer: Observer<RequestEvent<Response>>) => {\n const xhr = new XMLHttpRequest();\n const reqBody = serializeBody(body);\n\n const setupXhr = () => {\n xhr.open(config.method, config.urlWithParams);\n if (config.withCredentials) {\n xhr.withCredentials = true;\n }\n\n forEachHeader(headers, (name, value) => xhr.setRequestHeader(name, value));\n\n if (!hasHeader(headers, 'Accept')) {\n xhr.setRequestHeader('Accept', 'application/json, text/plain, */*');\n }\n\n if (!hasHeader(headers, 'Content-Type')) {\n const detectedType = detectContentTypeHeader(body);\n\n if (detectedType) {\n xhr.setRequestHeader('Content-Type', detectedType);\n }\n }\n\n xhr.responseType = responseType !== 'json' ? responseType : 'text';\n };\n\n setupXhr();\n\n const partialFromXhr = (): PartialXhrState => {\n const statusText = xhr.statusText || 'OK';\n const headers = parseAllXhrResponseHeaders(xhr);\n const _url = getResponseUrl(xhr) || url;\n\n return { headers, status: xhr.status, statusText, url: _url };\n };\n\n const handleRetry = (error: RequestError) => {\n const newRetryCount = currentRetryCount + 1;\n const { headers } = partialFromXhr();\n const { retry, delay } = retryFn({ currentRetryCount: newRetryCount, headers, error });\n\n if (!retry) {\n observer.next({ type: 'failure', headers, error });\n observer.complete();\n\n return;\n }\n\n const _delay = delay ?? 1000;\n observer.next({ type: 'delay-retry', headers, retryNumber: newRetryCount, retryDelay: _delay });\n\n retryTimeout = window.setTimeout(() => {\n setupXhr();\n xhr.send(reqBody);\n currentRetryCount = newRetryCount;\n observer.next({ type: 'start', headers, isRetry: true, retryNumber: currentRetryCount, retryDelay: _delay });\n }, _delay);\n };\n\n const onLoad = async () => {\n const { headers, statusText, url } = partialFromXhr();\n\n let { status } = partialFromXhr();\n\n let body: unknown | null = null;\n\n if (status !== 204) {\n body = typeof xhr.response === 'undefined' ? xhr.responseText : xhr.response;\n }\n\n if (status === 0) {\n status = body ? 200 : 0;\n }\n\n let ok = status >= 200 && status < 300;\n\n if (responseType === 'json' && typeof body === 'string') {\n const originalBody = body;\n body = body.replace(XSSI_PREFIX, '');\n try {\n body = body !== '' ? JSON.parse(body as string) : null;\n } catch (error) {\n body = originalBody;\n\n if (ok) {\n ok = false;\n body = { error, text: body };\n }\n }\n } else if (!ok && body instanceof Blob) {\n try {\n const text = await body.text();\n\n if (body.type === 'application/json') {\n body = JSON.parse(text);\n } else {\n body = text;\n }\n } catch {\n // Ignore the error.\n }\n }\n\n if (ok) {\n const successEvent: RequestEvent<Response> = {\n type: 'success',\n headers,\n response: body as Response,\n };\n\n const expiresInSeconds = config.cacheAdapter?.(headers) ?? v2ExtractExpiresInSeconds(headers);\n const expiresInTimestamp = buildTimestampFromSeconds(expiresInSeconds);\n\n if (expiresInTimestamp) {\n successEvent.expiresInTimestamp = expiresInTimestamp;\n }\n\n observer.next(successEvent);\n\n observer.complete();\n } else {\n handleRetry({\n url,\n detail: body,\n status,\n statusText,\n httpErrorResponse: new HttpErrorResponse({\n error: body,\n status,\n statusText,\n url,\n }),\n });\n }\n };\n\n const onError = (error: Event) => {\n const { url } = partialFromXhr();\n\n handleRetry({\n url,\n detail: error,\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Unknown Error',\n httpErrorResponse: new HttpErrorResponse({\n error: error,\n status: xhr.status || 0,\n statusText: xhr.statusText || 'Unknown Error',\n url,\n }),\n });\n };\n\n const onDownProgress = (event: ProgressEvent) => {\n const { headers } = partialFromXhr();\n\n const progress: RequestEvent = {\n type: 'download-progress',\n headers,\n progress: {\n current: event.loaded,\n },\n };\n\n if (event.lengthComputable) {\n const progressPercent = (event.loaded / event.total) * 100;\n progress.progress.percentage = Math.round(progressPercent * 100) / 100;\n progress.progress.total = event.total;\n }\n\n if (responseType === 'text' && !!xhr.responseText) {\n progress.partialText = xhr.responseText;\n }\n\n observer.next(progress);\n };\n\n const onUpProgress = (event: ProgressEvent) => {\n const { headers } = partialFromXhr();\n\n const progress: RequestEvent = {\n type: 'upload-progress',\n headers,\n progress: {\n current: event.loaded,\n },\n };\n\n if (event.lengthComputable) {\n const progressPercent = (event.loaded / event.total) * 100;\n progress.progress.percentage = Math.round(progressPercent * 100) / 100;\n progress.progress.total = event.total;\n }\n\n observer.next(progress);\n };\n\n xhr.addEventListener('load', onLoad);\n xhr.addEventListener('error', onError);\n xhr.addEventListener('timeout', onError);\n xhr.addEventListener('abort', onError);\n\n if (config.reportProgress) {\n xhr.addEventListener('progress', onDownProgress);\n\n if (reqBody !== null && xhr.upload) {\n xhr.upload.addEventListener('progress', onUpProgress);\n }\n }\n\n xhr.send(reqBody);\n observer.next({ type: 'start', headers });\n\n return () => {\n xhr.removeEventListener('error', onError);\n xhr.removeEventListener('abort', onError);\n xhr.removeEventListener('load', onLoad);\n xhr.removeEventListener('timeout', onError);\n\n if (retryTimeout) {\n window.clearTimeout(retryTimeout);\n }\n\n if (config.reportProgress) {\n xhr.removeEventListener('progress', onDownProgress);\n\n if (reqBody !== null && xhr.upload) {\n xhr.upload.removeEventListener('progress', onUpProgress);\n }\n }\n\n if (xhr.readyState !== xhr.DONE) {\n xhr.abort();\n }\n\n observer.next({ type: 'cancel', headers });\n };\n });\n};\n","import {\n CreateComputedOptions,\n Injector,\n Signal,\n assertInInjectionContext,\n computed,\n effect,\n inject,\n linkedSignal,\n runInInjectionContext,\n signal,\n untracked,\n} from '@angular/core';\nimport { ToObservableOptions, ToSignalOptions, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { computedTillTruthy, createDestroy } from '@ethlete/core';\nimport { Observable, Subscribable, of, pairwise, startWith, switchMap, takeUntil, tap } from 'rxjs';\nimport { AnyLegacyQuery } from '../interop';\nimport {\n AnyQueryCollection,\n AnyV2Query,\n QueryOf,\n QueryStateType,\n V2QueryState,\n extractQuery,\n filterQueryStates,\n isQuery,\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStateSuccess,\n} from '../query';\nimport { QueryDataOf } from '../query-creator';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type QueryContainerConfig = {\n /**\n * If `true`, the previous query will be aborted when a new query is pushed into the container.\n * @default true // Only if the request can be cached (GET, OPTIONS, HEAD and GQL_QUERY). Otherwise false.\n */\n abortPrevious?: boolean;\n\n /**\n * If `true`, the query will be aborted when the container is destroyed.\n * @default true // Only if the request can be cached (GET, OPTIONS, HEAD and GQL_QUERY). Otherwise false.\n */\n abortOnDestroy?: boolean;\n\n /**\n * If `true`, the previous polling will be stopped when a new query is pushed into the container.\n * @default true // Only if the query has no other dependents and the request can be cached (GET, OPTIONS, HEAD and GQL_QUERY). Otherwise false.\n */\n stopPreviousPolling?: boolean;\n\n /**\n * The injector owning the container. Defaults to the current injection context; pass one to build a\n * container outside of it - the container's lifecycle then follows that injector.\n */\n injector?: Injector;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type QueryFilterConfig = {\n /**\n * If `true`, the response will be cached until the next response is received or the query fails.\n * @default false\n */\n cacheResponse?: boolean;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const addQueryContainerHandling = (\n obs: Observable<AnyV2Query | AnyV2Query[] | AnyLegacyQuery | AnyLegacyQuery[] | null>,\n valueFn: () => AnyV2Query | AnyV2Query[] | AnyLegacyQuery | AnyLegacyQuery[] | null | undefined,\n config?: QueryContainerConfig,\n) => {\n if (!config?.injector) {\n assertInInjectionContext(addQueryContainerHandling);\n }\n\n const { abortPrevious, abortOnDestroy, stopPreviousPolling } = config ?? {};\n\n const injector = config?.injector ?? inject(Injector);\n const destroy$ = runInInjectionContext(injector, () => createDestroy());\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const tNode = (injector as any)._tNode;\n const componentId = tNode?.index ?? -1;\n\n obs\n .pipe(\n takeUntil(destroy$),\n startWith(null),\n pairwise(),\n tap(([prevQuery, currQuery]) => {\n const cleanQuery = (q: AnyV2Query | AnyLegacyQuery | null | undefined) => {\n if (!q?._hasDependents() && ((abortPrevious === undefined && q?.canBeCached) || abortPrevious)) {\n q?.abort();\n }\n\n if (\n !q?._hasDependents() &&\n ((stopPreviousPolling === undefined && q?.canBeCached) || stopPreviousPolling) &&\n q?.isPolling\n ) {\n q?.stopPolling();\n }\n\n (q as unknown as AnyLegacyQuery)?.destroy?.();\n };\n\n if ((isQuery(prevQuery) || prevQuery === null) && (isQuery(currQuery) || currQuery === null)) {\n prevQuery?._removeDependent(componentId);\n currQuery?._addDependent(componentId);\n\n cleanQuery(prevQuery);\n } else if (\n (Array.isArray(prevQuery) || prevQuery === null) &&\n (Array.isArray(currQuery) || currQuery === null)\n ) {\n if (prevQuery) {\n for (let i = 0; i < prevQuery.length; i++) {\n prevQuery[i]?._removeDependent(componentId);\n }\n }\n\n if (currQuery) {\n for (let i = 0; i < currQuery.length; i++) {\n currQuery[i]?._addDependent(componentId);\n }\n }\n\n if (prevQuery) {\n for (let i = 0; i < prevQuery.length; i++) {\n cleanQuery(prevQuery[i]);\n }\n }\n } else if (\n (isQuery(prevQuery) && Array.isArray(currQuery)) ||\n (Array.isArray(prevQuery) && isQuery(currQuery))\n ) {\n throw new Error('Cannot mix queries and arrays of queries in the same query container.');\n }\n }),\n )\n .subscribe();\n\n destroy$.subscribe(() => {\n const query = valueFn();\n\n const handleQuery = (q: AnyV2Query | AnyLegacyQuery | null | undefined) => {\n q?._removeDependent(componentId);\n\n if (!q?._hasDependents() && ((q?.canBeCached && abortOnDestroy === undefined) || abortOnDestroy)) {\n q?.abort();\n (q as unknown as AnyLegacyQuery)?.destroy?.();\n }\n };\n\n if (isQuery(query)) {\n handleQuery(query);\n } else if (Array.isArray(query)) {\n for (const q of query) {\n handleQuery(q);\n }\n }\n });\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Observable<T> | Subscribable<T>,\n): Signal<T | undefined>;\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Observable<T> | Subscribable<T>,\n options: NoInfer<ToSignalOptions<T | undefined>> & {\n initialValue?: undefined;\n requireSync?: false;\n } & QueryContainerConfig,\n): Signal<T | undefined>;\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Observable<T> | Subscribable<T>,\n options: NoInfer<ToSignalOptions<T | null>> & {\n initialValue?: null;\n requireSync?: false;\n } & QueryContainerConfig,\n): Signal<T | null>;\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Observable<T> | Subscribable<T>,\n options: NoInfer<ToSignalOptions<T>> & {\n initialValue?: undefined;\n requireSync: true;\n } & QueryContainerConfig,\n): Signal<T>;\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null, const U extends T>(\n source: Observable<T> | Subscribable<T>,\n options: NoInfer<ToSignalOptions<T | U>> & {\n initialValue: U;\n requireSync?: false;\n } & QueryContainerConfig,\n): Signal<T | U>;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function toQuerySignal<T extends AnyV2Query | AnyLegacyQuery | null, U = undefined>(\n source: Observable<T> | Subscribable<T>,\n options?: ToSignalOptions<T | U> & { initialValue?: U } & QueryContainerConfig,\n): Signal<T | U> {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const s = toSignal(source, options as any);\n\n addQueryContainerHandling(source as Observable<T>, () => s() as T, options);\n\n return s as Signal<T | U>;\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function effectComputed<T extends AnyV2Query | AnyLegacyQuery | AnyV2Query[] | AnyLegacyQuery[] | null>(\n computation: () => T,\n injector: Injector,\n) {\n let initialData = null;\n\n try {\n initialData = runInInjectionContext(injector, () => computation());\n } catch {\n // Ignore errors in the initial computation\n // Angular might throw an error if required inputs are read but not available yet\n }\n\n const lastResult = signal<T>(initialData as T);\n\n effect(\n () => {\n const data = runInInjectionContext(injector, () => computation());\n\n untracked(() => {\n if (data === lastResult()) return;\n\n lastResult.set(data);\n });\n },\n { injector },\n );\n\n return lastResult.asReadonly();\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function queryComputed<T extends AnyV2Query | AnyLegacyQuery | null>(\n computation: () => T,\n options?: CreateComputedOptions<T> & QueryContainerConfig & ToObservableOptions,\n): Signal<T> {\n const injector = options?.injector ?? inject(Injector);\n\n const c = effectComputed(computation, injector);\n const obs = toObservable(c, options);\n\n addQueryContainerHandling(obs, () => c(), options);\n\n return c;\n}\n\n/**\n * Creates a signal that will only be reactive until the first query is created.\n * All subsequent changes inside the computation will be ignored.\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function queryComputedTillTruthy<T extends AnyV2Query | AnyLegacyQuery | null>(\n computation: () => T,\n options?: CreateComputedOptions<T> & QueryContainerConfig & ToObservableOptions,\n): Signal<T | null> {\n const injector = options?.injector ?? inject(Injector);\n\n const c = computedTillTruthy(effectComputed(computation, injector));\n const obs = toObservable(c, options);\n\n addQueryContainerHandling(obs, () => c(), options);\n\n return c;\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function queryArrayComputed<T extends AnyV2Query[] | AnyLegacyQuery[] | null>(\n computation: () => T,\n options?: CreateComputedOptions<T> & QueryContainerConfig & ToObservableOptions,\n): Signal<T> {\n const injector = options?.injector ?? inject(Injector);\n\n const c = effectComputed(computation, injector);\n const obs = toObservable(c, options);\n\n addQueryContainerHandling(obs, () => c(), options);\n\n return c;\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function toQuerySubject<T extends AnyV2Query | AnyLegacyQuery | null>(\n source: Signal<T>,\n options?: ToObservableOptions & QueryContainerConfig,\n): Observable<T> {\n const obs = toObservable(source, options);\n\n addQueryContainerHandling(obs, () => source(), options);\n\n return obs;\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function queryStateSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>>(\n source: T,\n options?: QueryFilterConfig,\n) {\n const { cacheResponse } = options ?? {};\n\n const roSignal = toSignal(\n toObservable(source).pipe(\n switchMap((q) => extractQuery(q)?.state$ ?? of(null)),\n switchMap((state) => {\n if (cacheResponse) {\n return of(state).pipe(filterQueryStates([QueryStateType.Success, QueryStateType.Failure]));\n }\n\n return of(state);\n }),\n ),\n {\n initialValue: null,\n },\n ) as Signal<V2QueryState<QueryDataOf<QueryOf<ReturnType<T>>>> | null>;\n\n const rwSignal = linkedSignal<V2QueryState<QueryDataOf<QueryOf<ReturnType<T>>>> | null>(roSignal);\n\n return rwSignal;\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type QueryStateSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>> =\n Signal<QueryDataOf<QueryOf<ReturnType<T>>> | null> & { reset: () => void };\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function queryStateResponseSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>>(\n source: T,\n options?: QueryFilterConfig,\n) {\n const s = queryStateSignal(source, options);\n\n const dataSignal = computed(() => {\n const state = s();\n\n return isQueryStateSuccess(state) ? state.response : null;\n });\n\n (dataSignal as QueryStateSignal<T>)['reset'] = () => {\n s.set(null);\n };\n\n return dataSignal as QueryStateSignal<T>;\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function queryStateErrorSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>>(\n source: T,\n) {\n const s = queryStateSignal(source);\n\n return computed(() => {\n const state = s();\n\n return isQueryStateFailure(state) ? state.error : null;\n });\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function queryStateLoadingSignal<T extends Signal<AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>>(\n source: T,\n) {\n const s = queryStateSignal(source);\n\n return computed(() => {\n const state = s();\n\n return isQueryStateLoading(state) ? state : null;\n });\n}\n","/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const deepFreeze = <T extends Record<string, unknown>>(object: T) => {\n // check if object is actually an object or frozen\n if (!object || typeof object !== 'object' || Object.isFrozen(object)) {\n return object;\n }\n\n // Retrieve the property names defined on object\n const propNames = Object.getOwnPropertyNames(object);\n\n // Freeze properties before freezing self\n\n for (const name of propNames) {\n const value = object[name];\n\n if (value && typeof value === 'object') {\n deepFreeze(value as T);\n }\n }\n\n return Object.freeze(object);\n};\n","/**\n * Dummy function for providing types while not breaking inference.\n * **This function always returns null.**\n * @see https://github.com/microsoft/TypeScript/issues/26242\n * @returns null\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const def = <Data>() => null as unknown as Data;\n","import { assertInInjectionContext, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject } from 'rxjs';\nimport { EntityStore } from '../entity';\nimport { V2Query, computeQueryQueryParams } from '../query';\nimport { V2QueryClient, v2BuildQueryCacheKey, v2ShouldCacheQuery } from '../query-client';\nimport { QueryStore } from '../query-store';\nimport {\n AnyRoute,\n BaseArguments,\n GqlQueryConfig,\n RestQueryConfig,\n V2RouteType,\n WithConfig,\n WithHeaders,\n WithMock,\n} from '../query/query.types';\nimport { buildRoute } from '../request';\nimport { QueryContainerConfig, addQueryContainerHandling } from '../utils';\nimport { QueryPrepareFn } from './query-creator.types';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class V2QueryCreator<\n Arguments extends BaseArguments | undefined,\n Response,\n Route extends V2RouteType<Arguments>,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n> {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n prepare: QueryPrepareFn<Arguments, Response, Route, Store, Data, Id> = (\n args?: Arguments & WithHeaders & WithConfig & WithMock<Response>,\n ) => {\n const route = buildRoute({\n base: this._client.config.baseRoute,\n route: this._queryConfig.route as AnyRoute,\n pathParams: args?.pathParams,\n queryParams: computeQueryQueryParams({ config: this._queryConfig, client: this._client, args }),\n queryParamConfig: this._client.config.request?.queryParams,\n }) as Route;\n\n const cacheKey = (args?.config?.queryStoreCacheKey ?? '') + v2BuildQueryCacheKey(route as string, args);\n\n if (v2ShouldCacheQuery(this._queryConfig.method) && !args?.config?.skipQueryStore) {\n const existingQuery = this._store.get<V2Query<Response, Arguments, Route, Store, Data, Id>>(cacheKey);\n\n if (existingQuery) {\n return existingQuery;\n }\n }\n\n const query = new V2Query<Response, Arguments, Route, Store, Data, Id>(\n this._client,\n this._queryConfig,\n route,\n args ?? ({} as Arguments),\n cacheKey,\n );\n\n if (v2ShouldCacheQuery(this._queryConfig.method) && !args?.config?.skipQueryStore) {\n this._store.add(cacheKey, query);\n }\n\n this._store._dispatchQueryCreated(query);\n\n return query;\n };\n\n createSubject = (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => {\n assertInInjectionContext(this.createSubject);\n\n const subject = new BehaviorSubject<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n\n addQueryContainerHandling(subject, () => subject.getValue(), config);\n\n return subject;\n };\n\n createSignal = (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => {\n assertInInjectionContext(this.createSignal);\n\n const _signal = signal<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n\n addQueryContainerHandling(toObservable(_signal), () => _signal(), config);\n\n return _signal;\n };\n\n behaviorSubject = (initialValue?: ReturnType<typeof this.prepare> | null) =>\n new BehaviorSubject<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n constructor(\n private _queryConfig:\n | RestQueryConfig<Route, Response, Arguments, Store, Data, Id>\n | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>,\n private _client: V2QueryClient,\n private _store: QueryStore,\n ) {}\n}\n","import { Subject, fromEvent, take, takeUntil, timer } from 'rxjs';\nimport { AnyV2Query } from '../query';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class QueryStore {\n /**\n * @internal\n */\n readonly _store = new Map<string, AnyV2Query>();\n\n private garbageCollector: number | null = null;\n private isInLowResourceMode = false;\n private lastBlurTimestamp = Date.now();\n\n private _storeChange$ = new Subject<string>();\n private _queryCreated$ = new Subject<AnyV2Query>();\n\n readonly storeChange$ = this._storeChange$.asObservable();\n readonly queryCreated$ = this._queryCreated$.asObservable();\n\n constructor(\n private _config?: {\n enableChangeLogging?: boolean;\n enableGarbageCollectorLogging?: boolean;\n autoRefreshQueriesOnWindowFocus?: boolean;\n enableSmartPolling?: boolean;\n },\n ) {\n this.initSmartQueryHandling();\n }\n\n add(id: string, query: AnyV2Query) {\n this._store.set(id, query);\n\n this.initGarbageCollector();\n\n this.logState(id, query, 'SET');\n\n this._storeChange$.next(id);\n }\n\n get<T extends AnyV2Query>(id: string): T | null {\n return (this._store.get(id) as T) ?? null;\n }\n\n remove(id: string) {\n this._store.delete(id);\n\n this.logState(id, null, 'REMOVE');\n\n this._storeChange$.next(id);\n }\n\n forEach(callback: (value: AnyV2Query, key: string) => void) {\n for (const [key, query] of this._store) {\n callback(query, key);\n }\n }\n\n refreshQueriesInUse(config?: { ignoreCacheValidity?: boolean; purgeUnused?: boolean }) {\n const { ignoreCacheValidity, purgeUnused } = config ?? {};\n\n for (const [key, query] of this._store) {\n if (\n query.isInUse &&\n (query.isExpired || ignoreCacheValidity) &&\n query.autoRefreshOnConfig.queryClientDefaultHeadersChange\n ) {\n query.execute({ skipCache: true, _triggeredVia: 'auto' });\n } else if (purgeUnused && !query.isInUse) {\n this.remove(key);\n }\n }\n }\n\n /**\n * @internal\n */\n _dispatchQueryCreated(query: AnyV2Query) {\n this._queryCreated$.next(query);\n }\n\n private initSmartQueryHandling() {\n const windowBlur$ = fromEvent<Event>(window, 'blur');\n const windowFocus$ = fromEvent<Event>(window, 'focus');\n\n windowBlur$.subscribe(() => {\n timer(5000)\n .pipe(takeUntil(windowFocus$), take(1))\n .subscribe(() => {\n this.lastBlurTimestamp = Date.now();\n this.isInLowResourceMode = true;\n this.stopGarbageCollector();\n\n if (this._config?.enableSmartPolling) {\n this.forEach((query) => {\n if (!query.isPolling || !query._enableSmartPolling) {\n return;\n }\n\n query.pausePolling();\n });\n }\n });\n });\n\n windowFocus$.subscribe(() => {\n if (!this.isInLowResourceMode) {\n return;\n }\n\n this.isInLowResourceMode = false;\n\n if (this._config?.enableSmartPolling || this._config?.autoRefreshQueriesOnWindowFocus) {\n this.forEach((query) => {\n if (this._config?.enableSmartPolling && query._isPollingPaused) {\n query.resumePolling();\n }\n\n if (Date.now() - this.lastBlurTimestamp > 15000) {\n if (\n this._config?.autoRefreshQueriesOnWindowFocus &&\n query.isExpired &&\n query.isInUse &&\n query.autoRefreshOnConfig.windowFocus\n ) {\n query.execute({ skipCache: true, _triggeredVia: 'auto' });\n }\n }\n });\n }\n\n this.initGarbageCollector();\n });\n }\n\n private logState(key: string | null, item: AnyV2Query | null, operation: string) {\n if (!this._config?.enableChangeLogging) return;\n\n const stateAsJson: Record<string, AnyV2Query> = {};\n\n this._store.forEach((value, key) => {\n stateAsJson[key] = value;\n });\n\n console.log(`%c[${operation}] ${key}`, 'font-weight: bold');\n\n console.log({ operation, key, item });\n console.log(stateAsJson);\n }\n\n private initGarbageCollector() {\n if (this.garbageCollector !== null) {\n return;\n }\n\n this.logGarbageCollector('Start');\n\n this.garbageCollector = window.setInterval(() => {\n this.runGarbageCollector();\n }, 15000);\n }\n\n private stopGarbageCollector() {\n if (this.garbageCollector !== null) {\n window.clearInterval(this.garbageCollector);\n this.garbageCollector = null;\n this.logGarbageCollector('Stop');\n }\n }\n\n private runGarbageCollector() {\n this.logGarbageCollector('Collecting...');\n\n this._store.forEach((item, key) => {\n if (item.isExpired && !item.isInUse) {\n this.remove(key);\n }\n });\n\n this.logGarbageCollector('Collection done');\n\n if (!this._store.size) {\n this.stopGarbageCollector();\n }\n }\n\n private logGarbageCollector(action: string) {\n if (!this._config?.enableGarbageCollectorLogging) return;\n\n console.log(`%cGC: ${action}`, 'color: yellow; font-weight: bold');\n }\n}\n","import { BehaviorSubject } from 'rxjs';\nimport { AuthProvider } from '../auth';\nimport { EntityStore } from '../entity';\nimport {\n BaseArguments,\n GqlQueryConfig,\n GqlQueryConfigWithoutMethod,\n QueryConfigWithoutMethod,\n RestQueryConfig,\n V2RouteType,\n} from '../query';\nimport { V2QueryCreator } from '../query-creator';\nimport { QueryStore } from '../query-store';\nimport { RequestHeaders, RequestHeadersMethodMap } from '../request';\nimport { V2QueryClientConfig } from './query-client.types';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class V2QueryClient {\n /**\n * @internal\n */\n readonly _store: QueryStore;\n private readonly _authProvider$ = new BehaviorSubject<AuthProvider | null>(null);\n\n fetch = <\n Route extends V2RouteType<Arguments>,\n Response,\n Arguments extends BaseArguments | undefined,\n Id,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n Data = Response,\n >(\n queryConfig:\n | RestQueryConfig<Route, Response, Arguments, Store, Data, Id>\n | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>,\n ) => new V2QueryCreator<Arguments, Response, Route, Store, Data, Id>(queryConfig, this, this._store);\n\n get = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'GET',\n });\n\n post = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'POST',\n });\n\n put = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'PUT',\n });\n\n patch = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'PATCH',\n });\n\n delete = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'DELETE',\n });\n\n gqlQuery = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: GqlQueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'GQL_QUERY',\n });\n\n gqlMutate = <\n Route extends V2RouteType<Arguments>,\n Response,\n Id,\n Data = Response,\n Arguments extends BaseArguments | undefined = undefined,\n Store extends EntityStore<unknown> = EntityStore<unknown>,\n >(\n queryConfig: GqlQueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>,\n ) =>\n this.fetch<Route, Response, Arguments, Id, Store, Data>({\n ...queryConfig,\n method: 'GQL_MUTATE',\n });\n\n setAuthProvider = (authProvider: AuthProvider) => {\n if (this.authProvider) {\n this.authProvider?.cleanUp();\n }\n\n this._authProvider$.next(authProvider);\n };\n\n setDefaultHeaders = (config: {\n headers: RequestHeaders | RequestHeadersMethodMap | null;\n refreshQueriesInUse?: boolean;\n }) => {\n if (!this._clientConfig.request) {\n this._clientConfig.request = {\n headers: config.headers ?? undefined,\n };\n } else {\n this._clientConfig.request.headers = config.headers ?? undefined;\n }\n\n if (config.refreshQueriesInUse) {\n this._store.refreshQueriesInUse({ purgeUnused: true, ignoreCacheValidity: true });\n }\n };\n\n clearAuthProvider = () => {\n this.authProvider?.cleanUp();\n this._authProvider$.next(null);\n };\n\n _updateBaseRoute = (route: string) => {\n this._clientConfig.baseRoute = route;\n };\n\n constructor(private _clientConfig: V2QueryClientConfig) {\n this._store = new QueryStore({\n enableChangeLogging: _clientConfig.logging?.queryStateChanges,\n enableGarbageCollectorLogging: _clientConfig.logging?.queryStateGarbageCollector,\n autoRefreshQueriesOnWindowFocus: _clientConfig.request?.autoRefreshQueriesOnWindowFocus ?? true,\n enableSmartPolling: _clientConfig.request?.enableSmartPolling ?? true,\n });\n }\n\n get config() {\n return this._clientConfig;\n }\n\n get authProvider() {\n return this._authProvider$.getValue() ?? this._clientConfig.parent?._authProvider$.getValue() ?? null;\n }\n get authProvider$() {\n return this._authProvider$.asObservable() ?? this._clientConfig.parent?._authProvider$.asObservable() ?? null;\n }\n}\n","import { BaseArguments } from '../query/query.types';\nimport { Method } from '../request';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const v2ShouldCacheQuery = (method: Method) => {\n return method === 'GET' || method === 'OPTIONS' || method === 'HEAD' || method === 'GQL_QUERY';\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const v2BuildQueryCacheKey = (route: string, args: BaseArguments | undefined) => {\n const variables = JSON.stringify(args?.variables || {})\n // replace all curly braces with empty string\n .replace(/{|}/g, '')\n // replace new lines and whitespaces with empty string\n .replace(/\\s/g, '');\n\n const seed = `${route}...${variables}`;\n\n let hash = 0;\n\n for (const char of seed) {\n hash = (Math.imul(31, hash) + char.charCodeAt(0)) << 0;\n }\n\n // Force positive number hash.\n // 2147483647 = equivalent of Integer.MAX_VALUE.\n hash += 2147483647 + 1;\n\n return hash.toString();\n};\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n DestroyRef,\n EnvironmentInjector,\n EnvironmentProviders,\n inject,\n Injector,\n isDevMode,\n makeEnvironmentProviders,\n PLATFORM_ID,\n provideEnvironmentInitializer,\n} from '@angular/core';\n\nlet fallbackInjector: Injector | null = null;\n\n/**\n * The stashed root injector, or `null` when the fallback was never provided (or was provided on the\n * server, where stashing is refused).\n *\n * @internal\n */\nexport const legacyPrepareFallbackInjector = () => fallbackInjector;\n\n/**\n * Lets `prepare()` fall back to the application's root injector when it is called outside any injection\n * context, instead of throwing `ET950`.\n *\n * Opt-in, and **browser only**. Two things degrade when the fallback is used, both matching v2, which had\n * no injector to scope to at all:\n *\n * - **The query's lifetime becomes the application's.** Nothing tears it down when a component dies, so\n * cleanup rests entirely on a query container or `config: { destroyOnResponse: true }`.\n * - **The devtools lose the host element**, so \"inspect\" cannot jump to the component. Already the case\n * for any query created from a root or environment injector.\n *\n * It refuses to stash anything on the server: a module-global injector would be shared across concurrent\n * requests, which is data bleed rather than a leak. Server-side renders keep throwing `ET950`, so a call\n * site that only works in the browser fails loudly where it matters.\n *\n * Prefer passing `injector` at the call site - it keeps the query scoped to whatever created it. Reach for\n * this when a migration has too many call sites to thread by hand.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n * providers: [provideLegacyPrepareFallback()],\n * });\n * ```\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const provideLegacyPrepareFallback = (): EnvironmentProviders =>\n makeEnvironmentProviders([\n provideEnvironmentInitializer(() => {\n if (!isPlatformBrowser(inject(PLATFORM_ID))) {\n if (isDevMode()) {\n console.warn(\n 'provideLegacyPrepareFallback() does nothing on the server: a module-global injector would be shared ' +\n 'between concurrent requests. prepare() calls without an injection context keep throwing ET950 there.',\n );\n }\n\n return;\n }\n\n const injector = inject(EnvironmentInjector);\n\n fallbackInjector = injector;\n\n inject(DestroyRef).onDestroy(() => {\n if (fallbackInjector === injector) {\n fallbackInjector = null;\n }\n });\n }),\n ]);\n","import { EffectRef, effect, untracked } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport {\n filter,\n interval,\n map,\n Observable,\n of,\n ReplaySubject,\n shareReplay,\n skip,\n Subscription,\n switchMap,\n takeUntil,\n takeWhile,\n} from 'rxjs';\nimport { AnyNewQuery, Query, QueryArgs, QueryArgsOf, QueryExecutionState, RequestArgs, ResponseType } from '../../http';\nimport { EntityStore } from '../entity';\nimport {\n BaseArguments,\n ExecuteQueryOptions,\n Failure,\n filterFailure,\n filterSuccess,\n isQueryStateLoading,\n isQueryStateSuccess,\n Loading,\n PollConfig,\n Prepared,\n QueryAutoRefreshConfig,\n QueryEntityConfig,\n QueryStateMeta,\n QueryStateType,\n Success,\n takeUntilResponse,\n V2QueryState,\n V2RouteType,\n} from '../query';\nimport { RequestError } from '../request';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type CreateLegacyQueryOptions<TArgs extends QueryArgs> = {\n query: Query<TArgs>;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const transformExecStateToQueryState = <TArgs extends QueryArgs>(\n execState: QueryExecutionState<TArgs> | null,\n): V2QueryState<ResponseType<TArgs>> => {\n const meta: QueryStateMeta = { id: -1, triggeredVia: 'program' };\n\n switch (execState?.type) {\n case 'loading': {\n const loading: Loading = {\n meta,\n type: QueryStateType.Loading,\n ...(execState.loading.progress\n ? {\n progress: {\n current: execState.loading.progress.loaded,\n percentage: execState.loading.progress.percentage,\n total: execState.loading.progress.total,\n },\n }\n : {}),\n };\n\n return loading;\n }\n case 'success': {\n const success: Success<ResponseType<TArgs>> = {\n headers: {},\n meta,\n response: execState.response,\n type: QueryStateType.Success,\n };\n\n return success;\n }\n case 'failure': {\n const error: Failure = {\n error: {\n detail: execState.error.raw.error,\n httpErrorResponse: execState.error.raw,\n status: execState.error.raw.status,\n statusText: execState.error.raw.statusText,\n url: execState.error.raw.url || '',\n },\n meta,\n type: QueryStateType.Failure,\n };\n\n return error;\n }\n default: {\n const prepared: Prepared = {\n meta,\n type: QueryStateType.Prepared,\n };\n\n return prepared;\n }\n }\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isLegacyQuery = <T extends AnyLegacyQuery>(query: unknown): query is T => {\n if (!query || typeof query !== 'object' || Array.isArray(query)) {\n return false;\n }\n\n if (!('newQuery' in query)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyLegacyQuery = LegacyQuery<any, any, any, any, any, any, any>;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class LegacyQuery<\n Response,\n Arguments extends BaseArguments | undefined,\n // Positional public-API generic slot - consumers infer it via `LegacyQuery<…, infer Route, …>`,\n // so it must stay even though the class body never references it.\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n Route extends V2RouteType<Arguments>,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n TNewQuery extends AnyNewQuery,\n> {\n /**\n * @internal\n */\n _pollingSubscription: Subscription | null = null;\n /**\n * @internal\n */\n _currentPollConfig: PollConfig | null = null;\n\n /**\n * `null` for an inert query - there is no live injector to own an effect.\n *\n * @internal\n */\n storeSyncEffect: EffectRef | null = null;\n\n /**\n * @internal\n */\n readonly _dependents: Record<number, number> = {};\n\n /**\n * @internal\n */\n _dependentsChanged$ = new ReplaySubject<Record<number, number>>();\n\n /**\n * @internal\n */\n _isPollingPaused = false;\n\n private isDestroyed = false;\n\n state$: Observable<V2QueryState<Data>>;\n\n constructor(\n public newQuery: TNewQuery,\n public _arguments: RequestArgs<QueryArgsOf<TNewQuery>>,\n public entity?: QueryEntityConfig<Store, Data, Response, Arguments, Id>,\n\n /**\n * Wraps an inert query - see `createInertQuery`. Skips everything that needs a live injector,\n * so the wrapper is safe to build during teardown.\n *\n * @internal\n */\n private _isInert = false,\n\n /**\n * Whether the underlying request is cacheable. Resolved by the creator, which is the only place that\n * knows the method before the first execution.\n *\n * @internal\n */\n private _canBeCached = false,\n ) {\n if (this._isInert) {\n this.state$ = of(transformExecStateToQueryState(null)) as Observable<V2QueryState<Data>>;\n this.isDestroyed = true;\n\n return;\n }\n\n this.state$ = toObservable(this.newQuery.executionState, { injector: this.newQuery.subtle.injector }).pipe(\n map((execState) => transformExecStateToQueryState(execState)),\n switchMap((s) => this._transformState(s)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n this.storeSyncEffect = effect(() => {\n // Gated on the execution state, not on the response being non-null: the effect runs once on\n // creation, and `response()` is null until the first one arrives - `id`/`set` are typed\n // non-nullable, so an unguarded write feeds `null` through them on every `prepare()`. A plain\n // null-check would be wrong the other way: a 204 is a success whose body is legitimately null.\n const execState = this.newQuery.executionState();\n\n untracked(() => {\n if (execState?.type !== 'success' || !this.entity?.set) return;\n\n const res = execState.response;\n const id = this.entity.id({ args: this._arguments, response: res });\n\n this.entity.set({\n args: this._arguments,\n response: res,\n id,\n store: this.entity.store,\n });\n });\n });\n\n // Tear down only what this wrapper owns. The underlying query is already being destroyed when this fires, so\n // destroying it again would call `R3Injector.destroy()` on an injector that is mid-teardown, which throws\n // NG0205 (\"Injector has already been destroyed\") from inside the view's cleanup phase.\n this.newQuery.subtle.destroyRef.onDestroy(() => this.teardown());\n }\n\n get rawState() {\n return transformExecStateToQueryState(this.newQuery.executionState());\n }\n\n get isExpired() {\n return this.newQuery.subtle.request()?.isStale();\n }\n\n get isInUse() {\n return true;\n }\n\n /**\n * @internal\n */\n get _subscriberCount() {\n return 0;\n }\n\n get isPolling() {\n return !!this._pollingSubscription;\n }\n\n get autoRefreshOnConfig() {\n const transformed: Readonly<QueryAutoRefreshConfig> = {\n queryClientDefaultHeadersChange: false,\n windowFocus: false,\n };\n\n return transformed;\n }\n\n /**\n * @internal\n */\n get _enableSmartPolling() {\n return false;\n }\n\n get store() {\n return null;\n }\n\n get canBeCached() {\n return this._canBeCached;\n }\n\n get _isInMockMode() {\n return false;\n }\n\n destroy() {\n if (this.isDestroyed) {\n return;\n }\n\n this.teardown();\n\n // Re-enters `_teardown` through the query's `destroyRef`, which the `_isDestroyed` guard absorbs.\n this.newQuery.subtle.destroy();\n }\n\n execute(options: ExecuteQueryOptions = {}) {\n untracked(() =>\n // v2 had a single `skipCache` for every method, so this cannot tell whether the underlying request is\n // cacheable. The creator is built with `silenceUncacheableAllowCacheError`, which makes `allowCache` inert\n // on a mutation instead of throwing ET301.\n this.newQuery.execute({ args: this._arguments, options: { allowCache: options.skipCache !== true } }),\n );\n\n return this;\n }\n\n abort() {\n if (!isQueryStateLoading(this.rawState)) {\n return this;\n }\n\n this.newQuery.reset();\n\n return this;\n }\n\n poll(config: PollConfig) {\n // An inert or already destroyed query has nothing to poll, and the interval would outlive it.\n if (this._pollingSubscription || this.isDestroyed) {\n return this;\n }\n\n this._currentPollConfig = config;\n\n const interval$ = interval(config.interval);\n const poll$ = interval$.pipe(\n skip(config.triggerImmediately ? 0 : 1),\n takeUntil(config.takeUntil),\n takeWhile(() => !this._isPollingPaused),\n filter(() => !isQueryStateLoading(this.rawState)),\n );\n\n this._pollingSubscription = poll$.subscribe({\n next: () => this.execute({ skipCache: true, _triggeredVia: 'poll' }),\n complete: () => this.stopPolling(),\n });\n\n return this;\n }\n\n stopPolling() {\n this._pollingSubscription?.unsubscribe();\n this._pollingSubscription = null;\n this._currentPollConfig = null;\n\n return this;\n }\n\n pausePolling() {\n this._pollingSubscription?.unsubscribe();\n this._pollingSubscription = null;\n\n this._isPollingPaused = true;\n\n return this;\n }\n\n resumePolling() {\n if (!this._isPollingPaused || !this._currentPollConfig) {\n return this;\n }\n\n this._isPollingPaused = false;\n\n return this.poll({ ...this._currentPollConfig, triggerImmediately: true });\n }\n\n onSuccess(callback: (response: Data) => void) {\n this.state$.pipe(takeUntilResponse(), filterSuccess()).subscribe((state) => callback(state.response));\n return this;\n }\n\n onFailure(callback: (error: RequestError<unknown>) => void) {\n this.state$.pipe(takeUntilResponse(), filterFailure()).subscribe((state) => callback(state.error));\n return this;\n }\n\n /**\n * @internal\n */\n _addDependent(tNodeIndex: number) {\n if (!this._dependents[tNodeIndex]) {\n this._dependents[tNodeIndex] = 0;\n }\n\n this._dependents[tNodeIndex]++;\n\n this._dependentsChanged$.next(this._dependents);\n }\n\n /**\n * @internal\n */\n _removeDependent(tNodeIndex: number) {\n const count = this._dependents[tNodeIndex];\n if (count === undefined) {\n return;\n }\n\n if (this._dependents[tNodeIndex] !== undefined) {\n this._dependents[tNodeIndex]--;\n }\n\n if (count <= 1) {\n delete this._dependents[tNodeIndex];\n }\n\n this._dependentsChanged$.next(this._dependents);\n }\n\n /**\n * @internal\n */\n _hasDependents() {\n return Object.keys(this._dependents).length > 0;\n }\n\n /**\n * @internal\n */\n _transformState(s: V2QueryState<Response>): Observable<V2QueryState<Data>> {\n if (!isQueryStateSuccess(s) || !this.entity?.get) {\n return of(s) as Observable<V2QueryState<Data>>;\n }\n\n const id = this.entity.id({ args: this._arguments, response: s.response });\n\n return this.entity\n .get({ args: this._arguments, id, response: s.response, store: this.entity.store })\n .pipe(map((v) => ({ ...s, response: v })));\n }\n\n private teardown() {\n if (this.isDestroyed) {\n return;\n }\n\n this.isDestroyed = true;\n this._pollingSubscription?.unsubscribe();\n this._pollingSubscription = null;\n this._dependentsChanged$.complete();\n this.storeSyncEffect?.destroy();\n }\n}\n","import { DestroyRef, Injector, Signal, signal } from '@angular/core';\nimport { of } from 'rxjs';\nimport { ObservableSignal, Query, QueryArgs, QuerySnapshot, RequestArgs, ResponseType } from '../../http';\n\n/**\n * A query that never executes and never leaves its initial state.\n *\n * `LegacyQueryCreator.prepare()` hands one back when the injector it was given is already destroyed\n * - the shape v2 call sites still fire into during teardown (a debounced search resolving after the\n * user navigated away, an RxJS callback on a stream that has not been unsubscribed yet). v2 had no\n * injector at all there, so the same code used to be harmless; building a real query would now\n * throw NG0205 from inside the view's cleanup phase, with no hint about which query caused it.\n *\n * Everything reads as \"prepared but never executed\": `execute()` and friends are no-ops, signals\n * stay `null`, observables complete immediately. Nothing here touches Angular's DI, which is the\n * point - there is no live injector left to bind to.\n */\nexport const createInertQuery = <TArgs extends QueryArgs>(): Query<TArgs> => {\n const inertSignal = <T>(value: T): ObservableSignal<T> =>\n Object.assign(signal(value) as Signal<T>, { asObservable: () => of(value) });\n\n const noop = () => {\n /* the query is inert - there is nothing to execute, reset or destroy */\n };\n\n const base = {\n args: inertSignal<RequestArgs<TArgs> | null>(null),\n response: inertSignal<ResponseType<TArgs> | null>(null),\n latestHttpEvent: inertSignal(null),\n loading: inertSignal(null),\n error: inertSignal(null),\n lastTimeExecutedAt: inertSignal<number | null>(null),\n triggeredBy: inertSignal<string | null>(null),\n id: inertSignal<string | null>(null),\n executionState: inertSignal(null),\n } as unknown as QuerySnapshot<TArgs>;\n\n const createSnapshot = (): QuerySnapshot<TArgs> => ({ ...base, isAlive: inertSignal(false) });\n\n // A DestroyRef that is already destroyed: callbacks registered on it are dropped rather than\n // stored, so nothing keeps this object (or its registrant) alive.\n const destroyRef = {\n destroyed: true,\n onDestroy: () => noop,\n } as unknown as DestroyRef;\n\n return {\n ...base,\n execute: noop,\n createSnapshot,\n reset: noop,\n asReadonly: () => ({ ...base, createSnapshot }),\n subtle: {\n destroy: noop,\n setResponse: noop,\n setLoading: noop,\n setError: noop,\n request: inertSignal(null),\n destroyRef,\n injector: Injector.NULL,\n },\n } as unknown as Query<TArgs>;\n};\n","import { HttpHeaders } from '@angular/common/http';\nimport {\n DestroyRef,\n effect,\n inject,\n Injector,\n isDevMode,\n runInInjectionContext,\n signal,\n untracked,\n} from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { BehaviorSubject } from 'rxjs';\nimport {\n AnyNewQuery,\n AnyQueryCreator,\n CreateQueryCreatorOptions,\n legacyPrepareWithoutInjectionContext,\n Query,\n QueryArgs,\n QueryCreator,\n QueryMethod,\n RequestArgs,\n ResponseType,\n shouldCacheQuery,\n} from '../../http';\nimport { EntityStore } from '../entity';\nimport { BaseArguments, QueryEntityConfig, V2QueryConfig, V2RouteType, WithHeaders, WithInjector } from '../query';\nimport { addQueryContainerHandling, QueryContainerConfig } from '../utils';\nimport { createInertQuery } from './inert-query';\nimport { legacyPrepareFallbackInjector } from './legacy-prepare-fallback';\nimport { LegacyQuery } from './legacy-query';\n\n/**\n * Whether an injector can still be used. A destroyed `R3Injector` throws on `get()` rather than\n * answering, so the throw itself is the answer; a node injector hands back a `DestroyRef` that\n * reports its own state.\n */\nconst isInjectorUsable = (injector: Injector) => {\n try {\n return injector.get(DestroyRef, null, { optional: true })?.destroyed !== true;\n } catch {\n return false;\n }\n};\n\n/**\n * Angular's NG0203, thrown by `inject()` outside an injection context. Matched on the code rather than\n * the message: production builds strip the message, and NG0205 (\"Injector has already been destroyed\")\n * comes out of the same `inject()` call for a different reason entirely.\n */\nconst isMissingInjectionContextError = (error: unknown) =>\n typeof error === 'object' && error !== null && Math.abs(Number((error as { code?: unknown }).code)) === 203;\n\n/**\n * What the creator was built with, for diagnostics - `GET /person`. Lets an unnamed wrapper still point\n * at an endpoint instead of \"a legacy query creator\". A route function cannot be described this way, but\n * those wrappers come from the generator, which always emits a `name`.\n */\nconst describeCreator = (creator: AnyQueryCreator) => {\n const { method, route } = creator.subtle.creatorInternals;\n\n if (typeof route !== 'string') return undefined;\n\n return typeof method === 'string' ? `${method} ${route}` : route;\n};\n\n/**\n * Mirrors the cacheability decision the query repository makes per request: cacheable HTTP methods and\n * GraphQL queries, unless the creator opted in or out explicitly. The legacy container helpers branch on\n * `canBeCached` for their default cleanup, so a wrapper has to answer before the first execution.\n */\nconst canCreatorBeCached = (creator: AnyQueryCreator) => {\n const { method } = creator.subtle.creatorInternals;\n const explicit = (creator.subtle.creatorOptions as CreateQueryCreatorOptions | undefined)?.subtle\n ?.useQueryRepositoryCache;\n\n if (explicit !== undefined) return explicit;\n if (method === 'QUERY') return true;\n if (method === 'MUTATE') return false;\n\n return typeof method === 'string' && shouldCacheQuery(method as QueryMethod);\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type LegacyArgumentsOfQueryArgs<T extends QueryArgs> = Omit<T, 'response' | 'headers'> & WithHeaders;\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type QueryArgsOfLegacyArguments<T extends BaseArguments | undefined, J> = Omit<T, 'mock' | 'headers'> & {\n headers?: HttpHeaders;\n response?: J;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type CreateLegacyQueryCreatorOptions<\n TArgs extends QueryArgs,\n Response,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n> = {\n creator: QueryCreator<TArgs>;\n\n /**\n * Object containing the query's entity store information.\n */\n entity?: QueryEntityConfig<Store, Data, Response, LegacyArgumentsOfQueryArgs<TArgs>, Id>;\n\n /**\n * The name this creator is exported under, used to name it in error messages. Emitted by the\n * `migrate-to-query-v3` generator; worth passing by hand too, since without it a `prepare()`\n * called outside an injection context can only be located by bisection.\n */\n name?: string;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type WithLegacyConfig = {\n /**\n * Additional configuration for this query.\n */\n config?: V2QueryConfig & {\n /**\n * If set to true, the query will be destroyed when it either succeeds or fails.\n */\n destroyOnResponse?: boolean;\n };\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type LegacyQueryPrepareFn<\n Arguments extends BaseArguments | undefined,\n Response,\n Route extends V2RouteType<Arguments>,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n TNewQuery extends AnyNewQuery,\n> = (\n args: Arguments & WithHeaders & WithLegacyConfig & WithInjector,\n) => LegacyQuery<Response, Arguments, Route, Store, Data, Id, TNewQuery>;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyLegacyQueryCreator = LegacyQueryCreator<any, any, any, any, any>;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class LegacyQueryCreator<\n TArgs extends QueryArgs,\n Response extends ResponseType<TArgs>,\n Store extends EntityStore<unknown>,\n Id,\n Data = Response,\n> {\n prepare: LegacyQueryPrepareFn<\n LegacyArgumentsOfQueryArgs<TArgs>,\n Response,\n V2RouteType<LegacyArgumentsOfQueryArgs<TArgs>>,\n Store,\n Data,\n Id,\n Query<TArgs>\n > = (args: LegacyArgumentsOfQueryArgs<TArgs> & WithHeaders & WithLegacyConfig & WithInjector) => {\n const injector = args?.injector ?? this.resolveAmbientInjector('prepare');\n\n let headers = new HttpHeaders();\n\n if (args?.headers) {\n for (const [key, value] of Object.entries<string | undefined>(args.headers)) {\n // Only an absent value is skipped - an empty string is a header the caller asked to send.\n if (value === undefined || value === null) continue;\n\n headers = headers.set(key, value);\n }\n }\n\n const queryArgs = {\n // Presence, not truthiness: `0`, `''` and `false` are bodies, and dropping them silently sends a\n // different request than the call site asked for.\n ...(args?.body !== undefined ? { body: args.body } : {}),\n ...(args?.pathParams ? { pathParams: args.pathParams } : {}),\n ...(args?.queryParams ? { queryParams: args.queryParams } : {}),\n headers,\n } as RequestArgs<TArgs>;\n\n // A captured component injector routinely outlives its component here: a debounced search\n // resolving after navigation, an RxJS callback on a stream torn down a tick later. That is not\n // a programming error the way it would be in new code - v2 had no injector to destroy - so it\n // yields a query that does nothing instead of an NG0205 raised from the view's cleanup phase.\n if (!isInjectorUsable(injector)) {\n if (isDevMode()) {\n console.warn(\n `${this.label ? `\"${this.label}\"` : 'A legacy query'}.prepare() was called with a destroyed injector, so an inert query was returned. ` +\n `This usually means a callback outlived the component whose injector it captured - guard the call site with DestroyRef.onDestroy, or pass an injector that outlives it.`,\n );\n }\n\n return new LegacyQuery<\n Response,\n LegacyArgumentsOfQueryArgs<TArgs>,\n V2RouteType<LegacyArgumentsOfQueryArgs<TArgs>>,\n Store,\n Data,\n Id,\n Query<TArgs>\n >(createInertQuery<TArgs>(), queryArgs, this.options.entity, true, this.canBeCached);\n }\n\n return runInInjectionContext(injector, () => {\n return untracked(() => {\n const newQuery = this.options.creator({\n onlyManualExecution: true,\n injector,\n silenceMissingWithArgsFeatureError: true,\n // `LegacyQuery.execute()` forwards v2's `skipCache` as `allowCache` for every method, cacheable or not.\n silenceUncacheableAllowCacheError: true,\n });\n\n const legacyQuery = new LegacyQuery<\n Response,\n LegacyArgumentsOfQueryArgs<TArgs>,\n V2RouteType<LegacyArgumentsOfQueryArgs<TArgs>>,\n Store,\n Data,\n Id,\n Query<TArgs>\n >(newQuery, queryArgs, this.options.entity, false, this.canBeCached);\n\n if (args?.config?.destroyOnResponse) {\n // Owned by the query's own injector, not the caller's. Call sites are told to pass an injector\n // that outlives them, so they hand over a root or environment one - and an effect that only\n // tears itself down on a terminal state then outlives an aborted or never-executed query for\n // the lifetime of the app. Tied to the query, it dies with the thing it exists to destroy.\n effect(\n () => {\n const type = newQuery.executionState()?.type;\n\n if (type === 'success' || type === 'failure') {\n legacyQuery.destroy();\n }\n },\n { injector: newQuery.subtle.injector },\n );\n }\n\n return legacyQuery;\n });\n });\n };\n createSubject = (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => {\n const injector = config?.injector ?? this.resolveAmbientInjector('createSubject');\n const subject = new BehaviorSubject<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n\n addQueryContainerHandling(subject, () => subject.getValue(), { ...config, injector });\n\n return subject;\n };\n createSignal = (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => {\n const injector = config?.injector ?? this.resolveAmbientInjector('createSignal');\n const _signal = signal<ReturnType<typeof this.prepare> | null>(initialValue ?? null);\n\n addQueryContainerHandling(toObservable(_signal, { injector }), () => _signal(), { ...config, injector });\n\n return _signal;\n };\n\n behaviorSubject = this.createSubject;\n constructor(public options: CreateLegacyQueryCreatorOptions<TArgs, Response, Store, Data, Id>) {}\n\n /**\n * Whether the underlying request is cacheable, which is what the legacy container helpers use to decide\n * their default cleanup. Resolved from the creator, so it answers before the first execution.\n */\n get canBeCached() {\n return canCreatorBeCached(this.options.creator);\n }\n\n private get label() {\n return this.options.name ?? describeCreator(this.options.creator);\n }\n\n /**\n * v2 needed no injection context, so plenty of call sites are plain callbacks. Angular's raw NG0203\n * names neither the query nor the call site, which makes those a bisection exercise - replace it with\n * an error that does, and let every other DI failure (NG0205 from an injector mid-teardown, a missing\n * provider) through untouched.\n */\n private resolveAmbientInjector(method: 'prepare' | 'createSubject' | 'createSignal') {\n try {\n return inject(Injector);\n } catch (error) {\n if (!isMissingInjectionContextError(error)) {\n throw error;\n }\n\n const fallback = legacyPrepareFallbackInjector();\n\n // A stale stash (the app injector is gone) is no injector at all - handing it over would build a\n // query that silently never runs.\n if (fallback && isInjectorUsable(fallback)) {\n return fallback;\n }\n\n throw legacyPrepareWithoutInjectionContext(this.label, method);\n }\n }\n}\n\n/**\n * Creates a legacy query creator.\n *\n * **NOTE**: This is a temporary solution to support legacy queries. It will be removed in the future.\n *\n * **DO NOT TURN NEW QUERY CREATORS INTO LEGACY ONES MANUALLY. THIS IS ONLY NEEDED FOR MIGRATION PURPOSES.**\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const createLegacyQueryCreator = <\n TArgs extends QueryArgs,\n Response extends ResponseType<TArgs>,\n Store extends EntityStore<unknown>,\n Id,\n Data = Response,\n>(\n options: CreateLegacyQueryCreatorOptions<TArgs, Response, Store, Data, Id>,\n): LegacyQueryCreator<TArgs, Response, Store, Id, Data> => {\n return new LegacyQueryCreator<TArgs, Response, Store, Id, Data>(options);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { assertInInjectionContext, isDevMode, signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Paginated } from '@ethlete/types';\nimport { BehaviorSubject, Observable, filter, map, of, switchMap, takeWhile, tap } from 'rxjs';\nimport { transformGql } from '../../gql';\nimport { isSymfonyPagerfantaOutOfRangeError } from '../../http';\nimport { QueryForm } from '../../query-form';\nimport { EntityStore } from '../entity';\nimport { AnyLegacyQuery, isLegacyQuery } from '../interop';\nimport { V2QueryClient } from '../query-client';\nimport {\n AnyV2QueryCreator,\n QueryDataOf,\n QueryResponseOf,\n QueryStoreIdOf,\n QueryStoreOf,\n V2QueryArgsOf,\n V2QueryCreator,\n} from '../query-creator';\nimport { Method, RequestHeaders, RequestHeadersMethodMap, transformMethod } from '../request';\nimport { QueryContainerConfig, addQueryContainerHandling } from '../utils';\nimport {\n AnyGqlQueryConfig,\n AnyQueryCollection,\n AnyQueryCollectionData,\n AnyQueryCreatorCollection,\n AnyRestQueryConfig,\n AnyV2Query,\n BaseArguments,\n Cancelled,\n Failure,\n GqlQueryConfig,\n Loading,\n Prepared,\n QueryCollectionOf,\n QueryStateResponseOf,\n QueryStateType,\n ResetPageOnErrorOperatorConfig,\n Success,\n V2QueryState,\n V2RouteType,\n} from './query.types';\n\ntype OmitNull<T> = T extends null ? never : T;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function filterSuccess() {\n return function <T extends V2QueryState | null, Response extends QueryStateResponseOf<OmitNull<T>>>(\n source: Observable<T>,\n ) {\n return source.pipe(filter((value) => isQueryStateSuccess(value))) as Observable<Success<Response>>;\n };\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function ignoreAutoRefresh() {\n return function <T extends V2QueryState | null>(source: Observable<T>) {\n return source.pipe(filter((value) => !isAutoRefresh(value))) as Observable<T>;\n };\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function filterFailure() {\n return function <T extends V2QueryState | null>(source: Observable<T>) {\n return source.pipe(filter((value) => isQueryStateFailure(value))) as Observable<Failure>;\n };\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function filterQueryStates(allowedStates: QueryStateType[]) {\n return function <T extends V2QueryState | null>(source: Observable<T>) {\n return source.pipe(filter((value) => value && allowedStates.includes(value.type))) as Observable<T>;\n };\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function takeUntilResponse(config?: { excludeNull?: boolean }) {\n return function <T extends V2QueryState | null>(source: Observable<T>) {\n return source.pipe(\n takeWhile((value) => {\n if (config?.excludeNull && value === null) {\n return false;\n }\n\n return isQueryStateLoading(value) || isQueryStatePrepared(value) || value === null;\n }, true),\n );\n };\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function filterNull() {\n return function <T>(source: Observable<T>) {\n return source.pipe(filter((value): value is OmitNull<T> => value !== null));\n };\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function switchQueryState() {\n return function <T extends AnyV2Query | AnyLegacyQuery | null, Data extends QueryDataOf<T>>(source: Observable<T>) {\n return source.pipe(switchMap((value) => value?.state$ ?? of(null))) as Observable<V2QueryState<Data> | null>;\n };\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function switchQueryCollectionState() {\n return function <T extends AnyQueryCollection | null, Data extends AnyQueryCollectionData<OmitNull<T>>>(\n source: Observable<T>,\n ) {\n return source.pipe(switchMap((value) => value?.query.state$ ?? of(null))) as Observable<V2QueryState<Data> | null>;\n };\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const resetPageOnError =\n <T extends AnyV2Query | AnyLegacyQuery | null | undefined, J extends QueryForm<any>>(\n config: ResetPageOnErrorOperatorConfig<J>,\n ) =>\n (source: Observable<T>) => {\n const { queryForm, pageControlKey = 'page' } = config;\n\n if (isDevMode() && !queryForm.form.controls[pageControlKey]) {\n console.warn(`resetPageOnError: queryForm.form.controls[\"${pageControlKey}\"] is undefined`);\n }\n\n return source.pipe(\n switchMap((q) => {\n if (!q) {\n return of(q);\n }\n\n return q.state$.pipe(\n tap((state) => {\n if (!isQueryStateFailure(state)) {\n return;\n }\n\n switch (state.error.status) {\n // The page is invalid (in prod mode, code is 416)\n case 416:\n queryForm.form.controls[pageControlKey]?.patchValue(1);\n break;\n\n // The page might be invalid (in dev mode, code is 500)\n case 500:\n if (isSymfonyPagerfantaOutOfRangeError(state.error.detail)) {\n queryForm.form.controls[pageControlKey].patchValue(1);\n }\n break;\n }\n }),\n takeUntilResponse(),\n );\n }),\n );\n };\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isQueryStateLoading = (state: V2QueryState | null | undefined): state is Loading =>\n state?.type === QueryStateType.Loading;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isQueryStateSuccess = (state: V2QueryState | null | undefined): state is Success =>\n state?.type === QueryStateType.Success;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isQueryStateFailure = (state: V2QueryState | null | undefined): state is Failure =>\n state?.type === QueryStateType.Failure;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isQueryStateCancelled = (state: V2QueryState | null | undefined): state is Cancelled =>\n state?.type === QueryStateType.Cancelled;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isQueryStatePrepared = (state: V2QueryState | null | undefined): state is Prepared =>\n state?.type === QueryStateType.Prepared;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isAutoRefresh = (state: V2QueryState | null | undefined) => state?.meta.triggeredVia === 'auto';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const mergeHeaders = (...headers: Array<RequestHeaders | null | undefined>) => {\n return headers.reduce((acc, headers) => {\n if (!headers) {\n return acc;\n }\n\n return {\n ...acc,\n ...headers,\n };\n }, {});\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isGqlQueryConfig = <\n Response,\n Arguments extends BaseArguments | undefined,\n Route extends V2RouteType<Arguments> | undefined,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n>(\n config: unknown,\n): config is GqlQueryConfig<Route, Response, Arguments, Store, Data, Id> => {\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n return false;\n }\n\n if (!('query' in config)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isQuery = <T extends AnyV2Query | AnyLegacyQuery>(query: unknown): query is T => {\n if (!query || typeof query !== 'object' || Array.isArray(query)) {\n return false;\n }\n\n if (!('state$' in query)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isQueryCollection = <T extends AnyQueryCollection>(query: unknown): query is T => {\n if (!query || typeof query !== 'object' || Array.isArray(query)) {\n return false;\n }\n\n if (!('query' in query)) {\n return false;\n }\n\n return true;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const createQueryCollection = <T extends AnyQueryCreatorCollection, R extends QueryCollectionOf<T>>(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n queryMap: T,\n) => new BehaviorSubject<R | null>(null);\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const createQueryCollectionSubject = <T extends AnyQueryCreatorCollection, R extends QueryCollectionOf<T>>(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n queryMap: T,\n config?: QueryContainerConfig,\n) => {\n assertInInjectionContext(createQueryCollectionSubject);\n\n const subject = new BehaviorSubject<R | null>(null);\n\n addQueryContainerHandling(\n subject.pipe(map((s) => s?.query ?? null)),\n () => subject.getValue()?.query ?? null,\n config,\n );\n\n return subject;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const createQueryCollectionSignal = <T extends AnyQueryCreatorCollection, R extends QueryCollectionOf<T>>(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n queryMap: T,\n config?: QueryContainerConfig,\n) => {\n assertInInjectionContext(createQueryCollectionSignal);\n\n const _signal = signal<R | null>(null);\n\n addQueryContainerHandling(\n toObservable(_signal).pipe(map((s) => s?.query ?? null)),\n () => _signal()?.query ?? null,\n config,\n );\n\n return _signal;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const extractQuery = <T extends AnyV2Query | AnyLegacyQuery | AnyQueryCollection | null>(v: T) =>\n (isQuery(v) ? v : isLegacyQuery(v) ? v : v?.query) ?? null;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const getDefaultHeaders = (\n headers: RequestHeaders | RequestHeadersMethodMap | null | undefined,\n method: Method,\n) => {\n if (!headers) {\n return {};\n }\n\n if (method in headers) {\n return (headers[method] ?? {}) as RequestHeaders;\n }\n\n return headers as RequestHeaders;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const castQueryCreatorTypes = <\n QC extends AnyV2QueryCreator,\n Arguments extends V2QueryArgsOf<QC>,\n Response extends QueryResponseOf<QC>,\n Store extends QueryStoreOf<QC>,\n Data extends QueryDataOf<QC>,\n Route extends V2RouteType<Arguments>,\n Id extends QueryStoreIdOf<QC>,\n OverrideArguments extends BaseArguments | undefined,\n OverrideResponse extends Response | undefined,\n>(config: {\n creator: QC;\n args?: OverrideArguments;\n response?: OverrideResponse;\n}) => {\n if (config.args?.pathParams) {\n console.error(config);\n\n throw new Error('Path params cannot be overridden in castQueryCreatorTypes. Create a new query creator instead.');\n }\n\n return config.creator as unknown as V2QueryCreator<OverrideArguments, OverrideResponse, Route, Store, Data, Id>;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const computeQueryMethod = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n}) => {\n let method: Method;\n\n if (isGqlQueryConfig(config.config)) {\n const transferVia = config.config.transferVia ?? config.client.config.request?.gql?.transferVia;\n method = transformMethod({ method: config.config.method, transferVia });\n } else {\n method = transformMethod({ method: config.config.method });\n }\n\n return method;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const computeQueryBody = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n method: Method;\n args?: BaseArguments;\n}) => {\n let body: unknown;\n\n if (\n config.method === 'GET' ||\n config.method === 'HEAD' ||\n config.method === 'OPTIONS' ||\n (isGqlQueryConfig(config.config) &&\n (config.config.transferVia === 'GET' ||\n (config.client.config.request?.gql?.transferVia === 'GET' && !config.config.transferVia)))\n ) {\n return undefined;\n }\n\n if (isGqlQueryConfig(config.config)) {\n const queryTemplate = config.config.query;\n const query = transformGql(queryTemplate);\n\n body = query(config.args?.variables);\n } else {\n body = config.args?.body;\n }\n\n return body;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const computeQueryAuthHeader = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n}) => {\n let authHeader: Record<string, string> | null = null;\n\n if (config.config.secure) {\n const header = config.client.authProvider?.header;\n\n if (header) {\n authHeader = header;\n }\n } else if (config.client.authProvider?.header) {\n if (config.config.secure === undefined || config.config.secure) {\n authHeader = config.client.authProvider.header;\n }\n }\n\n return authHeader;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const computeQueryHeaders = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n args?: BaseArguments;\n}) => {\n const authHeader = computeQueryAuthHeader(config);\n\n const mergedHeaders =\n mergeHeaders(\n getDefaultHeaders(config.client.config.request?.headers, config.config.method),\n authHeader,\n config.args?.headers,\n ) || undefined;\n\n return mergedHeaders;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const computeQueryQueryParams = (config: {\n config: AnyRestQueryConfig | AnyGqlQueryConfig;\n client: V2QueryClient;\n args?: BaseArguments;\n}) => {\n if (\n isGqlQueryConfig(config.config) &&\n (config.config.transferVia === 'GET' ||\n (config.client.config.request?.gql?.transferVia === 'GET' && !config.config.transferVia))\n ) {\n const queryTemplate = config.config.query;\n const query = transformGql(queryTemplate);\n\n let params = query(config.args?.variables);\n\n if (config.args?.queryParams) {\n params = { ...params, ...config.args?.queryParams };\n }\n\n return params;\n }\n\n return config.args?.queryParams;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const paginatedEntityValueUpdater =\n <\n T extends Paginated<unknown>,\n Args extends BaseArguments,\n Entity,\n J extends (T extends Paginated<infer X> ? X : never),\n >(\n findFn: (val: J, entity: Entity) => boolean,\n ) =>\n ({ response, rawResponse, entity }: { rawResponse: T; response: T; args: Args; entity: Entity }) => {\n const indexOfEntityRaw = rawResponse.items.findIndex((item) => findFn(item as J, entity));\n const indexOfEntity = response.items.findIndex((item) => findFn(item as J, entity));\n\n if (indexOfEntity === -1 || indexOfEntityRaw === -1) {\n return null;\n }\n\n const newRawResponse = {\n ...rawResponse,\n items: [\n ...rawResponse.items.slice(0, indexOfEntityRaw),\n entity,\n ...rawResponse.items.slice(indexOfEntityRaw + 1),\n ],\n };\n\n const newResponse = {\n ...response,\n items: [...response.items.slice(0, indexOfEntity), entity, ...response.items.slice(indexOfEntity + 1)],\n };\n\n return {\n response: newResponse,\n rawResponse: newRawResponse,\n };\n };\n","import { untracked } from '@angular/core';\nimport {\n BehaviorSubject,\n combineLatest,\n EMPTY,\n filter,\n interval,\n map,\n Observable,\n of,\n ReplaySubject,\n shareReplay,\n skip,\n Subject,\n Subscription,\n switchMap,\n take,\n takeUntil,\n takeWhile,\n tap,\n timer,\n} from 'rxjs';\nimport { isBearerAuthProvider } from '../auth';\nimport { EntityStore } from '../entity';\nimport { V2QueryClient, v2ShouldCacheQuery } from '../query-client';\nimport { request, RequestError, RequestEvent, RequestHeaders } from '../request';\nimport {\n BaseArguments,\n ExecuteQueryOptions,\n GqlQueryConfig,\n PollConfig,\n QueryAutoRefreshConfig,\n QueryStateMeta,\n QueryStateType,\n RestQueryConfig,\n V2QueryState,\n V2RouteType,\n} from './query.types';\nimport {\n computeQueryBody,\n computeQueryHeaders,\n computeQueryMethod,\n filterFailure,\n filterSuccess,\n isGqlQueryConfig,\n isQueryStateCancelled,\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStatePrepared,\n isQueryStateSuccess,\n switchQueryState,\n takeUntilResponse,\n} from './query.utils';\n\nlet _nextQueryId = 0;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class V2Query<\n Response,\n Arguments extends BaseArguments | undefined,\n Route extends V2RouteType<Arguments>,\n Store extends EntityStore<unknown>,\n Data,\n Id,\n> {\n readonly _id = _nextQueryId++;\n\n private currentLocalId = 0;\n private pollingSubscription: Subscription | null = null;\n private onAbort$ = new Subject<void>();\n private currentPollConfig: PollConfig | null = null;\n\n /**\n * @internal\n * Used to track which components depend on this query.\n * The key is the component's _tNode index.\n * The value is the number of times the component has subscribed to this query.\n * The value might increase since we cant distinguish between a component and a host directive applied to it.\n */\n readonly _dependents: Record<number, number> = {};\n\n /**\n * @internal\n */\n _dependentsChanged$ = new ReplaySubject<Record<number, number>>();\n\n /**\n * @internal\n */\n _isPollingPaused = false;\n\n private memoizedState$: Observable<V2QueryState<Data>> | null = null;\n\n private readonly _state$ = new BehaviorSubject<V2QueryState<Response>>({\n type: QueryStateType.Prepared,\n meta: { id: this.currentLocalId, triggeredVia: 'program' },\n });\n\n constructor(\n private readonly _client: V2QueryClient,\n\n /**\n * @internal\n */\n public readonly _queryConfig:\n | RestQueryConfig<Route, Response, Arguments, Store, Data, Id>\n | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>,\n\n /**\n * @internal\n */\n public readonly _routeWithParams: Route,\n\n /**\n * @internal\n */\n public readonly _arguments: Arguments,\n\n /**\n * @internal\n */\n public readonly _queryStoreKey: string,\n ) {}\n\n get state$(): Observable<V2QueryState<Data>> {\n if (!this.memoizedState$) {\n this.memoizedState$ = this._state$.pipe(\n tap((s) => {\n if (!this._client.config.logging?.preparedQuerySubscriptions) return;\n\n if (isQueryStatePrepared(s)) {\n console.warn(\n `Query ${this._routeWithParams} was subscribed to in the prepared state. Did you forget to call .execute()?`,\n );\n }\n }),\n switchMap((s) => this.transformState(s)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n }\n return this.memoizedState$;\n }\n\n /**\n * The current state of the query.\n *\n * **Warning!** This differs from the `state$` observable in that it does not use the query store. Thus, the response data might be outdated.\n * Use `state$` (or `firstValueFrom(state$)`) the most up-to-date data.\n */\n get rawState() {\n return this._state$.value;\n }\n\n get isExpired() {\n if (isQueryStateLoading(this.rawState)) {\n return false;\n }\n\n if (\n isQueryStatePrepared(this.rawState) ||\n isQueryStateCancelled(this.rawState) ||\n isQueryStateFailure(this.rawState)\n ) {\n return true;\n }\n\n const ts = this.rawState.meta.expiresAt;\n\n if (!ts) {\n return true;\n }\n\n return ts < Date.now();\n }\n\n get isInUse() {\n return this._state$.observed || Object.keys(this._dependents).length > 0;\n }\n\n /**\n * @internal\n */\n get _subscriberCount() {\n return this._state$.observers.length;\n }\n\n get isPolling() {\n return !!this.pollingSubscription;\n }\n\n get autoRefreshOnConfig() {\n const base = this._queryConfig.autoRefreshOn ?? {};\n\n const transformed: Readonly<QueryAutoRefreshConfig> = {\n queryClientDefaultHeadersChange: base.queryClientDefaultHeadersChange ?? true,\n windowFocus: base.windowFocus ?? true,\n };\n\n return transformed;\n }\n\n /**\n * @internal\n */\n get _enableSmartPolling() {\n return this._queryConfig.enableSmartPolling ?? true;\n }\n\n get store() {\n return this._queryConfig.entity?.store ?? null;\n }\n\n get canBeCached() {\n return v2ShouldCacheQuery(this._queryConfig.method);\n }\n\n get _isInMockMode() {\n return !!this._arguments?.mock;\n }\n\n execute(options: ExecuteQueryOptions = {}) {\n const { skipCache = false, _triggeredVia: triggeredVia = 'program', cancelPrevious = false } = options;\n const { authProvider } = this._client;\n const queryConfig = this._queryConfig;\n\n if (!this.isExpired && !skipCache && isQueryStateSuccess(this.rawState)) {\n return this;\n }\n\n if (queryConfig.secure && !authProvider && !this._isInMockMode) {\n throw new Error('Cannot execute secure query without auth provider');\n }\n\n const id = this.nextId;\n const meta: QueryStateMeta = { id, triggeredVia };\n\n if (isQueryStateLoading(this.rawState)) {\n if (cancelPrevious) {\n this.abort();\n } else {\n return this;\n }\n }\n\n this.updateState({ type: QueryStateType.Loading, meta });\n\n if (this._isInMockMode) {\n this.mockRequest({}, meta, options);\n } else {\n let goSignal = of(true);\n\n if (\n authProvider &&\n isBearerAuthProvider(authProvider) &&\n queryConfig.secure &&\n !isQueryStateSuccess(authProvider.currentRefreshQuery?.rawState)\n ) {\n // On page load the query might be executed before the auth provider has been initialized.\n // In this case we need to wait for the auth provider to be ready before we can execute the query.\n goSignal = combineLatest([\n // The tokens might get set without a refresh query being created (e.g.) directly after login.\n authProvider.currentRefreshQuery$.pipe(switchQueryState(), takeUntilResponse()),\n authProvider.tokens$.pipe(take(1)),\n ]).pipe(\n takeUntil(this.onAbort$),\n switchMap(([state, tokens]) => {\n if (state && isQueryStateLoading(state)) {\n return EMPTY;\n }\n\n if (isQueryStateFailure(state)) {\n this.updateEntityState({ type: 'failure', error: state.error, headers: {} }, meta, options);\n\n return EMPTY;\n }\n\n if (!state && !(tokens?.token || tokens?.refreshToken)) {\n return EMPTY;\n }\n\n return of(true as const);\n }),\n take(1),\n );\n }\n\n goSignal\n .pipe(\n switchMap(() => {\n const method = computeQueryMethod({ config: queryConfig, client: this._client });\n const body = computeQueryBody({ config: queryConfig, client: this._client, args: this._arguments, method });\n const headers = computeQueryHeaders({ client: this._client, config: queryConfig, args: this._arguments });\n\n return request<Response>({\n urlWithParams: this._routeWithParams as string,\n method,\n body,\n headers,\n reportProgress: queryConfig.reportProgress,\n responseType: queryConfig.responseType,\n withCredentials: queryConfig.withCredentials,\n cacheAdapter: this._client.config.request?.cacheAdapter,\n retryFn: this._client.config.request?.retryFn,\n }).pipe(\n tap((state) => this.updateEntityState(state, meta, options)),\n takeUntil(this.onAbort$),\n );\n }),\n )\n\n .subscribe();\n }\n\n return this;\n }\n\n abort() {\n if (!isQueryStateLoading(this.rawState)) {\n return this;\n }\n\n this.onAbort$.next();\n\n this.updateState({\n type: QueryStateType.Cancelled,\n meta: { id: this.rawState.meta.id, triggeredVia: this.rawState.meta.triggeredVia },\n });\n\n return this;\n }\n\n poll(config: PollConfig) {\n if (this.pollingSubscription) {\n return this;\n }\n\n this.currentPollConfig = config;\n\n const interval$ = interval(config.interval);\n const poll$ = interval$.pipe(\n skip(config.triggerImmediately ? 0 : 1),\n takeUntil(config.takeUntil),\n takeWhile(() => !this._isPollingPaused),\n filter(() => !isQueryStateLoading(this._state$.value)),\n );\n\n this.pollingSubscription = poll$.subscribe({\n next: () => this.execute({ skipCache: true, _triggeredVia: 'poll' }),\n complete: () => this.stopPolling(),\n });\n\n return this;\n }\n\n stopPolling() {\n this.pollingSubscription?.unsubscribe();\n this.pollingSubscription = null;\n this.currentPollConfig = null;\n\n return this;\n }\n\n pausePolling() {\n this.pollingSubscription?.unsubscribe();\n this.pollingSubscription = null;\n\n this._isPollingPaused = true;\n\n return this;\n }\n\n resumePolling() {\n if (!this._isPollingPaused || !this.currentPollConfig) {\n return this;\n }\n\n this._isPollingPaused = false;\n\n return this.poll({ ...this.currentPollConfig, triggerImmediately: true });\n }\n\n onSuccess(callback: (response: Data) => void) {\n this.state$.pipe(takeUntilResponse(), filterSuccess()).subscribe((state) => callback(state.response));\n return this;\n }\n\n onFailure(callback: (error: RequestError<unknown>) => void) {\n this.state$.pipe(takeUntilResponse(), filterFailure()).subscribe((state) => callback(state.error));\n return this;\n }\n\n /**\n * @internal\n */\n _addDependent(tNodeIndex: number) {\n if (!this._dependents[tNodeIndex]) {\n this._dependents[tNodeIndex] = 0;\n }\n\n this._dependents[tNodeIndex]++;\n\n this._dependentsChanged$.next(this._dependents);\n }\n\n /**\n * @internal\n */\n _removeDependent(tNodeIndex: number) {\n const count = this._dependents[tNodeIndex];\n if (count === undefined) {\n return;\n }\n\n if (this._dependents[tNodeIndex] !== undefined) {\n this._dependents[tNodeIndex]--;\n }\n\n if (count <= 1) {\n delete this._dependents[tNodeIndex];\n }\n\n this._dependentsChanged$.next(this._dependents);\n }\n\n /**\n * @internal\n */\n _hasDependents() {\n return Object.keys(this._dependents).length > 0;\n }\n\n private get nextId() {\n return ++this.currentLocalId;\n }\n\n private getBearerAuthProvider() {\n const authProvider = this._client.authProvider;\n\n if (authProvider && isBearerAuthProvider(authProvider)) {\n return authProvider;\n }\n\n return null;\n }\n\n private updateEntityState(requestEvent: RequestEvent<Response>, meta: QueryStateMeta, options?: ExecuteQueryOptions) {\n switch (requestEvent.type) {\n case 'start':\n case 'delay-retry': {\n const { type, retryDelay, retryNumber } = requestEvent;\n const newMeta: QueryStateMeta = { ...meta, isWaitingForRetry: type === 'delay-retry', retryDelay, retryNumber };\n\n this.updateState({\n type: QueryStateType.Loading,\n meta: newMeta,\n });\n break;\n }\n\n case 'upload-progress':\n case 'download-progress': {\n this.updateState({\n type: QueryStateType.Loading,\n progress: requestEvent.progress,\n partialText: 'partialText' in requestEvent ? requestEvent.partialText : undefined,\n meta,\n });\n\n break;\n }\n\n case 'success': {\n const { response, expiresInTimestamp, headers } = requestEvent;\n const isGql = isGqlQueryConfig(this._queryConfig);\n const responseData =\n isGql && typeof response === 'object' && !!response && 'data' in response\n ? (response['data'] as Response)\n : (response as Response);\n\n if (this._queryConfig.entity && this._queryConfig.entity.set) {\n const id = this._queryConfig.entity?.id({ args: this._arguments, response: responseData });\n\n this._queryConfig.entity?.set({\n args: this._arguments,\n response: responseData,\n id,\n store: this._queryConfig.entity.store,\n });\n }\n\n this.updateState({\n type: QueryStateType.Success,\n response: responseData,\n headers: headers,\n meta: { ...meta, expiresAt: expiresInTimestamp },\n });\n\n break;\n }\n\n case 'failure': {\n const { error } = requestEvent;\n const failure = () => this.updateState({ type: QueryStateType.Failure, error, meta });\n const bearerAuthProvider = this.getBearerAuthProvider();\n\n if (\n !bearerAuthProvider ||\n options?._isUnauthorizedRetry ||\n error.status !== 401 ||\n !bearerAuthProvider.shouldRefreshOnUnauthorizedResponse\n ) {\n return failure();\n }\n\n const query = bearerAuthProvider._refreshQuery();\n if (!query) return failure();\n\n query.state$\n .pipe(\n takeUntilResponse(),\n takeUntil(this.onAbort$),\n tap((state) =>\n isQueryStateSuccess(state) ? this.execute({ ...options, _isUnauthorizedRetry: true }) : failure(),\n ),\n )\n .subscribe();\n\n break;\n }\n\n case 'cancel': {\n this.updateState({\n type: QueryStateType.Cancelled,\n meta,\n });\n\n break;\n }\n }\n }\n\n private transformState(s: V2QueryState<Response>): Observable<V2QueryState<Data>> {\n if (!isQueryStateSuccess(s) || !this._queryConfig.entity?.get) {\n return of(s) as Observable<V2QueryState<Data>>;\n }\n\n const id = this._queryConfig.entity.id({ args: this._arguments, response: s.response });\n\n return this._queryConfig.entity\n .get({ args: this._arguments, id, response: s.response, store: this._queryConfig.entity.store })\n .pipe(map((v) => ({ ...s, response: v })));\n }\n\n private updateState(s: V2QueryState<Response>) {\n // We need to use untracked here to avoid Angular's \"allowSignalWrites is false\" error when executing queries inside Angular's computed/effect signal functions.\n untracked(() => this._state$.next(s));\n }\n\n private mockRequest(headers: RequestHeaders | undefined, meta: QueryStateMeta, options: ExecuteQueryOptions) {\n if (!this._arguments?.mock) return;\n\n const { delay = 200, error, response, retryIntoResponse = false, progress } = this._arguments.mock;\n const progressFileSize = progress?.fileSize ?? 1000000;\n const progressEventType = progress?.eventType ?? 'upload';\n const progressEventCount = progress?.eventCount ?? 5;\n const progressOmitTotal = progress?.omitTotal ?? false;\n const omitPartialText = progress?.omitPartialText ?? false;\n\n const finalResolveMock = () => {\n if (error) {\n this.updateEntityState({ error, headers: headers ?? {}, type: 'failure' }, meta, options);\n\n return;\n }\n\n this.updateEntityState(\n { response: response as Response, headers: headers ?? {}, type: 'success' },\n meta,\n options,\n );\n };\n\n if (progress) {\n interval(delay)\n .pipe(\n tap((a) => {\n if (a === progressEventCount + 1) {\n finalResolveMock();\n } else {\n const current = Math.min(progressFileSize * a, progressFileSize * progressEventCount);\n const percentage = (current / (progressFileSize * progressEventCount)) * 100;\n\n this.updateEntityState(\n {\n type: progressEventType === 'upload' ? 'upload-progress' : 'download-progress',\n headers: headers ?? {},\n progress: { current, ...(progressOmitTotal ? {} : { percentage, total: progressFileSize }) },\n partialText: omitPartialText ? undefined : `Partial text ${a}`,\n },\n meta,\n options,\n );\n }\n }),\n takeUntil(this.onAbort$),\n takeWhile((a) => a < progressEventCount + 1, true),\n )\n .subscribe();\n } else if (retryIntoResponse) {\n interval(delay)\n .pipe(\n tap((a) => {\n if (a === 3) {\n finalResolveMock();\n } else {\n const aModified = a + 1;\n this.updateEntityState(\n {\n type: 'delay-retry',\n headers: headers ?? {},\n retryDelay: 1000 + 1000 * aModified,\n retryNumber: aModified,\n },\n meta,\n options,\n );\n }\n }),\n takeUntil(this.onAbort$),\n takeWhile((a) => a < 3, true),\n )\n .subscribe();\n } else {\n timer(delay)\n .pipe(\n tap(() => finalResolveMock()),\n takeUntil(this.onAbort$),\n )\n .subscribe();\n }\n }\n}\n","import { AnyV2QueryCreator } from '../query-creator';\nimport { AuthProvider } from './auth-provider.types';\nimport { BasicAuthProvider } from './basic-auth-provider';\nimport { V2BearerAuthProvider } from './bearer-auth-provider';\nimport { CustomHeaderAuthProvider } from './custom-header-auth-provider';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isBasicAuthProvider = (authProvider: AuthProvider): authProvider is BasicAuthProvider =>\n authProvider instanceof BasicAuthProvider;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isBearerAuthProvider = <T extends AnyV2QueryCreator>(\n authProvider: AuthProvider,\n): authProvider is V2BearerAuthProvider<T> => authProvider instanceof V2BearerAuthProvider;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const isCustomHeaderAuthProvider = (authProvider: AuthProvider): authProvider is CustomHeaderAuthProvider =>\n authProvider instanceof CustomHeaderAuthProvider;\nexport { decryptBearer } from '../../http/internal/request-route';\n","import { deleteCookie, getCookie, setCookie } from '@ethlete/core';\nimport { BehaviorSubject, Subject, takeUntil, tap, timer } from 'rxjs';\nimport {\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStateSuccess,\n switchQueryState,\n takeUntilResponse,\n} from '../query';\nimport { AnyV2QueryCreator, ConstructQuery, QueryResponseOf } from '../query-creator';\nimport {\n AuthBearerRefreshStrategy,\n AuthProvider,\n AuthProviderBearerConfig,\n TokenResponse,\n} from './auth-provider.types';\nimport { decryptBearer } from './auth-provider.utils';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class V2BearerAuthProvider<T extends AnyV2QueryCreator> implements AuthProvider {\n private readonly destroy$ = new Subject<boolean>();\n private readonly _currentRefreshQuery$ = new BehaviorSubject<ConstructQuery<T> | null>(null);\n\n private readonly _tokens$ = new BehaviorSubject<TokenResponse>({\n token: null,\n refreshToken: null,\n });\n\n constructor(public _config: AuthProviderBearerConfig<T>) {\n const cookieEnabled = _config.refreshConfig?.cookieEnabled ?? true;\n const cookieToken =\n _config.refreshConfig?.cookieName && cookieEnabled ? (getCookie(_config.refreshConfig.cookieName) ?? null) : null;\n\n this._tokens$.next({\n token: _config.token || null,\n refreshToken: _config.refreshConfig?.token || cookieToken || null,\n });\n\n if (!this.tokens.token && !this.tokens.refreshToken) {\n if (!_config.refreshConfig?.cookieName) {\n console.error(\n 'A BearerAuthProvider was created without token or refresh token. You should provide at least a cookieName where the refresh token might be stored.',\n );\n }\n\n return;\n }\n\n if (this.tokens.token) {\n this.prepareForRefresh();\n\n if (this.tokens.refreshToken && this._config.refreshConfig?.cookieName && cookieEnabled) {\n this.setCookie();\n }\n } else if (this.tokens.refreshToken) {\n this._refreshQuery();\n }\n }\n\n get header() {\n return { Authorization: `Bearer ${this._tokens$.getValue().token}` };\n }\n\n get tokens$() {\n return this._tokens$.asObservable();\n }\n\n get tokens() {\n return this._tokens$.getValue();\n }\n\n get currentRefreshQuery$() {\n return this._currentRefreshQuery$.asObservable();\n }\n\n get currentRefreshQuery() {\n return this._currentRefreshQuery$.getValue();\n }\n\n get shouldRefreshOnUnauthorizedResponse() {\n return (\n !!this._config.refreshConfig &&\n (this._config.refreshConfig.refreshOnUnauthorizedResponse === undefined ||\n this._config.refreshConfig.refreshOnUnauthorizedResponse)\n );\n }\n\n cleanUp() {\n this.destroy$.next(true);\n this.destroy$.unsubscribe();\n this._currentRefreshQuery$.next(null);\n\n if (this._config.refreshConfig?.cookieName) {\n this.deleteCookie();\n }\n }\n\n enableCookie() {\n if (!this._config.refreshConfig?.cookieName) {\n throw new Error('No cookie name was provided');\n }\n\n if (!this.tokens.refreshToken) {\n throw new Error('No refresh token was provided');\n }\n\n this._config.refreshConfig.cookieEnabled = true;\n\n this.setCookie();\n }\n\n disableCookie() {\n if (!this._config.refreshConfig?.cookieName) {\n throw new Error('No cookie name was provided');\n }\n\n this._config.refreshConfig.cookieEnabled = false;\n\n this.deleteCookie();\n }\n\n forceRefresh() {\n return this._refreshQuery();\n }\n\n /**\n * @internal\n */\n _refreshQuery() {\n const currentQuery = this._currentRefreshQuery$.getValue();\n\n if (isQueryStateLoading(currentQuery?.rawState)) {\n return currentQuery;\n }\n\n const currentRefreshToken = this.tokens.refreshToken;\n\n if (!currentRefreshToken || !this._config.refreshConfig) {\n return;\n }\n\n const args = this._config.refreshConfig.requestArgsAdapter?.({\n token: this.tokens.token,\n refreshToken: currentRefreshToken,\n }) ?? {\n body: { refreshToken: currentRefreshToken },\n };\n\n const query = this._config.refreshConfig.queryCreator\n .prepare(args)\n .execute({ skipCache: true, _isUnauthorizedRetry: true });\n\n this._currentRefreshQuery$.next(query as ConstructQuery<T>);\n\n this._currentRefreshQuery$\n .pipe(\n switchQueryState(),\n tap((state) => {\n if (isQueryStateSuccess(state)) {\n if (this._config.refreshConfig?.responseAdapter) {\n const tokens = this._config.refreshConfig.responseAdapter(state.response as QueryResponseOf<T>);\n\n this._tokens$.next(tokens);\n } else {\n this._tokens$.next({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n token: (state.response as any)['token'],\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n refreshToken: (state.response as any)['refreshToken'],\n });\n }\n const cookieEnabled = this._config.refreshConfig?.cookieEnabled ?? true;\n\n if (this._config.refreshConfig?.cookieName && this.tokens.refreshToken && cookieEnabled) {\n this.setCookie();\n }\n\n this.prepareForRefresh();\n } else if (isQueryStateFailure(state)) {\n this._tokens$.next({ token: null, refreshToken: null });\n\n if (this._config.refreshConfig?.cookieName) {\n this.deleteCookie();\n }\n }\n }),\n takeUntilResponse(),\n takeUntil(this.destroy$),\n )\n .subscribe();\n\n return query;\n }\n\n private setCookie() {\n if (!this._config.refreshConfig?.cookieName || !this.tokens.refreshToken) return;\n\n setCookie(\n this._config.refreshConfig.cookieName,\n this.tokens.refreshToken,\n this._config.refreshConfig.cookieExpiresInDays,\n this._config.refreshConfig.cookieDomain,\n this._config.refreshConfig.cookiePath,\n this._config.refreshConfig.cookieSameSite,\n );\n }\n\n private deleteCookie() {\n if (!this._config.refreshConfig?.cookieName) return;\n\n deleteCookie(\n this._config.refreshConfig.cookieName,\n this._config.refreshConfig.cookiePath,\n this._config.refreshConfig.cookieDomain,\n );\n }\n\n private prepareForRefresh() {\n if (!this.tokens.token || !this._config.refreshConfig) {\n return;\n }\n\n const bearer = decryptBearer(this.tokens.token);\n\n if (!bearer) {\n return;\n }\n\n const expiresInPropertyName = this._config.refreshConfig.expiresInPropertyName || 'exp';\n const expiresIn = bearer[expiresInPropertyName] as number | undefined;\n const fiveMinutes = 5 * 60 * 1000;\n const refreshBuffer = this._config.refreshConfig.refreshBuffer ?? fiveMinutes;\n\n if (expiresIn === undefined) {\n throw new Error(`Bearer token does not contain an '${expiresInPropertyName}' property`);\n }\n\n const remainingTime = new Date(expiresIn * 1000).getTime() - refreshBuffer - new Date().getTime();\n\n const strategy = this._config.refreshConfig.strategy ?? AuthBearerRefreshStrategy.BeforeExpiration;\n\n switch (strategy) {\n case AuthBearerRefreshStrategy.BeforeExpiration:\n timer(remainingTime)\n .pipe(takeUntil(this.destroy$))\n .subscribe(() => this._refreshQuery());\n break;\n }\n }\n}\n","import { signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { defineProvider, toInjectFn, toProvideFn } from '@ethlete/core';\n\nconst INFINITY_QUERY_RESPONSE_DELAY_DEF = /* @__PURE__ */ defineProvider(\n () => {\n const enabled = signal(false);\n const enabled$ = toObservable(enabled);\n\n return {\n enabled,\n enabled$,\n };\n },\n { name: 'Infinity Query Response Delay' },\n);\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const provideInfinityQueryResponseDelay = /* @__PURE__ */ toProvideFn(INFINITY_QUERY_RESPONSE_DELAY_DEF);\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const injectInfinityQueryResponseDelay = /* @__PURE__ */ toInjectFn(INFINITY_QUERY_RESPONSE_DELAY_DEF);\n","import { BehaviorSubject, Observable, combineLatest, map, of, shareReplay, switchMap, tap } from 'rxjs';\nimport { AnyLegacyQueryCreator } from '../interop';\nimport { filterSuccess } from '../query';\nimport { AnyV2QueryCreator, ConstructQuery, QueryDataOf, V2QueryArgsOf } from '../query-creator';\nimport { InfinityQueryConfig, InfinityQueryParamLocation } from './infinity-query.types';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class InfinityQuery<\n QueryCreator extends AnyV2QueryCreator | AnyLegacyQueryCreator,\n Query extends ConstructQuery<QueryCreator>,\n Args extends V2QueryArgsOf<QueryCreator>,\n QueryResponse extends QueryDataOf<QueryCreator>,\n InfinityResponse extends unknown[],\n> {\n private readonly queries$ = new BehaviorSubject<Query[]>([]);\n private readonly _currentPage$ = new BehaviorSubject<number | null>(null);\n private readonly _currentCalculatedPage$ = new BehaviorSubject<number | null>(null);\n private readonly _totalPages$ = new BehaviorSubject<number | null>(null);\n private readonly _itemsPerPage$ = new BehaviorSubject<number>(10);\n\n private readonly _data$ = this.queries$.pipe(\n switchMap((queries) => {\n if (!queries.length) {\n return of([]);\n }\n\n return combineLatest(\n queries.map((query) =>\n query.state$.pipe(\n filterSuccess(),\n map((state) => ({ state, query })),\n ),\n ),\n );\n }),\n tap((stateMaps) => {\n const lastState = stateMaps[stateMaps.length - 1]?.state;\n const lastQuery = stateMaps[stateMaps.length - 1]?.query;\n\n if (!lastState || !lastQuery) {\n return;\n }\n\n const totalPages =\n this._config.response.totalPagesExtractor?.({\n response: lastState.response as QueryResponse,\n itemsPerPage: this.itemsPerPage,\n args: lastQuery._arguments,\n }) ??\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (lastState.response as any)?.totalPages ??\n null;\n\n this._totalPages$.next(totalPages);\n }),\n map((stateMaps) => {\n if (!stateMaps.length) {\n return null;\n }\n\n const fullData = stateMaps.reduce(\n (acc, stateMap) => {\n const valExtractFn = this._config?.response?.valueExtractor;\n let data = valExtractFn\n ? valExtractFn?.(stateMap.state.response as QueryResponse)\n : (stateMap.state.response as InfinityResponse);\n\n if (this._config.response.reverse) {\n data = [...data].reverse() as InfinityResponse;\n }\n\n if (this._config.response.appendItemsTo === 'start') {\n acc.unshift(...data);\n } else {\n acc.push(...data);\n }\n return acc;\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [] as any as InfinityResponse,\n );\n\n return fullData;\n }),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n private readonly lastQuery$ = this.queries$.pipe(\n map((queries) => queries[queries.length - 1] ?? null),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n\n constructor(\n private _config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>,\n private _destroy$: Observable<boolean>,\n ) {\n this._itemsPerPage$.next(this._config.limitParam?.value ?? 10);\n }\n\n get currentPage$() {\n return this._currentPage$.asObservable();\n }\n\n get currentPage() {\n return this._currentPage$.getValue();\n }\n\n get currentCalculatedPage$() {\n return this._currentCalculatedPage$.asObservable();\n }\n\n get currentCalculatedPage() {\n return this._currentCalculatedPage$.getValue();\n }\n\n get totalPages$() {\n return this._totalPages$.asObservable();\n }\n\n get totalPages() {\n return this._totalPages$.getValue();\n }\n\n get itemsPerPage$() {\n return this._itemsPerPage$.asObservable();\n }\n\n get itemsPerPage() {\n return this._itemsPerPage$.getValue();\n }\n\n get data$() {\n return this._data$;\n }\n\n get currentQuery$() {\n return this.lastQuery$;\n }\n\n nextPage() {\n const newPage = (this._currentPage$.value ?? 0) + 1;\n const calculatedPage =\n this._config?.pageParam?.valueCalculator?.({\n page: newPage,\n totalPages: this.totalPages,\n itemsPerPage: this.itemsPerPage,\n }) ?? newPage;\n\n if (this.totalPages !== null && newPage > this.totalPages) {\n console.error(\n 'Cannot load more pages, already at the end. Make sure to not render the infinity query trigger using *ngIf canLoadMore',\n );\n\n return;\n }\n\n const args = this.prepareArgs(this._config, calculatedPage);\n\n const query = this._config.queryCreator.prepare(args).execute() as Query;\n\n if (this._config.pollingInterval) {\n query.poll({ interval: this._config.pollingInterval, takeUntil: this._destroy$ });\n }\n\n this.queries$.next([...this.queries$.value, query]);\n\n this._currentPage$.next(newPage);\n this._currentCalculatedPage$.next(calculatedPage);\n }\n\n reset(\n newConfig?: Omit<\n InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>,\n 'queryCreator' | 'response'\n >,\n ) {\n this._config = { ...this._config, ...(newConfig ?? {}) };\n\n this._currentPage$.next(null);\n this._currentCalculatedPage$.next(null);\n this._totalPages$.next(null);\n this._itemsPerPage$.next(this._config.limitParam?.value ?? 10);\n this.queries$.next([]);\n\n this.nextPage();\n }\n\n private prepareArgs(config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>, page: number) {\n const pageParamLocation = this.getPageParamLocation(config?.pageParam?.location);\n\n const pageArgs = {\n [pageParamLocation]: {\n [config?.pageParam?.key ?? 'page']: page,\n },\n };\n\n const limitParamLocation = this.getPageParamLocation(config?.limitParam?.location);\n\n const limitArgs = {\n [limitParamLocation]: {\n [config?.limitParam?.key ?? 'limit']: config?.limitParam?.value ?? 10,\n },\n };\n\n const defaultConfig = config?.defaultArgs ?? {};\n\n const mergedArgs =\n pageParamLocation === limitParamLocation\n ? {\n ...defaultConfig,\n [pageParamLocation]: {\n ...(config?.defaultArgs?.[pageParamLocation] ?? {}),\n ...pageArgs[limitParamLocation],\n ...limitArgs[limitParamLocation],\n },\n }\n : {\n ...defaultConfig,\n [pageParamLocation]: {\n ...(config?.defaultArgs?.[pageParamLocation] ?? {}),\n ...pageArgs[pageParamLocation],\n },\n [limitParamLocation]: {\n ...(config?.defaultArgs?.[limitParamLocation] ?? {}),\n ...limitArgs[limitParamLocation],\n },\n };\n\n return mergedArgs;\n }\n\n private getPageParamLocation(location: InfinityQueryParamLocation | undefined) {\n const loc = location ?? 'query';\n\n switch (loc) {\n case 'path':\n return 'pathParams';\n case 'query':\n return 'queryParams';\n case 'body':\n return 'body';\n case 'header':\n return 'headers';\n case 'variable':\n return 'variables';\n default:\n throw new Error(`Invalid pageParamLocation: ${loc}`);\n }\n }\n}\n","import { AnyLegacyQueryCreator } from '../interop';\nimport { AnyV2QueryCreator, QueryDataOf, V2QueryArgsOf } from '../query-creator';\nimport { InfinityQueryConfig, PageParamCalculatorOptions } from './infinity-query.types';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const createInfinityQueryConfig = <\n QueryCreator extends AnyV2QueryCreator | AnyLegacyQueryCreator,\n Args extends V2QueryArgsOf<QueryCreator>,\n QueryResponse extends QueryDataOf<QueryCreator>,\n InfinityResponse extends unknown[],\n>(\n config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>,\n) => config;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const skipPaginationPageParamCalculator = ({ page, itemsPerPage }: PageParamCalculatorOptions) =>\n itemsPerPage * (page - 1);\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n ChangeDetectorRef,\n Directive,\n ErrorHandler,\n inject,\n InjectionToken,\n Input,\n TemplateRef,\n ViewContainerRef,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { createDestroy } from '@ethlete/core';\nimport { BehaviorSubject, combineLatest, Subject, takeUntil, tap, withLatestFrom } from 'rxjs';\nimport { InfinityQuery, InfinityQueryConfig, InfinityQueryOf } from '../infinite-query';\nimport { AnyLegacyQueryCreator, isLegacyQuery } from '../interop';\nimport {\n BaseArguments,\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStateSuccess,\n switchQueryState,\n} from '../query';\nimport { AnyV2QueryCreator, ConstructQuery } from '../query-creator';\nimport { RequestError } from '../request';\nimport {\n injectInfinityQueryResponseDelay,\n provideInfinityQueryResponseDelay,\n} from './infinity-query-response-delay-provider';\n\ntype InfinityQueryContext<\n Q extends InfinityQueryConfig<DirectiveQueryCreator, BaseArguments | undefined, any, unknown[]>,\n> = {\n $implicit: Q['response']['arrayType'] | null;\n etInfinityQuery: Q['response']['arrayType'] | null;\n loading: boolean;\n error: RequestError<unknown> | null;\n\n isFirstLoad: boolean;\n canLoadMore: boolean;\n currentPage: number | null;\n currentCalculatedPage: number | null;\n totalPages: number | null;\n itemsPerPage: number | null;\n\n currentQuery: ConstructQuery<Q['queryCreator']> | null;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const INFINITY_QUERY_TOKEN = new InjectionToken<InfinityQueryDirective<any>>('INFINITY_QUERY_TOKEN');\n\ntype DirectiveQueryCreator = AnyV2QueryCreator | AnyLegacyQueryCreator;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\n@Directive({\n selector: '[etInfinityQuery]',\n exportAs: 'etInfinityQuery',\n\n providers: [\n { provide: INFINITY_QUERY_TOKEN, useExisting: InfinityQueryDirective },\n provideInfinityQueryResponseDelay(),\n ],\n})\nexport class InfinityQueryDirective<\n Q extends InfinityQueryConfig<DirectiveQueryCreator, BaseArguments | undefined, any, unknown[]>,\n> {\n private readonly queryConfigChanged$ = new Subject<boolean>();\n private readonly viewContext: InfinityQueryContext<Q> = {\n $implicit: null,\n etInfinityQuery: null,\n loading: false,\n error: null,\n\n isFirstLoad: false,\n canLoadMore: false,\n currentPage: null,\n currentCalculatedPage: null,\n totalPages: null,\n itemsPerPage: null,\n\n currentQuery: null,\n };\n private infinityQueryInstance: InfinityQueryOf<Q> | null = null;\n\n private readonly destroy$ = createDestroy();\n private cdr = inject(ChangeDetectorRef);\n private viewContainerRef = inject(ViewContainerRef);\n private mainTemplateRef = inject(TemplateRef<InfinityQueryContext<Q>>);\n private errorHandler = inject(ErrorHandler);\n private readonly infinityQueryResponseDelay = injectInfinityQueryResponseDelay({ host: true });\n\n private readonly _data$ = new BehaviorSubject<Q['response']['arrayType']>([]);\n\n // TODO: Skipped for migration because:\n // Accessor inputs cannot be migrated as they are too complex.\n @Input('etInfinityQuery')\n get infinityQuery(): Q {\n return this._infinityQuery;\n }\n set infinityQuery(v: Q) {\n this.cleanup();\n\n if (v.enabled === false) {\n this._infinityQuery = v;\n this.infinityQueryInstance = null;\n\n return;\n }\n\n this._infinityQuery = v;\n this.infinityQueryInstance = this.setupInfinityQuery(v);\n this.infinityQueryInstance.nextPage();\n }\n private _infinityQuery!: Q;\n\n get context() {\n return this.viewContext;\n }\n\n get instance() {\n return this.infinityQueryInstance;\n }\n\n get data$() {\n return this._data$.asObservable();\n }\n\n data = toSignal(this._data$, { requireSync: true });\n\n static ngTemplateContextGuard<\n Q extends InfinityQueryConfig<DirectiveQueryCreator, BaseArguments | undefined, any, unknown[]>,\n >(_dir: InfinityQueryDirective<Q>, _ctx: unknown): _ctx is InfinityQueryContext<Q> {\n return true;\n }\n\n constructor() {\n this.viewContainerRef.createEmbeddedView(this.mainTemplateRef, this.viewContext);\n }\n\n private setupInfinityQuery(config: Q) {\n const instance = new InfinityQuery(config as any, this.destroy$) as InfinityQueryOf<Q>;\n\n combineLatest([\n instance.currentQuery$.pipe(switchQueryState(), withLatestFrom(instance.currentQuery$)),\n this.infinityQueryResponseDelay.enabled$,\n instance.data$,\n ])\n .pipe(\n tap(([[state, currentQuery], isDelayed, infinityArray]) => {\n this.viewContext.currentPage = instance.currentPage;\n this.viewContext.totalPages = instance.totalPages;\n this.viewContext.itemsPerPage = instance.itemsPerPage;\n this.viewContext.canLoadMore =\n (instance.totalPages !== null &&\n instance.currentPage !== null &&\n instance.totalPages > instance.currentPage) ||\n false;\n this.viewContext.currentCalculatedPage = instance.currentCalculatedPage;\n this.viewContext.currentQuery = currentQuery;\n\n if (isQueryStateLoading(state) || isDelayed || !infinityArray) {\n this.viewContext.loading = state ? state.meta.triggeredVia !== 'poll' : true;\n this.viewContext.error = null;\n this.viewContext.isFirstLoad = this.context.etInfinityQuery === null;\n } else if (isQueryStateFailure(state)) {\n this.viewContext.loading = false;\n this.viewContext.error = state.error;\n this.viewContext.isFirstLoad = false;\n\n if (isLegacyQuery(currentQuery)) {\n this.errorHandler.handleError(state.error.httpErrorResponse);\n }\n } else if (isQueryStateSuccess(state)) {\n this.viewContext.loading = false;\n this.viewContext.error = null;\n this.viewContext.isFirstLoad = false;\n this.viewContext.etInfinityQuery = this.viewContext.$implicit = infinityArray as Q['response']['arrayType'];\n this._data$.next(infinityArray);\n }\n\n this.cdr.markForCheck();\n }),\n takeUntil(this.destroy$),\n takeUntil(this.queryConfigChanged$),\n )\n .subscribe();\n\n return instance;\n }\n\n loadNextPage() {\n if (!this.infinityQueryInstance) {\n return;\n }\n\n if (this.viewContext.loading) {\n return;\n }\n\n this.infinityQueryInstance.nextPage();\n }\n\n reset(newConfig?: Omit<Q, 'queryCreator' | 'response'>) {\n if (!this.infinityQueryInstance) {\n return;\n }\n\n this.infinityQueryInstance.reset(newConfig as any);\n }\n\n private cleanup() {\n this.queryConfigChanged$.next(true);\n\n this.viewContext.loading = false;\n this.viewContext.error = null;\n this.viewContext.etInfinityQuery = null;\n this.viewContext.$implicit = null;\n\n this.viewContext.isFirstLoad = false;\n this.viewContext.canLoadMore = false;\n this.viewContext.currentPage = null;\n this.viewContext.itemsPerPage = null;\n this.viewContext.totalPages = null;\n\n this.viewContext.currentQuery = null;\n\n this._data$.next([]);\n }\n}\n","import { computed, Directive, ElementRef, inject, input, OnDestroy, OnInit } from '@angular/core';\nimport { fromEvent, Subject, takeUntil } from 'rxjs';\nimport { INFINITY_QUERY_TOKEN, InfinityQueryDirective } from './infinity-query.directive';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\n@Directive({\n selector: '[etInfinityQueryTrigger], et-infinity-query-trigger',\n})\nexport class InfinityQueryTriggerDirective implements OnInit, OnDestroy {\n private elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private _infinityQuery = inject(INFINITY_QUERY_TOKEN);\n\n scrollContainerSelector = input<string | null>(null);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n infinityQueryOverride = input<InfinityQueryDirective<any> | null>(null);\n\n private destroy = new Subject<boolean>();\n private observer: IntersectionObserver | null = null;\n\n click$ = fromEvent(this.elementRef.nativeElement, 'click');\n\n infinityQuery = computed(() => this.infinityQueryOverride() ?? this._infinityQuery);\n\n ngOnInit() {\n const isInteractive = this.elementRef.nativeElement.tagName === 'BUTTON';\n\n if (isInteractive) {\n this.click$.pipe(takeUntil(this.destroy)).subscribe(() => this.infinityQuery().loadNextPage());\n } else {\n this.setupIntersectionObserver();\n }\n }\n\n ngOnDestroy() {\n this.destroy.next(true);\n this.destroy.unsubscribe();\n this.observer?.disconnect();\n }\n\n private setupIntersectionObserver() {\n const scrollContainerSelector = this.scrollContainerSelector();\n this.observer = new IntersectionObserver(\n (entries) => {\n const entry = entries[0];\n\n if (!entry) return;\n\n if (entry.isIntersecting && !this.infinityQuery().context.loading) {\n this.infinityQuery().loadNextPage();\n }\n },\n {\n root: scrollContainerSelector ? document.querySelector(scrollContainerSelector) : null,\n rootMargin: '0px',\n threshold: [0.25, 0.5, 0.75, 1],\n },\n );\n\n this.observer.observe(this.elementRef.nativeElement);\n }\n}\n","import {\n ChangeDetectorRef,\n Directive,\n ErrorHandler,\n TemplateRef,\n ViewContainerRef,\n effect,\n inject,\n input,\n untracked,\n} from '@angular/core';\nimport { AnyLegacyQuery, isLegacyQuery } from '../interop';\nimport {\n AnyQueryCollection,\n AnyV2Query,\n QueryCollectionKeysOf,\n QueryOf,\n extractQuery,\n isQueryCollection,\n isQueryStateCancelled,\n isQueryStateFailure,\n isQueryStateLoading,\n isQueryStatePrepared,\n isQueryStateSuccess,\n} from '../query';\nimport { QueryDataOf } from '../query-creator';\nimport { RequestError, RequestProgress } from '../request';\nimport { queryStateSignal } from '../utils';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type QueryDirectiveContext<Q extends QueryDirectiveType | null> = {\n /**\n * The queries's response data.\n */\n $implicit: QueryDataOf<QueryOf<Q>> | null;\n\n /**\n * The queries's response data.\n */\n etQuery: QueryDataOf<QueryOf<Q>> | null;\n\n /**\n * The query used inside this directive. Useful if for instance the query gets unwrapped via async pipe inside the directive.\n */\n query: QueryOf<Q> | null;\n\n /**\n * Is true when the query is triggered by user interaction.\n */\n loading: boolean;\n\n /**\n * Is true when the query is triggered by either polling or auto refresh event.\n */\n refreshing: boolean;\n\n /**\n * The query's progress state.\n */\n progress: RequestProgress | null;\n\n /**\n * The query's error state.\n */\n error: RequestError<unknown> | null;\n\n /**\n * The query's scope (only available when the query is a collection)\n */\n scope: QueryCollectionKeysOf<Q> | null;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type QueryDirectiveType = AnyV2Query | AnyLegacyQuery | AnyQueryCollection;\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\n@Directive({\n selector: '[etQuery]',\n})\nexport class QueryDirective<Q extends QueryDirectiveType | null> {\n private errorHandler = inject(ErrorHandler);\n private cdr = inject(ChangeDetectorRef);\n\n private readonly viewContext: QueryDirectiveContext<Q> = {\n $implicit: null,\n etQuery: null,\n loading: false,\n refreshing: false,\n error: null,\n progress: null,\n scope: null,\n query: null,\n };\n\n query = input.required<Q>({ alias: 'etQuery' });\n\n cache = input(false, { alias: 'etQueryCache' });\n\n queryState = queryStateSignal(this.query);\n\n static ngTemplateContextGuard<Q extends QueryDirectiveType | null>(\n _dir: QueryDirective<Q>,\n _ctx: unknown,\n ): _ctx is QueryDirectiveContext<Q> {\n return true;\n }\n\n constructor() {\n inject(ViewContainerRef).createEmbeddedView(inject(TemplateRef), this.viewContext);\n\n effect(() => {\n const query = extractQuery(this.query());\n\n untracked(() => {\n if (!query) {\n this.viewContext.$implicit = null;\n this.viewContext.etQuery = null;\n this.viewContext.loading = false;\n this.viewContext.refreshing = false;\n this.viewContext.error = null;\n this.viewContext.progress = null;\n this.viewContext.scope = null;\n this.viewContext.query = null;\n\n return;\n }\n\n if (isQueryStatePrepared(query.rawState) || isQueryStateCancelled(query.rawState)) {\n query.execute();\n }\n\n this.viewContext.scope = isQueryCollection(query) ? (query.type as QueryCollectionKeysOf<Q>) : null;\n this.viewContext.query = query as QueryOf<Q>;\n });\n });\n\n effect(() => {\n const state = this.queryState();\n const cache = this.cache();\n\n untracked(() => {\n if (isQueryStateLoading(state)) {\n this.viewContext.progress = state.progress ?? null;\n this.viewContext.refreshing = state.meta.triggeredVia === 'auto' || state.meta.triggeredVia === 'poll';\n\n if (!this.viewContext.refreshing) {\n this.viewContext.loading = true;\n }\n } else {\n this.viewContext.loading = false;\n this.viewContext.refreshing = false;\n this.viewContext.progress = null;\n }\n\n if (isQueryStateSuccess(state)) {\n this.viewContext.etQuery = state.response as QueryDataOf<QueryOf<Q>>;\n this.viewContext.$implicit = state.response as QueryDataOf<QueryOf<Q>>;\n } else if (!cache) {\n this.viewContext.etQuery = null;\n this.viewContext.$implicit = null;\n }\n\n if (isQueryStateFailure(state)) {\n this.viewContext.error = state.error;\n\n if (isLegacyQuery(extractQuery(this.query()))) {\n this.errorHandler.handleError(state.error.httpErrorResponse);\n }\n } else {\n this.viewContext.error = null;\n }\n\n this.cdr.markForCheck();\n });\n });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { AnyV2Query } from '../../query';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\n@Pipe({ name: 'queryShortName' })\nexport class QueryShortNamePipe implements PipeTransform {\n transform(value: AnyV2Query) {\n const route = value._routeWithParams;\n\n if (typeof route === 'string') {\n // given an url that looks like this: https://api.github.com/repos/EladBezalel/etimo-achievements or https://api.github.com/repos/EladBezalel/etimo-achievements?test=1&test2=2\n // we want to extract the last 3 parts of the url, so we get: repos/EladBezalel/etimo-achievements\n\n const parts = route.split('/');\n\n if (parts.length > 3) {\n return `.../${parts.slice(parts.length - 3).join('/')}`;\n }\n\n return route;\n }\n\n return route as string;\n }\n}\n","import { InjectionToken, isDevMode } from '@angular/core';\nimport { V2QueryClient } from '../../query-client';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type QueryClientDevtoolsOptions = {\n displayName?: string;\n client: V2QueryClient;\n};\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const QUERY_CLIENT_DEVTOOLS_TOKEN = new InjectionToken<QueryClientDevtoolsOptions[]>(\n 'QUERY_CLIENT_DEVTOOLS_TOKEN',\n);\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const provideQueryClientForDevtools = (queryClient: QueryClientDevtoolsOptions) => {\n if (!isDevMode()) {\n console.warn(\n 'You are using the Query Devtools in production mode. This increases the size of your bundle and should only be used for development purposes.',\n );\n }\n\n return {\n provide: QUERY_CLIENT_DEVTOOLS_TOKEN,\n useValue: queryClient,\n multi: true,\n };\n};\n","import { AsyncPipe, JsonPipe, NgClass } from '@angular/common';\nimport {\n ChangeDetectorRef,\n Component,\n TrackByFunction,\n ViewEncapsulation,\n computed,\n effect,\n inject,\n signal,\n untracked,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl, ReactiveFormsModule } from '@angular/forms';\nimport { createDestroy, nextFrame } from '@ethlete/core';\nimport { BehaviorSubject, map, of, startWith, switchMap, takeUntil, tap } from 'rxjs';\nimport { BasicAuthProvider, CustomHeaderAuthProvider, isBearerAuthProvider } from '../../../auth';\nimport { QueryDirective } from '../../../directives';\nimport { EntityStore } from '../../../entity';\nimport { AnyV2Query, isGqlQueryConfig } from '../../../query';\nimport { QueryShortNamePipe } from '../../pipes';\nimport { QUERY_CLIENT_DEVTOOLS_TOKEN, QueryClientDevtoolsOptions } from '../../utils';\n\ntype QueryDevtoolsSnapLayout = 'full' | 'left' | 'right' | 'bottom' | 'top';\ntype QueryListMode = 'live' | 'history';\ntype QueryViewMode = 'query' | 'authProvider';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\n@Component({\n selector: 'et-query-devtools',\n templateUrl: './query-devtools.component.html',\n styleUrl: './query-devtools.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom,\n imports: [AsyncPipe, JsonPipe, ReactiveFormsModule, NgClass, QueryShortNamePipe, QueryDirective],\n host: {\n class: 'et-query-devtools',\n },\n})\nexport class QueryDevtoolsComponent {\n private cdr = inject(ChangeDetectorRef);\n\n protected queryClientConfigs = inject(QUERY_CLIENT_DEVTOOLS_TOKEN);\n protected readonly _destroy$ = createDestroy();\n\n protected isOpen = signal(false);\n protected isTranslucent = signal(false);\n protected snapLayout = signal<QueryDevtoolsSnapLayout>('full');\n protected queryListMode = signal<QueryListMode>('live');\n protected viewMode = signal<QueryViewMode>('query');\n\n protected showResponse = signal(false);\n protected showRawResponse = signal(false);\n protected showQueryConfig = signal(false);\n protected showEntityStoreValue = signal(false);\n protected showArguments = signal(false);\n\n protected selectedClientIdCtrl = new FormControl(0);\n\n protected selectedClientId = toSignal(\n this.selectedClientIdCtrl.valueChanges.pipe(startWith(this.selectedClientIdCtrl.value)),\n );\n protected selectedQueryId = signal<number | null>(null);\n\n protected selectedClientConfig = computed(() => {\n const configs = this.queryClientConfigs;\n const index = configs.length === 1 ? 0 : (this.selectedClientId() ?? 0);\n const config = configs[index] ?? configs[0];\n\n if (!config) {\n throw new Error('QueryDevtools: no query client configs registered');\n }\n\n return config;\n });\n\n protected queryStore = computed(() => {\n const config = this.selectedClientConfig();\n\n return config.client._store;\n });\n\n protected queryStore$ = toObservable(this.queryStore);\n\n private readonly queries$ = new BehaviorSubject<AnyV2Query[]>([]);\n protected queries = toSignal(this.queries$);\n\n protected readonly queryHistory$ = new BehaviorSubject<AnyV2Query[]>([]);\n\n protected selectedQuery = computed(() => {\n const id = this.selectedQueryId();\n const mode = this.queryListMode();\n\n if (id === null || !mode) {\n return null;\n }\n\n if (mode === 'live') {\n return this.queries()?.find((q) => q._id === id) ?? null;\n }\n\n return this.queryHistory$.getValue()?.find((q) => q._id === id) ?? null;\n });\n\n protected selectedQuery$ = toObservable(this.selectedQuery);\n\n protected selectedQueryEntityStore = computed(() => {\n const query = this.selectedQuery();\n\n if (!query) return null;\n\n return query.store as EntityStore<unknown> | null;\n });\n\n protected selectedQueryEntityStore$ = toObservable(this.selectedQueryEntityStore);\n\n protected readonly selectedQueryEntityStoreValue$ = this.selectedQueryEntityStore$.pipe(\n switchMap(\n (s) =>\n s?._change$.pipe(\n startWith(''),\n map(() => {\n if (!s._dictionary) return null;\n\n return Array.from(s._dictionary).reduce(\n (obj, [key, value]) => {\n obj[key] = value;\n return obj;\n },\n {} as Record<string, unknown>,\n );\n }),\n ) ?? of(null),\n ),\n );\n\n protected stringifiedQueryConfig = computed(() => {\n const query = this.selectedQuery();\n\n if (!query) return null;\n\n const cfg = query._queryConfig;\n const route =\n typeof cfg.route === 'string' ? cfg.route : cfg.route ? cfg.route({}).replace(/undefined/g, ':param') : null;\n\n const sharedCfg = {\n method: cfg.method,\n secure: cfg.secure,\n route,\n reportProgress: cfg.reportProgress,\n responseType: cfg.responseType,\n withCredentials: cfg.withCredentials,\n autoRefreshOn: cfg.autoRefreshOn,\n enableSmartPolling: cfg.enableSmartPolling,\n hasEntityStore: !!cfg.entity,\n };\n\n if (isGqlQueryConfig(cfg)) {\n return {\n ...sharedCfg,\n query: cfg.query,\n transferVia: cfg.transferVia,\n };\n }\n\n return {\n ...sharedCfg,\n };\n });\n\n protected authProvider = toSignal(\n toObservable(this.selectedClientConfig).pipe(switchMap((c) => c.client.authProvider$)),\n );\n\n protected authProviderDetails = computed(() => {\n const provider = this.authProvider();\n\n if (!provider) return null;\n\n if (provider instanceof CustomHeaderAuthProvider) {\n return {\n type: 'CustomHeaderAuthProvider',\n header: () => provider.header,\n provider: provider,\n config: {\n name: provider._config.name,\n value: provider._config.value,\n },\n } as const;\n } else if (provider instanceof BasicAuthProvider) {\n return {\n type: 'BasicAuthProvider',\n header: () => provider.header,\n provider: provider,\n config: {\n username: provider._config.username,\n password: provider._config.password,\n },\n } as const;\n } else if (isBearerAuthProvider(provider)) {\n const refreshCfg = provider._config.refreshConfig;\n\n return {\n type: 'BearerAuthProvider',\n header: () => provider.header,\n provider: provider,\n config: {\n token: provider._config.token,\n refreshConfig: {\n refreshOnUnauthorizedResponse: refreshCfg?.refreshOnUnauthorizedResponse ?? 'true (default)',\n token: refreshCfg?.token,\n cookieName: refreshCfg?.cookieName,\n cookieDomain: refreshCfg?.cookieDomain ?? 'current origin (default)',\n cookieExpiresInDays: refreshCfg?.cookieExpiresInDays ?? '30 (default)',\n cookiePath: refreshCfg?.cookiePath ?? '/ (default)',\n cookieEnabled: refreshCfg?.cookieEnabled ?? 'true (default)',\n cookieSameSite: refreshCfg?.cookieSameSite ?? 'lax (default)',\n refreshBuffer: refreshCfg?.refreshBuffer ?? '30000 (default)',\n expiresInPropertyName: refreshCfg?.expiresInPropertyName ?? 'exp (default)',\n strategy: refreshCfg?.strategy ?? 'AuthBearerRefreshStrategy.BeforeExpiration (default)',\n requestArgsAdapter: refreshCfg?.requestArgsAdapter ? 'custom' : 'default',\n responseAdapter: refreshCfg?.responseAdapter ? 'custom' : 'default',\n },\n },\n } as const;\n } else {\n return {\n type: 'UnknownAuthProvider',\n header: () => provider.header,\n provider: provider,\n config: {},\n } as const;\n }\n });\n\n protected trackByClient: TrackByFunction<QueryClientDevtoolsOptions> = (_, { client }) => client.config.baseRoute;\n protected trackByQuery: TrackByFunction<AnyV2Query> = (_, { _id }) => _id;\n\n constructor() {\n this.selectedClientIdCtrl.valueChanges\n .pipe(\n tap(() => this.clearQueryHistory()),\n takeUntil(this._destroy$),\n )\n .subscribe();\n\n this.selectedQuery$\n .pipe(\n switchMap((q) => q?._dependentsChanged$ ?? of(null)),\n tap(() => this.cdr.markForCheck()),\n takeUntilDestroyed(),\n )\n .subscribe();\n\n toObservable(this.authProviderDetails)\n .pipe(switchMap((ap) => (ap?.type === 'BearerAuthProvider' ? ap.provider.tokens$ : of(null))))\n .pipe(\n tap(() => this.cdr.markForCheck()),\n takeUntilDestroyed(),\n )\n .subscribe();\n\n this.queryStore$\n .pipe(\n switchMap((s) =>\n s.storeChange$.pipe(\n startWith(''),\n map(() => s._store),\n tap((s) => {\n untracked(() => {\n this.queries$.next(Array.from(s.values()));\n });\n }),\n takeUntil(this._destroy$),\n ),\n ),\n )\n .subscribe();\n\n this.queryStore$\n .pipe(\n switchMap((s) =>\n s.queryCreated$.pipe(\n tap((query) => {\n const currentHistory = this.queryHistory$.getValue();\n\n if (!currentHistory) return;\n\n const currentHistoryClone = [...currentHistory];\n\n if (!currentHistory.some((q) => q._id === query._id)) {\n currentHistoryClone.unshift(query);\n }\n\n currentHistoryClone.splice(50);\n\n this.queryHistory$.next(currentHistoryClone);\n }),\n takeUntil(this._destroy$),\n ),\n ),\n )\n .subscribe();\n\n this.queries$\n .pipe(\n tap((queries) => {\n const currentHistory = this.queryHistory$.getValue();\n\n if (!queries || !currentHistory) return;\n\n const currentHistoryClone = [...currentHistory];\n\n for (const query of queries) {\n if (!currentHistoryClone.some((q) => q._id === query._id)) {\n currentHistoryClone.unshift(query);\n }\n }\n\n currentHistoryClone.splice(50);\n\n this.queryHistory$.next(currentHistoryClone);\n }),\n takeUntil(this._destroy$),\n )\n .subscribe();\n\n effect(() => {\n const devtoolConfig = {\n isOpen: this.isOpen(),\n isTranslucent: this.isTranslucent(),\n snapLayout: this.snapLayout(),\n showResponse: this.showResponse(),\n showRawResponse: this.showRawResponse(),\n showQueryConfig: this.showQueryConfig(),\n showEntityStoreValue: this.showEntityStoreValue(),\n showArguments: this.showArguments(),\n selectedClientId: this.selectedClientId(),\n selectedQueryPath: this.selectedQueryId(),\n queryListMode: this.queryListMode(),\n viewMode: this.viewMode(),\n };\n\n window.localStorage.setItem('ethlete:query:devtools', JSON.stringify(devtoolConfig));\n });\n\n const initialConfig = window.localStorage.getItem('ethlete:query:devtools');\n\n if (initialConfig) {\n const parsed = JSON.parse(initialConfig);\n\n this.isOpen.set(parsed.isOpen ?? false);\n this.isTranslucent.set(parsed.isTranslucent ?? false);\n this.snapLayout.set(parsed.snapLayout ?? 'full');\n this.showResponse.set(parsed.showResponse ?? false);\n this.showRawResponse.set(parsed.showRawResponse ?? false);\n this.showQueryConfig.set(parsed.showQueryConfig ?? false);\n this.showEntityStoreValue.set(parsed.showEntityStoreValue ?? false);\n this.showArguments.set(parsed.showArguments ?? false);\n this.selectedClientIdCtrl.setValue(parsed.selectedClientId ?? 0);\n this.selectedQueryId.set(parsed.selectedQueryPath ?? null);\n this.queryListMode.set(parsed.queryListMode ?? 'live');\n this.viewMode.set(parsed.viewMode ?? 'query');\n }\n }\n\n protected toggleOpen() {\n this.isOpen.set(!this.isOpen());\n }\n\n protected toggleTranslucent() {\n this.isTranslucent.set(!this.isTranslucent());\n }\n\n protected toggleShowResponse() {\n this.showResponse.set(!this.showResponse());\n\n nextFrame(() => {\n this.cdr.markForCheck();\n });\n }\n\n protected toggleShowQueryConfig() {\n this.showQueryConfig.set(!this.showQueryConfig());\n }\n\n protected toggleShowRawResponse() {\n this.showRawResponse.set(!this.showRawResponse());\n }\n\n protected toggleShowEntityStoreValue() {\n this.showEntityStoreValue.set(!this.showEntityStoreValue());\n }\n\n protected toggleShowArguments() {\n this.showArguments.set(!this.showArguments());\n }\n\n protected selectSnapLayout(layout: QueryDevtoolsSnapLayout) {\n this.snapLayout.set(layout);\n }\n\n protected selectQueryListMode(mode: QueryListMode) {\n this.queryListMode.set(mode);\n }\n\n protected selectViewMode(mode: QueryViewMode) {\n this.viewMode.set(mode);\n }\n\n protected selectQuery(query: AnyV2Query) {\n this.selectedQueryId.set(query._id);\n }\n\n protected clearQueryHistory() {\n this.queryHistory$.next([]);\n }\n}\n","@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Query Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Inspector</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('live'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live Queries ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('history'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Query History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history' && viewMode() === 'query') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': viewMode() !== 'authProvider' }\"\n (click)=\"selectViewMode('authProvider')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Auth Provider\n </button>\n </div>\n\n @if (viewMode() === 'query') {\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else if (viewMode() === 'authProvider') {\n <div class=\"et-qd-auth-provider__viewer\">\n @if (authProviderDetails(); as details) {\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>Type</p>\n <pre>{{ details.type }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Header value</p>\n <pre>{{ details.header() | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Config</p>\n <pre>{{ details.config | json }}</pre>\n </div>\n\n @if (details.type === 'BearerAuthProvider') {\n <div class=\"et-qd-list-item\">\n <p>Tokens</p>\n <pre>{{ details.provider.tokens$ | async | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Should refresh on unauthorized response</p>\n <pre>{{ details.provider.shouldRefreshOnUnauthorizedResponse }}</pre>\n </div>\n\n <ng-container\n *etQuery=\"\n details.provider.currentRefreshQuery$ | async as response;\n loading as loading;\n error as error;\n query as query\n \"\n >\n <div class=\"et-qd-list-item\">\n <p>Refresh query response</p>\n\n <div>\n <button (click)=\"details.provider._refreshQuery()\" class=\"et-qd-chip et-qd-chip-bordered\">\n Refresh\n </button>\n </div>\n <pre>{{ response | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query loading</p>\n <pre>{{ loading }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query error</p>\n <pre>{{ error ?? 'null' }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <pre>{{ $safeNavigationMigration(query?.state$) | async | json }}</pre>\n </div>\n </ng-container>\n }\n </div>\n } @else {\n <p>No auth provider set</p>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n","import { Observable, Subject, debounceTime, filter, map, shareReplay, startWith } from 'rxjs';\nimport { EntityKey, EntityStoreConfig } from './entity.types';\n\nclass EntityStoreError extends Error {\n constructor(\n message: string,\n public detail?: unknown,\n ) {\n super(message);\n this.name = 'EntityStoreError';\n }\n}\n\nfunction flatten<T>(arr: T[][]): T[] {\n return arr.reduce((acc, val) => acc.concat(val), []);\n}\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport class EntityStore<T> {\n /**\n * @internal\n */\n readonly _dictionary = new Map<EntityKey, T>();\n\n /**\n * @internal\n */\n readonly _change$ = new Subject<EntityKey | EntityKey[]>();\n\n constructor(private readonly _config: EntityStoreConfig) {}\n\n select(key: EntityKey): Observable<T | null>;\n select(keys: EntityKey[]): Observable<T[]>;\n select(keys: EntityKey[][]): Observable<T[]>;\n select(keyOrKeys: EntityKey | EntityKey[] | EntityKey[][]): Observable<T | null> | Observable<T[]> {\n if (Array.isArray(keyOrKeys)) {\n const _keys = this.normalizeKeys(keyOrKeys);\n\n return this.selectMany(_keys as EntityKey[]);\n }\n\n return this._select(keyOrKeys);\n }\n\n /**\n * **Note:** Prefer `select` over `selectWhere` when possible.\n */\n selectWhere(predicate: (value: T) => boolean): Observable<T[]> {\n return this._change$.pipe(\n startWith(null),\n debounceTime(0),\n map(() => Array.from(this._dictionary.values()).filter(predicate)),\n shareReplay({ bufferSize: 1, refCount: true }),\n );\n }\n\n set(key: EntityKey, value: T): void;\n set(keys: EntityKey[], values: T[]): void;\n set(keys: EntityKey[][], values: T[][]): void;\n set(keyOrKeys: EntityKey | EntityKey[] | EntityKey[][], valueOrValues: T | T[] | T[][]) {\n const _keys = this.normalizeKeys(keyOrKeys);\n\n if (Array.isArray(_keys)) {\n if (!Array.isArray(valueOrValues)) {\n throw new EntityStoreError('When setting multiple keys, values must be an array', {\n keyOrValues: _keys,\n valueOrValues,\n });\n }\n\n const _values = (Array.isArray(valueOrValues[0]) ? flatten(valueOrValues as T[][]) : valueOrValues) as T[];\n\n for (let i = 0; i < _keys.length; i++) {\n const k = _keys[i];\n const v = _values[i];\n\n if (k === undefined || v === undefined) continue;\n\n this._set(k, v);\n }\n } else {\n this._set(_keys, valueOrValues as T);\n }\n\n this._change$.next(_keys);\n }\n\n remove(key: EntityKey): void;\n remove(keys: EntityKey[]): void;\n remove(keys: EntityKey[][]): void;\n remove(keyOrKeys: EntityKey | EntityKey[] | EntityKey[][]) {\n const _keys = this.normalizeKeys(keyOrKeys);\n\n if (Array.isArray(_keys)) {\n for (const key of _keys) {\n this._remove(key);\n }\n } else {\n this._remove(_keys);\n }\n\n this._change$.next(_keys);\n }\n\n logState() {\n console.log('EntityStore:', this._config.name, {\n dictionary: this._dictionary,\n });\n }\n\n private _select(key: EntityKey): Observable<T | null> {\n if (this._config.logActions) {\n console.log('EntityStore: select', this._config.name, key);\n }\n\n return this._change$.pipe(\n startWith(null),\n filter((v) => {\n if (v === null) {\n return true;\n }\n\n if (Array.isArray(v)) {\n return v.includes(key);\n }\n\n return v === key;\n }),\n map(() => this._dictionary.get(key) ?? null),\n );\n }\n\n private selectMany(keys: EntityKey[]): Observable<T[]> {\n if (this._config.logActions) {\n console.log('EntityStore: selectMany', this._config.name, keys);\n }\n\n return this._change$.pipe(\n startWith(null),\n filter((v) => {\n if (v === null) {\n return true;\n }\n\n if (Array.isArray(v)) {\n return keys.some((key) => v.includes(key));\n }\n\n return keys.includes(v);\n }),\n map(() => keys.map((key) => this._dictionary.get(key)).filter((value): value is T => value !== undefined)),\n );\n }\n\n private _set(key: EntityKey, value: T) {\n if (this._config.logActions) {\n console.log('EntityStore: set', this._config.name, key, value);\n }\n\n this._dictionary.set(key, value);\n }\n\n private _remove(key: EntityKey) {\n if (this._config.logActions) {\n console.log('EntityStore: remove', this._config.name, key);\n }\n\n this._dictionary.delete(key);\n }\n\n private normalizeKeys(keys: EntityKey | EntityKey[] | EntityKey[][]): EntityKey | EntityKey[] {\n if (Array.isArray(keys)) {\n if (Array.isArray(keys[0])) {\n return flatten(keys as EntityKey[][]);\n }\n\n return keys as EntityKey[];\n }\n\n return keys;\n }\n}\n","import { Paginated } from '@ethlete/types';\nimport { map, of, switchMap, take, tap } from 'rxjs';\nimport { EntityStore } from './entity-store';\nimport { EntityKey, InsertFromConfig, RemoveFromConfig } from './entity.types';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport function mapToPaginated<T>(response: Paginated<T>) {\n return map((items) => ({ ...response, items }) as Paginated<T>);\n}\n\n// FIXME: This breaks if SubStoreType is an array\n/**\n * Use an other store to represent a property of the current entity.\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const insertFrom = <\n OriginStoreType,\n OriginKeys extends keyof NonNullable<OriginStoreType>,\n SubStoreType extends (NonNullable<OriginStoreType>[OriginKeys] extends Array<infer U>\n ? U\n : NonNullable<OriginStoreType>[OriginKeys]),\n IdFn extends (value: NonNullable<OriginStoreType>) => EntityKey | EntityKey[],\n ComputedEntityType extends (ReturnType<IdFn> extends Array<unknown>\n ? OriginStoreType\n : Omit<OriginStoreType, OriginKeys> & { [K in OriginKeys]: SubStoreType | null }),\n>(\n store: EntityStore<SubStoreType>,\n { for: key, id }: InsertFromConfig<OriginStoreType, OriginKeys, IdFn>,\n) =>\n switchMap((value: OriginStoreType) => {\n if (!value) return of(null);\n\n const ids = id(value);\n\n if (Array.isArray(ids)) {\n return store.select(ids).pipe(map((data) => ({ ...value, [key]: data }) as ComputedEntityType));\n } else {\n return store.select(ids).pipe(map((data) => ({ ...value, [key]: data }) as ComputedEntityType));\n }\n });\n\n/**\n * Remove entities from a store based on a where function.\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const removeFrom = <T>(store: EntityStore<T>, { where, id }: RemoveFromConfig<T>) => {\n store\n .selectWhere(where)\n .pipe(\n tap((entities) => store.remove(entities.map(id))),\n take(1),\n )\n .subscribe();\n};\n","import { RuntimeError } from '@ethlete/core';\nimport { QueryRuntimeErrorCode } from '../../http/query-errors';\n\nexport {\n invalidBaseRouteError,\n invalidRouteError,\n pathParamsMissingInRouteFunctionError,\n} from '../../http/internal/request-route';\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const queryStateAlreadyHasKeyError = (data: unknown) =>\n new RuntimeError(\n QueryRuntimeErrorCode.LEGACY_QUERY_STATE_ALREADY_HAS_KEY,\n 'The query state already contains the provided key',\n data,\n );\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const queryStateDoesNotContainKeyError = (data: unknown) =>\n new RuntimeError(\n QueryRuntimeErrorCode.LEGACY_QUERY_STATE_DOES_NOT_CONTAIN_KEY,\n 'The query state does not contain the provided key',\n data,\n );\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const queryStateCannotTransformError = (data: unknown) =>\n new RuntimeError(\n QueryRuntimeErrorCode.LEGACY_QUERY_STATE_CANNOT_TRANSFORM,\n 'The query state cannot be transformed because it is not loading',\n data,\n );\n\n/**\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const invalidBodyError = (data: unknown) =>\n new RuntimeError(QueryRuntimeErrorCode.LEGACY_INVALID_BODY, 'The body is not valid or upsupported', data);\n","import { Resource, resource } from '@angular/core';\nimport { FieldContext, PathKind, SchemaPath, SchemaPathRules, TreeValidationResult } from '@angular/forms/signals';\nimport { FormViolationView } from '@ethlete/types';\nimport { Observable, filter, firstValueFrom, take } from 'rxjs';\nimport { applyQueryAsyncValidator } from '../http/query-validator-core';\nimport { AnyLegacyQueryCreator } from './interop';\nimport { AnyV2QueryCreator, QueryDataOf } from './query-creator';\nimport { V2QueryState, isQueryStateFailure, isQueryStateSuccess } from './query';\n\n// The legacy twin of `../http/validate-with-query.ts` for apps still on the class-based\n// `V2QueryClient`. Same signature and behavior; only the query engine differs - it prepares and\n// executes a v2/legacy query and awaits its settled `state$`, where the v3 variant awaits a query\n// snapshot. The shared error-mapping and `validateAsync` wiring live in `query-validator-core`.\n\n/**\n * The args accepted by the creator's `prepare()` - includes `mock`/`config` extras.\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type V2PrepareArgsOf<TCreator extends AnyV2QueryCreator | AnyLegacyQueryCreator> = Parameters<\n TCreator['prepare']\n>[0];\n\n/**\n * Config for {@link validateWithV2Query}.\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport type ValidateWithV2QueryConfig<\n TCreator extends AnyV2QueryCreator | AnyLegacyQueryCreator,\n TValue,\n TPathKind extends PathKind,\n> = {\n /**\n * The legacy query creator to run (from `V2QueryClient`'s `post`/`get`, or a\n * `createLegacyQueryCreator` interop wrapper). A fresh query is prepared and executed for each\n * validate request. Running it through the client is the point: auth, base route, caching and\n * error normalization all apply, unlike a raw `httpResource`.\n */\n queryCreator: TCreator;\n /**\n * Builds the `prepare()` args from the field context. Runs reactively on the field value\n * (debounced), exactly like `validateAsync`'s `params` - e.g.\n * `(ctx) => ({ pathParams: { id }, body: { ...ctx.value() } })`.\n */\n args: (ctx: FieldContext<TValue, TPathKind>) => V2PrepareArgsOf<TCreator>;\n /** Debounce before the request runs, in ms. @default 300 */\n debounce?: number;\n /** Gate the validation - return `false` to skip the request (e.g. an empty or invalid value). */\n when?: (ctx: FieldContext<TValue, TPathKind>) => boolean;\n /**\n * Override the default violation → error mapping. Receives the violations extracted from the\n * failed request; return the errors to report (targeting child fields via their `fieldTree`).\n * Defaults to `mapViolationsToFormErrors`, resolving each violation's `propertyPath` against the\n * validated field.\n */\n mapViolations?: (violations: FormViolationView[], ctx: FieldContext<TValue, TPathKind>) => TreeValidationResult;\n};\n\n/** The subset of the v2/legacy query surface the validator drives. */\ntype PreparedV2Query<TData> = {\n execute: () => void;\n abort: () => void;\n state$: Observable<V2QueryState<TData>>;\n};\n\n/**\n * Binds a query-backed async validator to a signal-forms field, adapting a **legacy v2**\n * `@ethlete/query` query into what `validateAsync` consumes - the `V2QueryClient` counterpart of\n * {@link validateWithQuery}, so apps that haven't migrated yet can still validate against the\n * server. The query runs through the client (bearer auth, base route, caching, Symfony error\n * normalization), where a raw `httpResource` would fire unauthenticated and bypass the pipeline.\n *\n * The query is prepared and executed (debounced) as the field value changes, only after the\n * field's synchronous validators pass. A `204` / successful response reports no errors; a\n * `422 FormViolationListView` maps each violation onto its child field by `propertyPath`; a\n * network / other error degrades to a non-swallowed form-level error.\n *\n * Call it from a schema definition, the same place you'd call `validateAsync`:\n *\n * ```ts\n * const schema = schema<OpportunityEmail>((p) => {\n * validateWithV2Query(p, {\n * queryCreator: postOpportunityEmailValidate, // hubApiClient.post({ ... })\n * args: (ctx) => ({ pathParams: { opportunityId }, body: { ...ctx.value() } }),\n * });\n * });\n * ```\n *\n * @deprecated Part of the legacy (v2) query system. Migrate to the current query API - see https://ethlete-sdk-docs.web.app/query/migrating-from-v2, and run `nx g @ethlete/query:migrate-to-query-v3` to rewrite the mechanical parts. Intent to remove in v7.\n */\nexport const validateWithV2Query = <\n TCreator extends AnyV2QueryCreator | AnyLegacyQueryCreator,\n TValue,\n TPathKind extends PathKind = PathKind.Root,\n>(\n path: SchemaPath<TValue, SchemaPathRules.Supported, TPathKind>,\n config: ValidateWithV2QueryConfig<TCreator, TValue, TPathKind>,\n) => {\n type TParams = V2PrepareArgsOf<TCreator>;\n type TResult = QueryDataOf<TCreator>;\n\n applyQueryAsyncValidator<TValue, TParams, TResult, TPathKind>(path, {\n params: config.args,\n debounce: config.debounce,\n when: config.when,\n mapViolations: config.mapViolations,\n factory: (params) =>\n resource<TResult | undefined, TParams | undefined>({\n params: () => params(),\n loader: ({ params: prepareArgs, abortSignal }) => {\n // Prepared per request - v2 caches by the prepared args, so a fresh `prepare()` is the\n // legacy idiom (the sibling `selectOptionsFromV2Query` does the same via `queryComputed`).\n const query = config.queryCreator.prepare(prepareArgs) as unknown as PreparedV2Query<TResult>;\n\n abortSignal.addEventListener('abort', () => query.abort());\n query.execute();\n\n // Resolve once the query settles. A failure is thrown so it lands in `onError`, where the\n // violations are mapped onto the fields; the underlying `HttpErrorResponse` is thrown so\n // `extractFormViolations` can unwrap the 422 body.\n return firstValueFrom(\n query.state$.pipe(\n filter((state) => isQueryStateSuccess(state) || isQueryStateFailure(state)),\n take(1),\n ),\n ).then((state) => {\n if (isQueryStateFailure(state)) {\n throw state.error.httpErrorResponse;\n }\n\n return state.response;\n });\n },\n }) as Resource<TResult | undefined>,\n });\n};\n","import { HttpStatusCode } from '@angular/common/http';\n\nexport const parseHttpErrorCodeToTitleDe = (statusCode: HttpStatusCode) => {\n switch (statusCode) {\n case HttpStatusCode.BadRequest:\n return 'Ungültige Anfrage';\n case HttpStatusCode.Unauthorized:\n return 'Nicht autorisiert';\n case HttpStatusCode.PaymentRequired:\n return 'Zahlung erforderlich';\n case HttpStatusCode.Forbidden:\n return 'Verboten';\n case HttpStatusCode.NotFound:\n return 'Nicht gefunden';\n case HttpStatusCode.MethodNotAllowed:\n return 'Methode nicht erlaubt';\n case HttpStatusCode.NotAcceptable:\n return 'Nicht akzeptabel';\n case HttpStatusCode.ProxyAuthenticationRequired:\n return 'Proxy-Authentifizierung erforderlich';\n case HttpStatusCode.RequestTimeout:\n return 'Anforderungszeitüberschreitung';\n case HttpStatusCode.Conflict:\n return 'Konflikt';\n case HttpStatusCode.Gone:\n return 'Weg';\n case HttpStatusCode.LengthRequired:\n return 'Länge erforderlich';\n case HttpStatusCode.PreconditionFailed:\n return 'Vorbedingung fehlgeschlagen';\n case HttpStatusCode.PayloadTooLarge:\n return 'Nutzlast zu groß';\n case HttpStatusCode.UriTooLong:\n return 'URI zu lang';\n case HttpStatusCode.UnsupportedMediaType:\n return 'Nicht unterstützter Medientyp';\n case HttpStatusCode.RangeNotSatisfiable:\n return 'Bereich nicht zufriedenstellend';\n case HttpStatusCode.ExpectationFailed:\n return 'Erwartung fehlgeschlagen';\n case HttpStatusCode.ImATeapot:\n return 'Ich bin eine Teekanne';\n case HttpStatusCode.MisdirectedRequest:\n return 'Fehlgeleitete Anfrage';\n case HttpStatusCode.UnprocessableEntity:\n return 'Unverarbeitbare Entität';\n case HttpStatusCode.Locked:\n return 'Gesperrt';\n case HttpStatusCode.FailedDependency:\n return 'Fehlgeschlagene Abhängigkeit';\n case HttpStatusCode.TooEarly:\n return 'Zu früh';\n case HttpStatusCode.UpgradeRequired:\n return 'Upgrade erforderlich';\n case HttpStatusCode.PreconditionRequired:\n return 'Vorbedingung erforderlich';\n case HttpStatusCode.TooManyRequests:\n return 'Zu viele Anfragen';\n case HttpStatusCode.RequestHeaderFieldsTooLarge:\n return 'Anforderungskopffelder zu groß';\n case HttpStatusCode.UnavailableForLegalReasons:\n return 'Aus rechtlichen Gründen nicht verfügbar';\n case HttpStatusCode.InternalServerError:\n return 'Interner Serverfehler';\n case HttpStatusCode.NotImplemented:\n return 'Nicht implementiert';\n case HttpStatusCode.BadGateway:\n return 'Schlechtes Gateway';\n case HttpStatusCode.ServiceUnavailable:\n return 'Dienst nicht verfügbar';\n case HttpStatusCode.GatewayTimeout:\n return 'Gateway-Zeitüberschreitung';\n case HttpStatusCode.HttpVersionNotSupported:\n return 'HTTP-Version nicht unterstützt';\n case HttpStatusCode.VariantAlsoNegotiates:\n return 'Variante verhandelt auch';\n case HttpStatusCode.InsufficientStorage:\n return 'Unzureichender Speicher';\n case HttpStatusCode.LoopDetected:\n return 'Schleifenerkennung';\n case HttpStatusCode.NotExtended:\n return 'Nicht erweitert';\n case HttpStatusCode.NetworkAuthenticationRequired:\n return 'Netzwerkauthentifizierung erforderlich';\n default:\n return 'Etwas ist schief gelaufen';\n }\n};\n\nexport const parseHttpErrorCodeToMessageDe = (statusCode: HttpStatusCode) => {\n switch (statusCode) {\n case HttpStatusCode.BadRequest:\n return 'Entschuldigung, wir konnten Ihre Anfrage nicht bearbeiten. Bitte versuchen Sie es später erneut.';\n case HttpStatusCode.Unauthorized:\n return 'Sie sind nicht berechtigt, diese Aktion auszuführen. Bitte melden Sie sich an, um fortzufahren.';\n case HttpStatusCode.PaymentRequired:\n return 'Zur Ausführung dieser Aktion ist eine Zahlung erforderlich.';\n case HttpStatusCode.Forbidden:\n return 'Sie haben keine Berechtigung, diese Aktion auszuführen.';\n case HttpStatusCode.NotFound:\n return 'Die angeforderte Ressource wurde nicht gefunden.';\n case HttpStatusCode.MethodNotAllowed:\n return 'Die angeforderte Methode ist für diese Ressource nicht zulässig.';\n case HttpStatusCode.NotAcceptable:\n return 'Die angeforderte Ressource ist nicht in der Lage, eine Antwort zu generieren, die der Liste der akzeptablen Werte entspricht.';\n case HttpStatusCode.ProxyAuthenticationRequired:\n return 'Zur Ausführung dieser Aktion ist eine Proxy-Authentifizierung erforderlich.';\n case HttpStatusCode.RequestTimeout:\n return 'Der Server hat auf die Anforderung gewartet.';\n case HttpStatusCode.Conflict:\n return 'Die Anforderung steht im Widerspruch zum aktuellen Zustand der Ressource.';\n case HttpStatusCode.Gone:\n return 'Die angeforderte Ressource ist nicht mehr verfügbar und wird auch nicht mehr verfügbar sein.';\n case HttpStatusCode.LengthRequired:\n return 'Die Anforderung hat die Länge ihres Inhalts nicht angegeben, die von der angeforderten Ressource benötigt wird.';\n case HttpStatusCode.PreconditionFailed:\n return 'Der Server erfüllt eine der Voraussetzungen nicht, die der Anforderer an die Anforderung gestellt hat.';\n case HttpStatusCode.PayloadTooLarge:\n return 'Die Anforderung ist größer als der Server bereit oder in der Lage ist, zu verarbeiten.';\n case HttpStatusCode.UriTooLong:\n return 'Die bereitgestellte URL war für den Server zu lang, um sie zu verarbeiten.';\n case HttpStatusCode.UnsupportedMediaType:\n return 'Die Anforderungseinheit hat einen Medientyp, den der Server oder die Ressource nicht unterstützt.';\n case HttpStatusCode.RangeNotSatisfiable:\n return 'Der Client hat einen Teil der Datei angefordert, aber der Server kann diesen Teil nicht liefern.';\n case HttpStatusCode.ExpectationFailed:\n return 'Der Server kann die Anforderungen des Erwartung-Anforderungskopffelds nicht erfüllen.';\n case HttpStatusCode.ImATeapot:\n return 'Ich bin eine Teekanne.';\n case HttpStatusCode.MisdirectedRequest:\n return 'Die Anforderung wurde an einen Server gerichtet, der nicht in der Lage ist, eine Antwort zu generieren.';\n case HttpStatusCode.UnprocessableEntity:\n return 'Die Anforderung war gut formuliert, konnte aber aufgrund semantischer Fehler nicht befolgt werden.';\n case HttpStatusCode.Locked:\n return 'Die Ressource, auf die zugegriffen wird, ist gesperrt.';\n case HttpStatusCode.FailedDependency:\n return 'Die Anforderung ist aufgrund eines Fehlers einer vorherigen Anforderung fehlgeschlagen.';\n case HttpStatusCode.TooEarly:\n return 'Der Server ist nicht bereit, die Anforderung zu verarbeiten, weil der Benutzer nicht authentifiziert wurde.';\n case HttpStatusCode.UpgradeRequired:\n return 'Der Client sollte zu einem anderen Protokoll wie TLS/1.0 wechseln, das im Upgrade-Anforderungskopffeld angegeben ist.';\n case HttpStatusCode.PreconditionRequired:\n return 'Der Ursprungsserver erfordert, dass die Anforderung bedingt ist.';\n case HttpStatusCode.TooManyRequests:\n return 'Sie haben in einer bestimmten Zeit zu viele Anfragen gesendet. Bitte versuchen Sie es später erneut.';\n case HttpStatusCode.RequestHeaderFieldsTooLarge:\n return 'Der Server ist nicht bereit, die Anforderung zu verarbeiten, weil seine Kopffelder zu groß sind.';\n case HttpStatusCode.UnavailableForLegalReasons:\n return 'Die Ressource ist aufgrund einer rechtlichen Forderung nicht verfügbar.';\n case HttpStatusCode.InternalServerError:\n return 'Etwas ist schief gelaufen. Bitte versuchen Sie es später erneut.';\n case HttpStatusCode.NotImplemented:\n return 'Der Server unterstützt die zur Erfüllung der Anforderung erforderliche Funktionalität nicht.';\n case HttpStatusCode.BadGateway:\n return 'Etwas ist schief gelaufen. Bitte versuchen Sie es später erneut.';\n case HttpStatusCode.ServiceUnavailable:\n return 'Der Server kann die Anforderung derzeit nicht bearbeiten, da er vorübergehend überlastet oder gewartet wird.';\n case HttpStatusCode.GatewayTimeout:\n return 'Der Server hat beim Versuch, die Anforderung abzuschließen, keine rechtzeitige Antwort vom Server erhalten.';\n case HttpStatusCode.HttpVersionNotSupported:\n return 'Der Server unterstützt die in der Anforderung verwendete HTTP-Protokollversion nicht.';\n case HttpStatusCode.VariantAlsoNegotiates:\n return 'Der Server hat einen internen Konfigurationsfehler: Die ausgewählte Variantenressource ist so konfiguriert, dass sie sich selbst in die transparente Inhaltsverhandlung einbindet, und ist daher kein geeigneter Endpunkt im Verhandlungsprozess.';\n case HttpStatusCode.InsufficientStorage:\n return 'Die Methode konnte auf die Ressource nicht angewendet werden, weil der Server nicht in der Lage ist, die für die erfolgreiche Ausführung der Anforderung erforderliche Darstellung zu speichern.';\n case HttpStatusCode.LoopDetected:\n return 'Der Server hat eine Endlosschleife erkannt, während er die Anforderung verarbeitet.';\n case HttpStatusCode.NotExtended:\n return 'Weitere Erweiterungen der Anforderung sind erforderlich, damit der Server sie erfüllen kann.';\n case HttpStatusCode.NetworkAuthenticationRequired:\n return 'Sie müssen sich authentifizieren, um Zugang zum Netzwerk zu erhalten.';\n default:\n return 'Etwas ist schief gelaufen. Überprüfen Sie Ihre Internetverbindung und versuchen Sie es später erneut.';\n }\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { parseHttpErrorCodeToMessageDe, parseHttpErrorCodeToTitleDe } from './parse-http-error-code-de';\n\n@Pipe({\n name: 'parseHttpErrorCodeToTitleDe',\n})\nexport class ParseHttpErrorCodeToTitleDePipe implements PipeTransform {\n transform = parseHttpErrorCodeToTitleDe;\n}\n\n@Pipe({\n name: 'parseHttpErrorCodeToMessageDe',\n})\nexport class ParseHttpErrorCodeToMessageDePipe implements PipeTransform {\n transform = parseHttpErrorCodeToMessageDe;\n}\n","import { HttpStatusCode } from '@angular/common/http';\n\nexport const parseHttpErrorCodeToTitleEn = (statusCode: HttpStatusCode) => {\n switch (statusCode) {\n case HttpStatusCode.BadRequest:\n return 'Bad request';\n case HttpStatusCode.Unauthorized:\n return 'Unauthorized';\n case HttpStatusCode.PaymentRequired:\n return 'Payment required';\n case HttpStatusCode.Forbidden:\n return 'Forbidden';\n case HttpStatusCode.NotFound:\n return 'Not found';\n case HttpStatusCode.MethodNotAllowed:\n return 'Method not allowed';\n case HttpStatusCode.NotAcceptable:\n return 'Not acceptable';\n case HttpStatusCode.ProxyAuthenticationRequired:\n return 'Proxy authentication required';\n case HttpStatusCode.RequestTimeout:\n return 'Request timeout';\n case HttpStatusCode.Conflict:\n return 'Conflict';\n case HttpStatusCode.Gone:\n return 'Gone';\n case HttpStatusCode.LengthRequired:\n return 'Length required';\n case HttpStatusCode.PreconditionFailed:\n return 'Precondition failed';\n case HttpStatusCode.PayloadTooLarge:\n return 'Payload too large';\n case HttpStatusCode.UriTooLong:\n return 'URI too long';\n case HttpStatusCode.UnsupportedMediaType:\n return 'Unsupported media type';\n case HttpStatusCode.RangeNotSatisfiable:\n return 'Range not satisfiable';\n case HttpStatusCode.ExpectationFailed:\n return 'Expectation failed';\n case HttpStatusCode.ImATeapot:\n return 'I am a teapot';\n case HttpStatusCode.MisdirectedRequest:\n return 'Misdirected request';\n case HttpStatusCode.UnprocessableEntity:\n return 'Unprocessable entity';\n case HttpStatusCode.Locked:\n return 'Locked';\n case HttpStatusCode.FailedDependency:\n return 'Failed dependency';\n case HttpStatusCode.TooEarly:\n return 'Too early';\n case HttpStatusCode.UpgradeRequired:\n return 'Upgrade required';\n case HttpStatusCode.PreconditionRequired:\n return 'Precondition required';\n case HttpStatusCode.TooManyRequests:\n return 'Too many requests';\n case HttpStatusCode.RequestHeaderFieldsTooLarge:\n return 'Request header fields too large';\n case HttpStatusCode.UnavailableForLegalReasons:\n return 'Unavailable for legal reasons';\n case HttpStatusCode.InternalServerError:\n return 'Internal server error';\n case HttpStatusCode.NotImplemented:\n return 'Not implemented';\n case HttpStatusCode.BadGateway:\n return 'Bad gateway';\n case HttpStatusCode.ServiceUnavailable:\n return 'Service unavailable';\n case HttpStatusCode.GatewayTimeout:\n return 'Gateway timeout';\n case HttpStatusCode.HttpVersionNotSupported:\n return 'HTTP version not supported';\n case HttpStatusCode.VariantAlsoNegotiates:\n return 'Variant also negotiates';\n case HttpStatusCode.InsufficientStorage:\n return 'Insufficient storage';\n case HttpStatusCode.LoopDetected:\n return 'Loop detected';\n case HttpStatusCode.NotExtended:\n return 'Not extended';\n case HttpStatusCode.NetworkAuthenticationRequired:\n return 'Network authentication required';\n default:\n return 'Something went wrong';\n }\n};\n\nexport const parseHttpErrorCodeToMessageEn = (statusCode: HttpStatusCode) => {\n switch (statusCode) {\n case HttpStatusCode.BadRequest:\n return 'Sorry, we could not process your request. Please try again later.';\n case HttpStatusCode.Unauthorized:\n return 'You are not authorized to perform this action. Please log in to continue.';\n case HttpStatusCode.PaymentRequired:\n return 'Payment is required to complete this action.';\n case HttpStatusCode.Forbidden:\n return 'You do not have permission to perform this action.';\n case HttpStatusCode.NotFound:\n return 'The requested resource was not found.';\n case HttpStatusCode.MethodNotAllowed:\n return 'The requested method is not allowed for this resource.';\n case HttpStatusCode.NotAcceptable:\n return 'The requested resource is not capable of generating a response matching the list of acceptable values.';\n case HttpStatusCode.ProxyAuthenticationRequired:\n return 'Proxy authentication is required to complete this action.';\n case HttpStatusCode.RequestTimeout:\n return 'The server timed out waiting for the request.';\n case HttpStatusCode.Conflict:\n return 'The request conflicts with the current state of the resource.';\n case HttpStatusCode.Gone:\n return 'The requested resource is no longer available and will not be available again.';\n case HttpStatusCode.LengthRequired:\n return 'The request did not specify the length of its content, which is required by the requested resource.';\n case HttpStatusCode.PreconditionFailed:\n return 'The server does not meet one of the preconditions that the requester put on the request.';\n case HttpStatusCode.PayloadTooLarge:\n return 'The request is larger than the server is willing or able to process.';\n case HttpStatusCode.UriTooLong:\n return 'The URL provided was too long for the server to process.';\n case HttpStatusCode.UnsupportedMediaType:\n return 'The request entity has a media type which the server or resource does not support.';\n case HttpStatusCode.RangeNotSatisfiable:\n return 'The client has asked for a portion of the file, but the server cannot supply that portion.';\n case HttpStatusCode.ExpectationFailed:\n return 'The server cannot meet the requirements of the Expect request-header field.';\n case HttpStatusCode.ImATeapot:\n return 'I am a teapot.';\n case HttpStatusCode.MisdirectedRequest:\n return 'The request was directed at a server that is not able to produce a response.';\n case HttpStatusCode.UnprocessableEntity:\n return 'The request was well-formed but was unable to be followed due to semantic errors.';\n case HttpStatusCode.Locked:\n return 'The resource that is being accessed is locked.';\n case HttpStatusCode.FailedDependency:\n return 'The request failed due to failure of a previous request.';\n case HttpStatusCode.TooEarly:\n return 'The server is unwilling to process the request because the user has not been authenticated.';\n case HttpStatusCode.UpgradeRequired:\n return 'The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.';\n case HttpStatusCode.PreconditionRequired:\n return 'The origin server requires the request to be conditional.';\n case HttpStatusCode.TooManyRequests:\n return 'You have sent too many requests in a given amount of time. Please try again later.';\n case HttpStatusCode.RequestHeaderFieldsTooLarge:\n return 'The server is unwilling to process the request because its header fields are too large.';\n case HttpStatusCode.UnavailableForLegalReasons:\n return 'The resource is unavailable due to a legal demand.';\n case HttpStatusCode.InternalServerError:\n return 'Something went wrong on our end. Please try again later.';\n case HttpStatusCode.NotImplemented:\n return 'The server does not support the functionality required to fulfill the request.';\n case HttpStatusCode.BadGateway:\n return 'Something went wrong on our end. Please try again later.';\n case HttpStatusCode.ServiceUnavailable:\n return 'The server is currently unable to handle the request due to a temporary overload or maintenance of the server.';\n case HttpStatusCode.GatewayTimeout:\n return 'The server, while acting as a gateway or proxy, did not receive a timely response from the upstream server specified by the URL or some other auxiliary server it needed to access in attempting to complete the request.';\n case HttpStatusCode.HttpVersionNotSupported:\n return 'The server does not support the HTTP protocol version used in the request.';\n case HttpStatusCode.VariantAlsoNegotiates:\n return 'The server has an internal configuration error: the chosen variant resource is configured to engage in transparent content negotiation itself, and is therefore not a proper end point in the negotiation process.';\n case HttpStatusCode.InsufficientStorage:\n return 'The method could not be performed on the resource because the server is unable to store the representation needed to successfully complete the request.';\n case HttpStatusCode.LoopDetected:\n return 'The server detected an infinite loop while processing the request.';\n case HttpStatusCode.NotExtended:\n return 'Further extensions to the request are required for the server to fulfill it.';\n case HttpStatusCode.NetworkAuthenticationRequired:\n return 'You need to authenticate to gain network access.';\n default:\n return 'Something went wrong. Check your internet connection and try again later.';\n }\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { parseHttpErrorCodeToMessageEn, parseHttpErrorCodeToTitleEn } from './parse-http-error-code-en';\n\n@Pipe({\n name: 'parseHttpErrorCodeToTitleEn',\n})\nexport class ParseHttpErrorCodeToTitleEnPipe implements PipeTransform {\n transform = parseHttpErrorCodeToTitleEn;\n}\n\n@Pipe({\n name: 'parseHttpErrorCodeToMessageEn',\n})\nexport class ParseHttpErrorCodeToMessageEnPipe implements PipeTransform {\n transform = parseHttpErrorCodeToMessageEn;\n}\n","export const transformToString = (value: unknown) => {\n if (typeof value === 'string') {\n return value;\n }\n\n return null;\n};\n\nexport const transformToStringArray = (value: unknown) => {\n if (Array.isArray(value)) {\n return value.map(transformToString).filter(Boolean) as string[];\n } else if (typeof value === 'string') {\n return [transformToString(value)] as string[];\n }\n\n return null;\n};\n\nexport const transformToNumber = (value: unknown) => {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n return Number(value);\n }\n return null;\n};\n\nexport const transformToNumberArray = (value: unknown) => {\n if (Array.isArray(value)) {\n return value.map(transformToNumber).filter((item) => item !== null) as number[];\n } else if (typeof value === 'number') {\n return [value] as number[];\n }\n\n return null;\n};\n\nexport const transformToBoolean = (value: unknown) => {\n if (typeof value === 'boolean') {\n return value;\n }\n if (typeof value === 'string') {\n return value === 'true' || value === '1';\n }\n return null;\n};\n\nexport const transformToBooleanArray = (value: unknown) => {\n if (Array.isArray(value)) {\n return value.map(transformToBoolean).filter((item) => item !== null) as boolean[];\n } else if (typeof value === 'string' || typeof value === 'boolean') {\n return [transformToBoolean(value)] as boolean[];\n }\n\n return null;\n};\n\nexport const transformToDate = (value: unknown) => {\n if (value instanceof Date) {\n return value;\n }\n if (typeof value === 'string') {\n const date = new Date(value);\n\n if (isNaN(date.getTime())) {\n return null;\n }\n\n return date;\n }\n return null;\n};\n\nexport const transformToDateArray = (value: unknown) => {\n if (Array.isArray(value)) {\n return value.map(transformToDate).filter((item) => item !== null) as Date[];\n } else if (typeof value === 'string' || value instanceof Date) {\n return [transformToDate(value)] as Date[];\n }\n\n return null;\n};\n\nexport type SortDirection = 'asc' | 'desc' | '';\n\nexport type Sort = {\n active: string;\n direction: SortDirection;\n};\n\nexport const transformToSort = (value: unknown): Sort | null => {\n if (typeof value === 'string') {\n const [active, direction] = value.split(':');\n\n if (!active) {\n return null;\n }\n\n return {\n active,\n direction: direction as 'asc' | 'desc',\n };\n }\n\n return null;\n};\n\nexport const transformToSortQueryParam = (value: unknown) => {\n if (typeof value === 'string') {\n return value;\n }\n if (value && typeof value === 'object' && 'active' in value && 'direction' in value) {\n const valAsSort = value as {\n active: string;\n direction: 'asc' | 'desc';\n };\n\n return valAsSort.direction ? `${valAsSort.active}:${valAsSort.direction}` : null;\n }\n\n return null;\n};\n","import { DestroyRef, NgZone, assertInInjectionContext, inject, isDevMode } from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n ET_PROPERTY_REMOVED,\n clone,\n createDestroy,\n equal,\n injectQueryParamChanges,\n injectQueryParams,\n} from '@ethlete/core';\nimport { BehaviorSubject, Subject, debounceTime, map, merge, of, switchMap, takeUntil, tap, timer } from 'rxjs';\nimport {\n OptionalQueryFieldOptions,\n QueryFieldOptions,\n QueryFormGroup,\n QueryFormGroupControls,\n QueryFormObserveOptions,\n QueryFormValue,\n QueryFormValueEvent,\n QueryFormWriteOptions,\n} from './query-form.types';\nimport {\n Sort,\n transformToBoolean,\n transformToBooleanArray,\n transformToDate,\n transformToDateArray,\n transformToNumber,\n transformToNumberArray,\n transformToSort,\n transformToSortQueryParam,\n transformToStringArray,\n} from './query-form.utils';\n\nconst ET_ARR_PREFIX = 'ET_ARR__';\nconst ET_OBJ_PREFIX = 'ET_OBJ__';\nconst ET_PROP_NULL_VALUE = 'ET_NULL__';\n\nexport class QueryField<T> {\n constructor(public data: QueryFieldOptions<T>) {}\n get control() {\n return this.data.control;\n }\n}\n\nexport class SearchQueryField {\n data: QueryFieldOptions<string | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<string | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<string | null>(null),\n debounce: 300,\n disableDebounceIfFalsy: true,\n ...(_data ?? {}),\n };\n }\n get control() {\n return this.data.control;\n }\n}\n\nexport class SortQueryField {\n data: QueryFieldOptions<Sort | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<Sort | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<Sort | null>(null),\n queryParamToValueTransformFn: transformToSort,\n valueToQueryParamTransformFn: transformToSortQueryParam,\n ...(_data ?? {}),\n };\n }\n get control() {\n return this.data.control;\n }\n}\n\nexport class StringArrayQueryField<T extends string[]> {\n data: QueryFieldOptions<T | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<T | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<T | null>(null),\n queryParamToValueTransformFn: transformToStringArray as (val: unknown) => T | null,\n ...(_data ?? {}),\n };\n }\n get control() {\n return this.data.control;\n }\n}\n\nexport class BooleanArrayQueryField {\n data: QueryFieldOptions<boolean[] | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<boolean[] | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<boolean[] | null>(null),\n queryParamToValueTransformFn: transformToBooleanArray,\n ...(_data ?? {}),\n };\n }\n get control() {\n return this.data.control;\n }\n}\n\nexport class NumberArrayQueryField {\n data: QueryFieldOptions<number[] | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<number[] | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<number[] | null>(null),\n queryParamToValueTransformFn: transformToNumberArray,\n ...(_data ?? {}),\n };\n }\n get control() {\n return this.data.control;\n }\n}\n\nexport class DateQueryField {\n data: QueryFieldOptions<Date | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<Date | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<Date | null>(null),\n queryParamToValueTransformFn: transformToDate,\n ...(_data ?? {}),\n };\n }\n get control() {\n return this.data.control;\n }\n}\n\nexport class DateArrayQueryField {\n data: QueryFieldOptions<Date[] | null>;\n\n constructor(public _data?: OptionalQueryFieldOptions<Date[] | null>) {\n this.data = {\n control: _data?.control ?? new FormControl<Date[] | null>(null),\n queryParamToValueTransformFn: transformToDateArray,\n ...(_data ?? {}),\n };\n }\n get control() {\n return this.data.control;\n }\n}\n\nconst IGNORED_FILTER_COUNT_FIELDS = ['page', 'skip', 'take', 'limit', 'sort', 'sortBy', 'sortOrder', 'query', 'search'];\n\nexport type QueryFormOptions = {\n /**\n * A prefix to use for the query parameters. This is useful when you have multiple query forms on the same page.\n */\n queryParamPrefix?: string | (() => string);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyQueryForm = QueryForm<any>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class QueryForm<T extends Record<string, QueryField<any>>> {\n private router = inject(Router);\n private activatedRoute = inject(ActivatedRoute);\n private zone = inject(NgZone);\n private queryParams = injectQueryParams();\n private readonly destroy$ = createDestroy();\n private readonly unobserveTrigger$ = new Subject<boolean>();\n private readonly defaultValues = this.extractDefaultValues();\n private readonly didValueChanges$ = new Subject<boolean>();\n\n private isObserving = false;\n private skipNextResets = false;\n\n private queryParamChanges$ = toObservable(injectQueryParamChanges());\n\n /**\n * The angular form group that contains all the fields.\n *\n * **Do not** use any of the following methods on this form group:\n * - `setValue`: Use `QueryForm.setValue` instead.\n * - `patchValue`: Use `QueryForm.patchValue` instead.\n * - `valueChanges`: Use `QueryForm.changes$` instead.\n * - `value`: Use `QueryForm.value` instead.\n * - `controls`: Use `QueryForm.controls` instead.\n */\n readonly form = this.setupFormGroup();\n\n private readonly lastFormValue$ = new BehaviorSubject<QueryFormValue<T> | null>(null);\n private readonly currentFormValue$ = new BehaviorSubject<QueryFormValue<T>>(this.formValue);\n\n private readonly _changes$ = new BehaviorSubject<QueryFormValueEvent<T>>({\n previousValue: null,\n currentValue: this.form.getRawValue() as QueryFormValue<T>,\n });\n\n readonly changes$ = this._changes$.asObservable();\n readonly currentValue$ = this._changes$.pipe(map(({ currentValue }) => currentValue));\n readonly previousValue$ = this._changes$.pipe(map(({ previousValue }) => previousValue));\n\n changes = toSignal(this.changes$);\n currentValue = toSignal(this.currentValue$);\n previousValue = toSignal(this.previousValue$);\n\n /**\n * The number of active filters.\n *\n * Excludes the following fields by default:\n * - `page`\n * - `skip`\n * - `take`\n * - `limit`\n * - `sort`\n * - `sortBy`\n * - `sortOrder`\n * - `query`\n * - `search`\n */\n readonly activeFilterCount$ = this.changes$.pipe(\n map(\n ({ currentValue }) =>\n Object.entries(currentValue)\n .map(([key, value]) => {\n if (IGNORED_FILTER_COUNT_FIELDS.includes(key) || this._fields[key]?.data.skipInFilterCount) {\n return true;\n }\n\n return this.isDefaultValue(key, value);\n })\n .filter((v) => v === false).length,\n ),\n );\n\n // with prefix eg. page should become ${prefix}-page\n constructor(\n private _fields: T,\n private _options?: QueryFormOptions,\n ) {\n assertInInjectionContext(QueryForm);\n\n inject(DestroyRef).onDestroy(() => this.cleanup());\n }\n\n get controls() {\n return this.form.controls;\n }\n\n get value() {\n return this._changes$.value.currentValue;\n }\n\n get defaultFormValue() {\n return Object.entries(this.defaultValues).reduce((acc, [key]) => {\n acc[key as keyof QueryFormValue<T>] = this.getDefaultValue(key);\n\n return acc;\n }, {} as QueryFormValue<T>);\n }\n\n observe(options?: QueryFormObserveOptions) {\n if (this.isObserving) {\n if (isDevMode()) {\n console.warn('QueryForm.observe() was called multiple times. This is not supported.');\n }\n\n return this;\n }\n\n this.isObserving = true;\n\n if (options?.syncOnNavigation !== false) {\n const didChanges = this.setFormValueFromUrlQueryParams({\n queryParams: this.queryParams(),\n });\n\n if (didChanges) {\n this.handleFormChange(true);\n }\n }\n\n merge(...Object.values(this._fields).map((field) => field.control.valueChanges), this.didValueChanges$)\n .pipe(\n debounceTime(0),\n tap(() => {\n this.handleFormChange();\n }),\n takeUntil(this.destroy$),\n takeUntil(this.unobserveTrigger$),\n )\n .subscribe();\n\n let changedFieldsInLastResetLoop: string[] = [];\n let currentUniqueChangedFields: string[] = [];\n\n this.currentFormValue$\n .pipe(\n map((currentValue) => {\n return {\n previousValue: clone(this.lastFormValue$.value),\n currentValue: clone(currentValue),\n };\n }),\n tap(({ currentValue, previousValue }) => {\n if (options?.writeToQueryParams !== false) {\n this._syncViaUrlQueryParams(currentValue, options?.replaceUrl);\n }\n\n const didResetValues = this.skipNextResets\n ? false\n : this._handleQueryFormResets(previousValue ?? null, currentValue);\n\n this.skipNextResets = false;\n\n const changedFields = Object.keys(currentValue).filter(\n (key) => !equal(previousValue?.[key], currentValue[key]),\n );\n\n if (changedFieldsInLastResetLoop.length) {\n changedFields.push(...changedFieldsInLastResetLoop);\n changedFieldsInLastResetLoop = [];\n }\n\n if (didResetValues) {\n this.didValueChanges$.next(true);\n changedFieldsInLastResetLoop = changedFields;\n }\n\n currentUniqueChangedFields = [...new Set(changedFields)];\n }),\n switchMap(({ currentValue, previousValue }) => {\n if (changedFieldsInLastResetLoop.length) return of(null).pipe(map(() => ({ currentValue, previousValue })));\n\n const debounceValues = currentUniqueChangedFields.map((key) => {\n const field = this._fields[key];\n\n if (!field) return null;\n\n if (field.data.disableDebounceIfFalsy === true && !currentValue[key]) {\n return null;\n }\n\n return field.data.debounce ?? null;\n });\n\n currentUniqueChangedFields = [];\n\n if (debounceValues.some((v) => v === null) || !debounceValues.length) {\n return of(null).pipe(map(() => ({ currentValue, previousValue })));\n }\n\n const shortestDebounceTime = Math.min(...debounceValues.filter((v): v is number => v !== null));\n\n return timer(shortestDebounceTime).pipe(map(() => ({ currentValue, previousValue })));\n }),\n tap(({ currentValue, previousValue }) => {\n if (changedFieldsInLastResetLoop.length) return;\n\n this._changes$.next({\n previousValue: previousValue ?? null,\n currentValue: currentValue,\n });\n }),\n takeUntil(this.destroy$),\n takeUntil(this.unobserveTrigger$),\n )\n .subscribe();\n\n if (options?.syncOnNavigation !== false) {\n this.queryParamChanges$\n .pipe(\n takeUntil(this.destroy$),\n takeUntil(this.unobserveTrigger$),\n tap((changes) => {\n const didValueChanges = this.setFormValueFromUrlQueryParams({ queryParams: changes });\n\n if (didValueChanges) {\n this.didValueChanges$.next(true);\n }\n }),\n )\n .subscribe();\n }\n\n return this;\n }\n\n unobserve() {\n this.unobserveTrigger$.next(true);\n this.cleanup();\n }\n\n setFormValueFromUrlQueryParams(options: { queryParams: Record<string, unknown> }) {\n let didValueChanges = false;\n\n for (const [key, field] of Object.entries(this._fields)) {\n const value = options.queryParams[this.transformKeyToQueryParam(key)];\n\n const valueDoesNotExist = value === undefined;\n\n if (valueDoesNotExist) continue;\n\n const valueGotRemoved = value === ET_PROPERTY_REMOVED;\n\n if (valueGotRemoved) {\n const defaultValue = this.getDefaultValue(key);\n if (!equal(field.control.value, defaultValue)) {\n field.control.setValue(defaultValue, { emitEvent: false });\n didValueChanges = true;\n }\n\n continue;\n }\n let deserializedValue = value;\n\n if (field.data.queryParamToValueTransformFn) {\n deserializedValue = field.data.queryParamToValueTransformFn(value);\n } else if (!field.data.skipAutoTransform) {\n const defaultIsNum = typeof this.getDefaultValue(key) === 'number';\n const valueIsNum = !isNaN(Number(value));\n const valueContainsWhitespace = typeof value === 'string' && value.trim() !== value;\n const valueHasLeadingZero = typeof value === 'string' && value.startsWith('0');\n const valueEndsWithDot = typeof value === 'string' && value.endsWith('.');\n\n const defaultIsBool = this.getDefaultValue(key) === 'boolean';\n const valueIsBool = value === 'true' || value === 'false';\n\n if (value === ET_PROP_NULL_VALUE) {\n deserializedValue = null;\n } else if (\n defaultIsNum ||\n (valueIsNum && !valueContainsWhitespace && !valueHasLeadingZero && !valueEndsWithDot)\n ) {\n deserializedValue = transformToNumber(value);\n } else if (defaultIsBool || valueIsBool) {\n deserializedValue = transformToBoolean(value);\n }\n }\n\n const valueIsEqualToCurrent = equal(deserializedValue, field.control.value);\n\n if (valueIsEqualToCurrent) continue;\n\n field.control.setValue(deserializedValue, { emitEvent: false });\n didValueChanges = true;\n }\n\n return didValueChanges;\n }\n\n setValue(value: QueryFormValue<T>, options?: QueryFormWriteOptions) {\n this._form._setValue(value, options);\n\n if (options?.skipResets) {\n this.skipNextResets = true;\n }\n }\n\n patchValue(value: Partial<QueryFormValue<T>>, options?: QueryFormWriteOptions) {\n this._form._patchValue(value, options);\n\n if (options?.skipResets) {\n this.skipNextResets = true;\n }\n }\n\n resetFieldToDefault(key: keyof QueryFormValue<T>, options?: QueryFormWriteOptions) {\n const defaultValue = this.getDefaultValue(key as string);\n\n this.form.controls[key].setValue(defaultValue);\n\n if (options?.skipResets) {\n this.skipNextResets = true;\n }\n }\n\n resetFieldsToDefault(keys: (keyof QueryFormValue<T>)[], options?: QueryFormWriteOptions) {\n const defaults = keys.reduce(\n (acc, key) => {\n acc[key] = this.getDefaultValue(key as string);\n\n return acc;\n },\n {} as Partial<QueryFormValue<T>>,\n );\n\n this.patchValue(defaults);\n\n if (options?.skipResets) {\n this.skipNextResets = true;\n }\n }\n\n resetAllFieldsToDefault(options?: QueryFormWriteOptions & { skipFields?: (keyof QueryFormValue<T>)[] }) {\n const keys = Object.keys(this._fields) as (keyof QueryFormValue<T>)[];\n\n if (options?.skipFields) {\n for (const key of options.skipFields) {\n const index = keys.indexOf(key);\n\n if (index !== -1) {\n keys.splice(index, 1);\n }\n }\n }\n\n this.resetFieldsToDefault(keys, options);\n }\n\n private get formValue() {\n return this.form.getRawValue() as QueryFormValue<T>;\n }\n\n private get _form() {\n return this.form as unknown as QueryFormGroup;\n }\n\n private _handleQueryFormResets(previousValue: QueryFormValue<T> | null, currentValue: QueryFormValue<T>) {\n let didResetValues = false;\n\n for (const formFieldKey in this._fields) {\n const field = this._fields[formFieldKey];\n\n if (!field) continue;\n\n const resets = field.data.isResetBy;\n\n if (!resets) continue;\n\n const resetConditionKeys = Array.isArray(resets) ? resets : [resets];\n\n for (const resetConditionKey of resetConditionKeys) {\n if (!(resetConditionKey in this._fields)) {\n if (isDevMode()) {\n console.warn(`The field \"${resetConditionKey}\" is not defined in the QueryForm. Is it a typo?`, this);\n }\n\n continue;\n }\n\n if (\n previousValue &&\n currentValue &&\n !equal(previousValue[resetConditionKey], currentValue[resetConditionKey])\n ) {\n const defaultValueForKeyToReset = this.getDefaultValue(formFieldKey);\n const currentValueForKeyToReset = currentValue[formFieldKey];\n\n if (equal(defaultValueForKeyToReset, currentValueForKeyToReset)) {\n continue;\n }\n\n this.form.controls[formFieldKey].setValue(defaultValueForKeyToReset);\n\n didResetValues = true;\n\n break;\n }\n }\n }\n\n return didResetValues;\n }\n\n private getDefaultValue(key: string) {\n const val = this.defaultValues[key];\n\n if (typeof val === 'string' && val.startsWith(ET_ARR_PREFIX)) {\n return JSON.parse(val.slice(ET_ARR_PREFIX.length));\n } else if (typeof val === 'string' && val.startsWith(ET_OBJ_PREFIX)) {\n return JSON.parse(val.slice(ET_OBJ_PREFIX.length));\n } else if (typeof val === 'function') {\n return val();\n } else if (val === ET_PROP_NULL_VALUE) {\n return null;\n }\n\n return val ?? null;\n }\n\n private transformKeyToQueryParam(key: string) {\n if (!this._options?.queryParamPrefix) return key;\n\n const prefix =\n typeof this._options?.queryParamPrefix === 'string'\n ? this._options.queryParamPrefix\n : this._options.queryParamPrefix();\n\n return `${prefix}-${key}`;\n }\n\n private isDefaultValue(key: string, value: unknown) {\n const normalizedValue = Array.isArray(value)\n ? `${ET_ARR_PREFIX}${JSON.stringify(value)}`\n : typeof value === 'object' && value !== null\n ? `${ET_OBJ_PREFIX}${JSON.stringify(value)}`\n : value === null\n ? ET_PROP_NULL_VALUE\n : value;\n\n return this.defaultValues[key] === normalizedValue;\n }\n\n private setupFormGroup() {\n const group = new FormGroup({} as QueryFormGroupControls<T>) as unknown as QueryFormGroup;\n\n for (const [key, field] of Object.entries(this._fields)) {\n group.addControl(key, field.control);\n }\n\n group._patchValue = group.patchValue;\n group._setValue = group.setValue;\n\n group.patchValue = this.patchValue.bind(this);\n group.setValue = this.setValue.bind(this);\n\n return group as unknown as FormGroup<QueryFormGroupControls<T>>;\n }\n\n private extractDefaultValues() {\n const defaultValues: Record<string, unknown> = {};\n\n for (const [key, field] of Object.entries(this._fields)) {\n const value = field.data.defaultValue !== undefined ? field.data.defaultValue : field.control.value;\n\n if (Array.isArray(value)) {\n defaultValues[key] = `${ET_ARR_PREFIX}${JSON.stringify(value)}`;\n } else if (typeof value === 'object' && value !== null) {\n defaultValues[key] = `${ET_OBJ_PREFIX}${JSON.stringify(value)}`;\n } else if (value === null) {\n defaultValues[key] = ET_PROP_NULL_VALUE;\n } else {\n defaultValues[key] = value;\n }\n }\n\n return defaultValues;\n }\n\n private _syncViaUrlQueryParams(values: QueryFormValue<T>, replaceUrl?: boolean) {\n const queryParams = { ...clone(this.activatedRoute.snapshot.queryParams) };\n\n for (const [key, value] of Object.entries(values)) {\n const queryParamKey = this.transformKeyToQueryParam(key);\n const field = this._fields[key];\n\n if (!field) {\n continue;\n }\n\n const isDefault = this.isDefaultValue(key, value);\n const writeDefaultToUrl = field.data.appendDefaultValueToUrl === true;\n const writeToUrl = field.data.appendToUrl !== false;\n\n if (!writeToUrl || (isDefault && !writeDefaultToUrl)) {\n queryParams[queryParamKey] = undefined;\n } else {\n queryParams[queryParamKey] = field.data.valueToQueryParamTransformFn\n ? field.data.valueToQueryParamTransformFn?.(value)\n : value === null\n ? ET_PROP_NULL_VALUE\n : value;\n }\n }\n\n this.zone.run(() => {\n queueMicrotask(() => {\n this.router.navigate([], {\n queryParams,\n replaceUrl,\n queryParamsHandling: 'merge',\n });\n });\n });\n }\n\n private handleFormChange(forceOverwrite = false) {\n // Normalize values that have a valueToQueryParamTransformFn returning null/undefined to their\n // field default before capturing the new value. This prevents intermediate \"empty object\" states\n // (e.g. Sort emitting { active: '', direction: '' } when cleared) from being\n // emitted as distinct form values.\n for (const [key, field] of Object.entries(this._fields)) {\n if (!field.data.valueToQueryParamTransformFn) continue;\n const rawValue = (this.formValue as Record<string, unknown>)[key];\n if (this.isDefaultValue(key, rawValue)) continue;\n const serialized = field.data.valueToQueryParamTransformFn(rawValue);\n if (serialized !== null && serialized !== undefined) continue;\n this.form.controls[key]?.setValue(this.getDefaultValue(key), { emitEvent: false });\n }\n\n const currentVal = clone(this.currentFormValue$.value);\n const newVal = clone(this.formValue);\n\n if (equal(currentVal, newVal)) {\n return;\n }\n\n if (forceOverwrite) {\n this.lastFormValue$.next(newVal);\n } else {\n this.lastFormValue$.next(currentVal);\n }\n\n this.currentFormValue$.next(newVal);\n }\n\n private cleanup() {\n if (!this.isObserving) return;\n\n this.isObserving = false;\n\n const queryParamKeys = Object.keys(this._fields);\n const queryParams = queryParamKeys.reduce(\n (acc, key) => {\n acc[this.transformKeyToQueryParam(key)] = undefined;\n return acc;\n },\n {} as Record<string, unknown>,\n );\n this.zone.run(() => {\n queueMicrotask(() => {\n this.router.navigate([], {\n queryParams,\n replaceUrl: true,\n queryParamsHandling: 'merge',\n });\n });\n });\n }\n}\n","import {\n DestroyRef,\n Injector,\n Signal,\n assertInInjectionContext,\n computed,\n effect,\n inject,\n isDevMode,\n signal,\n untracked,\n} from '@angular/core';\nimport { FieldTree, form } from '@angular/forms/signals';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { ET_PROPERTY_REMOVED, clone, equal, injectQueryParamChanges } from '@ethlete/core';\nimport { QueryDevtoolsFormField, QueryDevtoolsFormHandle } from '../devtools/query-devtools-form';\nimport { isQueryDevtoolsEnabled, noteQueryFormRead, registerQueryDevtoolsEntry } from '../devtools/query-devtools-hook';\nimport { transformToBoolean, transformToNumber } from '../query-form/query-form.utils';\nimport {\n QueryFieldDef,\n QueryFormChange,\n QueryFormFields,\n QueryFormModel,\n QueryFormSignalsObserveOptions,\n QueryFormSignalsWriteOptions,\n} from './query-form-signals.types';\n\n/** URL sentinel for an explicit `null` value (a bare empty param would be ambiguous). */\nconst ET_NULL_VALUE = 'ET_NULL__';\n\n/**\n * Fields excluded from `activeFilterCount` by default - pagination, sorting and\n * search are navigation state, not filters.\n */\nexport const IGNORED_FILTER_COUNT_FIELDS: readonly string[] = [\n 'page',\n 'skip',\n 'take',\n 'limit',\n 'sort',\n 'sortBy',\n 'sortOrder',\n 'query',\n 'search',\n];\n\ntype Dict = Record<string, unknown>;\n\nconst resolveDefault = (def: QueryFieldDef<unknown>): unknown => {\n const { defaultValue } = def;\n\n return typeof defaultValue === 'function' ? (defaultValue as () => unknown)() : (defaultValue ?? null);\n};\n\nconst buildDefaults = (fields: QueryFormFields): Dict => {\n const out: Dict = {};\n\n for (const [key, def] of Object.entries(fields)) {\n out[key] = resolveDefault(def);\n }\n\n return out;\n};\n\nconst MAX_RESET_PASSES = 10;\n\nconst changedKeysBetween = (previous: Dict | null, current: Dict): string[] =>\n Object.keys(current).filter((key) => !equal(previous?.[key], current[key]));\n\n/** Best-effort URL string → value coercion, mirroring the auto-transform of the legacy QueryForm. */\nconst autoCoerce = (raw: unknown, defaultValue: unknown): unknown => {\n if (raw === ET_NULL_VALUE) return null;\n\n if (typeof raw !== 'string') return raw;\n\n const defaultIsNumber = typeof defaultValue === 'number';\n const looksNumeric = raw.trim() === raw && !raw.startsWith('0') && !raw.endsWith('.') && !isNaN(Number(raw));\n\n if (defaultIsNumber || (looksNumeric && raw !== '')) {\n return transformToNumber(raw);\n }\n\n if (raw === 'true' || raw === 'false') {\n return transformToBoolean(raw);\n }\n\n return raw;\n};\n\nconst computeFilterCount = (fields: QueryFormFields, value: Dict, defaults: Dict) => {\n let count = 0;\n\n for (const [key, def] of Object.entries(fields)) {\n if (IGNORED_FILTER_COUNT_FIELDS.includes(key) || def.skipInFilterCount) continue;\n if (!equal(value[key], defaults[key])) count++;\n }\n\n return count;\n};\n\n/**\n * A detached editor over the same fields - its own signal-forms form and value,\n * with no URL sync and no reset graph. Written back to the source form via\n * `source.setValue(branch.value())`. Powers the filter-overlay \"edit then apply\"\n * pattern (see `10-filter.md`).\n */\nexport type QueryFormBranch<TFields extends QueryFormFields> = {\n /** The bindable signal-forms field tree (`branch.fields.search`). */\n readonly fields: FieldTree<QueryFormModel<TFields>>;\n /** The live (undebounced) value of the branch. */\n readonly value: Signal<QueryFormModel<TFields>>;\n /** The number of active (non-default) filters in the branch. */\n readonly activeFilterCount: Signal<number>;\n setValue(value: QueryFormModel<TFields>): void;\n patchValue(value: Partial<QueryFormModel<TFields>>): void;\n resetFieldToDefault(key: keyof QueryFormModel<TFields>): void;\n resetAllFieldsToDefault(): void;\n};\n\nconst createBranch = <TFields extends QueryFormFields>(\n fields: TFields,\n initial: QueryFormModel<TFields>,\n injector: Injector,\n): QueryFormBranch<TFields> => {\n const defaults = buildDefaults(fields);\n const model = signal<QueryFormModel<TFields>>(clone(initial));\n const tree = form(model, { injector });\n\n return {\n fields: tree,\n value: model.asReadonly(),\n activeFilterCount: computed(() => computeFilterCount(fields, model() as Dict, defaults)),\n setValue: (value) => model.set(clone(value)),\n patchValue: (value) => model.update((cur) => ({ ...cur, ...value })),\n resetFieldToDefault: (key) => model.update((cur) => ({ ...cur, [key]: defaults[key as string] })),\n resetAllFieldsToDefault: () => model.set(clone(defaults) as QueryFormModel<TFields>),\n };\n};\n\nexport type DefineQueryFormConfig<TFields extends QueryFormFields> = {\n readonly fields: TFields;\n\n /**\n * A prefix for every query-param key, so multiple query forms can coexist on\n * one route (e.g. prefix `'users'` maps the `page` field to `users-page`).\n * A function is evaluated every time a key is built.\n */\n readonly queryParamPrefix?: string | (() => string);\n\n /**\n * What the form is called in the devtools Forms tab. Defaults to the\n * `queryParamPrefix` where it is a plain string, and to `form` otherwise.\n * Ignored unless `provideQueryDevtools()` is installed.\n */\n readonly name?: string;\n};\n\n/**\n * A signals-first query form: binds on-screen controls to typed fields, keeps a\n * debounced committed value, syncs to the URL query params, and resets dependent\n * fields via the `isResetBy` graph - all as signals.\n *\n * Created with {@link defineQueryForm}.\n */\nexport type QueryFormSignals<TFields extends QueryFormFields> = {\n /**\n * The bindable signal-forms field tree - bind a field with `[formField]`, e.g.\n * `<input etInput [formField]=\"qf.fields.search\" />`.\n */\n readonly fields: FieldTree<QueryFormModel<TFields>>;\n\n /** The committed value of the form. */\n readonly value: Signal<QueryFormModel<TFields>>;\n\n /** The committed value before the most recent change. */\n readonly previousValue: Signal<QueryFormModel<TFields> | null>;\n\n /** The previous/current value pair of the most recent committed change. */\n readonly changes: Signal<QueryFormChange<TFields>>;\n\n /**\n * The number of active filters. Excludes the pagination/sort/search keys and\n * any field created with `skipInFilterCount`.\n */\n readonly activeFilterCount: Signal<number>;\n\n /** The default value of the whole form. */\n readonly defaultValue: QueryFormModel<TFields>;\n\n /** Start syncing with the URL. Returns the form, so it can be chained onto the definition. */\n observe(options?: QueryFormSignalsObserveOptions): QueryFormSignals<TFields>;\n\n /** Stop syncing and strip the form's params from the URL. Runs on destroy anyway. */\n unobserve(): void;\n\n setValue(value: QueryFormModel<TFields>, options?: QueryFormSignalsWriteOptions): void;\n patchValue(value: Partial<QueryFormModel<TFields>>, options?: QueryFormSignalsWriteOptions): void;\n resetFieldToDefault(key: keyof QueryFormModel<TFields>, options?: QueryFormSignalsWriteOptions): void;\n resetFieldsToDefault(keys: (keyof QueryFormModel<TFields>)[], options?: QueryFormSignalsWriteOptions): void;\n resetAllFieldsToDefault(\n options?: QueryFormSignalsWriteOptions & { skipFields?: (keyof QueryFormModel<TFields>)[] },\n ): void;\n\n /** Create a detached editor over the same fields, seeded from the current committed value. */\n branch(): QueryFormBranch<TFields>;\n};\n\n/**\n * Per-name sequence behind the devtools id of a form, mirroring the registry's own scheme so the\n * panel can restore the selected form after a reload.\n */\nconst devtoolsIdCounters = /* @__PURE__ */ new Map<string, number>();\n\nconst nextQueryFormDevtoolsId = (name: string) => {\n const seq = devtoolsIdCounters.get(name) ?? 0;\n\n devtoolsIdCounters.set(name, seq + 1);\n\n return `query-form|${name}#${seq}`;\n};\n\n/**\n * Define a {@link QueryFormSignals}. Call `.observe()` to start syncing with the\n * URL. Must be called in an injection context.\n *\n * @example\n * const qf = defineQueryForm({\n * fields: {\n * search: searchQueryField(),\n * sort: sortQueryField(),\n * page: queryField<number>({ defaultValue: 1, isResetBy: ['search', 'sort'] }),\n * },\n * }).observe();\n * // template: <input etInput [formField]=\"qf.fields.search\" />\n */\nexport const defineQueryForm = <TFields extends QueryFormFields>(\n config: DefineQueryFormConfig<TFields>,\n): QueryFormSignals<TFields> => {\n assertInInjectionContext(defineQueryForm);\n\n const router = inject(Router);\n const route = inject(ActivatedRoute);\n const injector = inject(Injector);\n const destroyRef = inject(DestroyRef);\n const queryParamChanges = injectQueryParamChanges();\n\n const fieldDefs = config.fields;\n const prefix = config.queryParamPrefix;\n const defaults = buildDefaults(fieldDefs);\n const defaultValue = clone(defaults) as QueryFormModel<TFields>;\n\n /** Live field values (updated immediately by bound controls). */\n const model = signal(clone(defaults) as QueryFormModel<TFields>);\n\n /** The committed (debounced) value that drives `value`, the URL and the filter count. */\n const committed = signal(clone(defaults) as QueryFormModel<TFields>);\n const previous = signal<QueryFormModel<TFields> | null>(null);\n\n const observing = signal(false);\n const commitPending = signal(false);\n\n let observeOptions: QueryFormSignalsObserveOptions | undefined;\n let pendingTimer: ReturnType<typeof setTimeout> | null = null;\n let skipNextResets = false;\n\n const fields = form(model);\n\n const activeFilterCount = computed(() => computeFilterCount(fieldDefs, committed() as Dict, defaults));\n\n const paramKey = (key: string) => {\n if (!prefix) return key;\n\n return `${typeof prefix === 'string' ? prefix : prefix()}-${key}`;\n };\n\n /** What a field puts in the URL for a given value, or `undefined` when it writes nothing. */\n const queryParamFor = (key: string, def: QueryFieldDef<unknown>, value: unknown) => {\n const isDefault = equal(value, defaults[key]);\n const writeToUrl = def.appendToUrl !== false;\n const writeDefault = def.appendDefaultValueToUrl === true;\n\n if (!writeToUrl || (isDefault && !writeDefault)) return undefined;\n if (def.valueToQueryParam) return def.valueToQueryParam(value);\n\n return value === null ? ET_NULL_VALUE : value;\n };\n\n const deserialize = (def: QueryFieldDef<unknown>, raw: unknown): unknown => {\n if (def.queryParamToValue) return def.queryParamToValue(raw);\n if (def.skipAutoTransform) return raw;\n\n return autoCoerce(raw, resolveDefault(def));\n };\n\n const clearTimer = () => {\n if (pendingTimer !== null) {\n clearTimeout(pendingTimer);\n pendingTimer = null;\n }\n\n commitPending.set(false);\n };\n\n const writeToUrl = (value: Dict) => {\n const queryParams: Dict = {};\n\n for (const [key, def] of Object.entries(fieldDefs)) {\n queryParams[paramKey(key)] = queryParamFor(key, def, value[key]);\n }\n\n queueMicrotask(() => {\n router.navigate([], {\n queryParams,\n queryParamsHandling: 'merge',\n replaceUrl: observeOptions?.replaceUrl,\n });\n });\n };\n\n const applyResets = (live: Dict, changedKeys: string[]): Dict => {\n const next = { ...live };\n\n for (const [key, def] of Object.entries(fieldDefs)) {\n const resets = def.isResetBy;\n\n if (!resets?.length) continue;\n\n const triggered = resets.some((resetKey) => {\n if (!(resetKey in fieldDefs)) {\n if (isDevMode()) {\n console.warn(`defineQueryForm: isResetBy references unknown field \"${resetKey}\". Is it a typo?`);\n }\n\n return false;\n }\n\n return changedKeys.includes(resetKey);\n });\n\n if (!triggered) continue;\n\n const fieldDefault = defaults[key];\n\n if (!equal(next[key], fieldDefault)) {\n next[key] = fieldDefault;\n }\n }\n\n return next;\n };\n\n /**\n * Resets are transitive: a field this pass reset counts as changed in the next one, so\n * `country → league → team` clears `team` as well when only `country` moved. Passes repeat until\n * nothing moves, which has to happen before `committed` is written - one query execution for the\n * whole chain, not one per hop. The cap only guards a cyclic `isResetBy` graph; a field already at\n * its default stops triggering, so a well-formed graph settles in as many passes as it is deep.\n */\n const resolveResets = (prev: Dict, live: Dict): Dict => {\n let next = live;\n\n for (let pass = 0; pass < MAX_RESET_PASSES; pass++) {\n const applied = applyResets(next, changedKeysBetween(prev, next));\n\n if (equal(applied, next)) return applied;\n\n next = applied;\n }\n\n if (isDevMode()) {\n console.warn(`defineQueryForm: isResetBy did not settle within ${MAX_RESET_PASSES} passes. Check for a cycle.`);\n }\n\n return next;\n };\n\n const flush = () => {\n clearTimer();\n\n const live = model() as Dict;\n const prev = committed() as Dict;\n\n if (equal(live, prev)) {\n skipNextResets = false;\n\n return;\n }\n\n const next = skipNextResets ? { ...live } : resolveResets(prev, live);\n\n skipNextResets = false;\n\n previous.set(clone(prev) as QueryFormModel<TFields>);\n committed.set(clone(next) as QueryFormModel<TFields>);\n\n // Reflect any reset overrides back into the bound controls. The effect re-runs\n // but no-ops because the model now equals the committed value.\n if (!equal(next, live)) {\n model.set(clone(next) as QueryFormModel<TFields>);\n }\n\n if (observing() && observeOptions?.writeToQueryParams !== false) {\n writeToUrl(next);\n }\n };\n\n /** Shortest-debounce-wins; `null` means commit immediately. */\n const resolveDebounce = (changedKeys: string[], live: Dict): number | null => {\n if (!changedKeys.length) return null;\n\n const times: number[] = [];\n\n for (const key of changedKeys) {\n const def = fieldDefs[key];\n\n if (!def) return null;\n if (def.disableDebounceIfFalsy && !live[key]) return null;\n if (def.debounce === undefined) return null;\n\n times.push(def.debounce);\n }\n\n return Math.min(...times);\n };\n\n const onLiveChange = (live: Dict) => {\n if (!observing()) return;\n if (equal(live, committed())) return;\n\n const changedKeys = changedKeysBetween(committed() as Dict, live);\n const debounceMs = resolveDebounce(changedKeys, live);\n\n clearTimer();\n\n if (debounceMs === null) {\n flush();\n } else {\n commitPending.set(true);\n pendingTimer = setTimeout(() => {\n pendingTimer = null;\n flush();\n }, debounceMs);\n }\n };\n\n const commitFromUrl = (next: Dict) => {\n clearTimer();\n previous.set(clone(committed()) as QueryFormModel<TFields>);\n committed.set(clone(next) as QueryFormModel<TFields>);\n // Feed the URL value into the live model & bound controls; the effect no-ops (model === committed).\n model.set(clone(next) as QueryFormModel<TFields>);\n };\n\n const applyFromUrl = (params: Dict) => {\n const current = { ...(committed() as Dict) };\n let changed = false;\n\n for (const [key, def] of Object.entries(fieldDefs)) {\n const raw = params[paramKey(key)];\n\n if (raw === undefined) continue;\n\n const value = raw === ET_PROPERTY_REMOVED ? defaults[key] : deserialize(def, raw);\n\n if (!equal(current[key], value)) {\n current[key] = value;\n changed = true;\n }\n }\n\n if (!changed) return;\n\n commitFromUrl(current);\n };\n\n const cleanup = () => {\n if (!observing()) return;\n\n observing.set(false);\n clearTimer();\n\n if (observeOptions?.writeToQueryParams === false) return;\n\n const queryParams: Dict = {};\n\n for (const key of Object.keys(fieldDefs)) {\n queryParams[paramKey(key)] = undefined;\n }\n\n queueMicrotask(() => {\n router.navigate([], { queryParams, queryParamsHandling: 'merge', replaceUrl: true });\n });\n };\n\n const setValue = (value: QueryFormModel<TFields>, options?: QueryFormSignalsWriteOptions) => {\n if (options?.skipResets) skipNextResets = true;\n\n model.set(clone(value));\n };\n\n const patchValue = (value: Partial<QueryFormModel<TFields>>, options?: QueryFormSignalsWriteOptions) => {\n if (options?.skipResets) skipNextResets = true;\n\n model.update((cur) => ({ ...cur, ...value }));\n };\n\n const resetFieldsToDefault = (keys: (keyof QueryFormModel<TFields>)[], options?: QueryFormSignalsWriteOptions) => {\n if (options?.skipResets) skipNextResets = true;\n\n model.update((cur) => {\n const next = { ...cur } as Dict;\n\n for (const key of keys) {\n next[key as string] = defaults[key as string];\n }\n\n return next as QueryFormModel<TFields>;\n });\n };\n\n const devtoolsName = config.name ?? (typeof prefix === 'string' ? prefix : 'form');\n const devtoolsId = isQueryDevtoolsEnabled() ? nextQueryFormDevtoolsId(devtoolsName) : null;\n\n const queryForm: QueryFormSignals<TFields> = {\n fields,\n\n // Reading `value` is how a query's args pick the form up, so the devtools learn which query a form\n // drives by noting the read - see `QueryDevtoolsFormLinksHandle`.\n value: devtoolsId\n ? computed(() => {\n noteQueryFormRead(devtoolsId);\n\n return committed();\n })\n : committed.asReadonly(),\n\n previousValue: previous.asReadonly(),\n changes: computed(() => ({ previousValue: previous(), currentValue: committed() })),\n activeFilterCount,\n defaultValue,\n\n observe: (options) => {\n if (observing()) {\n if (isDevMode()) {\n console.warn('defineQueryForm: observe() was called more than once. Ignoring the extra call.');\n }\n\n return queryForm;\n }\n\n observeOptions = options;\n observing.set(true);\n\n if (options?.syncOnNavigation !== false) {\n applyFromUrl(route.snapshot.queryParams as Dict);\n }\n\n // Commit whatever the model holds now (URL-restored or programmatic defaults).\n flush();\n\n return queryForm;\n },\n\n unobserve: () => cleanup(),\n\n setValue,\n patchValue,\n resetFieldToDefault: (key, options) => resetFieldsToDefault([key], options),\n resetFieldsToDefault,\n\n resetAllFieldsToDefault: (options) => {\n const skip = new Set((options?.skipFields ?? []).map((key) => key as string));\n const keys = Object.keys(fieldDefs).filter((key) => !skip.has(key)) as (keyof QueryFormModel<TFields>)[];\n\n resetFieldsToDefault(keys, options);\n },\n\n branch: () => createBranch(fieldDefs, clone(committed()), injector),\n };\n\n // React to live control edits: schedule a debounced commit.\n effect(() => {\n const live = model();\n\n untracked(() => onLiveChange(live as Dict));\n });\n\n // React to navigation (back/forward, external links): apply URL → form immediately.\n effect(() => {\n const changes = queryParamChanges();\n\n untracked(() => {\n if (!observing() || observeOptions?.syncOnNavigation === false) return;\n\n applyFromUrl(changes as Dict);\n });\n });\n\n destroyRef.onDestroy(() => cleanup());\n\n if (devtoolsId) {\n /**\n * The live view `<et-query-devtools>` renders. Only built while the devtools are installed - it walks\n * every field on every change, which an app without them should not pay for.\n */\n const handle: QueryDevtoolsFormHandle = {\n fields: computed(() => {\n const committedValue = committed() as Dict;\n const live = model() as Dict;\n\n return Object.entries(fieldDefs).map(([key, def]): QueryDevtoolsFormField => {\n const value = committedValue[key];\n\n return {\n key,\n paramKey: paramKey(key),\n value,\n liveValue: live[key],\n defaultValue: defaults[key],\n isDefault: equal(value, defaults[key]),\n queryParam: queryParamFor(key, def, value),\n debounceMs: def.debounce ?? null,\n isResetBy: def.isResetBy ?? [],\n countsAsFilter: !IGNORED_FILTER_COUNT_FIELDS.includes(key) && !def.skipInFilterCount,\n };\n });\n }),\n // Not `queryForm.value` - reading that from the panel would link the form to whichever query happens\n // to be building its args at the time.\n value: computed(() => committed() as Dict),\n previousValue: computed(() => (previous() as Dict | null) ?? null),\n defaultValue: defaults,\n activeFilterCount,\n isAtDefaults: computed(() => equal(committed(), defaults)),\n isCommitPending: commitPending.asReadonly(),\n isObserving: observing.asReadonly(),\n resetField: (key) => queryForm.resetFieldToDefault(key as keyof QueryFormModel<TFields>),\n resetAll: () => queryForm.resetAllFieldsToDefault(),\n };\n\n destroyRef.onDestroy(\n registerQueryDevtoolsEntry({\n id: devtoolsId,\n kind: 'query-form',\n handle,\n meta: { name: devtoolsName },\n }),\n );\n }\n\n return queryForm;\n};\n","import {\n Sort,\n transformToBooleanArray,\n transformToDate,\n transformToDateArray,\n transformToNumberArray,\n transformToSort,\n transformToSortQueryParam,\n transformToStringArray,\n} from '../query-form/query-form.utils';\nimport { QueryFieldConfig, QueryFieldDef } from './query-form-signals.types';\n\nconst normalizeConfig = <T>(config: QueryFieldConfig<T> | undefined): Partial<QueryFieldDef<T>> => {\n if (!config) return {};\n\n const { isResetBy, ...rest } = config;\n\n return {\n ...rest,\n isResetBy: isResetBy === undefined ? undefined : Array.isArray(isResetBy) ? isResetBy : [isResetBy],\n };\n};\n\n/**\n * A generic query-form field. Defaults to `null` and, unless a transform is\n * given, relies on the auto-coercion when reading back from the URL.\n *\n * @example\n * queryField<number>({ defaultValue: 1, isResetBy: ['search'] })\n */\nexport const queryField = <T = string>(config?: QueryFieldConfig<T | null>): QueryFieldDef<T | null> => ({\n defaultValue: null,\n ...normalizeConfig(config),\n});\n\n/**\n * A debounced free-text search field. Debounces typing by 300ms but applies\n * clearing immediately (`disableDebounceIfFalsy`).\n */\nexport const searchQueryField = (config?: QueryFieldConfig<string | null>): QueryFieldDef<string | null> => ({\n defaultValue: null,\n debounce: 300,\n disableDebounceIfFalsy: true,\n ...normalizeConfig(config),\n});\n\n/**\n * A sort field serialized as `\"active:direction\"` (e.g. `\"name:asc\"`). Matches\n * the wire format the table system's URL adapter uses, so the two interoperate.\n */\nexport const sortQueryField = (config?: QueryFieldConfig<Sort | null>): QueryFieldDef<Sort | null> => ({\n defaultValue: null,\n queryParamToValue: transformToSort,\n valueToQueryParam: transformToSortQueryParam,\n ...normalizeConfig(config),\n});\n\n/** A field holding a list of strings. */\nexport const stringArrayQueryField = (config?: QueryFieldConfig<string[] | null>): QueryFieldDef<string[] | null> => ({\n defaultValue: null,\n queryParamToValue: transformToStringArray,\n ...normalizeConfig(config),\n});\n\n/** A field holding a list of numbers. */\nexport const numberArrayQueryField = (config?: QueryFieldConfig<number[] | null>): QueryFieldDef<number[] | null> => ({\n defaultValue: null,\n queryParamToValue: transformToNumberArray,\n ...normalizeConfig(config),\n});\n\n/** A field holding a list of booleans. */\nexport const booleanArrayQueryField = (\n config?: QueryFieldConfig<boolean[] | null>,\n): QueryFieldDef<boolean[] | null> => ({\n defaultValue: null,\n queryParamToValue: transformToBooleanArray,\n ...normalizeConfig(config),\n});\n\n/** A single date field (expects an ISO/`Date`-parseable string in the URL). */\nexport const dateQueryField = (config?: QueryFieldConfig<Date | null>): QueryFieldDef<Date | null> => ({\n defaultValue: null,\n queryParamToValue: transformToDate,\n ...normalizeConfig(config),\n});\n\n/** A field holding a list of dates. */\nexport const dateArrayQueryField = (config?: QueryFieldConfig<Date[] | null>): QueryFieldDef<Date[] | null> => ({\n defaultValue: null,\n queryParamToValue: transformToDateArray,\n ...normalizeConfig(config),\n});\n","import { RuntimeError } from '@ethlete/core';\n\n// codes 1000-1999\nexport const WebSocketRuntimeErrorCode = {\n // Web Socket Client\n ROOM_NOT_JOINED: 1000,\n MESSAGE_MALFORMED: 1001,\n} as const;\n\nexport type WebSocketRuntimeErrorCode = (typeof WebSocketRuntimeErrorCode)[keyof typeof WebSocketRuntimeErrorCode];\n\nexport const roomNotJoined = (room: string) => {\n return new RuntimeError(\n WebSocketRuntimeErrorCode.ROOM_NOT_JOINED,\n `Tried leaving the room \"${room}\" but it has not been joined.`,\n );\n};\n\nexport const messageMalformed = () => {\n return new RuntimeError(\n WebSocketRuntimeErrorCode.MESSAGE_MALFORMED,\n 'A message has been received but it is malformed (cannot be parsed as JSON).',\n );\n};\n","import {\n computed,\n DestroyRef,\n effect,\n inject,\n isDevMode,\n Signal,\n signal,\n untracked,\n WritableSignal,\n} from '@angular/core';\nimport { defineRootProvider, previousSignalValue, ProviderDefinition } from '@ethlete/core';\nimport { isQueryDevtoolsEnabled, registerQueryDevtoolsEntry } from '../devtools/query-devtools-hook';\nimport { messageMalformed, roomNotJoined } from './web-socket-errors';\n\n/** A single message captured for the devtools web socket inspector. */\nexport type WebSocketDevtoolsMessage = {\n id: number;\n timestamp: number;\n room: string;\n event: string;\n data: unknown;\n\n /**\n * Whether the message arrived from the server or was sent by this client - room joins and leaves\n * included, which is what makes \"the room was never joined\" tellable from \"the room is quiet\".\n */\n direction: 'in' | 'out';\n};\n\n/**\n * The live handle a web socket client registers with the devtools. Read by the `<et-query-devtools>`\n * Sockets tab. Not part of the general public contract.\n */\nexport type WebSocketDevtoolsHandle = {\n connected: Signal<boolean>;\n rooms: Signal<string[]>;\n messages: Signal<WebSocketDevtoolsMessage[]>;\n\n /**\n * Sends a message the way the app would, so the panel can provoke a server that only answers a\n * client that asked. Recorded in {@link messages} like any other outgoing one.\n */\n emit: (options: { event: string; data: unknown }) => void;\n};\n\nconst MAX_DEVTOOLS_MESSAGES = 100;\n\nexport type CreateWebSocketClientTransport = 'polling' | 'websocket' | 'webtransport';\n\n/** The options {@link createWebSocketClient} passes to the socket io factory. */\nexport type WebSocketClientIoOptions = {\n withCredentials: boolean;\n autoConnect: boolean;\n transports: CreateWebSocketClientTransport[] | undefined;\n};\n\n/** The slice of a socket io `Socket` this client drives. */\nexport type WebSocketClientSocket = {\n connect: () => void;\n disconnect: () => void;\n emit: (event: string, data: unknown) => void;\n on: (event: 'connect' | 'disconnect', listener: () => void) => void;\n onAny: (listener: (data: string) => void) => void;\n};\n\n/**\n * The `io` factory of `socket.io-client`, declared structurally.\n *\n * `@ethlete/query` never imports `socket.io-client` itself: the package ships no `sideEffects: false`,\n * so a single static import of it is unshakeable and would cost *every* consumer ~13 kB gz - a\n * REST-only app included, which could then not even build without installing the optional peer.\n * Passing `io` in keeps that cost with the apps that actually open a socket.\n */\nexport type WebSocketClientIo = (url: string, options: WebSocketClientIoOptions) => WebSocketClientSocket;\n\nexport type CreateWebSocketClientConfigOptions = {\n /** A unique name for the client */\n name: string;\n\n /** The URL of the socket io server */\n url: string;\n\n /**\n * The `io` factory, imported by the app: `import { io } from 'socket.io-client'`.\n *\n * @example\n * ```ts\n * import { io } from 'socket.io-client';\n *\n * const MATCH_SOCKET = createWebSocketClient({ name: 'match', url: env.wsUrl, io });\n * ```\n */\n io: WebSocketClientIo;\n\n /** A list of transports to try (in order). Engine.io always attempts to connect directly with the first one, provided the feature detection test for it passes. */\n transports?: CreateWebSocketClientTransport[];\n};\n\n/** A default socket io message view */\nexport type SocketMessageView<TMessageData = unknown> = {\n room: string;\n event: string;\n data: TMessageData;\n};\n\nexport type WebSocketClientSubtle = {\n /**\n * Releases one join of a socket io room. Joiners of the same room share it, so the room is only\n * actually left once every one of them has released it.\n */\n leaveRoom: (room: string) => void;\n};\n\nexport type WebSocketClient<TMessageData extends SocketMessageView> = {\n /**\n * Join a socket io room\n * If a function is passed, it will be evaluated in a reactive signal context.\n * If the function returns null, no room will be joined.\n * If the function returns a string, the previous room will be left and the new room will be joined.\n */\n joinRoom: (room: string | (() => string | null)) => Signal<WebSocketRoom<TMessageData> | null>;\n\n /** Whether the client is connected to the server */\n isConnected: Signal<boolean>;\n\n /** Advanced web socket features. **WARNING!** Incorrectly using these features will likely **BREAK** your application. You have been warned! */\n subtle: WebSocketClientSubtle;\n};\n\nexport type InternalWebSocketRoom<TMessageData extends SocketMessageView> = {\n latestMessage: WritableSignal<TMessageData | null>;\n\n /**\n * How many callers currently hold this room. Joiners share one room object, so the room may only be\n * left once this reaches zero - otherwise the first caller to unmount stops the messages for the rest.\n */\n joinCount: number;\n};\n\nexport type WebSocketRoom<TMessageData extends SocketMessageView> = {\n /** The latest message received in the room */\n latestMessage: Signal<TMessageData | null>;\n};\n\nexport type WebSocketClientResult<TMessageData extends SocketMessageView = SocketMessageView> = ProviderDefinition<\n WebSocketClient<TMessageData>\n>;\n\nexport type AnyWebSocketClient<TMessageData extends SocketMessageView = SocketMessageView> =\n WebSocketClientResult<TMessageData>;\n\nexport const createWebSocketClient = <TMessageData extends SocketMessageView = SocketMessageView>(\n options: CreateWebSocketClientConfigOptions,\n): WebSocketClientResult<TMessageData> => {\n return defineRootProvider(\n () => {\n const socket = options.io(options.url, {\n withCredentials: true,\n autoConnect: false,\n transports: options.transports,\n });\n\n const rooms = new Map<string, InternalWebSocketRoom<TMessageData>>();\n const isConnected = signal(false);\n\n // Devtools instrumentation (no-op unless provideQueryDevtools() was called).\n const devtoolsEnabled = isQueryDevtoolsEnabled();\n const devtoolsRooms = signal<string[]>([]);\n const devtoolsMessages = signal<WebSocketDevtoolsMessage[]>([]);\n let devtoolsMessageId = 0;\n const syncDevtoolsRooms = () => {\n if (devtoolsEnabled) devtoolsRooms.set([...rooms.keys()]);\n };\n\n const recordDevtoolsMessage = (message: Omit<WebSocketDevtoolsMessage, 'id' | 'timestamp'>) => {\n if (!devtoolsEnabled) return;\n\n devtoolsMessages.update((log) =>\n [{ ...message, id: devtoolsMessageId++, timestamp: Date.now() }, ...log].slice(0, MAX_DEVTOOLS_MESSAGES),\n );\n };\n\n /** Every outgoing message goes through here, so the devtools log covers both directions. */\n const emit = (message: { event: string; data: unknown; room?: string }) => {\n socket.emit(message.event, message.data);\n\n recordDevtoolsMessage({\n room: message.room ?? '',\n event: message.event,\n data: message.data,\n direction: 'out',\n });\n };\n\n const joinRoom = (room: string | (() => string | null)) => {\n const roomFn = typeof room === 'function' ? room : () => room;\n const pre = previousSignalValue(computed(() => roomFn()));\n const roomData = signal<InternalWebSocketRoom<TMessageData> | null>(null);\n\n const join = (name: string) => {\n emit({ event: 'join-room', data: name, room: name });\n\n const existingRoom = rooms.get(name);\n\n if (existingRoom) {\n existingRoom.joinCount++;\n\n return existingRoom;\n }\n\n const message = signal<TMessageData | null>(null);\n\n const newRoom: InternalWebSocketRoom<TMessageData> = {\n latestMessage: message,\n joinCount: 1,\n };\n\n rooms.set(name, newRoom);\n syncDevtoolsRooms();\n\n return newRoom;\n };\n\n effect(() => {\n const current = roomFn();\n\n untracked(() => {\n const previous = pre();\n\n if (previous === current) return;\n\n if (previous) leaveRoom(previous);\n\n if (current) {\n const joinedRoom = join(current);\n if (joinedRoom) roomData.set(joinedRoom);\n } else {\n roomData.set(null);\n }\n });\n });\n\n inject(DestroyRef).onDestroy(() => {\n const current = roomFn();\n\n if (current) {\n leaveRoom(current);\n roomData.set(null);\n }\n });\n\n return roomData.asReadonly() as Signal<WebSocketRoom<TMessageData> | null>;\n };\n\n const leaveRoom = (room: string) => {\n const joinedRoom = rooms.get(room);\n\n if (!joinedRoom) {\n if (isDevMode()) throw roomNotJoined(room);\n\n return;\n }\n\n joinedRoom.joinCount--;\n\n if (joinedRoom.joinCount > 0) return;\n\n emit({ event: 'leave-room', data: room, room });\n\n rooms.delete(room);\n syncDevtoolsRooms();\n };\n\n const setupWebSocketConnectionListener = () => {\n socket.on('connect', () => {\n isConnected.set(true);\n\n for (const room of rooms.keys()) {\n emit({ event: 'join-room', data: room, room });\n }\n });\n socket.on('disconnect', () => isConnected.set(false));\n };\n\n const setupWebSocketListener = () => {\n socket.onAny((data: string) => {\n try {\n const json = JSON.parse(data) as TMessageData;\n\n recordDevtoolsMessage({ room: json.room, event: json.event, data: json.data, direction: 'in' });\n\n const room = rooms.get(json.room);\n\n if (room) room.latestMessage.set(json);\n } catch (error) {\n console.error(error);\n if (isDevMode()) throw messageMalformed();\n }\n });\n };\n\n inject(DestroyRef).onDestroy(() => socket.disconnect());\n\n setupWebSocketConnectionListener();\n setupWebSocketListener();\n socket.connect();\n\n const client: WebSocketClient<TMessageData> = {\n joinRoom,\n isConnected: isConnected.asReadonly(),\n subtle: {\n leaveRoom,\n },\n };\n\n if (devtoolsEnabled) {\n const handle: WebSocketDevtoolsHandle = {\n connected: isConnected.asReadonly(),\n rooms: devtoolsRooms.asReadonly(),\n messages: devtoolsMessages.asReadonly(),\n emit,\n };\n\n const unregister = registerQueryDevtoolsEntry({\n kind: 'ws-client',\n handle,\n meta: { name: options.name, url: options.url },\n });\n\n inject(DestroyRef).onDestroy(unregister);\n }\n\n return client;\n },\n {\n name: `WebSocketClient_${options.name}`,\n },\n );\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["noop","isNaN","coreDeleteCookie","IGNORED_FILTER_COUNT_FIELDS"],"mappings":";;;;;;;;;;;;;AAwEA,MAAM,wBAAwB,GAAG,WAAW;AAC5C,MAAM,WAAW,GAAG,GAAG;AAEvB,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,MAAuB,KAAa;IACzE,IAAI,MAAM,YAAY,OAAO;AAAE,QAAA,OAAO,MAAM;IAC5C,IAAI,OAAO,MAAM,KAAK,UAAU;AAAE,QAAA,OAAO,MAAM,CAAC,MAAM,CAAC;IACvD,IAAI,OAAO,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAE9D,OAAO,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,IAAa,EAAE,KAAa,EAAE,KAAa,KACjE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,GAAG,KAAK,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;AAEhF;AACA;AACA;AACA,MAAM,aAAa,GAAG,CAAC,MAAc,EAAE,GAAW,EAAE,KAAoB,KAAI;AAC1E,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;AAEvB,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC;IAErD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI;AACrG,CAAC;AAED;;;;;;;;;;;;;;;AAeG;MACU,eAAe,GAAG,CAAC,WAA8C,EAAE,MAAuB,KAAe;IACpH,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,KAAK,KAAK,GAAG,IAAI,IAAI,MAAM,CAAC,cAAc,IAAI,wBAAwB,CAAC;IAC1G,MAAM,QAAQ,GAAG,MAAM,CAAC,yBAAyB,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;IAEzE,MAAM,QAAQ,GAAG,CAAC,eAAwB,KAAK,MAAK;AAClD,QAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,EAAE;;;AAIrC,QAAA,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,EAAE,EAAE,YAAY,CAAC,QAAQ,EAAE,IAAI,MAAM,CAAC,GAAG;AAEtF,QAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAK;AAC5B,YAAA,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,EAAE;AAEvC,YAAA,OAAO,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,WAAW;QACvD,CAAC;oFAAC;QAEF,MAAM,MAAM,GAAG,MAAK;YAClB,MAAM,aAAa,GAAG,QAAQ,CAAC,aAAa,EAAE,KAAK,eAAe;YAElE,IAAI,aAAa,KAAK,eAAe;AAAE,gBAAA,OAAO,IAAI;YAElD,IAAI,eAAe,EAAE;gBACnB,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC;gBAExD,OAAO,IAAI,eAAe,CAAC,KAAK,GAAG,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,SAAS,EAAE,QAAQ,CAAC;YAC1G;YAEA,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,CAAC;AAE5D,YAAA,OAAO,IAAI,eAAe,CACxB,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,EAChG,QAAQ,CACT;AACH,QAAA,CAAC;AAED,QAAA,IAAI,OAAO,EAAE;YAAE,OAAO,MAAM,EAAE;QAE9B,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1E,IAAA,CAAC;AAED,IAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC;AACrC,IAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAC;IAExC,OAAO;AACL,QAAA,QAAQ,EAAE,cAAc;AACxB,QAAA,WAAW,EAAE,cAAc;AAC3B,QAAA,iBAAiB,EAAE,gBAAgB;AACnC,QAAA,oBAAoB,EAAE,gBAAgB;QAEtC,SAAS,EAAE,MAAK;AACd,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAE7B,OAAO,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;QACjD,CAAC;QAED,kBAAkB,EAAE,MAAK;AACvB,YAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAE7B,OAAO,KAAK,CAAC,MAAK;AAChB,gBAAA,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;gBAE1D,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,IAAI,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC;AACzG,YAAA,CAAC,CAAC;QACJ,CAAC;KACF;AACH;;ACtJA;;;AAGG;AACI,MAAM,6BAA6B,GAAG,CAC3C,QAAmD,KAEnD,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI;AAE/F;;;AAGG;AACI,MAAM,2BAA2B,GAAG,CAAC,EAAU,KAAI;AACxD,IAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;AAAE,QAAA,OAAO,MAAM,CAAC,EAAE,CAAC;IAC3C,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAI;IAE/B,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,IAAY,KAAK,CAAA,EAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA,EAAG,IAAI,CAAA,CAAE;IAEnF,IAAI,EAAE,GAAG,MAAM;QAAE,OAAO,KAAK,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC;IAC7C,IAAI,EAAE,GAAG,SAAS;QAAE,OAAO,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC;IAElD,OAAO,KAAK,CAAC,EAAE,GAAG,SAAS,EAAE,GAAG,CAAC;AACnC;AAEA;;;;AAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,EAAW,EAAE,GAAW,KAAI;IACvD,MAAM,IAAI,GAAG,OAAO,EAAE,KAAK,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,EAAE;AAE3E,IAAA,OAAO,CAAC,IAAI,IAAI,IAAI,KAAK,GAAG,GAAG,IAAI,GAAG,IAAI;AAC5C,CAAC;AAED;;;AAGG;MACU,qBAAqB,GAAG,CAAC,EAAW,EAAE,GAAW,KAAkC;IAC9F,MAAM,IAAI,GAAG,mBAAmB,CAAC,EAAE,EAAE,GAAG,CAAC;AAEzC,IAAA,OAAO,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE;AAClD;;AC6GA,MAAMA,MAAI,GAAG,MAAM,SAAS;AAE5B,IAAI,SAAS,GAAkC,IAAI;AAEnD;;;AAGG;AACI,MAAM,yBAAyB,GAAG,CAAC,EAA0B,KAAI;IACtE,SAAS,GAAG,EAAE;AAChB;AAEA;;;;AAIG;AACI,MAAM,sBAAsB,GAAG,MAAM,SAAS,KAAK;AAE1D;;;;AAIG;AACI,MAAM,0BAA0B,GAAG,CAAC,KAAgC,KACzE,SAAS,GAAG,KAAK,CAAC,IAAIA;AAExB,IAAI,YAAY,GAA8C,IAAI;AAElE;;;AAGG;AACI,MAAM,4BAA4B,GAAG,CAAC,EAAoC,KAAI;IACnF,YAAY,GAAG,EAAE;AACnB;AAEA;;;;;;;;AAQG;AACI,MAAM,gCAAgC,GAAG,MAAyC,YAAY,IAAI,IAAI;AAE7G,IAAI,gBAAgB,GAAkD,IAAI;AAE1E;;;AAGG;AACI,MAAM,gCAAgC,GAAG,CAAC,EAAwC,KAAI;IAC3F,gBAAgB,GAAG,EAAE;AACvB;AAEA;;;;AAIG;AACI,MAAM,oCAAoC,GAAG,MAClD,gBAAgB,IAAI,IAAI;AAE1B,IAAI,gBAAgB,GAAkD,IAAI;AAE1E;;;AAGG;AACI,MAAM,gCAAgC,GAAG,CAAC,EAAwC,KAAI;IAC3F,gBAAgB,GAAG,EAAE;AACvB;AAEA;;;;AAIG;AACI,MAAM,oCAAoC,GAAG,MAClD,gBAAgB,IAAI,IAAI;AAE1B;AACA,IAAI,YAAY,GAAuB,IAAI;AAE3C;;;;AAIG;AACI,MAAM,qBAAqB,GAAG,CAAI,KAAc,KAAiC;IACtF,MAAM,KAAK,GAAG,YAAY;AAC1B,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;IAE9B,YAAY,GAAG,IAAI;AAEnB,IAAA,IAAI;AACF,QAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;IAC3C;YAAU;QACR,YAAY,GAAG,KAAK;IACtB;AACF;AAEA;;;;;AAKG;AACI,MAAM,iBAAiB,GAAG,CAAC,EAAU,KAAI;AAC9C,IAAA,YAAY,EAAE,GAAG,CAAC,EAAE,CAAC;AACvB;AAoBA,IAAI,aAAa,GAAqF,IAAI;AAE1G;;;AAGG;AACI,MAAM,6BAA6B,GAAG,CAC3C,EAA2E,KACzE;IACF,aAAa,GAAG,EAAE;AACpB;AAEA;;;;AAIG;AACI,MAAM,oCAAoC,GAAG,MAAM,aAAa,KAAK;AAE5E;;;;AAIG;AACI,MAAM,yBAAyB,GAAG,CAAC,MAAgC,KACxE,aAAa,GAAG,MAAM,CAAC,IAAI;AAE7B,IAAI,yBAAyB,GAAG,KAAK;AAErC;;;;AAIG;AACI,MAAM,8BAA8B,GAAG,MAAK;IACjD,yBAAyB,GAAG,IAAI;AAClC;AAEA;;;;AAIG;AACI,MAAM,iCAAiC,GAAG,MAAK;IACpD,MAAM,KAAK,GAAG,yBAAyB;IACvC,yBAAyB,GAAG,KAAK;AAEjC,IAAA,OAAO,KAAK;AACd;;ACxWA;;;;AAIG;AACI,MAAM,uBAAuB,GAAG,CACrC,OAA+D,KACrB,WAAW,IAAI,OAAO,CAAC;;MCItD,sBAAsB,GAAG,CAAI,MAAiB,EAAE,eAAyB,KAAyB;AAC7G,IAAA,MAAM,YAAY,GAAG,CAAC,OAAiC,KAAmB;AACxE,QAAA,MAAM,iBAAiB,GAAG,OAAO,EAAE,QAAQ,IAAI,eAAe;AAC9D,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,iBAAiB,EAAE,CAAC;AAEnE,QAAA,IAAI,OAAO,EAAE,QAAQ,EAAE;AACrB,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QACxE;AAEA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,CAAmC;AAClF;;ACnBA,MAAM,mBAAmB,GAAG,IAAI,cAAc,CAAe,eAAe,CAAC;AAEtE,MAAM,kBAAkB,GAAG,CAAC,OAAqB,KACtD,oBAAoB,CAAC,OAAO,EAAE;AAC5B,IAAA,IAAI,EAAE,eAAe;AACrB,IAAA,mBAAmB,EAAE,mBAAmB;AACzC,CAAA;AAEI,MAAM,kBAAkB,GAAG,MAAM,MAAM,CAAC,mBAAmB;;ACgC3D,MAAM,sBAAsB,GAAG,CAAC,OAAsC,KAAI;AAC/E,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;AACtE,IAAA,MAAM,mBAAmB,GACvB,OAAO,CAAC,WAAW,EAAE,QAAQ,EAAE,GAAG,CAAC,mBAAmB,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAElG,IAAA,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK;AAExC,IAAA,MAAM,YAAY,GAAsB;QACtC,UAAU,EAAE,SAAkC;AAC9C,QAAA,eAAe,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;AAC7C,QAAA,MAAM,EAAE,YAAY,CAAC,GAAG,CAAc,WAAW,CAAC;QAClD,QAAQ,EAAE,SAA2C;AACrD,QAAA,cAAc,EAAE,YAAY,CAAC,GAAG,CAAC,YAAY,CAAC;AAC9C,QAAA,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;AACxC,QAAA,WAAW,EAAE,YAAY,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,IAAI,IAAI;KAC3F;AAED,IAAA,MAAM,YAAY,GAAiB;AACjC,QAAA,IAAI,EAAE,YAAY;KACnB;IAED,MAAM,EAAE,OAAO,EAAE,mBAAmB,EAAE,GAAG,kBAAkB,CAAC,YAAY,CAAC;IAEzE,MAAM,wBAAwB,GAAG,yBAAyB,CAAC,CAAC,mBAAmB,EAAE,CAAC,EAAE,mBAAmB,CAAC;IAExG,YAAY,CAAC,UAAU,GAAG,wBAAwB,CAAC,GAAG,CAAC,UAAU,CAAC;AAClE,IAAA,YAAY,CAAC,QAAQ,GAAG,wBAAwB;;IAGhD,MAAM,oBAAoB,GAAG,YAAY,CAAC,eAAe,CAAC,SAAS,CAAC,MAAK;AACvE,QAAA,IAAI;YACF,wBAAwB,CAAC,OAAO,EAAE;QACpC;AAAE,QAAA,MAAM;;QAER;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;;AAErC,QAAA,IAAI;AACF,YAAA,oBAAoB,EAAE;QACxB;AAAE,QAAA,MAAM;;QAER;AACF,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,YAAY;AACrB;;AC7FA;AACO,MAAM,qBAAqB,GAAG;;AAEnC,IAAA,iCAAiC,EAAE,CAAC;;AAGpC,IAAA,qDAAqD,EAAE,GAAG;AAC1D,IAAA,4CAA4C,EAAE,GAAG;AACjD,IAAA,iDAAiD,EAAE,GAAG;AACtD,IAAA,sCAAsC,EAAE,GAAG;AAC3C,IAAA,kEAAkE,EAAE,GAAG;;AAGvE,IAAA,uCAAuC,EAAE,GAAG;AAC5C,IAAA,iDAAiD,EAAE,GAAG;AACtD,IAAA,kDAAkD,EAAE,GAAG;AACvD,IAAA,yCAAyC,EAAE,GAAG;;AAG9C,IAAA,wCAAwC,EAAE,GAAG;;AAG7C,IAAA,uCAAuC,EAAE,GAAG;AAC5C,IAAA,yCAAyC,EAAE,GAAG;;AAG9C,IAAA,8CAA8C,EAAE,GAAG;AACnD,IAAA,wDAAwD,EAAE,GAAG;AAC7D,IAAA,gEAAgE,EAAE,GAAG;;AAGrE,IAAA,0BAA0B,EAAE,GAAG;AAC/B,IAAA,qCAAqC,EAAE,GAAG;AAC1C,IAAA,uDAAuD,EAAE,GAAG;;AAG5D,IAAA,qCAAqC,EAAE,GAAG;;AAG1C,IAAA,yCAAyC,EAAE,GAAG;AAC9C,IAAA,2CAA2C,EAAE,GAAG;;AAGhD,IAAA,yBAAyB,EAAE,GAAG;;AAG9B,IAAA,8BAA8B,EAAE,GAAG;;AAGnC,IAAA,wCAAwC,EAAE,GAAG;AAC7C,IAAA,kCAAkC,EAAE,GAAG;AACvC,IAAA,uCAAuC,EAAE,GAAG;AAC5C,IAAA,mCAAmC,EAAE,GAAG;AACxC,IAAA,mBAAmB,EAAE,GAAG;;AAKnB,MAAM,6BAA6B,GAAG,CAAC,IAAsB,KAAI;IACtE,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,iCAAiC,EACvD,CAAA,mBAAA,EAAsB,IAAI,CAAA,4BAAA,CAA8B,CACzD;AACH;AAEO,MAAM,6CAA6C,GAAG,MAAK;IAChE,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,qDAAqD,EAC3E,CAAA,wEAAA,CAA0E,CAC3E;AACH;AAEO,MAAM,sCAAsC,GAAG,CAAC,MAAc,KAAI;IACvE,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,4CAA4C,EAClE,CAAA,WAAA,EAAc,MAAM,CAAA,6FAAA,CAA+F,CACpH;AACH;AAEO,MAAM,0CAA0C,GAAG,CAAC,MAAc,KAAI;IAC3E,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,iDAAiD,EACvE,CAAA,WAAA,EAAc,MAAM,CAAA,iGAAA,CAAmG,CACxH;AACH;AAEO,MAAM,gCAAgC,GAAG,MAAK;AACnD,IAAA,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,sCAAsC,EAC5D,CAAA,4FAAA,CAA8F;AAC5F,QAAA,CAAA,gGAAA,CAAkG,CACrG;AACH;AAEO,MAAM,wDAAwD,GAAG,MAAK;IAC3E,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,kEAAkE,EACxF,CAAA,sGAAA,CAAwG,CACzG;AACH;AAEO,MAAM,kCAAkC,GAAG,MAAK;IACrD,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,uCAAuC,EAC7D,CAAA,8DAAA,CAAgE,CACjE;AACH;AAEO,MAAM,2CAA2C,GAAG,MAAK;IAC9D,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,iDAAiD,EACvE,CAAA,yFAAA,CAA2F,CAC5F;AACH;AAEO,MAAM,4CAA4C,GAAG,MAAK;IAC/D,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,kDAAkD,EACxE,CAAA,0FAAA,CAA4F,CAC7F;AACH;AAEO,MAAM,oCAAoC,GAAG,CAAC,IAAY,KAAI;IACnE,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,yCAAyC,EAC/D,CAAA,qBAAA,EAAwB,IAAI,CAAA,0BAAA,CAA4B,CACzD;AACH;AAEO,MAAM,mCAAmC,GAAG,CAAC,IAAY,KAAI;IAClE,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,wCAAwC,EAC9D,CAAA,sBAAA,EAAyB,IAAI,CAAA,0BAAA,CAA4B,CAC1D;AACH;AAEO,MAAM,kCAAkC,GAAG,CAAC,GAAW,KAAI;IAChE,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,uCAAuC,EAC7D,CAAA,2DAAA,EAA8D,GAAG,CAAA,mBAAA,CAAqB,CACvF;AACH;AAEO,MAAM,oCAAoC,GAAG,MAAK;IACvD,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,yCAAyC,EAC/D,CAAA,6EAAA,CAA+E,CAChF;AACH;MAEa,uCAAuC,GAAG,CAAC,IAAY,EAAE,UAAkB,KAAI;AAC1F,IAAA,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,8CAA8C,EACpE,CAAA,UAAA,EAAa,IAAI,CAAA,kCAAA,EAAqC,UAAU,CAAA,EAAA,CAAI,CACrE;AACH;AAEO,MAAM,gDAAgD,GAAG,MAAK;IACnE,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,wDAAwD,EAC9E,CAAA,+HAAA,CAAiI,CAClI;AACH;AAEO,MAAM,sDAAsD,GAAG,MAAK;IACzE,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,gEAAgE,EACtF,CAAA,mFAAA,CAAqF,CACtF;AACH;AAEO,MAAM,sBAAsB,GAAG,MAAK;IACzC,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,0BAA0B,EAChD,CAAA,wFAAA,CAA0F,CAC3F;AACH;AAEO,MAAM,gCAAgC,GAAG,MAAK;IACnD,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,qCAAqC,EAC3D,CAAA,kGAAA,CAAoG,CACrG;AACH;MAEa,gDAAgD,GAAG,CAAC,YAAoB,EAAE,eAAuB,KAAI;AAChH,IAAA,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,uDAAuD,EAC7E,CAAA,mBAAA,EAAsB,YAAY,CAAA,4BAAA,EAA+B,eAAe,CAAA,0LAAA,CAA4L,CAC7Q;AACH;AAEO,MAAM,gCAAgC,GAAG,MAAK;IACnD,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,qCAAqC,EAC3D,CAAA,8JAAA,CAAgK,CACjK;AACH;AAEO,MAAM,mCAAmC,GAAG,MAAK;IACtD,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,yCAAyC,EAC/D,CAAA,4CAAA,CAA8C,CAC/C;AACH;AAEO,MAAM,sCAAsC,GAAG,MAAK;IACzD,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,2CAA2C,EACjE,CAAA,4DAAA,CAA8D,CAC/D;AACH;AAEO,MAAM,uBAAuB,GAAG,MAAK;IAC1C,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,yBAAyB,EAC/C,CAAA,yGAAA,CAA2G,CAC5G;AACH;AAEO,MAAM,oCAAoC,GAAG,CAClD,WAA+B,EAC/B,MAAA,GAAuD,SAAS,KAC9D;AACF,IAAA,MAAM,KAAK,GAAG,WAAW,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA,CAAA,CAAG,GAAG,wBAAwB;AACzE,IAAA,MAAM,OAAO,GACX,MAAM,KAAK;AACT,UAAE,CAAA,iGAAA;AACF,UAAE,CAAA,sBAAA,EAAyB,MAAM,CAAA,oCAAA,CAAsC;IAE3E,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,wCAAwC,EAC9D,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,MAAM,CAAA,kJAAA,CAAoJ;QACpK,CAAA,8FAAA,CAAgG;QAChG,CAAA,wCAAA,CAA0C;AAC1C,QAAA,CAAA,EAAG,OAAO,CAAA,IAAA,CAAM;AAChB,QAAA,CAAA,0OAAA,CAA4O,CAC/O;AACH;AAEO,MAAM,2BAA2B,GAAG,MAAK;IAC9C,OAAO,IAAI,YAAY,CACrB,qBAAqB,CAAC,8BAA8B,EACpD,CAAA,yHAAA,CAA2H,CAC5H;AACH;;AChPO,MAAM,qBAAqB,GAAG,CAAC,KAAc,KAAkC;IACpF,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,IAAI,KAAK,IAAI,SAAS,IAAI,KAAK,IAAI,OAAO,IAAI,KAAK;AACvH;AAsBO,MAAM,cAAc,GAAG,CAAC,KAAc,KAA2B;IACtE,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACvC,QAAA,OAAO,KAAK;IACd;IAEA,MAAM,YAAY,GAAG,KAAqB;AAE1C,IAAA,QACE,YAAY,CAAC,KAAK,KAAK,SAAS;QAChC,YAAY,CAAC,MAAM,KAAK,SAAS;QACjC,YAAY,CAAC,MAAM,KAAK,SAAS;QACjC,YAAY,CAAC,KAAK,KAAK,SAAS;QAChC,YAAY,CAAC,KAAK,KAAK,SAAS;AAChC,QAAA,YAAY,CAAC,IAAI,KAAK,SAAS;AAEnC;AAEO,MAAM,kCAAkC,GAAG,CAAC,KAAc,KAA2B;AAC1F,IAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AAC1B,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,gCAAgC,CAAC;AACvG;AAEO,MAAM,+BAA+B,GAAG,CAAC,KAAc,KAAoC;AAChG,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,YAAY,IAAI,KAAK;AAC7E;AAEO,MAAM,kBAAkB,GAAG,CAAC,KAAc,KAAkC;IACjF,QACE,CAAC,CAAC,KAAK;QACP,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC,MAAM;AACd,QAAA,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ;AAC5B,QAAA,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC;AACrB,QAAA,cAAc,IAAI,KAAK,CAAC,CAAC,CAAC;AAC1B,QAAA,cAAc,IAAI,KAAK,CAAC,CAAC,CAAC;AAE9B;;AC/CA;;;AAGG;AACI,MAAM,gBAAgB,mBAAmB,MAAM,CAAC,kBAAkB;AAGzE;MACa,YAAY,GAAG,CAAC,EAAc,EAAE,OAA6B,KAAI;AAC5E,IAAA,MAAM,cAAc,GAAG,iBAAiB,EAAE;IAE1C,iBAAiB,CAAC,IAAI,CAAC;AAEvB,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,MAAK;AACtB,QAAA,EAAE,EAAE;IACN,CAAC,EAAE,OAAO,CAAC;IAEX,iBAAiB,CAAC,cAAc,CAAC;AAEjC,IAAA,OAAO,GAAG;AACZ;AAgBO,MAAM,gBAAgB,GAAG;AAC9B,IAAA,SAAS,EAAE,WAAW;AACtB,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,mBAAmB,EAAE,qBAAqB;AAC1C,IAAA,qBAAqB,EAAE,uBAAuB;AAC9C,IAAA,YAAY,EAAE,cAAc;AAC5B,IAAA,iBAAiB,EAAE,mBAAmB;AACtC,IAAA,oBAAoB,EAAE,sBAAsB;AAC5C,IAAA,wBAAwB,EAAE,0BAA0B;;AAqB/C,MAAM,kBAAkB,GAAG,CAA0B,MAI3D,KAAI;AACH,IAAA,OAAO,MAA6B;AACtC;AAEA;;;;;;;;AAQG;AACI,MAAM,QAAQ,GAAG,CAA0B,IAA+D,KAAI;AACnH,IAAA,OAAO,kBAAkB,CAAQ;QAC/B,IAAI,EAAE,gBAAgB,CAAC,SAAS;AAChC,QAAA,EAAE,EAAE,CAAC,OAAO,KAAI;;;;YAId,IAAI,QAAQ,GAA8B,IAAI;YAC9C,MAAM,OAAO,GAAG,MAAK;AACnB,gBAAA,MAAM,KAAK,GAAG,IAAI,EAAE;AAEpB,gBAAA,IAAI,KAAK,KAAK,gBAAgB,EAAE;oBAC9B,QAAQ,GAAG,IAAI;AAEf,oBAAA,OAAO,IAAI;gBACb;gBAEA,IAAI,KAAK,KAAK,IAAI;AAAE,oBAAA,OAAO,QAAQ;gBAEnC,QAAQ,GAAG,KAAK;AAChB,gBAAA,OAAO,KAAK;AACd,YAAA,CAAC;;;;YAKD,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB;YAExD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;;YAGxF,YAAY,CACV,MAAK;gBACH,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;gBAExC,IAAI,WAAW,KAAK,IAAI;oBAAE;gBAE1B,SAAS,CAAC,MAAK;AACb,oBAAA,IAAI,OAAO,CAAC,KAAK,CAAC,iBAAiB;wBAAE,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;AAC7E,gBAAA,CAAC,CAAC;YACJ,CAAC,EACD,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CACpC;QACH,CAAC;AACF,KAAA,CAAC;AACJ;AAcA;;;;;;;;;;;;AAYG;AACI,MAAM,WAAW,GAAG,CAA0B,OAAkC,KAAI;AACzF,IAAA,OAAO,kBAAkB,CAAQ;QAC/B,IAAI,EAAE,gBAAgB,CAAC,YAAY;QACnC,QAAQ,EAAE,MAAM;AACd,YAAA,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,2BAA2B,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3E,YAAA,EAAE,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,CAAC,gBAAgB,GAAG,KAAK,GAAG,IAAI,EAAE;AAC/E,SAAA;AACD,QAAA,EAAE,EAAE,CAAC,OAAO,KAAI;AACd,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBAC1C,MAAM,sCAAsC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACpE;YAEA,IAAI,UAAU,GAAkB,IAAI;YAEpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI;YAC5C,MAAM,WAAW,GAAG,IAAI,EAAE,sBAAsB,IAAI,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,WAAW,GAAG,IAAI;;;YAIjH,IAAI,IAAI,GAA4B,IAAI;YACxC,IAAI,OAAO,GAAoB,IAAI;AAEnC,YAAA,MAAM,OAAO,GAAG,CAAC,GAAoB,KAAI;gBACvC,IAAI,EAAE,OAAO,EAAE;gBACf,OAAO,GAAG,GAAG;gBACb,IAAI,GAAG,GAAG,KAAK,IAAI,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AACpE,YAAA,CAAC;YAED,IAAI,WAAW,EAAE;;;gBAGf,YAAY,CACV,MAAK;oBACH,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE;oBAElD,SAAS,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC/B,CAAC,EACD,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CACpC;;;;gBAKD,MAAM,kBAAkB,GAAG,MAAK;oBAC9B,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE;wBAAE;oBAE3C,OAAO,CAAC,OAAO,CAAC;AAClB,gBAAA,CAAC;AAED,gBAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBAEjE,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAK;AACrC,oBAAA,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;oBACpE,IAAI,EAAE,OAAO,EAAE;AACjB,gBAAA,CAAC,CAAC;YACJ;YAEA,YAAY,CACV,MAAK;gBACH,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;gBAEjC,SAAS,CAAC,MAAK;oBACb,IAAI,UAAU,KAAK,IAAI;wBAAE,aAAa,CAAC,UAAU,CAAC;;;oBAIlD,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,kBAAkB;wBAAE;AAEvD,oBAAA,IAAI,OAAO,CAAC,gBAAgB,EAAE;AAC5B,wBAAA,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;oBAC3B;AAEA,oBAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,MAAK;;;AAGnC,wBAAA,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;4BAAE;AAE9B,wBAAA,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;AAC3B,oBAAA,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;AACtB,gBAAA,CAAC,CAAC;YACJ,CAAC,EACD,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CACpC;AAED,YAAA,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,UAAU,KAAK,IAAI,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;QAC3F,CAAC;AACF,KAAA,CAAC;AACJ;AAOA;AACO,MAAM,WAAW,GAAG,CAA0B,OAAyC,KAAI;AAChG,IAAA,OAAO,kBAAkB,CAAQ;QAC/B,IAAI,EAAE,gBAAgB,CAAC,YAAY;QACnC,QAAQ,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC;AAC7D,QAAA,EAAE,EAAE,CAAC,OAAO,KAAI;YACd,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC1F,gBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACtB,YAAA,CAAC,CAAC;QACJ,CAAC;AACF,KAAA,CAAC;AACJ;AAOA;AACO,MAAM,iBAAiB,GAAG,CAA0B,OAAwC,KAAI;AACrG,IAAA,OAAO,kBAAkB,CAAQ;QAC/B,IAAI,EAAE,gBAAgB,CAAC,mBAAmB;QAC1C,QAAQ,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;AACjE,QAAA,EAAE,EAAE,CAAC,OAAO,KAAI;YACd,OAAO,CAAC,KAAK,CAAC;iBACX,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAA8B,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EAClE,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAE5C,iBAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,gBAAA,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAC9B,YAAA,CAAC,CAAC;QACN,CAAC;AACF,KAAA,CAAC;AACJ;AAOA;AACO,MAAM,mBAAmB,GAAG,CAA0B,OAAiD,KAAI;AAChH,IAAA,OAAO,kBAAkB,CAAQ;QAC/B,IAAI,EAAE,gBAAgB,CAAC,qBAAqB;QAC5C,QAAQ,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;AACjE,QAAA,EAAE,EAAE,CAAC,OAAO,KAAI;YACd,OAAO,CAAC,KAAK,CAAC;iBACX,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,CAAC,EACxD,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;iBAE5C,SAAS,CAAC,MAAK;gBACd,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAsC,CAAC;AAC/E,YAAA,CAAC,CAAC;QACN,CAAC;AACF,KAAA,CAAC;AACJ;AAUA;;;;AAIG;AACI,MAAM,eAAe,GAAG,CAA0B,OAAsC,KAAI;AACjG,IAAA,OAAO,kBAAkB,CAAQ;QAC/B,IAAI,EAAE,gBAAgB,CAAC,iBAAiB;QACxC,QAAQ,EAAE,MAAM;AACd,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE;YACnE,IAAI,OAAO,CAAC,yBAAyB,GAAG,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;AAC/F,SAAA;AACD,QAAA,EAAE,EAAE,CAAC,OAAO,KAAI;AACd,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBAC1C,MAAM,0CAA0C,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;YACxE;YAEA,IAAI,OAAO,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE;gBAC3E,MAAM,gCAAgC,EAAE;YAC1C;YAEA,YAAY,CACV,MAAK;AACH,gBAAA,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,eAAe,EAAE;AAC5C,oBAAA,MAAM,EAAE;gBACV;gBAEA,SAAS,CAAC,MAAK;oBACb,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;;;oBAIjC,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,kBAAkB;wBAAE;AAEvD,oBAAA,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC;AAC3B,gBAAA,CAAC,CAAC;YACJ,CAAC,EACD,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CACpC;QACH,CAAC;AACF,KAAA,CAAC;AACJ;AAqCO,MAAM,kBAAkB,GAAG,CAA0B,OAAgD,KAAI;AAC9G,IAAA,OAAO,kBAAkB,CAAQ;QAC/B,IAAI,EAAE,gBAAgB,CAAC,oBAAoB;QAC3C,QAAQ,EAAE,MAAM,qBAAqB,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC;AACjE,QAAA,EAAE,EAAE,CAAC,OAAO,KAAI;YACd,YAAY,CACV,MAAK;AACH,gBAAA,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;gBACjE,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;gBAErD,IAAI,QAAQ,KAAK,IAAI;oBAAE;gBAEvB,SAAS,CAAC,MAAK;oBACb,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AACzC,gBAAA,CAAC,CAAC;YACJ,CAAC,EACD,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CACpC;QACH,CAAC;AACF,KAAA,CAAC;AACJ;AAEA;;;;AAIG;AACI,MAAM,qBAAqB,GAAG,CAAC,KAAyB,KAAI;AACjE,IAAA,IAAI,KAAK,CAAC,IAAI,KAAK,GAAG;AAAE,QAAA,OAAO,IAAI;AAEnC,IAAA,OAAO,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,kCAAkC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AAClF;AA8BA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACI,MAAM,oBAAoB,GAAG,CAA0B,OAA2C,KAAI;AAC3G,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,qBAAqB;AAErD,IAAA,OAAO,kBAAkB,CAAQ;QAC/B,IAAI,EAAE,gBAAgB,CAAC,wBAAwB;QAC/C,QAAQ,EAAE,MAAM;AACd,YAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,iBAAiB,GAAG,aAAa,EAAE;AAC7E,YAAA,IAAI,OAAO,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;AACtF,YAAA,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,GAAG,QAAQ,GAAG,mBAAmB,EAAE;AACxE,SAAA;AACD,QAAA,EAAE,EAAE,CAAC,OAAO,KAAI;YACd,OAAO,CAAC,KAAK,CAAC;iBACX,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAA8B,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,EAClE,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;AAE5C,iBAAA,SAAS,CAAC,CAAC,KAAK,KAAI;AACnB,gBAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;oBAAE;AAE3B,gBAAA,IAAI,OAAO,CAAC,KAAK,EAAE;oBACjB,OAAO,CAAC,KAAK,EAAE;gBACjB;qBAAO;oBACL,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC;gBACxC;AACF,YAAA,CAAC,CAAC;QACN,CAAC;AACF,KAAA,CAAC;AACJ;;ACpaO,MAAM,eAAe,GAAG,CAA0B,OAAsC,KAAI;AACjG,IAAA,MAAM,OAAO,GAAG,MAAM,CAA4B,IAAI;gFAAC;AAEvD,IAAA,MAAM,WAAW,GAAG,YAAY,CAAC,MAAK;QACpC,MAAM,GAAG,GAAG,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,IAAI;AACzC,QAAA,OAAO,OAAO,CAAC,iBAAiB,GAAI,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAgB,GAAG,GAAG;IAC/F,CAAC;oFAAC;AACF,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,GAAG,GAAG,WAAW,EAAE;QACzB,IAAI,GAAG,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;AAC7B,QAAA,OAAO,OAAO,CAAC,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAI,GAA2B;IAClG,CAAC;iFAAC;AACF,IAAA,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,IAAI;gFAAC;AAChE,IAAA,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,IAAI;8EAAC;AAC5D,IAAA,MAAM,eAAe,GAAG,YAAY,CAAC,MAAM,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,IAAI;wFAAC;;;;;AAM7E,IAAA,MAAM,UAAU,GAAG,MAAM,CAAkC,MAAM,IAAI;mFAAC;IACtE,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,UAAU,EAAE,EAAE;6EAAC;AAC/C,IAAA,MAAM,aAAa,GAAG,CAAC,MAAuC,KAAK,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;AAEzF,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAgB,IAAI;2FAAC;AACtD,IAAA,MAAM,eAAe,GAAG,MAAM,CAAgB,IAAI;wFAAC;AAEnD,IAAA,MAAM,cAAc,GAAG,IAAI,OAAO,EAA2B;AAC7D,IAAA,IAAI,yBAAyB,GAAG,YAAY,CAAC,KAAK;AAClD,IAAA,MAAM,iBAAiB,GAAG,CAAC,OAA2B,KAAI;QACxD,yBAAyB,CAAC,WAAW,EAAE;AACvC,QAAA,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9F,IAAA,CAAC;AAED,IAAA,MAAM,cAAc,GAAG,QAAQ,CAAoC,MAAK;AACtE,QAAA,MAAM,eAAe,GAAG,QAAQ,EAAE;AAClC,QAAA,MAAM,YAAY,GAAG,KAAK,EAAE;AAC5B,QAAA,MAAM,cAAc,GAAG,OAAO,EAAE;QAEhC,IAAI,cAAc,EAAE;YAClB,IAAI,eAAe,EAAE;gBACnB,OAAO;AACL,oBAAA,IAAI,EAAE,SAAS;AACf,oBAAA,iBAAiB,EAAE,IAAI;AACvB,oBAAA,OAAO,EAAE,cAAc;AACvB,oBAAA,cAAc,EAAE,eAAe;iBAChC;YACH;YAEA,OAAO;AACL,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,iBAAiB,EAAE,KAAK;AACxB,gBAAA,OAAO,EAAE,cAAc;aACxB;QACH;aAAO,IAAI,YAAY,EAAE;YACvB,OAAO;AACL,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,KAAK,EAAE,YAAY;aACpB;QACH;AAAO,aAAA,IAAI,eAAe,KAAK,IAAI,IAAI,eAAe,EAAE,EAAE,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;;;;YAIzF,OAAO;AACL,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,QAAQ,EAAE,eAAsC;aACjD;QACH;aAAO;AACL,YAAA,OAAO,IAAI;QACb;IACF,CAAC;uFAAC;AAEF,IAAA,MAAM,KAAK,GAAsB;QAC/B,WAAW;QACX,QAAQ;QACR,IAAI;QACJ,eAAe;QACf,OAAO;QACP,KAAK;QACL,kBAAkB;QAClB,eAAe;QACf,cAAc;AACd,QAAA,OAAO,EAAE,cAAc,CAAC,YAAY,EAAE;AACtC,QAAA,MAAM,EAAE;YACN,OAAO;YACP,WAAW;YACX,iBAAiB;YACjB,aAAa;AACb,YAAA,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,IAAI;AAC5C,YAAA,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,IAAI;AACrD,SAAA;KACF;AAED,IAAA,OAAO,KAAK;AACd;;AC5LO,MAAM,qBAAqB,GAAG,CAA0B,OAA0C,KAAI;AAC3G,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO;AACzB,IAAA,MAAM,OAAO,GAAG,kBAAkB,EAAE;IAEpC,MAAM,UAAU,GAAG,MAAK;AACtB,QAAA,MAAM,aAAa,GAAG,eAAe,CAAQ,EAAE,CAAC;AAChD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI;oFAAC;AAE5B,QAAA,MAAM,aAAa,GAAG,MAAM,CAC1B,MAAK;AACH,YAAA,MAAM,cAAc,GAAG,KAAK,CAAC,OAAO,EAAE;AACtC,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,EAAE;AAClC,YAAA,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE;AACxC,YAAA,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE;AAChC,YAAA,MAAM,sBAAsB,GAAG,KAAK,CAAC,eAAe,EAAE;AACtD,YAAA,MAAM,yBAAyB,GAAG,KAAK,CAAC,kBAAkB,EAAE;AAC5D,YAAA,MAAM,sBAAsB,GAAG,KAAK,CAAC,eAAe,EAAE;YAEtD,SAAS,CAAC,MAAK;AACb,gBAAA,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;AACnC,gBAAA,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC;AACrC,gBAAA,aAAa,CAAC,kBAAkB,CAAC,GAAG,CAAC,yBAAyB,CAAC;AAC/D,gBAAA,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,sBAAsB,CAAC;AACzD,gBAAA,aAAa,CAAC,eAAe,CAAC,GAAG,CAAC,sBAAsB,CAAC;AACzD,gBAAA,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACzC,gBAAA,aAAa,CAAC,WAAW,CAAC,GAAG,CAAC,eAAe,CAAC;AAE9C,gBAAA,IAAI,cAAc;oBAAE;gBAEpB,MAAM,oBAAoB,GAAG,sBAAsB,EAAE,IAAI,KAAK,aAAa,CAAC,QAAQ;AACpF,gBAAA,IAAI,CAAC,oBAAoB,IAAI,CAAC,YAAY;oBAAE;;gBAG5C,aAAa,CAAC,OAAO,EAAE;AACvB,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,YAAA,CAAC,CAAC;QACJ,CAAC,EAAA,EAAA,IAAA,SAAA,GAAA,EAAA,SAAA,EAAA,eAAA,EAAA,8BAAA,EAAA,CAAA,EACC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAA,CAClC;AAED,QAAA,MAAM,QAAQ,GAAyB;AACrC,YAAA,IAAI,EAAE,sBAAsB,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AACpF,YAAA,QAAQ,EAAE,sBAAsB,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC/E,YAAA,eAAe,EAAE,sBAAsB,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1G,YAAA,OAAO,EAAE,sBAAsB,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC1F,YAAA,KAAK,EAAE,sBAAsB,CAAC,aAAa,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtF,YAAA,kBAAkB,EAAE,sBAAsB,CAAC,aAAa,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChH,YAAA,WAAW,EAAE,sBAAsB,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AACtG,YAAA,OAAO,EAAE,sBAAsB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC5E,YAAA,EAAE,EAAE,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;AACvF,YAAA,cAAc,EAAE,sBAAsB,CAAC,aAAa,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC5F;AAED,QAAA,OAAO,QAAQ;AACjB,IAAA,CAAC;AAED,IAAA,OAAO,UAAU;AACnB;;ACtCO,MAAM,sBAAsB,GAAG,CAAC,MAAmB,KAAI;IAC5D,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS;AACtE;AAEO,MAAM,yBAAyB,GAAG,CAAC,MAAsB,KAAI;IAClE,OAAO,MAAM,KAAK,OAAO;AAC3B;AAEO,MAAM,oBAAoB,GAAG;AAClC;AACA,OAA+D,KAC7D;IACF,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,GAAG,OAAO;AAEpE,IAAA,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,SAAS,CAAC;AACtF,IAAA,MAAM,uBAAuB,GAAG,uBAAuB,CAAC,OAAO;UAC3D,yBAAyB,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM;UACzD,sBAAsB,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC;AAC3D,IAAA,MAAM,gBAAgB,GACpB,OAAQ,gBAA6D,EAAE,KAAK,KAAK,UAAU;AAC3F,QAAA,OAAQ,OAA2C,EAAE,KAAK,KAAK,UAAU;IAC3E,MAAM,iBAAiB,GAAG,uBAAuB,IAAI,CAAC,WAAW,CAAC,mBAAmB;IAErF,IAAI,gBAAgB,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,kCAAkC,EAAE;QAC9F,MAAM,6CAA6C,EAAE;IACvD;AAEA,IAAA,IAAI,kBAAkB,IAAI,WAAW,CAAC,kCAAkC,EAAE;QACxE,MAAM,wDAAwD,EAAE;IAClE;AAEA,IAAA,MAAM,gBAAgB,GAAsB;QAC1C,kBAAkB;QAClB,uBAAuB;QACvB,iBAAiB;QACjB,gBAAgB;QAChB,mBAAmB,EAAE,WAAW,CAAC,mBAAmB;AACpD,QAAA,qBAAqB,EAAE,OAAO,EAAE,YAAY,KAAK,KAAK;AACtD,QAAA,MAAM,EAAE,uBAAuB,CAAC,OAAO;AACrC,cAAE,CAAA,IAAA,EAAO,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAA;AACxC,cAAE,OAAO,CAAC,gBAAgB,CAAC,MAAM;KACpC;AAED,IAAA,OAAO,gBAAgB;AACzB;MAEa,kBAAkB,GAAG,CAChC,QAA+B,EAC/B,OAAmC,KACjC;AACF,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAoB;AAEhD,IAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAClC,YAAA,MAAM,6BAA6B,CAAC,OAAO,CAAC,IAAI,CAAC;QACnD;AAEA,QAAA,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9B,QAAA,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;IACrB;AACF;AAEA;AACO,MAAM,YAAY,GAAG,CAAC,OAAyE,KAAI;IACxG,IAAI,OAAO,CAAC,KAAK,CAAC,iBAAiB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE;QAC3G,OAAO,CAAC,OAAO,EAAE;IACnB;AACF;AAQO,MAAM,iBAAiB,GAAG,CAA0B,OAAwC,KAAI;IACrG,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,OAAO;IAExC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AAC7C,IAAA,MAAM,WAAW,GAAG,CAAC,QAA6B,KAAK,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,QAAkC,CAAC;AAChH,IAAA,MAAM,UAAU,GAAG,CAAC,OAAuC,KAAK,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1F,IAAA,MAAM,QAAQ,GAAG,CAAC,KAAgC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AAC7E,IAAA,MAAM,cAAc,GAAG,qBAAqB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;AAGtE,IAAA,MAAM,WAAW,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;AAClF,IAAA,MAAM,eAAe,GAAG,sBAAsB,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC;AAC7E,IAAA,MAAM,sBAAsB,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;AACxG,IAAA,MAAM,cAAc,GAAG,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;AACxF,IAAA,MAAM,YAAY,GAAG,sBAAsB,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;AACpF,IAAA,MAAM,yBAAyB,GAAG,sBAAsB,CAAC,KAAK,CAAC,kBAAkB,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;AAC9G,IAAA,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,KAAK,CAAC,eAAe,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;AACpG,IAAA,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,QAAQ,CAAC;AACrF,IAAA,MAAM,qBAAqB,GAAG,sBAAsB,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC;AACzF,IAAA,MAAM,cAAc,GAAG,sBAAsB,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC;IAE/F,MAAM,UAAU,GAAG,MAAK;AACtB,QAAA,MAAM,OAAO,GAAyB;AACpC,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,QAAQ,EAAE,eAAe;AACzB,YAAA,eAAe,EAAE,sBAAsB;AACvC,YAAA,OAAO,EAAE,cAAc;AACvB,YAAA,KAAK,EAAE,YAAY;AACnB,YAAA,kBAAkB,EAAE,yBAAyB;AAC7C,YAAA,WAAW,EAAE,kBAAkB;AAC/B,YAAA,EAAE,EAAE,SAAS;YACb,cAAc;AACd,YAAA,cAAc,EAAE,qBAAqB;SACtC;AAED,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAiB;QAC1B,OAAO;AACP,QAAA,IAAI,EAAE,WAAW;AACjB,QAAA,QAAQ,EAAE,eAAe;AACzB,QAAA,eAAe,EAAE,sBAAsB;AACvC,QAAA,OAAO,EAAE,cAAc;AACvB,QAAA,KAAK,EAAE,YAAY;AACnB,QAAA,kBAAkB,EAAE,yBAAyB;AAC7C,QAAA,WAAW,EAAE,kBAAkB;AAC/B,QAAA,EAAE,EAAE,SAAS;QACb,cAAc;QACd,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,UAAU;AACV,QAAA,cAAc,EAAE,qBAAqB;AACrC,QAAA,MAAM,EAAE;YACN,OAAO;YACP,WAAW;YACX,UAAU;YACV,QAAQ;AACR,YAAA,OAAO,EAAE,cAAc;YACvB,UAAU,EAAE,IAAI,CAAC,eAAe;YAChC,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACxB,SAAA;KACF;AAED,IAAA,OAAO,KAAK;AACd;AAkBO,MAAM,eAAe,GAAG,CAC7B,OAAkD,KAChD;AACF,IAAA,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM;IAE9C,MAAM,IAAI,GAAG,sBAAsB,CAAC;QAClC,MAAM;QACN,WAAW,EAAE,OAAO,CAAC,WAAW;AACjC,KAAA,CAAC;AAEF,IAAA,OAAO,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAK;AAC/C,QAAA,MAAM,aAAa,GAAG,gCAAgC,EAAE;AACxD,QAAA,MAAM,iBAAiB,GAAG,oCAAoC,EAAE;AAChE,QAAA,MAAM,iBAAiB,GAAG,oCAAoC,EAAE;QAEhE,MAAM,KAAK,GAAG,eAAe,CAAQ;AACnC,YAAA,iBAAiB,EAAE,OAAO,CAAC,OAAO,EAAE,iBAAiB;YACrD,aAAa;YACb,iBAAiB;YACjB,iBAAiB;AAClB,SAAA,CAAC;AACF,QAAA,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAgE,CAAC;AAEpG,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;YACrC,IAAI;YACJ,KAAK;YACL,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,WAAW,EAAE,OAAO,CAAC,WAAW;AACjC,SAAA,CAAC;AAEF,QAAA,MAAM,gBAAgB,GAA+B;YACnD,KAAK;YACL,OAAO;YACP,KAAK;YACL,IAAI;SACL;AAED,QAAA,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,CAAC;AAEtD,QAAA,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAEhC,QAAA,MAAM,KAAK,GAAG,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;;;QAIzD,IAAI,aAAa,EAAE;YACjB,MAAM,iBAAiB,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC1D,gBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;AAC1B,oBAAA,aAAa,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC3E;qBAAO,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;AAChD,oBAAA,aAAa,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC5E;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,iBAAiB,CAAC,WAAW,EAAE,CAAC;;;;YAKhE,MAAM,CAAC,MAAK;AACV,gBAAA,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;AAEzD,gBAAA,IAAI,KAAK;oBAAE,aAAa,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;AAClE,YAAA,CAAC,CAAC;YAEF,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC5C,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,SAAS,EAAE,MAAM;AACjB,gBAAA,KAAK,EAAE,aAAa;gBACpB,SAAS,EAAE,iBAAiB,IAAI,SAAS;gBACzC,SAAS,EAAE,iBAAiB,IAAI,SAAS;AACzC,gBAAA,KAAK,EACF,OAAO,CAAC,gBAAwC,CAAC,KAAK;oBACtD,OAAO,CAAC,OAA2C,EAAE,KAAK;oBAC3D,IAAI;AACN,gBAAA,eAAe,EAAG,OAAO,CAAC,gBAA2D,CAAC,YAAY;AAClG,gBAAA,IAAI,EAAE;AACJ,oBAAA,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO;oBAClC,MAAM,EAAE,KAAK,CAAC,MAAM;AACpB,oBAAA,QAAQ,EAAE,6BAA6B,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACzD,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;AACxB,oBAAA,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;oBAClC,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI,CAAC,WAAW;AACzB,oBAAA,QAAQ,EAAG,OAAO,CAAC,gBAAuC,CAAC,KAAK;AACjE,iBAAA;AACF,aAAA,CAAC;AAEF,YAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC;QACvC;AAEA,QAAA,OAAO,KAAK;AACd,IAAA,CAAC,CAAC;AACJ;;ACrRO,MAAM,iBAAiB,GAAG,CAA0B,OAAwC,KAAI;IACrG,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,OAAO;AACtD,IAAA,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAEtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpF,IAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,IAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,IAAA,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,IAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,IAAA,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,IAAA,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,IAAA,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AACjC;AAMO,MAAM,sBAAsB,GAAG,MAAwB;IAC5D,OAAO;AACL,QAAA,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC;KAC1B;AACH;AAoBO,MAAM,YAAY,GAAG,CAA0B,OAAmC,KAAI;AAC3F,IAAA,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO;AACzG,IAAA,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,GAAG,cAAc;AAE9E,IAAA,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;QAChE,KAAK,EAAE,gBAAgB,CAAC,KAAK;QAC7B,MAAM,EAAE,gBAAgB,CAAC,MAAM;QAC/B,IAAI;AACJ,QAAA,cAAc,EAAE,OAAO;QACvB,OAAO,EAAE,OAAO,EAAE,OAAO;QACzB,kBAAkB,EAAE,IAAI,CAAC,UAAU;QACnC,GAAG,EAAE,WAAW,CAAC,GAAG;AACpB,QAAA,WAAW,EAAE,YAAY,CAAC,WAAW,EAAE;QACvC,eAAe;QACf,QAAQ;QACR,aAAa;QACb,iCAAiC,EAAE,WAAW,CAAC,iCAAiC;AACjF,KAAA,CAAC;AAEF,IAAA,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;IACjC,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACxC,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,eAAe,EAAE,WAAW,IAAI,IAAI,CAAC;IAC/D,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AACjC,IAAA,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,OAAO,CAAC;IACvC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;AAC3G;AAEO,MAAM,8BAA8B,GAAG,MAAK;IACjD,IAAI,aAAa,GAAG,CAAC;IACrB,IAAI,aAAa,GAAG,CAAC;;;IAIrB,IAAI,OAAO,GAAQ,IAAI;IAEvB,MAAM,KAAK,GAAG,MAAK;AACjB,QAAA,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;AAE7B,QAAA,IAAI,GAAG,GAAG,aAAa,GAAG,GAAG,EAAE;AAC7B,YAAA,aAAa,EAAE;AAEf,YAAA,IAAI,aAAa,GAAG,CAAC,EAAE;gBACrB,MAAM,uBAAuB,EAAE;YACjC;QACF;QAEA,aAAa,GAAG,GAAG;AAEnB,QAAA,IAAI,OAAO;YAAE,YAAY,CAAC,OAAO,CAAC;AAElC,QAAA,OAAO,GAAG,UAAU,CAAC,MAAK;YACxB,aAAa,GAAG,CAAC;QACnB,CAAC,EAAE,GAAG,CAAC;AACT,IAAA,CAAC;IAED,OAAO;QACL,KAAK;KACN;AACH;;AC5EO,MAAM,eAAe,GAAG,CAC7B,cAAgD,KACjB;AAC/B,IAAA,MAAM,YAAY,GAAG,sBAAsB,EAAE;AAC7C,IAAA,MAAM,eAAe,GAAG,8BAA8B,EAAE;AAExD,IAAA,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AAEvE,IAAA,MAAM,IAAI,GAAG,CAAC,WAAqC,KAAI;QACrD,eAAe,CAAC,KAAK,EAAE;AAEvB,QAAA,MAAM,EAAE,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,WAAW,IAAI,EAAE;QAEzE,YAAY,CAAC,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC/D,IAAA,CAAC;AAED,IAAA,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK;IAErB,IAAI,CAAC,sBAAsB,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,UAAU,EAAE;AAEpE,IAAA,OAAO,IAAI;AACb;;ACxDA;AAkCA;;;;;;;;;;;AAWG;AACI,MAAM,cAAc,GAAG,OAAgC,EAAE;AAmGzD,MAAM,WAAW,GAAG,CAA0B,OAAkC,KACrF,eAAe,CAAC;IACd,OAAO,EAAE,OAAO,CAAC,OAAO;IACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;IAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;AAChC,IAAA,cAAc,EAAE,eAAe;AAChC,CAAA;;AC+FI,MAAM,gBAAgB,GAAG,CAA0B,IAA2C,KAAI;IACvG,IAAI,WAAW,GAAgB,EAAE;IACjC,IAAI,QAAQ,GAA0B,EAAE;AAExC,IAAA,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;IAErB,IAAI,KAAK,EAAE;AACT,QAAA,IAAI,MAAM,IAAI,KAAK,EAAE;YACnB,QAAQ,GAAG,IAA6B;QAC1C;aAAO;AACL,YAAA,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,GAAG,IAA+C;QAC9E;IACF;AACA,IAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE;AAClC;AAEO,MAAM,kBAAkB,GAAG,CAChC,OAA8C,EAC9C,SAAmD,KAEnD,sBAAsB,CAAC;IACrB,OAAO;IACP,SAAS;AACT,IAAA,YAAY,EAAE,WAAW;AAC1B,CAAA;;AC3PI,MAAM,sBAAsB,GAAG,CACpC,MAAmE,KAC5C;IAIvB,SAAS,YAAY,CAAC,GAAG,IAA2C,EAAA;QAClE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,gBAAgB,CAAQ,IAAI,CAAC;QAE/D,OAAO,MAAM,CAAC,YAAY,CAAC;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,gBAAgB,EAAE,MAAM,CAAC,SAAS;YAClC,QAAQ;YACR,WAAW;AACZ,SAAA,CAAC;IACJ;;;AAIA,IAAA,YAAY,CAAC,KAAK,GAAG,CAAC,iBAAmD,KAAI;AAC3E,QAAA,OAAO,sBAAsB,CAAC;AAC5B,YAAA,GAAG,MAAM;YACT,OAAO,EAAE,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,iBAAiB,EAAc;AACjE,SAAA,CAAC;AACJ,IAAA,CAAC;IAED,YAAY,CAAC,MAAM,GAAG;QACpB,gBAAgB,EAAE,MAAM,CAAC,SAAoC;QAC7D,cAAc,EAAE,MAAM,CAAC,OAA8C;KACtE;AAED,IAAA,OAAO,YAAY;AACrB;;AClDA;;;AAGG;AAEH;AACO,MAAM,qBAAqB,GAAG;AACnC,IAAA,kBAAkB,EAAE,CAAC;AACrB,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,qCAAqC,EAAE,CAAC;CAChC;MAIG,qBAAqB,GAAG,CAAC,IAAa,KACjD,IAAI,YAAY,CAAC,qBAAqB,CAAC,kBAAkB,EAAE,yCAAyC,EAAE,IAAI;MAE/F,iBAAiB,GAAG,CAAC,IAAa,KAC7C,IAAI,YAAY,CAAC,qBAAqB,CAAC,aAAa,EAAE,mCAAmC,EAAE,IAAI;MAEpF,qCAAqC,GAAG,CAAC,IAAa,KACjE,IAAI,YAAY,CACd,qBAAqB,CAAC,qCAAqC,EAC3D,oDAAoD,EACpD,IAAI;MA+DKC,OAAK,GAAG,CAAC,KAAc,KAAc,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK;MACpF,aAAa,GAAG,CAAC,KAAc,KAAK,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK;MAElF,gBAAgB,GAAG,CAAC,MAAmB,EAAE,MAA+B,KAAmB;AACtG,IAAA,MAAM,cAAc,GAAG,MAAM,EAAE,cAAc,IAAI,SAAS;AAC1D,IAAA,MAAM,iBAAiB,GAAG,MAAM,EAAE,iBAAiB,IAAI,KAAK;AAC5D,IAAA,MAAM,aAAa,GAAG,MAAM,EAAE,aAAa,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACrF,MAAM,gBAAgB,GAAG,MAAM,EAAE,gBAAgB,IAAI,CAACA,OAAK,EAAE,aAAa,CAAC;IAE3E,MAAM,WAAW,GAAa,EAAE;AAEhC,IAAA,SAAS,YAAY,CAAC,GAAW,EAAE,KAAc,EAAA;AAC/C,QAAA,IAAI,MAAM,EAAE,cAAc,KAAK,gBAAgB,EAAE;AAC/C,YAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACjC,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE;AAC5C,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC;AAE1C,YAAA,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK;AAErE,YAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC,GAAgC,CAAC;YAEzE,WAAW,CAAC,IAAI,CAAC,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAC;AAEjD,YAAA,OAAO,IAAI;QACb;AAAO,aAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC/B,IAAI,oBAAoB,GAAG,CAAC;AAC5B,YAAA,KAAK,MAAM,UAAU,IAAI,KAAK,EAAE;AAC9B,gBAAA,MAAM,SAAS,GAAG,iBAAiB,GAAG,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,oBAAoB,GAAG,GAAG,CAAA,EAAG,GAAG,IAAI;gBAEpF,MAAM,WAAW,GAAG,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC;gBAEvD,IAAI,WAAW,EAAE;AACf,oBAAA,oBAAoB,EAAE;gBACxB;YACF;AAEA,YAAA,OAAO,IAAI;QACb;aAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AACtD,YAAA,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBACjD,MAAM,SAAS,GAAG,cAAc,KAAK,KAAK,GAAG,CAAA,EAAG,GAAG,IAAI,MAAM,CAAA,CAAE,GAAG,GAAG,GAAG,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,CAAG;AACrF,gBAAA,YAAY,CAAC,SAAS,EAAE,GAAG,CAAC;YAC9B;AAEA,YAAA,OAAO,IAAI;QACb;aAAO;AACL,YAAA,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AACjC,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE;AAC5C,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,MAAM,UAAU,GAAG,kBAAkB,CAAC,GAAG,CAAC;AAC1C,YAAA,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAe,CAAC;YAExD,WAAW,CAAC,IAAI,CAAC,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,YAAY,CAAA,CAAE,CAAC;AAEjD,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAC/C,QAAA,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC;IACxB;AAEA,IAAA,OAAO,WAAW,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI;AAC1D;AAEO,MAAM,UAAU,GAAG,CAAC,OAM1B,KAAI;IACH,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;AAC9B,QAAA,MAAM,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3C;AAEA,IAAA,IAAI,KAAoB;AAExB,IAAA,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE;AACvC,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YACvB,MAAM,qCAAqC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAChE;QAEA,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;IAC3C;SAAO;AACL,QAAA,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI;IAC/B;IAEA,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AACnC,QAAA,MAAM,iBAAiB,CAAC,KAAK,CAAC;IAChC;AAEA,IAAA,IAAI,OAAO,CAAC,WAAW,EAAE;AACvB,QAAA,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,gBAAgB,CAAC;QAEnF,IAAI,WAAW,EAAE;AACf,YAAA,KAAK,GAAG,KAAK,GAAG,GAAG,KAAK,CAAA,CAAA,EAAI,WAAW,CAAA,CAAE,GAAG,CAAA,EAAA,EAAK,WAAW,EAAE;QAChE;IACF;IAEA,OAAO,CAAA,EAAG,OAAO,CAAC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAA,CAAE;AACxC;AAEO,MAAM,yBAAyB,GAAG,CAAC,OAAsB,KAAI;AAClE,IAAA,IAAI,OAAO,KAAK,IAAI,EAAE;AACpB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE;AACxD;AAEA;AACO,MAAM,aAAa,GAAG,CAAmC,KAAa,KAAI;AAC/E,IAAA,IAAI;QACF,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAErC,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;AAC9D,QAAA,MAAM,WAAW,GAAG,kBAAkB,CACpC,IAAI,CAAC,MAAM;aACR,KAAK,CAAC,EAAE;AACR,aAAA,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;AAChE,aAAA,IAAI,CAAC,EAAE,CAAC,CACZ;AAED,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAW;IAC1C;IAAE,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,CAAA,sBAAA,EAAyB,KAAK,CAAA,CAAE,EAAE,KAAK,CAAC;AAEtD,QAAA,OAAO,IAAI;IACb;AACF;;ACzOO,MAAM,uBAAuB,GAAG,CAAC,OAAoB,KAAI;IAC9D,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IACjD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;;IAGtC,IAAI,SAAS,GAAkB,IAAI;IACnC,IAAI,MAAM,GAAkB,IAAI;AAEhC,IAAA,IAAI,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE;AACtC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE;QACrC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC,EAAE;AACL,YAAA,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;QACtB;IACF;AAAO,SAAA,IAAI,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE;QAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAE5C,IAAI,CAAC,EAAE;AACL,YAAA,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;QACtB;IACF;AAEA,IAAA,IAAI,MAAM,IAAI,GAAG,EAAE;AACjB,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC;AAEhC,QAAA,SAAS,GAAG,MAAM,GAAG,UAAU;IACjC;SAAO,IAAI,MAAM,EAAE;AACjB,QAAA,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;IACzB;SAAO,IAAI,OAAO,EAAE;;;AAGlB,QAAA,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,SAAS,GAAG,IAAI;QAClB;aAAO;AACL,YAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;;AAGrC,YAAA,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,cAAc,EAAE;AAC7C,gBAAA,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;YACrE;QACF;IACF;AAEA,IAAA,OAAO,SAAS;AAClB;AAEO,MAAM,gBAAgB,GAAG,CAAC,MAAmB,KAAI;IACtD,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM;AACtE;MAEa,kBAAkB,GAAG,CAAC,KAAa,EAAE,IAAwC,KAAI;;IAE5F,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,IAAI,EAAE;;AAEzC,SAAA,OAAO,CAAC,MAAM,EAAE,EAAE;;AAElB,SAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAErB,IAAA,MAAM,IAAI,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,EAAE;IAE/B,IAAI,IAAI,GAAG,CAAC;AAEZ,IAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;QACvB,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD;;;AAIA,IAAA,IAAI,IAAI,UAAU,GAAG,CAAC;AAEtB,IAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;AACxB;;AC9DA,MAAM,OAAO,GAAuB,EAAE;AAEtC;;;;;;AAMG;AACI,MAAM,wBAAwB,GAAG,CAAC,MAAwB,KAAI;AACnE,IAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;AACrD;AAEA;MACa,oBAAoB,GAAG,CAAC,MAAe,EAAE,QAA2B,KAAI;AACnF,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC;AAEzC,QAAA,IAAI,QAAQ;AAAE,YAAA,OAAO,QAAQ;IAC/B;AAEA,IAAA,OAAO,IAAI;AACb;AAEA,MAAM,QAAQ,GAA6B,EAAE,KAAK,EAAE,KAAK,EAAE;AAE3D,IAAI,cAAc,GAAgC,IAAI;AAEtD;;;AAGG;AACI,MAAM,sBAAsB,GAAG,CAAC,EAAwB,KAAI;IACjE,cAAc,GAAG,EAAE;AACrB;AAEA;AACO,MAAM,oBAAoB,GAAG,CAAC,OAAkC,KAAK,cAAc,GAAG,OAAO,CAAC,IAAI;;AC/BlG,MAAM,oBAAoB,GAAG,CAAC,KAAc,KAAiC;IAClF,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,IAAI,KAAK,IAAI,YAAY,IAAI,KAAK,IAAI,QAAQ,IAAI,KAAK;AACpH;AAEA;;;;;;;;;;;;;;AAcG;AACI,MAAM,kBAAkB,GAAG,CAAC,KAA4C,KAAc;AAC3F,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;AAErB,IAAA,OAAO,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;AACxF;AAEA;;;AAGG;AACI,MAAM,iBAAiB,GAAG,CAAC,KAA4C,KAC5E,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI;AAE3B,MAAM,wBAAwB,GAAG,CAAC,KAAc,KAAwB;AAC7E,IAAA,IAAI,GAAG,GAAG,KAAK,YAAY,iBAAiB,GAAG,KAAK,GAAG,IAAI;IAE3D,IAAI,CAAC,GAAG,EAAE;QACR,GAAG,GAAG,IAAI,iBAAiB,CAAC;AAC1B,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE,CAAC;AACT,YAAA,UAAU,EAAE,eAAe;AAC5B,SAAA,CAAC;IACJ;AACA,IAAA,MAAM,UAAU,GAAG,oBAAoB,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAEtE,IAAA,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK;IACxB,MAAM,SAAS,GAA6B,EAAE;IAC9C,MAAM,MAAM,GAAG,oBAAoB,CAAC,MAAM,EAAE,GAAG,CAAC;IAEhD,IAAI,MAAM,EAAE;AACV,QAAA,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE;AAC5B,YAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC;QAC7B;IACF;SAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,SAAS,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,EAAE;QAC9G,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IAC7C;SAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,IAAI,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE;;QAE5G,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5C;AAAO,SAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QACrC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IACrC;SAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;AACtF,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;YAC1B,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QACpC;IACF;AAEA,IAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACxB,OAAO;AACL,YAAA,MAAM,EAAE,IAAI;AACZ,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,GAAG,EAAE,GAAG;YACR,UAAU;YACV,IAAI,EAAE,GAAG,CAAC,MAAM;SACjB;IACH;SAAO;AACL,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE;QAE5D,OAAO;AACL,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,KAAK,EAAE,WAAW;AAClB,YAAA,GAAG,EAAE,GAAG;YACR,UAAU;YACV,IAAI,EAAE,GAAG,CAAC,MAAM;SACjB;IACH;AACF;;ACvFO,MAAM,uBAAuB,GAAG;AAoQhC,MAAM,iBAAiB,GAAG,CAA0B,OAAwC,KAAI;AACrG,IAAA,IAAI,yBAAyB,GAAG,YAAY,CAAC,KAAK;IAElD,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,GAAG,OAAO;AAErD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAiC,IAAI;qFAAC;AACjE,IAAA,MAAM,MAAM,GAAG,IAAI,OAAO,EAA2B;AACrD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAiC,IAAI;gFAAC;AAC5D,IAAA,MAAM,KAAK,GAAG,MAAM,CAA4B,IAAI;8EAAC;AACrD,IAAA,MAAM,QAAQ,GAAG,MAAM,CAA6B,IAAI;iFAAC;AAEzD,IAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,CAAC;0FAAC;AACnC,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,CAAC;4FAAC;AACrC,IAAA,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC;wFAAC;AACjC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAgB,IAAI;kFAAC;AAC7C,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC;iFAAC;AAC1B,IAAA,MAAM,UAAU,GAAG,MAAM,CAA+B,IAAI;mFAAC;AAC7D,IAAA,MAAM,cAAc,GAAG,MAAM,CAAgB,IAAI;uFAAC;;;IAIlD,IAAI,kBAAkB,GAAG,KAAK;;;;;IAM9B,MAAM,OAAO,GAAG,MAAK;AACnB,QAAA,MAAM,WAAW,GAAG,SAAS,EAAE;QAE/B,OAAO,WAAW,KAAK,IAAI,IAAI,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE;AACzD,IAAA,CAAC;;;IAID,MAAM,cAAc,GAAG,MAAK;QAC1B,MAAM,aAAa,GAAG,OAAO,OAAO,CAAC,aAAa,KAAK,UAAU,GAAG,OAAO,CAAC,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa;QACnH,MAAM,UAAU,GAAG,OAAO,IAAI,EAAE,OAAO,KAAK,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO;AAEvF,QAAA,IAAI,CAAC,aAAa;AAAE,YAAA,OAAO,UAAU;AACrC,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,aAAa;;;AAIrC,QAAA,OAAO,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,aAAa,CAAC;AAChH,IAAA,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,OAAgC,KAC5C,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE;AAChE,QAAA,OAAO,EAAE,QAAiB;QAC1B,IAAI,EAAE,IAAI,EAAE,IAAI;QAChB,cAAc,EAAE,aAAa,EAAE,cAAc;QAC7C,eAAe,EAAE,aAAa,EAAE,eAAe;QAC/C,aAAa,EAAE,aAAa,EAAE,aAAa;AAC3C,QAAA,YAAY,EAAE,aAAa,EAAE,YAAY,IAAI,MAAM;QACnD,OAAO;AACR,KAAA,CAAC;AAEJ;;;;;;;;;;;AAWG;IACH,MAAM,cAAc,GAAG,CAAC,OAAgC,KACtD,KAAK,CAAC,MAAK;QACT,MAAM,KAAK,GAAG,yBAAyB,CAAC;AACtC,YAAA,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,QAAQ;AACtB,SAAA,CAAC;QAEF,kBAAkB,GAAG,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI;AAErD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC;AAEhC,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK;AAExB,QAAA,MAAM,QAAQ,GACZ,MAAM,KAAK;AACT,cAAE,IAAI,CAAC,OAAO;cACZ,UAAU,CACR,MACE,IAAI,iBAAiB,CAAC;gBACpB,MAAM;AACN,gBAAA,UAAU,EAAE,gCAAgC;gBAC5C,GAAG,EAAE,OAAO,CAAC,QAAQ;AACrB,gBAAA,KAAK,EAAE,EAAE,OAAO,EAAE,CAAA,SAAA,EAAY,MAAM,mBAAmB,EAAE;AAC1D,aAAA,CAAC,CACL;AAEP,QAAA,OAAO,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,CAAC,CAAC;AAC/D,IAAA,CAAC,CAAC;IAEJ,MAAM,YAAY,GAAG,MAAK;AACxB,QAAA,MAAM,OAAO,GAAG,cAAc,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,oCAAoC,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC;AAEhG,QAAA,OAAO,OAAO,CAAC,IAAI,CACjB,GAAG,CAAC,CAAC,KAAK,KAAK,WAAW,CAAC,KAAK,CAAC,CAAC,EAClC,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,KAAI;AAC3B,gBAAA,MAAM,YAAY,GAA8B,EAAE,KAAK,EAAE,UAAU,EAAE;AAErE,gBAAA,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,GAAG,YAAY,CAAC,IAAI,oBAAoB,CAAC,YAAY,CAAC;AAEzF,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;AACtB,oBAAA,OAAO,UAAU,CAAC,MAAM,KAAK,CAAC;gBAChC;;AAGA,gBAAA,MAAM,OAAO,GAAG,UAAU,GAAG,CAAC;gBAE9B,UAAU,CAAC,GAAG,CAAC;oBACb,OAAO;oBACP,OAAO,EAAE,WAAW,CAAC,KAAK;oBAC1B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,KAAK;AACxC,oBAAA,MAAM,EAAE,KAAK,YAAY,iBAAiB,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;AAC9D,iBAAA,CAAC;AAEF,gBAAA,OAAO,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAClC,GAAG,CAAC,MAAK;AACP,oBAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,oBAAA,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;gBACvB,CAAC,CAAC,CACH;YACH,CAAC;AACF,SAAA,CAAC,EACF,UAAU,CAAC,CAAC,CAAC,KAAI;YACf,gBAAgB,CAAC,CAAC,CAAC;AAEnB,YAAA,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CACH;AACH,IAAA,CAAC;AAED,IAAA,MAAM,OAAO,GAAG,CAAC,OAAmD,KAAI;QACtE,IAAI,CAAC,OAAO,EAAE,KAAK,KAAK,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,OAAO,EAAE,UAAU,CAAC,CAAC,EAAE;;AAEzE,YAAA,OAAO,KAAK;QACd;QAEA,yBAAyB,CAAC,WAAW,EAAE;QAEvC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAC/B,QAAA,iBAAiB,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC;AACxC,QAAA,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC;QAE1B,OAAO,CAAC,GAAG,CAAC;YACV,WAAW,EAAE,eAAe,EAAE;AAC9B,YAAA,QAAQ,EAAE,IAAI;AACf,SAAA,CAAC;AACF,QAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,QAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACf,QAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AAEpB,QAAA,MAAM,MAAM,GAAG,YAAY,EAAE;AAE7B,QAAA,yBAAyB,GAAG,MAAM,CAAC,SAAS,CAAC;YAC3C,KAAK,EAAE,MAAK;;;YAGZ,CAAC;AACF,SAAA,CAAC;AAEF,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IAED,MAAM,OAAO,GAAG,MAAK;AACnB,QAAA,MAAM,SAAS,GAAG,CAAC,yBAAyB,CAAC,MAAM;QAEnD,yBAAyB,CAAC,WAAW,EAAE;;;AAGvC,QAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QACpB,MAAM,CAAC,QAAQ,EAAE;AAEjB,QAAA,OAAO,SAAS;AAClB,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,KAAqC,KAAI;AAC5D,QAAA,QAAQ,KAAK,CAAC,IAAI;YAChB,KAAK,aAAa,CAAC,QAAQ;gBACzB;AACE,oBAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACjB,oBAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBACxB,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;AAElD,oBAAA,MAAM,gBAAgB,GAAG,OAAO,CAAC;0BAC7B,OAAO,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO;AACpC,0BAAE,uBAAuB,CAAC,KAAK,CAAC,OAAO,CAAC;AAC1C,oBAAA,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,gBAAgB,CAAC;AACtE,oBAAA,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;gBACnC;gBACA;YAEF,KAAK,aAAa,CAAC,cAAc;YACjC,KAAK,aAAa,CAAC,gBAAgB;gBACjC;oBACE,kBAAkB,CAAC,KAAK,CAAC;gBAC3B;gBACA;YAEF,KAAK,aAAa,CAAC,IAAI;YACvB,KAAK,aAAa,CAAC,cAAc;YACjC,KAAK,aAAa,CAAC,IAAI;gBACrB;;gBAEA;gBACA;;AAGJ,QAAA,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;AACvB,QAAA,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;AACpB,IAAA,CAAC;AAED,IAAA,MAAM,gBAAgB,GAAG,CAAC,aAAsB,KAAI;AAClD,QAAA,MAAM,QAAQ,GAAG,wBAAwB,CAAC,aAAa,CAAC;AAExD,QAAA,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;AACnB,QAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACjB,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAAE,CAAC;AAElD,QAAA,MAAM,UAAU,GAAmB,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE;AAClG,QAAA,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC;AAC5B,QAAA,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QAEvB,OAAO,CAAC,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC;AAC/D,IAAA,CAAC;AAED,IAAA,MAAM,kBAAkB,GAAG,CAAC,KAAwB,KAAI;AACtD,QAAA,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE;YAC7B;QACF;AAEA,QAAA,MAAM,QAAQ,GAAoC;YAChD,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,UAAU,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG;AAC9C,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,aAAa,EAAE,IAAI;SACpB;AAED,QAAA,MAAM,KAAK,GAA4B;YACrC,WAAW,EAAE,eAAe,EAAE;YAC9B,QAAQ;SACT;AAED,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE;AAC9B,QAAA,MAAM,yBAAyB,GAAG,WAAW,GAAG,iBAAiB,EAAE;AACnE,QAAA,MAAM,2BAA2B,GAAG,WAAW,GAAG,eAAe,EAAE;QACnE,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,mBAAmB,EAAE;;;;QAKzD,MAAM,YAAY,GAAG,yBAAyB,GAAG,CAAC,IAAI,YAAY,GAAG,CAAC;;;AAItE,QAAA,IAAI,YAAY,IAAI,2BAA2B,GAAG,uBAAuB,EAAE;YACzE,MAAM,cAAc,GAAG,CAAC,YAAY,GAAG,yBAAyB,IAAI,IAAI;AAExE,YAAA,QAAQ,CAAC,KAAK,GAAG,cAAc;YAC/B,QAAQ,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,IAAI,cAAc,CAAC,GAAG,IAAI;QAC3F;QAEA,IAAI,YAAY,EAAE;AAChB,YAAA,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC;AAClC,YAAA,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;QACvC;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,IAAA,CAAC;AAED,IAAA,MAAM,sBAAsB,GAAG,MAAM,CAAgB,IAAI;+FAAC;AAE1D,IAAA,MAAM,qBAAqB,GAAG,CAAC,gBAAyE,KAAI;AAC1G,QAAA,QAAQ,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACnC,QAAA,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,CAAC;AACzC,QAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACf,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACxC,IAAA,CAAC;AAED,IAAA,MAAM,uBAAuB,GAAG,MAAM,CAAgB,IAAI;gGAAC;AAE3D,IAAA,MAAM,sBAAsB,GAAG,CAAC,iBAA0E,KAAI;AAC5G,QAAA,QAAQ,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC;AACpC,QAAA,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC;QAC1C,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AACzC,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAuB;QACtC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,QAAQ;QACrB,IAAI,EAAE,IAAI,IAAI,IAAI;QAClB,OAAO;QACP,OAAO;AACP,QAAA,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;AAC7B,QAAA,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE;AACzB,QAAA,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE;AAC/B,QAAA,YAAY,EAAE,YAAY,CAAC,UAAU,EAAE;AACvC,QAAA,OAAO,EAAE,MAAM,CAAC,YAAY,EAAE;QAC9B,OAAO;AACP,QAAA,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE;AACjC,QAAA,MAAM,EAAE;YACN,qBAAqB;AACrB,YAAA,sBAAsB,EAAE,sBAAsB,CAAC,UAAU,EAAE;YAC3D,sBAAsB;AACtB,YAAA,uBAAuB,EAAE,uBAAuB,CAAC,UAAU,EAAE;YAC7D,cAAc;AACd,YAAA,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE;AAC/B,YAAA,UAAU,EAAE,UAAU,CAAC,UAAU,EAAE;AACnC,YAAA,cAAc,EAAE,cAAc,CAAC,UAAU,EAAE;AAC5C,SAAA;KACF;AAED,IAAA,OAAO,WAAW;AACpB;;AC9lBA;AAgMA;AACO,MAAM,sBAAsB,GAAG,CAA+B,SAAY,KAC/E,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AAE/C;AACO,MAAM,0BAA0B,GAAG,CAA4C,SAAY,KAChG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK;AAE9C,MAAM,gBAAgB,GAAG,CAM9B,OAA6D,KAC3D;IAGF,MAAM,EACJ,IAAI,EACJ,YAAY,EACZ,YAAY,EACZ,MAAM,EACN,QAAQ,GAAG,EAAE,EACb,QAAQ,GAAG,CAAC,UAAuB,EAAE,UAAuB,KAAI;QAC9D,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,UAAU,CAAC;QAC9C,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI;AAEhG,QAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;AAC/B,IAAA,CAAC,EACD,SAAS,EACT,SAAS,EACT,eAAe,EACf,UAAU,GAAG,QAAQ,EACrB,cAAc,GAAG,QAAQ,GAC1B,GAAG,OAAO,IAAI,EAAE;AAEjB,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AAEjC,IAAA,MAAM,OAAO,GAAG,MAAM,CAAc,EAAE;gFAAC;AACvC,IAAA,MAAM,SAAS,GAAG,MAAM,CAAmB,IAAI;kFAAC;AAChD,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI;mFAAC;AAEvD,IAAA,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,SAAS,CAAC;AACtF,IAAA,MAAM,8BAA8B,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,oBAAoB,CAAC;IAE7G,IAAI,kBAAkB,EAAE;QACtB,MAAM,sBAAsB,EAAE;IAChC;IAEA,IAAI,8BAA8B,EAAE;QAClC,MAAM,gCAAgC,EAAE;IAC1C;AAEA,IAAA,MAAM,WAAW,GAAG,CAAC,IAAsF,KAAI;QAC7G,IAAI,IAAI,KAAK,IAAI;AAAE,YAAA,OAAO,IAAI;QAE9B,OAAO,SAAS,CAAC,MAAK;AACpB,YAAA,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC;YAExD,IAAI,YAAY,GAAG,YAAY;AAC/B,YAAA,IAAI,eAAe,KAAK,KAAK,IAAI,MAAM,EAAE;AACvC,gBAAA,MAAM,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACrD,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,EAA+C,CAAC,CAAC,CACnF;gBAED,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AACvC,oBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC;AACpB,oBAAA,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,wBAAA,OAAO,KAAK;AACvC,oBAAA,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;AACrB,oBAAA,OAAO,IAAI;AACb,gBAAA,CAAC,CAAC;YACJ;AAEA,YAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,EAAE,MACjD,YAAY,CAAC,GAAG,CACd,CAAC,YAAY,KACX,YAAY,CACV,QAAQ,CAAC,MAAM,YAAY,CAAC,EAC5B,GAAG,QAAQ,CACC,CACjB,CACF;AAED,YAAA,MAAM,UAAU,GAAG,OAAO,EAAE;YAE5B,IAAI,MAAM,EAAE;AACV,gBAAA,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,iBAAiB,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;gBAEnG,IAAI,YAAY,GAAG,eAAe;gBAClC,IAAI,UAAU,IAAI,YAAY,CAAC,MAAM,GAAG,UAAU,EAAE;AAClD,oBAAA,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,GAAG,UAAU;oBAEpD,MAAM,eAAe,GACnB,cAAc,KAAK,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;AAErG,oBAAA,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;oBAElD,YAAY;wBACV,cAAc,KAAK,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;gBACrG;AAEA,gBAAA,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;;;gBAIzB,MAAM,IAAI,GACR,iBAAiB,IAAI,YAAY,CAAC,QAAQ,CAAC,iBAAiB;AAC1D,sBAAE;AACF,uBAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAErD,gBAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnB,gBAAA,OAAO,IAAI;YACb;iBAAO;AACL,gBAAA,MAAM,KAAK,GAAG,SAAS,KAAK,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBACrD,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE9D,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,KAAI;oBACtD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAA+C,CAAC;AAClF,oBAAA,OAAO,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,gBAAA,CAAC,CAAC;gBAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAA+C,CAAC,EAAE,CAAC,CAAC,CAAC,CAC/F;gBAED,MAAM,YAAY,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,YAAY,KAAI;AACrD,oBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,CAAC;oBAC/B,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;oBAEvC,IAAI,SAAS,EAAE;AACb,wBAAA,OAAO,SAAS;oBAClB;oBAEA,OAAO,qBAAqB,CAC1B,QAAQ,EACR,MACE,YAAY,CACV,QAAQ,CAAC,MAAM,YAAY,CAAC,EAC5B,GAAG,QAAQ,CACC,CACjB;AACH,gBAAA,CAAC,CAAC;AAEF,gBAAA,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE;oBACjC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;AACpC,wBAAA,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE;oBAC3B;gBACF;AAEA,gBAAA,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAEzB,gBAAA,MAAM,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI;AAE1D,gBAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnB,gBAAA,OAAO,IAAI;YACb;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,MAAM,KAAK,GAAG,MAAK;AACjB,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE;AAC7B,YAAA,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE;QACxB;AAEA,QAAA,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACf,QAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,IAAA,CAAC;IAED,MAAM,CAAC,MAAK;QACV,YAAY,IAAI;AAEhB,QAAA,SAAS,CAAC,MAAM,KAAK,EAAE,CAAC;AAC1B,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC;IAEjD,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;mFAAC;IAErE,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM;qFAAC;AAEhF,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,EAAE,GAAG,OAAO,EAAE;QACpB,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACtD,CAAC;mFAAC;AAEF,IAAA,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAK;AACpC,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,CAAC,MAAM;QAC9B,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM;AAC3D,QAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1B,CAAC;wFAAC;IAEF,MAAM,QAAQ,GAAG,QAAQ,CACvB,MACE,OAAO;SACJ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;SACpB,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI;iFACrC;IAED,MAAM,MAAM,GAAG,QAAQ,CAAC,MACtB,OAAO;SACJ,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE;SACpB,MAAM,CAAC,CAAC,CAAC,KAA8B,CAAC,KAAK,IAAI,CAAC;+EACtD;AAED,IAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAC7B,QAAA,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;AACpD,QAAA,OAAO,SAAS,GAAG,SAAS,CAAC,IAAI,SAAS;AAC5C,IAAA,CAAC,CAAuB;AAExB,IAAA,MAAM,OAAO,GAAG,CAAC,OAAkC,KAAI;AACrD,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE;AAC7B,YAAA,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC;QACjE;AACF,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;AACvB,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,EAAE;AAC7B,YAAA,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE;AACjB,gBAAA,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC;YACnD;QACF;AACF,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAgD;AACzD,QAAA,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;AAC7B,QAAA,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE;QACjC,UAAU;QACV,UAAU;QACV,YAAY;QACZ,UAAU;QACV,eAAe;QACf,QAAQ;QACR,MAAM;QACN,QAAQ;QACR,OAAO;QACP,KAAK;QACL,WAAW;AACX,QAAA,MAAM,EAAE;YACN,WAAW;AACZ,SAAA;KACF;AAED,IAAA,MAAM,YAAY,GAAG,iCAAiC,EAAE;AAExD,IAAA,IAAI,sBAAsB,EAAE,IAAI,CAAC,YAAY,EAAE;QAC7C,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC5C,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,MAAM,EAAE,KAAK;AACb,YAAA,IAAI,EAAE;AACJ,gBAAA,QAAQ,EAAE,6BAA6B,CAAC,QAAQ,CAAC;AAClD,aAAA;AACF,SAAA,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;IAC1C;AAEA,IAAA,OAAO,KAAK;AACd;;ACrcA;AA2BO,MAAM,wBAAwB,GAAG,CAAI,QAAsB,KAAI;AACpE,IAAA,MAAM,UAAU,GAA4B;QAC1C,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,QAAQ,CAAC,cAAc;QACnC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B;AAED,IAAA,OAAO,UAAU;AACnB;AAEO,MAAM,uBAAuB,GAAG,CAAI,QAA4B,KAAI;AACzE,IAAA,MAAM,UAAU,GAA4B;QAC1C,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,QAAQ,CAAC,cAAc;QACnC,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,YAAY,EAAE,QAAQ,CAAC,YAAY;QACnC,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B;AAED,IAAA,OAAO,UAAU;AACnB;AAEO,MAAM,wBAAwB,GAAG,CAAI,QAA6B,KAAI;AAC3E,IAAA,MAAM,UAAU,GAA4B;QAC1C,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,YAAY,EAAE,QAAQ,CAAC,KAAK;QAC5B,SAAS,EAAE,QAAQ,CAAC,SAAS;KAC9B;AAED,IAAA,OAAO,UAAU;AACnB;AAEO,MAAM,kCAAkC,GAAG,CAAI,QAAuC,KAAI;IAC/F,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAE9E,IAAA,MAAM,UAAU,GAA4B;QAC1C,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,UAAU;QACV,WAAW;QACX,YAAY,EAAE,QAAQ,CAAC,KAAK;QAC5B,SAAS,EAAE,QAAQ,CAAC,KAAK;KAC1B;AAED,IAAA,OAAO,UAAU;AACnB;MAEa,qBAAqB,GAAG,CAAC,SAAS,GAAG,EAAE,KAAI;IACtD,OAAO,CAAI,QAAW,KAAI;AACxB,QAAA,MAAM,UAAU,GAA4B;YAC1C,KAAK,EAAE,CAAC,QAAQ,CAAC;AACjB,YAAA,UAAU,EAAE,SAAS;AACrB,YAAA,WAAW,EAAE,CAAC;AACd,YAAA,YAAY,EAAE,CAAC;YACf,SAAS;SACV;AAED,QAAA,OAAO,UAAU;AACnB,IAAA,CAAC;AACH;AAwMO,MAAM,qBAAqB,GAAG,CAKnC,OAA6D,KAC3D;IACF,MAAM,EAAE,kBAAkB,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,OAAO;AAE9D,IAAA,MAAM,eAAe,GAAG,MAAM,CAA4B,IAAI;wFAAC;IAC/D,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC;oFAAC;AACpD,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,EAAE;sFAAC;AAC3C,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,EAAE;sFAAC;AAC3C,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC;qFAAC;AAE9B,IAAA,MAAM,aAAa,GAAG,MAAM,CAA2B,MAAM;sFAAC;AAE9D,IAAA,8BAA8B,EAAE;IAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC;AAC7B,QAAA,IAAI,EAAE,MAAM,IAAI;QAChB,YAAY;AACZ,QAAA,MAAM,EAAE,IAAI;QACZ,QAAQ;AACR,QAAA,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,KAAI;AACnC,YAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC;AAC9B,YAAA,MAAM,GAAG,GAAG,aAAa,EAAE;YAE3B,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,MAAM,SAAS,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI;AAE3D,gBAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE;YAC3C;AAAO,iBAAA,IAAI,GAAG,KAAK,UAAU,EAAE;AAC7B,gBAAA,OAAO,EAAE,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;YACpE;iBAAO;AACL,gBAAA,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,UAAU,EAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;YACpE;QACF,CAAC;AACD,QAAA,SAAS,EAAE,sBAAsB;AAClC,KAAA,CAAC;IAEF,MAAM,CAAC,MAAK;AACV,QAAA,YAAY,EAAE;QAEd,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,EAAE,CAAC;QAE5C,SAAS,CAAC,MAAK;YACb,KAAK,CAAC,KAAK,EAAE;AACb,YAAA,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,YAAA,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;AAChC,YAAA,aAAa,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;AAChC,YAAA,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC;AAChC,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;AAEF,IAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAK;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE;AACzC,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE;AAE5B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AAErB,QAAA,OAAO,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;IACrC,CAAC;sFAAC;AAEF,IAAA,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAK;QAClC,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE;AAC1C,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE;AAE5B,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;AAErB,QAAA,OAAO,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC;IACrC,CAAC;sFAAC;AAEF,IAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AACtC,QAAA,MAAM,GAAG,GAAG,aAAa,EAAE;AAE3B,QAAA,OAAO,GAAG,GAAG,aAAa,EAAE,KAAK,CAAC,GAAG,KAAK;IAC5C,CAAC;0FAAC;AAEF,IAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,GAAG,GAAG,aAAa,EAAE;AAE3B,QAAA,OAAO,GAAG,GAAG,aAAa,EAAE,KAAK,GAAG,CAAC,UAAU,GAAG,KAAK;IACzD,CAAC;yFAAC;IAEF,MAAM,iBAAiB,GAAG,MAAK;AAC7B,QAAA,MAAM,IAAI,GAAG,aAAa,EAAE,GAAG,CAAC;AAChC,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE;AAErC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAC1B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,IAAI,GAAG,CAAC,EAAE;YACZ,IAAI,SAAS,EAAE,EAAE;gBACf,MAAM,sDAAsD,EAAE;YAChE;AAEA,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACrD,QAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;QAE7B,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;AACpD,IAAA,CAAC;IAED,MAAM,aAAa,GAAG,MAAK;AACzB,QAAA,MAAM,IAAI,GAAG,aAAa,EAAE,GAAG,CAAC;AAChC,QAAA,MAAM,iBAAiB,GAAG,aAAa,EAAE;AACzC,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,EAAE;AAErC,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE;AAC1B,YAAA,OAAO,IAAI;QACb;QAEA,IAAI,CAAC,iBAAiB,EAAE;YACtB,IAAI,SAAS,EAAE,EAAE;gBACf,MAAM,gDAAgD,EAAE;YAC1D;AAEA,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,IAAI,GAAG,iBAAiB,CAAC,UAAU,EAAE;YACvC,IAAI,SAAS,EAAE,EAAE;gBACf,MAAM,uCAAuC,CAAC,IAAI,EAAE,iBAAiB,CAAC,UAAU,CAAC;YACnF;AAEA,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;AACrD,QAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;QAEzB,OAAO,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,eAAe,EAAE,CAAC;AACpD,IAAA,CAAC;AAED,IAAA,MAAM,eAAe,GAAG,CAAC,UAAkB,KAAI;AAC7C,QAAA,MAAM,oBAAoB,GAAG,aAAa,EAAE;AAC5C,QAAA,MAAM,oBAAoB,GAAG,aAAa,EAAE;AAE5C,QAAA,IAAI,CAAC,oBAAoB,IAAI,CAAC,oBAAoB,EAAE;AAClD,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,uBAAuB,GAAG,UAAU,KAAK,oBAAoB,CAAC,WAAW,GAAG,CAAC;QACnF,MAAM,sBAAsB,GAAG,UAAU,KAAK,oBAAoB,CAAC,WAAW,GAAG,CAAC;AAElF,QAAA,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE;YACxC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM;AAC3C,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,GAAG,aAAa,EAAE,CAAC,GAAG,CAAC;AAEvE,YAAA,IAAI,YAAY,KAAK,eAAe,EAAE;gBACpC,IAAI,SAAS,EAAE,EAAE;AACf,oBAAA,MAAM,gDAAgD,CAAC,YAAY,EAAE,eAAe,CAAC;gBACvF;YACF;AAEA,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE;AACtB,YAAA,OAAO,KAAK;QACd;QAEA,OAAO,uBAAuB,IAAI,sBAAsB;AAC1D,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAG,CAAC,YAA0C,KAAI;QAC3D,MAAM,IAAI,GAAG,YAAY,EAAE,WAAW,IAAI,WAAW,EAAE;AAEvD,QAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;AACzB,QAAA,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnC,IAAA,CAAC;AAED,IAAA,MAAM,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AACzC,QAAA,MAAM,oBAAoB,GAAG,aAAa,EAAE;AAE5C,QAAA,IAAI,CAAC,oBAAoB,IAAI,KAAK,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,KAAK;AAE7D,QAAA,OAAO,aAAa,EAAE,GAAG,CAAC;IAC5B,CAAC;6FAAC;AACF,IAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAK;AACrC,QAAA,MAAM,oBAAoB,GAAG,aAAa,EAAE;AAE5C,QAAA,IAAI,CAAC,oBAAoB,IAAI,KAAK,CAAC,UAAU,EAAE;AAAE,YAAA,OAAO,KAAK;AAE7D,QAAA,OAAO,aAAa,EAAE,GAAG,oBAAoB,CAAC,UAAU;IAC1D,CAAC;yFAAC;AAEF,IAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAK;AAC1B,QAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE;QAC5B,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;IAChE,CAAC;8EAAC;AAEF,IAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE;IACvE,CAAC;oFAAC;AAEF,IAAA,MAAM,OAAO,GAAG,CAAC,OAA8C,KAAI;AACjE,QAAA,MAAM,OAAO,GAAG,OAAO,EAAE,KAAK;QAE9B,IAAI,OAAO,EAAE;AACX,YAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAgB;AAChD,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE;AAE5B,YAAA,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;AACtD,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE;AAC5B,gBAAA,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,EAAE;gBAEzB,IAAI,GAAG,EAAE;AACP,oBAAA,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;gBAC7B;qBAAO,IAAI,GAAG,EAAE;AACd,oBAAA,IAAI,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;AAChF,wBAAA,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;;AAI3B,wBAAA,IAAI,KAAK,KAAK,CAAC,EAAE;4BACf,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;4BAE5C,IAAI,SAAS,EAAE;AACb,gCAAA,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;4BACjC;wBACF;wBAEA,IAAI,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;4BACxC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC;4BAE5C,IAAI,SAAS,EAAE;AACb,gCAAA,gBAAgB,CAAC,GAAG,CAAC,SAAS,CAAC;4BACjC;wBACF;oBACF;gBACF;YACF;AAEA,YAAA,KAAK,MAAM,KAAK,IAAI,gBAAgB,EAAE;AACpC,gBAAA,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;YAChE;QACF;aAAO;YACL,KAAK,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;QACpD;AACF,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAmD;QACjE,aAAa;QACb,aAAa;QACb,iBAAiB;QACjB,aAAa;QACb,oBAAoB;QACpB,gBAAgB;QAChB,KAAK;AACL,QAAA,SAAS,EAAE,aAAa,CAAC,UAAU,EAAE;QACrC,OAAO,EAAE,KAAK,CAAC,UAAU;QACzB,KAAK,EAAE,KAAK,CAAC,QAAQ;QACrB,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW;QACX,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,gBAAgB;QAChB,iBAAiB;QACjB,KAAK;QACL,OAAO;KACR;IAED,IAAI,sBAAsB,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC5C,YAAA,IAAI,EAAE,mBAAmB;AACzB,YAAA,MAAM,EAAE,UAAU;AAClB,YAAA,IAAI,EAAE;AACJ,gBAAA,QAAQ,EAAE,6BAA6B,CAAC,QAAQ,CAAC;AAClD,aAAA;AACF,SAAA,CAAC;QAEF,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;IAC1C;AAEA,IAAA,OAAO,UAAU;AACnB;;ACxjBA;;;;;;;;AAQG;AACI,MAAM,+BAA+B,GAAG;;ACmC/C,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,OAAO,CAA4B,EAAE,CAAC;AAC9E,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;AAC/C,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE;AAE3C;;;AAGG;AACI,MAAM,iCAAiC,GAAG,OAAgC;AAC/E,IAAA,SAAS,EAAE,iBAAiB;AAC5B,IAAA,IAAI,EAAE,WAAW;AACjB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,MAAM,EAAE,WAAW;AACnB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,WAAW,EAAE,KAAK;AACnB,CAAA;;ACuCD;AACO,MAAM,iCAAiC,GAAG;AAEjD;AACO,MAAM,qCAAqC,GAAG;AAErD;AACO,MAAM,qCAAqC,GAAG;AAErD;AACO,MAAM,iCAAiC,GAAG;;AChE1C,MAAM,4BAA4B,GAAG,CAAC,OAA4C,KAA4B;IACnH,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO;AAE/C,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,iCAAiC;AACnE,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,iCAAiC;AACjE,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,qCAAqC;AAC7E,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,qCAAqC;;AAG7E,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAqC;;AAG1D,IAAA,MAAM,aAAa,GAAG,IAAI,GAAG,EAAiC;;AAG9D,IAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAY;AAE7C,IAAA,IAAI,UAAqD;IACzD,IAAI,OAAO,GAAG,KAAK;IACnB,IAAI,WAAW,GAAG,KAAK;IACvB,IAAI,iBAAiB,GAAG,KAAK;IAC7B,IAAI,qBAAqB,GAAG,KAAK;AACjC,IAAA,IAAI,SAAsB;AAE1B,IAAA,MAAM,SAAS,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC;AAEvE;;;;AAIG;AACH,IAAA,IAAI,UAAU,GAAqB,OAAO,CAAC,OAAO,EAAE;AAEpD,IAAA,MAAM,OAAO,GAAG,CAAI,IAAsB,KAAI;AAC5C,QAAA,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAExD,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;AAEvC,QAAA,OAAO,GAAG;AACZ,IAAA,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,IAA6B,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,IAAI,CAAC,WAAW,GAAG,MAAM,IAAI,GAAG;AAEvG,IAAA,MAAM,MAAM,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,IAAI,EAAuB,KAA8B,IAAI;AAE/F,IAAA,MAAM,UAAU,GAAG,OAAO,IAAgB,KAAI;QAC5C,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;;;;AAKlB,QAAA,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC;AAE1B,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QACnB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,iBAAiB,GAAG,YAAW;AACnC,QAAA,IAAI,KAAK,CAAC,IAAI,IAAI,UAAU;YAAE;AAE9B,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;QACtF,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC;AAE9E,QAAA,MAAM,UAAU,CAAC,MAAM,CAAC;AAC1B,IAAA,CAAC;IAED,MAAM,WAAW,GAAG,MAAK;;;;QAIvB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,aAAa,EAAE;YACxC,IAAI,KAAK,CAAC,QAAQ;AAAE,gBAAA,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC;QAC/C;AAEA,QAAA,OAAO,OAAO,CAAC,YAAW;YACxB,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;iBACzC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ;iBAC9B,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC;AAE1B,YAAA,MAAM,UAAU,CAAC,UAAU,CAAC;AAC9B,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAG,YAAW;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;YACxB,OAAO,GAAG,IAAI;AACd,YAAA,SAAS,EAAE;YAEX;QACF;;;AAIA,QAAA,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,MAAiC,EAAE,CAAC;AAExF,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;QACtB,MAAM,WAAW,GAAe,EAAE;AAElC,QAAA,KAAK,MAAM,IAAI,IAAI,WAAW,EAAE;AAC9B,YAAA,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE;AACpD,gBAAA,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;YAC5B;iBAAO;gBACL,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC;YAC3B;QACF;AAEA,QAAA,IAAI;;;;YAIF,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;gBACrC,MAAM,OAAO,CAAC,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;YACtC;AAAO,iBAAA,IAAI,WAAW,CAAC,MAAM,EAAE;gBAC7B,MAAM,OAAO,CAAC,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;YAC9C;;;;AAKA,YAAA,MAAM,OAAO,CAAC,iBAAiB,CAAC;QAClC;AAAE,QAAA,MAAM;;;QAGR;QAEA,OAAO,GAAG,IAAI;AACd,QAAA,SAAS,EAAE;QAEX,IAAI,qBAAqB,EAAE;YACzB,qBAAqB,GAAG,KAAK;YAC7B,MAAM,WAAW,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;QAC5C;QAEA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;QAC5C,iBAAiB,CAAC,KAAK,EAAE;AAEzB,QAAA,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;AACxB,YAAA,KAAK,OAAO,CAAC,GAAG,CAAC;QACnB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,OAAO,GAAG,OAAO,GAAa,KAAI;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAE3B,QAAA,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE;AAE9B,QAAA,IAAI,MAAiC;AAErC,QAAA,IAAI;YACF,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;QAClC;AAAE,QAAA,MAAM;YACN;QACF;QAEA,IAAI,CAAC,MAAM,EAAE;;;AAGX,YAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;YAEjB;QACF;;;;AAKA,QAAA,UAAU,CAAC,sBAAsB,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;AAC1F,IAAA,CAAC;AAED,IAAA,MAAM,QAAQ,GAAG,YAAW;QAC1B,YAAY,CAAC,UAAU,CAAC;QACxB,UAAU,GAAG,SAAS;QAEtB,IAAI,CAAC,aAAa,CAAC,IAAI;YAAE;QAEzB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QAClD,aAAa,CAAC,KAAK,EAAE;AAErB,QAAA,IAAI,iBAAiB;YAAE;AAEvB,QAAA,IAAI;AACF,YAAA,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;QAC9B;AAAE,QAAA,MAAM;;;AAGN,YAAA,IAAI;gBACF,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;AACzC,qBAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW;AAC5C,qBAAA,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC;qBAClC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC;AAE1B,gBAAA,MAAM,UAAU,CAAC,UAAU,CAAC;AAC5B,gBAAA,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAC9B;YAAE,OAAO,KAAK,EAAE;gBACd,iBAAiB,GAAG,IAAI;gBAExB,IAAI,SAAS,EAAE,EAAE;AACf,oBAAA,OAAO,CAAC,IAAI,CACV,kGAAkG,EAClG,KAAK,CACN;gBACH;gBAEA;YACF;QACF;AAEA,QAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,YAAA,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACrC;QAEA,MAAM,iBAAiB,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;AAClD,IAAA,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;IAErC,MAAM,aAAa,GAAG,MAAK;AACzB,QAAA,IAAI,UAAU,KAAK,SAAS,IAAI,iBAAiB,IAAI,WAAW;YAAE;AAElE,QAAA,UAAU,GAAG,UAAU,CAAC,MAAM,KAAK,KAAK,EAAE,EAAE,UAAU,CAAC;AACzD,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,KAAiE,KAAI;AACvF,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,iBAAiB;YAAE;QAE/C,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE;;;AAIrC,QAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;YAAE;AAEzC,QAAA,MAAM,SAAS,GAAG;YAChB,GAAG,EAAE,KAAK,CAAC,GAAG;AACd,YAAA,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG;AACtB,YAAA,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB;QAED,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;YAAE;AAEhD,QAAA,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE;AAC3B,YAAA,GAAG,SAAS;YACZ,IAAI;AACJ,YAAA,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE;AACpC,YAAA,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE;YACvB,OAAO;AACR,SAAA,CAAC;AAEF,QAAA,aAAa,EAAE;AACjB,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,KAA2B,KAAI;AAClD,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE;;;YAGtC,IAAI,CAAC,OAAO,EAAE;gBACZ,qBAAqB,GAAG,IAAI;YAC9B;iBAAO;gBACL,KAAK,WAAW,EAAE,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;YAC3C;YAEA;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE;YAClC,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,gBAAgB;gBAAE;YAEhD,IAAI,OAAO,EAAE;AACX,gBAAA,KAAK,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;YACzB;iBAAO;AACL,gBAAA,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;YAClC;YAEA;QACF;AAEA,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,gBAAgB;YAAE,UAAU,CAAC,KAAK,CAAC;AACrG,IAAA,CAAC;IAED,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC;IAEnE,MAAM,KAAK,GAAG,MAAK;QACjB,YAAY,CAAC,UAAU,CAAC;QACxB,UAAU,GAAG,SAAS;QACtB,aAAa,CAAC,KAAK,EAAE;AAErB,QAAA,OAAO,OAAO,CAAC,YAAW;YACxB,KAAK,CAAC,KAAK,EAAE;AAEb,YAAA,MAAM,OAAO,CAAC,KAAK,EAAE;AACvB,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,MAAM,OAAO,GAAG,MAAK;QACnB,WAAW,GAAG,IAAI;QAClB,iBAAiB,CAAC,WAAW,EAAE;QAC/B,YAAY,CAAC,UAAU,CAAC;QACxB,UAAU,GAAG,SAAS;;;QAItB,KAAK,KAAK,EAAE;AACd,IAAA,CAAC;IAED,KAAK,KAAK,EAAE;IAEZ,OAAO;QACL,SAAS;QACT,KAAK;QACL,KAAK;AACL,QAAA,YAAY,EAAE,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC9C,OAAO;KACR;AACH;;AC/VA;;;;AAIG;AACH,MAAM,UAAU,GAAG,MAAM;AACzB,MAAM,UAAU,GAAG,QAAQ;AAO3B,MAAM,SAAS,GAAG,CAAI,OAAsB,KAC1C,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,KAAI;AACjC,IAAA,OAAO,CAAC,SAAS,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;AACjD,IAAA,OAAO,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AAC/C,CAAC,CAAC;AAEJ;;;;AAIG;AACH,MAAM,YAAY,GAAG,CAAC,WAA2B,KAC/C,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,KAAI;IACpC,WAAW,CAAC,UAAU,GAAG,MAAM,OAAO,EAAE;AACxC,IAAA,WAAW,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;AACrD,IAAA,WAAW,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;AACvD,CAAC,CAAC;AAOJ;;;;;;;;AAQG;AACI,MAAM,sCAAsC,GAAG,CACpD,OAAsD,KAC3B;IAC3B,IAAI,OAAO,SAAS,KAAK,WAAW;QAAE,OAAO,iCAAiC,EAAE;IAEhF,IAAI,eAAe,GAAgC,IAAI;AAEvD,IAAA,MAAM,YAAY,GAAG,MACnB,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,KAAI;AAC3C,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,+BAA+B,CAAC;AAExF,QAAA,WAAW,CAAC,eAAe,GAAG,MAAK;AACjC,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM;;;AAInC,YAAA,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE;AAC7D,gBAAA,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC;YACvC;YAEA,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC1D,QAAQ,CAAC,iBAAiB,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5D,QAAA,CAAC;AAED,QAAA,WAAW,CAAC,SAAS,GAAG,MAAK;AAC3B,YAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM;;;;AAKnC,YAAA,QAAQ,CAAC,eAAe,GAAG,MAAK;gBAC9B,QAAQ,CAAC,KAAK,EAAE;gBAChB,eAAe,GAAG,IAAI;AACxB,YAAA,CAAC;YAED,OAAO,CAAC,QAAQ,CAAC;AACnB,QAAA,CAAC;AAED,QAAA,WAAW,CAAC,OAAO,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;;;AAIrD,QAAA,WAAW,CAAC,SAAS,GAAG,MACtB,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,OAAO,CAAC,WAAW,CAAA,6BAAA,CAA+B,CAAC,CAAC;AACtG,IAAA,CAAC,CAAC;IAEJ,MAAM,QAAQ,GAAG,OAAO,eAAe,KAAK,YAAY,EAAE,CAAC;AAE3D,IAAA,MAAM,SAAS,GAAG,YAAW;AAC3B,QAAA,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE;QAC3B,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC;AAE1D,QAAA,OAAO,MAAM,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,MAAM,EAA2C,CAAC;AAC/G,IAAA,CAAC;AAED,IAAA,MAAM,IAAI,GAAG,OAAO,GAAa,KAAwC;AACvE,QAAA,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE;QAC3B,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,EAAE,UAAU,CAAC;AAC1D,QAAA,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAgD,CAC5F;AAED,QAAA,OAAO,MAAM,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI;AAC9C,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAG,OAAO,OAA8B,KAAI;QACrD,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE;AAErB,QAAA,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE;AAC3B,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC;QACzE,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC;QAElD,KAAK,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,IAAI,OAAO,EAAE;AAC5C,YAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACnB,YAAA,MAAM,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAgC,CAAC;QACxE;AAEA,QAAA,MAAM,YAAY,CAAC,WAAW,CAAC;AACjC,IAAA,CAAC;AAED,IAAA,MAAM,MAAM,GAAG,OAAO,IAAgB,KAAI;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE;AAElB,QAAA,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE;AAC3B,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC;QACzE,MAAM,IAAI,GAAG,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC;QAChD,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC;AAElD,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;AACtB,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;AAChB,YAAA,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;QACpB;AAEA,QAAA,MAAM,YAAY,CAAC,WAAW,CAAC;AACjC,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAG,YAAW;AACvB,QAAA,MAAM,EAAE,GAAG,MAAM,QAAQ,EAAE;AAC3B,QAAA,MAAM,WAAW,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC;QAEzE,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE;QAC3C,WAAW,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE;AAE3C,QAAA,MAAM,YAAY,CAAC,WAAW,CAAC;AACjC,IAAA,CAAC;AAED,IAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE;AACrE;;AChHA;;;AAGG;MACU,sBAAsB,GAAG,CAAC,OAAe,EAAE,GAAW,KAAI;IACrE,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAA,EAAG,OAAO,GAAG,GAAG,CAAA,CAAE,GAAG,GAAG;;;IAI/D,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ;AAClE;AAEA;;;AAGG;MACU,qBAAqB,GAAG,CAAC,QAAgB,EAAE,cAAsB,KAAI;AAChF,IAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,cAAc,CAAC;AAAE,QAAA,OAAO,KAAK;IAEtD,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC;IAElD,OAAO,IAAI,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAC5F;AAEA;;;AAGG;AACI,MAAM,6BAA6B,GAAG,CAAC,OAG7C,KAAgD;AAC/C,IAAA,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO;AAE/B,IAAA,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,SAAS;IAErC,OAAO,CAAC,OAAO,KAAI;QACjB,IAAI,GAAG,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC;AAAE,YAAA,OAAO,KAAK;QAEjE,OAAO,MAAM,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI;AAC7E,IAAA,CAAC;AACH;;AC3FA;;;;;;;;AAQG;AAEH;AACA,MAAM,qBAAqB,GAAG,oDAAoD;AAElF;AACA,MAAM,oBAAoB,GAAG,iDAAiD;AAE9E;AACA,MAAM,kBAAkB,GAAG,sEAAsE;AAEjG,MAAM,oBAAoB,GAAG,kBAAkB;AAE/C,MAAM,gBAAgB,GAAG,UAAU;AAEnC,MAAM,mBAAmB,GAAG,0CAA0C;AAEtE,MAAM,iBAAiB,GAAG,kCAAkC;AAE5D,MAAM,oBAAoB,GAAG,qCAAqC;AAElE,MAAM,kBAAkB,GAAG,oCAAoC;AAE/D,MAAM,sBAAsB,GAAG,6BAA6B;AAE5D;;;AAGG;AACH,MAAM,aAAa,GAA2B;AAC5C,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,EAAE,EAAE,GAAG;AACP,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,GAAG,EAAE,EAAE;AACP,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,MAAM,EAAE,GAAG;AACX,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,GAAG,EAAE,GAAG;AACR,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,KAAK,EAAE,GAAG;AACV,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,IAAI,EAAE,GAAG;AACT,IAAA,KAAK,EAAE,GAAG;CACX;AAED;AACA,MAAM,kBAAkB,GAAG,GAAG;AAE9B,MAAM,cAAc,GAAG,QAAQ;AAE/B,MAAM,kBAAkB,GAAG,CAAC,KAAa,KACvC,KAAK,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,KAAK,EAAE,MAAc,KAAI;AAC3D,IAAA,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAC1B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;AACpD,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,GAAG,EAAE,CAAC;;AAG7F,QAAA,OAAO,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,IAAI,SAAS,IAAI;AAClE,cAAE,MAAM,CAAC,aAAa,CAAC,SAAS;cAC9B,KAAK;IACX;AAEA,IAAA,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,KAAK;AAC9E,CAAC,CAAC;AAEJ;;;AAGG;AACH,MAAM,WAAW,GAAG,CAAC,IAAY,KAC/B,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;AAErF,MAAM,QAAQ,GAAG,CAAC,KAAa,KAC7B,KAAK,CAAC,MAAM,IAAI,kBAAkB,GAAG,KAAK,GAAG,CAAA,EAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG;AAErG,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,KAAa,KAAI;AACjE,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;AAExC,IAAA,OAAO,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI;AAChD,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,IAAY,KAAI;IACtC,MAAM,KAAK,GAAa,EAAE;IAE1B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE;QACzD,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AAExC,QAAA,IAAI,IAAI;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,OAAO,KAAK;AACd,CAAC;AAED;;;;;AAKG;AACI,MAAM,kBAAkB,GAAG,CAAC,KAAc,KAC/C,OAAO,KAAK,KAAK,QAAQ,KAAK,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC;AAErG;;;;;;AAMG;AACI,MAAM,gBAAgB,GAAG,CAAC,IAAa,KAAmB;IAC/D,IAAI,kBAAkB,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;IAEzC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,IAAI,MAAM,IAAI,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;QACzF,OAAO,IAAI,CAAC,IAAI;IAClB;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;;;;;;;;;;AAWG;AACI,MAAM,uBAAuB,GAAG,CAAC,IAAY,KAAmB;AACrE,IAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;AACzF,IAAA,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,QAAQ;AAE9D,IAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACvG,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,QAAQ,CAAC,IAAI,IAAI;AAE7E,IAAA,IAAI,QAAQ,IAAI,MAAM,EAAE;;AAEtB,QAAA,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,IAAI;QAEvD,OAAO,QAAQ,CAAC,CAAA,EAAG,QAAQ,CAAA,EAAG,SAAS,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC;IACrD;IAEA,MAAM,OAAO,GAAG,QAAQ,IAAI,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC;AAEvD,IAAA,OAAO,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI;AAC3C;;ACzKA;;;;;;AAMG;AACI,MAAM,oBAAoB,GAAqB,CAAC,MAAM,KAAI;AAC/D,IAAA,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC;AAErC,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,IAAI;AAEtB,IAAA,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC;IAE7C,OAAO,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE;AACjC;AAEA;;;;AAIG;AACI,MAAM,uBAAuB,GAAqB,CAAC,MAAM,KAAI;IAClE,IAAI,qBAAqB,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC;IAC7D,IAAI,+BAA+B,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,OAAO,CAAC;IAC3G,IAAI,kBAAkB,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC;AAE3E,IAAA,OAAO,IAAI;AACb;;AChBO,MAAM,kBAAkB,GAAG,CAChC,OAAsD,KAC1B;IAC5B,MAAM,iBAAiB,GACrB,OAAO,YAAY,iBAAiB,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAI,OAAqC;AACnH,IAAA,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,iBAAiB;AAC/C,IAAA,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,GAAG,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC;IACrE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK;;;;AAKhD,IAAA,IAAI,MAAM,KAAK,CAAC,EAAE;QAChB,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD;;AAGA,IAAA,IAAI,UAAU,GAAG,CAAC,EAAE;AAClB,QAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;IACzB;;AAGA,IAAA,IAAI,EAAE,KAAK,YAAY,iBAAiB,CAAC,EAAE;AACzC,QAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;IACzB;;AAGA,IAAA,IAAI,MAAM,IAAI,GAAG,EAAE;;AAEjB,QAAA,IAAI,kCAAkC,CAAC,MAAM,CAAC,EAAE;AAC9C,YAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;QACzB;QAEA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD;;IAGA,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE;QACpC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD;;AAGA,IAAA,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,QAAA,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;QAE7E,IAAI,UAAU,EAAE;YACd,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI;YAEzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,iBAAiB,GAAG,KAAK,EAAE;QAChF;QAEA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD;AAEA,IAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;AACzB;;AC3BA,MAAMD,MAAI,GAAG,MAAM,SAAS;AAE5B;AACA,MAAM,YAAY,GAAqB,EAAE,QAAQ,kBAAkB,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,OAAO,EAAEA,MAAI,EAAE;AAC7G,MAAM,WAAW,mBAAmB,MAAM,CAAoC,EAAE,CAAC,CAAC,UAAU,EAAE;AAEvF,MAAM,yBAAyB,GAAG,CAAC,SAAiB,KAAyB;AAClF,IAAA,MAAM,KAAK,GAAG,OAAO,SAAS,KAAK,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC,KAAK;AAE5E,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE;AAE3F,IAAA,MAAM,WAAW,GAAG,IAAI,GAAG,EAA8C;AACzE,IAAA,MAAM,SAAS,GAAG,MAAM,CAAoC,EAAE;kFAAC;;;IAI/D,MAAM,gBAAgB,GAAG,MAAK;QAC5B,MAAM,MAAM,GAAsC,EAAE;AAEpD,QAAA,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;AACpC,YAAA,IAAI,UAAU,CAAC,QAAQ,EAAE,EAAE;AACzB,gBAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,QAAQ;YACnC;iBAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;AAClC,gBAAA,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,SAAS;YACpC;QACF;AAEA,QAAA,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,IAAA,CAAC;AAED,IAAA,MAAM,IAAI,GAAG,CAAC,GAAW,KAAsB;AAC7C,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK;qFAAC;AAC9B,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE;AAC7C,QAAA,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE;QAE3D,IAAI,eAAe,GAAwB,IAAI;QAC/C,IAAI,UAAU,GAAG,KAAK;AAEtB,QAAA,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC;AAC3B,QAAA,gBAAgB,EAAE;QAElB,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,IAAI,UAAU;gBAAE;YAEhB,UAAU,GAAG,IAAI;AACjB,YAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACnB,YAAA,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;AAC9B,YAAA,gBAAgB,EAAE;;;;YAKlB,IAAI,eAAe,EAAE;AACnB,gBAAA,eAAe,EAAE;YACnB;iBAAO;gBACL,eAAe,CAAC,KAAK,EAAE;YACzB;AACF,QAAA,CAAC;QAED;AACG,aAAA,OAAO,CAAC,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,EAAE,EAAE,MAAK;;;AAGvE,YAAA,IAAI,UAAU;AAAE,gBAAA,OAAO,OAAO,CAAC,OAAO,EAAE;AAExC,YAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AAClB,YAAA,gBAAgB,EAAE;AAElB,YAAA,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,KAAI;gBACnC,eAAe,GAAG,OAAO;AAC3B,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;aACA,KAAK,CAAC,MAAK;;;;AAIV,YAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;AACrB,QAAA,CAAC,CAAC;QAEJ,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE;AACnD,IAAA,CAAC;AAED,IAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE,EAAE;AACvE;;ACxFO,MAAM,qBAAqB,GAAG,CAAC,OAAqC,KAAqB;IAC9F,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,OAAO;AAE9D,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI;AAClD,IAAA,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,IAAI;;;AAI1D,IAAA,MAAM,sBAAsB,GAC1B,CAAC,MAAM,CAAC,aAAa,IAAI,IAAI,KAAK,aAAa,IAAI,SAAS,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW;AAErG,IAAA,MAAM,cAAc,GAAG,OAAO,iBAAiB,KAAK,QAAQ,GAAG,iBAAiB,CAAC,MAAM,GAAG,IAAI;AAE9F,IAAA,MAAM,SAAS,GAAG,CAAC,KAA2B,KAAI;QAChD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,IAAI,CAAC,KAAK,CAAC,qBAAqB;YAAE;AAEtE,QAAA,IAAI,KAAK,CAAC,QAAQ,EAAE;AAClB,YAAA,IAAI,CAAC,aAAa;gBAAE;YAEpB,SAAS,CAAC,IAAI,CAAC;AACb,gBAAA,IAAI,EAAE,UAAU;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;AACd,gBAAA,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE;AAC9B,gBAAA,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE;AACrC,aAAA,CAAC;YAEF;QACF;;;QAIA,IAAI,CAAC,iBAAiB,IAAI,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE;QAElE,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;AAC5F,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAG,CAAC,OAAyB,KAAI;AAC1C,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE;AAC/B,YAAA,IAAI,CAAC,aAAa;gBAAE;YAEpB,UAAU,CAAC,qBAAqB,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;YAExG;QACF;;;AAIA,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,EAAE;AACjC,YAAA,UAAU,CAAC,YAAY,CAAC,6BAA6B,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,EAAE;AAC3E,gBAAA,IAAI,EAAE,cAAc;gBACpB,GAAG,EAAE,OAAO,CAAC,GAAG;AAChB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA,CAAC;YAEF;QACF;AAEA,QAAA,IAAI,CAAC,iBAAiB;YAAE;AAExB,QAAA,MAAM,QAAQ,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;QAE7D,UAAU,CAAC,YAAY,CAAC,cAAc,GAAG,CAAC,OAAO,KAAK,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,SAAS,EAAE;AACnG,YAAA,IAAI,EAAE,UAAU;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;AAChB,YAAA,QAAQ,EAAE,IAAI;AACf,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,gBAAgB,GAAG,CAAC,GAAkB,KAAK,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;IAE5F,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC;IACjE,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;IAExC,MAAM,OAAO,GAAG,MAAK;AACnB,QAAA,QAAQ,EAAE;QACV,iBAAiB,CAAC,WAAW,EAAE;QAC/B,SAAS,CAAC,OAAO,EAAE;AACrB,IAAA,CAAC;IAED,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE;AAC3E;;ACxHA;;;;;;;;;;;;AAYG;AACI,MAAM,2BAA2B,GAAG;MA2C9B,oBAAoB,GAAG,CAAC,OAAyB,MAAyB;AACrF,IAAA,GAAG,OAAO;AACV,IAAA,CAAC,EAAE,2BAA2B;AAC/B,CAAA;AAED;;;;AAIG;AACI,MAAM,sBAAsB,GAAG,CAAC,IAAa,KAA6B;AAC/E,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;AAAE,QAAA,OAAO,IAAI;IAE1D,MAAM,GAAG,GAAG,IAA+B;AAE3C,IAAA,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,2BAA2B;AAAE,QAAA,OAAO,IAAI;AAEzD,IAAA,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;AACxB,IAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;AACtB,IAAA,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC;AAC5B,IAAA,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;AACtB,IAAA,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC;IAElC,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAClD,OAAO;AACL,YAAA,IAAI,EAAE,UAAU;YAChB,GAAG;AACH,YAAA,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC;AACjB,YAAA,SAAS,EAAE,OAAO,SAAS,KAAK,QAAQ,GAAG,SAAS,GAAG,IAAI;SAC5D;IACH;AAEA,IAAA,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE;QAChF,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAqB,EAAE,GAAG,EAAE;IACjE;AAEA,IAAA,IAAI,IAAI,KAAK,YAAY,KAAK,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,EAAE;AACtE,QAAA,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE;IACpC;AAEA,IAAA,OAAO,IAAI;AACb;;AC1EA,MAAMA,MAAI,GAAG,MAAM,SAAS;AAErB,MAAM,wBAAwB,GAAG,CAAC,WAAmB,KAAwB;AAClF,IAAA,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;QAC3C,OAAO,EAAE,IAAI,EAAEA,MAAI,EAAE,MAAM,EAAE,MAAMA,MAAI,EAAE,OAAO,EAAEA,MAAI,EAAE,WAAW,EAAE,KAAK,EAAE;IAC9E;AAEA,IAAA,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC;AACjD,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,EAA4B;;;AAIrD,IAAA,OAAO,CAAC,SAAS,GAAG,CAAC,KAA4B,KAAI;QACnD,MAAM,OAAO,GAAG,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC;AAElD,QAAA,IAAI,CAAC,OAAO;YAAE;AAEd,QAAA,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;YAChC,QAAQ,CAAC,OAAO,CAAC;QACnB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,IAAI,GAAG,CAAC,OAAyB,KAAI;AACzC,QAAA,IAAI;YACF,OAAO,CAAC,WAAW,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACpD;QAAE,OAAO,KAAK,EAAE;;;;YAId,IAAI,SAAS,EAAE,EAAE;gBACf,OAAO,CAAC,IAAI,CAAC,CAAA,mDAAA,EAAsD,WAAW,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;YAC5F;QACF;AACF,IAAA,CAAC;AAED,IAAA,MAAM,MAAM,GAAG,CAAC,QAAkC,KAAI;AACpD,QAAA,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;AAEvB,QAAA,OAAO,MAAK;AACV,YAAA,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;AAC5B,QAAA,CAAC;AACH,IAAA,CAAC;IAED,MAAM,OAAO,GAAG,MAAK;QACnB,SAAS,CAAC,KAAK,EAAE;QACjB,OAAO,CAAC,KAAK,EAAE;AACjB,IAAA,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE;AACrD;;ACzDO,MAAM,sBAAsB,GAAG;AACpC,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,kBAAkB,EAAE,oBAAoB;AACxC,IAAA,cAAc,EAAE,gBAAgB;AAChC,IAAA,aAAa,EAAE,eAAe;AAC9B,IAAA,kBAAkB,EAAE,oBAAoB;;AAuD1C,MAAM,yBAAyB,GAAG,CAAC,MAAoD,KAAI;IACzF,IAAI,MAAM,KAAK,KAAK;AAAE,QAAA,OAAO,IAAI;AACjC,IAAA,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,SAAS;AAAE,QAAA,OAAO,oBAAoB;AAExE,IAAA,OAAO,UAAU;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;AAuBG;MACU,gBAAgB,GAC3B,CAAC,MAAgC,KACjC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAI;;;AAGpD,IAAA,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;AAEtF,IAAA,MAAM,UAAU,GAAG,MAAM,IAAI,EAAE;IAC/B,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAE;IAE3E,MAAM,IAAI,GAAG,qBAAqB,CAAC;AACjC,QAAA,MAAM,EAAE,UAAU;QAClB,UAAU;AACV,QAAA,SAAS,EAAE,wBAAwB,CAAC,WAAW,CAAC;;;AAGhD,QAAA,WAAW,EAAE,yBAAyB,CAAC,CAAA,cAAA,EAAiB,WAAW,EAAE,CAAC;AACvE,KAAA,CAAC;AAEF,IAAA,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;IAElC,OAAO;QACL,IAAI,EAAE,sBAAsB,CAAC,cAAc;AAC3C,QAAA,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,MAAM;AACd,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;AACxC,YAAA,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE;AACtF,YAAA,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,UAAU,CAAC,aAAa,KAAK,KAAK,GAAG,IAAI,GAAG,KAAK,EAAE;AACrF,YAAA,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,yBAAyB,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE;AACjG,SAAA;KACF;AACH;AAEF;;;;;;;;;;;;;;;;;;;;;;AAsBG;MACU,oBAAoB,GAC/B,CAAC,MAA+B,KAChC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,KAAI;;;AAGpD,IAAA,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE;AAEnF,IAAA,MAAM,iBAAiB,GAAG,MAAM,IAAI,EAAE;IAEtC,MAAM,MAAM,GAAG,4BAA4B,CAAC;AAC1C,QAAA,MAAM,EAAE,iBAAiB;QACzB,UAAU;QACV,OAAO,EACL,CAAC,OAAO,iBAAiB,CAAC,OAAO,KAAK,UAAU,GAAG,iBAAiB,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,OAAO;AAC1G,YAAA,sCAAsC,CAAC;AACrC,gBAAA,WAAW,EAAE,iBAAiB,CAAC,WAAW,IAAI,CAAA,qBAAA,EAAwB,UAAU,CAAA,CAAE;aACnF,CAAC;AACL,KAAA,CAAC;;;;IAKF,MAAM,KAAK,GAAG,MAAM,KAAK,MAAM,CAAC,KAAK,EAAE;IACvC,MAAM,eAAe,GAAG,MAAK;AAC3B,QAAA,IAAI,QAAQ,CAAC,eAAe,KAAK,QAAQ;AAAE,YAAA,KAAK,EAAE;AACpD,IAAA,CAAC;AAED,IAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,eAAe,CAAC;AAC9D,IAAA,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,KAAK,CAAC;AAE1C,IAAA,UAAU,CAAC,SAAS,CAAC,MAAK;AACxB,QAAA,QAAQ,CAAC,mBAAmB,CAAC,kBAAkB,EAAE,eAAe,CAAC;AACjE,QAAA,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC;QAC7C,MAAM,CAAC,OAAO,EAAE;AAClB,IAAA,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,sBAAsB,CAAC,WAAW;AACxC,QAAA,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,MAAM;AACd,YAAA,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,CAAC,WAAW,IAAI,CAAA,qBAAA,EAAwB,UAAU,EAAE,EAAE;AAChG,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC,OAAO,IAAI,CAAC,CAAC,EAAE;AACnE,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,CAAC,iBAAiB,CAAC,MAAM,IAAI,UAAU,CAAC,EAAE;AAChG,YAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,iBAAiB,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE;AAC3E,YAAA,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,2BAA2B,CAAC,iBAAiB,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE;YAClG,IAAI,iBAAiB,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC;AAC7E,YAAA,GAAG,qBAAqB,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC;AAC7D,SAAA;KACF;AACH;AAEF;;;;;;;;;;;;;;AAcG;MACU,oBAAoB,GAAG,MAA4B,MAAK;IACnE,wBAAwB,CAAC,oBAAoB,CAAC;IAE9C,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC5E;AAEA;;;;;;;;;;;;AAYG;MACU,iBAAiB,GAAG,MAA4B,MAAK;IAChE,wBAAwB,CAAC,uBAAuB,CAAC;IAEjD,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,EAAE;AACxE;AAEA;;;;;;;;;;;;;;;AAeG;MACU,gBAAgB,GAAG,MAA4B,MAAK;IAC/D,sBAAsB,CAAC,kBAAkB,CAAC;IAE1C,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE;AACvE;AAEA;;;;;;;;;;;;;;AAcG;MACU,oBAAoB,GAAG,MAA4B,MAAK;IACnE,wBAAwB,CAAC,oBAAoB,CAAC;IAC9C,wBAAwB,CAAC,uBAAuB,CAAC;IACjD,sBAAsB,CAAC,kBAAkB,CAAC;IAE1C,OAAO,EAAE,IAAI,EAAE,sBAAsB,CAAC,kBAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE;AAC5E;;ACwHA,MAAM,YAAY,GAAG,MAAM,QAAQ,EAAE;AAErC;AACO,MAAM,uBAAuB,GAAG;AAEvC;;;;AAIG;AACI,MAAM,kBAAkB,GAAG;AAE3B,MAAM,qBAAqB,GAAG,CAAC,MAAmC,KAAqB;AAC5F,IAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoC;AACzD,IAAA,MAAM,aAAa,GAAG,IAAI,OAAO,EAAwB;;;AAIzD,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,CAAC;qFAAC;AAC9B,IAAA,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEhE,IAAA,MAAM,oBAAoB,GAAG,CAAC,cAAqD,EAAE,WAAoB,KAAI;AAC3G,QAAA,IAAI,MAAM,CAAC,gBAAgB,KAAK,KAAK,IAAI,CAAC,WAAW;AAAE,YAAA,OAAO,CAAC;AAE/D,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,aAAa,IAAI,MAAM,CAAC,aAAa,IAAI,uBAAuB,CAAC;AACtG,IAAA,CAAC;AAED,IAAA,MAAM,OAAO,GAAG,CAA0B,OAA6C,KAAI;QACzF,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,GAAG,OAAO;QACzD,MAAM,WAAW,GACf,cAAc,EAAE,MAAM,EAAE,uBAAuB,KAAK;AAClD,cAAE;AACF,cAAE,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,cAAc,EAAE,MAAM,EAAE,uBAAuB,KAAK,IAAI;AAElG,QAAA,MAAM,aAAa,GAAG,WAAW,KAAK,OAAO,CAAC,aAAa,IAAI,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAEhG,QAAA,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG;AAAE,YAAA,MAAM,kCAAkC,CAAC,OAAO,CAAC,GAAG,CAAC;;;AAItF,QAAA,IAAI,CAAC,WAAW,IAAI,eAAe,EAAE,UAAU,IAAI,CAAC,OAAO,CAAC,iCAAiC,EAAE;YAC7F,MAAM,oCAAoC,EAAE;QAC9C;QAEA,MAAM,KAAK,GAAG,UAAU,CAAC;YACvB,IAAI,EAAE,MAAM,CAAC,OAAO;YACpB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,UAAU,EAAE,IAAI,EAAE,UAAU;YAC5B,WAAW,EAAE,IAAI,EAAE,WAAW;YAC9B,gBAAgB,EAAE,MAAM,CAAC,WAAW;AACrC,SAAA,CAAC;QAEF,MAAM,QAAQ,GAAG;cACb,kBAAkB,CAAC,CAAA,EAAG,OAAO,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAA,EAAG,KAAK,CAAA,CAAE,EAAE;gBACpE,IAAI,EAAE,IAAI,EAAE,IAAI;gBAChB,WAAW,EAAE,IAAI,EAAE,WAAW;gBAC9B,UAAU,EAAE,IAAI,EAAE,UAAU;gBAC5B,OAAO,EAAE,IAAI,EAAE,OAAO;aACvB;cACD,KAAK;AAET,QAAA,MAAM,WAAW,GAAG,QAAQ,IAAI,YAAY,EAAE;QAC9C,MAAM,aAAa,GAAG,oBAAoB,CAAC,cAAc,EAAE,WAAW,CAAC;AACvE,QAAA,MAAM,qBAAqB,GAAG,cAAc,EAAE,YAAY,KAAK,KAAK;AACpE,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,KAAK;;;;AAK1C,QAAA,MAAM,gBAAgB,GACpB,cAAc,EAAE,WAAW,KAAK,IAAI,KAAK,cAAc,EAAE,WAAW,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC;AAE9F,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW;AAEvC,QAAA,IAAI,QAAQ,KAAK,WAAW,IAAI,WAAW,EAAE;AAC3C,YAAA,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,kBAAkB,CAAC;QACjD;AAEA,QAAA,IAAI,WAAW,IAAI,QAAQ,EAAE;YAC3B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;YAEtC,IAAI,UAAU,EAAE;;;gBAGd,cAAc,CAAC,UAAU,CAAC;AAE1B,gBAAA,IAAI,CAAC;AACH,oBAAA,GAAG,EAAE,QAAQ;oBACb,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;oBAC9C,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,QAAQ;AACR,oBAAA,QAAQ,EAAE,IAAI;oBACd,aAAa;oBACb,qBAAqB;oBACrB,gBAAgB;oBAChB,aAAa;AACd,iBAAA,CAAC;AAEF,gBAAA,MAAM,QAAQ,GACZ,CAAC,eAAe,EAAE,UAAU,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO;AACxD,sBAAE,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE;sBACtE,KAAK;AAEX,gBAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,OAA6B,EAAE,QAAQ,EAAE;YACvF;QACF;QAEA,MAAM,OAAO,GAAG,iBAAiB,CAAQ;AACvC,YAAA,QAAQ,EAAE,KAAK;YACf,IAAI;YACJ,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,MAAM,CAAC,YAAY;AACjC,YAAA,aAAa,EAAE,cAAc;YAC7B,UAAU,EAAE,MAAM,CAAC,IAAI;YACvB,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,YAAY,EAAE,MAAM,CAAC,YAAY;AACjC,YAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;AAC3C,SAAA,CAAC;AAEF,QAAA,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE;AAElC,QAAA,IAAI,CAAC;AACH,YAAA,GAAG,EAAE,WAAW;YAChB,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,OAAO;YACP,QAAQ;AACR,YAAA,QAAQ,EAAE,WAAW;YACrB,aAAa;YACb,qBAAqB;YACrB,gBAAgB;YAChB,aAAa;AACd,SAAA,CAAC;;;;AAKF,QAAA,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,gBAAgB,EAAE,CAAC;QAExG,OAAO,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE;AAChD,IAAA,CAAC;;IAGD,MAAM,YAAY,GAAG,CACnB,GAAa,EACb,UAAkC,EAClC,KAAyC,KACvC;QACF,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,OAAO;AAE1C,QAAA,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC;AACnC,QAAA,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE;AAC5B,QAAA,UAAU,CAAC,iBAAiB,EAAE,WAAW,EAAE;AAC3C,QAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC;QAEjB,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACzG,IAAA,CAAC;AAED,IAAA,MAAM,cAAc,GAAG,CAAC,UAAkC,KAAI;AAC5D,QAAA,IAAI,UAAU,CAAC,UAAU,KAAK,SAAS;YAAE;AAEzC,QAAA,YAAY,CAAC,UAAU,CAAC,UAAU,CAAC;AACnC,QAAA,UAAU,CAAC,UAAU,GAAG,SAAS;AACjC,QAAA,UAAU,CAAC,WAAW,GAAG,SAAS;AACpC,IAAA,CAAC;;IAGD,MAAM,uBAAuB,GAAG,MAAK;AACnC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,CAAC;AAE5F,QAAA,IAAI,MAAM,CAAC,MAAM,IAAI,kBAAkB;YAAE;AAEzC,QAAA,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QAE1E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,kBAAkB,CAAC,EAAE;AAC9E,YAAA,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,YAAY,CAAC;QACxC;AACF,IAAA,CAAC;AAED,IAAA,MAAM,MAAM,GAAG,CAAC,GAAa,EAAE,UAAkC,KAAI;AACnE,QAAA,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE;AACnC,QAAA,UAAU,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC;AAEzF,QAAA,uBAAuB,EAAE;AAC3B,IAAA,CAAC;AAED,IAAA,MAAM,MAAM,GAAG,CAAC,GAAoB,EAAE,kBAA8B,KAAI;QACtE,IAAI,GAAG,KAAK,IAAI;AAAE,YAAA,OAAO,KAAK;QAE9B,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAEjC,QAAA,IAAI,CAAC,UAAU;AAAE,YAAA,OAAO,KAAK;AAE7B,QAAA,UAAU,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC;QAE/C,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE;;;AAGnC,YAAA,IAAI,UAAU,CAAC,aAAa,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;AAC1E,gBAAA,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC;YACzB;iBAAO;AACL,gBAAA,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;YACzC;QACF;AAEA,QAAA,gBAAgB,EAAE;AAElB,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IAED,MAAM,eAAe,GAAG,MAAK;AAC3B,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE;YAC/C,IAAI,CAAC,UAAU,CAAC,QAAQ;gBAAE;;;AAI1B,YAAA,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE;AAC5B,YAAA,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE,QAAQ,CAAC;QACzC;AAEA,QAAA,gBAAgB,EAAE;QAClB,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;AACnD,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CAAC,MAAuC,EAAE,KAAyB,KAAI;QAC1F,MAAM,SAAS,GAA6B,EAAE;QAE9C,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE;AACvC,YAAA,IAAI,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;gBAAE;;;;;YAMrC,IAAI,CAAC,UAAU,CAAC,aAAa;gBAAE;YAE/B,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE;AAE3C,YAAA,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAClC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC7C;QAEA,aAAa,CAAC,IAAI,CAAC;AACjB,YAAA,IAAI,EAAE,mBAAmB;AACzB,YAAA,KAAK,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;AAC/D,YAAA,QAAQ,EAAE,SAAS;AACpB,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,qBAAqB,GAAG,CAAC,OAAqC,KAAI;QACtE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AAEzC,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,qBAAqB;AAAE,YAAA,OAAO,KAAK;AAElE,QAAA,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE;AAAE,YAAA,OAAO,KAAK;QAE9C,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAErG,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAED,IAAA,MAAM,sBAAsB,GAAG,CAAC,OAAsC,KAAI;QACxE,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC;AAEzC,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,gBAAgB;AAAE,YAAA,OAAO,KAAK;;;AAI7D,QAAA,IAAI,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,IAAI;AAAE,YAAA,OAAO,KAAK;QAExD,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,sBAAsB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,CAAC;AAEtG,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAED,IAAA,MAAM,IAAI,GAAG,CAAC,OAAyB,KAAI;QACzC,MAAM,EACJ,GAAG,EACH,kBAAkB,EAClB,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,GAAG,OAAO;AAEX,QAAA,MAAM,eAAe,GAAG,kBAAkB,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;QAE3F,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAEjC,QAAA,IAAI,UAAU,IAAI,QAAQ,EAAE;YAC1B,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC;QAC/D;aAAO;AACL,YAAA,MAAM,SAAS,GAA4C,IAAI,GAAG,CAAC,EAAE,CAAC;AAEtE,YAAA,SAAS,CAAC,GAAG,CAAC,kBAAkB,EAAE,eAAe,CAAC;;;;YAKlD,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,KAAI;AAC5D,gBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE;oBAC1B,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,YAAY,iBAAiB,EAAE;wBAChD,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;oBAC/F;gBACF;qBAAO,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,CAAC,QAAQ,EAAE;oBAChD,aAAa,CAAC,IAAI,CAAC;AACjB,wBAAA,IAAI,EAAE,iBAAiB;wBACvB,GAAG;wBACH,QAAQ;wBACR,OAAO;wBACP,QAAQ;wBACR,qBAAqB;wBACrB,gBAAgB;AACjB,qBAAA,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE;gBACb,SAAS;gBACT,OAAO;gBACP,QAAQ;gBACR,iBAAiB;gBACjB,aAAa;gBACb,QAAQ;gBACR,aAAa;gBACb,qBAAqB;gBACrB,gBAAgB;AACjB,aAAA,CAAC;QACJ;AAEA,QAAA,gBAAgB,EAAE;AACpB,IAAA,CAAC;IAED,MAAM,YAAY,GAAG,MACnB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM;QACjD,GAAG;QACH,QAAQ,EAAE,KAAK,CAAC,QAAQ;AACxB,QAAA,aAAa,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI;AACnC,QAAA,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC;QACpC,OAAO,EAAE,KAAK,CAAC,OAAO;AACvB,KAAA,CAAC,CAAC;IAEL,MAAM,KAAK,GAAG,CAAC,GAAa,EAAE,KAAA,GAA8B,QAAQ,KAAI;QACtE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;AAE5B,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC;AAC/B,QAAA,gBAAgB,EAAE;AACpB,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAoB;QAClC,OAAO;QACP,MAAM;QACN,eAAe;QACf,YAAY;QACZ,qBAAqB;QACrB,sBAAsB;AACtB,QAAA,OAAO,EAAE,aAAa,CAAC,YAAY,EAAE;AACrC,QAAA,MAAM,EAAE;YACN,YAAY;AACZ,YAAA,YAAY,EAAE,YAAY,CAAC,UAAU,EAAE;YACvC,KAAK;AACN,SAAA;KACF;AAED,IAAA,OAAO,UAAU;AACnB;;ACljBO,MAAM,iBAAiB,GAAG,CAAC,OAAuC,KACvE,kBAAkB,CAChB,MAAK;AACH,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACrC,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,CAAC;AAC3C,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAExD,MAAM,UAAU,GAAG,qBAAqB,CAAC;AACvC,QAAA,GAAG,OAAO;;;AAGV,QAAA,gBAAgB,EAAE,SAAS;AAC3B,QAAA,YAAY,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE;AACvD,KAAA,CAAC;AAEF,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAErC,IAAI,IAAI,GAA2B,IAAI;IACvC,IAAI,iBAAiB,GAAkC,IAAI;IAC3D,MAAM,eAAe,GAAyB,EAAE;AAEhD,IAAA,IAAI,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE;AAC5B,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAA0B;AAE9C,QAAA,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE;AACxC,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAE1F,YAAA,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AAAE,gBAAA,MAAM,mCAAmC,CAAC,OAAO,CAAC,IAAI,CAAC;AACnF,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AACtB,YAAA,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;YAE7B,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAsB,CAAC,cAAc,EAAE;AAC1D,gBAAA,IAAI,GAAI,OAA0C,CAAC,QAAQ;YAC7D;iBAAO,IAAI,OAAO,CAAC,IAAI,KAAK,sBAAsB,CAAC,WAAW,EAAE;AAC9D,gBAAA,iBAAiB,GAAI,OAAyC,CAAC,QAAQ;YACzE;QACF;IACF;AAEA,IAAA,MAAM,MAAM,GAAgB;QAC1B,UAAU;QACV,OAAO,EAAE,OAAO,CAAC,OAAO;AACxB,QAAA,mBAAmB,EAAE,MAAM,UAAU,CAAC,YAAY,EAAE;AACpD,QAAA,iBAAiB,EAAE,CAAC,YAAY,KAAI;YAClC,MAAM,GAAG,GAAG,YAAY,EAAE,GAAG,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI;AAEhG,YAAA,UAAU,CAAC,YAAY,CAAC,6BAA6B,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,EAAE;AAC5F,gBAAA,IAAI,EAAE,cAAc;gBACpB,GAAG;AACH,gBAAA,QAAQ,EAAE,KAAK;AAChB,aAAA,CAAC;;;AAIF,YAAA,IAAI,YAAY,EAAE,SAAS,IAAI,IAAI;AAAE,gBAAA,IAAI,EAAE,gBAAgB,CAAC,GAAG,CAAC;QAClE,CAAC;AACD,QAAA,qBAAqB,EAAE,MAAM,iBAAiB,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE;QAC5E,oBAAoB,EAAE,iBAAiB,EAAE,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE;AACvE,QAAA,MAAM,EAAE;YACN,IAAI;AACJ,YAAA,WAAW,EAAE,iBAAiB;AAC9B,YAAA,gBAAgB,EAAE,sBAAsB,EAAE,GAAG,6BAA6B,CAAC,eAAe,CAAC,GAAG,EAAE;AACjG,SAAA;KACF;AAED,IAAA,OAAO,MAAM;AACf,CAAC,EACD;AACE,IAAA,IAAI,EAAE,CAAA,YAAA,EAAe,OAAO,CAAC,IAAI,CAAA,CAAE;AACpC,CAAA;;AC9RL,MAAM,WAAW,GAAG,eAAe;AAoB5B,MAAM,0BAA0B,GAAG,CACxC,OAA2C,KACZ;AAC/B,IAAA,MAAM,YAAY,GAAG,sBAAsB,EAAE;AAC7C,IAAA,MAAM,eAAe,GAAG,8BAA8B,EAAE;AAExD,IAAA,IAAI,qBAAqB,GAAG,YAAY,CAAC,KAAK;AAC9C,IAAA,IAAI,wBAAwB,GAAG,YAAY,CAAC,KAAK;AACjD,IAAA,IAAI,qBAAqB,GAAG,YAAY,CAAC,KAAK;AAC9C,IAAA,IAAI,0BAA0B,GAAG,YAAY,CAAC,KAAK;IAEnD,IAAI,WAAW,GAAG,KAAK;AACvB,IAAA,IAAI,eAAoD;IAExD,MAAM,KAAK,GAAG,MAAK;QACjB,qBAAqB,CAAC,WAAW,EAAE;AACnC,QAAA,qBAAqB,GAAG,YAAY,CAAC,KAAK;QAC1C,wBAAwB,CAAC,WAAW,EAAE;AACtC,QAAA,wBAAwB,GAAG,YAAY,CAAC,KAAK;QAC7C,qBAAqB,CAAC,WAAW,EAAE;AACnC,QAAA,qBAAqB,GAAG,YAAY,CAAC,KAAK;QAC1C,0BAA0B,CAAC,WAAW,EAAE;AACxC,QAAA,0BAA0B,GAAG,YAAY,CAAC,KAAK;AAC/C,QAAA,iBAAiB,CAAC;YAChB,YAAY;AACZ,YAAA,cAAc,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE;AAC7D,SAAA,CAAC;AACJ,IAAA,CAAC;;;;;;;;;;AAWD,IAAA,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC;SAC5B,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,KAAK,mBAAmB,CAAC,EACrD,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;SAE5C,SAAS,CAAC,MAAK;AACd,QAAA,MAAM,aAAa,GAAG,WAAW,IAAI,OAAO,CAAC,YAAY;QACzD,MAAM,WAAW,GAAG,eAAe;AAEnC,QAAA,KAAK,EAAE;AAEP,QAAA,IAAI,CAAC,aAAa;YAAE;QAEpB,0BAA0B,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE;AAC1E,YAAA,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ;SAChC;aACE,IAAI,CACH,MAAM,CAAC,OAAO,CAAC,EACf,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,CAAC;AAE7B,aAAA,SAAS,EAAE;AAChB,IAAA,CAAC,CAAC;AAEJ,IAAA,MAAM,KAAK,GAAG,CAAC,KAAuB,KAAI;AACxC,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK;QAE3B,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;AAC9B,QAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,WAAqC,KAAI;AAC5D,QAAA,MAAM,IAAI,GAAG,WAAW,EAAE,IAAI;QAE9B,MAAM,cAAc,GAAG,MAAK;YAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE;YACtD,MAAM,WAAW,GAAG,OAAO,IAAI,EAAE,OAAO,KAAK,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,WAAW,EAAE;YAE7G,IAAI,CAAC,WAAW,EAAE;gBAChB,MAAM,mCAAmC,EAAE;YAC7C;YAEA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;gBACjC,OAAO,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,CAAA,OAAA,EAAU,WAAW,CAAA,CAAE,CAAC;YAC9D;AAEA,YAAA,OAAO,WAAW;AACpB,QAAA,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE;QACtD,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,mCAAmC,EAAE;QAC7C;AAEA,QAAA,MAAM,MAAM,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE;AACvF,QAAA,MAAM,OAAO,GAAG,cAAc,EAAE;QAEhC,OAAO,CAAC,oBAAoB,CAC1B;AACE,YAAA,GAAG,WAAW;AACd,YAAA,IAAI,EAAE;AACJ,gBAAA,IAAI,IAAI,IAAI,EAAE,CAAC;gBACf,OAAO,EAAE,cAAc;AACF,aAAA;AACxB,SAAA,EACD,MAAM,EACN,OAAO,EACP,YAAY,CACb;AACH,IAAA,CAAC;;;;;;;;AASD,IAAA,MAAM,yBAAyB,GAAG,CAAC,WAAqC,KAAI;AAC1E,QAAA,IAAI,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE;YACtC,WAAW,CAAC,WAAW,CAAC;YAExB;QACF;QAEA,qBAAqB,CAAC,WAAW,EAAE;QACnC,qBAAqB,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,EAAE;AACrE,YAAA,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ;SAChC;aACE,IAAI,CACH,MAAM,CAAC,OAAO,CAAC,EACf,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;AAEpC,aAAA,SAAS,EAAE;AAChB,IAAA,CAAC;AAED,IAAA,MAAM,IAAI,GAAG,CAAC,WAAqC,KAAI;QACrD,eAAe,CAAC,KAAK,EAAE;AAEvB,QAAA,MAAM,oBAAoB,GAA4B;YACpD,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;YAC/C,OAAO,EAAE,WAAW,EAAE,OAAO;SAC9B;QAED,WAAW,GAAG,IAAI;QAClB,eAAe,GAAG,oBAAoB;QAEtC,qBAAqB,CAAC,WAAW,EAAE;AACnC,QAAA,qBAAqB,GAAG,YAAY,CAAC,KAAK;QAC1C,wBAAwB,CAAC,WAAW,EAAE;AACtC,QAAA,wBAAwB,GAAG,YAAY,CAAC,KAAK;QAC7C,qBAAqB,CAAC,WAAW,EAAE;AACnC,QAAA,qBAAqB,GAAG,YAAY,CAAC,KAAK;QAC1C,0BAA0B,CAAC,WAAW,EAAE;AACxC,QAAA,0BAA0B,GAAG,YAAY,CAAC,KAAK;AAE/C,QAAA,wBAAwB,GAAG,OAAO,CAAC,YAAY,CAAC;AAC7C,aAAA,IAAI,CACH,MAAM,CAAC,MAAK;YACV,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE;AAC1C,YAAA,OAAO,YAAY,EAAE,IAAI,KAAK,GAAG;AACnC,QAAA,CAAC,CAAC,EACF,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,IAAI,CAAC,oBAAoB,CAAC,CAAC;AAEtC,aAAA,SAAS,EAAE;;;;QAKd,IAAI,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE,EAAE,IAAI,KAAK,WAAW,EAAE;YAC/D,yBAAyB,CAAC,oBAAoB,CAAC;YAE/C;QACF;QAEA,MAAM,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,mBAAmB,EAAE;AAC9D,QAAA,MAAM,SAAS,GAAG,WAAW,EAAE,QAAQ;;;QAIvC,MAAM,0BAA0B,GAAG,SAAS,EAAE,kBAAkB,EAAE,KAAK,IAAI;QAE3E,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,OAAO,EAAE,IAAI,0BAA0B,EAAE;YACnE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;YAEtE,MAAM,oBAAoB,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,mBAAmB,EAAE;AAClF,gBAAA,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ;aAChC,CAAC,CAAC,IAAI,CACL,SAAS,CAAC,CAAC,WAAW,KAAI;AACxB,gBAAA,IAAI,CAAC,WAAW;AAAE,oBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACjC,gBAAA,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ;gBAElC,OAAO,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAC1E,GAAG,CAAC,CAAC,OAAO,KAAI;AACd,oBAAA,IAAI,OAAO;wBAAE;AAEb,oBAAA,IAAI,KAAK,CAAC,KAAK,EAAE,EAAE;wBACjB,KAAK,CAAC,KAAK,CAAC;oBACd;AAAO,yBAAA,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE;wBAC3B,yBAAyB,CAAC,oBAAoB,CAAC;oBACjD;gBACF,CAAC,CAAC,CACH;YACH,CAAC,CAAC,CACH;;;;YAKD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC,cAAc,EAAE;AACnE,gBAAA,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,QAAQ;AAChC,aAAA,CAAC,CAAC,IAAI,CACL,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,EAAE,IAAI,KAAK,WAAW,CAAC,EAC9C,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,yBAAyB,CAAC,oBAAoB,CAAC,CAAC,CAC3D;YAED,qBAAqB,GAAG,KAAK,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC,SAAS,EAAE;QAC7E;AAAO,aAAA,IAAI,SAAS,CAAC,QAAQ,EAAE,EAAE;YAC/B,yBAAyB,CAAC,oBAAoB,CAAC;QACjD;AAAO,aAAA,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE;YAC5B,KAAK,CAAC,SAAS,CAAC;QAClB;aAAO;YACL,MAAM,sCAAsC,EAAE;QAChD;AACF,IAAA,CAAC;AAED,IAAA,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK;IACrB,IAAI,CAAC,sBAAsB,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,UAAU,EAAE;AAEpE,IAAA,OAAO,IAAI;AACb;;AC3PO,MAAM,qBAAqB,GAAG,CACnC,cAAsD,KACvB;IAC/B,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,MAAM,EAAE;AAE1E,IAAA,OAAO,0BAA0B,CAAC;QAChC,YAAY;QACZ,IAAI,EAAE,cAAc,CAAC,IAAI;QACzB,KAAK,EAAE,cAAc,CAAC,KAAK;AAC3B,QAAA,YAAY,EACV,sBAAsB,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,mBAAmB;QACnH,oBAAoB,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,KAAI;YACpE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,WAAW,IAAI,EAAE;AACjD,YAAA,MAAM,WAAW,GAAG,EAAE,IAAI,WAAW,EAAE,IAAI,IAAK,EAAyB,CAAC,EAAE,OAAO,EAAE;AAErF,YAAA,YAAY,CAAC;AACX,gBAAA,cAAc,EAAE,cAAc;gBAC9B,YAAY;AACZ,gBAAA,IAAI,EAAE,WAAW;AACjB,gBAAA,OAAO,EAAE,UAAU;AACnB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA,CAAC;QACJ,CAAC;AACF,KAAA,CAAC;AACJ;;AC7BO,MAAM,iBAAiB,GAAG,CAA0B,OAAwC,KACjG,eAAe,CAAC;IACd,OAAO,EAAE,OAAO,CAAC,OAAO;IACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;IAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;AAChC,IAAA,cAAc,EAAE,qBAAqB;AACtC,CAAA;;ACLI,MAAM,wBAAwB,GAAG,CACtC,OAA8C,EAC9C,SAAyD,KAEzD,sBAAsB,CAAC;IACrB,OAAO;IACP,SAAS;AACT,IAAA,YAAY,EAAE,iBAAiB;AAChC,CAAA;;ACAH,MAAM,mBAAmB,GAAG,CAAC,MAAmB,KAAI;AAClD,IAAA,OAAO,CAAC,MAAkC,KACxC,CAA0B,KAAuB,EAAE,GAAG,IAA+B,KACnF,kBAAkB,CAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,yBAAyB,GAAG,CAAC,MAAmB,KAAI;AACxD,IAAA,OAAO,CAAC,MAAkC,EAAE,YAA+C,KACzF,CAA0B,KAAuB,EAAE,GAAG,IAA+B,KACnF,wBAAwB,CAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACvF,CAAC;AAED;AACO,MAAM,cAAc,mBAAmB,mBAAmB,CAAC,KAAK;AAEvE;AACO,MAAM,oBAAoB,mBAAmB,yBAAyB,CAAC,KAAK;AAEnF;AACO,MAAM,eAAe,mBAAmB,mBAAmB,CAAC,MAAM;AAEzE;AACO,MAAM,qBAAqB,mBAAmB,yBAAyB,CAAC,MAAM;AAErF;AACO,MAAM,cAAc,mBAAmB,mBAAmB,CAAC,KAAK;AAEvE;AACO,MAAM,oBAAoB,mBAAmB,yBAAyB,CAAC,KAAK;AAEnF;AACO,MAAM,iBAAiB,mBAAmB,mBAAmB,CAAC,QAAQ;AAE7E;AACO,MAAM,uBAAuB,mBAAmB,yBAAyB,CAAC,QAAQ;AAEzF;AACO,MAAM,gBAAgB,mBAAmB,mBAAmB,CAAC,OAAO;AAE3E;AACO,MAAM,sBAAsB,mBAAmB,yBAAyB,CAAC,OAAO;;ACvDvF;;;;;;;;;;AAUG;AACI,MAAM,mBAAmB,GAAG,OACjC,KAAmB,EACnB,WAAqC,KACJ;AACjC,IAAA,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC;AAE1B,IAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,EAAE;IAEvC,MAAM,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;AAEzF,IAAA,OAAO,QAAQ;AACjB;;AC1BA;AAmHA,MAAM,mBAAmB,GAAG,OAAsB;AAChD,IAAA,MAAM,EAAE,MAAM,CAAsB,MAAM,CAAC;AAC3C,IAAA,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;AACtB,IAAA,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;AACtB,IAAA,KAAK,EAAE,MAAM,CAA4B,IAAI,CAAC;AAC9C,IAAA,QAAQ,EAAE,MAAM,CAAgB,IAAI,CAAC;AACrC,IAAA,SAAS,EAAE,MAAM,CAAqB,EAAE,CAAC;AACzC,IAAA,QAAQ,EAAE,MAAM,CAAY,EAAE,CAAC;AAC/B,IAAA,SAAS,EAAE,MAAM,CAAY,EAAE,CAAC;AACjC,CAAA,CAAC;AAUF,MAAM,aAAa,GAAG,CACpB,KAAqB,EACrB,KAAoB,EACpB,cAA4C,KACf;AAC7B,IAAA,MAAM,GAAG,GAAG,YAAqD;QAC/D,IAAI,KAAK,CAAC,OAAO,EAAE;YAAE,MAAM,2BAA2B,EAAE;AAExD,QAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC3B,QAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AACxB,QAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,QAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACvB,QAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,QAAA,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QAEvB,MAAM,SAAS,GAAuB,EAAE;QACxC,MAAM,QAAQ,GAAc,EAAE;QAC9B,MAAM,SAAS,GAAc,EAAE;QAC/B,IAAI,gBAAgB,GAAY,SAAS;AAEzC,QAAA,KAAK,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE;YACvC,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAE5B,YAAA,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,gBAAgB,EAAE,SAAS,CAAC;AAC9D,YAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;YACnB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;AACjC,YAAA,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC;AAEhE,YAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;AAEnC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE;YAE9B,IAAI,KAAK,EAAE;AACT,gBAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,gBAAA,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;AACtB,gBAAA,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AACrB,gBAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAExB,gBAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE;YACrD;AAEA,YAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE;AACpC,YAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxB,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;YACnC,gBAAgB,GAAG,QAAQ;QAC7B;AAEA,QAAA,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;AAC3B,QAAA,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QAExB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,SAAuB,EAAE,SAAS,EAAE;AACpE,IAAA,CAAC;AAED,IAAA,MAAM,QAAQ,GAA8B;QAC1C,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,KACnB,aAAa,CACX;AACE,YAAA,GAAG,KAAK;AACR,YAAA,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,gBAAgB,EAAE,SAAS,KAAK,OAAO,CAAC,gBAAuB,EAAE,SAAgB,CAAC,EAAE;SAC5G,EACD,KAAK,EACL,cAAc,CACR;AACV,QAAA,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE;AACjC,QAAA,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE;AACnC,QAAA,WAAW,EAAE,KAAK,CAAC,WAAW,CAAC,UAAU,EAAE;QAC3C,KAAK,EAAE,KAAK,CAAC,MAAM;AACnB,QAAA,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;AAClC,QAAA,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE;AAC/B,QAAA,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE;AACrC,QAAA,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE;AACvC,QAAA,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE;AACrC,QAAA,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,EAAiC;QACtE,GAAG;KACJ;AAED,IAAA,IAAI,cAAc;AAAE,QAAA,cAAc,CAAC,OAAO,GAAG,QAAQ;AAErD,IAAA,OAAO,QAAQ;AACjB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;AAqBG;MACU,aAAa,GAAG,CAC3B,KAAmB,EACnB,QAA4C,KACJ;IACxC,MAAM,cAAc,GAA4C,sBAAsB;AACpF,UAAE,EAAE,OAAO,EAAE,IAAqC;UAChD,SAAS;IAEb,MAAM,IAAI,GAAG,aAAa,CACxB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,EAAE,EAAE,CAAC,EAC1C,mBAAmB,EAAE,EACrB,cAAc,CACf;IAED,IAAI,cAAc,EAAE;QAClB,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC5C,YAAA,IAAI,EAAE,gBAAgB;AACtB,YAAA,MAAM,EAAE,cAAc;AACtB,YAAA,IAAI,EAAE,EAAE;AACT,SAAA,CAAC;;AAGF,QAAA,IAAI;YACF,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;QAC1C;AAAE,QAAA,MAAM;;QAER;IACF;AAEA,IAAA,OAAO,IAAI;AACb;;ACxQA;AACO,MAAM,2BAA2B,GAAG;AAE3C;AACO,MAAM,iBAAiB,GAAG;AAgBjC;;;;;AAKG;AACI,MAAM,qBAAqB,GAAG,CAAC,KAAc,KAAyB;AAC3E,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE;AAErB,IAAA,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,YAAY,iBAAiB,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK;AAErH,IAAA,IAAI,+BAA+B,CAAC,IAAI,CAAC,EAAE;QACzC,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA,IAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE;AAC5B,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,OAAO,EAAE;AACX;AA8BA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACI,MAAM,yBAAyB,GAAG,CACvC,OAAiD,KACN;IAC3C,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,GAAG,OAAO;AAEtE,IAAA,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,EAAE;AAEpD,IAAA,MAAM,UAAU,GAAG,qBAAqB,CAAC,KAAK,CAAC;AAE/C,IAAA,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE;;;QAGtB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE;AAEpD,QAAA,OAAO,oBAAoB,CAAC,KAAK,CAAC;IACpC;IAEA,MAAM,MAAM,GAA4C,EAAE;AAE1D,IAAA,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE;AAClC,QAAA,MAAM,OAAO,GAAG,SAAS,CAAC,YAAY;AACtC,QAAA,MAAM,IAAI,GAAG,OAAO,IAAI,WAAW,GAAG,WAAW,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,OAAO;AAC/E,QAAA,MAAM,iBAAiB,GAAG,IAAI,GAAG,oBAAoB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,IAAI;QAE7E,IAAI,iBAAiB,EAAE;AACrB,YAAA,MAAM,WAAW,GAAmC;AAClD,gBAAA,IAAI,EAAE,2BAA2B;gBACjC,OAAO,EAAE,SAAS,CAAC,OAAO;AAC1B,gBAAA,SAAS,EAAE,iBAAiB;gBAC5B,SAAS;aACV;AAED,YAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1B;aAAO,IAAI,mBAAmB,EAAE;AAC9B,YAAA,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC;YAElD,IAAI,WAAW,EAAE;AACf,gBAAA,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;YAC1B;QACF;aAAO;AACL,YAAA,MAAM,aAAa,GAAmC;AACpD,gBAAA,IAAI,EAAE,2BAA2B;gBACjC,OAAO,EAAE,SAAS,CAAC,OAAO;gBAC1B,SAAS;aACV;AAED,YAAA,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;QAC5B;IACF;AAEA,IAAA,OAAO,MAAM;AACf;AAEA,MAAM,oBAAoB,GAAG,CAAC,KAAc,KAA6B;AACvE,IAAA,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,wBAAwB,CAAC,KAAK,CAAC;AAExF,IAAA,IAAI,UAAU,CAAC,MAAM,EAAE;QACrB,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9F;AAEA,IAAA,OAAO,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;AACzE,CAAC;AAED;AACA,MAAM,iBAAiB,GAAG,CAAC,IAAY,KAAI;AACzC,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,yBAAyB,EAAE,KAAK;SACxC,KAAK,CAAC,GAAG;AACT,SAAA,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,oBAAoB,GAAG,CAC3B,SAA4B,EAC5B,IAAY,KACyB;IACrC,IAAI,OAAO,GAAY,SAAS;IAEhC,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE;AAC7C,QAAA,IAAI,OAAO,KAAK,IAAI,KAAK,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,UAAU,CAAC,EAAE;AACtF,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC;IACzD;;;AAIA,IAAA,OAAO,OAAO,OAAO,KAAK,UAAU,GAAI,OAAsC,GAAG,IAAI;AACvF,CAAC;;AC7KD;AACA;AACA;AACA;AACA;AAEA;AACO,MAAM,iCAAiC,GAAG,GAAG;AAEpD;;;;;;AAMG;AACI,MAAM,uBAAuB,GAAG,CACrC,KAAc,EACd,GAAoC,EACpC,aAA+G,KACvF;;;IAGxB,MAAM,KAAK,GAAG,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK;IAEvF,IAAI,aAAa,EAAE;QACjB,OAAO,aAAa,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;IACzD;;;;AAKA,IAAA,OAAO,yBAAyB,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAyC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC9G,CAAC;AAmBD;;;;;;AAMG;AACI,MAAM,wBAAwB,GAAG,CACtC,IAA8D,EAC9D,MAAqE,KACnE;IACF,aAAa,CAAsC,IAAI,EAAE;QACvD,MAAM,EAAE,MAAM,CAAC,MAAM;AACrB,QAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,iCAAiC;QAC9D,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,QAAA,SAAS,EAAE,MAAM,IAAI;AACrB,QAAA,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,uBAAuB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,aAAa,CAAC;AACnF,KAAA,CAAC;AACJ,CAAC;;ACjDD;;;;;;;;;;;;;;;;;;;;;;AAsBG;MACU,iBAAiB,GAAG,CAC/B,IAA8D,EAC9D,MAA4D,KAC1D;IAKF,wBAAwB,CAAsC,IAAI,EAAE;QAClE,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,aAAa,EAAE,MAAM,CAAC,aAAa;AACnC,QAAA,OAAO,EAAE,CAAC,MAAM,KAAI;;;;;AAKlB,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,kCAAkC,EAAE,IAAI,EAAE,CAAC;AAE/E,YAAA,OAAO,QAAQ,CAA2C;AACxD,gBAAA,MAAM,EAAE,MAAM,MAAM,EAAE;gBACtB,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,KAAI;AACxC,oBAAA,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,WAAsB,EAAE,CAAC;AACnF,oBAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE;;;oBAI9B,IAAI,KAAK,EAAE;AACT,wBAAA,MAAM,KAAK;oBACb;AAEA,oBAAA,OAAO,QAAQ,CAAC,QAAQ,EAAE,IAAI,SAAS;gBACzC,CAAC;AACF,aAAA,CAAkC;QACrC,CAAC;AACF,KAAA,CAAC;AACJ;;ACeO,MAAM,qBAAqB,GAAG;AACnC,IAAA,eAAe,EAAE,iBAAiB;AAClC,IAAA,wBAAwB,EAAE,0BAA0B;AACpD,IAAA,iBAAiB,EAAE,mBAAmB;AACtC,IAAA,gBAAgB,EAAE,kBAAkB;AACpC,IAAA,QAAQ,EAAE,UAAU;AACpB,IAAA,cAAc,EAAE,gBAAgB;;AAqTlC,MAAM,oBAAoB,GAAG,CAAC,QAAiB,KAA8B;AAC3E,IAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACvB,MAAM,kCAAkC,EAAE;IAC5C;AACA,IAAA,IAAI,EAAE,aAAa,IAAI,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,aAAa,CAAC,KAAK,QAAQ,EAAE;QAC/E,MAAM,2CAA2C,EAAE;IACrD;AACA,IAAA,IAAI,EAAE,cAAc,IAAI,QAAQ,CAAC,IAAI,OAAO,QAAQ,CAAC,cAAc,CAAC,KAAK,QAAQ,EAAE;QACjF,MAAM,4CAA4C,EAAE;IACtD;AACA,IAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,CAAC,aAAa,CAAC,EAAE,YAAY,EAAE,QAAQ,CAAC,cAAc,CAAC,EAAE;AACzF,CAAC;AAED,MAAM,wBAAwB,GAAG,CAAC,OAAwB,EAAE,WAA+B,KAAI;IAC7F,IAAI,WAAW,KAAK,iBAAiB;AAAE,QAAA,OAAO,WAAW;AACzD,IAAA,IAAI,OAAO,CAAC,KAAK,KAAK,mBAAmB;AAAE,QAAA,OAAO,cAAc;IAChE,IAAI,WAAW,KAAK,kBAAkB;AAAE,QAAA,OAAO,YAAY;IAC3D,OAAO,OAAO,CAAC,GAAG;AACpB,CAAC;AAeD,MAAM,wBAAwB,GAAG,CAC/B,QAAmB,EACnB,OAAmC,KACjC;AACF,IAAA,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,OAAO;IACrH,MAAM,OAAO,GAAG,EAA8B;AAC9C,IAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAmD;;;;IAKjF,IAAI,iBAAiB,GAAG,CAAC;IACzB,MAAM,iBAAiB,GAAsC,EAAE;AAE/D,IAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,QAAA,MAAM,aAAa,GAAG,MAAM,CAAkC,IAAI;0FAAC;QACnE,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC;QAE9C,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,aAAa,IAAI,oBAAoB;;;;AAK1E,QAAA,MAAM,eAAe,GAAG,MAAM,CAA4B,IAAI;4FAAC;AAE/D,QAAA,MAAM,gBAAgB,GAAG,MAAM,CAA0B,IAAI;6FAAC;AAC9D,QAAA,iBAAiB,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAExC,QAAA,MAAM,YAAY,GAAG,CAAC,SAA2B,KAAK,SAAS,CAAC,EAAE,KAAK,IAAI,IAAI,SAAS,CAAC,EAAE,KAAK,iBAAiB;;;QAIjH,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,SAAS,GAAG,gBAAgB,EAAE;AACpC,YAAA,IAAI,CAAC,SAAS;gBAAE;AAEhB,YAAA,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS;AAC9B,YAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE;AACpC,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE;AAClC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE;AAE9B,YAAA,IAAI,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE;AAC9D,gBAAA,IAAI;AACF,oBAAA,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC;AACtC,oBAAA,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;oBACzB,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,CAAC;gBACtD;gBAAE,OAAO,YAAY,EAAE;oBACrB,eAAe,CAAC,GAAG,CAAC,wBAAwB,CAAC,YAAY,CAAC,CAAC;oBAE3D,IAAI,SAAS,EAAE,EAAE;wBACf,OAAO,CAAC,KAAK,CAAC,CAAA,8BAAA,EAAiC,OAAO,CAAC,GAAG,CAAA,UAAA,CAAY,EAAE,YAAY,CAAC;oBACvF;gBACF;YACF;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,SAAS,GAAG,gBAAgB,EAAE;AACpC,YAAA,IAAI,CAAC,SAAS;gBAAE;AAEhB,YAAA,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,SAAS;AACpC,YAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE;AACpC,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE;AAClC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE;AAE9B,YAAA,IAAI,OAAO,IAAI,YAAY,CAAC,SAAS,CAAC;gBAAE;YAExC,IAAI,KAAK,EAAE;AACT,gBAAA,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACrD;iBAAO,IAAI,QAAQ,EAAE;AACnB,gBAAA,MAAM,gBAAgB,GAAG,eAAe,EAAE;gBAE1C,IAAI,gBAAgB,EAAE;AACpB,oBAAA,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;gBACvE;qBAAO;AACL,oBAAA,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;gBAC1D;YACF;;;AAIA,YAAA,IAAI,IAAI,KAAK,WAAW,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE;AACtF,gBAAA,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;YAChC;AACF,QAAA,CAAC,CAAC;;;;QAKF,IAAI,KAAK,GAA4B,IAAI;AAEzC,QAAA,MAAM,OAAO,GAAG,CAAC,IAA6B,EAAE,OAAkC,KAAI;AACpF,YAAA,KAAK,KAAK,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,mBAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAE9E,YAAA,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAChC,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,EAAE;YAEvC,MAAM,SAAS,GAAG,wBAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC;AACzE,YAAA,MAAM,YAAY,GAAG,SAAS,KAAK,YAAY;YAE/C,IAAI,CAAC,YAAY,EAAE;AACjB,gBAAA,mBAAmB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;AACvD,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE;AAC3B,oBAAA,sBAAsB,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC;gBAC5D;YACF;AACA,YAAA,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAEzD,YAAA,IAAI,SAAS,KAAK,WAAW,EAAE;AAC7B,gBAAA,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;YAChC;YAEA,gBAAgB,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,YAAY,GAAG,IAAI,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAClG,YAAA,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3B,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC;AAED,QAAA,OAAO,CAAC,OAAO,CAAC,GAAyC,CAAC,GAAG;YAC3D,OAAO;AACP,YAAA,QAAQ,EAAE,aAAa,CAAC,UAAU,EAAE;SACsC;IAC9E;AAEA,IAAA,MAAM,gCAAgC,GAAG,QAAQ,CAAC,MAChD,iBAAiB,CAAC,IAAI,CAAC,CAAC,SAAS,KAAI;AACnC,QAAA,MAAM,OAAO,GAAG,SAAS,EAAE;AAE3B,QAAA,OAAO,CAAC,CAAC,OAAO,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE;AACvE,IAAA,CAAC,CAAC;yGACH;AAED,IAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,gCAAgC,EAAE;AACtE,CAAC;AAED,MAAM,aAAa,GAAG,CAKpB,eAAsC,EACtC,OAAiE,KAC/D;IACF,MAAM,QAAQ,GAA4B,EAAE;;IAG5C,MAAM,OAAO,GAAyB,EAAE;AAExC,IAAA,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE;AAC5B,QAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;IAC9B;AAEA,IAAA,MAAM,YAAY,GAAG,IAAI,GAAG,EAAyB;AAErD,IAAA,KAAK,MAAM,YAAY,IAAI,eAAe,EAAE;AAC1C,QAAA,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CACQ;QAE5C,IAAI,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAClC,YAAA,MAAM,oCAAoC,CAAC,OAAO,CAAC,IAAI,CAAC;QAC1D;AAEA,QAAA,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9B,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC;AACzB,aAAA,WAAW;aACX,KAAK,CAAC,GAAG;AACT,aAAA,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAAM,KAAK,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;aACxF,IAAI,CAAC,EAAE,CAAC;AACX,QAAA,QAAQ,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,QAAQ;AACxC,QAAA,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;IAClE;AAEA,IAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;AAC9B,CAAC;AAED;;;AAGG;AACH,MAAM,mBAAmB,GAAG,CAAC,QAAoC,KAC/D,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,KAAI;IACvB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,gBAAwD;AAC7G,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,KAAK,mBAAmB;IAEvD,OAAO;QACL,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,IAAI,GAAG,SAAS,GAAG,eAAe,GAAG,MAAM,CAA6B;AACxE,QAAA,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,MAAM;QAClC,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,GAAG,SAAS;KACrD;AACH,CAAC,CAAC;AAEJ,MAAM,YAAY,GAAG,MAAM,IAAI;AAE/B,MAAM,oBAAoB,GAAG,CAC3B,eAA+C,EAC/C,OAA4C,KAC1C;IACF,IAAI,UAAU,GAAkB,YAAY;AAC5C,IAAA,IAAI,qBAAyE;AAC7E,IAAA,IAAI,mBAA8D;AAElE,IAAA,KAAK,MAAM,cAAc,IAAI,eAAe,IAAI,EAAE,EAAE;AAClD,QAAA,MAAM,UAAU,GAAI,cAA+C,CAAC,UAAU;AAE9E,QAAA,IAAI,CAAC,UAAU;YAAE;AAEjB,QAAA,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;AAElC,QAAA,UAAU,GAAG,MAAM,CAAC,QAAQ,IAAI,UAAU;AAC1C,QAAA,qBAAqB,GAAG,MAAM,CAAC,cAAc,IAAI,qBAAqB;AACtE,QAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,IAAI,mBAAmB;IACzE;AAEA,IAAA,OAAO,EAAE,UAAU,EAAE,qBAAqB,EAAE,mBAAmB,EAAE;AACnE,CAAC;AAED,MAAM,4BAA4B,GAAG,CAKnC,MAAyE,KACvE;AACF,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE;AAClD,IAAA,MAAM,cAAc,GAAG,+BAA+B,EAAE;AAExD,IAAA,MAAM,WAAW,GAAG,MAAM,CAAgB,IAAI;oFAAC;AAC/C,IAAA,MAAM,YAAY,GAAG,MAAM,CAAgB,IAAI;qFAAC;AAChD,IAAA,MAAM,kBAAkB,GAAG,IAAI,OAAO,EAAQ;AAE9C,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAqB,MAAK;AACnD,QAAA,MAAM,KAAK,GAAG,WAAW,EAAE;AAC3B,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,OAAO,IAAI;AAEvB,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,CAAC,eAAe,GAAG,KAAK,CAAC,IAAI,aAAa,CAAc,KAAK,CAAC;QAC7E;QAAE,OAAO,KAAK,EAAE;YACd,IAAI,SAAS,EAAE,EAAE;AACf,gBAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC;YACzD;AACA,YAAA,OAAO,IAAI;QACb;IACF,CAAC;mFAAC;IAEF,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;wFAAC;AACvD,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAA6D,IAAI;4FAAC;AACpG,IAAA,MAAM,sBAAsB,GAAG,MAAM,CAA6D,IAAI;+FAAC;AACvG,IAAA,MAAM,cAAc,GAAG,MAAM,CAAkC,IAAI;uFAAC;AACpE,IAAA,MAAM,aAAa,GAAG,MAAM,CAA0B,SAAS;sFAAC;AAChE,IAAA,MAAM,eAAe,GAAG,MAAM,CAAmC,IAAI;wFAAC;AAEtE,IAAA,MAAM,WAAW,GAAG,CAAC,MAAc,EAAE,OAAe,KAAI;AACtD,QAAA,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AACzB,QAAA,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC;AAClC,QAAA,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QACzB,kBAAkB,CAAC,IAAI,EAAE;AAC3B,IAAA,CAAC;;;;AAKD,IAAA,MAAM,SAAS,GAAG,CAAC,MAAc,EAAE,OAAe,KAAI;AACpD,QAAA,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;AAC5B,QAAA,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAC7D,IAAA,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,gCAAgC,EAAE,GAAG,wBAAwB,CAAC,MAAM,CAAC,OAAO,EAAE;QAC7F,QAAQ;QACR,mBAAmB;QACnB,sBAAsB;QACtB,WAAW;QACX,cAAc;QACd,aAAa;QACb,eAAe;AAChB,KAAA,CAAC;AAEF,IAAA,MAAM,MAAM,GAAG,CAAC,KAAA,GAAmC,MAAM,KAAI;AAC3D,QAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;AACrB,QAAA,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,WAAW,CAAC,UAAU,CAAC,eAAe,EAAE;AACxC,QAAA,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC;AAChC,QAAA,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AACxD,QAAA,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;AAC9B,QAAA,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;;;;AAK1B,QAAA,cAAc,CAAC,UAAU,CAAC,QAAQ,CAAC;AACrC,IAAA,CAAC;AAED,IAAA,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,QAAQ,EAAE;QACrD,WAAW;QACX,YAAY;QACZ,WAAW;QACX,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,WAAW;QACX,MAAM;AACP,KAAA,CAAC;AAEF,IAAA,MAAM,iBAAiB,GAA2D;QAChF,WAAW;QACX,YAAY;QACZ,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,WAAW;QACX,UAAU,EAAE,WAAW,CAAC,UAAU;QAClC,QAAQ,EAAE,QAAQ,CAAC,UAAU;QAC7B,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;QACjD,MAAM;QACN,kBAAkB;AAClB,QAAA,OAAO,EAAE,OAA8C;QACvD,gCAAgC;KACjC;AAED,IAAA,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,EAAE;AACpC,QAAA,OAAO,CAAC,KAAK,GAAG,iBAAiB,CAAC;IACpC;AAEA,IAAA,MAAM,mBAAmB,GAA6D;QACpF,YAAY;QACZ,WAAW;QACX,UAAU;QACV,MAAM;QACN,QAAQ;QACR,UAAU;QACV,SAAS;QACT,QAAQ,EAAE,QAAQ,CAAC,UAAU;QAC7B,cAAc,EAAE,QAAQ,CAAC,qBAAqB;QAC9C,kBAAkB;AAClB,QAAA,OAAO,EAAE,OAA8C;QACvD,cAAc;AACd,QAAA,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE;AACzC,QAAA,eAAe,EAAE,eAAe,CAAC,UAAU,EAAE;KAC9C;AAED,IAAA,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,mBAAmB,CAAC;;;AAIlG,IAAA,IAAI,aAAa,EAAE,KAAK,SAAS,EAAE;AACjC,QAAA,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC;IAChC;AAEA,IAAA,MAAM,QAAQ,GAAG;QACf,OAAO;AACP,QAAA,QAAQ,EAAE,QAAiD;AAC3D,QAAA,WAAW,EAAE,WAAW,CAAC,UAAU,EAAE;AACrC,QAAA,YAAY,EAAE,YAAY,CAAC,UAAU,EAAE;QACvC,UAAU;QACV,eAAe;AACf,QAAA,mBAAmB,EAAE,mBAAmB,CAAC,UAAU,EAAE;AACrD,QAAA,sBAAsB,EAAE,sBAAsB,CAAC,UAAU,EAAE;AAC3D,QAAA,cAAc,EAAE,cAAc,CAAC,UAAU,EAAE;AAC3C,QAAA,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE;AACzC,QAAA,eAAe,EAAE,eAAe,CAAC,UAAU,EAAE;QAC7C,SAAS;QACT,MAAM;QACN,kBAAkB;KACsC;IAE1D,IAAI,sBAAsB,EAAE,EAAE;QAC5B,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC5C,YAAA,IAAI,EAAE,eAAe;AACrB,YAAA,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,MAAM,CAAC,cAAc;AAChC,YAAA,WAAW,EAAE,mBAAmB,CAAC,MAAM,CAAC,OAAO,CAAC;AAChD,YAAA,IAAI,EAAE;gBACJ,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,aAAa,EAAE,WAAW,CAAC,OAAO;gBAClC,UAAU,EAAE,WAAW,CAAC,UAAU;AAClC,gBAAA,MAAM,EAAE,WAAW;AACnB,gBAAA,QAAQ,EAAE,6BAA6B,CAAC,eAAe,CAAC;AACzD,aAAA;AACF,SAAA,CAAC;AAEF,QAAA,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC;IAClC;AAEA,IAAA,OAAO,QAAQ;AACjB,CAAC;AAEM,MAAM,wBAAwB,GAAG,CAKtC,MAAyE,KACtE,kBAAkB,CAAC,MAAM,4BAA4B,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,CAAA,mBAAA,EAAsB,MAAM,CAAC,IAAI,CAAA,CAAE,EAAE;;AC5qB1G,MAAM,uBAAuB,GAAG,CACrC,GAAS,EACT,MAA8B,EAC9B,KAAyD,MACtB;AACnC,IAAA,KAAK,EAAE,WAAW;IAClB,GAAG;AACH,IAAA,MAAM,EAAE;AACN,QAAA,GAAG,MAAM;;;QAGT,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE,EAAE,CAAC;AACzG,KAAA;IACD,KAAK;AACN,CAAA;MAEY,gBAAgB,GAAG,CAC9B,GAAS,EACT,MAAsC,KACG;IACzC,MAAM,oBAAoB,GAAG,MAAM,CAAC,WAAW,EAAE,oBAAoB,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAC/G,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,EAAE,eAAe,IAAI,KAAK,CAAC;IACrE,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,EAAE,WAAW,IAAI,CAAC,CAAC;IAEzD,MAAM,cAAc,GAAyB,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAI;AACrE,QAAA,MAAM,EAAE,MAAM,EAAE,GAAG,KAAK;QAExB,IAAI,WAAW,GAAG,CAAC,IAAI,UAAU,IAAI,WAAW,EAAE;AAChD,YAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;QACzB;QAEA,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AAC1C,YAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;QACzB;AAEA,QAAA,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,YAAA,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;YACzF,IAAI,UAAU,EAAE;gBACd,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI;gBACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;AACxB,oBAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE;gBACjE;YACF;QACF;AAEA,QAAA,MAAM,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,eAAe,CAAC;AAEzD,QAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE;AAC/B,IAAA,CAAC;AAED,IAAA,MAAM,SAAS,GAAG,CAAC,YAAoB,MAAM,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,CAA2B;AAEzG,IAAA,MAAM,KAAK,GAAG,CAAC,OAAuC,KAAI;AACxD,QAAA,MAAM,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,IAAI,KAAK;QACnE,MAAM,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,IAAI,KAAK,CAAC;AAC9D,QAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,IAAI;QAExD,IAAI,eAAe,GAAG,CAAC;;QAGvB,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,CAAE;AAEhD,QAAA,MAAM,cAAc,GAAG,CAAC,MAAoC,KAAI;AAC9D,YAAA,MAAM,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE;AAClD,YAAA,IAAI,CAAC,mBAAmB;gBAAE;AAE1B,YAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE;;;AAGvB,gBAAA,OAAO,CAAC,mBAAmB,EAAE,OAAO,EAAE;gBAEtC;YACF;;;;YAKA,IAAI,OAAO,CAAC,gCAAgC,EAAE;gBAAE;AAEhD,YAAA,IAAI,MAAM,KAAK,WAAW,EAAE;AAC1B,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AAEtB,gBAAA,IAAI,GAAG,GAAG,eAAe,GAAG,kBAAkB;oBAAE;gBAEhD,eAAe,GAAG,GAAG;YACvB;AAEA,YAAA,YAAY,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;AAC1F,QAAA,CAAC;AAED,QAAA,MAAM,sBAAsB,GAAG,CAAC,eAAuB,KAAI;AACzD,YAAA,IAAI,OAAO,MAAM,CAAC,eAAe,KAAK,QAAQ,EAAE;gBAC9C,OAAO,MAAM,CAAC,eAAe;YAC/B;YAEA,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,EAAE,UAAU,IAAI,IAAI;YAC7D,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,WAAW,IAAI,KAAK,CAAC;YACjE,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,EAAE,WAAW,IAAI,MAAM,CAAC;YAElE,MAAM,gBAAgB,GAAG,eAAe,IAAI,CAAC,GAAG,UAAU,CAAC;AAE3D,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;AACvE,QAAA,CAAC;;AAGD,QAAA,YAAY,CAAC,OAAO,CAAC,WAAW;AAC7B,aAAA,IAAI,CACH,SAAS,CAAC,CAAC,KAAK,KAAI;AAClB,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AAE3B,YAAA,IAAI;gBACF,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC;AACvG,gBAAA,MAAM,SAAS,GAAI,eAA2C,GAAG,qBAAqB,CAAC;AAEvF,gBAAA,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;oBACjC,IAAI,SAAS,EAAE,EAAE;AACf,wBAAA,OAAO,CAAC,IAAI,CAAC,gCAAgC,qBAAqB,CAAA,0BAAA,CAA4B,CAAC;oBACjG;AAEA,oBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;gBACjB;AAEA,gBAAA,MAAM,WAAW,GAAG,SAAS,GAAG,IAAI;AACpC,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,gBAAA,MAAM,eAAe,GAAG,WAAW,GAAG,GAAG;AAEzC,gBAAA,IAAI,eAAe,IAAI,CAAC,EAAE;oBACxB,IAAI,gBAAgB,EAAE;wBACpB,IAAI,SAAS,EAAE,EAAE;AACf,4BAAA,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC;wBACxE;AAEA,wBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;oBACjB;AAEA,oBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;gBACjB;AAEA,gBAAA,MAAM,eAAe,GAAG,sBAAsB,CAAC,eAAe,CAAC;AAC/D,gBAAA,MAAM,gBAAgB,GAAG,eAAe,GAAG,eAAe;AAE1D,gBAAA,IAAI,gBAAgB,IAAI,CAAC,EAAE;AACzB,oBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;gBACjB;AAEA,gBAAA,OAAO,KAAK,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC;YACtD;AAAE,YAAA,MAAM;AACN,gBAAA,OAAO,EAAE,CAAC,IAAI,CAAC;YACjB;AACF,QAAA,CAAC,CAAC,EACF,kBAAkB,EAAE;AAErB,aAAA,SAAS,CAAC,CAAC,aAAa,KAAI;YAC3B,IAAI,aAAa,EAAE;gBACjB,cAAc,CAAC,WAAW,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;QAEJ,OAAO,CAAC,mBAAmB,EAAE,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,cAAc,CAAC,cAAc,CAAC,CAAC;AAEjH,QAAA,MAAM,gBAAgB,GACpB,MAAM,CAAC,gBAAgB;AACvB,aAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAkB,KAAI;gBACrC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;AAAE,oBAAA,MAAM,EAAE;AAC1D,YAAA,CAAC,CAAC;QAEJ,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC,QAAQ,EAAE;AAE1C,YAAA,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE;gBAAE;AAErC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE;AAE9B,YAAA,IAAI,CAAC,KAAK;gBAAE;AAEZ,YAAA,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;AACtE,QAAA,CAAC,CAAC;;AAGF,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI;QACpD,IAAI,cAAc,EAAE;YAClB,OAAO,CAAC,UAAU,CAAC;AAChB,iBAAA,IAAI,CACH,MAAM,CAAC,CAAC,KAAK,KAAI;;AAEf,gBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;AAAE,oBAAA,OAAO,KAAK;gBAChD,IAAI,CAAC,KAAK,CAAC,QAAQ;AAAE,oBAAA,OAAO,KAAK;AACjC,gBAAA,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,KAAK,GAAG;AAAE,oBAAA,OAAO,KAAK;AAE7C,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC,EACF,kBAAkB,EAAE;iBAErB,SAAS,CAAC,MAAK;gBACd,cAAc,CAAC,cAAc,CAAC;AAChC,YAAA,CAAC,CAAC;QACN;AACF,IAAA,CAAC;IAED,OAAO;AACL,QAAA,KAAK,EAAE,mBAAmB;QAC1B,GAAG;AACH,QAAA,MAAM,EAAE;AACN,YAAA,GAAG,MAAM;AACT,YAAA,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC;AACtC,gBAAA,OAAO,EAAE,cAAc;AACvB,gBAAA,aAAa,EAAE,CAAC;AAChB,gBAAA,MAAM,EAAE,EAAE,uBAAuB,EAAE,IAAI,EAAE;aAC1C,CAAC;AACH,SAAA;QACD,KAAK;QACL,SAAS;KACV;AACH;;MChVa,oBAAoB,GAAG,CAClC,MAAA,GAAiC,EAAE,KACjC;IACF,OAAO,CAAC,OAA6D,KAAI;QACvE,MAAM,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;AACpE,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,CAAC;AAChG,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACrC,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI;oFAAC;AAC5B,QAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;6FAAC;QAE3C,MAAM,UAAU,GAAG,MAAK;YACtB,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAClC,QAAA,CAAC;AAED,QAAA,MAAM,mBAAmB,GAAG,KAAK,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAClG,YAAY,CAAC,IAAI,CAAC,CACnB;AAED,QAAA,MAAM,wBAAwB,GAAG,MAAM,CAAC;cACpC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,mBAAmB,IAAI,IAAI,KAAK,CAAC;cACzE,KAAK,EAAE;QAEX,MAAM,SAAS,GAAG,KAAK,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;AAEtE,QAAA,MAAM,oBAAoB,GAAG,SAAS,CAAC,SAAS,CAAC,MAAK;YACpD,IAAI,OAAO,EAAE,IAAI,OAAO,CAAC,WAAW,EAAE,EAAE;AACtC,gBAAA,UAAU,EAAE;YACd;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAG,SAAS,CAAC,IAAI,CACtC,SAAS,CAAC,MAAM,KAAK,CAAC,iBAAiB,CAAC,CAAC,EACzC,MAAM,CAAC,MAAM,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CACnD;AAED,QAAA,MAAM,kBAAkB,GAAG,iBAAiB,CAAC,SAAS,CAAC,MAAK;AAC1D,YAAA,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC;AAC9B,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE;AACnC,YAAA,IAAI,KAAK,IAAI,OAAO,EAAE,EAAE;AACtB,gBAAA,UAAU,EAAE;YACd;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,MAAK;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACjB,YAAA,UAAU,EAAE;AACd,QAAA,CAAC;QAED,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,CAAC;QAED,MAAM,wBAAwB,GAAG,MAAK;YACpC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE;AACxC,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,EAAE;AAC/C,YAAA,MAAM,SAAS,GAAG,iBAAiB,GAAG,OAAO;YAE7C,OAAO,SAAS,GAAG,CAAC,GAAG,SAAS,GAAG,CAAC;AACtC,QAAA,CAAC;AAED,QAAA,UAAU,EAAE;AAEZ,QAAA,UAAU,CAAC,SAAS,CAAC,MAAK;YACxB,oBAAoB,CAAC,WAAW,EAAE;YAClC,kBAAkB,CAAC,WAAW,EAAE;AAClC,QAAA,CAAC,CAAC;AAEF,QAAA,MAAM,QAAQ,GAA4B;YACxC,MAAM;YACN,OAAO;YACP,UAAU;AACV,YAAA,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;YAC7B,wBAAwB;SACzB;QAED,OAAO;YACL,IAAI,EAAE,qBAAqB,CAAC,iBAAiB;YAC7C,QAAQ;YACR,QAAQ,EAAE,MAAM;gBACd,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,2BAA2B,CAAC,iBAAiB,CAAC,EAAE;AAC3E,gBAAA,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAC9D,IAAI,MAAM,CAAC,mBAAmB,GAAG,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;AAC1F,aAAA;SACF;AACH,IAAA,CAAC;AACH;;ACtIA;;;;;AAKG;AACH,MAAM,qBAAqB,GAAG,cAAc;AAC5C,MAAM,aAAa,GAAG,CAAC,IAAY,KAAK,CAAA,OAAA,EAAU,IAAI,CAAA,CAAE;AACxD,MAAM,cAAc,GAAG,CAAC,IAAY,KAAK,CAAA,EAAG,qBAAqB,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE;AAE1F;;;;AAIG;AACH,MAAM,mBAAmB,GAAG,CAAC,IAAY,KAAK,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE;AAwC3E,MAAM,mBAAmB,GAAG,CAAC,QAA6B,EAAE,QAAgB,KAAI;AAC9E,IAAA,MAAM,YAAY,GAAG,CAAC,IAAc,KAAK,IAAI,CAAC,IAAI,KAAK,QAAQ;;;AAI/D,IAAA,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;AACjH,CAAC;AAED;;;;;;;;;;;AAWG;AACI,MAAM,mBAAmB,GAAG,CAAC,OAAyB,KAA4B;AACvF,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAErC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC;AAC7C,IAAA,MAAM,WAAW,GAAG,yBAAyB,CAAC,qBAAqB,CAAC;AACpE,IAAA,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC1D,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC;sFAAC;AAC/B,IAAA,MAAM,eAAe,GAAG,IAAI,OAAO,EAAQ;IAE3C,MAAM,IAAI,GAAG,MAAK;;AAElB,IAAA,CAAC;;;AAID,IAAA,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE;QAC5B,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,YAAA,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE;AACzC,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,cAAc,EAAE,IAAI;AACpB,YAAA,gBAAgB,EAAE,eAAe,CAAC,YAAY,EAAE;AAChD,YAAA,OAAO,EAAE,IAAI;SACd;IACH;IAEA,MAAM,OAAO,GACX,OAAO,gBAAgB,KAAK,WAAW,GAAG,IAAI,GAAG,IAAI,gBAAgB,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE1G,IAAI,WAAW,GAAG,KAAK;AAEvB,IAAA,MAAM,OAAO,GAAG,YAAW;QACzB,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE;AAE9C,QAAA,IAAI,WAAW;YAAE;;;AAIjB,QAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;AACzE,IAAA,CAAC;AAED,IAAA,MAAM,QAAQ,GAAG,MAAM,OAAO,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,EAAiC,CAAC;AAEhG,IAAA,MAAM,cAAc,GAAG,MAAM,OAAO,EAAE,WAAW,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAiC,CAAC;IAE/G,IAAI,OAAO,EAAE;AACX,QAAA,OAAO,CAAC,SAAS,GAAG,CAAC,KAA4B,KAAI;AACnD,YAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAmC;AAEzD,YAAA,IAAI,OAAO,EAAE,IAAI,KAAK,UAAU,EAAE;gBAChC,KAAK,OAAO,EAAE;gBAEd;YACF;;YAGA,IAAI,OAAO,EAAE,IAAI,KAAK,mBAAmB,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;gBAC5D,eAAe,CAAC,IAAI,EAAE;YACxB;AACF,QAAA,CAAC;IACH;IAEA,MAAM,CAAC,MAAK;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAAE;;;AAItB,QAAA,QAAQ,EAAE;QACV,KAAK,OAAO,EAAE;AAChB,IAAA,CAAC,CAAC;AAEF,IAAA,QAAQ,EAAE;IACV,KAAK,OAAO,EAAE;IAEd,MAAM,OAAO,GAAG,MAAK;AACnB,QAAA,IAAI,WAAW;YAAE;QAEjB,WAAW,GAAG,IAAI;;QAGlB,IAAI,CAAC,OAAO,EAAE;AACd,QAAA,QAAQ,EAAE;QACV,OAAO,EAAE,KAAK,EAAE;QAChB,eAAe,CAAC,QAAQ,EAAE;AAC5B,IAAA,CAAC;AAED,IAAA,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC;IAE7B,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,QAAQ;AACvB,QAAA,aAAa,EAAE,aAAa,CAAC,UAAU,EAAE;AACzC,QAAA,WAAW,EAAE,IAAI;QACjB,cAAc;AACd,QAAA,gBAAgB,EAAE,eAAe,CAAC,YAAY,EAAE;QAChD,OAAO;KACR;AACH,CAAC;;AC/KD,MAAM,sBAAsB,GAAG,UAAU;AAEzC,MAAM,qBAAqB,GAAG,MAAK;AACjC,IAAA,MAAM,aAAa,GACjB,OAAO,SAAS,KAAK;UACjB,GAAG,SAAS,CAAC,SAAS,CAAA,EAAG,SAAS,CAAC,QAAQ,CAAA,EAAG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAA,EAAG,MAAM,CAAC,UAAU,CAAA;UAC9F,QAAQ;AAEd,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC;IAE1D,OAAO,IAAI,CAAC,CAAA,EAAG,aAAa,GAAG,MAAM,CAAA,CAAE,CAAC;AAC1C,CAAC;AAED,IAAI,SAAS,GAAkB,IAAI;AAEnC,MAAM,gBAAgB,GAAG,MAAK;AAC5B,IAAA,IAAI,SAAS;AAAE,QAAA,OAAO,SAAS;AAE/B,IAAA,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE;QACvC,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,sBAAsB,CAAC;QAC3D,IAAI,MAAM,EAAE;YACV,SAAS,GAAG,MAAM;AAElB,YAAA,OAAO,MAAM;QACf;AAEA,QAAA,MAAM,MAAM,GAAG,qBAAqB,EAAE;AACtC,QAAA,YAAY,CAAC,OAAO,CAAC,sBAAsB,EAAE,MAAM,CAAC;QACpD,SAAS,GAAG,MAAM;AAElB,QAAA,OAAO,MAAM;IACf;IAEA,IAAI,CAAC,SAAS,EAAE;QACd,SAAS,GAAG,qBAAqB,EAAE;IACrC;AACA,IAAA,OAAO,SAAS;AAClB,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,IAAY,EAAE,GAAW,KAAI;IAC9C,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IACpF;AACA,IAAA,OAAO,MAAM;AACf,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,KAAa,KAAI;AAC5C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK;AAExB,IAAA,IAAI;AACF,QAAA,MAAM,GAAG,GAAG,gBAAgB,EAAE;QAC9B,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,EAAE,GAAG,CAAC;AACvC,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,KAAK;IACd;AACF,CAAC;AAEM,MAAM,YAAY,GAAG,CAAC,cAAsB,KAAI;AACrD,IAAA,IAAI,CAAC,cAAc;AAAE,QAAA,OAAO,cAAc;AAE1C,IAAA,IAAI;AACF,QAAA,MAAM,GAAG,GAAG,gBAAgB,EAAE;AAC9B,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;AACtC,QAAA,OAAO,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC;IAClC;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,cAAc;IACvB;AACF,CAAC;AAEM,MAAM,WAAW,GAAG,CAAC,KAAa,KAAI;AAC3C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,KAAK;IAExB,MAAM,WAAW,GAAG,oBAAoB;AACxC,IAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;AAE1C,IAAA,IAAI;QACF,IAAI,CAAC,KAAK,CAAC;AACX,QAAA,OAAO,KAAK,CAAC,MAAM,GAAG,EAAE;IAC1B;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,KAAK;IACd;AACF,CAAC;AAEM,MAAM,kBAAkB,GAAG,MAAK;IACrC,SAAS,GAAG,IAAI;AAChB,IAAA,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE;AACvC,QAAA,YAAY,CAAC,UAAU,CAAC,sBAAsB,CAAC;IACjD;AACF,CAAC;;ACxCD;;;AAGG;AACI,MAAM,sBAAsB,GAAG,CAAC,IAAY,KAAK,CAAA,kBAAA,EAAqB,IAAI,CAAA,CAAE;AAEnF;AACA,MAAM,UAAU,GAAG,QAAQ;AAE3B,MAAM,UAAU,GAAG,CAAC,MAAc,EAAE,OAAe,KAAK,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,OAAO,EAAE;AAExE,MAAM,iBAAiB,GAAG,CAAC,MAA0B,EAAE,OAA4B,KAA0B;AAClH,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAErC,IAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;AAC9E,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI;AAC5C,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI;AAE5C,IAAA,IAAI,OAAO,gBAAgB,KAAK,WAAW,EAAE;QAC3C,IAAI,SAAS,EAAE,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,yFAAyF,CAAC;QACzG;QAEA,OAAO;YACL,OAAO,EAAE,MAAK;;YAEd,CAAC;SACF;IACH;AAEA,IAAA,MAAM,OAAO,GAAG,IAAI,gBAAgB,CAAC,WAAW,CAAC;;;;IAKjD,IAAI,eAAe,GAAkB,IAAI;IAEzC,IAAI,SAAS,GAAG,KAAK;AAErB,IAAA,OAAO,CAAC,SAAS,GAAG,CAAC,KAAgC,KAAI;AACvD,QAAA,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI;QAE1B,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,UAAU,EAAE;YAC3C,eAAe,GAAG,UAAU;YAC5B,SAAS,GAAG,KAAK;AACjB,YAAA,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC;YAE1B;QACF;AAEA,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,UAAU;YAAE;QAEtD,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC;QAChD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,CAAC;AAElD,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;YAAE;AAEzB,QAAA,eAAe,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;QAC7C,SAAS,GAAG,IAAI;AAChB,QAAA,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC;AACtC,IAAA,CAAC;IAED,MAAM,OAAO,GAAG,MAAK;QACnB,OAAO,CAAC,KAAK,EAAE;AACjB,IAAA,CAAC;AAED,IAAA,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC;IAE7B,IAAI,UAAU,EAAE;QACd,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE;AACpC,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE;AAEtC,YAAA,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;gBAAE;YAEzB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC;YAEzC,IAAI,KAAK,KAAK,eAAe;gBAAE;YAE/B,eAAe,GAAG,KAAK;AAEvB,YAAA,MAAM,OAAO,GAAgB;AAC3B,gBAAA,IAAI,EAAE,gBAAgB;AACtB,gBAAA,WAAW,EAAE,YAAY,CAAC,MAAM,CAAC;AACjC,gBAAA,YAAY,EAAE,YAAY,CAAC,OAAO,CAAC;aACpC;AAED,YAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;AAC9B,QAAA,CAAC,CAAC;IACJ;IAEA,IAAI,UAAU,EAAE;QACd,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE;YAEpC,IAAI,MAAM,EAAE;gBACV,SAAS,GAAG,IAAI;gBAEhB;YACF;AAEA,YAAA,IAAI,CAAC,SAAS;gBAAE;YAEhB,SAAS,GAAG,KAAK;YAEjB,IAAI,eAAe,KAAK,UAAU;gBAAE;YAEpC,eAAe,GAAG,UAAU;AAE5B,YAAA,MAAM,OAAO,GAAgB,EAAE,IAAI,EAAE,QAAQ,EAAE;AAE/C,YAAA,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC;AAC9B,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO,EAAE,OAAO,EAAE;AACpB,CAAC;;AChHD,MAAM,UAAU,mBAAmB,CAAC,MAAK;IACvC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE;IAE5C,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,KAAK,EAA0C;AAC/F,CAAC,GAAG;AAEJ;;;;;;;;;;;;;;;;;;;;AAoBG;MACU,0BAA0B,GAAG,CACxC,MAAA,GAAuC,EAAE,KACvC;IACF,IAAI,QAAQ,GAAkC,UAAU;AACxD,IAAA,IAAI,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,EAAE;AAE1C,IAAA,MAAM,KAAK,GAAG,CAAC,QAA8D,MAAM;QACjF,IAAI,EAAE,qBAAqB,CAAC,cAAc;QAC1C,QAAQ;QACR,QAAQ,EAAE,MAAM;AACd,YAAA,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE;AACxC,YAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,KAAK,KAAK,GAAG,WAAW,GAAG,QAAQ,EAAE;AAChF,YAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,KAAK,KAAK,GAAG,WAAW,GAAG,QAAQ,EAAE;AAChF,YAAA;AACE,gBAAA,KAAK,EAAE,iBAAiB;AACxB,gBAAA,KAAK,EAAE,MAAM,CAAC,cAAc,KAAK,KAAK,GAAG,qBAAqB,GAAG,mBAAmB;AACrF,aAAA;AACF,SAAA;AACF,KAAA,CAAC;;;AAIF,IAAA,MAAM,UAAU,GAA+C,CAAC,OAA4C,KAAI;QAC9G,WAAW,GAAG,MAAM,CAAC,WAAW,IAAI,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC;AAExE,QAAA,iBAAiB,CACf,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,EAC7E;YACE,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM;AACvB,SAAA,CACF;AAED,QAAA,IAAI,MAAM,CAAC,cAAc,KAAK,KAAK;AAAE,YAAA,OAAO,EAAE;AAE9C,QAAA,MAAM,QAAQ,GAAG,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AAE5D,QAAA,QAAQ,GAAG;YACT,QAAQ,EAAE,QAAQ,CAAC,QAAQ;YAC3B,aAAa,EAAE,QAAQ,CAAC,aAAa;YACrC,UAAU,EAAE,QAAQ,CAAC,WAAW,GAAG,UAAU,GAAG,aAAa;SAC9D;QAED,OAAO;AACL,YAAA,QAAQ,EAAE,MAAM,QAAQ,CAAC,QAAQ,EAAE;AACnC,YAAA,cAAc,EAAE,QAAQ;AACxB,YAAA,mBAAmB,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC,gBAAgB,EAAE;SAChG;AACH,IAAA,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC;AAC7C;;AC7CO,MAAM,kBAAkB,GAAG,CAIhC,MAA6C,KAC3C;IACF,OAAO,CAAC,OAA6D,KAAI;QACvE,MAAM,QAAQ,GAAG,2BAA2B,CAAC,MAAM,EAAE,OAAO,CAAC;QAC7D,OAAO;YACL,IAAI,EAAE,qBAAqB,CAAC,eAAe;YAC3C,QAAQ;YACR,QAAQ,EAAE,MAAM;AACd,gBAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,QAAQ,EAAE;AAC3D,gBAAA,EAAE,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAA,EAAG,MAAM,CAAC,MAAM,EAAE,aAAa,IAAI,EAAE,GAAG,EAAE;AAC5E,gBAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,KAAK,EAAE;AAC/D,gBAAA,EAAE,KAAK,EAAE,qBAAqB,EAAE,KAAK,EAAE,MAAM,CAAC,iBAAiB,GAAG,KAAK,GAAG,IAAI,EAAE;gBAChF,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;AACzD,gBAAA,IAAI,MAAM,CAAC,SAAS,CAAC,aAAa,EAAE;sBAChC,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;sBAC/E,EAAE,CAAC;AACR,aAAA;SACF;AACH,IAAA,CAAC;AACH;MAEa,2BAA2B,GAAG,CAIzC,MAA6C,EAC7C,OAA6D,KACpC;AACzB,IAAA,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,OAAO;IAChD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,QAAQ;AAClD,IAAA,MAAM,oBAAoB,GAAG,CAAA,EAAG,UAAU,aAAa;AACvD,IAAA,MAAM,KAAK,GAAG,WAAW,EAAE;IAE3B,MAAM,oBAAoB,GAAG,MAAK;AAChC,QAAA,MAAM,gBAAgB,GAAG,OAAO,YAAY,KAAK,WAAW,GAAG,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,IAAI;AAChH,QAAA,IAAI,gBAAgB,KAAK,IAAI,EAAE;YAC7B,OAAO,gBAAgB,KAAK,MAAM;QACpC;AAEA,QAAA,MAAM,cAAc,GAAG,SAAS,CAAC,UAAU,CAAC;QAC5C,IAAI,cAAc,EAAE;AAClB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,MAAM,CAAC,iBAAiB,IAAI,KAAK;AAC1C,IAAA,CAAC;AAED,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,oBAAoB,EAAE;yFAAC;AAEvD,IAAA,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,SAAS,EAAE,IAAI,WAAW;AAC9E,IAAA,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,EAAE,IAAI,IAAI,GAAG;AAEnD,IAAA,MAAM,YAAY,GAAG,MAAME,YAAgB,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,YAAY,EAAE,CAAC;IAErF,MAAM,CAAC,MAAK;AACV,QAAA,MAAM,KAAK,GAAG,YAAY,EAAE;AAC5B,QAAA,MAAM,UAAU,GAAG,gBAAgB,EAAE;;;;;AAMrC,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,MAAM,aAAa,GAAG,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,aAAa,IAAI,EAAE,IAAI,IAAI;QAE9E,SAAS,CACP,UAAU,EACV,YAAY,CAAC,KAAK,CAAC,EACnB,aAAa,EACb,YAAY,EAAE,EACd,UAAU,EAAE,EACZ,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,KAAK,CACjC;AACH,IAAA,CAAC,CAAC;IAEF,MAAM,CAAC,MAAK;AACV,QAAA,MAAM,KAAK,GAAG,cAAc,EAAE;AAE9B,QAAA,IAAI,CAAC,KAAK;YAAE;AAEZ,QAAA,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE;AAC3B,YAAA,YAAY,EAAE;YAEd;QACF;;;AAIA,QAAA,MAAM,WAAW,GACf,KAAK,CAAC,KAAK,KAAK,OAAO;aACtB,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC;AAC7D,aAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;AAExD,QAAA,IAAI,WAAW;AAAE,YAAA,YAAY,EAAE;AACjC,IAAA,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAG,MAAK;AACpB,QAAA,MAAM,YAAY,GAAG,KAAK,EAAE;QAC5B,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,aAAa,IAAI,EAAE;AAC1D,QAAA,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE3E,IAAI,aAAa,EAAE;YACjB;QACF;AAEA,QAAA,MAAM,WAAW,GAAG,SAAS,CAAC,UAAU,CAAC;QACzC,IAAI,WAAW,EAAE;AACf,YAAA,MAAM,cAAc,GAAG,YAAY,CAAC,WAAW,CAAC;YAChD,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,cAAc,CAAC;YACvD,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;QAC9F;AACF,IAAA,CAAC;AAED,IAAA,MAAM,aAAa,GAAG,CAAC,OAAgB,KAAI;AACzC,QAAA,IAAI,OAAO,YAAY,KAAK,WAAW,EAAE;YACvC,YAAY,CAAC,OAAO,CAAC,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7D;AACA,QAAA,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC;AAC/B,IAAA,CAAC;AAED,IAAA,QAAQ,EAAE;IAEV,OAAO;AACL,QAAA,UAAU,EAAE,gBAAgB,CAAC,UAAU,EAAE;QACzC,aAAa;QACb,QAAQ;KACT;AACH;;MC7La,0BAA0B,GAAG,CACxC,MAAA,GAAgD,EAAE,KAChD;IACF,OAAO,CAAC,OAA6D,KAAI;QACvE,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI;AACjE,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,aAAa,IAAI,IAAI;AAClD,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAc,MAAK;AAC3C,YAAA,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,EAAqD;AACvF,YAAA,IAAI,CAAC,OAAO;AAAE,gBAAA,OAAO,IAAI;AAEzB,YAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;YAEvB,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,gBAAA,OAAO,IAAI;AAExC,YAAA,OAAO,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAC7B,CAAC;sFAAC;QAEF,MAAM,UAAU,GAAG,aAAa,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAChG,GAAG,CAAC,MAAK;AACP,YAAA,MAAM,MAAM,GAAG,SAAS,EAAE;AAC1B,YAAA,IAAI,CAAC,MAAM;AAAE,gBAAA,OAAO,IAAI;AAExB,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;YACtB,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG;YAE5C,OAAO,aAAa,GAAG,CAAC,GAAG,aAAa,GAAG,IAAI;QACjD,CAAC,CAAC,CACH;QAED,MAAM,eAAe,GAAG,UAAU,CAAC,IAAI,CACrC,GAAG,CAAC,CAAC,aAAa,KAAI;YACpB,IAAI,aAAa,KAAK,IAAI;AAAE,gBAAA,OAAO,KAAK;AACxC,YAAA,OAAO,aAAa,IAAI,gBAAgB,IAAI,aAAa,GAAG,CAAC;QAC/D,CAAC,CAAC,CACH;AAED,QAAA,MAAM,SAAS,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAC9D,QAAA,MAAM,cAAc,GAAG,QAAQ,CAAC,eAAe,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AAEzE,QAAA,MAAM,QAAQ,GAAkC;YAC9C,SAAS;YACT,SAAS;YACT,cAAc;SACf;QAED,OAAO;YACL,IAAI,EAAE,qBAAqB,CAAC,wBAAwB;YACpD,QAAQ;YACR,QAAQ,EAAE,MAAM;gBACd,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,2BAA2B,CAAC,gBAAgB,CAAC,EAAE;gBAC9E,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,2BAA2B,CAAC,aAAa,CAAC,EAAE;AAC5E,aAAA;SACF;AACH,IAAA,CAAC;AACH;;ACnCO,MAAM,mBAAmB,GAAG,CAIjC,MAA8C,KAC5C;IACF,OAAO,CAAC,OAA6D,KAAI;AAGvE,QAAA,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,IAAI,IAAI;AAEpD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI;oFAAC;QAC5B,IAAI,mBAAmB,GAAkB,IAAI;QAC7C,IAAI,oBAAoB,GAAkB,IAAI;QAC9C,IAAI,yBAAyB,GAA8B,IAAI;AAE/D,QAAA,MAAM,gBAAgB,GAAG,CAAC,WAA0B,EAAE,YAA2B,KAAI;YACnF,IAAI,yBAAyB,EAAE,OAAO,EAAE;AAAE,gBAAA,OAAO,yBAAyB;AAE1E,YAAA,IAAI,CAAC,WAAW,IAAI,CAAC,YAAY,EAAE;AACjC,gBAAA,OAAO,IAAI;YACb;AAEA,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC;AAE5D,YAAA,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAEpE,YAAA,yBAAyB,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE;AACzE,gBAAA,WAAW,EAAE,kBAAkB;AAChC,aAAA,CAAC;AAEF,YAAA,OAAO,yBAAyB;AAClC,QAAA,CAAC;QAED,MAAM,MAAM,GAAG,MAAK;AAClB,YAAA,OAAO,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;AACxE,QAAA,CAAC;QAED,MAAM,MAAM,GAAG,MAAK;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACnB,QAAA,CAAC;QAED,MAAM,OAAO,GAAG,MAAK;AACnB,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,CAAC;QAED,IAAI,cAAc,EAAE;YAClB,MAAM,CACJ,MAAK;AACH,gBAAA,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE;AAC1C,gBAAA,MAAM,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE;gBAElD,IAAI,mBAAmB,IAAI,CAAC,YAAY,IAAI,OAAO,EAAE,EAAE;oBACrD,SAAS,CAAC,MAAM,gBAAgB,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;gBAC9E;gBAEA,mBAAmB,GAAG,YAAY;gBAClC,oBAAoB,GAAG,mBAAmB;YAC5C,CAAC,EACD,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAC/B;QACH;AAEA,QAAA,MAAM,QAAQ,GAA+C;YAC3D,MAAM;YACN,MAAM;YACN,OAAO;AACP,YAAA,OAAO,EAAE,OAAO,CAAC,UAAU,EAAE;SAC9B;QAED,OAAO;YACL,IAAI,EAAE,qBAAqB,CAAC,gBAAgB;YAC5C,QAAQ;YACR,QAAQ,EAAE,MAAM;gBACd,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;AAC1C,gBAAA,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,GAAG,KAAK,GAAG,IAAI,EAAE;AAC7D,aAAA;SACF;AACH,IAAA,CAAC;AACH;;ACjBO,MAAM,YAAY,GAAG,CAA+C,MAAkC,KAAI;IAC/G,OAAO,CAAC,OAA6D,KAAI;QACvE,MAAM,QAAQ,GAAG,qBAAqB,CAAY,OAAO,EAAE,MAAM,CAAC;AAClE,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC;QAEnD,OAAO;YACL,IAAI,EAAE,qBAAqB,CAAC,QAAQ;YACpC,QAAQ;YACR,QAAQ,EAAE,MAAM;AACd,gBAAA,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,mBAAmB,KAAK,KAAK,GAAG,SAAS,GAAG,SAAS,EAAE;gBAClG,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;AAC1F,aAAA;SACF;AACH,IAAA,CAAC;AACH;MAEa,qBAAqB,GAAG,CACnC,OAA6D,EAC7D,MAAkC,KACJ;AAC9B,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0C,CAAC;AAEnE,IAAA,MAAM,EAAE,GAAG,CACT,KAAa,EACb,OAAsE,KACtD;QAChB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACxB,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC;QAChC;QACA,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACzC,IAAI,aAAa,EAAE;AACjB,YAAA,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC;QAC5B;QAEA,OAAO,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;AAClC,IAAA,CAAC;AAED,IAAA,MAAM,GAAG,GAAG,CACV,KAAa,EACb,OAAsE,KACpE;QACF,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACzC,IAAI,aAAa,EAAE;AACjB,YAAA,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;AAC7B,YAAA,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC,EAAE;AAC5B,gBAAA,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC;YACxB;QACF;AACF,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,IAAa,KAAI;QACpD,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QACzC,IAAI,aAAa,EAAE;AACjB,YAAA,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,KAAI;AAChC,gBAAA,IAAI;oBACF,OAAO,CAAC,IAAI,CAAC;gBACf;gBAAE,OAAO,KAAK,EAAE;oBACd,OAAO,CAAC,KAAK,CAAC,CAAA,qCAAA,EAAwC,KAAK,CAAA,EAAA,CAAI,EAAE,KAAK,CAAC;gBACzE;AACF,YAAA,CAAC,CAAC;QACJ;AACF,IAAA,CAAC;IAGD,MAAM,iBAAiB,GACrB,OAAO,CAAC,cAAc,IAAI,OAAO,gBAAgB,KAAK;AACpD,UAAE,IAAI,gBAAgB,CAAC,uBAAuB;UAC5C,IAAI;IAEV,IAAI,iBAAiB,EAAE;AACrB,QAAA,iBAAiB,CAAC,SAAS,GAAG,CAAC,YAA4C,KAAI;AAC7E,YAAA,IAAI,OAAO,CAAC,QAAQ,EAAE,EAAE;AACtB,gBAAA,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC/D;AACF,QAAA,CAAC;AACD,QAAA,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,CAAC;IAC/D;AAEA,IAAA,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,IAAa,KAAI;QAC5C,IAAI,iBAAiB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE;AAC5C,YAAA,IAAI;gBACF,iBAAiB,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAA6B,CAAC;gBAEzE;YACF;YAAE,OAAO,KAAK,EAAE;;;;;gBAKd,IAAI,SAAS,EAAE,EAAE;oBACf,OAAO,CAAC,IAAI,CAAC,CAAA,wCAAA,EAA2C,KAAK,CAAA,mCAAA,CAAqC,EAAE,KAAK,CAAC;gBAC5G;YACF;QACF;AAEA,QAAA,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC;AAC3B,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,KAAa,EAAE,IAAa,KAAI;AAClD,QAAA,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC;AAC3B,IAAA,CAAC;AAED,IAAA,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwE;AAEtG,IAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,UAAU,CAAC,KAAI;AAC5D,QAAA,MAAM,KAAK,GAAG,UAAyE,CAAC;QAExF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE;AACjC,YAAA,IAAI,CAAC,QAAQ;gBAAE;AAEf,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE;AAC1C,YAAA,IAAI,WAAW;gBAAE;AAEjB,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE;AAClC,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,EAAE;AAC9B,YAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE;YAEpC,MAAM,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;AAEzC,YAAA,IAAI,QAAQ,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,UAAU,KAAK,SAAS,EAAE;AACzE,gBAAA,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;gBAClE,IAAI,CAAC,GAAG,GAAG,CAAA,OAAA,CAAS,EAAE,EAAE,QAAQ,EAAE,CAAC;YACrC;YAEA,IAAI,KAAK,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,UAAU,KAAK,OAAO,EAAE;AAC1D,gBAAA,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;gBAChE,IAAI,CAAC,GAAG,GAAG,CAAA,OAAA,CAAS,EAAE,EAAE,KAAK,EAAE,CAAC;YAClC;YAEA,IAAI,OAAO,EAAE;AACX,gBAAA,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9D;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;IAEF,IAAI,SAAS,GAAG,KAAK;IACrB,MAAM,CAAC,MAAK;AACV,QAAA,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE;AACzC,QAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE;QAC3C,MAAM,SAAS,GAAG,CAAC,EAAE,WAAW,IAAI,YAAY,CAAC;AAEjD,QAAA,IAAI,SAAS,IAAI,CAAC,SAAS,EAAE;AAC3B,YAAA,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QAC/D;QAEA,SAAS,GAAG,SAAS;AACvB,IAAA,CAAC,CAAC;AAEF,IAAA,OAAO,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAK;QACxC,IAAI,CAAC,qBAAqB,EAAE;AAC1B,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,QAAQ,EAAE,SAAS;AACpB,SAAA,CAAC;AACJ,IAAA,CAAC,CAAC;AAEF,IAAA,IAAI,MAAM,EAAE,EAAE,EAAE;AACd,QAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,KAAI;YACrD,IAAI,OAAO,EAAE;AACX,gBAAA,EAAE,CAAC,KAAqC,EAAE,OAAO,CAAC;YACpD;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,IAAI,OAAO,CAAC,cAAc,EAAE;AAC1B,QAAA,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,GAAG,OAAO,CAAC,cAAc;QAE/F,MAAM,CAAC,MAAK;YACV,UAAU,CAAC,oBAAoB,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,EAAwC,CAAC;AACxG,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;YACV,UAAU,CAAC,2BAA2B,EAAE;gBACtC,KAAK,EAAE,mBAAmB,EAAE;AACgB,aAAA,CAAC;AACjD,QAAA,CAAC,CAAC;IACJ;IAEA,OAAO;QACL,EAAE;QACF,GAAG;KACJ;AACH;;AChRA;AACO,MAAM,0BAA0B,GAAuB;AAC5D,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,MAAM,EAAE,GAAG;;AAGb;;;;AAIG;AACI,MAAM,6BAA6B,GAA4D;IACpG,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,IAAI,EAAE;IACtD,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,EAAE;IACvD,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE;IACxD,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE;IACrD,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE;IACrD,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,IAAI,EAAE;IAC1D,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,IAAI,EAAE;IAC5D,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,uBAAuB,EAAE,SAAS,EAAE,KAAK,EAAE;IACjE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,IAAI,EAAE;IACtD,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,IAAI,EAAE;;AAGhE,MAAM,MAAM,mBAAmB,MAAM,CAAqC,EAAE;2EAAC;AAE7E;;;AAGG;AACI,MAAM,mBAAmB,mBAA+D,MAAM,CAAC,UAAU;AAEhH;AACO,MAAM,yBAAyB,GAAG,CAAC,KAAyB,KACjE,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG;AAEhE;;;;;;AAMG;AACI,MAAM,qBAAqB,GAAG,CAAC,OAAmE,KAAI;AAC3G,IAAA,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,OAAO;AAErC,IAAA,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;AACxB,QAAA,MAAM,IAAI,GAAG,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,0BAA0B,CAAC,EAAE,GAAG,KAAK,EAAE;AAEjF,QAAA,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,EAAE;AACpC,YAAA,MAAM,EAAE,CAAC,UAAU,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO;AAEnD,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,EAAE,GAAG,OAAO,EAAE,CAAC,UAAU,GAAG,IAAI,EAAE;AAC3C,IAAA,CAAC,CAAC;AACJ;AAEA;;;;AAIG;AACI,MAAM,wBAAwB,GAAG,CAAC,UAAmB,KAC1D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,KAAI;IACxB,IAAI,UAAU,KAAK,SAAS;AAAE,QAAA,OAAO,EAAE;AAEvC,IAAA,MAAM,EAAE,CAAC,UAAU,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO;AAEnD,IAAA,OAAO,IAAI;AACb,CAAC;AAEH;;;;;;AAMG;AACI,MAAM,mCAAmC,GAAG,CACjD,MAAgC,KACK;IACrC,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;AAEzC,IAAA,IAAI,CAAC,KAAK,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;IAE5D,IAAI,UAAU,GAAG,KAAK;AAEtB,IAAA,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE;QACtB,UAAU,GAAG,IAAI;QACjB,qBAAqB,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,EAAE,CAAC;IACnG;AAAO,SAAA,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE;QAC7B,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ;IACnD;IAEA,OAAO;QACL,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,MAAM,EAAE,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,IAAI;KACzC;AACH;;ACxGA;;;;AAIG;AACI,MAAM,4BAA4B,GAAG,MAAqC;AAC/E,IAAA,MAAM,GAAG,GAAG,MAAM,CAAoB,EAAE;4EAAC;IAEzC,OAAO;AACL,QAAA,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE;AACrB,QAAA,KAAK,EAAE,CAAC,KAAK,KAAI;AACf,YAAA,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC;;;;YAK9C,SAAS,CAAC,MAAK;AACb,gBAAA,MAAM,KAAK,GAAG,GAAG,EAAE;gBACnB,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBAE/D,IAAI,KAAK,CAAC,MAAM;oBAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC;AACjD,YAAA,CAAC,CAAC;YAEF,OAAO,SAAS,CAAC,KAAK;QACxB,CAAC;KACF;AACH;;ACyBA,MAAM,eAAe,GAAG,CAAC,IAAc,EAAE,IAAc,KACrD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;AAEjF;;;AAGG;AACI,MAAM,+BAA+B,GAAG,CAAC,OAA8C,EAAE,IAAc,KAC5G,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;AAQ9D;;;AAGG;AACH,MAAM,WAAW,GAAG,CAAC,IAAa,EAAE,IAAc,KAAoB;AACpE,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;IAErE,IAAI,OAAO,GAAG,IAAI;AAElB,IAAA,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE;AACpD,QAAA,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,YAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE;AAEzE,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAoB;QAC3C,MAAM,SAAS,GAAG,OAA2C;AAE7D,QAAA,IAAI,EAAE,IAAI,IAAI,SAAS,CAAC;AAAE,YAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE;AAE9C,QAAA,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC;IAC3B;AAEA,IAAA,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ;AAAE,QAAA,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE;IAEzE,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAoB;IACpD,MAAM,SAAS,GAAG,OAA2C;AAC7D,IAAA,MAAM,MAAM,GAAG,GAAG,IAAI,SAAS;IAE/B,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE;AACzE,CAAC;AAED;;;;AAIG;AACH,MAAM,eAAe,GAAG,CAAC,IAAa,EAAE,IAAc,EAAE,KAAc,KAAa;AACjF,IAAA,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;IAEnC,MAAM,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,GAAG,IAAsC;AAE9D,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACvB,QAAA,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,IAAc,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,IAAc,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC;AAEzE,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,SAAS,GAAG,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,GAAI,IAAgC,GAAG,EAAE;IAC3F,OAAO,EAAE,GAAG,SAAS,EAAE,CAAC,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE;AAChF,CAAC;AAED,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,QAAQ,CAAC;AAE5E,MAAM,aAAa,GAAG,CAAC,GAAW,KAAK,qBAAqB,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEjG;AACA,MAAM,kBAAkB,GAAG,CAAC,KAAyB,EAAE,GAAW,KAAI;AACpE,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW;AAE/B,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,MAAM,KAAK,GAAI,IAAuC,GAAG,GAAG,CAAC;QAC7D,IAAI,KAAK,KAAK,SAAS;YAAE;QACzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,KAAK;AACxE,QAAA,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AAAE,YAAA,OAAO,KAAK;AACjC,QAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACjB;AAEA,IAAA,OAAO,IAAI,CAAC,IAAI,GAAG,CAAC;AACtB,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,KAAyB,EAAE,GAAW,KAAI;AAC/D,IAAA,IAAI,GAAG,GAAG,CAAC,QAAQ;AAEnB,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;AACxB,QAAA,MAAM,KAAK,GAAI,IAAuC,GAAG,GAAG,CAAC;AAC7D,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,GAAG,GAAG;YAAE,GAAG,GAAG,KAAK;IAC3D;AAEA,IAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,MAAM,YAAY,GAAG,CAAC,KAAyB,EAAE,GAAW,EAAE,IAAY,KAAI;IAC5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAM,IAAuC,GAAG,GAAG,CAAC,CAAC,CAAC;IAE9F,IAAI,MAAM,GAAG,CAAC;IACd,OAAO,QAAQ,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,CAAC;AAAE,QAAA,MAAM,EAAE;AAEvD,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,MAAA,EAAS,MAAM,EAAE;AACjC,CAAC;AAED;;;;;;AAMG;MACU,uBAAuB,GAAG,CAAC,IAAa,EAAE,QAA4B,KAAa;AAC9F,IAAA,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;IAEzE,MAAM,MAAM,GAAG,IAA+B;AAC9C,IAAA,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,EAAE;IAErD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;AACrC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC;AAEzB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,GAAG,CAAC;YAAE;QAE/D,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC;aACpE,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,YAAA,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC;IACtF;AAEA,IAAA,OAAO,MAAM;AACf;AAEA,MAAM,qBAAqB,GAAG,CAAC,KAAyB,EAAE,KAAa,KAAe;IACpF,MAAM,IAAI,GAAG,uBAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;AACzD,IAAA,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC;AAC/B,IAAA,OAAO,IAAI;AACb,CAAC;AAED,MAAM,mBAAmB,GAAG,CAAC,KAAyB,KAAe;AACnE,IAAA,IAAI,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC;IAEvB,KAAK,MAAM,IAAI,IAAI,KAAK;AAAE,QAAA,MAAM,GAAG,CAAC,GAAG,MAAM,EAAE,uBAAuB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAErF,IAAA,OAAO,MAAM;AACf,CAAC;AAQD;;;;AAIG;AACI,MAAM,qBAAqB,GAAG,CAAC,KAAc,KAA4B;AAC9E,IAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI;IAE5E,MAAM,GAAG,GAAG,KAAgC;IAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;IAE7C,MAAM,UAAU,GAAG,CAAC,GAAG,IAAc,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,CAAC;IAE3F,IAAI,UAAU,CAAC,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,CAAC;AAAE,QAAA,OAAO,SAAS;IAC9F,IAAI,UAAU,CAAC,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC;AAAE,QAAA,OAAO,UAAU;IACpF,IAAI,UAAU,CAAC,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,CAAC;AAAE,QAAA,OAAO,YAAY;AAC7F,IAAA,IAAI,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC;AAAE,QAAA,OAAO,qBAAqB;AAEtE,IAAA,OAAO,IAAI;AACb;AAEA,MAAM,gBAAgB,GAAG,qBAAqB;AAC9C,MAAM,gBAAgB,GAAG,6EAA6E;AAEtG;;;;;AAKG;MACU,gBAAgB,GAAG,CAAC,GAA2B,EAAE,KAAc,KAAI;IAC9E,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAAE,QAAA,OAAO,IAAI;AAE1G,IAAA,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AACrC;AAEA;;;;AAIG;MACU,gBAAgB,GAAG,CAAC,KAAc,EAAE,IAAqC,KAAgB;IACpG,MAAM,KAAK,GAAe,EAAE;AAE5B,IAAA,MAAM,IAAI,GAAG,CAAC,IAAa,EAAE,IAAc,KAAI;AAC7C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAE3D;QACF;AAEA,QAAA,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AACpC,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YAE5E;QACF;QAEA,IAAI,OAAO,IAAI,KAAK,IAAI;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5C,IAAA,CAAC;AAED,IAAA,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;AAEf,IAAA,OAAO,KAAK;AACd;AAEA,MAAM,gBAAgB,GAAG,CACvB,KAA8B,EAC9B,KAAsB,EACtB,IAAyB,EACzB,MAAc,KACa;AAC3B,IAAA,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAc;AAEzC,IAAA,IAAI,SAAoB;AAExB,IAAA,IAAI,IAAI,KAAK,QAAQ,EAAE;QACrB,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAChE;AAAO,SAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;;QAE7B,SAAS,GAAG,KAAK;IACnB;SAAO;QACL,SAAS,GAAG,KAAK;AACjB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE;AAC/B,YAAA,SAAS,GAAG,CAAC,GAAG,SAAS,EAAE,uBAAuB,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC;QACzF;IACF;IAEA,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;IAC7C,MAAM,MAAM,GAA4B,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;AAEtE,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,MAAM,CAAC,WAAW,CAAC,GAAI,KAAK,CAAC,WAAW,CAAY,GAAG,KAAK;AAC5D,QAAA,MAAM,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,GAAG,CACjC,CAAC,EACD,IAAI,CAAC,IAAI,CAAE,MAAM,CAAC,WAAW,CAAY,IAAK,KAAK,CAAC,cAAc,CAAY,IAAI,CAAC,CAAC,CAAC,CACtF;IACH;AAAO,SAAA,IAAI,KAAK,KAAK,UAAU,EAAE;QAC/B,MAAM,CAAC,WAAW,CAAC,GAAI,KAAK,CAAC,WAAW,CAAY,GAAG,KAAK;AAC5D,QAAA,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAE,MAAM,CAAC,WAAW,CAAY,IAAK,KAAK,CAAC,OAAO,CAAY,IAAI,CAAC,CAAC,CAAC,CAAC;IACpH;AAAO,SAAA,IAAI,KAAK,KAAK,YAAY,EAAE;QACjC,MAAM,CAAC,WAAW,CAAC,GAAI,KAAK,CAAC,WAAW,CAAY,GAAG,KAAK;AAC5D,QAAA,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,GAAG,CAC7B,CAAC,EACD,IAAI,CAAC,IAAI,CAAE,MAAM,CAAC,WAAW,CAAY,IAAK,KAAK,CAAC,cAAc,CAAY,IAAI,CAAC,CAAC,CAAC,CACtF;IACH;SAAO;QACL,MAAM,CAAC,OAAO,CAAC,GAAI,KAAK,CAAC,OAAO,CAAY,GAAG,KAAK;IACtD;AAEA,IAAA,OAAO,MAAM;AACf,CAAC;AAED,MAAM,cAAc,GAAG;AACrB,IAAA,KAAK,EAAE,IAAI;IACX,IAAI,kBAAkB,6FAA6F,CAAC,MAAM,CACxH,CAAC,CACF;AACD,IAAA,QAAQ,EAAE,iEAAiE;AAC3E,IAAA,OAAO,EAAE,iCAAiC;CAClC;AAEV,MAAM,iBAAiB,GAAG,CAAC,MAA4D,EAAE,MAA0B,KACjH,MAAM,KAAK,MAAM,KAAK,QAAQ,GAAG,EAAE,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAE/D,MAAM,cAAc,GAAG;AACrB,IAAA,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,gBAAgB;CACrB;AAEV,MAAM,iBAAiB,GAAG,CAAC,MAA+C,EAAE,MAA0B,KACpG,MAAM,KAAK,MAAM,KAAK,QAAQ,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,UAAU,GAAG,CAAI,MAAoB,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAM;AAEtG,MAAM,gBAAgB,GAAG,CAAC,GAAW,EAAE,GAAW,KAAK,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AAExG,MAAM,SAAS,GAAG,CAAC,MAAc,KAAI;IACnC,IAAI,GAAG,GAAG,EAAE;AACZ,IAAA,OAAO,GAAG,CAAC,MAAM,GAAG,MAAM;AAAE,QAAA,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;AAC7B,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC;AAE/G,MAAM,cAAc,GAClB,8HAA8H;AAEhI,MAAM,cAAc,GAAG;IACrB,iEAAiE;IACjE,6DAA6D;IAC7D,oDAAoD;CACrD;AAED,MAAM,eAAe,GAAG;IACtB,8BAA8B;IAC9B,qBAAqB;IACrB,mBAAmB;IACnB,4BAA4B;IAC5B,6BAA6B;CAC9B;AAED;;;;;;AAMG;AACI,MAAM,iCAAiC,GAAG,CAAC,MAAiD,KAAI;IACrG,QAAQ,MAAM;AACZ,QAAA,KAAK,OAAO;AACV,YAAA,OAAO,UAAU,CAAC,WAAW,CAAC;QAChC,KAAK,MAAM,EAAE;YACX,MAAM,MAAM,GAAG,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC;AACxC,YAAA,OAAO,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC;AACnE,iBAAA,KAAK,CAAC,CAAC,EAAE,MAAM;AACf,iBAAA,OAAO,EAAE;QACd;AACA,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,UAAU,CAAC;AAChB,gBAAA,MAAM,UAAU,CAAC,cAAc,CAAC;AAChC,gBAAA,MACE,CAAA,qCAAA,EAAwC,SAAS,CAAC,EAAE,CAAC,CAAA,uBAAA,EAA0B,SAAS,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA,CAAE;gBACtH,MAAM,SAAS,CAAC,gBAAgB,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;AAC3C,aAAA,CAAC,EAAE;AACN,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,UAAU,CAAC,eAAe,CAAC;;AAExC;AAEA;;;;AAIG;AACI,MAAM,iCAAiC,GAAG,CAAC,MAAoC,KAAI;IACxF,QAAQ,MAAM;AACZ,QAAA,KAAK,MAAM;AACT,YAAA,OAAO,CAAC;QACV,KAAK,UAAU,EAAE;YACf,MAAM,SAAS,GAAG,EAAE,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC;QACzD;QACA,KAAK,MAAM,EAAE;YACX,MAAM,SAAS,GAAG,EAAE,IAAI,gBAAgB,CAAC,CAAC,EAAE,EAAE,CAAC;AAC/C,YAAA,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,gBAAgB,CAAC;QAC3F;;AAEJ;AAEA,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;AAElC;AACA,MAAM,eAAe,GAAG,CAAC,MAA4E,KAAI;IACvG,QAAQ,MAAM;AACZ,QAAA,KAAK,KAAK;AACR,YAAA,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AACjC,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE;AACpD,QAAA,KAAK,UAAU;AACb,YAAA,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,WAAW,EAAE;AACpD,QAAA,KAAK,WAAW;YACd,OAAO,IAAI,IAAI,CAAC,0BAA0B,CAAC,CAAC,WAAW,EAAE;AAC3D,QAAA,KAAK,SAAS;YACZ,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AAClC,QAAA,KAAK,SAAS;AACZ,YAAA,OAAO,YAAY;;AAEzB,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,IAAa,EAAE,EAAc,KAAoC;AAChF,IAAA,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO;AAAE,QAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE;IAElD,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,EAAE;AAAE,QAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;AAE9C,IAAA,QAAQ,EAAE,CAAC,IAAI;AACb,QAAA,KAAK,KAAK;YACR,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;AAErE,QAAA,KAAK,aAAa;YAChB,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,SAAS;AAAE,gBAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;YAC3F,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;AAE9E,QAAA,KAAK,cAAc;YACjB,IAAI,CAAC,UAAU,CAAC,MAAM;AAAE,gBAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;YAClD,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;AAEpG,QAAA,KAAK,cAAc;YACjB,IAAI,CAAC,UAAU,CAAC,MAAM;AAAE,gBAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;YAClD,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;AAEpG,QAAA,KAAK,YAAY;YACf,IAAI,CAAC,UAAU,CAAC,MAAM;AAAE,gBAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;YAClD,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;AAEvF,QAAA,KAAK,oBAAoB;YACvB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE;AAC3F,gBAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;YAC5B;YACA,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,qBAAqB,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;AAE9G,QAAA,KAAK,gBAAgB;YACnB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC;AAAE,gBAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;YAChE,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,mBAAmB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;QAElG,KAAK,kBAAkB,EAAE;YACvB,MAAM,KAAK,GAAG,qBAAqB,CAAC,UAAU,CAAC,KAAK,CAAC;AACrD,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE;YACtC,OAAO;gBACL,IAAI,EAAE,eAAe,CACnB,IAAI,EACJ,EAAE,CAAC,IAAI,EACP,gBAAgB,CAAC,UAAU,CAAC,KAAgC,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,CACzF;AACD,gBAAA,EAAE,EAAE,IAAI;aACT;QACH;;AAEJ,CAAC;AAED;;;;AAIG;MACU,2BAA2B,GAAG,CACzC,OAA8C,EAC9C,GAAY,KAC8B;IAC1C,IAAI,IAAI,GAAG,GAAG;IACd,MAAM,QAAQ,GAAa,EAAE;AAE7B,IAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;QAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;AACvC,QAAA,IAAI,GAAG,OAAO,CAAC,IAAI;QACnB,IAAI,CAAC,OAAO,CAAC,EAAE;AAAE,YAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IAC1C;AAEA,IAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE;AAClC;AAEA;;;;;AAKG;AACI,MAAM,4BAA4B,GAAG,MAAqC;AAC/E,IAAA,MAAM,IAAI,GAAG,MAAM,CAA+B,EAAE;6EAAC;IACrD,IAAI,OAAO,GAAG,CAAC;AAEf,IAAA,MAAM,GAAG,GAAG,CAAC,EAAc,KAAI;AAC7B,QAAA,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,EAAE;AACvB,YAAA,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;YAE7F;QACF;QAEA,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,EAAE,CAAA,SAAA,EAAY,EAAE,OAAO,CAAA,CAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7E,IAAA,CAAC;AAED,IAAA,MAAM,KAAK,GAAG,CAAC,EAAU,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAClG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACnC,IAAA,MAAM,KAAK,GAAG,CAAC,GAAY,KAAK,2BAA2B,CAAC,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,KAAK;AAE9E,IAAA,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE;AACjE;;ACveA,MAAM,WAAW,GAAuB;AACtC,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,QAAQ,EAAE,CAAC;AACX,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,OAAO,EAAE,CAAC;AACV,IAAA,aAAa,EAAE,CAAC;AAChB,IAAA,SAAS,EAAE,CAAC;AACZ,IAAA,iBAAiB,EAAE,KAAK;AACxB,IAAA,eAAe,EAAE,IAAI;AACrB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,cAAc,EAAE,IAAI;AACpB,IAAA,eAAe,EAAE,CAAC;AAClB,IAAA,sBAAsB,EAAE,KAAK;CAC9B;AAuID,MAAM,WAAW,GAAG,OAAO,WAAW,KAAK,UAAU,mBAAmB,IAAI,WAAW,EAAE,GAAG,IAAI;AAEhG,MAAM,YAAY,GAAG,CAAC,IAAY,KAAK,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;AAEtF,MAAM,gBAAgB,GAAG,CAAC,IAAa,KAAI;AACzC,IAAA,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS;AAAE,QAAA,OAAO,CAAC;IACjD,IAAI,OAAO,IAAI,KAAK,QAAQ;AAAE,QAAA,OAAO,YAAY,CAAC,IAAI,CAAC;AACvD,IAAA,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI;IACzE,IAAI,IAAI,YAAY,WAAW;QAAE,OAAO,IAAI,CAAC,UAAU;AACvD,IAAA,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,UAAU;AACpD,IAAA,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,IAAI,YAAY,QAAQ;AAAE,QAAA,OAAO,CAAC;AAEzE,IAAA,IAAI;QACF,OAAO,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IACjD;AAAE,IAAA,MAAM;;AAEN,QAAA,OAAO,CAAC;IACV;AACF,CAAC;AAED;AACA,MAAM,WAAW,GAAG,EAAE;AAEtB;;;;AAIG;AACH,MAAM,wBAAwB,GAAG,CAAC;AAElC,IAAI,eAAe,GAAG,wBAAwB;AAE9C;;;;;;AAMG;MACU,4BAA4B,GAAG,MAAM;AAElD;;;AAGG;AACI,MAAM,+BAA+B,GAAG,CAAC,KAAyB,KAAI;IAC3E,eAAe,GAAG,KAAK,KAAK,SAAS,GAAG,wBAAwB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACnG;AAEA;AACA,MAAM,mBAAmB,GAAG,CAAC,IAAiC,KAAI;AAChE,IAAA,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;AACrD,QAAA,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,SAAS;AAAE,YAAA,OAAO,KAAK;IACrD;IAEA,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;AAIG;AACH,MAAM,kBAAkB,GAAG,CAAC,IAAwB,KAAI;IACtD,MAAM,MAAM,GAAG,eAAe;IAC9B,IAAI,IAAI,GAAG,CAAC;AAEZ,IAAA,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;AACrD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC;AAEvB,QAAA,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC;YAAE;QACvD,IAAI,EAAE,IAAI,IAAI,MAAM;YAAE;QAEtB,IAAI,CAAC,KAAK,CAAC,GAAG;AACZ,YAAA,GAAG,GAAG;AACN,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,EAAE,GAAG,GAAG,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK;SACrF;IACH;AAEA,IAAA,OAAO,IAAI;AACb,CAAC;AAED;;;;;;AAMG;AACI,MAAM,2BAA2B,GAAG,CAAC,OAA6B,KAAyC;AAChH,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAEpE,IAAI,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,aAAa,GAAG,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;AAEvG,IAAA,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE;AAClE;AAEA;;;;;AAKG;AACI,MAAM,wBAAwB,GAAG,MAAiC;AACvE,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW;8EAAC;AACjC,IAAA,MAAM,IAAI,GAAG,MAAM,CAA8B,EAAE;6EAAC;;;IAIpD,IAAI,eAAe,GAAkB,IAAI;;;IAIzC,IAAI,OAAO,GAAkB,IAAI;IAEjC,IAAI,UAAU,GAAG,CAAC;AAElB,IAAA,MAAM,SAAS,GAAG,CAAC,GAAoC,EAAE,QAAqC,KAAI;QAChG,MAAM,QAAQ,GAAqB,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE;AAElE,QAAA,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,GAAG,QAAQ,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC3E,IAAA,CAAC;AAED;;;AAGG;AACH,IAAA,MAAM,MAAM,GAAG,CAAC,GAOf,KAAI;AACH,QAAA,MAAM,OAAO,GAAG,IAAI,EAAE;AACtB,QAAA,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC;AAE5C,QAAA,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE;AAClB,YAAA,SAAS,CACP,EAAE,GAAG,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAC9F,OAAO,CACR;YAED;QACF;AAEA,QAAA,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,KAAK,MAAM,KAAK,KAAK,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3G,IAAA,CAAC;IAED,MAAM,eAAe,GAAkD,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,KAAI;AACnG,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,MAAM,IAAI,GAAG,UAAU,GAAG,2BAA2B,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;QAEtE,eAAe,GAAG,GAAG;AACrB,QAAA,OAAO,GAAG,GAAG,IAAI,IAAI;QAErB,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AACzB,YAAA,GAAG,OAAO;AACV,YAAA,UAAU,EAAE,OAAO,CAAC,UAAU,GAAG,CAAC;AAClC,YAAA,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,UAAU,GAAG,CAAC,GAAG,CAAC,CAAC;YACjD,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC,CAAC;AACjD,YAAA,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAChF,YAAA,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,GAAG;AAChD,SAAA,CAAC,CAAC;;;AAIH,QAAA,IAAI,CAAC,UAAU;YAAE;AAEjB,QAAA,SAAS,CACP;AACE,YAAA,SAAS,EAAE,GAAG;AACd,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,MAAM,EAAE,SAAS;AACjB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,GAAG,EAAE,OAAO;AACZ,YAAA,QAAQ,EAAE,CAAC;AACX,YAAA,SAAS,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAC3B,YAAA,aAAa,EAAE,CAAC;AAChB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA,EACD,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CACpG;AACH,IAAA,CAAC;AAED,IAAA,MAAM,cAAc,GAAG,CAAC,OAA6B,KAAI;AACvD,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;AACtB,QAAA,MAAM,QAAQ,GAAG,2BAA2B,CAAC,OAAO,CAAC;AACrD,QAAA,MAAM,QAAQ,GAAG,eAAe,KAAK,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,eAAe;QAExE,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AACzB,YAAA,GAAG,OAAO;AACV,YAAA,SAAS,EAAE,OAAO,CAAC,SAAS,GAAG,CAAC;AAChC,YAAA,aAAa,EAAE,OAAO,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK;AACrD,YAAA,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,KAAK,QAAQ,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;AACzF,YAAA,cAAc,EAAE,GAAG;AACnB,YAAA,cAAc,EAAE,QAAQ;YACxB,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,QAAQ,IAAI,CAAC,CAAC;AAC1D,YAAA,sBAAsB,EAAE,KAAK;AAC9B,SAAA,CAAC,CAAC;AAEH,QAAA,MAAM,CAAC;AACL,YAAA,OAAO,EAAE,GAAG;AACZ,YAAA,MAAM,EAAE,SAAS;YACjB,aAAa,EAAE,QAAQ,CAAC,KAAK;YAC7B,QAAQ,EAAE,OAAO,CAAC,IAAI;AACtB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,KAAK,EAAE,IAAI;AACZ,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAA8C,CAAC,OAAO,KAAI;AACzE,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK;QAE5B,KAAK,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM;AACzB,YAAA,GAAG,OAAO;AACV,YAAA,MAAM,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;AAC1B,YAAA,sBAAsB,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK;AAClD,SAAA,CAAC,CAAC;AAEH,QAAA,MAAM,CAAC;AACL,YAAA,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;AACnB,YAAA,MAAM,EAAE,OAAO;AACf,YAAA,aAAa,EAAE,CAAC;AAChB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,KAAK,EAAE;AACL,kBAAE;oBACE,IAAI,EAAE,KAAK,CAAC,IAAI;AAChB,oBAAA,QAAQ,EAAE,kBAAkB,CAAC,KAAK,CAAC;AACnC,oBAAA,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK;AACrB,oBAAA,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS;AACnE;AACH,kBAAE,IAAI;AACT,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAA8C,CAAC,EAAE,OAAO,EAAE,KAAI;AAC7E,QAAA,MAAM,OAAO,GAAG,IAAI,EAAE;AACtB,QAAA,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,CAAC;AAC5C,QAAA,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;;;AAI5B,QAAA,IAAI,CAAC,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,QAAQ;YAAE;AAErC,QAAA,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;AAC1F,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,MAAM,KAAK,KAAK,OAAO,GAAG,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;AACxG,IAAA,CAAC;IAED,MAAM,KAAK,GAAG,MAAK;QACjB,eAAe,GAAG,IAAI;QACtB,OAAO,GAAG,IAAI;QACd,UAAU,GAAG,CAAC;AACd,QAAA,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACd,IAAA,CAAC;IAED,OAAO;AACL,QAAA,OAAO,EAAE,KAAK,CAAC,UAAU,EAAE;AAC3B,QAAA,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE;QACvB,KAAK;QACL,eAAe;QACf,cAAc;QACd,WAAW;QACX,WAAW;KACZ;AACH;AAEA;;;AAGG;AACI,MAAM,qBAAqB,GAAG,CACnC,OAA0D,KACpC;AACtB,IAAA,MAAM,KAAK,GAAG,EAAE,GAAG,WAAW,EAAE;AAEhC,IAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;AAC5B,QAAA,IAAI,CAAC,MAAM;YAAE;AAEb,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE;AAE9B,QAAA,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU;AACpC,QAAA,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,QAAQ;AAChC,QAAA,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;AAClC,QAAA,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;AAC5B,QAAA,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO;AAC9B,QAAA,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,aAAa;AAC1C,QAAA,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS;AAClC,QAAA,KAAK,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe;QAC9C,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,iBAAiB;AAE5E,QAAA,IACE,KAAK,CAAC,eAAe,KAAK,IAAI;AAC9B,aAAC,KAAK,CAAC,eAAe,KAAK,IAAI,IAAI,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe,CAAC,EACjF;AACA,YAAA,KAAK,CAAC,eAAe,GAAG,KAAK,CAAC,eAAe;QAC/C;AAEA,QAAA,IACE,KAAK,CAAC,cAAc,KAAK,IAAI;AAC7B,aAAC,KAAK,CAAC,cAAc,KAAK,IAAI,IAAI,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc,CAAC,EAC9E;AACA,YAAA,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;AAC3C,YAAA,KAAK,CAAC,cAAc,GAAG,KAAK,CAAC,cAAc;QAC7C;IACF;AAEA,IAAA,OAAO,KAAK;AACd;;ACjhBA;;;AAGG;AACI,MAAM,6BAA6B,GAAG;AAE7C,MAAM,MAAM,GACV,CAAI,KAAQ,KACZ,MACE,KAAK;AAET,MAAM,IAAI,GAAG,MAAM,SAAS;AAE5B;;;AAGG;AACH,MAAM,IAAI,GAAG,CAAI,GAAY,EAAE,QAAW,KAAO;AAC/C,IAAA,IAAI;QACF,OAAO,GAAG,EAAE;IACd;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,QAAQ;IACjB;AACF,CAAC;AAkCD;;;;;;;;;AASG;AACI,MAAM,2BAA2B,GAAG,CAAC,MAAe,KAAa;IACtE,MAAM,KAAK,GAAG,MAA0B;AAExC,IAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,MAAM;AAEtD,IAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,IAAI,CAAC;IAE9D,MAAM,OAAO,GAAG;AACd,UAAE;YACE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;AACf,YAAA,OAAO,EAAE,MAAM,KAAK;AACpB,YAAA,OAAO,EAAE,MAAM,KAAK;AACpB,YAAA,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;AACtB,YAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;AACrB,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACrD,YAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC3D,YAAA,YAAY,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACnE,YAAA,SAAS,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC7D,YAAA,MAAM,EAAE;AACN,gBAAA,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC;gBACxB,QAAQ,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;gBAC/D,cAAc,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC9E,cAAc,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;gBACnF,uBAAuB,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;gBAChG,sBAAsB,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC/F,aAAA;AACF;UACD,IAAI;IAER,OAAO;AACL,QAAA,EAAE,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAChD,QAAA,IAAI,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACpD,QAAA,QAAQ,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC5D,QAAA,KAAK,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AACtD,QAAA,eAAe,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,eAAe,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAC1E,QAAA,kBAAkB,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,kBAAkB,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAChF,QAAA,WAAW,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;AAClE,QAAA,cAAc,EAAE,IAAI,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;;AAExE,QAAA,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC;AACrB,QAAA,OAAO,EAAE,MAAM,KAAK;AACpB,QAAA,KAAK,EAAE,IAAI;AACX,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;AACxB,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,QAAQ,EAAE,IAAI;AACf,SAAA;KACF;AACH;AAEA;;;;;;;AAOG;MACU,WAAW,GAAG,CAAC,KAAyB,EAAE,WAAmB,KAAwB;AAChG,IAAA,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI;IAEjD,OAAO;QACL,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI;AACJ,QAAA,MAAM,EAAE,2BAA2B,CAAC,KAAK,CAAC,MAAM,CAAC;QACjD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW;QACX,KAAK,EAAE,KAAK,CAAC,KAAK;KACnB;AACH;;AC7HA,MAAM,OAAO,mBAAmB,MAAM,CAAuB,EAAE;4EAAC;AAEhE;;AAEG;AACI,MAAM,oBAAoB,mBAAiD,OAAO,CAAC,UAAU;AAEpG;AACA;AACA;AACA,MAAM,UAAU,mBAAmB,IAAI,GAAG,EAAkB;AAE5D,MAAM,YAAY,GAAG,CAAC,KAAgD,KAAI;AACxE,IAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK;IAE5B,IAAI,IAAI,KAAK,OAAO;AAAE,QAAA,OAAO,SAAS,IAAI,CAAC,UAAU,IAAI,EAAE,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE;IACtG,IAAI,IAAI,KAAK,eAAe;AAAE,QAAA,OAAO,iBAAiB,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;IACvE,IAAI,IAAI,KAAK,WAAW;AAAE,QAAA,OAAO,aAAa,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;IAC/D,IAAI,IAAI,KAAK,YAAY;AAAE,QAAA,OAAO,cAAc,IAAI,CAAC,IAAI,IAAI,EAAE,EAAE;AAEjE,IAAA,OAAO,IAAI;AACb,CAAC;AAED;;;AAGG;AACH,MAAM,YAAY,GAAG,QAAQ;AAE7B;;;;AAIG;AACH,MAAM,aAAa,GAAG,MACpB,IAAI,KAAK,CACP,EAAE,EACF;IACE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,MAAM,OAAO,IAAI,KAAK,QAAQ,GAAG,CAAA,EAAG,YAAY,CAAA,EAAG,IAAI,CAAA,EAAG,YAAY,CAAA,CAAE,GAAG,SAAS,CAAC;AACnG,CAAA,CACF;AAEH;AACA,MAAM,kBAAkB,GAAG,CAAC,QAAgB,KAC1C;KACG,KAAK,CAAC,YAAY;;AAElB,KAAA,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,MAA8B,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;AAC7F,KAAA,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;AAEvC;;;;AAIG;AACI,MAAM,eAAe,GAAG,CAAC,KAAc,KAA8B;AAC1E,IAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;AAAE,QAAA,OAAO,EAAE;AAEpD,IAAA,IAAI;AACF,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;YAC/B,OAAO,kBAAkB,CAAE,KAAmC,CAAC,aAAa,EAAE,CAAC,CAAC;QAClF;AAEA,QAAA,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/C;AAAE,IAAA,MAAM;QACN,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,KAAK,KAAK,UAAU,GAAG,iBAAiB,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACjG;AACF;AAEA;AACO,MAAM,wBAAwB,GAAG,CAAC,KAA+B,KACtE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,KAAK,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;AAE1E;;;;AAIG;AACI,MAAM,kBAAkB,GAAG,CAAC,MAAkC,KAAI;AACvE,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK;IAC1B,MAAM,IAAI,GAAG,KAAK,EAAE,QAAQ,IAAI,IAAI,EAAE;AAEtC,IAAA,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,SAAS;AACrF;AAEA;;;;AAIG;AACI,MAAM,yBAAyB,GAAG,CAAC,GAAwB,KAAI;IACpE,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;AAEpC,IAAA,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,IAAI,SAAS;AAC5F;AAEA;;;AAGG;AACH,MAAM,aAAa,GAAG,CAAC,YAAuC,KAAkB;IAC9E,MAAM,IAAI,GAAG,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE;AAErC,IAAA,IAAI,YAAY,CAAC,KAAK,KAAK,SAAS,EAAE;QACpC,IAAI,CAAC,UAAU,GAAG,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC;QACrD,IAAI,CAAC,KAAK,GAAG,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC;IACxD;IAEA,IAAI,YAAY,CAAC,SAAS;QAAE,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC,YAAY,CAAC,SAAS,CAAC;AAExF,IAAA,IAAI,YAAY,CAAC,eAAe,EAAE;AAChC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,IAAI,CAAC,gBAAgB,GAAG,yBAAyB,CAAC,YAAY,CAAC,eAAe,CAAC;IACjF;AAEA,IAAA,IAAI,YAAY,CAAC,WAAW,EAAE;AAC5B,QAAA,IAAI,CAAC,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM;AAC9D,YAAA,GAAG,SAAS;YACZ,KAAK,EAAE,wBAAwB,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAClE,SAAA,CAAC,CAAC;IACL;AAEA,IAAA,IAAI,EAAE,GAAG,YAAY,CAAC,EAAE;IAExB,IAAI,CAAC,EAAE,EAAE;AACP,QAAA,MAAM,UAAU,GAAG,YAAY,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC;QAClE,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAC3C,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,CAAC;AACnC,QAAA,EAAE,GAAG,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,GAAG,EAAE;IAC7B;AAEA,IAAA,MAAM,SAAS,GAAuB;QACpC,EAAE;QACF,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,IAAI;AACJ,QAAA,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,SAAS,EAAE,YAAY,CAAC,SAAS;QACjC,SAAS,EAAE,YAAY,CAAC,SAAS;KAClC;;AAGD,IAAA,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAE7F,OAAO,MACL,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AACtB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,EAAE,CAAC;QAE1D,IAAI,KAAK,KAAK,CAAC,CAAC;AAAE,YAAA,OAAO,IAAI;AAE7B,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;;;AAIzB,QAAA,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;AAC9B,YAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAErB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;AAEhD,QAAA,OAAO,aAAa,CAAC,IAAI,CAAC;AAC5B,IAAA,CAAC,CAAC;AACN,CAAC;AAED;AACA,MAAM,aAAa,GAAG,CAAC,IAA0B,KAAI;AACnD,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,6BAA6B;IAEvF,IAAI,MAAM,IAAI,CAAC;AAAE,QAAA,OAAO,IAAI;AAE5B,IAAA,MAAM,MAAM,GAAG,IAAI,GAAG,CACpB;SACG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW;SAC3B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC;AAC1D,SAAA,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CACpB;AAED,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED;;;AAGG;AACI,MAAM,4BAA4B,GAAG,CAAC,GAAsB,KAAI;AACrE,IAAA,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI;AAExC,IAAA,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,KAAK,MAAM,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AACtG;AAWA;;;;;;;;;;;;;;AAcG;AACI,MAAM,oBAAoB,GAAG,CAAC,OAA8B,KAA0B;AAC3F,IAAA,+BAA+B,CAAC,OAAO,EAAE,eAAe,CAAC;IACzD,yBAAyB,CAAC,aAAa,CAAC;IACxC,4BAA4B,CAAC,wBAAwB,CAAC;IACtD,gCAAgC,CAAC,4BAA4B,CAAC;IAC9D,gCAAgC,CAAC,4BAA4B,CAAC;IAC9D,6BAA6B,CAAC,mCAAmC,CAAC;AAElE,IAAA,IAAI,CAAC,SAAS,EAAE,EAAE;AAChB,QAAA,OAAO,CAAC,IAAI,CACV,+IAA+I,CAChJ;IACH;AAEA,IAAA,OAAO,wBAAwB,CAAC,EAAE,CAAC;AACrC;;ACxPA,MAAM,SAAS,GAAG,6CAA6C;AAUxD,MAAM,YAAY,GAAG,CAAC,GAAsB,KAAoB;IACrE,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG;IAE7D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC;IAE1C,OAAO,CAAC,SAAqD,KAAyB;AACpF,QAAA,MAAM,IAAI,GAAwB,EAAE,KAAK,EAAE,aAAa,EAAE;QAE1D,IAAI,SAAS,EAAE;YACb,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;QAC/C;AAEA,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE;AACvB,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,CAAC,CAAC;YAC7B,IAAI,aAAa,EAAE;AACjB,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,aAAa;YACvC;QACF;AAEA,QAAA,IAAI,CAAC,SAAS,EAAE,EAAE;;AAEhB,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE;QACrD;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AACH;AAIO,MAAM,GAAG,GAAG,CAAC,OAA6B,EAAE,GAAG,MAAiB,KAAS;AAC9E,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,KAAI;AACzC,QAAA,OAAO,GAAG,GAAG,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC,EAAE,EAAE,CAAC;AACN,IAAA,OAAO,GAAU;AACnB;;ACpBO,MAAM,kBAAkB,GAAG,CAChC,cAAmD,KACpB;AAC/B,IAAA,MAAM,YAAY,GAAG,sBAAsB,EAAE;AAC7C,IAAA,MAAM,eAAe,GAAG,8BAA8B,EAAE;AAExD,IAAA,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC;AAEvE,IAAA,MAAM,IAAI,GAAG,CAAC,WAAqC,KAAI;QACrD,eAAe,CAAC,KAAK,EAAE;AAEvB,QAAA,MAAM,EAAE,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,WAAW,IAAI,EAAE;QAEzE,MAAM,KAAK,GAAG,YAAY,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC;QACjE,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;AAEtC,QAAA,IAAI,IAAI,EAAE,WAAW,IAAI,cAAc,CAAC,gBAAgB,CAAC,SAAS,KAAK,KAAK,EAAE;YAC5E,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;QACnD;AAEA,QAAA,MAAM,YAAY,GAAG,IAAI,IAAK,EAAyB;QAEvD,IAAI,cAAc,CAAC,gBAAgB,CAAC,SAAS,KAAK,KAAK,EAAE;AACvD,YAAA,YAAY,CAAC,WAAW,GAAG,SAAS;QACtC;aAAO;AACL,YAAA,YAAY,CAAC,IAAI,GAAG,SAAS;QAC/B;AAEA,QAAA,MAAM,cAAc,GAAqC;AACvD,YAAA,OAAO,EAAE;AACP,gBAAA,IAAI,cAAc,CAAC,OAAO,IAAI,EAAE,CAAC;AACjC,gBAAA,MAAM,EAAE;oBACN,IAAI,cAAc,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC;AACzC,oBAAA,uBAAuB,EACrB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,uBAAuB;AACvD,wBAAA,cAAc,CAAC,gBAAgB,CAAC,MAAM,KAAK,OAAO;AACrD,iBAAA;AACF,aAAA;AACD,YAAA,gBAAgB,EAAE;AAChB,gBAAA,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,MAAM;AAC9C,gBAAA,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,SAAS;gBACjD,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAqB;AACjE,aAAA;YACD,IAAI,EAAE,cAAc,CAAC,IAAI;YACzB,WAAW,EAAE,cAAc,CAAC,WAAW;YACvC,KAAK,EAAE,cAAc,CAAC,KAAK;SAC5B;AAED,QAAA,YAAY,CAAC;AACX,YAAA,cAAc,EAAE,cAAc;YAC9B,YAAY;AACZ,YAAA,IAAI,EAAE,YAAY;YAClB,OAAO;AACP,YAAA,aAAa,EAAE,cAAc,CAAC,gBAAgB,CAAC,MAAM,KAAK,OAAO;AAClE,SAAA,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK;IAErB,IAAI,CAAC,sBAAsB,CAAC,GAAG,YAAY,CAAC,WAAW,CAAC,UAAU,EAAE;AAEpE,IAAA,OAAO,IAAI;AACb;;ACnEO,MAAM,cAAc,GAAG,CAA6B,OAAqC,KAC9F,eAAe,CAAC;IACd,OAAO,EAAE,OAAO,CAAC,OAAO;IACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;IAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;AAChC,IAAA,cAAc,EAAE,kBAAkB;AACnC,CAAA;;ACOI,MAAM,qBAAqB,GAAG,CACnC,OAAwD,EACxD,SAA+C,KAE/C,sBAAsB,CAAC;AACrB,IAAA,OAAO,EAAE;AACP,QAAA,GAAG,OAAO;;QAEV,iBAAiB,EACf,OAAO,EAAE,iBAAiB;aACzB,CAAC,WAAoB,KAAI;gBACxB,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,MAAM,IAAI,WAAW,EAAE;oBAC3E,OAAQ,WAAiC,CAAC,IAAI;gBAChD;gBAEA,MAAM,gCAAgC,EAAE;AAC1C,YAAA,CAAC,CAAC;AAC+B,KAAA;IACrC,SAAS;AACT,IAAA,YAAY,EAAE,cAAc;AAC7B,CAAA;;AC/BI,MAAM,wBAAwB,GAAG,CACtC,cAAyD,KAC1B;IAC/B,MAAM,YAAY,GAAG,cAAc,CAAC,gBAAgB,CAAC,YAAY,CAAC,MAAM,EAAE;AAE1E,IAAA,OAAO,0BAA0B,CAAC;QAChC,YAAY;QACZ,IAAI,EAAE,cAAc,CAAC,IAAI;QACzB,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,YAAY,EACV,yBAAyB,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,CAAC;AACjE,YAAA,CAAC,cAAc,CAAC,WAAW,CAAC,mBAAmB;QACjD,oBAAoB,EAAE,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,KAAI;YACpE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,WAAW,IAAI,EAAE;YAEvD,MAAM,KAAK,GAAG,YAAY,CAAC,cAAc,CAAC,gBAAgB,CAAC,KAAK,CAAC;YACjE,IAAI,SAAS,GAAG,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC;AAEtC,YAAA,IAAI,IAAI,EAAE,WAAW,IAAI,cAAc,CAAC,gBAAgB,CAAC,SAAS,KAAK,KAAK,EAAE;gBAC5E,SAAS,GAAG,EAAE,GAAG,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;YACnD;AAEA,YAAA,MAAM,YAAY,GAAG,EAAE,IAAI,IAAI,IAAK,EAAyB,CAAC,EAAE,OAAO,EAAE;YAEzE,IAAI,cAAc,CAAC,gBAAgB,CAAC,SAAS,KAAK,KAAK,EAAE;AACvD,gBAAA,YAAY,CAAC,WAAW,GAAG,SAAS;YACtC;iBAAO;AACL,gBAAA,YAAY,CAAC,IAAI,GAAG,SAAS;YAC/B;AAEA,YAAA,MAAM,cAAc,GAAqC;AACvD,gBAAA,GAAG,cAAc;AACjB,gBAAA,gBAAgB,EAAE;AAChB,oBAAA,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,MAAM;AAC9C,oBAAA,MAAM,EAAE,cAAc,CAAC,gBAAgB,CAAC,MAAM,KAAK,OAAO,GAAG,KAAK,GAAG,MAAM;oBAC3E,KAAK,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAqB;AACjE,iBAAA;aACF;AAED,YAAA,YAAY,CAAC;AACX,gBAAA,cAAc,EAAE,cAAc;gBAC9B,YAAY;AACZ,gBAAA,IAAI,EAAE,YAAY;AAClB,gBAAA,OAAO,EAAE,UAAU;AACnB,gBAAA,QAAQ,EAAE,IAAI;AACf,aAAA,CAAC;QACJ,CAAC;AACF,KAAA,CAAC;AACJ;;AC7DO,MAAM,oBAAoB,GAAG,CAA6B,OAA2C,KAC1G,eAAe,CAAC;IACd,OAAO,EAAE,OAAO,CAAC,OAAO;IACxB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;IAC1C,QAAQ,EAAE,OAAO,CAAC,QAAQ;IAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;AAChC,IAAA,cAAc,EAAE,wBAAwB;AACzC,CAAA;;ACLI,MAAM,2BAA2B,GAAG,CACzC,OAAwD,EACxD,SAAqD,KAErD,sBAAsB,CAAC;AACrB,IAAA,OAAO,EAAE;AACP,QAAA,GAAG,OAAO;;QAEV,iBAAiB,EACf,OAAO,EAAE,iBAAiB;aACzB,CAAC,WAAoB,KAAI;gBACxB,IAAI,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,MAAM,IAAI,WAAW,EAAE;oBAC3E,OAAQ,WAAiC,CAAC,IAAI;gBAChD;AACA,gBAAA,OAAO,WAAW;AACpB,YAAA,CAAC,CAAC;AACL,KAAA;IACD,SAAS;AACT,IAAA,YAAY,EAAE,oBAAoB;AACnC,CAAA;;ACrBH,MAAM,wBAAwB,GAAG,CAAC,MAAsB,EAAE,SAA4B,KAAI;IACxF,OAAO,CAAC,MAAkC,KAAI;QAC5C,OAAO,CAA6B,KAAU,EAAE,cAAoD,KAClG,qBAAqB,CAAQ,cAAc,EAAE;YAC3C,MAAM;YACN,MAAM;YACN,SAAS;YACT,KAAK;AACN,SAAA,CAAC;AACN,IAAA,CAAC;AACH,CAAC;AAED,MAAM,8BAA8B,GAAG,CAAC,MAAsB,EAAE,SAA4B,KAAI;AAC9F,IAAA,OAAO,CAAC,MAAkC,EAAE,YAA+C,KAAI;QAC7F,OAAO,CAA6B,KAAU,EAAE,cAAoD,KAClG,2BAA2B,CAAQ,cAAc,EAAE;YACjD,MAAM;YACN,MAAM;YACN,SAAS;YACT,KAAK;YACL,YAAY;AACb,SAAA,CAAC;AACN,IAAA,CAAC;AACH,CAAC;AAED;AACO,MAAM,oBAAoB,mBAAmB,wBAAwB,CAAC,OAAO,EAAE,KAAK;AAE3F;AACO,MAAM,0BAA0B,mBAAmB,8BAA8B,CAAC,OAAO,EAAE,KAAK;AAEvG;AACO,MAAM,qBAAqB,mBAAmB,wBAAwB,CAAC,OAAO,EAAE,MAAM;AAE7F;AACO,MAAM,2BAA2B,mBAAmB,8BAA8B,CAAC,OAAO,EAAE,MAAM;AAEzG;AACO,MAAM,uBAAuB,mBAAmB,wBAAwB,CAAC,QAAQ,EAAE,KAAK;AAE/F;AACO,MAAM,6BAA6B,mBAAmB,8BAA8B,CAAC,QAAQ,EAAE,KAAK;AAE3G;AACO,MAAM,wBAAwB,mBAAmB,wBAAwB,CAAC,QAAQ,EAAE,MAAM;AAEjG;AACO,MAAM,8BAA8B,mBAAmB,8BAA8B,CAAC,QAAQ,EAAE,MAAM;;ACzD7G;;AAEG;MACU,wBAAwB,CAAA;AACnC,IAAA,WAAA,CAAmB,OAAuC,EAAA;QAAvC,IAAA,CAAA,OAAO,GAAP,OAAO;IAAmC;AAC7D,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IACpD;IAEA,OAAO,GAAA;;IAEP;AACD;;ACZD;;AAEG;MACU,iBAAiB,CAAA;AAC5B,IAAA,WAAA,CAAmB,OAAgC,EAAA;QAAhC,IAAA,CAAA,OAAO,GAAP,OAAO;IAA4B;AACtD,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,EAAE,aAAa,EAAE,CAAA,MAAA,EAAS,IAAI,CAAC,eAAe,CAAA,CAAE,EAAE;IAC3D;IAEA,OAAO,GAAA;;IAEP;AAEA,IAAA,IAAY,eAAe,GAAA;AACzB,QAAA,OAAO,IAAI,CAAC,CAAA,EAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA,CAAA,EAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAA,CAAE,CAAC;IAClE;AACD;;ACPD;;AAEG;AACI,MAAM,cAAc,GAAG,CAAc,KAAc,KACxD,KAAK,YAAY,MAAM,IAAI,QAAQ,IAAI,KAAK,IAAI,YAAY,IAAI,KAAK,IAAI,KAAK,IAAI;AAEpF;;AAEG;AACI,MAAM,yBAAyB,GAAG,CAAC,OAAuB,KAAI;AACnE,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;AAC7C,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC;AAC1B,IAAA,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;;IAGlC,IAAI,SAAS,GAAkB,IAAI;IACnC,IAAI,MAAM,GAAkB,IAAI;AAEhC,IAAA,IAAI,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE;AACtC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE;QACrC,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAE3C,IAAI,CAAC,EAAE;AACL,YAAA,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;QACtB;IACF;AAAO,SAAA,IAAI,YAAY,EAAE,QAAQ,CAAC,UAAU,CAAC,EAAE;QAC7C,MAAM,CAAC,GAAG,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QAE5C,IAAI,CAAC,EAAE;AACL,YAAA,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC;QACtB;IACF;AAEA,IAAA,IAAI,MAAM,IAAI,GAAG,EAAE;AACjB,QAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC;AAEhC,QAAA,SAAS,GAAG,MAAM,GAAG,UAAU;IACjC;SAAO,IAAI,MAAM,EAAE;AACjB,QAAA,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;IACzB;SAAO,IAAI,OAAO,EAAE;;;AAGlB,QAAA,IAAI,OAAO,KAAK,IAAI,EAAE;YACpB,SAAS,GAAG,IAAI;QAClB;aAAO;AACL,YAAA,MAAM,WAAW,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC;;AAGrC,YAAA,IAAI,WAAW,CAAC,QAAQ,EAAE,KAAK,cAAc,EAAE;AAC7C,gBAAA,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;YACrE;QACF;IACF;AAEA,IAAA,OAAO,SAAS;AAClB;AAEA;;AAEG;AACI,MAAM,aAAa,GAAG,CAAC,IAAa,KAAqE;IAC9G,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,SAAS,EAAE;AACvC,QAAA,OAAO,IAAI;IACb;IAEA,IACE,IAAI,YAAY,WAAW;AAC3B,QAAA,IAAI,YAAY,IAAI;AACpB,QAAA,IAAI,YAAY,QAAQ;AACxB,QAAA,IAAI,YAAY,eAAe;AAC/B,QAAA,OAAO,IAAI,KAAK,QAAQ,EACxB;AACA,QAAA,OAAO,IAAgE;IACzE;AAEA,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAChF,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;IAC7B;;AAGA,IAAA,OAAQ,IAAY,CAAC,QAAQ,EAAE;AACjC;AAEA;;AAEG;AACI,MAAM,eAAe,GAAG,CAAC,MAAwD,KAAI;AAC1F,IAAA,IAAI,MAAM,CAAC,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE;AACnE,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AACvB,YAAA,OAAO,MAAM;QACf;QAEA,OAAO,MAAM,CAAC,WAAW;IAC3B;IAEA,OAAO,MAAM,CAAC,MAAM;AACtB;AAEA;;AAEG;AACI,MAAM,uBAAuB,GAAG,CAAC,IAAa,KAAI;;AAEvD,IAAA,IAAI,IAAI,KAAK,IAAI,EAAE;AACjB,QAAA,OAAO,IAAI;IACb;;AAEA,IAAA,IAAI,IAAI,YAAY,QAAQ,EAAE;AAC5B,QAAA,OAAO,IAAI;IACb;;;AAGA,IAAA,IAAI,IAAI,YAAY,IAAI,EAAE;AACxB,QAAA,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI;IAC1B;;AAEA,IAAA,IAAI,IAAI,YAAY,WAAW,EAAE;AAC/B,QAAA,OAAO,IAAI;IACb;;;AAGA,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;AAC5B,QAAA,OAAO,YAAY;IACrB;;AAGA,IAAA,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE;AACrF,QAAA,OAAO,kBAAkB;IAC3B;;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;MACU,SAAS,GAAG,CAAC,OAAuB,EAAE,MAAc,KAAI;IACnE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC;AACvF;AAEA;;AAEG;MACU,aAAa,GAAG,CAAC,OAAuB,EAAE,QAA8C,KAAI;AACvG,IAAA,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AAC/C,QAAA,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;AACtB,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACI,MAAM,0BAA0B,GAAG,CAAC,GAAmB,KAAI;AAChE,IAAA,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,EAAE;IAC3C,MAAM,aAAa,GAAmB,EAAE;IAExC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AAC/B,QAAA,IAAI,KAAK,GAAG,CAAC,EAAE;YACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AACjC,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE;AAC9B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE;AAE1C,YAAA,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK;QAC5B;IACF;AAEA,IAAA,OAAO,aAAa;AACtB;AAEA;;AAEG;AACI,MAAM,cAAc,GAAG,CAAC,GAAmB,KAAmB;IACnE,IAAI,aAAa,IAAI,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE;QAC3C,OAAO,GAAG,CAAC,WAAW;IACxB;IACA,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC,EAAE;AACxD,QAAA,OAAO,GAAG,CAAC,iBAAiB,CAAC,eAAe,CAAC;IAC/C;AACA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACI,MAAM,oBAAoB,GAAmB,CAAC,MAAM,KAAI;IAC7D,MAAM,iBAAiB,GAAG,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,iBAAiB;AAEhE,IAAA,IAAI,MAAM,CAAC,iBAAiB,GAAG,CAAC,EAAE;AAChC,QAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;IACzB;IAEA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;AACjC,QAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;IACzB;IAEA,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK;;AAGvC,IAAA,IAAI,MAAM,IAAI,GAAG,EAAE;;AAEjB,QAAA,IAAI,kCAAkC,CAAC,MAAM,CAAC,EAAE;AAC9C,YAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;QACzB;QAEA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD;;IAGA,IAAI,MAAM,KAAK,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE;QACpC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD;;AAGA,IAAA,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,QAAA,MAAM,UAAU,GACd,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;AAC7B,YAAA,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC;AAC7B,YAAA,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;AAC/B,YAAA,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;QAEjC,IAAI,UAAU,EAAE;YACd,MAAM,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,GAAG,IAAI;YAEzC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,iBAAiB,GAAG,KAAK,EAAE;QAChF;QAEA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD;;;AAIA,IAAA,IAAK,MAAiB,KAAK,CAAC,EAAE;QAC5B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAClD;AAEA,IAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;AACzB;;AC7OA,MAAM,WAAW,GAAG,cAAc;AAElC;;AAEG;AACI,MAAM,OAAO,GAAG,CAAqB,MAAqB,KAAwC;AACvG,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE;AACpC,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM;AAClD,IAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,IAAI;AAChC,IAAA,MAAM,GAAG,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;AACpD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,oBAAoB;IACtD,IAAI,iBAAiB,GAAG,CAAC;IACzB,IAAI,YAAY,GAAkB,IAAI;AAEtC,IAAA,OAAO,IAAI,UAAU,CAAC,CAAC,QAA0C,KAAI;AACnE,QAAA,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE;AAChC,QAAA,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAK;YACpB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC;AAC7C,YAAA,IAAI,MAAM,CAAC,eAAe,EAAE;AAC1B,gBAAA,GAAG,CAAC,eAAe,GAAG,IAAI;YAC5B;AAEA,YAAA,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAE1E,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;AACjC,gBAAA,GAAG,CAAC,gBAAgB,CAAC,QAAQ,EAAE,mCAAmC,CAAC;YACrE;YAEA,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE;AACvC,gBAAA,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,CAAC;gBAElD,IAAI,YAAY,EAAE;AAChB,oBAAA,GAAG,CAAC,gBAAgB,CAAC,cAAc,EAAE,YAAY,CAAC;gBACpD;YACF;AAEA,YAAA,GAAG,CAAC,YAAY,GAAG,YAAY,KAAK,MAAM,GAAG,YAAY,GAAG,MAAM;AACpE,QAAA,CAAC;AAED,QAAA,QAAQ,EAAE;QAEV,MAAM,cAAc,GAAG,MAAsB;AAC3C,YAAA,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,IAAI,IAAI;AACzC,YAAA,MAAM,OAAO,GAAG,0BAA0B,CAAC,GAAG,CAAC;YAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,GAAG;AAEvC,YAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE;AAC/D,QAAA,CAAC;AAED,QAAA,MAAM,WAAW,GAAG,CAAC,KAAmB,KAAI;AAC1C,YAAA,MAAM,aAAa,GAAG,iBAAiB,GAAG,CAAC;AAC3C,YAAA,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE;AACpC,YAAA,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,EAAE,iBAAiB,EAAE,aAAa,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAEtF,IAAI,CAAC,KAAK,EAAE;AACV,gBAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBAClD,QAAQ,CAAC,QAAQ,EAAE;gBAEnB;YACF;AAEA,YAAA,MAAM,MAAM,GAAG,KAAK,IAAI,IAAI;AAC5B,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;AAE/F,YAAA,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,MAAK;AACpC,gBAAA,QAAQ,EAAE;AACV,gBAAA,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBACjB,iBAAiB,GAAG,aAAa;gBACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;YAC9G,CAAC,EAAE,MAAM,CAAC;AACZ,QAAA,CAAC;AAED,QAAA,MAAM,MAAM,GAAG,YAAW;YACxB,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE;AAErD,YAAA,IAAI,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE;YAEjC,IAAI,IAAI,GAAmB,IAAI;AAE/B,YAAA,IAAI,MAAM,KAAK,GAAG,EAAE;AAClB,gBAAA,IAAI,GAAG,OAAO,GAAG,CAAC,QAAQ,KAAK,WAAW,GAAG,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,QAAQ;YAC9E;AAEA,YAAA,IAAI,MAAM,KAAK,CAAC,EAAE;gBAChB,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,CAAC;YACzB;YAEA,IAAI,EAAE,GAAG,MAAM,IAAI,GAAG,IAAI,MAAM,GAAG,GAAG;YAEtC,IAAI,YAAY,KAAK,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;gBACvD,MAAM,YAAY,GAAG,IAAI;gBACzB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;AACpC,gBAAA,IAAI;AACF,oBAAA,IAAI,GAAG,IAAI,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,GAAG,IAAI;gBACxD;gBAAE,OAAO,KAAK,EAAE;oBACd,IAAI,GAAG,YAAY;oBAEnB,IAAI,EAAE,EAAE;wBACN,EAAE,GAAG,KAAK;wBACV,IAAI,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE;oBAC9B;gBACF;YACF;AAAO,iBAAA,IAAI,CAAC,EAAE,IAAI,IAAI,YAAY,IAAI,EAAE;AACtC,gBAAA,IAAI;AACF,oBAAA,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE;AAE9B,oBAAA,IAAI,IAAI,CAAC,IAAI,KAAK,kBAAkB,EAAE;AACpC,wBAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;oBACzB;yBAAO;wBACL,IAAI,GAAG,IAAI;oBACb;gBACF;AAAE,gBAAA,MAAM;;gBAER;YACF;YAEA,IAAI,EAAE,EAAE;AACN,gBAAA,MAAM,YAAY,GAA2B;AAC3C,oBAAA,IAAI,EAAE,SAAS;oBACf,OAAO;AACP,oBAAA,QAAQ,EAAE,IAAgB;iBAC3B;AAED,gBAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,YAAY,GAAG,OAAO,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC;AAC7F,gBAAA,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,gBAAgB,CAAC;gBAEtE,IAAI,kBAAkB,EAAE;AACtB,oBAAA,YAAY,CAAC,kBAAkB,GAAG,kBAAkB;gBACtD;AAEA,gBAAA,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;gBAE3B,QAAQ,CAAC,QAAQ,EAAE;YACrB;iBAAO;AACL,gBAAA,WAAW,CAAC;oBACV,GAAG;AACH,oBAAA,MAAM,EAAE,IAAI;oBACZ,MAAM;oBACN,UAAU;oBACV,iBAAiB,EAAE,IAAI,iBAAiB,CAAC;AACvC,wBAAA,KAAK,EAAE,IAAI;wBACX,MAAM;wBACN,UAAU;wBACV,GAAG;qBACJ,CAAC;AACH,iBAAA,CAAC;YACJ;AACF,QAAA,CAAC;AAED,QAAA,MAAM,OAAO,GAAG,CAAC,KAAY,KAAI;AAC/B,YAAA,MAAM,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE;AAEhC,YAAA,WAAW,CAAC;gBACV,GAAG;AACH,gBAAA,MAAM,EAAE,KAAK;AACb,gBAAA,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC;AACvB,gBAAA,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,eAAe;gBAC7C,iBAAiB,EAAE,IAAI,iBAAiB,CAAC;AACvC,oBAAA,KAAK,EAAE,KAAK;AACZ,oBAAA,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,CAAC;AACvB,oBAAA,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,eAAe;oBAC7C,GAAG;iBACJ,CAAC;AACH,aAAA,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,cAAc,GAAG,CAAC,KAAoB,KAAI;AAC9C,YAAA,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE;AAEpC,YAAA,MAAM,QAAQ,GAAiB;AAC7B,gBAAA,IAAI,EAAE,mBAAmB;gBACzB,OAAO;AACP,gBAAA,QAAQ,EAAE;oBACR,OAAO,EAAE,KAAK,CAAC,MAAM;AACtB,iBAAA;aACF;AAED,YAAA,IAAI,KAAK,CAAC,gBAAgB,EAAE;AAC1B,gBAAA,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG;AAC1D,gBAAA,QAAQ,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,GAAG;gBACtE,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;YACvC;YAEA,IAAI,YAAY,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,YAAY,EAAE;AACjD,gBAAA,QAAQ,CAAC,WAAW,GAAG,GAAG,CAAC,YAAY;YACzC;AAEA,YAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;AACzB,QAAA,CAAC;AAED,QAAA,MAAM,YAAY,GAAG,CAAC,KAAoB,KAAI;AAC5C,YAAA,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE;AAEpC,YAAA,MAAM,QAAQ,GAAiB;AAC7B,gBAAA,IAAI,EAAE,iBAAiB;gBACvB,OAAO;AACP,gBAAA,QAAQ,EAAE;oBACR,OAAO,EAAE,KAAK,CAAC,MAAM;AACtB,iBAAA;aACF;AAED,YAAA,IAAI,KAAK,CAAC,gBAAgB,EAAE;AAC1B,gBAAA,MAAM,eAAe,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,GAAG;AAC1D,gBAAA,QAAQ,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,GAAG;gBACtE,QAAQ,CAAC,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;YACvC;AAEA,YAAA,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;AACzB,QAAA,CAAC;AAED,QAAA,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC;AACpC,QAAA,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;AACtC,QAAA,GAAG,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC;AACxC,QAAA,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC;AAEtC,QAAA,IAAI,MAAM,CAAC,cAAc,EAAE;AACzB,YAAA,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC;YAEhD,IAAI,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE;gBAClC,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,CAAC;YACvD;QACF;AAEA,QAAA,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QACjB,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAEzC,QAAA,OAAO,MAAK;AACV,YAAA,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;AACzC,YAAA,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC;AACzC,YAAA,GAAG,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC;AACvC,YAAA,GAAG,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC;YAE3C,IAAI,YAAY,EAAE;AAChB,gBAAA,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC;YACnC;AAEA,YAAA,IAAI,MAAM,CAAC,cAAc,EAAE;AACzB,gBAAA,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC;gBAEnD,IAAI,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,EAAE;oBAClC,GAAG,CAAC,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,YAAY,CAAC;gBAC1D;YACF;YAEA,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,IAAI,EAAE;gBAC/B,GAAG,CAAC,KAAK,EAAE;YACb;YAEA,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC5C,QAAA,CAAC;AACH,IAAA,CAAC,CAAC;AACJ;;ACpMA;;AAEG;AACI,MAAM,yBAAyB,GAAG,CACvC,GAAqF,EACrF,OAA+F,EAC/F,MAA6B,KAC3B;AACF,IAAA,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE;QACrB,wBAAwB,CAAC,yBAAyB,CAAC;IACrD;IAEA,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,mBAAmB,EAAE,GAAG,MAAM,IAAI,EAAE;IAE3E,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;AACrD,IAAA,MAAM,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,aAAa,EAAE,CAAC;;AAGvE,IAAA,MAAM,KAAK,GAAI,QAAgB,CAAC,MAAM;IACtC,MAAM,WAAW,GAAG,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC;IAEtC;SACG,IAAI,CACH,SAAS,CAAC,QAAQ,CAAC,EACnB,SAAS,CAAC,IAAI,CAAC,EACf,QAAQ,EAAE,EACV,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,KAAI;AAC7B,QAAA,MAAM,UAAU,GAAG,CAAC,CAAiD,KAAI;YACvE,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,aAAa,KAAK,SAAS,IAAI,CAAC,EAAE,WAAW,KAAK,aAAa,CAAC,EAAE;gBAC9F,CAAC,EAAE,KAAK,EAAE;YACZ;AAEA,YAAA,IACE,CAAC,CAAC,EAAE,cAAc,EAAE;iBACnB,CAAC,mBAAmB,KAAK,SAAS,IAAI,CAAC,EAAE,WAAW,KAAK,mBAAmB,CAAC;gBAC9E,CAAC,EAAE,SAAS,EACZ;gBACA,CAAC,EAAE,WAAW,EAAE;YAClB;AAEC,YAAA,CAA+B,EAAE,OAAO,IAAI;AAC/C,QAAA,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,IAAI,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,IAAI,CAAC,EAAE;AAC5F,YAAA,SAAS,EAAE,gBAAgB,CAAC,WAAW,CAAC;AACxC,YAAA,SAAS,EAAE,aAAa,CAAC,WAAW,CAAC;YAErC,UAAU,CAAC,SAAS,CAAC;QACvB;aAAO,IACL,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,IAAI;AAC/C,aAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,IAAI,CAAC,EAChD;YACA,IAAI,SAAS,EAAE;AACb,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACzC,SAAS,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC;gBAC7C;YACF;YAEA,IAAI,SAAS,EAAE;AACb,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACzC,SAAS,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,WAAW,CAAC;gBAC1C;YACF;YAEA,IAAI,SAAS,EAAE;AACb,gBAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACzC,oBAAA,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAC1B;YACF;QACF;AAAO,aAAA,IACL,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;AAC/C,aAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC,EAChD;AACA,YAAA,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC;QAC1F;AACF,IAAA,CAAC,CAAC;AAEH,SAAA,SAAS,EAAE;AAEd,IAAA,QAAQ,CAAC,SAAS,CAAC,MAAK;AACtB,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE;AAEvB,QAAA,MAAM,WAAW,GAAG,CAAC,CAAiD,KAAI;AACxE,YAAA,CAAC,EAAE,gBAAgB,CAAC,WAAW,CAAC;YAEhC,IAAI,CAAC,CAAC,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,IAAI,cAAc,KAAK,SAAS,KAAK,cAAc,CAAC,EAAE;gBAChG,CAAC,EAAE,KAAK,EAAE;AACT,gBAAA,CAA+B,EAAE,OAAO,IAAI;YAC/C;AACF,QAAA,CAAC;AAED,QAAA,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE;YAClB,WAAW,CAAC,KAAK,CAAC;QACpB;AAAO,aAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/B,YAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;gBACrB,WAAW,CAAC,CAAC,CAAC;YAChB;QACF;AACF,IAAA,CAAC,CAAC;AACJ;AAiDA;;AAEG;AACG,SAAU,aAAa,CAC3B,MAAuC,EACvC,OAA8E,EAAA;;IAG9E,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,OAAc,CAAC;IAE1C,yBAAyB,CAAC,MAAuB,EAAE,MAAM,CAAC,EAAO,EAAE,OAAO,CAAC;AAE3E,IAAA,OAAO,CAAkB;AAC3B;AAEA;;AAEG;AACG,SAAU,cAAc,CAC5B,WAAoB,EACpB,QAAkB,EAAA;IAElB,IAAI,WAAW,GAAG,IAAI;AAEtB,IAAA,IAAI;QACF,WAAW,GAAG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,WAAW,EAAE,CAAC;IACpE;AAAE,IAAA,MAAM;;;IAGR;AAEA,IAAA,MAAM,UAAU,GAAG,MAAM,CAAI,WAAgB;mFAAC;IAE9C,MAAM,CACJ,MAAK;AACH,QAAA,MAAM,IAAI,GAAG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,WAAW,EAAE,CAAC;QAEjE,SAAS,CAAC,MAAK;YACb,IAAI,IAAI,KAAK,UAAU,EAAE;gBAAE;AAE3B,YAAA,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,EACD,EAAE,QAAQ,EAAE,CACb;AAED,IAAA,OAAO,UAAU,CAAC,UAAU,EAAE;AAChC;AAEA;;AAEG;AACG,SAAU,aAAa,CAC3B,WAAoB,EACpB,OAA+E,EAAA;IAE/E,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAEtD,MAAM,CAAC,GAAG,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;IAEpC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC;AAElD,IAAA,OAAO,CAAC;AACV;AAEA;;;;;AAKG;AACG,SAAU,uBAAuB,CACrC,WAAoB,EACpB,OAA+E,EAAA;IAE/E,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAEtD,MAAM,CAAC,GAAG,kBAAkB,CAAC,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;IAEpC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC;AAElD,IAAA,OAAO,CAAC;AACV;AAEA;;AAEG;AACG,SAAU,kBAAkB,CAChC,WAAoB,EACpB,OAA+E,EAAA;IAE/E,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC;IAEtD,MAAM,CAAC,GAAG,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC;IAC/C,MAAM,GAAG,GAAG,YAAY,CAAC,CAAC,EAAE,OAAO,CAAC;IAEpC,yBAAyB,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC;AAElD,IAAA,OAAO,CAAC;AACV;AAEA;;AAEG;AACG,SAAU,cAAc,CAC5B,MAAiB,EACjB,OAAoD,EAAA;IAEpD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;IAEzC,yBAAyB,CAAC,GAAG,EAAE,MAAM,MAAM,EAAE,EAAE,OAAO,CAAC;AAEvD,IAAA,OAAO,GAAG;AACZ;AAEA;;AAEG;AACG,SAAU,gBAAgB,CAC9B,MAAS,EACT,OAA2B,EAAA;AAE3B,IAAA,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,IAAI,EAAE;AAEvC,IAAA,MAAM,QAAQ,GAAG,QAAQ,CACvB,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,CACvB,SAAS,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,EACrD,SAAS,CAAC,CAAC,KAAK,KAAI;QAClB,IAAI,aAAa,EAAE;AACjB,YAAA,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA,SAAA,+BAAA,SAAA,8BAAgD,CAAC,CAAC;QAC5F;AAEA,QAAA,OAAO,EAAE,CAAC,KAAK,CAAC;IAClB,CAAC,CAAC,CACH,EACD;AACE,QAAA,YAAY,EAAE,IAAI;AACnB,KAAA,CACkE;AAErE,IAAA,MAAM,QAAQ,GAAG,YAAY,CAA2D,QAAQ;iFAAC;AAEjG,IAAA,OAAO,QAAQ;AACjB;AAQA;;AAEG;AACG,SAAU,wBAAwB,CACtC,MAAS,EACT,OAA2B,EAAA;IAE3B,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC;AAE3C,IAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAK;AAC/B,QAAA,MAAM,KAAK,GAAG,CAAC,EAAE;AAEjB,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,IAAI;IAC3D,CAAC;mFAAC;AAED,IAAA,UAAkC,CAAC,OAAO,CAAC,GAAG,MAAK;AAClD,QAAA,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;AACb,IAAA,CAAC;AAED,IAAA,OAAO,UAAiC;AAC1C;AAEA;;AAEG;AACG,SAAU,qBAAqB,CACnC,MAAS,EAAA;AAET,IAAA,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAElC,OAAO,QAAQ,CAAC,MAAK;AACnB,QAAA,MAAM,KAAK,GAAG,CAAC,EAAE;AAEjB,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI;AACxD,IAAA,CAAC,CAAC;AACJ;AAEA;;AAEG;AACG,SAAU,uBAAuB,CACrC,MAAS,EAAA;AAET,IAAA,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAM,CAAC;IAElC,OAAO,QAAQ,CAAC,MAAK;AACnB,QAAA,MAAM,KAAK,GAAG,CAAC,EAAE;AAEjB,QAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI;AAClD,IAAA,CAAC,CAAC;AACJ;;ACvaA;;AAEG;AACI,MAAM,UAAU,GAAG,CAAoC,MAAS,KAAI;;AAEzE,IAAA,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;AACpE,QAAA,OAAO,MAAM;IACf;;IAGA,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC;;AAIpD,IAAA,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE;AAC5B,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC;AAE1B,QAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;YACtC,UAAU,CAAC,KAAU,CAAC;QACxB;IACF;AAEA,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9B;;ACvBA;;;;;;;AAOG;MACU,GAAG,GAAG,MAAY;;ACa/B;;AAEG;MACU,cAAc,CAAA;AAsEzB,IAAA,WAAA,CACU,YAEuD,EACvD,OAAsB,EACtB,MAAkB,EAAA;QAJlB,IAAA,CAAA,YAAY,GAAZ,YAAY;QAGZ,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,MAAM,GAAN,MAAM;;;AAjEhB,QAAA,IAAA,CAAA,OAAO,GAAgE,CACrE,IAAgE,KAC9D;YACF,MAAM,KAAK,GAAG,UAAU,CAAC;AACvB,gBAAA,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS;AACnC,gBAAA,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,KAAiB;gBAC1C,UAAU,EAAE,IAAI,EAAE,UAAU;AAC5B,gBAAA,WAAW,EAAE,uBAAuB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;gBAC/F,gBAAgB,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW;AAC3D,aAAA,CAAU;AAEX,YAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,kBAAkB,IAAI,EAAE,IAAI,oBAAoB,CAAC,KAAe,EAAE,IAAI,CAAC;AAEvG,YAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE;gBACjF,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAuD,QAAQ,CAAC;gBAErG,IAAI,aAAa,EAAE;AACjB,oBAAA,OAAO,aAAa;gBACtB;YACF;YAEA,MAAM,KAAK,GAAG,IAAI,OAAO,CACvB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,YAAY,EACjB,KAAK,EACL,IAAI,IAAK,EAAgB,EACzB,QAAQ,CACT;AAED,YAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE;gBACjF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC;YAClC;AAEA,YAAA,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC;AAExC,YAAA,OAAO,KAAK;AACd,QAAA,CAAC;AAED,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,YAAqD,EAAE,MAA6B,KAAI;AACvG,YAAA,wBAAwB,CAAC,IAAI,CAAC,aAAa,CAAC;YAE5C,MAAM,OAAO,GAAG,IAAI,eAAe,CAAyC,YAAY,IAAI,IAAI,CAAC;AAEjG,YAAA,yBAAyB,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC;AAEpE,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC;AAED,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,YAAqD,EAAE,MAA6B,KAAI;AACtG,YAAA,wBAAwB,CAAC,IAAI,CAAC,YAAY,CAAC;AAE3C,YAAA,MAAM,OAAO,GAAG,MAAM,CAAyC,YAAY,IAAI,IAAI;wFAAC;AAEpF,YAAA,yBAAyB,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,OAAO,EAAE,EAAE,MAAM,CAAC;AAEzE,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC;AAED,QAAA,IAAA,CAAA,eAAe,GAAG,CAAC,YAAqD,KACtE,IAAI,eAAe,CAAyC,YAAY,IAAI,IAAI,CAAC;IAOhF;AACJ;;AClGD;;AAEG;MACU,UAAU,CAAA;AAgBrB,IAAA,WAAA,CACU,OAKP,EAAA;QALO,IAAA,CAAA,OAAO,GAAP,OAAO;AAhBjB;;AAEG;AACM,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,GAAG,EAAsB;QAEvC,IAAA,CAAA,gBAAgB,GAAkB,IAAI;QACtC,IAAA,CAAA,mBAAmB,GAAG,KAAK;AAC3B,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE;AAE9B,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,OAAO,EAAU;AACrC,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,OAAO,EAAc;AAEzC,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;AAChD,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;QAUzD,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEA,GAAG,CAAC,EAAU,EAAE,KAAiB,EAAA;QAC/B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC;QAE1B,IAAI,CAAC,oBAAoB,EAAE;QAE3B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC;AAE/B,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7B;AAEA,IAAA,GAAG,CAAuB,EAAU,EAAA;QAClC,OAAQ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAO,IAAI,IAAI;IAC3C;AAEA,IAAA,MAAM,CAAC,EAAU,EAAA;AACf,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAEtB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,CAAC;AAEjC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7B;AAEA,IAAA,OAAO,CAAC,QAAkD,EAAA;QACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;AACtC,YAAA,QAAQ,CAAC,KAAK,EAAE,GAAG,CAAC;QACtB;IACF;AAEA,IAAA,mBAAmB,CAAC,MAAiE,EAAA;QACnF,MAAM,EAAE,mBAAmB,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,EAAE;QAEzD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;YACtC,IACE,KAAK,CAAC,OAAO;AACb,iBAAC,KAAK,CAAC,SAAS,IAAI,mBAAmB,CAAC;AACxC,gBAAA,KAAK,CAAC,mBAAmB,CAAC,+BAA+B,EACzD;AACA,gBAAA,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;YAC3D;AAAO,iBAAA,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;AACxC,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAClB;QACF;IACF;AAEA;;AAEG;AACH,IAAA,qBAAqB,CAAC,KAAiB,EAAA;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;IACjC;IAEQ,sBAAsB,GAAA;QAC5B,MAAM,WAAW,GAAG,SAAS,CAAQ,MAAM,EAAE,MAAM,CAAC;QACpD,MAAM,YAAY,GAAG,SAAS,CAAQ,MAAM,EAAE,OAAO,CAAC;AAEtD,QAAA,WAAW,CAAC,SAAS,CAAC,MAAK;YACzB,KAAK,CAAC,IAAI;iBACP,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;iBACrC,SAAS,CAAC,MAAK;AACd,gBAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE;AACnC,gBAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;gBAC/B,IAAI,CAAC,oBAAoB,EAAE;AAE3B,gBAAA,IAAI,IAAI,CAAC,OAAO,EAAE,kBAAkB,EAAE;AACpC,oBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;wBACrB,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE;4BAClD;wBACF;wBAEA,KAAK,CAAC,YAAY,EAAE;AACtB,oBAAA,CAAC,CAAC;gBACJ;AACF,YAAA,CAAC,CAAC;AACN,QAAA,CAAC,CAAC;AAEF,QAAA,YAAY,CAAC,SAAS,CAAC,MAAK;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC7B;YACF;AAEA,YAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK;AAEhC,YAAA,IAAI,IAAI,CAAC,OAAO,EAAE,kBAAkB,IAAI,IAAI,CAAC,OAAO,EAAE,+BAA+B,EAAE;AACrF,gBAAA,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,KAAI;oBACrB,IAAI,IAAI,CAAC,OAAO,EAAE,kBAAkB,IAAI,KAAK,CAAC,gBAAgB,EAAE;wBAC9D,KAAK,CAAC,aAAa,EAAE;oBACvB;oBAEA,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,GAAG,KAAK,EAAE;AAC/C,wBAAA,IACE,IAAI,CAAC,OAAO,EAAE,+BAA+B;AAC7C,4BAAA,KAAK,CAAC,SAAS;AACf,4BAAA,KAAK,CAAC,OAAO;AACb,4BAAA,KAAK,CAAC,mBAAmB,CAAC,WAAW,EACrC;AACA,4BAAA,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;wBAC3D;oBACF;AACF,gBAAA,CAAC,CAAC;YACJ;YAEA,IAAI,CAAC,oBAAoB,EAAE;AAC7B,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,QAAQ,CAAC,GAAkB,EAAE,IAAuB,EAAE,SAAiB,EAAA;AAC7E,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,mBAAmB;YAAE;QAExC,MAAM,WAAW,GAA+B,EAAE;QAElD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,KAAI;AACjC,YAAA,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK;AAC1B,QAAA,CAAC,CAAC;QAEF,OAAO,CAAC,GAAG,CAAC,CAAA,GAAA,EAAM,SAAS,CAAA,EAAA,EAAK,GAAG,CAAA,CAAE,EAAE,mBAAmB,CAAC;QAE3D,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACrC,QAAA,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IAC1B;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;YAClC;QACF;AAEA,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;QAEjC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC,MAAK;YAC9C,IAAI,CAAC,mBAAmB,EAAE;QAC5B,CAAC,EAAE,KAAK,CAAC;IACX;IAEQ,oBAAoB,GAAA;AAC1B,QAAA,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;AAClC,YAAA,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC;AAC3C,YAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAC5B,YAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;QAClC;IACF;IAEQ,mBAAmB,GAAA;AACzB,QAAA,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC;QAEzC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,KAAI;YAChC,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACnC,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAClB;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,CAAC,mBAAmB,CAAC,iBAAiB,CAAC;AAE3C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;YACrB,IAAI,CAAC,oBAAoB,EAAE;QAC7B;IACF;AAEQ,IAAA,mBAAmB,CAAC,MAAc,EAAA;AACxC,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,6BAA6B;YAAE;QAElD,OAAO,CAAC,GAAG,CAAC,CAAA,MAAA,EAAS,MAAM,CAAA,CAAE,EAAE,kCAAkC,CAAC;IACpE;AACD;;AClLD;;AAEG;MACU,aAAa,CAAA;AA+JxB,IAAA,WAAA,CAAoB,aAAkC,EAAA;QAAlC,IAAA,CAAA,aAAa,GAAb,aAAa;AA1JhB,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAsB,IAAI,CAAC;AAEhF,QAAA,IAAA,CAAA,KAAK,GAAG,CAQN,WAE+D,KAC5D,IAAI,cAAc,CAA8C,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;QAEpG,IAAA,CAAA,GAAG,GAAG,CAQJ,WAAkF,KAElF,IAAI,CAAC,KAAK,CAA8C;AACtD,YAAA,GAAG,WAAW;AACd,YAAA,MAAM,EAAE,KAAK;AACd,SAAA,CAAC;QAEJ,IAAA,CAAA,IAAI,GAAG,CAQL,WAAkF,KAElF,IAAI,CAAC,KAAK,CAA8C;AACtD,YAAA,GAAG,WAAW;AACd,YAAA,MAAM,EAAE,MAAM;AACf,SAAA,CAAC;QAEJ,IAAA,CAAA,GAAG,GAAG,CAQJ,WAAkF,KAElF,IAAI,CAAC,KAAK,CAA8C;AACtD,YAAA,GAAG,WAAW;AACd,YAAA,MAAM,EAAE,KAAK;AACd,SAAA,CAAC;QAEJ,IAAA,CAAA,KAAK,GAAG,CAQN,WAAkF,KAElF,IAAI,CAAC,KAAK,CAA8C;AACtD,YAAA,GAAG,WAAW;AACd,YAAA,MAAM,EAAE,OAAO;AAChB,SAAA,CAAC;QAEJ,IAAA,CAAA,MAAM,GAAG,CAQP,WAAkF,KAElF,IAAI,CAAC,KAAK,CAA8C;AACtD,YAAA,GAAG,WAAW;AACd,YAAA,MAAM,EAAE,QAAQ;AACjB,SAAA,CAAC;QAEJ,IAAA,CAAA,QAAQ,GAAG,CAQT,WAAqF,KAErF,IAAI,CAAC,KAAK,CAA8C;AACtD,YAAA,GAAG,WAAW;AACd,YAAA,MAAM,EAAE,WAAW;AACpB,SAAA,CAAC;QAEJ,IAAA,CAAA,SAAS,GAAG,CAQV,WAAqF,KAErF,IAAI,CAAC,KAAK,CAA8C;AACtD,YAAA,GAAG,WAAW;AACd,YAAA,MAAM,EAAE,YAAY;AACrB,SAAA,CAAC;AAEJ,QAAA,IAAA,CAAA,eAAe,GAAG,CAAC,YAA0B,KAAI;AAC/C,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;YAC9B;AAEA,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC;AACxC,QAAA,CAAC;AAED,QAAA,IAAA,CAAA,iBAAiB,GAAG,CAAC,MAGpB,KAAI;AACH,YAAA,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE;AAC/B,gBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,GAAG;AAC3B,oBAAA,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,SAAS;iBACrC;YACH;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,SAAS;YAClE;AAEA,YAAA,IAAI,MAAM,CAAC,mBAAmB,EAAE;AAC9B,gBAAA,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;YACnF;AACF,QAAA,CAAC;QAED,IAAA,CAAA,iBAAiB,GAAG,MAAK;AACvB,YAAA,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE;AAC5B,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,QAAA,CAAC;AAED,QAAA,IAAA,CAAA,gBAAgB,GAAG,CAAC,KAAa,KAAI;AACnC,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,KAAK;AACtC,QAAA,CAAC;AAGC,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,UAAU,CAAC;AAC3B,YAAA,mBAAmB,EAAE,aAAa,CAAC,OAAO,EAAE,iBAAiB;AAC7D,YAAA,6BAA6B,EAAE,aAAa,CAAC,OAAO,EAAE,0BAA0B;AAChF,YAAA,+BAA+B,EAAE,aAAa,CAAC,OAAO,EAAE,+BAA+B,IAAI,IAAI;AAC/F,YAAA,kBAAkB,EAAE,aAAa,CAAC,OAAO,EAAE,kBAAkB,IAAI,IAAI;AACtE,SAAA,CAAC;IACJ;AAEA,IAAA,IAAI,MAAM,GAAA;QACR,OAAO,IAAI,CAAC,aAAa;IAC3B;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE,IAAI,IAAI;IACvG;AACA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,cAAc,CAAC,YAAY,EAAE,IAAI,IAAI;IAC/G;AACD;;AClMD;;AAEG;AACI,MAAM,kBAAkB,GAAG,CAAC,MAAc,KAAI;AACnD,IAAA,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,WAAW;AAChG;AAEA;;AAEG;MACU,oBAAoB,GAAG,CAAC,KAAa,EAAE,IAA+B,KAAI;IACrF,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,IAAI,EAAE;;AAEnD,SAAA,OAAO,CAAC,MAAM,EAAE,EAAE;;AAElB,SAAA,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAErB,IAAA,MAAM,IAAI,GAAG,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,SAAS,EAAE;IAEtC,IAAI,IAAI,GAAG,CAAC;AAEZ,IAAA,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE;QACvB,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;IACxD;;;AAIA,IAAA,IAAI,IAAI,UAAU,GAAG,CAAC;AAEtB,IAAA,OAAO,IAAI,CAAC,QAAQ,EAAE;AACxB;;ACpBA,IAAI,gBAAgB,GAAoB,IAAI;AAE5C;;;;;AAKG;MACU,6BAA6B,GAAG,MAAM;AAEnD;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BG;MACU,4BAA4B,GAAG,MAC1C,wBAAwB,CAAC;IACvB,6BAA6B,CAAC,MAAK;QACjC,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE;YAC3C,IAAI,SAAS,EAAE,EAAE;gBACf,OAAO,CAAC,IAAI,CACV,sGAAsG;AACpG,oBAAA,sGAAsG,CACzG;YACH;YAEA;QACF;AAEA,QAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;QAE5C,gBAAgB,GAAG,QAAQ;AAE3B,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;AAChC,YAAA,IAAI,gBAAgB,KAAK,QAAQ,EAAE;gBACjC,gBAAgB,GAAG,IAAI;YACzB;AACF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;AACH,CAAA;;AC5BH;;AAEG;AACI,MAAM,8BAA8B,GAAG,CAC5C,SAA4C,KACP;AACrC,IAAA,MAAM,IAAI,GAAmB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE;AAEhE,IAAA,QAAQ,SAAS,EAAE,IAAI;QACrB,KAAK,SAAS,EAAE;AACd,YAAA,MAAM,OAAO,GAAY;gBACvB,IAAI;AACJ,gBAAA,IAAI,EAAA,SAAA;AACJ,gBAAA,IAAI,SAAS,CAAC,OAAO,CAAC;AACpB,sBAAE;AACE,wBAAA,QAAQ,EAAE;AACR,4BAAA,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM;AAC1C,4BAAA,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU;AACjD,4BAAA,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK;AACxC,yBAAA;AACF;sBACD,EAAE,CAAC;aACR;AAED,YAAA,OAAO,OAAO;QAChB;QACA,KAAK,SAAS,EAAE;AACd,YAAA,MAAM,OAAO,GAAiC;AAC5C,gBAAA,OAAO,EAAE,EAAE;gBACX,IAAI;gBACJ,QAAQ,EAAE,SAAS,CAAC,QAAQ;AAC5B,gBAAA,IAAI,EAAA,SAAA;aACL;AAED,YAAA,OAAO,OAAO;QAChB;QACA,KAAK,SAAS,EAAE;AACd,YAAA,MAAM,KAAK,GAAY;AACrB,gBAAA,KAAK,EAAE;AACL,oBAAA,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK;AACjC,oBAAA,iBAAiB,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG;AACtC,oBAAA,MAAM,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM;AAClC,oBAAA,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU;oBAC1C,GAAG,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,EAAE;AACnC,iBAAA;gBACD,IAAI;AACJ,gBAAA,IAAI,EAAA,SAAA;aACL;AAED,YAAA,OAAO,KAAK;QACd;QACA,SAAS;AACP,YAAA,MAAM,QAAQ,GAAa;gBACzB,IAAI;AACJ,gBAAA,IAAI,EAAA,UAAA;aACL;AAED,YAAA,OAAO,QAAQ;QACjB;;AAEJ;AAEA;;AAEG;AACI,MAAM,aAAa,GAAG,CAA2B,KAAc,KAAgB;AACpF,IAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/D,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,EAAE,UAAU,IAAI,KAAK,CAAC,EAAE;AAC1B,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI;AACb;AAQA;;AAEG;MACU,WAAW,CAAA;AA+CtB,IAAA,WAAA,CACS,QAAmB,EACnB,UAA+C,EAC/C,MAAgE;AAEvE;;;;;AAKG;AACK,IAAA,QAAA,GAAW,KAAK;AAExB;;;;;AAKG;AACK,IAAA,YAAA,GAAe,KAAK,EAAA;QAlBrB,IAAA,CAAA,QAAQ,GAAR,QAAQ;QACR,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,MAAM,GAAN,MAAM;QAQL,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAQR,IAAA,CAAA,YAAY,GAAZ,YAAY;AAtDtB;;AAEG;QACH,IAAA,CAAA,oBAAoB,GAAwB,IAAI;AAChD;;AAEG;QACH,IAAA,CAAA,kBAAkB,GAAsB,IAAI;AAE5C;;;;AAIG;QACH,IAAA,CAAA,eAAe,GAAqB,IAAI;AAExC;;AAEG;QACM,IAAA,CAAA,WAAW,GAA2B,EAAE;AAEjD;;AAEG;AACH,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,aAAa,EAA0B;AAEjE;;AAEG;QACH,IAAA,CAAA,gBAAgB,GAAG,KAAK;QAEhB,IAAA,CAAA,WAAW,GAAG,KAAK;AAyBzB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAmC;AACxF,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;YAEvB;QACF;AAEA,QAAA,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CACxG,GAAG,CAAC,CAAC,SAAS,KAAK,8BAA8B,CAAC,SAAS,CAAC,CAAC,EAC7D,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EACzC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;AAED,QAAA,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,MAAK;;;;;YAKjC,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE;YAEhD,SAAS,CAAC,MAAK;gBACb,IAAI,SAAS,EAAE,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG;oBAAE;AAExD,gBAAA,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ;gBAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC;AAEnE,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;oBACd,IAAI,EAAE,IAAI,CAAC,UAAU;AACrB,oBAAA,QAAQ,EAAE,GAAG;oBACb,EAAE;AACF,oBAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AACzB,iBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;QACJ,CAAC;4FAAC;;;;AAKF,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClE;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,8BAA8B,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,CAAC;IACvE;AAEA,IAAA,IAAI,SAAS,GAAA;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE;IAClD;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,CAAC;IACV;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,oBAAoB;IACpC;AAEA,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,MAAM,WAAW,GAAqC;AACpD,YAAA,+BAA+B,EAAE,KAAK;AACtC,YAAA,WAAW,EAAE,KAAK;SACnB;AAED,QAAA,OAAO,WAAW;IACpB;AAEA;;AAEG;AACH,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,YAAY;IAC1B;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,KAAK;IACd;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB;QACF;QAEA,IAAI,CAAC,QAAQ,EAAE;;AAGf,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE;IAChC;IAEA,OAAO,CAAC,UAA+B,EAAE,EAAA;QACvC,SAAS,CAAC;;;;QAIR,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,EAAE,CAAC,CACtG;AAED,QAAA,OAAO,IAAI;IACb;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACvC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;AAErB,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,CAAC,MAAkB,EAAA;;QAErB,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,WAAW,EAAE;AACjD,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,kBAAkB,GAAG,MAAM;QAEhC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAC1B,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,EACvC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAC3B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EACvC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAClD;AAED,QAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,SAAS,CAAC;AAC1C,YAAA,IAAI,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACpE,YAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE;AACnC,SAAA,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,oBAAoB,EAAE,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAE9B,QAAA,OAAO,IAAI;IACb;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,oBAAoB,EAAE,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAEhC,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAE5B,QAAA,OAAO,IAAI;IACb;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;AACtD,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAE7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC5E;AAEA,IAAA,SAAS,CAAC,QAAkC,EAAA;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACrG,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,QAAgD,EAAA;QACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClG,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,UAAkB,EAAA;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC;QAClC;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;QAE9B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IACjD;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,UAAkB,EAAA;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AAC1C,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB;QACF;QAEA,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;AAC9C,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;QAChC;AAEA,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QACrC;QAEA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IACjD;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;IACjD;AAEA;;AAEG;AACH,IAAA,eAAe,CAAC,CAAyB,EAAA;AACvC,QAAA,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;AAChD,YAAA,OAAO,EAAE,CAAC,CAAC,CAAmC;QAChD;QAEA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAE1E,OAAO,IAAI,CAAC;aACT,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;aACjF,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C;IAEQ,QAAQ,GAAA;AACd,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,oBAAoB,EAAE,WAAW,EAAE;AACxC,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;AACnC,QAAA,IAAI,CAAC,eAAe,EAAE,OAAO,EAAE;IACjC;AACD;;AChcD;;;;;;;;;;;;AAYG;AACI,MAAM,gBAAgB,GAAG,MAA4C;AAC1E,IAAA,MAAM,WAAW,GAAG,CAAI,KAAQ,KAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAc,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;IAE9E,MAAM,IAAI,GAAG,MAAK;;AAElB,IAAA,CAAC;AAED,IAAA,MAAM,IAAI,GAAG;AACX,QAAA,IAAI,EAAE,WAAW,CAA4B,IAAI,CAAC;AAClD,QAAA,QAAQ,EAAE,WAAW,CAA6B,IAAI,CAAC;AACvD,QAAA,eAAe,EAAE,WAAW,CAAC,IAAI,CAAC;AAClC,QAAA,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC;AAC1B,QAAA,KAAK,EAAE,WAAW,CAAC,IAAI,CAAC;AACxB,QAAA,kBAAkB,EAAE,WAAW,CAAgB,IAAI,CAAC;AACpD,QAAA,WAAW,EAAE,WAAW,CAAgB,IAAI,CAAC;AAC7C,QAAA,EAAE,EAAE,WAAW,CAAgB,IAAI,CAAC;AACpC,QAAA,cAAc,EAAE,WAAW,CAAC,IAAI,CAAC;KACC;AAEpC,IAAA,MAAM,cAAc,GAAG,OAA6B,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;;;AAI7F,IAAA,MAAM,UAAU,GAAG;AACjB,QAAA,SAAS,EAAE,IAAI;AACf,QAAA,SAAS,EAAE,MAAM,IAAI;KACG;IAE1B,OAAO;AACL,QAAA,GAAG,IAAI;AACP,QAAA,OAAO,EAAE,IAAI;QACb,cAAc;AACd,QAAA,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,cAAc,EAAE,CAAC;AAC/C,QAAA,MAAM,EAAE;AACN,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,OAAO,EAAE,WAAW,CAAC,IAAI,CAAC;YAC1B,UAAU;YACV,QAAQ,EAAE,QAAQ,CAAC,IAAI;AACxB,SAAA;KACyB;AAC9B,CAAC;;AC7BD;;;;AAIG;AACH,MAAM,gBAAgB,GAAG,CAAC,QAAkB,KAAI;AAC9C,IAAA,IAAI;AACF,QAAA,OAAO,QAAQ,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,KAAK,IAAI;IAC/E;AAAE,IAAA,MAAM;AACN,QAAA,OAAO,KAAK;IACd;AACF,CAAC;AAED;;;;AAIG;AACH,MAAM,8BAA8B,GAAG,CAAC,KAAc,KACpD,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAE,KAA4B,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG;AAE7G;;;;AAIG;AACH,MAAM,eAAe,GAAG,CAAC,OAAwB,KAAI;IACnD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAEzD,IAAI,OAAO,KAAK,KAAK,QAAQ;AAAE,QAAA,OAAO,SAAS;AAE/C,IAAA,OAAO,OAAO,MAAM,KAAK,QAAQ,GAAG,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,GAAG,KAAK;AAClE,CAAC;AAED;;;;AAIG;AACH,MAAM,kBAAkB,GAAG,CAAC,OAAwB,KAAI;IACtD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAClD,MAAM,QAAQ,GAAI,OAAO,CAAC,MAAM,CAAC,cAAwD,EAAE;AACzF,UAAE,uBAAuB;IAE3B,IAAI,QAAQ,KAAK,SAAS;AAAE,QAAA,OAAO,QAAQ;IAC3C,IAAI,MAAM,KAAK,OAAO;AAAE,QAAA,OAAO,IAAI;IACnC,IAAI,MAAM,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK;IAErC,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,gBAAgB,CAAC,MAAqB,CAAC;AAC9E,CAAC;AA2ED;;AAEG;MACU,kBAAkB,CAAA;AAwH7B,IAAA,WAAA,CAAmB,OAA0E,EAAA;QAA1E,IAAA,CAAA,OAAO,GAAP,OAAO;AAjH1B,QAAA,IAAA,CAAA,OAAO,GAQH,CAAC,IAAuF,KAAI;AAC9F,YAAA,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC;AAEzE,YAAA,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE;AAE/B,YAAA,IAAI,IAAI,EAAE,OAAO,EAAE;AACjB,gBAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAqB,IAAI,CAAC,OAAO,CAAC,EAAE;;AAE3E,oBAAA,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;wBAAE;oBAE3C,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;gBACnC;YACF;AAEA,YAAA,MAAM,SAAS,GAAG;;;gBAGhB,IAAI,IAAI,EAAE,IAAI,KAAK,SAAS,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC;AACxD,gBAAA,IAAI,IAAI,EAAE,UAAU,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,CAAC;AAC5D,gBAAA,IAAI,IAAI,EAAE,WAAW,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;gBAC/D,OAAO;aACc;;;;;AAMvB,YAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE;gBAC/B,IAAI,SAAS,EAAE,EAAE;AACf,oBAAA,OAAO,CAAC,IAAI,CACV,GAAG,IAAI,CAAC,KAAK,GAAG,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAA,CAAG,GAAG,gBAAgB,CAAA,iFAAA,CAAmF;AACrI,wBAAA,CAAA,sKAAA,CAAwK,CAC3K;gBACH;gBAEA,OAAO,IAAI,WAAW,CAQpB,gBAAgB,EAAS,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC;YACtF;AAEA,YAAA,OAAO,qBAAqB,CAAC,QAAQ,EAAE,MAAK;gBAC1C,OAAO,SAAS,CAAC,MAAK;AACpB,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACpC,wBAAA,mBAAmB,EAAE,IAAI;wBACzB,QAAQ;AACR,wBAAA,kCAAkC,EAAE,IAAI;;AAExC,wBAAA,iCAAiC,EAAE,IAAI;AACxC,qBAAA,CAAC;oBAEF,MAAM,WAAW,GAAG,IAAI,WAAW,CAQjC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC;AAEpE,oBAAA,IAAI,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE;;;;;wBAKnC,MAAM,CACJ,MAAK;4BACH,MAAM,IAAI,GAAG,QAAQ,CAAC,cAAc,EAAE,EAAE,IAAI;4BAE5C,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,SAAS,EAAE;gCAC5C,WAAW,CAAC,OAAO,EAAE;4BACvB;wBACF,CAAC,EACD,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,CACvC;oBACH;AAEA,oBAAA,OAAO,WAAW;AACpB,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AACD,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,YAAqD,EAAE,MAA6B,KAAI;AACvG,YAAA,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAAC;YACjF,MAAM,OAAO,GAAG,IAAI,eAAe,CAAyC,YAAY,IAAI,IAAI,CAAC;AAEjG,YAAA,yBAAyB,CAAC,OAAO,EAAE,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;AAErF,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC;AACD,QAAA,IAAA,CAAA,YAAY,GAAG,CAAC,YAAqD,EAAE,MAA6B,KAAI;AACtG,YAAA,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,cAAc,CAAC;AAChF,YAAA,MAAM,OAAO,GAAG,MAAM,CAAyC,YAAY,IAAI,IAAI;wFAAC;YAEpF,yBAAyB,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,OAAO,EAAE,EAAE,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;AAExG,YAAA,OAAO,OAAO;AAChB,QAAA,CAAC;AAED,QAAA,IAAA,CAAA,eAAe,GAAG,IAAI,CAAC,aAAa;IAC4D;AAEhG;;;AAGG;AACH,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACjD;AAEA,IAAA,IAAY,KAAK,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IACnE;AAEA;;;;;AAKG;AACK,IAAA,sBAAsB,CAAC,MAAoD,EAAA;AACjF,QAAA,IAAI;AACF,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,EAAE;AAC1C,gBAAA,MAAM,KAAK;YACb;AAEA,YAAA,MAAM,QAAQ,GAAG,6BAA6B,EAAE;;;AAIhD,YAAA,IAAI,QAAQ,IAAI,gBAAgB,CAAC,QAAQ,CAAC,EAAE;AAC1C,gBAAA,OAAO,QAAQ;YACjB;YAEA,MAAM,oCAAoC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC;QAChE;IACF;AACD;AAED;;;;;;;;AAQG;AACI,MAAM,wBAAwB,GAAG,CAOtC,OAA0E,KAClB;AACxD,IAAA,OAAO,IAAI,kBAAkB,CAAmC,OAAO,CAAC;AAC1E;;ACpVA;AA8CA;;AAEG;SACa,aAAa,GAAA;AAC3B,IAAA,OAAO,UACL,MAAqB,EAAA;AAErB,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAkC;AACpG,IAAA,CAAC;AACH;AAEA;;AAEG;SACa,iBAAiB,GAAA;AAC/B,IAAA,OAAO,UAAyC,MAAqB,EAAA;AACnE,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAkB;AAC/E,IAAA,CAAC;AACH;AAEA;;AAEG;SACa,aAAa,GAAA;AAC3B,IAAA,OAAO,UAAyC,MAAqB,EAAA;AACnE,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAwB;AAC1F,IAAA,CAAC;AACH;AAEA;;AAEG;AACG,SAAU,iBAAiB,CAAC,aAA+B,EAAA;AAC/D,IAAA,OAAO,UAAyC,MAAqB,EAAA;QACnE,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAkB;AACrG,IAAA,CAAC;AACH;AAEA;;AAEG;AACG,SAAU,iBAAiB,CAAC,MAAkC,EAAA;AAClE,IAAA,OAAO,UAAyC,MAAqB,EAAA;QACnE,OAAO,MAAM,CAAC,IAAI,CAChB,SAAS,CAAC,CAAC,KAAK,KAAI;YAClB,IAAI,MAAM,EAAE,WAAW,IAAI,KAAK,KAAK,IAAI,EAAE;AACzC,gBAAA,OAAO,KAAK;YACd;AAEA,YAAA,OAAO,mBAAmB,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI;AACpF,QAAA,CAAC,EAAE,IAAI,CAAC,CACT;AACH,IAAA,CAAC;AACH;AAEA;;AAEG;SACa,UAAU,GAAA;AACxB,IAAA,OAAO,UAAa,MAAqB,EAAA;AACvC,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,KAA2B,KAAK,KAAK,IAAI,CAAC,CAAC;AAC7E,IAAA,CAAC;AACH;AAEA;;AAEG;SACa,gBAAgB,GAAA;AAC9B,IAAA,OAAO,UAAqF,MAAqB,EAAA;QAC/G,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,EAAE,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAA0C;AAC9G,IAAA,CAAC;AACH;AAEA;;AAEG;SACa,0BAA0B,GAAA;AACxC,IAAA,OAAO,UACL,MAAqB,EAAA;QAErB,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAA0C;AACpH,IAAA,CAAC;AACH;AAEA;;AAEG;AACI,MAAM,gBAAgB,GAC3B,CACE,MAAyC,KAE3C,CAAC,MAAqB,KAAI;IACxB,MAAM,EAAE,SAAS,EAAE,cAAc,GAAG,MAAM,EAAE,GAAG,MAAM;AAErD,IAAA,IAAI,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE;AAC3D,QAAA,OAAO,CAAC,IAAI,CAAC,8CAA8C,cAAc,CAAA,eAAA,CAAiB,CAAC;IAC7F;IAEA,OAAO,MAAM,CAAC,IAAI,CAChB,SAAS,CAAC,CAAC,CAAC,KAAI;QACd,IAAI,CAAC,CAAC,EAAE;AACN,YAAA,OAAO,EAAE,CAAC,CAAC,CAAC;QACd;QAEA,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,KAAK,KAAI;AACZ,YAAA,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBAC/B;YACF;AAEA,YAAA,QAAQ,KAAK,CAAC,KAAK,CAAC,MAAM;;AAExB,gBAAA,KAAK,GAAG;AACN,oBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC;oBACtD;;AAGF,gBAAA,KAAK,GAAG;oBACN,IAAI,kCAAkC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;AAC1D,wBAAA,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;oBACvD;oBACA;;AAEN,QAAA,CAAC,CAAC,EACF,iBAAiB,EAAE,CACpB;IACH,CAAC,CAAC,CACH;AACH;AAEF;;AAEG;AACI,MAAM,mBAAmB,GAAG,CAAC,KAAsC,KACxE,KAAK,EAAE,IAAI;AAEb;;AAEG;AACI,MAAM,mBAAmB,GAAG,CAAC,KAAsC,KACxE,KAAK,EAAE,IAAI;AAEb;;AAEG;AACI,MAAM,mBAAmB,GAAG,CAAC,KAAsC,KACxE,KAAK,EAAE,IAAI;AAEb;;AAEG;AACI,MAAM,qBAAqB,GAAG,CAAC,KAAsC,KAC1E,KAAK,EAAE,IAAI;AAEb;;AAEG;AACI,MAAM,oBAAoB,GAAG,CAAC,KAAsC,KACzE,KAAK,EAAE,IAAI;AAEb;;AAEG;AACI,MAAM,aAAa,GAAG,CAAC,KAAsC,KAAK,KAAK,EAAE,IAAI,CAAC,YAAY,KAAK;AAEtG;;AAEG;MACU,YAAY,GAAG,CAAC,GAAG,OAAiD,KAAI;IACnF,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,KAAI;QACrC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,GAAG;QACZ;QAEA,OAAO;AACL,YAAA,GAAG,GAAG;AACN,YAAA,GAAG,OAAO;SACX;IACH,CAAC,EAAE,EAAE,CAAC;AACR;AAEA;;AAEG;AACI,MAAM,gBAAgB,GAAG,CAQ9B,MAAe,KAC0D;AACzE,IAAA,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAClE,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACI,MAAM,OAAO,GAAG,CAAwC,KAAc,KAAgB;AAC3F,IAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/D,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,EAAE,QAAQ,IAAI,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACI,MAAM,iBAAiB,GAAG,CAA+B,KAAc,KAAgB;AAC5F,IAAA,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC/D,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,IAAI,EAAE,OAAO,IAAI,KAAK,CAAC,EAAE;AACvB,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACI,MAAM,qBAAqB,GAAG;AACnC;AACA,QAAW,KACR,IAAI,eAAe,CAAW,IAAI;AAEvC;;AAEG;AACI,MAAM,4BAA4B,GAAG;AAC1C;AACA,QAAW,EACX,MAA6B,KAC3B;IACF,wBAAwB,CAAC,4BAA4B,CAAC;AAEtD,IAAA,MAAM,OAAO,GAAG,IAAI,eAAe,CAAW,IAAI,CAAC;AAEnD,IAAA,yBAAyB,CACvB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,EAC1C,MAAM,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,IAAI,IAAI,EACvC,MAAM,CACP;AAED,IAAA,OAAO,OAAO;AAChB;AAEA;;AAEG;AACI,MAAM,2BAA2B,GAAG;AACzC;AACA,QAAW,EACX,MAA6B,KAC3B;IACF,wBAAwB,CAAC,2BAA2B,CAAC;AAErD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAW,IAAI;gFAAC;AAEtC,IAAA,yBAAyB,CACvB,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,EACxD,MAAM,OAAO,EAAE,EAAE,KAAK,IAAI,IAAI,EAC9B,MAAM,CACP;AAED,IAAA,OAAO,OAAO;AAChB;AAEA;;AAEG;AACI,MAAM,YAAY,GAAG,CAAoE,CAAI,KAClG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,KAAK,KAAK;AAExD;;AAEG;MACU,iBAAiB,GAAG,CAC/B,OAAoE,EACpE,MAAc,KACZ;IACF,IAAI,CAAC,OAAO,EAAE;AACZ,QAAA,OAAO,EAAE;IACX;AAEA,IAAA,IAAI,MAAM,IAAI,OAAO,EAAE;QACrB,QAAQ,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE;IAC/B;AAEA,IAAA,OAAO,OAAyB;AAClC;AAEA;;AAEG;AACI,MAAM,qBAAqB,GAAG,CAUnC,MAID,KAAI;AACH,IAAA,IAAI,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE;AAC3B,QAAA,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;AAErB,QAAA,MAAM,IAAI,KAAK,CAAC,gGAAgG,CAAC;IACnH;IAEA,OAAO,MAAM,CAAC,OAAiG;AACjH;AAEA;;AAEG;AACI,MAAM,kBAAkB,GAAG,CAAC,MAGlC,KAAI;AACH,IAAA,IAAI,MAAc;AAElB,IAAA,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;AACnC,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW;AAC/F,QAAA,MAAM,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;IACzE;SAAO;AACL,QAAA,MAAM,GAAG,eAAe,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;IAC5D;AAEA,IAAA,OAAO,MAAM;AACf;AAEA;;AAEG;AACI,MAAM,gBAAgB,GAAG,CAAC,MAKhC,KAAI;AACH,IAAA,IAAI,IAAa;AAEjB,IAAA,IACE,MAAM,CAAC,MAAM,KAAK,KAAK;QACvB,MAAM,CAAC,MAAM,KAAK,MAAM;QACxB,MAAM,CAAC,MAAM,KAAK,SAAS;AAC3B,SAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AAC9B,aAAC,MAAM,CAAC,MAAM,CAAC,WAAW,KAAK,KAAK;iBACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,EAC9F;AACA,QAAA,OAAO,SAAS;IAClB;AAEA,IAAA,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;AACnC,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK;AACzC,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC;QAEzC,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;IACtC;SAAO;AACL,QAAA,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI;IAC1B;AAEA,IAAA,OAAO,IAAI;AACb;AAEA;;AAEG;AACI,MAAM,sBAAsB,GAAG,CAAC,MAGtC,KAAI;IACH,IAAI,UAAU,GAAkC,IAAI;AAEpD,IAAA,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM;QAEjD,IAAI,MAAM,EAAE;YACV,UAAU,GAAG,MAAM;QACrB;IACF;SAAO,IAAI,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,EAAE;AAC7C,QAAA,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YAC9D,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM;QAChD;IACF;AAEA,IAAA,OAAO,UAAU;AACnB;AAEA;;AAEG;AACI,MAAM,mBAAmB,GAAG,CAAC,MAInC,KAAI;AACH,IAAA,MAAM,UAAU,GAAG,sBAAsB,CAAC,MAAM,CAAC;AAEjD,IAAA,MAAM,aAAa,GACjB,YAAY,CACV,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAC9E,UAAU,EACV,MAAM,CAAC,IAAI,EAAE,OAAO,CACrB,IAAI,SAAS;AAEhB,IAAA,OAAO,aAAa;AACtB;AAEA;;AAEG;AACI,MAAM,uBAAuB,GAAG,CAAC,MAIvC,KAAI;AACH,IAAA,IACE,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC;AAC/B,SAAC,MAAM,CAAC,MAAM,CAAC,WAAW,KAAK,KAAK;aACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,WAAW,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAC3F;AACA,QAAA,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK;AACzC,QAAA,MAAM,KAAK,GAAG,YAAY,CAAC,aAAa,CAAC;QAEzC,IAAI,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC;AAE1C,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE;AAC5B,YAAA,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE;QACrD;AAEA,QAAA,OAAO,MAAM;IACf;AAEA,IAAA,OAAO,MAAM,CAAC,IAAI,EAAE,WAAW;AACjC;AAEA;;AAEG;AACI,MAAM,2BAA2B,GACtC,CAME,MAA2C,KAE7C,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAA+D,KAAI;IACjG,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAS,EAAE,MAAM,CAAC,CAAC;IACzF,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAS,EAAE,MAAM,CAAC,CAAC;IAEnF,IAAI,aAAa,KAAK,CAAC,CAAC,IAAI,gBAAgB,KAAK,CAAC,CAAC,EAAE;AACnD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,MAAM,cAAc,GAAG;AACrB,QAAA,GAAG,WAAW;AACd,QAAA,KAAK,EAAE;YACL,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC;YAC/C,MAAM;YACN,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC;AACjD,SAAA;KACF;AAED,IAAA,MAAM,WAAW,GAAG;AAClB,QAAA,GAAG,QAAQ;QACX,KAAK,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC;KACvG;IAED,OAAO;AACL,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,WAAW,EAAE,cAAc;KAC5B;AACH;;AC3eF,IAAI,YAAY,GAAG,CAAC;AAEpB;;AAEG;MACU,OAAO,CAAA;AAyClB,IAAA,WAAA,CACmB,OAAsB;AAEvC;;AAEG;IACa,YAE+C;AAE/D;;AAEG;IACa,gBAAuB;AAEvC;;AAEG;IACa,UAAqB;AAErC;;AAEG;IACa,cAAsB,EAAA;QAtBrB,IAAA,CAAA,OAAO,GAAP,OAAO;QAKR,IAAA,CAAA,YAAY,GAAZ,YAAY;QAOZ,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAKhB,IAAA,CAAA,UAAU,GAAV,UAAU;QAKV,IAAA,CAAA,cAAc,GAAd,cAAc;QAxDvB,IAAA,CAAA,GAAG,GAAG,YAAY,EAAE;QAErB,IAAA,CAAA,cAAc,GAAG,CAAC;QAClB,IAAA,CAAA,mBAAmB,GAAwB,IAAI;AAC/C,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAQ;QAC9B,IAAA,CAAA,iBAAiB,GAAsB,IAAI;AAEnD;;;;;;AAMG;QACM,IAAA,CAAA,WAAW,GAA2B,EAAE;AAEjD;;AAEG;AACH,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,aAAa,EAA0B;AAEjE;;AAEG;QACH,IAAA,CAAA,gBAAgB,GAAG,KAAK;QAEhB,IAAA,CAAA,cAAc,GAA0C,IAAI;QAEnD,IAAA,CAAA,OAAO,GAAG,IAAI,eAAe,CAAyB;AACrE,YAAA,IAAI,EAAA,UAAA;YACJ,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE;AAC3D,SAAA,CAAC;IA0BC;AAEH,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACxB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CACrC,GAAG,CAAC,CAAC,CAAC,KAAI;gBACR,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,0BAA0B;oBAAE;AAE9D,gBAAA,IAAI,oBAAoB,CAAC,CAAC,CAAC,EAAE;oBAC3B,OAAO,CAAC,IAAI,CACV,CAAA,MAAA,EAAS,IAAI,CAAC,gBAAgB,CAAA,4EAAA,CAA8E,CAC7G;gBACH;AACF,YAAA,CAAC,CAAC,EACF,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EACxC,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;QACH;QACA,OAAO,IAAI,CAAC,cAAc;IAC5B;AAEA;;;;;AAKG;AACH,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;IAC3B;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACtC,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,IACE,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC;AACnC,YAAA,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;AACpC,YAAA,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAClC;AACA,YAAA,OAAO,IAAI;QACb;QAEA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS;QAEvC,IAAI,CAAC,EAAE,EAAE;AACP,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE;IACxB;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;IAC1E;AAEA;;AAEG;AACH,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM;IACtC;AAEA,IAAA,IAAI,SAAS,GAAA;AACX,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,mBAAmB;IACnC;AAEA,IAAA,IAAI,mBAAmB,GAAA;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,aAAa,IAAI,EAAE;AAElD,QAAA,MAAM,WAAW,GAAqC;AACpD,YAAA,+BAA+B,EAAE,IAAI,CAAC,+BAA+B,IAAI,IAAI;AAC7E,YAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;SACtC;AAED,QAAA,OAAO,WAAW;IACpB;AAEA;;AAEG;AACH,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,kBAAkB,IAAI,IAAI;IACrD;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI;IAChD;AAEA,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,kBAAkB,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC;IACrD;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI;IAChC;IAEA,OAAO,CAAC,UAA+B,EAAE,EAAA;AACvC,QAAA,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,aAAa,EAAE,YAAY,GAAG,SAAS,EAAE,cAAc,GAAG,KAAK,EAAE,GAAG,OAAO;AACtG,QAAA,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO;AACrC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY;AAErC,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACvE,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AAC9D,YAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;QACtE;AAEA,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM;AACtB,QAAA,MAAM,IAAI,GAAmB,EAAE,EAAE,EAAE,YAAY,EAAE;AAEjD,QAAA,IAAI,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;YACtC,IAAI,cAAc,EAAE;gBAClB,IAAI,CAAC,KAAK,EAAE;YACd;iBAAO;AACL,gBAAA,OAAO,IAAI;YACb;QACF;QAEA,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,0CAA0B,IAAI,EAAE,CAAC;AAExD,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;YACtB,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC;QACrC;aAAO;AACL,YAAA,IAAI,QAAQ,GAAG,EAAE,CAAC,IAAI,CAAC;AAEvB,YAAA,IACE,YAAY;gBACZ,oBAAoB,CAAC,YAAY,CAAC;AAClC,gBAAA,WAAW,CAAC,MAAM;gBAClB,CAAC,mBAAmB,CAAC,YAAY,CAAC,mBAAmB,EAAE,QAAQ,CAAC,EAChE;;;gBAGA,QAAQ,GAAG,aAAa,CAAC;;oBAEvB,YAAY,CAAC,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,iBAAiB,EAAE,CAAC;oBAC/E,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACnC,iBAAA,CAAC,CAAC,IAAI,CACL,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,SAAS,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,KAAI;AAC5B,oBAAA,IAAI,KAAK,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;AACvC,wBAAA,OAAO,KAAK;oBACd;AAEA,oBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;wBAC9B,IAAI,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC;AAE3F,wBAAA,OAAO,KAAK;oBACd;AAEA,oBAAA,IAAI,CAAC,KAAK,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,YAAY,CAAC,EAAE;AACtD,wBAAA,OAAO,KAAK;oBACd;AAEA,oBAAA,OAAO,EAAE,CAAC,IAAa,CAAC;AAC1B,gBAAA,CAAC,CAAC,EACF,IAAI,CAAC,CAAC,CAAC,CACR;YACH;YAEA;AACG,iBAAA,IAAI,CACH,SAAS,CAAC,MAAK;AACb,gBAAA,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;gBAChF,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;gBAC3G,MAAM,OAAO,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;AAEzG,gBAAA,OAAO,OAAO,CAAW;oBACvB,aAAa,EAAE,IAAI,CAAC,gBAA0B;oBAC9C,MAAM;oBACN,IAAI;oBACJ,OAAO;oBACP,cAAc,EAAE,WAAW,CAAC,cAAc;oBAC1C,YAAY,EAAE,WAAW,CAAC,YAAY;oBACtC,eAAe,EAAE,WAAW,CAAC,eAAe;oBAC5C,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY;oBACvD,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO;AAC9C,iBAAA,CAAC,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,EAC5D,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CACzB;AACH,YAAA,CAAC,CAAC;AAGH,iBAAA,SAAS,EAAE;QAChB;AAEA,QAAA,OAAO,IAAI;IACb;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;AACvC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE;QAEpB,IAAI,CAAC,WAAW,CAAC;AACf,YAAA,IAAI,EAAA,WAAA;YACJ,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE;AACnF,SAAA,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,CAAC,MAAkB,EAAA;AACrB,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC5B,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,iBAAiB,GAAG,MAAM;QAE/B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3C,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAC1B,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,CAAC,GAAG,CAAC,CAAC,EACvC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,EAC3B,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,EACvC,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CACvD;AAED,QAAA,IAAI,CAAC,mBAAmB,GAAG,KAAK,CAAC,SAAS,CAAC;AACzC,YAAA,IAAI,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;AACpE,YAAA,QAAQ,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE;AACnC,SAAA,CAAC;AAEF,QAAA,OAAO,IAAI;IACb;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,mBAAmB,EAAE,WAAW,EAAE;AACvC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAC/B,QAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI;AAE7B,QAAA,OAAO,IAAI;IACb;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,mBAAmB,EAAE,WAAW,EAAE;AACvC,QAAA,IAAI,CAAC,mBAAmB,GAAG,IAAI;AAE/B,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAE5B,QAAA,OAAO,IAAI;IACb;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;AACrD,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,KAAK;AAE7B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC3E;AAEA,IAAA,SAAS,CAAC,QAAkC,EAAA;QAC1C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;AACrG,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,SAAS,CAAC,QAAgD,EAAA;QACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAClG,QAAA,OAAO,IAAI;IACb;AAEA;;AAEG;AACH,IAAA,aAAa,CAAC,UAAkB,EAAA;QAC9B,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;AACjC,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC;QAClC;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;QAE9B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IACjD;AAEA;;AAEG;AACH,IAAA,gBAAgB,CAAC,UAAkB,EAAA;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;AAC1C,QAAA,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB;QACF;QAEA,IAAI,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE;AAC9C,YAAA,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE;QAChC;AAEA,QAAA,IAAI,KAAK,IAAI,CAAC,EAAE;AACd,YAAA,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QACrC;QAEA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;IACjD;AAEA;;AAEG;IACH,cAAc,GAAA;AACZ,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC;IACjD;AAEA,IAAA,IAAY,MAAM,GAAA;AAChB,QAAA,OAAO,EAAE,IAAI,CAAC,cAAc;IAC9B;IAEQ,qBAAqB,GAAA;AAC3B,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;AAE9C,QAAA,IAAI,YAAY,IAAI,oBAAoB,CAAC,YAAY,CAAC,EAAE;AACtD,YAAA,OAAO,YAAY;QACrB;AAEA,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,iBAAiB,CAAC,YAAoC,EAAE,IAAoB,EAAE,OAA6B,EAAA;AACjH,QAAA,QAAQ,YAAY,CAAC,IAAI;AACvB,YAAA,KAAK,OAAO;YACZ,KAAK,aAAa,EAAE;gBAClB,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,YAAY;AACtD,gBAAA,MAAM,OAAO,GAAmB,EAAE,GAAG,IAAI,EAAE,iBAAiB,EAAE,IAAI,KAAK,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE;gBAE/G,IAAI,CAAC,WAAW,CAAC;AACf,oBAAA,IAAI,EAAA,SAAA;AACJ,oBAAA,IAAI,EAAE,OAAO;AACd,iBAAA,CAAC;gBACF;YACF;AAEA,YAAA,KAAK,iBAAiB;YACtB,KAAK,mBAAmB,EAAE;gBACxB,IAAI,CAAC,WAAW,CAAC;AACf,oBAAA,IAAI,EAAA,SAAA;oBACJ,QAAQ,EAAE,YAAY,CAAC,QAAQ;AAC/B,oBAAA,WAAW,EAAE,aAAa,IAAI,YAAY,GAAG,YAAY,CAAC,WAAW,GAAG,SAAS;oBACjF,IAAI;AACL,iBAAA,CAAC;gBAEF;YACF;YAEA,KAAK,SAAS,EAAE;gBACd,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,GAAG,YAAY;gBAC9D,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,YAAY,CAAC;AACjD,gBAAA,MAAM,YAAY,GAChB,KAAK,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,IAAI;AAC/D,sBAAG,QAAQ,CAAC,MAAM;sBACf,QAAqB;AAE5B,gBAAA,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE;oBAC5D,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AAE1F,oBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC;wBAC5B,IAAI,EAAE,IAAI,CAAC,UAAU;AACrB,wBAAA,QAAQ,EAAE,YAAY;wBACtB,EAAE;AACF,wBAAA,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK;AACtC,qBAAA,CAAC;gBACJ;gBAEA,IAAI,CAAC,WAAW,CAAC;AACf,oBAAA,IAAI,EAAA,SAAA;AACJ,oBAAA,QAAQ,EAAE,YAAY;AACtB,oBAAA,OAAO,EAAE,OAAO;oBAChB,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,kBAAkB,EAAE;AACjD,iBAAA,CAAC;gBAEF;YACF;YAEA,KAAK,SAAS,EAAE;AACd,gBAAA,MAAM,EAAE,KAAK,EAAE,GAAG,YAAY;AAC9B,gBAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,0CAA0B,KAAK,EAAE,IAAI,EAAE,CAAC;AACrF,gBAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAEvD,gBAAA,IACE,CAAC,kBAAkB;AACnB,oBAAA,OAAO,EAAE,oBAAoB;oBAC7B,KAAK,CAAC,MAAM,KAAK,GAAG;AACpB,oBAAA,CAAC,kBAAkB,CAAC,mCAAmC,EACvD;oBACA,OAAO,OAAO,EAAE;gBAClB;AAEA,gBAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,aAAa,EAAE;AAChD,gBAAA,IAAI,CAAC,KAAK;oBAAE,OAAO,OAAO,EAAE;AAE5B,gBAAA,KAAK,CAAC;qBACH,IAAI,CACH,iBAAiB,EAAE,EACnB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,GAAG,CAAC,CAAC,KAAK,KACR,mBAAmB,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,EAAE,CAClG;AAEF,qBAAA,SAAS,EAAE;gBAEd;YACF;YAEA,KAAK,QAAQ,EAAE;gBACb,IAAI,CAAC,WAAW,CAAC;AACf,oBAAA,IAAI,EAAA,WAAA;oBACJ,IAAI;AACL,iBAAA,CAAC;gBAEF;YACF;;IAEJ;AAEQ,IAAA,cAAc,CAAC,CAAyB,EAAA;AAC9C,QAAA,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE;AAC7D,YAAA,OAAO,EAAE,CAAC,CAAC,CAAmC;QAChD;QAEA,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;AAEvF,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC;aACtB,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE;aAC9F,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C;AAEQ,IAAA,WAAW,CAAC,CAAyB,EAAA;;AAE3C,QAAA,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvC;AAEQ,IAAA,WAAW,CAAC,OAAmC,EAAE,IAAoB,EAAE,OAA4B,EAAA;AACzG,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI;YAAE;QAE5B,MAAM,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,iBAAiB,GAAG,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI;AAClG,QAAA,MAAM,gBAAgB,GAAG,QAAQ,EAAE,QAAQ,IAAI,OAAO;AACtD,QAAA,MAAM,iBAAiB,GAAG,QAAQ,EAAE,SAAS,IAAI,QAAQ;AACzD,QAAA,MAAM,kBAAkB,GAAG,QAAQ,EAAE,UAAU,IAAI,CAAC;AACpD,QAAA,MAAM,iBAAiB,GAAG,QAAQ,EAAE,SAAS,IAAI,KAAK;AACtD,QAAA,MAAM,eAAe,GAAG,QAAQ,EAAE,eAAe,IAAI,KAAK;QAE1D,MAAM,gBAAgB,GAAG,MAAK;YAC5B,IAAI,KAAK,EAAE;gBACT,IAAI,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC;gBAEzF;YACF;YAEA,IAAI,CAAC,iBAAiB,CACpB,EAAE,QAAQ,EAAE,QAAoB,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAC3E,IAAI,EACJ,OAAO,CACR;AACH,QAAA,CAAC;QAED,IAAI,QAAQ,EAAE;YACZ,QAAQ,CAAC,KAAK;AACX,iBAAA,IAAI,CACH,GAAG,CAAC,CAAC,CAAC,KAAI;AACR,gBAAA,IAAI,CAAC,KAAK,kBAAkB,GAAG,CAAC,EAAE;AAChC,oBAAA,gBAAgB,EAAE;gBACpB;qBAAO;AACL,oBAAA,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,GAAG,CAAC,EAAE,gBAAgB,GAAG,kBAAkB,CAAC;AACrF,oBAAA,MAAM,UAAU,GAAG,CAAC,OAAO,IAAI,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,GAAG;oBAE5E,IAAI,CAAC,iBAAiB,CACpB;wBACE,IAAI,EAAE,iBAAiB,KAAK,QAAQ,GAAG,iBAAiB,GAAG,mBAAmB;wBAC9E,OAAO,EAAE,OAAO,IAAI,EAAE;wBACtB,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,iBAAiB,GAAG,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC,EAAE;wBAC5F,WAAW,EAAE,eAAe,GAAG,SAAS,GAAG,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAE;AAC/D,qBAAA,EACD,IAAI,EACJ,OAAO,CACR;gBACH;YACF,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,kBAAkB,GAAG,CAAC,EAAE,IAAI,CAAC;AAEnD,iBAAA,SAAS,EAAE;QAChB;aAAO,IAAI,iBAAiB,EAAE;YAC5B,QAAQ,CAAC,KAAK;AACX,iBAAA,IAAI,CACH,GAAG,CAAC,CAAC,CAAC,KAAI;AACR,gBAAA,IAAI,CAAC,KAAK,CAAC,EAAE;AACX,oBAAA,gBAAgB,EAAE;gBACpB;qBAAO;AACL,oBAAA,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC;oBACvB,IAAI,CAAC,iBAAiB,CACpB;AACE,wBAAA,IAAI,EAAE,aAAa;wBACnB,OAAO,EAAE,OAAO,IAAI,EAAE;AACtB,wBAAA,UAAU,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS;AACnC,wBAAA,WAAW,EAAE,SAAS;AACvB,qBAAA,EACD,IAAI,EACJ,OAAO,CACR;gBACH;YACF,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;AAE9B,iBAAA,SAAS,EAAE;QAChB;aAAO;YACL,KAAK,CAAC,KAAK;AACR,iBAAA,IAAI,CACH,GAAG,CAAC,MAAM,gBAAgB,EAAE,CAAC,EAC7B,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEzB,iBAAA,SAAS,EAAE;QAChB;IACF;AACD;;AC7nBD;;AAEG;AACI,MAAM,mBAAmB,GAAG,CAAC,YAA0B,KAC5D,YAAY,YAAY;AAE1B;;AAEG;AACI,MAAM,oBAAoB,GAAG,CAClC,YAA0B,KACkB,YAAY,YAAY;AAEtE;;AAEG;AACI,MAAM,0BAA0B,GAAG,CAAC,YAA0B,KACnE,YAAY,YAAY;;ACL1B;;AAEG;MACU,oBAAoB,CAAA;AAS/B,IAAA,WAAA,CAAmB,OAAoC,EAAA;QAApC,IAAA,CAAA,OAAO,GAAP,OAAO;AART,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAAW;AACjC,QAAA,IAAA,CAAA,qBAAqB,GAAG,IAAI,eAAe,CAA2B,IAAI,CAAC;QAE3E,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAAgB;AAC7D,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,YAAY,EAAE,IAAI;AACnB,SAAA,CAAC;QAGA,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,EAAE,aAAa,IAAI,IAAI;AAClE,QAAA,MAAM,WAAW,GACf,OAAO,CAAC,aAAa,EAAE,UAAU,IAAI,aAAa,IAAI,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,IAAI,IAAI,IAAI;AAEnH,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;AACjB,YAAA,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,IAAI;YAC5B,YAAY,EAAE,OAAO,CAAC,aAAa,EAAE,KAAK,IAAI,WAAW,IAAI,IAAI;AAClE,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AACnD,YAAA,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE;AACtC,gBAAA,OAAO,CAAC,KAAK,CACX,oJAAoJ,CACrJ;YACH;YAEA;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YACrB,IAAI,CAAC,iBAAiB,EAAE;AAExB,YAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,IAAI,aAAa,EAAE;gBACvF,IAAI,CAAC,SAAS,EAAE;YAClB;QACF;AAAO,aAAA,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;YACnC,IAAI,CAAC,aAAa,EAAE;QACtB;IACF;AAEA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,EAAE,aAAa,EAAE,CAAA,OAAA,EAAU,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAA,CAAE,EAAE;IACtE;AAEA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE;IACrC;AAEA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;IACjC;AAEA,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,YAAY,EAAE;IAClD;AAEA,IAAA,IAAI,mBAAmB,GAAA;AACrB,QAAA,OAAO,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE;IAC9C;AAEA,IAAA,IAAI,mCAAmC,GAAA;AACrC,QAAA,QACE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa;aAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,6BAA6B,KAAK,SAAS;gBACrE,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,6BAA6B,CAAC;IAE/D;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;AAC3B,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC;QAErC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE;YAC1C,IAAI,CAAC,YAAY,EAAE;QACrB;IACF;IAEA,YAAY,GAAA;QACV,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE;AAC3C,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;QAChD;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAC7B,YAAA,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC;QAClD;QAEA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,GAAG,IAAI;QAE/C,IAAI,CAAC,SAAS,EAAE;IAClB;IAEA,aAAa,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE;AAC3C,YAAA,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC;QAChD;QAEA,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,GAAG,KAAK;QAEhD,IAAI,CAAC,YAAY,EAAE;IACrB;IAEA,YAAY,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE;IAC7B;AAEA;;AAEG;IACH,aAAa,GAAA;QACX,MAAM,YAAY,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE;AAE1D,QAAA,IAAI,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE;AAC/C,YAAA,OAAO,YAAY;QACrB;AAEA,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY;QAEpD,IAAI,CAAC,mBAAmB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YACvD;QACF;QAEA,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,kBAAkB,GAAG;AAC3D,YAAA,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;AACxB,YAAA,YAAY,EAAE,mBAAmB;AAClC,SAAA,CAAC,IAAI;AACJ,YAAA,IAAI,EAAE,EAAE,YAAY,EAAE,mBAAmB,EAAE;SAC5C;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC;aACtC,OAAO,CAAC,IAAI;aACZ,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC;AAE3D,QAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAA0B,CAAC;AAE3D,QAAA,IAAI,CAAC;aACF,IAAI,CACH,gBAAgB,EAAE,EAClB,GAAG,CAAC,CAAC,KAAK,KAAI;AACZ,YAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;gBAC9B,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,eAAe,EAAE;AAC/C,oBAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,CAAC,QAA8B,CAAC;AAE/F,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;gBAC5B;qBAAO;AACL,oBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;;AAEjB,wBAAA,KAAK,EAAG,KAAK,CAAC,QAAgB,CAAC,OAAO,CAAC;;AAEvC,wBAAA,YAAY,EAAG,KAAK,CAAC,QAAgB,CAAC,cAAc,CAAC;AACtD,qBAAA,CAAC;gBACJ;gBACA,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,aAAa,IAAI,IAAI;AAEvE,gBAAA,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,aAAa,EAAE;oBACvF,IAAI,CAAC,SAAS,EAAE;gBAClB;gBAEA,IAAI,CAAC,iBAAiB,EAAE;YAC1B;AAAO,iBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;AACrC,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;gBAEvD,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE;oBAC1C,IAAI,CAAC,YAAY,EAAE;gBACrB;YACF;QACF,CAAC,CAAC,EACF,iBAAiB,EAAE,EACnB,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAEzB,aAAA,SAAS,EAAE;AAEd,QAAA,OAAO,KAAK;IACd;IAEQ,SAAS,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY;YAAE;QAE1E,SAAS,CACP,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EACrC,IAAI,CAAC,MAAM,CAAC,YAAY,EACxB,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,mBAAmB,EAC9C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,EACvC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EACrC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,cAAc,CAC1C;IACH;IAEQ,YAAY,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,UAAU;YAAE;QAE7C,YAAY,CACV,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EACrC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,UAAU,EACrC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CACxC;IACH;IAEQ,iBAAiB,GAAA;AACvB,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YACrD;QACF;QAEA,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAE/C,IAAI,CAAC,MAAM,EAAE;YACX;QACF;QAEA,MAAM,qBAAqB,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,qBAAqB,IAAI,KAAK;AACvF,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,qBAAqB,CAAuB;AACrE,QAAA,MAAM,WAAW,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI;QACjC,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,aAAa,IAAI,WAAW;AAE7E,QAAA,IAAI,SAAS,KAAK,SAAS,EAAE;AAC3B,YAAA,MAAM,IAAI,KAAK,CAAC,qCAAqC,qBAAqB,CAAA,UAAA,CAAY,CAAC;QACzF;QAEA,MAAM,aAAa,GAAG,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC,OAAO,EAAE,GAAG,aAAa,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;QAEjG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,IAAA,kBAAA;QAEpD,QAAQ,QAAQ;AACd,YAAA,KAAA,kBAAA;gBACE,KAAK,CAAC,aAAa;AAChB,qBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;qBAC7B,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;gBACxC;;IAEN;AACD;;ACvPD,MAAM,iCAAiC,mBAAmB,cAAc,CACtE,MAAK;AACH,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK;gFAAC;AAC7B,IAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC;IAEtC,OAAO;QACL,OAAO;QACP,QAAQ;KACT;AACH,CAAC,EACD,EAAE,IAAI,EAAE,+BAA+B,EAAE,CAC1C;AAED;;AAEG;AACI,MAAM,iCAAiC,mBAAmB,WAAW,CAAC,iCAAiC;AAC9G;;AAEG;AACI,MAAM,gCAAgC,mBAAmB,UAAU,CAAC,iCAAiC;;AClB5G;;AAEG;MACU,aAAa,CAAA;IAqFxB,WAAA,CACU,OAAiF,EACjF,SAA8B,EAAA;QAD9B,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,SAAS,GAAT,SAAS;AAhFF,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAAU,EAAE,CAAC;AAC3C,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;AACxD,QAAA,IAAA,CAAA,uBAAuB,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;AAClE,QAAA,IAAA,CAAA,YAAY,GAAG,IAAI,eAAe,CAAgB,IAAI,CAAC;AACvD,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAAS,EAAE,CAAC;AAEhD,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC1C,SAAS,CAAC,CAAC,OAAO,KAAI;AACpB,YAAA,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;AACnB,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC;YACf;AAEA,YAAA,OAAO,aAAa,CAClB,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,KAChB,KAAK,CAAC,MAAM,CAAC,IAAI,CACf,aAAa,EAAE,EACf,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,CACnC,CACF,CACF;AACH,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,SAAS,KAAI;AAChB,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK;AACxD,YAAA,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,KAAK;AAExD,YAAA,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,EAAE;gBAC5B;YACF;YAEA,MAAM,UAAU,GACd,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,GAAG;gBAC1C,QAAQ,EAAE,SAAS,CAAC,QAAyB;gBAC7C,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,IAAI,EAAE,SAAS,CAAC,UAAU;aAC3B,CAAC;;gBAED,SAAS,CAAC,QAAgB,EAAE,UAAU;AACvC,gBAAA,IAAI;AAEN,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AACpC,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,SAAS,KAAI;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;AACrB,gBAAA,OAAO,IAAI;YACb;YAEA,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAC/B,CAAC,GAAG,EAAE,QAAQ,KAAI;gBAChB,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,cAAc;gBAC3D,IAAI,IAAI,GAAG;sBACP,YAAY,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAyB;AACzD,sBAAG,QAAQ,CAAC,KAAK,CAAC,QAA6B;gBAEjD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE;oBACjC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,EAAsB;gBAChD;gBAEA,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,aAAa,KAAK,OAAO,EAAE;AACnD,oBAAA,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;gBACtB;qBAAO;AACL,oBAAA,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;gBACnB;AACA,gBAAA,OAAO,GAAG;YACZ,CAAC;;AAED,YAAA,EAA6B,CAC9B;AAED,YAAA,OAAO,QAAQ;AACjB,QAAA,CAAC,CAAC,EACF,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;AAEgB,QAAA,IAAA,CAAA,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC9C,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,EACrD,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;AAMC,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;IAChE;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE;IAC1C;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;IACtC;AAEA,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,uBAAuB,CAAC,YAAY,EAAE;IACpD;AAEA,IAAA,IAAI,qBAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,uBAAuB,CAAC,QAAQ,EAAE;IAChD;AAEA,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE;IACzC;AAEA,IAAA,IAAI,UAAU,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE;IACrC;AAEA,IAAA,IAAI,aAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE;IAC3C;AAEA,IAAA,IAAI,YAAY,GAAA;AACd,QAAA,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;IACvC;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,UAAU;IACxB;IAEA,QAAQ,GAAA;AACN,QAAA,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC;QACnD,MAAM,cAAc,GAClB,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,eAAe,GAAG;AACzC,YAAA,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,YAAY,EAAE,IAAI,CAAC,YAAY;SAChC,CAAC,IAAI,OAAO;AAEf,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;AACzD,YAAA,OAAO,CAAC,KAAK,CACX,wHAAwH,CACzH;YAED;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC;AAE3D,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAW;AAExE,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE;AAChC,YAAA,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACnF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;AAEnD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;AAChC,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,cAAc,CAAC;IACnD;AAEA,IAAA,KAAK,CACH,SAGC,EAAA;AAED,QAAA,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,IAAI,SAAS,IAAI,EAAE,CAAC,EAAE;AAExD,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE,CAAC;AAC9D,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAEtB,IAAI,CAAC,QAAQ,EAAE;IACjB;IAEQ,WAAW,CAAC,MAAgF,EAAE,IAAY,EAAA;AAChH,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC;AAEhF,QAAA,MAAM,QAAQ,GAAG;YACf,CAAC,iBAAiB,GAAG;gBACnB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,MAAM,GAAG,IAAI;AACzC,aAAA;SACF;AAED,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC;AAElF,QAAA,MAAM,SAAS,GAAG;YAChB,CAAC,kBAAkB,GAAG;AACpB,gBAAA,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,OAAO,GAAG,MAAM,EAAE,UAAU,EAAE,KAAK,IAAI,EAAE;AACtE,aAAA;SACF;AAED,QAAA,MAAM,aAAa,GAAG,MAAM,EAAE,WAAW,IAAI,EAAE;AAE/C,QAAA,MAAM,UAAU,GACd,iBAAiB,KAAK;AACpB,cAAE;AACE,gBAAA,GAAG,aAAa;gBAChB,CAAC,iBAAiB,GAAG;oBACnB,IAAI,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC;oBACnD,GAAG,QAAQ,CAAC,kBAAkB,CAAC;oBAC/B,GAAG,SAAS,CAAC,kBAAkB,CAAC;AACjC,iBAAA;AACF;AACH,cAAE;AACE,gBAAA,GAAG,aAAa;gBAChB,CAAC,iBAAiB,GAAG;oBACnB,IAAI,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAAC,IAAI,EAAE,CAAC;oBACnD,GAAG,QAAQ,CAAC,iBAAiB,CAAC;AAC/B,iBAAA;gBACD,CAAC,kBAAkB,GAAG;oBACpB,IAAI,MAAM,EAAE,WAAW,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC;oBACpD,GAAG,SAAS,CAAC,kBAAkB,CAAC;AACjC,iBAAA;aACF;AAEP,QAAA,OAAO,UAAU;IACnB;AAEQ,IAAA,oBAAoB,CAAC,QAAgD,EAAA;AAC3E,QAAA,MAAM,GAAG,GAAG,QAAQ,IAAI,OAAO;QAE/B,QAAQ,GAAG;AACT,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,YAAY;AACrB,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,MAAM;AACf,YAAA,KAAK,QAAQ;AACX,gBAAA,OAAO,SAAS;AAClB,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,WAAW;AACpB,YAAA;AACE,gBAAA,MAAM,IAAI,KAAK,CAAC,8BAA8B,GAAG,CAAA,CAAE,CAAC;;IAE1D;AACD;;ACvPD;;AAEG;AACI,MAAM,yBAAyB,GAAG,CAMvC,MAAgF,KAC7E;AAEL;;AAEG;MACU,iCAAiC,GAAG,CAAC,EAAE,IAAI,EAAE,YAAY,EAA8B,KAClG,YAAY,IAAI,IAAI,GAAG,CAAC;;ACpB1B;AAgDA;;AAEG;MACU,oBAAoB,GAAG,IAAI,cAAc,CAA8B,sBAAsB;AAI1G;;AAEG;MAUU,sBAAsB,CAAA;;;AAgCjC,IAAA,IACI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,cAAc;IAC5B;IACA,IAAI,aAAa,CAAC,CAAI,EAAA;QACpB,IAAI,CAAC,OAAO,EAAE;AAEd,QAAA,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,CAAC;AACvB,YAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;YAEjC;QACF;AAEA,QAAA,IAAI,CAAC,cAAc,GAAG,CAAC;QACvB,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE;IACvC;AAGA,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,WAAW;IACzB;AAEA,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,IAAI,CAAC,qBAAqB;IACnC;AAEA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;IACnC;AAIA,IAAA,OAAO,sBAAsB,CAE3B,IAA+B,EAAE,IAAa,EAAA;AAC9C,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,WAAA,GAAA;AArEiB,QAAA,IAAA,CAAA,mBAAmB,GAAG,IAAI,OAAO,EAAW;AAC5C,QAAA,IAAA,CAAA,WAAW,GAA4B;AACtD,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,KAAK,EAAE,IAAI;AAEX,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,WAAW,EAAE,KAAK;AAClB,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,qBAAqB,EAAE,IAAI;AAC3B,YAAA,UAAU,EAAE,IAAI;AAChB,YAAA,YAAY,EAAE,IAAI;AAElB,YAAA,YAAY,EAAE,IAAI;SACnB;QACO,IAAA,CAAA,qBAAqB,GAA8B,IAAI;QAE9C,IAAA,CAAA,QAAQ,GAAG,aAAa,EAAE;AACnC,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAC/B,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,EAAC,WAAoC,EAAC;AAC9D,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;QAC1B,IAAA,CAAA,0BAA0B,GAAG,gCAAgC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAE7E,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,eAAe,CAA6B,EAAE,CAAC;AAoC7E,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AASjD,QAAA,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC;IAClF;AAEQ,IAAA,kBAAkB,CAAC,MAAS,EAAA;QAClC,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,MAAa,EAAE,IAAI,CAAC,QAAQ,CAAuB;AAEtF,QAAA,aAAa,CAAC;AACZ,YAAA,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACvF,IAAI,CAAC,0BAA0B,CAAC,QAAQ;AACxC,YAAA,QAAQ,CAAC,KAAK;SACf;AACE,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE,SAAS,EAAE,aAAa,CAAC,KAAI;YACxD,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW;YACnD,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;YACjD,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,QAAQ,CAAC,YAAY;YACrD,IAAI,CAAC,WAAW,CAAC,WAAW;AAC1B,gBAAA,CAAC,QAAQ,CAAC,UAAU,KAAK,IAAI;oBAC3B,QAAQ,CAAC,WAAW,KAAK,IAAI;AAC7B,oBAAA,QAAQ,CAAC,UAAU,GAAG,QAAQ,CAAC,WAAW;AAC5C,oBAAA,KAAK;YACP,IAAI,CAAC,WAAW,CAAC,qBAAqB,GAAG,QAAQ,CAAC,qBAAqB;AACvE,YAAA,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,YAAY;YAE5C,IAAI,mBAAmB,CAAC,KAAK,CAAC,IAAI,SAAS,IAAI,CAAC,aAAa,EAAE;gBAC7D,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,MAAM,GAAG,IAAI;AAC5E,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI;AAC7B,gBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI;YACtE;AAAO,iBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK;gBAChC,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;AACpC,gBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,KAAK;AAEpC,gBAAA,IAAI,aAAa,CAAC,YAAY,CAAC,EAAE;oBAC/B,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC;gBAC9D;YACF;AAAO,iBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;AACrC,gBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK;AAChC,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI;AAC7B,gBAAA,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,KAAK;AACpC,gBAAA,IAAI,CAAC,WAAW,CAAC,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,aAA2C;AAC3G,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC;YACjC;AAEA,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,SAAS,CAAC,IAAI,CAAC,mBAAmB,CAAC;AAEpC,aAAA,SAAS,EAAE;AAEd,QAAA,OAAO,QAAQ;IACjB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAC/B;QACF;AAEA,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;YAC5B;QACF;AAEA,QAAA,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE;IACvC;AAEA,IAAA,KAAK,CAAC,SAAgD,EAAA;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;YAC/B;QACF;AAEA,QAAA,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,SAAgB,CAAC;IACpD;IAEQ,OAAO,GAAA;AACb,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;AAEnC,QAAA,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK;AAChC,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,eAAe,GAAG,IAAI;AACvC,QAAA,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI;AAEjC,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,KAAK;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,KAAK;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,WAAW,GAAG,IAAI;AACnC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,IAAI;AACpC,QAAA,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,IAAI;AAElC,QAAA,IAAI,CAAC,WAAW,CAAC,YAAY,GAAG,IAAI;AAEpC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACtB;8GApKW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,aAAA,EAAA,CAAA,iBAAA,EAAA,eAAA,CAAA,EAAA,EAAA,SAAA,EALtB;AACT,YAAA,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,sBAAsB,EAAE;AACtE,YAAA,iCAAiC,EAAE;AACpC,SAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAEU,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBATlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE,iBAAiB;AAE3B,oBAAA,SAAS,EAAE;AACT,wBAAA,EAAE,OAAO,EAAE,oBAAoB,EAAE,WAAW,wBAAwB,EAAE;AACtE,wBAAA,iCAAiC,EAAE;AACpC,qBAAA;AACF,iBAAA;;sBAiCE,KAAK;uBAAC,iBAAiB;;;AC/F1B;;AAEG;MAIU,6BAA6B,CAAA;AAH1C,IAAA,WAAA,GAAA;AAIU,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,UAAU,CAAC;AACxD,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,oBAAoB,CAAC;QAErD,IAAA,CAAA,uBAAuB,GAAG,KAAK,CAAgB,IAAI;oGAAC;;QAGpD,IAAA,CAAA,qBAAqB,GAAG,KAAK,CAAqC,IAAI;kGAAC;AAE/D,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,OAAO,EAAW;QAChC,IAAA,CAAA,QAAQ,GAAgC,IAAI;QAEpD,IAAA,CAAA,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,OAAO,CAAC;AAE1D,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,IAAI,IAAI,CAAC,cAAc;0FAAC;AAuCpF,IAAA;IArCC,QAAQ,GAAA;QACN,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,KAAK,QAAQ;QAExE,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,EAAE,CAAC;QAChG;aAAO;YACL,IAAI,CAAC,yBAAyB,EAAE;QAClC;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE;AAC1B,QAAA,IAAI,CAAC,QAAQ,EAAE,UAAU,EAAE;IAC7B;IAEQ,yBAAyB,GAAA;AAC/B,QAAA,MAAM,uBAAuB,GAAG,IAAI,CAAC,uBAAuB,EAAE;QAC9D,IAAI,CAAC,QAAQ,GAAG,IAAI,oBAAoB,CACtC,CAAC,OAAO,KAAI;AACV,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;AAExB,YAAA,IAAI,CAAC,KAAK;gBAAE;AAEZ,YAAA,IAAI,KAAK,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE;AACjE,gBAAA,IAAI,CAAC,aAAa,EAAE,CAAC,YAAY,EAAE;YACrC;AACF,QAAA,CAAC,EACD;AACE,YAAA,IAAI,EAAE,uBAAuB,GAAG,QAAQ,CAAC,aAAa,CAAC,uBAAuB,CAAC,GAAG,IAAI;AACtF,YAAA,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAChC,SAAA,CACF;QAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;IACtD;8GApDW,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,qBAAA,EAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAHzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qDAAqD;AAChE,iBAAA;;;ACsED;;AAEG;MAIU,cAAc,CAAA;AAqBzB,IAAA,OAAO,sBAAsB,CAC3B,IAAuB,EACvB,IAAa,EAAA;AAEb,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,WAAA,GAAA;AA3BQ,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,YAAY,CAAC;AACnC,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAEtB,QAAA,IAAA,CAAA,WAAW,GAA6B;AACvD,YAAA,SAAS,EAAE,IAAI;AACf,YAAA,OAAO,EAAE,IAAI;AACb,YAAA,OAAO,EAAE,KAAK;AACd,YAAA,UAAU,EAAE,KAAK;AACjB,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,KAAK,EAAE,IAAI;SACZ;QAED,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,QAAQ,4EAAM,KAAK,EAAE,SAAS,EAAA,CAAG;QAE/C,IAAA,CAAA,KAAK,GAAG,KAAK,CAAC,KAAK,6EAAI,KAAK,EAAE,cAAc,EAAA,CAAG;AAE/C,QAAA,IAAA,CAAA,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AAUvC,QAAA,MAAM,CAAC,gBAAgB,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;QAElF,MAAM,CAAC,MAAK;YACV,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAExC,SAAS,CAAC,MAAK;gBACb,IAAI,CAAC,KAAK,EAAE;AACV,oBAAA,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI;AACjC,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI;AAC/B,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK;AAChC,oBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,KAAK;AACnC,oBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI;AAC7B,oBAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,IAAI;AAChC,oBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI;AAC7B,oBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI;oBAE7B;gBACF;AAEA,gBAAA,IAAI,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE;oBACjF,KAAK,CAAC,OAAO,EAAE;gBACjB;AAEA,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,GAAI,KAAK,CAAC,IAAiC,GAAG,IAAI;AACnG,gBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAmB;AAC9C,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE;AAC/B,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;YAE1B,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;oBAC9B,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI;oBAClD,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,MAAM;AAEtG,oBAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE;AAChC,wBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI;oBACjC;gBACF;qBAAO;AACL,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK;AAChC,oBAAA,IAAI,CAAC,WAAW,CAAC,UAAU,GAAG,KAAK;AACnC,oBAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,IAAI;gBAClC;AAEA,gBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;oBAC9B,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,KAAK,CAAC,QAAmC;oBACpE,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,KAAK,CAAC,QAAmC;gBACxE;qBAAO,IAAI,CAAC,KAAK,EAAE;AACjB,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,GAAG,IAAI;AAC/B,oBAAA,IAAI,CAAC,WAAW,CAAC,SAAS,GAAG,IAAI;gBACnC;AAEA,gBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;oBAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK;oBAEpC,IAAI,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE;wBAC7C,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC;oBAC9D;gBACF;qBAAO;AACL,oBAAA,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,IAAI;gBAC/B;AAEA,gBAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;8GAhGW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;kGAAd,cAAc,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAH1B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;AACtB,iBAAA;;;ACjFD;;AAEG;MAEU,kBAAkB,CAAA;AAC7B,IAAA,SAAS,CAAC,KAAiB,EAAA;AACzB,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,gBAAgB;AAEpC,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;;;YAI7B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;AAE9B,YAAA,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;AACpB,gBAAA,OAAO,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YACzD;AAEA,YAAA,OAAO,KAAK;QACd;AAEA,QAAA,OAAO,KAAe;IACxB;8GAlBW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAlB,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,CAAA;;2FAAlB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,IAAI;mBAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE;;;ACKhC;;AAEG;MACU,2BAA2B,GAAG,IAAI,cAAc,CAC3D,6BAA6B;AAG/B;;AAEG;AACI,MAAM,6BAA6B,GAAG,CAAC,WAAuC,KAAI;AACvF,IAAA,IAAI,CAAC,SAAS,EAAE,EAAE;AAChB,QAAA,OAAO,CAAC,IAAI,CACV,+IAA+I,CAChJ;IACH;IAEA,OAAO;AACL,QAAA,OAAO,EAAE,2BAA2B;AACpC,QAAA,QAAQ,EAAE,WAAW;AACrB,QAAA,KAAK,EAAE,IAAI;KACZ;AACH;;ACNA;;AAEG;MAWU,sBAAsB,CAAA;AAuMjC,IAAA,WAAA,GAAA;AAtMQ,QAAA,IAAA,CAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;AAE7B,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,2BAA2B,CAAC;QAC/C,IAAA,CAAA,SAAS,GAAG,aAAa,EAAE;QAEpC,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,KAAK;mFAAC;QACtB,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK;0FAAC;QAC7B,IAAA,CAAA,UAAU,GAAG,MAAM,CAA0B,MAAM;uFAAC;QACpD,IAAA,CAAA,aAAa,GAAG,MAAM,CAAgB,MAAM;0FAAC;QAC7C,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAgB,OAAO;qFAAC;QAEzC,IAAA,CAAA,YAAY,GAAG,MAAM,CAAC,KAAK;yFAAC;QAC5B,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,KAAK;4FAAC;QAC/B,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,KAAK;4FAAC;QAC/B,IAAA,CAAA,oBAAoB,GAAG,MAAM,CAAC,KAAK;iGAAC;QACpC,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK;0FAAC;AAE7B,QAAA,IAAA,CAAA,oBAAoB,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC;QAEzC,IAAA,CAAA,gBAAgB,GAAG,QAAQ,CACnC,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CACxF;QACS,IAAA,CAAA,eAAe,GAAG,MAAM,CAAgB,IAAI;4FAAC;AAE7C,QAAA,IAAA,CAAA,oBAAoB,GAAG,QAAQ,CAAC,MAAK;AAC7C,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB;YACvC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;YACvE,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC;YAE3C,IAAI,CAAC,MAAM,EAAE;AACX,gBAAA,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC;YACtE;AAEA,YAAA,OAAO,MAAM;QACf,CAAC;iGAAC;AAEQ,QAAA,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAAK;AACnC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAE1C,YAAA,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM;QAC7B,CAAC;uFAAC;AAEQ,QAAA,IAAA,CAAA,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;AAEpC,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,eAAe,CAAe,EAAE,CAAC;AACvD,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;AAExB,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,eAAe,CAAe,EAAE,CAAC;AAE9D,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,MAAK;AACtC,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,eAAe,EAAE;AACjC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE;AAEjC,YAAA,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;AACxB,gBAAA,OAAO,IAAI;YACb;AAEA,YAAA,IAAI,IAAI,KAAK,MAAM,EAAE;gBACnB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,IAAI;YAC1D;YAEA,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,IAAI,IAAI;QACzE,CAAC;0FAAC;AAEQ,QAAA,IAAA,CAAA,cAAc,GAAG,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC;AAEjD,QAAA,IAAA,CAAA,wBAAwB,GAAG,QAAQ,CAAC,MAAK;AACjD,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAElC,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,IAAI;YAEvB,OAAO,KAAK,CAAC,KAAoC;QACnD,CAAC;qGAAC;AAEQ,QAAA,IAAA,CAAA,yBAAyB,GAAG,YAAY,CAAC,IAAI,CAAC,wBAAwB,CAAC;AAE9D,QAAA,IAAA,CAAA,8BAA8B,GAAG,IAAI,CAAC,yBAAyB,CAAC,IAAI,CACrF,SAAS,CACP,CAAC,CAAC,KACA,CAAC,EAAE,QAAQ,CAAC,IAAI,CACd,SAAS,CAAC,EAAE,CAAC,EACb,GAAG,CAAC,MAAK;YACP,IAAI,CAAC,CAAC,CAAC,WAAW;AAAE,gBAAA,OAAO,IAAI;YAE/B,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,MAAM,CACrC,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACpB,gBAAA,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK;AAChB,gBAAA,OAAO,GAAG;YACZ,CAAC,EACD,EAA6B,CAC9B;QACH,CAAC,CAAC,CACH,IAAI,EAAE,CAAC,IAAI,CAAC,CAChB,CACF;AAES,QAAA,IAAA,CAAA,sBAAsB,GAAG,QAAQ,CAAC,MAAK;AAC/C,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE;AAElC,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,IAAI;AAEvB,YAAA,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY;AAC9B,YAAA,MAAM,KAAK,GACT,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,IAAI;AAE9G,YAAA,MAAM,SAAS,GAAG;gBAChB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,KAAK;gBACL,cAAc,EAAE,GAAG,CAAC,cAAc;gBAClC,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,eAAe,EAAE,GAAG,CAAC,eAAe;gBACpC,aAAa,EAAE,GAAG,CAAC,aAAa;gBAChC,kBAAkB,EAAE,GAAG,CAAC,kBAAkB;AAC1C,gBAAA,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM;aAC7B;AAED,YAAA,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE;gBACzB,OAAO;AACL,oBAAA,GAAG,SAAS;oBACZ,KAAK,EAAE,GAAG,CAAC,KAAK;oBAChB,WAAW,EAAE,GAAG,CAAC,WAAW;iBAC7B;YACH;YAEA,OAAO;AACL,gBAAA,GAAG,SAAS;aACb;QACH,CAAC;mGAAC;QAEQ,IAAA,CAAA,YAAY,GAAG,QAAQ,CAC/B,YAAY,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CACvF;AAES,QAAA,IAAA,CAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAK;AAC5C,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE;AAEpC,YAAA,IAAI,CAAC,QAAQ;AAAE,gBAAA,OAAO,IAAI;AAE1B,YAAA,IAAI,QAAQ,YAAY,wBAAwB,EAAE;gBAChD,OAAO;AACL,oBAAA,IAAI,EAAE,0BAA0B;AAChC,oBAAA,MAAM,EAAE,MAAM,QAAQ,CAAC,MAAM;AAC7B,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,MAAM,EAAE;AACN,wBAAA,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI;AAC3B,wBAAA,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK;AAC9B,qBAAA;iBACO;YACZ;AAAO,iBAAA,IAAI,QAAQ,YAAY,iBAAiB,EAAE;gBAChD,OAAO;AACL,oBAAA,IAAI,EAAE,mBAAmB;AACzB,oBAAA,MAAM,EAAE,MAAM,QAAQ,CAAC,MAAM;AAC7B,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,MAAM,EAAE;AACN,wBAAA,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ;AACnC,wBAAA,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ;AACpC,qBAAA;iBACO;YACZ;AAAO,iBAAA,IAAI,oBAAoB,CAAC,QAAQ,CAAC,EAAE;AACzC,gBAAA,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,aAAa;gBAEjD,OAAO;AACL,oBAAA,IAAI,EAAE,oBAAoB;AAC1B,oBAAA,MAAM,EAAE,MAAM,QAAQ,CAAC,MAAM;AAC7B,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,MAAM,EAAE;AACN,wBAAA,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK;AAC7B,wBAAA,aAAa,EAAE;AACb,4BAAA,6BAA6B,EAAE,UAAU,EAAE,6BAA6B,IAAI,gBAAgB;4BAC5F,KAAK,EAAE,UAAU,EAAE,KAAK;4BACxB,UAAU,EAAE,UAAU,EAAE,UAAU;AAClC,4BAAA,YAAY,EAAE,UAAU,EAAE,YAAY,IAAI,0BAA0B;AACpE,4BAAA,mBAAmB,EAAE,UAAU,EAAE,mBAAmB,IAAI,cAAc;AACtE,4BAAA,UAAU,EAAE,UAAU,EAAE,UAAU,IAAI,aAAa;AACnD,4BAAA,aAAa,EAAE,UAAU,EAAE,aAAa,IAAI,gBAAgB;AAC5D,4BAAA,cAAc,EAAE,UAAU,EAAE,cAAc,IAAI,eAAe;AAC7D,4BAAA,aAAa,EAAE,UAAU,EAAE,aAAa,IAAI,iBAAiB;AAC7D,4BAAA,qBAAqB,EAAE,UAAU,EAAE,qBAAqB,IAAI,eAAe;AAC3E,4BAAA,QAAQ,EAAE,UAAU,EAAE,QAAQ,IAAI,sDAAsD;4BACxF,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,GAAG,QAAQ,GAAG,SAAS;4BACzE,eAAe,EAAE,UAAU,EAAE,eAAe,GAAG,QAAQ,GAAG,SAAS;AACpE,yBAAA;AACF,qBAAA;iBACO;YACZ;iBAAO;gBACL,OAAO;AACL,oBAAA,IAAI,EAAE,qBAAqB;AAC3B,oBAAA,MAAM,EAAE,MAAM,QAAQ,CAAC,MAAM;AAC7B,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,MAAM,EAAE,EAAE;iBACF;YACZ;QACF,CAAC;gGAAC;AAEQ,QAAA,IAAA,CAAA,aAAa,GAAgD,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,SAAS;QACvG,IAAA,CAAA,YAAY,GAAgC,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,KAAK,GAAG;QAGvE,IAAI,CAAC,oBAAoB,CAAC;AACvB,aAAA,IAAI,CACH,GAAG,CAAC,MAAM,IAAI,CAAC,iBAAiB,EAAE,CAAC,EACnC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AAE1B,aAAA,SAAS,EAAE;AAEd,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,mBAAmB,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,EACpD,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,EAClC,kBAAkB,EAAE;AAErB,aAAA,SAAS,EAAE;AAEd,QAAA,YAAY,CAAC,IAAI,CAAC,mBAAmB;AAClC,aAAA,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,KAAK,oBAAoB,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5F,aAAA,IAAI,CACH,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,EAClC,kBAAkB,EAAE;AAErB,aAAA,SAAS,EAAE;AAEd,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,SAAS,CAAC,CAAC,CAAC,KACV,CAAC,CAAC,YAAY,CAAC,IAAI,CACjB,SAAS,CAAC,EAAE,CAAC,EACb,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,EACnB,GAAG,CAAC,CAAC,CAAC,KAAI;YACR,SAAS,CAAC,MAAK;AACb,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AAC5C,YAAA,CAAC,CAAC;QACJ,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAC1B,CACF;AAEF,aAAA,SAAS,EAAE;AAEd,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,SAAS,CAAC,CAAC,CAAC,KACV,CAAC,CAAC,aAAa,CAAC,IAAI,CAClB,GAAG,CAAC,CAAC,KAAK,KAAI;YACZ,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AAEpD,YAAA,IAAI,CAAC,cAAc;gBAAE;AAErB,YAAA,MAAM,mBAAmB,GAAG,CAAC,GAAG,cAAc,CAAC;AAE/C,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE;AACpD,gBAAA,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC;YACpC;AAEA,YAAA,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;AAE9B,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAC9C,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAC1B,CACF;AAEF,aAAA,SAAS,EAAE;AAEd,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,OAAO,KAAI;YACd,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;AAEpD,YAAA,IAAI,CAAC,OAAO,IAAI,CAAC,cAAc;gBAAE;AAEjC,YAAA,MAAM,mBAAmB,GAAG,CAAC,GAAG,cAAc,CAAC;AAE/C,YAAA,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;AAC3B,gBAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE;AACzD,oBAAA,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpC;YACF;AAEA,YAAA,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC;AAE9B,YAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,mBAAmB,CAAC;QAC9C,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AAE1B,aAAA,SAAS,EAAE;QAEd,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,aAAa,GAAG;AACpB,gBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,gBAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,gBAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,gBAAA,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;AACjC,gBAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;AACvC,gBAAA,eAAe,EAAE,IAAI,CAAC,eAAe,EAAE;AACvC,gBAAA,oBAAoB,EAAE,IAAI,CAAC,oBAAoB,EAAE;AACjD,gBAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,gBAAA,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE;AACzC,gBAAA,iBAAiB,EAAE,IAAI,CAAC,eAAe,EAAE;AACzC,gBAAA,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE;AACnC,gBAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;aAC1B;AAED,YAAA,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;AACtF,QAAA,CAAC,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,wBAAwB,CAAC;QAE3E,IAAI,aAAa,EAAE;YACjB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;YAExC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC;YACvC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC;YACrD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC;YAChD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,KAAK,CAAC;YACnD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;YACzD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC;YACzD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,oBAAoB,IAAI,KAAK,CAAC;YACnE,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,KAAK,CAAC;YACrD,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,IAAI,CAAC,CAAC;YAChE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,IAAI,IAAI,CAAC;YAC1D,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC;YACtD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,OAAO,CAAC;QAC/C;IACF;IAEU,UAAU,GAAA;QAClB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACjC;IAEU,iBAAiB,GAAA;QACzB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC/C;IAEU,kBAAkB,GAAA;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;QAE3C,SAAS,CAAC,MAAK;AACb,YAAA,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE;AACzB,QAAA,CAAC,CAAC;IACJ;IAEU,qBAAqB,GAAA;QAC7B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;IACnD;IAEU,qBAAqB,GAAA;QAC7B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;IACnD;IAEU,0BAA0B,GAAA;QAClC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC7D;IAEU,mBAAmB,GAAA;QAC3B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;IAC/C;AAEU,IAAA,gBAAgB,CAAC,MAA+B,EAAA;AACxD,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC;IAC7B;AAEU,IAAA,mBAAmB,CAAC,IAAmB,EAAA;AAC/C,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B;AAEU,IAAA,cAAc,CAAC,IAAmB,EAAA;AAC1C,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;IACzB;AAEU,IAAA,WAAW,CAAC,KAAiB,EAAA;QACrC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;IACrC;IAEU,iBAAiB,GAAA;AACzB,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7B;8GAzXW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAtB,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxCnC,6wfAkZA,EAAA,MAAA,EAAA,CAAA,o1KAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED/WiC,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,0JAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,OAAO,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAsB,cAAc,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAArF,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,QAAQ,wCAAgC,kBAAkB,EAAA,IAAA,EAAA,gBAAA,EAAA,CAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA,CAAA;;2FAKpE,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAVlC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,mBAAmB,iBAGd,iBAAiB,CAAC,SAAS,EAAA,OAAA,EACjC,CAAC,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,kBAAkB,EAAE,cAAc,CAAC,EAAA,IAAA,EAC1F;AACJ,wBAAA,KAAK,EAAE,mBAAmB;AAC3B,qBAAA,EAAA,QAAA,EAAA,6wfAAA,EAAA,MAAA,EAAA,CAAA,o1KAAA,CAAA,EAAA;;;AEnCH,MAAM,gBAAiB,SAAQ,KAAK,CAAA;IAClC,WAAA,CACE,OAAe,EACR,MAAgB,EAAA;QAEvB,KAAK,CAAC,OAAO,CAAC;QAFP,IAAA,CAAA,MAAM,GAAN,MAAM;AAGb,QAAA,IAAI,CAAC,IAAI,GAAG,kBAAkB;IAChC;AACD;AAED,SAAS,OAAO,CAAI,GAAU,EAAA;IAC5B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;AACtD;AAEA;;AAEG;MACU,WAAW,CAAA;AAWtB,IAAA,WAAA,CAA6B,OAA0B,EAAA;QAA1B,IAAA,CAAA,OAAO,GAAP,OAAO;AAVpC;;AAEG;AACM,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAgB;AAE9C;;AAEG;AACM,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,OAAO,EAA2B;IAEA;AAK1D,IAAA,MAAM,CAAC,SAAkD,EAAA;AACvD,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;AAE3C,YAAA,OAAO,IAAI,CAAC,UAAU,CAAC,KAAoB,CAAC;QAC9C;AAEA,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAChC;AAEA;;AAEG;AACH,IAAA,WAAW,CAAC,SAAgC,EAAA;QAC1C,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,SAAS,CAAC,IAAI,CAAC,EACf,YAAY,CAAC,CAAC,CAAC,EACf,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAClE,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAC/C;IACH;IAKA,GAAG,CAAC,SAAkD,EAAE,aAA8B,EAAA;QACpF,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;AAE3C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE;AACjC,gBAAA,MAAM,IAAI,gBAAgB,CAAC,qDAAqD,EAAE;AAChF,oBAAA,WAAW,EAAE,KAAK;oBAClB,aAAa;AACd,iBAAA,CAAC;YACJ;YAEA,MAAM,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAsB,CAAC,GAAG,aAAa,CAAQ;AAE1G,YAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;AACrC,gBAAA,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;AAClB,gBAAA,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;AAEpB,gBAAA,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;oBAAE;AAExC,gBAAA,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YACjB;QACF;aAAO;AACL,YAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,aAAkB,CAAC;QACtC;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B;AAKA,IAAA,MAAM,CAAC,SAAkD,EAAA;QACvD,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC;AAE3C,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,YAAA,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;AACvB,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YACnB;QACF;aAAO;AACL,YAAA,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC3B;IAEA,QAAQ,GAAA;QACN,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAC7C,UAAU,EAAE,IAAI,CAAC,WAAW;AAC7B,SAAA,CAAC;IACJ;AAEQ,IAAA,OAAO,CAAC,GAAc,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAC3B,YAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QAC5D;AAEA,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,SAAS,CAAC,IAAI,CAAC,EACf,MAAM,CAAC,CAAC,CAAC,KAAI;AACX,YAAA,IAAI,CAAC,KAAK,IAAI,EAAE;AACd,gBAAA,OAAO,IAAI;YACb;AAEA,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACpB,gBAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YACxB;YAEA,OAAO,CAAC,KAAK,GAAG;AAClB,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAC7C;IACH;AAEQ,IAAA,UAAU,CAAC,IAAiB,EAAA;AAClC,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAC3B,YAAA,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC;QACjE;AAEA,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CACvB,SAAS,CAAC,IAAI,CAAC,EACf,MAAM,CAAC,CAAC,CAAC,KAAI;AACX,YAAA,IAAI,CAAC,KAAK,IAAI,EAAE;AACd,gBAAA,OAAO,IAAI;YACb;AAEA,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;AACpB,gBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5C;AAEA,YAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;AACzB,QAAA,CAAC,CAAC,EACF,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,KAAiB,KAAK,KAAK,SAAS,CAAC,CAAC,CAC3G;IACH;IAEQ,IAAI,CAAC,GAAc,EAAE,KAAQ,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAC3B,YAAA,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC;QAChE;QAEA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;IAClC;AAEQ,IAAA,OAAO,CAAC,GAAc,EAAA;AAC5B,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAC3B,YAAA,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QAC5D;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC;IAC9B;AAEQ,IAAA,aAAa,CAAC,IAA6C,EAAA;AACjE,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1B,gBAAA,OAAO,OAAO,CAAC,IAAqB,CAAC;YACvC;AAEA,YAAA,OAAO,IAAmB;QAC5B;AAEA,QAAA,OAAO,IAAI;IACb;AACD;;AClLD;;AAEG;AACG,SAAU,cAAc,CAAI,QAAsB,EAAA;AACtD,IAAA,OAAO,GAAG,CAAC,CAAC,KAAK,MAAM,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,CAAiB,CAAC;AACjE;AAEA;AACA;;;;AAIG;MACU,UAAU,GAAG,CAWxB,KAAgC,EAChC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAuD,KAErE,SAAS,CAAC,CAAC,KAAsB,KAAI;AACnC,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AAE3B,IAAA,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;AAErB,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;AACtB,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAuB,CAAC,CAAC;IACjG;SAAO;AACL,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAuB,CAAC,CAAC;IACjG;AACF,CAAC;AAEH;;;;AAIG;AACI,MAAM,UAAU,GAAG,CAAI,KAAqB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAuB,KAAI;IACzF;SACG,WAAW,CAAC,KAAK;SACjB,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EACjD,IAAI,CAAC,CAAC,CAAC;AAER,SAAA,SAAS,EAAE;AAChB;;AChDA;;AAEG;MACU,4BAA4B,GAAG,CAAC,IAAa,KACxD,IAAI,YAAY,CACd,qBAAqB,CAAC,kCAAkC,EACxD,mDAAmD,EACnD,IAAI;AAGR;;AAEG;MACU,gCAAgC,GAAG,CAAC,IAAa,KAC5D,IAAI,YAAY,CACd,qBAAqB,CAAC,uCAAuC,EAC7D,mDAAmD,EACnD,IAAI;AAGR;;AAEG;MACU,8BAA8B,GAAG,CAAC,IAAa,KAC1D,IAAI,YAAY,CACd,qBAAqB,CAAC,mCAAmC,EACzD,iEAAiE,EACjE,IAAI;AAGR;;AAEG;MACU,gBAAgB,GAAG,CAAC,IAAa,KAC5C,IAAI,YAAY,CAAC,qBAAqB,CAAC,mBAAmB,EAAE,sCAAsC,EAAE,IAAI;;ACuB1G;;;;;;;;;;;;;;;;;;;;;;;;AAwBG;MACU,mBAAmB,GAAG,CAKjC,IAA8D,EAC9D,MAA8D,KAC5D;IAIF,wBAAwB,CAAsC,IAAI,EAAE;QAClE,MAAM,EAAE,MAAM,CAAC,IAAI;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,aAAa,EAAE,MAAM,CAAC,aAAa;AACnC,QAAA,OAAO,EAAE,CAAC,MAAM,KACd,QAAQ,CAA2C;AACjD,YAAA,MAAM,EAAE,MAAM,MAAM,EAAE;YACtB,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,KAAI;;;gBAG/C,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,WAAW,CAAwC;AAE7F,gBAAA,WAAW,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;gBAC1D,KAAK,CAAC,OAAO,EAAE;;;;AAKf,gBAAA,OAAO,cAAc,CACnB,KAAK,CAAC,MAAM,CAAC,IAAI,CACf,MAAM,CAAC,CAAC,KAAK,KAAK,mBAAmB,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC,EAC3E,IAAI,CAAC,CAAC,CAAC,CACR,CACF,CAAC,IAAI,CAAC,CAAC,KAAK,KAAI;AACf,oBAAA,IAAI,mBAAmB,CAAC,KAAK,CAAC,EAAE;AAC9B,wBAAA,MAAM,KAAK,CAAC,KAAK,CAAC,iBAAiB;oBACrC;oBAEA,OAAO,KAAK,CAAC,QAAQ;AACvB,gBAAA,CAAC,CAAC;YACJ,CAAC;SACF,CAAkC;AACtC,KAAA,CAAC;AACJ;;ACtIO,MAAM,2BAA2B,GAAG,CAAC,UAA0B,KAAI;IACxE,QAAQ,UAAU;QAChB,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,mBAAmB;QAC5B,KAAK,cAAc,CAAC,YAAY;AAC9B,YAAA,OAAO,mBAAmB;QAC5B,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,sBAAsB;QAC/B,KAAK,cAAc,CAAC,SAAS;AAC3B,YAAA,OAAO,UAAU;QACnB,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,gBAAgB;QACzB,KAAK,cAAc,CAAC,gBAAgB;AAClC,YAAA,OAAO,uBAAuB;QAChC,KAAK,cAAc,CAAC,aAAa;AAC/B,YAAA,OAAO,kBAAkB;QAC3B,KAAK,cAAc,CAAC,2BAA2B;AAC7C,YAAA,OAAO,sCAAsC;QAC/C,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,gCAAgC;QACzC,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,UAAU;QACnB,KAAK,cAAc,CAAC,IAAI;AACtB,YAAA,OAAO,KAAK;QACd,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,oBAAoB;QAC7B,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,6BAA6B;QACtC,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,kBAAkB;QAC3B,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,aAAa;QACtB,KAAK,cAAc,CAAC,oBAAoB;AACtC,YAAA,OAAO,+BAA+B;QACxC,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,iCAAiC;QAC1C,KAAK,cAAc,CAAC,iBAAiB;AACnC,YAAA,OAAO,0BAA0B;QACnC,KAAK,cAAc,CAAC,SAAS;AAC3B,YAAA,OAAO,uBAAuB;QAChC,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,uBAAuB;QAChC,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,yBAAyB;QAClC,KAAK,cAAc,CAAC,MAAM;AACxB,YAAA,OAAO,UAAU;QACnB,KAAK,cAAc,CAAC,gBAAgB;AAClC,YAAA,OAAO,8BAA8B;QACvC,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,SAAS;QAClB,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,sBAAsB;QAC/B,KAAK,cAAc,CAAC,oBAAoB;AACtC,YAAA,OAAO,2BAA2B;QACpC,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,mBAAmB;QAC5B,KAAK,cAAc,CAAC,2BAA2B;AAC7C,YAAA,OAAO,gCAAgC;QACzC,KAAK,cAAc,CAAC,0BAA0B;AAC5C,YAAA,OAAO,yCAAyC;QAClD,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,uBAAuB;QAChC,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,qBAAqB;QAC9B,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,oBAAoB;QAC7B,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,wBAAwB;QACjC,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,4BAA4B;QACrC,KAAK,cAAc,CAAC,uBAAuB;AACzC,YAAA,OAAO,gCAAgC;QACzC,KAAK,cAAc,CAAC,qBAAqB;AACvC,YAAA,OAAO,0BAA0B;QACnC,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,yBAAyB;QAClC,KAAK,cAAc,CAAC,YAAY;AAC9B,YAAA,OAAO,oBAAoB;QAC7B,KAAK,cAAc,CAAC,WAAW;AAC7B,YAAA,OAAO,iBAAiB;QAC1B,KAAK,cAAc,CAAC,6BAA6B;AAC/C,YAAA,OAAO,wCAAwC;AACjD,QAAA;AACE,YAAA,OAAO,2BAA2B;;AAExC;AAEO,MAAM,6BAA6B,GAAG,CAAC,UAA0B,KAAI;IAC1E,QAAQ,UAAU;QAChB,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,kGAAkG;QAC3G,KAAK,cAAc,CAAC,YAAY;AAC9B,YAAA,OAAO,iGAAiG;QAC1G,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,6DAA6D;QACtE,KAAK,cAAc,CAAC,SAAS;AAC3B,YAAA,OAAO,yDAAyD;QAClE,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,kDAAkD;QAC3D,KAAK,cAAc,CAAC,gBAAgB;AAClC,YAAA,OAAO,kEAAkE;QAC3E,KAAK,cAAc,CAAC,aAAa;AAC/B,YAAA,OAAO,+HAA+H;QACxI,KAAK,cAAc,CAAC,2BAA2B;AAC7C,YAAA,OAAO,6EAA6E;QACtF,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,8CAA8C;QACvD,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,2EAA2E;QACpF,KAAK,cAAc,CAAC,IAAI;AACtB,YAAA,OAAO,8FAA8F;QACvG,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,iHAAiH;QAC1H,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,wGAAwG;QACjH,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,wFAAwF;QACjG,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,4EAA4E;QACrF,KAAK,cAAc,CAAC,oBAAoB;AACtC,YAAA,OAAO,mGAAmG;QAC5G,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,kGAAkG;QAC3G,KAAK,cAAc,CAAC,iBAAiB;AACnC,YAAA,OAAO,uFAAuF;QAChG,KAAK,cAAc,CAAC,SAAS;AAC3B,YAAA,OAAO,wBAAwB;QACjC,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,yGAAyG;QAClH,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,oGAAoG;QAC7G,KAAK,cAAc,CAAC,MAAM;AACxB,YAAA,OAAO,wDAAwD;QACjE,KAAK,cAAc,CAAC,gBAAgB;AAClC,YAAA,OAAO,yFAAyF;QAClG,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,6GAA6G;QACtH,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,uHAAuH;QAChI,KAAK,cAAc,CAAC,oBAAoB;AACtC,YAAA,OAAO,kEAAkE;QAC3E,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,sGAAsG;QAC/G,KAAK,cAAc,CAAC,2BAA2B;AAC7C,YAAA,OAAO,kGAAkG;QAC3G,KAAK,cAAc,CAAC,0BAA0B;AAC5C,YAAA,OAAO,yEAAyE;QAClF,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,kEAAkE;QAC3E,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,8FAA8F;QACvG,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,kEAAkE;QAC3E,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,8GAA8G;QACvH,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,6GAA6G;QACtH,KAAK,cAAc,CAAC,uBAAuB;AACzC,YAAA,OAAO,uFAAuF;QAChG,KAAK,cAAc,CAAC,qBAAqB;AACvC,YAAA,OAAO,mPAAmP;QAC5P,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,kMAAkM;QAC3M,KAAK,cAAc,CAAC,YAAY;AAC9B,YAAA,OAAO,qFAAqF;QAC9F,KAAK,cAAc,CAAC,WAAW;AAC7B,YAAA,OAAO,8FAA8F;QACvG,KAAK,cAAc,CAAC,6BAA6B;AAC/C,YAAA,OAAO,uEAAuE;AAChF,QAAA;AACE,YAAA,OAAO,uGAAuG;;AAEpH;;MCxKa,+BAA+B,CAAA;AAH5C,IAAA,WAAA,GAAA;QAIE,IAAA,CAAA,SAAS,GAAG,2BAA2B;AACxC,IAAA;8GAFY,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,6BAAA,EAAA,CAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAH3C,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,6BAA6B;AACpC,iBAAA;;MAQY,iCAAiC,CAAA;AAH9C,IAAA,WAAA,GAAA;QAIE,IAAA,CAAA,SAAS,GAAG,6BAA6B;AAC1C,IAAA;8GAFY,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,+BAAA,EAAA,CAAA,CAAA;;2FAAjC,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAH7C,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,+BAA+B;AACtC,iBAAA;;;ACVM,MAAM,2BAA2B,GAAG,CAAC,UAA0B,KAAI;IACxE,QAAQ,UAAU;QAChB,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,aAAa;QACtB,KAAK,cAAc,CAAC,YAAY;AAC9B,YAAA,OAAO,cAAc;QACvB,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,kBAAkB;QAC3B,KAAK,cAAc,CAAC,SAAS;AAC3B,YAAA,OAAO,WAAW;QACpB,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,WAAW;QACpB,KAAK,cAAc,CAAC,gBAAgB;AAClC,YAAA,OAAO,oBAAoB;QAC7B,KAAK,cAAc,CAAC,aAAa;AAC/B,YAAA,OAAO,gBAAgB;QACzB,KAAK,cAAc,CAAC,2BAA2B;AAC7C,YAAA,OAAO,+BAA+B;QACxC,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,iBAAiB;QAC1B,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,UAAU;QACnB,KAAK,cAAc,CAAC,IAAI;AACtB,YAAA,OAAO,MAAM;QACf,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,iBAAiB;QAC1B,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,qBAAqB;QAC9B,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,mBAAmB;QAC5B,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,cAAc;QACvB,KAAK,cAAc,CAAC,oBAAoB;AACtC,YAAA,OAAO,wBAAwB;QACjC,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,uBAAuB;QAChC,KAAK,cAAc,CAAC,iBAAiB;AACnC,YAAA,OAAO,oBAAoB;QAC7B,KAAK,cAAc,CAAC,SAAS;AAC3B,YAAA,OAAO,eAAe;QACxB,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,qBAAqB;QAC9B,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,sBAAsB;QAC/B,KAAK,cAAc,CAAC,MAAM;AACxB,YAAA,OAAO,QAAQ;QACjB,KAAK,cAAc,CAAC,gBAAgB;AAClC,YAAA,OAAO,mBAAmB;QAC5B,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,WAAW;QACpB,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,kBAAkB;QAC3B,KAAK,cAAc,CAAC,oBAAoB;AACtC,YAAA,OAAO,uBAAuB;QAChC,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,mBAAmB;QAC5B,KAAK,cAAc,CAAC,2BAA2B;AAC7C,YAAA,OAAO,iCAAiC;QAC1C,KAAK,cAAc,CAAC,0BAA0B;AAC5C,YAAA,OAAO,+BAA+B;QACxC,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,uBAAuB;QAChC,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,iBAAiB;QAC1B,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,aAAa;QACtB,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,qBAAqB;QAC9B,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,iBAAiB;QAC1B,KAAK,cAAc,CAAC,uBAAuB;AACzC,YAAA,OAAO,4BAA4B;QACrC,KAAK,cAAc,CAAC,qBAAqB;AACvC,YAAA,OAAO,yBAAyB;QAClC,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,sBAAsB;QAC/B,KAAK,cAAc,CAAC,YAAY;AAC9B,YAAA,OAAO,eAAe;QACxB,KAAK,cAAc,CAAC,WAAW;AAC7B,YAAA,OAAO,cAAc;QACvB,KAAK,cAAc,CAAC,6BAA6B;AAC/C,YAAA,OAAO,iCAAiC;AAC1C,QAAA;AACE,YAAA,OAAO,sBAAsB;;AAEnC;AAEO,MAAM,6BAA6B,GAAG,CAAC,UAA0B,KAAI;IAC1E,QAAQ,UAAU;QAChB,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,mEAAmE;QAC5E,KAAK,cAAc,CAAC,YAAY;AAC9B,YAAA,OAAO,2EAA2E;QACpF,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,8CAA8C;QACvD,KAAK,cAAc,CAAC,SAAS;AAC3B,YAAA,OAAO,oDAAoD;QAC7D,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,uCAAuC;QAChD,KAAK,cAAc,CAAC,gBAAgB;AAClC,YAAA,OAAO,wDAAwD;QACjE,KAAK,cAAc,CAAC,aAAa;AAC/B,YAAA,OAAO,wGAAwG;QACjH,KAAK,cAAc,CAAC,2BAA2B;AAC7C,YAAA,OAAO,2DAA2D;QACpE,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,+CAA+C;QACxD,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,+DAA+D;QACxE,KAAK,cAAc,CAAC,IAAI;AACtB,YAAA,OAAO,gFAAgF;QACzF,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,qGAAqG;QAC9G,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,0FAA0F;QACnG,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,sEAAsE;QAC/E,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,0DAA0D;QACnE,KAAK,cAAc,CAAC,oBAAoB;AACtC,YAAA,OAAO,oFAAoF;QAC7F,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,4FAA4F;QACrG,KAAK,cAAc,CAAC,iBAAiB;AACnC,YAAA,OAAO,6EAA6E;QACtF,KAAK,cAAc,CAAC,SAAS;AAC3B,YAAA,OAAO,gBAAgB;QACzB,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,8EAA8E;QACvF,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,mFAAmF;QAC5F,KAAK,cAAc,CAAC,MAAM;AACxB,YAAA,OAAO,gDAAgD;QACzD,KAAK,cAAc,CAAC,gBAAgB;AAClC,YAAA,OAAO,0DAA0D;QACnE,KAAK,cAAc,CAAC,QAAQ;AAC1B,YAAA,OAAO,6FAA6F;QACtG,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,sGAAsG;QAC/G,KAAK,cAAc,CAAC,oBAAoB;AACtC,YAAA,OAAO,2DAA2D;QACpE,KAAK,cAAc,CAAC,eAAe;AACjC,YAAA,OAAO,oFAAoF;QAC7F,KAAK,cAAc,CAAC,2BAA2B;AAC7C,YAAA,OAAO,yFAAyF;QAClG,KAAK,cAAc,CAAC,0BAA0B;AAC5C,YAAA,OAAO,oDAAoD;QAC7D,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,0DAA0D;QACnE,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,gFAAgF;QACzF,KAAK,cAAc,CAAC,UAAU;AAC5B,YAAA,OAAO,0DAA0D;QACnE,KAAK,cAAc,CAAC,kBAAkB;AACpC,YAAA,OAAO,gHAAgH;QACzH,KAAK,cAAc,CAAC,cAAc;AAChC,YAAA,OAAO,2NAA2N;QACpO,KAAK,cAAc,CAAC,uBAAuB;AACzC,YAAA,OAAO,4EAA4E;QACrF,KAAK,cAAc,CAAC,qBAAqB;AACvC,YAAA,OAAO,oNAAoN;QAC7N,KAAK,cAAc,CAAC,mBAAmB;AACrC,YAAA,OAAO,yJAAyJ;QAClK,KAAK,cAAc,CAAC,YAAY;AAC9B,YAAA,OAAO,oEAAoE;QAC7E,KAAK,cAAc,CAAC,WAAW;AAC7B,YAAA,OAAO,8EAA8E;QACvF,KAAK,cAAc,CAAC,6BAA6B;AAC/C,YAAA,OAAO,kDAAkD;AAC3D,QAAA;AACE,YAAA,OAAO,2EAA2E;;AAExF;;MCxKa,+BAA+B,CAAA;AAH5C,IAAA,WAAA,GAAA;QAIE,IAAA,CAAA,SAAS,GAAG,2BAA2B;AACxC,IAAA;8GAFY,+BAA+B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAA/B,+BAA+B,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,6BAAA,EAAA,CAAA,CAAA;;2FAA/B,+BAA+B,EAAA,UAAA,EAAA,CAAA;kBAH3C,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,6BAA6B;AACpC,iBAAA;;MAQY,iCAAiC,CAAA;AAH9C,IAAA,WAAA,GAAA;QAIE,IAAA,CAAA,SAAS,GAAG,6BAA6B;AAC1C,IAAA;8GAFY,iCAAiC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,IAAA,EAAA,CAAA,CAAA;4GAAjC,iCAAiC,EAAA,YAAA,EAAA,IAAA,EAAA,IAAA,EAAA,+BAAA,EAAA,CAAA,CAAA;;2FAAjC,iCAAiC,EAAA,UAAA,EAAA,CAAA;kBAH7C,IAAI;AAAC,YAAA,IAAA,EAAA,CAAA;AACJ,oBAAA,IAAI,EAAE,+BAA+B;AACtC,iBAAA;;;ACZM,MAAM,iBAAiB,GAAG,CAAC,KAAc,KAAI;AAClD,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,sBAAsB,GAAG,CAAC,KAAc,KAAI;AACvD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,OAAO,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa;IACjE;AAAO,SAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AACpC,QAAA,OAAO,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAa;IAC/C;AAEA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,iBAAiB,GAAG,CAAC,KAAc,KAAI;AAClD,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB;AACA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,sBAAsB,GAAG,CAAC,KAAc,KAAI;AACvD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAa;IACjF;AAAO,SAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACpC,OAAO,CAAC,KAAK,CAAa;IAC5B;AAEA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,kBAAkB,GAAG,CAAC,KAAc,KAAI;AACnD,IAAA,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;AAC9B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG;IAC1C;AACA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,uBAAuB,GAAG,CAAC,KAAc,KAAI;AACxD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAc;IACnF;SAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE;AAClE,QAAA,OAAO,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAc;IACjD;AAEA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,eAAe,GAAG,CAAC,KAAc,KAAI;AAChD,IAAA,IAAI,KAAK,YAAY,IAAI,EAAE;AACzB,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC;QAE5B,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE;AACzB,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,OAAO,IAAI;IACb;AACA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,oBAAoB,GAAG,CAAC,KAAc,KAAI;AACrD,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,QAAA,OAAO,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,IAAI,CAAW;IAC7E;SAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,YAAY,IAAI,EAAE;AAC7D,QAAA,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAW;IAC3C;AAEA,IAAA,OAAO,IAAI;AACb;AASO,MAAM,eAAe,GAAG,CAAC,KAAc,KAAiB;AAC7D,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAE5C,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,IAAI;QACb;QAEA,OAAO;YACL,MAAM;AACN,YAAA,SAAS,EAAE,SAA2B;SACvC;IACH;AAEA,IAAA,OAAO,IAAI;AACb;AAEO,MAAM,yBAAyB,GAAG,CAAC,KAAc,KAAI;AAC1D,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,QAAA,OAAO,KAAK;IACd;AACA,IAAA,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,IAAI,WAAW,IAAI,KAAK,EAAE;QACnF,MAAM,SAAS,GAAG,KAGjB;AAED,QAAA,OAAO,SAAS,CAAC,SAAS,GAAG,GAAG,SAAS,CAAC,MAAM,CAAA,CAAA,EAAI,SAAS,CAAC,SAAS,CAAA,CAAE,GAAG,IAAI;IAClF;AAEA,IAAA,OAAO,IAAI;AACb;;ACtFA,MAAM,aAAa,GAAG,UAAU;AAChC,MAAM,aAAa,GAAG,UAAU;AAChC,MAAM,kBAAkB,GAAG,WAAW;MAEzB,UAAU,CAAA;AACrB,IAAA,WAAA,CAAmB,IAA0B,EAAA;QAA1B,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAyB;AAChD,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;AACD;MAEY,gBAAgB,CAAA;AAG3B,IAAA,WAAA,CAAmB,KAAgD,EAAA;QAAhD,IAAA,CAAA,KAAK,GAAL,KAAK;QACtB,IAAI,CAAC,IAAI,GAAG;YACV,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,WAAW,CAAgB,IAAI,CAAC;AAC/D,YAAA,QAAQ,EAAE,GAAG;AACb,YAAA,sBAAsB,EAAE,IAAI;AAC5B,YAAA,IAAI,KAAK,IAAI,EAAE,CAAC;SACjB;IACH;AACA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;AACD;MAEY,cAAc,CAAA;AAGzB,IAAA,WAAA,CAAmB,KAA8C,EAAA;QAA9C,IAAA,CAAA,KAAK,GAAL,KAAK;QACtB,IAAI,CAAC,IAAI,GAAG;YACV,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,WAAW,CAAc,IAAI,CAAC;AAC7D,YAAA,4BAA4B,EAAE,eAAe;AAC7C,YAAA,4BAA4B,EAAE,yBAAyB;AACvD,YAAA,IAAI,KAAK,IAAI,EAAE,CAAC;SACjB;IACH;AACA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;AACD;MAEY,qBAAqB,CAAA;AAGhC,IAAA,WAAA,CAAmB,KAA2C,EAAA;QAA3C,IAAA,CAAA,KAAK,GAAL,KAAK;QACtB,IAAI,CAAC,IAAI,GAAG;YACV,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,WAAW,CAAW,IAAI,CAAC;AAC1D,YAAA,4BAA4B,EAAE,sBAAoD;AAClF,YAAA,IAAI,KAAK,IAAI,EAAE,CAAC;SACjB;IACH;AACA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;AACD;MAEY,sBAAsB,CAAA;AAGjC,IAAA,WAAA,CAAmB,KAAmD,EAAA;QAAnD,IAAA,CAAA,KAAK,GAAL,KAAK;QACtB,IAAI,CAAC,IAAI,GAAG;YACV,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,WAAW,CAAmB,IAAI,CAAC;AAClE,YAAA,4BAA4B,EAAE,uBAAuB;AACrD,YAAA,IAAI,KAAK,IAAI,EAAE,CAAC;SACjB;IACH;AACA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;AACD;MAEY,qBAAqB,CAAA;AAGhC,IAAA,WAAA,CAAmB,KAAkD,EAAA;QAAlD,IAAA,CAAA,KAAK,GAAL,KAAK;QACtB,IAAI,CAAC,IAAI,GAAG;YACV,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,WAAW,CAAkB,IAAI,CAAC;AACjE,YAAA,4BAA4B,EAAE,sBAAsB;AACpD,YAAA,IAAI,KAAK,IAAI,EAAE,CAAC;SACjB;IACH;AACA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;AACD;MAEY,cAAc,CAAA;AAGzB,IAAA,WAAA,CAAmB,KAA8C,EAAA;QAA9C,IAAA,CAAA,KAAK,GAAL,KAAK;QACtB,IAAI,CAAC,IAAI,GAAG;YACV,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,WAAW,CAAc,IAAI,CAAC;AAC7D,YAAA,4BAA4B,EAAE,eAAe;AAC7C,YAAA,IAAI,KAAK,IAAI,EAAE,CAAC;SACjB;IACH;AACA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;AACD;MAEY,mBAAmB,CAAA;AAG9B,IAAA,WAAA,CAAmB,KAAgD,EAAA;QAAhD,IAAA,CAAA,KAAK,GAAL,KAAK;QACtB,IAAI,CAAC,IAAI,GAAG;YACV,OAAO,EAAE,KAAK,EAAE,OAAO,IAAI,IAAI,WAAW,CAAgB,IAAI,CAAC;AAC/D,YAAA,4BAA4B,EAAE,oBAAoB;AAClD,YAAA,IAAI,KAAK,IAAI,EAAE,CAAC;SACjB;IACH;AACA,IAAA,IAAI,OAAO,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO;IAC1B;AACD;AAED,MAAMC,6BAA2B,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC;AAYvH;MACa,SAAS,CAAA;;IAyEpB,WAAA,CACU,OAAU,EACV,QAA2B,EAAA;QAD3B,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,QAAQ,GAAR,QAAQ;AA1EV,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QACrB,IAAA,CAAA,WAAW,GAAG,iBAAiB,EAAE;QACxB,IAAA,CAAA,QAAQ,GAAG,aAAa,EAAE;AAC1B,QAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,OAAO,EAAW;AAC1C,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC3C,QAAA,IAAA,CAAA,gBAAgB,GAAG,IAAI,OAAO,EAAW;QAElD,IAAA,CAAA,WAAW,GAAG,KAAK;QACnB,IAAA,CAAA,cAAc,GAAG,KAAK;AAEtB,QAAA,IAAA,CAAA,kBAAkB,GAAG,YAAY,CAAC,uBAAuB,EAAE,CAAC;AAEpE;;;;;;;;;AASG;AACM,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE;AAEpB,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,eAAe,CAA2B,IAAI,CAAC;QACpE,IAAA,CAAA,iBAAiB,GAAG,IAAI,eAAe,CAAoB,IAAI,CAAC,SAAS,CAAC;QAE1E,IAAA,CAAA,SAAS,GAAG,IAAI,eAAe,CAAyB;AACvE,YAAA,aAAa,EAAE,IAAI;AACnB,YAAA,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAuB;AAC3D,SAAA,CAAC;AAEO,QAAA,IAAA,CAAA,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE;AACxC,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,YAAY,CAAC,CAAC;AAC5E,QAAA,IAAA,CAAA,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,aAAa,CAAC,CAAC;AAExF,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;AACjC,QAAA,IAAA,CAAA,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;AAC3C,QAAA,IAAA,CAAA,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;AAE7C;;;;;;;;;;;;;AAaG;QACM,IAAA,CAAA,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAC9C,GAAG,CACD,CAAC,EAAE,YAAY,EAAE,KACf,MAAM,CAAC,OAAO,CAAC,YAAY;aACxB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,KAAI;AACpB,YAAA,IAAIA,6BAA2B,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC1F,gBAAA,OAAO,IAAI;YACb;YAEA,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;AACxC,QAAA,CAAC;AACA,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,CACvC,CACF;QAOC,wBAAwB,CAAC,SAAS,CAAC;AAEnC,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACpD;AAEA,IAAA,IAAI,QAAQ,GAAA;AACV,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ;IAC3B;AAEA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY;IAC1C;AAEA,IAAA,IAAI,gBAAgB,GAAA;AAClB,QAAA,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAI;YAC9D,GAAG,CAAC,GAA8B,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AAE/D,YAAA,OAAO,GAAG;QACZ,CAAC,EAAE,EAAuB,CAAC;IAC7B;AAEA,IAAA,OAAO,CAAC,OAAiC,EAAA;AACvC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;YACpB,IAAI,SAAS,EAAE,EAAE;AACf,gBAAA,OAAO,CAAC,IAAI,CAAC,uEAAuE,CAAC;YACvF;AAEA,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AAEvB,QAAA,IAAI,OAAO,EAAE,gBAAgB,KAAK,KAAK,EAAE;AACvC,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,8BAA8B,CAAC;AACrD,gBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE;AAChC,aAAA,CAAC;YAEF,IAAI,UAAU,EAAE;AACd,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAC7B;QACF;AAEA,QAAA,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,gBAAgB;aACnG,IAAI,CACH,YAAY,CAAC,CAAC,CAAC,EACf,GAAG,CAAC,MAAK;YACP,IAAI,CAAC,gBAAgB,EAAE;AACzB,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAElC,aAAA,SAAS,EAAE;QAEd,IAAI,4BAA4B,GAAa,EAAE;QAC/C,IAAI,0BAA0B,GAAa,EAAE;AAE7C,QAAA,IAAI,CAAC;AACF,aAAA,IAAI,CACH,GAAG,CAAC,CAAC,YAAY,KAAI;YACnB,OAAO;gBACL,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;AAC/C,gBAAA,YAAY,EAAE,KAAK,CAAC,YAAY,CAAC;aAClC;QACH,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,KAAI;AACtC,YAAA,IAAI,OAAO,EAAE,kBAAkB,KAAK,KAAK,EAAE;gBACzC,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC;YAChE;AAEA,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC;AAC1B,kBAAE;kBACA,IAAI,CAAC,sBAAsB,CAAC,aAAa,IAAI,IAAI,EAAE,YAAY,CAAC;AAEpE,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAE3B,YAAA,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CACpD,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,GAAG,GAAG,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC,CACzD;AAED,YAAA,IAAI,4BAA4B,CAAC,MAAM,EAAE;AACvC,gBAAA,aAAa,CAAC,IAAI,CAAC,GAAG,4BAA4B,CAAC;gBACnD,4BAA4B,GAAG,EAAE;YACnC;YAEA,IAAI,cAAc,EAAE;AAClB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAChC,4BAA4B,GAAG,aAAa;YAC9C;YAEA,0BAA0B,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QAC1D,CAAC,CAAC,EACF,SAAS,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,KAAI;YAC5C,IAAI,4BAA4B,CAAC,MAAM;gBAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YAE3G,MAAM,cAAc,GAAG,0BAA0B,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;gBAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AAE/B,gBAAA,IAAI,CAAC,KAAK;AAAE,oBAAA,OAAO,IAAI;AAEvB,gBAAA,IAAI,KAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;AACpE,oBAAA,OAAO,IAAI;gBACb;AAEA,gBAAA,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI;AACpC,YAAA,CAAC,CAAC;YAEF,0BAA0B,GAAG,EAAE;AAE/B,YAAA,IAAI,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE;gBACpE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;YACpE;YAEA,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,KAAkB,CAAC,KAAK,IAAI,CAAC,CAAC;YAE/F,OAAO,KAAK,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;QACvF,CAAC,CAAC,EACF,GAAG,CAAC,CAAC,EAAE,YAAY,EAAE,aAAa,EAAE,KAAI;YACtC,IAAI,4BAA4B,CAAC,MAAM;gBAAE;AAEzC,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;gBAClB,aAAa,EAAE,aAAa,IAAI,IAAI;AACpC,gBAAA,YAAY,EAAE,YAAY;AAC3B,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC,EACF,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAElC,aAAA,SAAS,EAAE;AAEd,QAAA,IAAI,OAAO,EAAE,gBAAgB,KAAK,KAAK,EAAE;AACvC,YAAA,IAAI,CAAC;iBACF,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EACxB,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAAC,EACjC,GAAG,CAAC,CAAC,OAAO,KAAI;AACd,gBAAA,MAAM,eAAe,GAAG,IAAI,CAAC,8BAA8B,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;gBAErF,IAAI,eAAe,EAAE;AACnB,oBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;gBAClC;AACF,YAAA,CAAC,CAAC;AAEH,iBAAA,SAAS,EAAE;QAChB;AAEA,QAAA,OAAO,IAAI;IACb;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,OAAO,EAAE;IAChB;AAEA,IAAA,8BAA8B,CAAC,OAAiD,EAAA;QAC9E,IAAI,eAAe,GAAG,KAAK;AAE3B,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACvD,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;AAErE,YAAA,MAAM,iBAAiB,GAAG,KAAK,KAAK,SAAS;AAE7C,YAAA,IAAI,iBAAiB;gBAAE;AAEvB,YAAA,MAAM,eAAe,GAAG,KAAK,KAAK,mBAAmB;YAErD,IAAI,eAAe,EAAE;gBACnB,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;AAC9C,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,EAAE;AAC7C,oBAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;oBAC1D,eAAe,GAAG,IAAI;gBACxB;gBAEA;YACF;YACA,IAAI,iBAAiB,GAAG,KAAK;AAE7B,YAAA,IAAI,KAAK,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBAC3C,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC;YACpE;AAAO,iBAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,EAAE;gBACxC,MAAM,YAAY,GAAG,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,QAAQ;gBAClE,MAAM,UAAU,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxC,gBAAA,MAAM,uBAAuB,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,KAAK;AACnF,gBAAA,MAAM,mBAAmB,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;AAC9E,gBAAA,MAAM,gBAAgB,GAAG,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAEzE,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,SAAS;gBAC7D,MAAM,WAAW,GAAG,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO;AAEzD,gBAAA,IAAI,KAAK,KAAK,kBAAkB,EAAE;oBAChC,iBAAiB,GAAG,IAAI;gBAC1B;AAAO,qBAAA,IACL,YAAY;AACZ,qBAAC,UAAU,IAAI,CAAC,uBAAuB,IAAI,CAAC,mBAAmB,IAAI,CAAC,gBAAgB,CAAC,EACrF;AACA,oBAAA,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC;gBAC9C;AAAO,qBAAA,IAAI,aAAa,IAAI,WAAW,EAAE;AACvC,oBAAA,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC;gBAC/C;YACF;AAEA,YAAA,MAAM,qBAAqB,GAAG,KAAK,CAAC,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;AAE3E,YAAA,IAAI,qBAAqB;gBAAE;AAE3B,YAAA,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAC/D,eAAe,GAAG,IAAI;QACxB;AAEA,QAAA,OAAO,eAAe;IACxB;IAEA,QAAQ,CAAC,KAAwB,EAAE,OAA+B,EAAA;QAChE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC;AAEpC,QAAA,IAAI,OAAO,EAAE,UAAU,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;IAEA,UAAU,CAAC,KAAiC,EAAE,OAA+B,EAAA;QAC3E,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC;AAEtC,QAAA,IAAI,OAAO,EAAE,UAAU,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;IAEA,mBAAmB,CAAC,GAA4B,EAAE,OAA+B,EAAA;QAC/E,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,GAAa,CAAC;AAExD,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;AAE9C,QAAA,IAAI,OAAO,EAAE,UAAU,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;IAEA,oBAAoB,CAAC,IAAiC,EAAE,OAA+B,EAAA;QACrF,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAC1B,CAAC,GAAG,EAAE,GAAG,KAAI;YACX,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,eAAe,CAAC,GAAa,CAAC;AAE9C,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAAgC,CACjC;AAED,QAAA,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;AAEzB,QAAA,IAAI,OAAO,EAAE,UAAU,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;QAC5B;IACF;AAEA,IAAA,uBAAuB,CAAC,OAA8E,EAAA;QACpG,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAgC;AAErE,QAAA,IAAI,OAAO,EAAE,UAAU,EAAE;AACvB,YAAA,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,UAAU,EAAE;gBACpC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;AAE/B,gBAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;AAChB,oBAAA,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;gBACvB;YACF;QACF;AAEA,QAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC;IAC1C;AAEA,IAAA,IAAY,SAAS,GAAA;AACnB,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAuB;IACrD;AAEA,IAAA,IAAY,KAAK,GAAA;QACf,OAAO,IAAI,CAAC,IAAiC;IAC/C;IAEQ,sBAAsB,CAAC,aAAuC,EAAE,YAA+B,EAAA;QACrG,IAAI,cAAc,GAAG,KAAK;AAE1B,QAAA,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,OAAO,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;AAExC,YAAA,IAAI,CAAC,KAAK;gBAAE;AAEZ,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS;AAEnC,YAAA,IAAI,CAAC,MAAM;gBAAE;AAEb,YAAA,MAAM,kBAAkB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC;AAEpE,YAAA,KAAK,MAAM,iBAAiB,IAAI,kBAAkB,EAAE;gBAClD,IAAI,EAAE,iBAAiB,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE;oBACxC,IAAI,SAAS,EAAE,EAAE;wBACf,OAAO,CAAC,IAAI,CAAC,CAAA,WAAA,EAAc,iBAAiB,CAAA,gDAAA,CAAkD,EAAE,IAAI,CAAC;oBACvG;oBAEA;gBACF;AAEA,gBAAA,IACE,aAAa;oBACb,YAAY;AACZ,oBAAA,CAAC,KAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,YAAY,CAAC,iBAAiB,CAAC,CAAC,EACzE;oBACA,MAAM,yBAAyB,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;AACpE,oBAAA,MAAM,yBAAyB,GAAG,YAAY,CAAC,YAAY,CAAC;AAE5D,oBAAA,IAAI,KAAK,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,EAAE;wBAC/D;oBACF;AAEA,oBAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,yBAAyB,CAAC;oBAEpE,cAAc,GAAG,IAAI;oBAErB;gBACF;YACF;QACF;AAEA,QAAA,OAAO,cAAc;IACvB;AAEQ,IAAA,eAAe,CAAC,GAAW,EAAA;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;AAEnC,QAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;AAC5D,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACpD;AAAO,aAAA,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE;AACnE,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACpD;AAAO,aAAA,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;YACpC,OAAO,GAAG,EAAE;QACd;AAAO,aAAA,IAAI,GAAG,KAAK,kBAAkB,EAAE;AACrC,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,GAAG,IAAI,IAAI;IACpB;AAEQ,IAAA,wBAAwB,CAAC,GAAW,EAAA;AAC1C,QAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,gBAAgB;AAAE,YAAA,OAAO,GAAG;QAEhD,MAAM,MAAM,GACV,OAAO,IAAI,CAAC,QAAQ,EAAE,gBAAgB,KAAK;AACzC,cAAE,IAAI,CAAC,QAAQ,CAAC;AAChB,cAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE;AAEtC,QAAA,OAAO,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,GAAG,EAAE;IAC3B;IAEQ,cAAc,CAAC,GAAW,EAAE,KAAc,EAAA;AAChD,QAAA,MAAM,eAAe,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK;cACvC,CAAA,EAAG,aAAa,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;cACxC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK;kBACrC,CAAA,EAAG,aAAa,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;kBACxC,KAAK,KAAK;AACV,sBAAE;sBACA,KAAK;QAEb,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,eAAe;IACpD;IAEQ,cAAc,GAAA;AACpB,QAAA,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,EAA+B,CAA8B;AAEzF,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACvD,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC;QACtC;AAEA,QAAA,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,UAAU;AACpC,QAAA,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,QAAQ;QAEhC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7C,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;AAEzC,QAAA,OAAO,KAAwD;IACjE;IAEQ,oBAAoB,GAAA;QAC1B,MAAM,aAAa,GAA4B,EAAE;AAEjD,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACvD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK;AAEnG,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACxB,gBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,GAAG,aAAa,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACjE;iBAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AACtD,gBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,GAAG,aAAa,CAAA,EAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;YACjE;AAAO,iBAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AACzB,gBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,kBAAkB;YACzC;iBAAO;AACL,gBAAA,aAAa,CAAC,GAAG,CAAC,GAAG,KAAK;YAC5B;QACF;AAEA,QAAA,OAAO,aAAa;IACtB;IAEQ,sBAAsB,CAAC,MAAyB,EAAE,UAAoB,EAAA;AAC5E,QAAA,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;AAE1E,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YACjD,MAAM,aAAa,GAAG,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC;YACxD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAE/B,IAAI,CAAC,KAAK,EAAE;gBACV;YACF;YAEA,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC;YACjD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,uBAAuB,KAAK,IAAI;YACrE,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,KAAK,KAAK;YAEnD,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,iBAAiB,CAAC,EAAE;AACpD,gBAAA,WAAW,CAAC,aAAa,CAAC,GAAG,SAAS;YACxC;iBAAO;gBACL,WAAW,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;sBACpC,KAAK,CAAC,IAAI,CAAC,4BAA4B,GAAG,KAAK;sBAC/C,KAAK,KAAK;AACV,0BAAE;0BACA,KAAK;YACb;QACF;AAEA,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;YACjB,cAAc,CAAC,MAAK;AAClB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;oBACvB,WAAW;oBACX,UAAU;AACV,oBAAA,mBAAmB,EAAE,OAAO;AAC7B,iBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;IAEQ,gBAAgB,CAAC,cAAc,GAAG,KAAK,EAAA;;;;;AAK7C,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;AACvD,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,4BAA4B;gBAAE;YAC9C,MAAM,QAAQ,GAAI,IAAI,CAAC,SAAqC,CAAC,GAAG,CAAC;AACjE,YAAA,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC;gBAAE;YACxC,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,QAAQ,CAAC;AACpE,YAAA,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,SAAS;gBAAE;YACrD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACpF;QAEA,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC;QACtD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AAEpC,QAAA,IAAI,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,EAAE;YAC7B;QACF;QAEA,IAAI,cAAc,EAAE;AAClB,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;QAClC;aAAO;AACL,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,UAAU,CAAC;QACtC;AAEA,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC;IACrC;IAEQ,OAAO,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,WAAW;YAAE;AAEvB,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QAExB,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;QAChD,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CACvC,CAAC,GAAG,EAAE,GAAG,KAAI;YACX,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS;AACnD,YAAA,OAAO,GAAG;QACZ,CAAC,EACD,EAA6B,CAC9B;AACD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAK;YACjB,cAAc,CAAC,MAAK;AAClB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;oBACvB,WAAW;AACX,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,mBAAmB,EAAE,OAAO;AAC7B,iBAAA,CAAC;AACJ,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC,CAAC;IACJ;AACD;;ACnsBD;AACA,MAAM,aAAa,GAAG,WAAW;AAEjC;;;AAGG;AACI,MAAM,2BAA2B,GAAsB;IAC5D,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,MAAM;IACN,QAAQ;IACR,WAAW;IACX,OAAO;IACP,QAAQ;;AAKV,MAAM,cAAc,GAAG,CAAC,GAA2B,KAAa;AAC9D,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,GAAG;AAE5B,IAAA,OAAO,OAAO,YAAY,KAAK,UAAU,GAAI,YAA8B,EAAE,IAAI,YAAY,IAAI,IAAI,CAAC;AACxG,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,MAAuB,KAAU;IACtD,MAAM,GAAG,GAAS,EAAE;AAEpB,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAC/C,GAAG,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC;IAChC;AAEA,IAAA,OAAO,GAAG;AACZ,CAAC;AAED,MAAM,gBAAgB,GAAG,EAAE;AAE3B,MAAM,kBAAkB,GAAG,CAAC,QAAqB,EAAE,OAAa,KAC9D,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAE7E;AACA,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,YAAqB,KAAa;IAClE,IAAI,GAAG,KAAK,aAAa;AAAE,QAAA,OAAO,IAAI;IAEtC,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,OAAO,GAAG;AAEvC,IAAA,MAAM,eAAe,GAAG,OAAO,YAAY,KAAK,QAAQ;AACxD,IAAA,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAE5G,IAAI,eAAe,KAAK,YAAY,IAAI,GAAG,KAAK,EAAE,CAAC,EAAE;AACnD,QAAA,OAAO,iBAAiB,CAAC,GAAG,CAAC;IAC/B;IAEA,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO,EAAE;AACrC,QAAA,OAAO,kBAAkB,CAAC,GAAG,CAAC;IAChC;AAEA,IAAA,OAAO,GAAG;AACZ,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,MAAuB,EAAE,KAAW,EAAE,QAAc,KAAI;IAClF,IAAI,KAAK,GAAG,CAAC;AAEb,IAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAC/C,IAAI,2BAA2B,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,iBAAiB;YAAE;AACxE,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAAE,YAAA,KAAK,EAAE;IAChD;AAEA,IAAA,OAAO,KAAK;AACd,CAAC;AAqBD,MAAM,YAAY,GAAG,CACnB,MAAe,EACf,OAAgC,EAChC,QAAkB,KACU;AAC5B,IAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC;AACtC,IAAA,MAAM,KAAK,GAAG,MAAM,CAA0B,KAAK,CAAC,OAAO,CAAC;8EAAC;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC;IAEtC,OAAO;AACL,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE;AACzB,QAAA,iBAAiB,EAAE,QAAQ,CAAC,MAAM,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAU,EAAE,QAAQ,CAAC,CAAC;AACxF,QAAA,QAAQ,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,UAAU,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AACpE,QAAA,mBAAmB,EAAE,CAAC,GAAG,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,QAAQ,CAAC,GAAa,CAAC,EAAE,CAAC,CAAC;AACjG,QAAA,uBAAuB,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAA4B,CAAC;KACrF;AACH,CAAC;AAsED;;;AAGG;AACH,MAAM,kBAAkB,mBAAmB,IAAI,GAAG,EAAkB;AAEpE,MAAM,uBAAuB,GAAG,CAAC,IAAY,KAAI;IAC/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IAE7C,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,GAAG,CAAC,CAAC;AAErC,IAAA,OAAO,CAAA,WAAA,EAAc,IAAI,CAAA,CAAA,EAAI,GAAG,EAAE;AACpC,CAAC;AAED;;;;;;;;;;;;;AAaG;AACI,MAAM,eAAe,GAAG,CAC7B,MAAsC,KACT;IAC7B,wBAAwB,CAAC,eAAe,CAAC;AAEzC,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC7B,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AACpC,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;AACjC,IAAA,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AACrC,IAAA,MAAM,iBAAiB,GAAG,uBAAuB,EAAE;AAEnD,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM;AAC/B,IAAA,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB;AACtC,IAAA,MAAM,QAAQ,GAAG,aAAa,CAAC,SAAS,CAAC;AACzC,IAAA,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,CAA4B;;AAG/D,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAA4B;8EAAC;;AAGhE,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAA4B;kFAAC;AACpE,IAAA,MAAM,QAAQ,GAAG,MAAM,CAAiC,IAAI;iFAAC;AAE7D,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK;kFAAC;AAC/B,IAAA,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK;sFAAC;AAEnC,IAAA,IAAI,cAA0D;IAC9D,IAAI,YAAY,GAAyC,IAAI;IAC7D,IAAI,cAAc,GAAG,KAAK;AAE1B,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;AAE1B,IAAA,MAAM,iBAAiB,GAAG,QAAQ,CAAC,MAAM,kBAAkB,CAAC,SAAS,EAAE,SAAS,EAAU,EAAE,QAAQ,CAAC;0FAAC;AAEtG,IAAA,MAAM,QAAQ,GAAG,CAAC,GAAW,KAAI;AAC/B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,GAAG;AAEvB,QAAA,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAE,CAAA,CAAA,EAAI,GAAG,EAAE;AACnE,IAAA,CAAC;;IAGD,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,GAA2B,EAAE,KAAc,KAAI;QACjF,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC7C,QAAA,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,KAAK,KAAK;AAC5C,QAAA,MAAM,YAAY,GAAG,GAAG,CAAC,uBAAuB,KAAK,IAAI;QAEzD,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC;AAAE,YAAA,OAAO,SAAS;QACjE,IAAI,GAAG,CAAC,iBAAiB;AAAE,YAAA,OAAO,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC;QAE9D,OAAO,KAAK,KAAK,IAAI,GAAG,aAAa,GAAG,KAAK;AAC/C,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,GAA2B,EAAE,GAAY,KAAa;QACzE,IAAI,GAAG,CAAC,iBAAiB;AAAE,YAAA,OAAO,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC;QAC5D,IAAI,GAAG,CAAC,iBAAiB;AAAE,YAAA,OAAO,GAAG;QAErC,OAAO,UAAU,CAAC,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;AAC7C,IAAA,CAAC;IAED,MAAM,UAAU,GAAG,MAAK;AACtB,QAAA,IAAI,YAAY,KAAK,IAAI,EAAE;YACzB,YAAY,CAAC,YAAY,CAAC;YAC1B,YAAY,GAAG,IAAI;QACrB;AAEA,QAAA,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;AAC1B,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,KAAW,KAAI;QACjC,MAAM,WAAW,GAAS,EAAE;AAE5B,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AAClD,YAAA,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;QAClE;QAEA,cAAc,CAAC,MAAK;AAClB,YAAA,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAClB,WAAW;AACX,gBAAA,mBAAmB,EAAE,OAAO;gBAC5B,UAAU,EAAE,cAAc,EAAE,UAAU;AACvC,aAAA,CAAC;AACJ,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,WAAW,GAAG,CAAC,IAAU,EAAE,WAAqB,KAAU;AAC9D,QAAA,MAAM,IAAI,GAAG,EAAE,GAAG,IAAI,EAAE;AAExB,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;AAClD,YAAA,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS;YAE5B,IAAI,CAAC,MAAM,EAAE,MAAM;gBAAE;YAErB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAI;AACzC,gBAAA,IAAI,EAAE,QAAQ,IAAI,SAAS,CAAC,EAAE;oBAC5B,IAAI,SAAS,EAAE,EAAE;AACf,wBAAA,OAAO,CAAC,IAAI,CAAC,wDAAwD,QAAQ,CAAA,gBAAA,CAAkB,CAAC;oBAClG;AAEA,oBAAA,OAAO,KAAK;gBACd;AAEA,gBAAA,OAAO,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;AACvC,YAAA,CAAC,CAAC;AAEF,YAAA,IAAI,CAAC,SAAS;gBAAE;AAEhB,YAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,CAAC;YAElC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,EAAE;AACnC,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY;YAC1B;QACF;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAED;;;;;;AAMG;AACH,IAAA,MAAM,aAAa,GAAG,CAAC,IAAU,EAAE,IAAU,KAAU;QACrD,IAAI,IAAI,GAAG,IAAI;AAEf,QAAA,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,gBAAgB,EAAE,IAAI,EAAE,EAAE;AAClD,YAAA,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAEjE,YAAA,IAAI,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;AAAE,gBAAA,OAAO,OAAO;YAExC,IAAI,GAAG,OAAO;QAChB;QAEA,IAAI,SAAS,EAAE,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,oDAAoD,gBAAgB,CAAA,2BAAA,CAA6B,CAAC;QACjH;AAEA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;IAED,MAAM,KAAK,GAAG,MAAK;AACjB,QAAA,UAAU,EAAE;AAEZ,QAAA,MAAM,IAAI,GAAG,KAAK,EAAU;AAC5B,QAAA,MAAM,IAAI,GAAG,SAAS,EAAU;AAEhC,QAAA,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;YACrB,cAAc,GAAG,KAAK;YAEtB;QACF;AAEA,QAAA,MAAM,IAAI,GAAG,cAAc,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;QAErE,cAAc,GAAG,KAAK;QAEtB,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;QACpD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;;;QAIrD,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE;YACtB,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;QACnD;QAEA,IAAI,SAAS,EAAE,IAAI,cAAc,EAAE,kBAAkB,KAAK,KAAK,EAAE;YAC/D,UAAU,CAAC,IAAI,CAAC;QAClB;AACF,IAAA,CAAC;;AAGD,IAAA,MAAM,eAAe,GAAG,CAAC,WAAqB,EAAE,IAAU,KAAmB;QAC3E,IAAI,CAAC,WAAW,CAAC,MAAM;AAAE,YAAA,OAAO,IAAI;QAEpC,MAAM,KAAK,GAAa,EAAE;AAE1B,QAAA,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE;AAC7B,YAAA,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC;AAE1B,YAAA,IAAI,CAAC,GAAG;AAAE,gBAAA,OAAO,IAAI;YACrB,IAAI,GAAG,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI;AACzD,YAAA,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS;AAAE,gBAAA,OAAO,IAAI;AAE3C,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC1B;AAEA,QAAA,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAC3B,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CAAC,IAAU,KAAI;QAClC,IAAI,CAAC,SAAS,EAAE;YAAE;AAClB,QAAA,IAAI,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,CAAC;YAAE;QAE9B,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,EAAU,EAAE,IAAI,CAAC;QACjE,MAAM,UAAU,GAAG,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC;AAErD,QAAA,UAAU,EAAE;AAEZ,QAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,YAAA,KAAK,EAAE;QACT;aAAO;AACL,YAAA,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,YAAA,YAAY,GAAG,UAAU,CAAC,MAAK;gBAC7B,YAAY,GAAG,IAAI;AACnB,gBAAA,KAAK,EAAE;YACT,CAAC,EAAE,UAAU,CAAC;QAChB;AACF,IAAA,CAAC;AAED,IAAA,MAAM,aAAa,GAAG,CAAC,IAAU,KAAI;AACnC,QAAA,UAAU,EAAE;QACZ,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAA4B,CAAC;QAC3D,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;;QAErD,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;AACnD,IAAA,CAAC;AAED,IAAA,MAAM,YAAY,GAAG,CAAC,MAAY,KAAI;AACpC,QAAA,MAAM,OAAO,GAAG,EAAE,GAAI,SAAS,EAAW,EAAE;QAC5C,IAAI,OAAO,GAAG,KAAK;AAEnB,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAEjC,IAAI,GAAG,KAAK,SAAS;gBAAE;YAEvB,MAAM,KAAK,GAAG,GAAG,KAAK,mBAAmB,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC;YAEjF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE;AAC/B,gBAAA,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK;gBACpB,OAAO,GAAG,IAAI;YAChB;QACF;AAEA,QAAA,IAAI,CAAC,OAAO;YAAE;QAEd,aAAa,CAAC,OAAO,CAAC;AACxB,IAAA,CAAC;IAED,MAAM,OAAO,GAAG,MAAK;QACnB,IAAI,CAAC,SAAS,EAAE;YAAE;AAElB,QAAA,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC;AACpB,QAAA,UAAU,EAAE;AAEZ,QAAA,IAAI,cAAc,EAAE,kBAAkB,KAAK,KAAK;YAAE;QAElD,MAAM,WAAW,GAAS,EAAE;QAE5B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;YACxC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS;QACxC;QAEA,cAAc,CAAC,MAAK;AAClB,YAAA,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AACtF,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,MAAM,QAAQ,GAAG,CAAC,KAA8B,EAAE,OAAsC,KAAI;QAC1F,IAAI,OAAO,EAAE,UAAU;YAAE,cAAc,GAAG,IAAI;QAE9C,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACzB,IAAA,CAAC;AAED,IAAA,MAAM,UAAU,GAAG,CAAC,KAAuC,EAAE,OAAsC,KAAI;QACrG,IAAI,OAAO,EAAE,UAAU;YAAE,cAAc,GAAG,IAAI;AAE9C,QAAA,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAC/C,IAAA,CAAC;AAED,IAAA,MAAM,oBAAoB,GAAG,CAAC,IAAuC,EAAE,OAAsC,KAAI;QAC/G,IAAI,OAAO,EAAE,UAAU;YAAE,cAAc,GAAG,IAAI;AAE9C,QAAA,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,KAAI;AACnB,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,EAAU;AAE/B,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;gBACtB,IAAI,CAAC,GAAa,CAAC,GAAG,QAAQ,CAAC,GAAa,CAAC;YAC/C;AAEA,YAAA,OAAO,IAA+B;AACxC,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,KAAK,OAAO,MAAM,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAClF,IAAA,MAAM,UAAU,GAAG,sBAAsB,EAAE,GAAG,uBAAuB,CAAC,YAAY,CAAC,GAAG,IAAI;AAE1F,IAAA,MAAM,SAAS,GAA8B;QAC3C,MAAM;;;AAIN,QAAA,KAAK,EAAE;AACL,cAAE,QAAQ,CAAC,MAAK;gBACZ,iBAAiB,CAAC,UAAU,CAAC;gBAE7B,OAAO,SAAS,EAAE;AACpB,YAAA,CAAC;AACH,cAAE,SAAS,CAAC,UAAU,EAAE;AAE1B,QAAA,aAAa,EAAE,QAAQ,CAAC,UAAU,EAAE;AACpC,QAAA,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,YAAY,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;QACnF,iBAAiB;QACjB,YAAY;AAEZ,QAAA,OAAO,EAAE,CAAC,OAAO,KAAI;YACnB,IAAI,SAAS,EAAE,EAAE;gBACf,IAAI,SAAS,EAAE,EAAE;AACf,oBAAA,OAAO,CAAC,IAAI,CAAC,gFAAgF,CAAC;gBAChG;AAEA,gBAAA,OAAO,SAAS;YAClB;YAEA,cAAc,GAAG,OAAO;AACxB,YAAA,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAEnB,YAAA,IAAI,OAAO,EAAE,gBAAgB,KAAK,KAAK,EAAE;AACvC,gBAAA,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAmB,CAAC;YAClD;;AAGA,YAAA,KAAK,EAAE;AAEP,YAAA,OAAO,SAAS;QAClB,CAAC;AAED,QAAA,SAAS,EAAE,MAAM,OAAO,EAAE;QAE1B,QAAQ;QACR,UAAU;AACV,QAAA,mBAAmB,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,oBAAoB,CAAC,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;QAC3E,oBAAoB;AAEpB,QAAA,uBAAuB,EAAE,CAAC,OAAO,KAAI;YACnC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,GAAa,CAAC,CAAC;YAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAsC;AAExG,YAAA,oBAAoB,CAAC,IAAI,EAAE,OAAO,CAAC;QACrC,CAAC;AAED,QAAA,MAAM,EAAE,MAAM,YAAY,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,CAAC;KACpE;;IAGD,MAAM,CAAC,MAAK;AACV,QAAA,MAAM,IAAI,GAAG,KAAK,EAAE;QAEpB,SAAS,CAAC,MAAM,YAAY,CAAC,IAAY,CAAC,CAAC;AAC7C,IAAA,CAAC,CAAC;;IAGF,MAAM,CAAC,MAAK;AACV,QAAA,MAAM,OAAO,GAAG,iBAAiB,EAAE;QAEnC,SAAS,CAAC,MAAK;YACb,IAAI,CAAC,SAAS,EAAE,IAAI,cAAc,EAAE,gBAAgB,KAAK,KAAK;gBAAE;YAEhE,YAAY,CAAC,OAAe,CAAC;AAC/B,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC,CAAC;IAEF,UAAU,CAAC,SAAS,CAAC,MAAM,OAAO,EAAE,CAAC;IAErC,IAAI,UAAU,EAAE;AACd;;;AAGG;AACH,QAAA,MAAM,MAAM,GAA4B;AACtC,YAAA,MAAM,EAAE,QAAQ,CAAC,MAAK;AACpB,gBAAA,MAAM,cAAc,GAAG,SAAS,EAAU;AAC1C,gBAAA,MAAM,IAAI,GAAG,KAAK,EAAU;AAE5B,gBAAA,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,KAA4B;AAC1E,oBAAA,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC;oBAEjC,OAAO;wBACL,GAAG;AACH,wBAAA,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC;wBACvB,KAAK;AACL,wBAAA,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC;AACpB,wBAAA,YAAY,EAAE,QAAQ,CAAC,GAAG,CAAC;wBAC3B,SAAS,EAAE,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;wBACtC,UAAU,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;AAC1C,wBAAA,UAAU,EAAE,GAAG,CAAC,QAAQ,IAAI,IAAI;AAChC,wBAAA,SAAS,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE;AAC9B,wBAAA,cAAc,EAAE,CAAC,2BAA2B,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB;qBACrF;AACH,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;;;YAGF,KAAK,EAAE,QAAQ,CAAC,MAAM,SAAS,EAAU,CAAC;YAC1C,aAAa,EAAE,QAAQ,CAAC,MAAO,QAAQ,EAAkB,IAAI,IAAI,CAAC;AAClE,YAAA,YAAY,EAAE,QAAQ;YACtB,iBAAiB;AACjB,YAAA,YAAY,EAAE,QAAQ,CAAC,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;AAC1D,YAAA,eAAe,EAAE,aAAa,CAAC,UAAU,EAAE;AAC3C,YAAA,WAAW,EAAE,SAAS,CAAC,UAAU,EAAE;YACnC,UAAU,EAAE,CAAC,GAAG,KAAK,SAAS,CAAC,mBAAmB,CAAC,GAAoC,CAAC;AACxF,YAAA,QAAQ,EAAE,MAAM,SAAS,CAAC,uBAAuB,EAAE;SACpD;AAED,QAAA,UAAU,CAAC,SAAS,CAClB,0BAA0B,CAAC;AACzB,YAAA,EAAE,EAAE,UAAU;AACd,YAAA,IAAI,EAAE,YAAY;YAClB,MAAM;AACN,YAAA,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;AAC7B,SAAA,CAAC,CACH;IACH;AAEA,IAAA,OAAO,SAAS;AAClB;;AC/nBA,MAAM,eAAe,GAAG,CAAI,MAAuC,KAA+B;AAChG,IAAA,IAAI,CAAC,MAAM;AAAE,QAAA,OAAO,EAAE;IAEtB,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,MAAM;IAErC,OAAO;AACL,QAAA,GAAG,IAAI;QACP,SAAS,EAAE,SAAS,KAAK,SAAS,GAAG,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,GAAG,CAAC,SAAS,CAAC;KACpG;AACH,CAAC;AAED;;;;;;AAMG;MACU,UAAU,GAAG,CAAa,MAAmC,MAA+B;AACvG,IAAA,YAAY,EAAE,IAAI;IAClB,GAAG,eAAe,CAAC,MAAM,CAAC;AAC3B,CAAA;AAED;;;AAGG;MACU,gBAAgB,GAAG,CAAC,MAAwC,MAAoC;AAC3G,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,QAAQ,EAAE,GAAG;AACb,IAAA,sBAAsB,EAAE,IAAI;IAC5B,GAAG,eAAe,CAAC,MAAM,CAAC;AAC3B,CAAA;AAED;;;AAGG;MACU,cAAc,GAAG,CAAC,MAAsC,MAAkC;AACrG,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,iBAAiB,EAAE,eAAe;AAClC,IAAA,iBAAiB,EAAE,yBAAyB;IAC5C,GAAG,eAAe,CAAC,MAAM,CAAC;AAC3B,CAAA;AAED;MACa,qBAAqB,GAAG,CAAC,MAA0C,MAAsC;AACpH,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,iBAAiB,EAAE,sBAAsB;IACzC,GAAG,eAAe,CAAC,MAAM,CAAC;AAC3B,CAAA;AAED;MACa,qBAAqB,GAAG,CAAC,MAA0C,MAAsC;AACpH,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,iBAAiB,EAAE,sBAAsB;IACzC,GAAG,eAAe,CAAC,MAAM,CAAC;AAC3B,CAAA;AAED;MACa,sBAAsB,GAAG,CACpC,MAA2C,MACN;AACrC,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,iBAAiB,EAAE,uBAAuB;IAC1C,GAAG,eAAe,CAAC,MAAM,CAAC;AAC3B,CAAA;AAED;MACa,cAAc,GAAG,CAAC,MAAsC,MAAkC;AACrG,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,iBAAiB,EAAE,eAAe;IAClC,GAAG,eAAe,CAAC,MAAM,CAAC;AAC3B,CAAA;AAED;MACa,mBAAmB,GAAG,CAAC,MAAwC,MAAoC;AAC9G,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,iBAAiB,EAAE,oBAAoB;IACvC,GAAG,eAAe,CAAC,MAAM,CAAC;AAC3B,CAAA;;AC1FD;AACO,MAAM,yBAAyB,GAAG;;AAEvC,IAAA,eAAe,EAAE,IAAI;AACrB,IAAA,iBAAiB,EAAE,IAAI;CACf;AAIH,MAAM,aAAa,GAAG,CAAC,IAAY,KAAI;IAC5C,OAAO,IAAI,YAAY,CACrB,yBAAyB,CAAC,eAAe,EACzC,CAAA,wBAAA,EAA2B,IAAI,CAAA,6BAAA,CAA+B,CAC/D;AACH,CAAC;AAEM,MAAM,gBAAgB,GAAG,MAAK;IACnC,OAAO,IAAI,YAAY,CACrB,yBAAyB,CAAC,iBAAiB,EAC3C,6EAA6E,CAC9E;AACH,CAAC;;ACuBD,MAAM,qBAAqB,GAAG,GAAG;AA0G1B,MAAM,qBAAqB,GAAG,CACnC,OAA2C,KACJ;IACvC,OAAO,kBAAkB,CACvB,MAAK;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;AACrC,YAAA,eAAe,EAAE,IAAI;AACrB,YAAA,WAAW,EAAE,KAAK;YAClB,UAAU,EAAE,OAAO,CAAC,UAAU;AAC/B,SAAA,CAAC;AAEF,QAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+C;AACpE,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK;wFAAC;;AAGjC,QAAA,MAAM,eAAe,GAAG,sBAAsB,EAAE;AAChD,QAAA,MAAM,aAAa,GAAG,MAAM,CAAW,EAAE;0FAAC;AAC1C,QAAA,MAAM,gBAAgB,GAAG,MAAM,CAA6B,EAAE;6FAAC;QAC/D,IAAI,iBAAiB,GAAG,CAAC;QACzB,MAAM,iBAAiB,GAAG,MAAK;AAC7B,YAAA,IAAI,eAAe;gBAAE,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAC3D,QAAA,CAAC;AAED,QAAA,MAAM,qBAAqB,GAAG,CAAC,OAA2D,KAAI;AAC5F,YAAA,IAAI,CAAC,eAAe;gBAAE;AAEtB,YAAA,gBAAgB,CAAC,MAAM,CAAC,CAAC,GAAG,KAC1B,CAAC,EAAE,GAAG,OAAO,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,CACzG;AACH,QAAA,CAAC;;AAGD,QAAA,MAAM,IAAI,GAAG,CAAC,OAAwD,KAAI;YACxE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;AAExC,YAAA,qBAAqB,CAAC;AACpB,gBAAA,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;gBACxB,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,gBAAA,SAAS,EAAE,KAAK;AACjB,aAAA,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,QAAQ,GAAG,CAAC,IAAoC,KAAI;AACxD,YAAA,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,UAAU,GAAG,IAAI,GAAG,MAAM,IAAI;AAC7D,YAAA,MAAM,GAAG,GAAG,mBAAmB,CAAC,QAAQ,CAAC,MAAM,MAAM,EAAE,CAAC,CAAC;AACzD,YAAA,MAAM,QAAQ,GAAG,MAAM,CAA6C,IAAI;yFAAC;AAEzE,YAAA,MAAM,IAAI,GAAG,CAAC,IAAY,KAAI;AAC5B,gBAAA,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAEpD,MAAM,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;gBAEpC,IAAI,YAAY,EAAE;oBAChB,YAAY,CAAC,SAAS,EAAE;AAExB,oBAAA,OAAO,YAAY;gBACrB;AAEA,gBAAA,MAAM,OAAO,GAAG,MAAM,CAAsB,IAAI;4FAAC;AAEjD,gBAAA,MAAM,OAAO,GAAwC;AACnD,oBAAA,aAAa,EAAE,OAAO;AACtB,oBAAA,SAAS,EAAE,CAAC;iBACb;AAED,gBAAA,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC;AACxB,gBAAA,iBAAiB,EAAE;AAEnB,gBAAA,OAAO,OAAO;AAChB,YAAA,CAAC;YAED,MAAM,CAAC,MAAK;AACV,gBAAA,MAAM,OAAO,GAAG,MAAM,EAAE;gBAExB,SAAS,CAAC,MAAK;AACb,oBAAA,MAAM,QAAQ,GAAG,GAAG,EAAE;oBAEtB,IAAI,QAAQ,KAAK,OAAO;wBAAE;AAE1B,oBAAA,IAAI,QAAQ;wBAAE,SAAS,CAAC,QAAQ,CAAC;oBAEjC,IAAI,OAAO,EAAE;AACX,wBAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC;AAChC,wBAAA,IAAI,UAAU;AAAE,4BAAA,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;oBAC1C;yBAAO;AACL,wBAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;oBACpB;AACF,gBAAA,CAAC,CAAC;AACJ,YAAA,CAAC,CAAC;AAEF,YAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAK;AAChC,gBAAA,MAAM,OAAO,GAAG,MAAM,EAAE;gBAExB,IAAI,OAAO,EAAE;oBACX,SAAS,CAAC,OAAO,CAAC;AAClB,oBAAA,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBACpB;AACF,YAAA,CAAC,CAAC;AAEF,YAAA,OAAO,QAAQ,CAAC,UAAU,EAAgD;AAC5E,QAAA,CAAC;AAED,QAAA,MAAM,SAAS,GAAG,CAAC,IAAY,KAAI;YACjC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAElC,IAAI,CAAC,UAAU,EAAE;AACf,gBAAA,IAAI,SAAS,EAAE;AAAE,oBAAA,MAAM,aAAa,CAAC,IAAI,CAAC;gBAE1C;YACF;YAEA,UAAU,CAAC,SAAS,EAAE;AAEtB,YAAA,IAAI,UAAU,CAAC,SAAS,GAAG,CAAC;gBAAE;AAE9B,YAAA,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAE/C,YAAA,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;AAClB,YAAA,iBAAiB,EAAE;AACrB,QAAA,CAAC;QAED,MAAM,gCAAgC,GAAG,MAAK;AAC5C,YAAA,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAK;AACxB,gBAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;gBAErB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE;AAC/B,oBAAA,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAChD;AACF,YAAA,CAAC,CAAC;AACF,YAAA,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvD,QAAA,CAAC;QAED,MAAM,sBAAsB,GAAG,MAAK;AAClC,YAAA,MAAM,CAAC,KAAK,CAAC,CAAC,IAAY,KAAI;AAC5B,gBAAA,IAAI;oBACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB;oBAE7C,qBAAqB,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;oBAE/F,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;AAEjC,oBAAA,IAAI,IAAI;AAAE,wBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;gBACxC;gBAAE,OAAO,KAAK,EAAE;AACd,oBAAA,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AACpB,oBAAA,IAAI,SAAS,EAAE;wBAAE,MAAM,gBAAgB,EAAE;gBAC3C;AACF,YAAA,CAAC,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,UAAU,EAAE,CAAC;AAEvD,QAAA,gCAAgC,EAAE;AAClC,QAAA,sBAAsB,EAAE;QACxB,MAAM,CAAC,OAAO,EAAE;AAEhB,QAAA,MAAM,MAAM,GAAkC;YAC5C,QAAQ;AACR,YAAA,WAAW,EAAE,WAAW,CAAC,UAAU,EAAE;AACrC,YAAA,MAAM,EAAE;gBACN,SAAS;AACV,aAAA;SACF;QAED,IAAI,eAAe,EAAE;AACnB,YAAA,MAAM,MAAM,GAA4B;AACtC,gBAAA,SAAS,EAAE,WAAW,CAAC,UAAU,EAAE;AACnC,gBAAA,KAAK,EAAE,aAAa,CAAC,UAAU,EAAE;AACjC,gBAAA,QAAQ,EAAE,gBAAgB,CAAC,UAAU,EAAE;gBACvC,IAAI;aACL;YAED,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAC5C,gBAAA,IAAI,EAAE,WAAW;gBACjB,MAAM;AACN,gBAAA,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;AAC/C,aAAA,CAAC;YAEF,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC;QAC1C;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,EACD;AACE,QAAA,IAAI,EAAE,CAAA,gBAAA,EAAmB,OAAO,CAAC,IAAI,CAAA,CAAE;AACxC,KAAA,CACF;AACH;;ACnVA;;AAEG;;;;"}