@hexclave/next 1.0.123 → 1.0.126

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 (169) hide show
  1. package/dist/{admin-app-impl-MncU_Oxy.d.ts → admin-app-impl-CjDjJ3PS.d.ts} +29 -13
  2. package/dist/admin-app-impl-CjDjJ3PS.d.ts.map +1 -0
  3. package/dist/clickmap/clickmap-core.d.ts +1 -1
  4. package/dist/clickmap/index.d.ts +1 -1
  5. package/dist/{client-app-B0cTytS5.d.ts → client-app-jAjrgwSh.d.ts} +34 -6
  6. package/dist/client-app-jAjrgwSh.d.ts.map +1 -0
  7. package/dist/{common-B2gkWlXX.d.ts → common-BjAI7WW6.d.ts} +15 -3
  8. package/dist/common-BjAI7WW6.d.ts.map +1 -0
  9. package/dist/{common-BK_sydxF.d.ts → common-DWfeER0s.d.ts} +2 -2
  10. package/dist/{common-BK_sydxF.d.ts.map → common-DWfeER0s.d.ts.map} +1 -1
  11. package/dist/components/message-cards/predefined-message-card.js +4 -2
  12. package/dist/components/message-cards/predefined-message-card.js.map +1 -1
  13. package/dist/components/selected-team-switcher.d.ts +1 -1
  14. package/dist/components/team-icon.d.ts +1 -1
  15. package/dist/components/team-switcher.d.ts +1 -1
  16. package/dist/components/user-button.js +9 -9
  17. package/dist/components/user-button.js.map +1 -1
  18. package/dist/components/user-button.test.d.ts +1 -0
  19. package/dist/components/user-button.test.js +71 -0
  20. package/dist/components/user-button.test.js.map +1 -0
  21. package/dist/components-page/account-settings/payments/payments-page.d.ts +1 -1
  22. package/dist/components-page/account-settings/payments/payments-panel.d.ts +1 -1
  23. package/dist/components-page/account-settings/settings/sign-out-section.d.ts +1 -1
  24. package/dist/components-page/account-settings/settings/sign-out-section.d.ts.map +1 -1
  25. package/dist/components-page/account-settings/settings/sign-out-section.js +4 -1
  26. package/dist/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  27. package/dist/components-page/account-settings/teams/leave-team-section.d.ts +1 -1
  28. package/dist/components-page/account-settings/teams/team-api-keys-section.d.ts +1 -1
  29. package/dist/components-page/account-settings/teams/team-display-name-section.d.ts +1 -1
  30. package/dist/components-page/account-settings/teams/team-member-invitation-section.d.ts +1 -1
  31. package/dist/components-page/account-settings/teams/team-member-list-section.d.ts +1 -1
  32. package/dist/components-page/account-settings/teams/team-page.d.ts +1 -1
  33. package/dist/components-page/account-settings/teams/team-profile-image-section.d.ts +1 -1
  34. package/dist/components-page/account-settings/teams/team-profile-user-section.d.ts +1 -1
  35. package/dist/components-page/hexclave-handler-client.d.ts +1 -1
  36. package/dist/components-page/hexclave-handler.d.ts +1 -1
  37. package/dist/components-page/onboarding.js +15 -13
  38. package/dist/components-page/onboarding.js.map +1 -1
  39. package/dist/components-page/onboarding.test.js +2 -1
  40. package/dist/components-page/onboarding.test.js.map +1 -1
  41. package/dist/dev-tool/dev-tool-core.d.ts +1 -1
  42. package/dist/dev-tool/index.d.ts +1 -1
  43. package/dist/esm/components/message-cards/predefined-message-card.js +4 -2
  44. package/dist/esm/components/message-cards/predefined-message-card.js.map +1 -1
  45. package/dist/esm/components/user-button.js +9 -9
  46. package/dist/esm/components/user-button.js.map +1 -1
  47. package/dist/esm/components/user-button.test.d.ts +1 -0
  48. package/dist/esm/components/user-button.test.js +70 -0
  49. package/dist/esm/components/user-button.test.js.map +1 -0
  50. package/dist/esm/components-page/account-settings/settings/sign-out-section.d.ts +1 -1
  51. package/dist/esm/components-page/account-settings/settings/sign-out-section.d.ts.map +1 -1
  52. package/dist/esm/components-page/account-settings/settings/sign-out-section.js +4 -1
  53. package/dist/esm/components-page/account-settings/settings/sign-out-section.js.map +1 -1
  54. package/dist/esm/components-page/onboarding.js +15 -13
  55. package/dist/esm/components-page/onboarding.js.map +1 -1
  56. package/dist/esm/components-page/onboarding.test.js +2 -1
  57. package/dist/esm/components-page/onboarding.test.js.map +1 -1
  58. package/dist/esm/generated/quetzal-translations.d.ts +2 -2
  59. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +4 -4
  60. package/dist/esm/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts.map +1 -1
  61. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +18 -2
  62. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.d.ts.map +1 -1
  63. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.external-token-store.test.d.ts +1 -0
  64. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.external-token-store.test.js +382 -0
  65. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.external-token-store.test.js.map +1 -0
  66. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.init-analytics.test.d.ts +1 -0
  67. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.init-analytics.test.js +66 -0
  68. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.init-analytics.test.js.map +1 -0
  69. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js +66 -14
  70. package/dist/esm/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  71. package/dist/esm/lib/hexclave-app/apps/implementations/common.js +2 -2
  72. package/dist/esm/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.d.ts +31 -0
  73. package/dist/esm/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.d.ts.map +1 -0
  74. package/dist/esm/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.js +115 -0
  75. package/dist/esm/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.js.map +1 -0
  76. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts +16 -1
  77. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.d.ts.map +1 -1
  78. package/dist/esm/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  79. package/dist/esm/lib/hexclave-app/common.d.ts +14 -2
  80. package/dist/esm/lib/hexclave-app/common.d.ts.map +1 -1
  81. package/dist/esm/lib/hexclave-app/common.js +17 -1
  82. package/dist/esm/lib/hexclave-app/common.js.map +1 -1
  83. package/dist/esm/lib/hexclave-app/index.d.ts +2 -2
  84. package/dist/esm/lib/hexclave-app/index.js +2 -2
  85. package/dist/esm/lib/hexclave-app/users/index.d.ts +14 -1
  86. package/dist/esm/lib/hexclave-app/users/index.d.ts.map +1 -1
  87. package/dist/esm/lib/hexclave-app/users/index.js.map +1 -1
  88. package/dist/generated/quetzal-translations.d.ts +1 -1
  89. package/dist/{hexclave-provider-XVO5TbFD.d.ts → hexclave-provider-Br8j6WHN.d.ts} +3 -3
  90. package/dist/{hexclave-provider-XVO5TbFD.d.ts.map → hexclave-provider-Br8j6WHN.d.ts.map} +1 -1
  91. package/dist/{hooks-nqzRtl9S.d.ts → hooks-DyC8t1Sh.d.ts} +3 -3
  92. package/dist/{hooks-nqzRtl9S.d.ts.map → hooks-DyC8t1Sh.d.ts.map} +1 -1
  93. package/dist/{index-DbiyXho6.d.ts → index-CQ4kC6Cu.d.ts} +2 -2
  94. package/dist/{index-DbiyXho6.d.ts.map → index-CQ4kC6Cu.d.ts.map} +1 -1
  95. package/dist/{index-BDzsJvkD.d.ts → index-CWaynElx.d.ts} +3 -3
  96. package/dist/{index-BDzsJvkD.d.ts.map → index-CWaynElx.d.ts.map} +1 -1
  97. package/dist/{index-BSr2pd22.d.ts → index-FsS-NA9c.d.ts} +2 -2
  98. package/dist/{index-BSr2pd22.d.ts.map → index-FsS-NA9c.d.ts.map} +1 -1
  99. package/dist/index.d.ts +7 -7
  100. package/dist/lib/hexclave-app/apps/implementations/admin-app-impl.d.ts +1 -1
  101. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.d.ts +1 -1
  102. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.external-token-store.test.d.ts +1 -0
  103. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.external-token-store.test.js +381 -0
  104. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.external-token-store.test.js.map +1 -0
  105. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.init-analytics.test.d.ts +1 -0
  106. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.init-analytics.test.js +65 -0
  107. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.init-analytics.test.js.map +1 -0
  108. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js +65 -13
  109. package/dist/lib/hexclave-app/apps/implementations/client-app-impl.js.map +1 -1
  110. package/dist/lib/hexclave-app/apps/implementations/common.d.ts +1 -1
  111. package/dist/lib/hexclave-app/apps/implementations/common.js +2 -2
  112. package/dist/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.d.ts +31 -0
  113. package/dist/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.d.ts.map +1 -0
  114. package/dist/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.js +117 -0
  115. package/dist/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.js.map +1 -0
  116. package/dist/lib/hexclave-app/apps/implementations/index.d.ts +1 -1
  117. package/dist/lib/hexclave-app/apps/implementations/redirect-page-urls.d.ts +1 -1
  118. package/dist/lib/hexclave-app/apps/implementations/server-app-impl.d.ts +1 -1
  119. package/dist/lib/hexclave-app/apps/index.d.ts +1 -1
  120. package/dist/lib/hexclave-app/apps/interfaces/admin-app.d.ts +1 -1
  121. package/dist/lib/hexclave-app/apps/interfaces/client-app.d.ts +1 -1
  122. package/dist/lib/hexclave-app/apps/interfaces/client-app.js.map +1 -1
  123. package/dist/lib/hexclave-app/apps/interfaces/server-app.d.ts +1 -1
  124. package/dist/lib/hexclave-app/common.d.ts +2 -2
  125. package/dist/lib/hexclave-app/common.js +19 -0
  126. package/dist/lib/hexclave-app/common.js.map +1 -1
  127. package/dist/lib/hexclave-app/customers/index.d.ts +1 -1
  128. package/dist/lib/hexclave-app/data-vault/index.d.ts +1 -1
  129. package/dist/lib/hexclave-app/index.d.ts +4 -4
  130. package/dist/lib/hexclave-app/index.js +18 -0
  131. package/dist/lib/hexclave-app/projects/index.d.ts +1 -1
  132. package/dist/lib/hexclave-app/teams/index.d.ts +1 -1
  133. package/dist/lib/hexclave-app/url-targets.d.ts +1 -1
  134. package/dist/lib/hexclave-app/users/index.d.ts +1 -1
  135. package/dist/lib/hexclave-app/users/index.js.map +1 -1
  136. package/dist/lib/hooks.d.ts +1 -1
  137. package/dist/providers/hexclave-context.d.ts +1 -1
  138. package/dist/providers/hexclave-provider-client.d.ts +1 -1
  139. package/dist/providers/hexclave-provider.d.ts +1 -1
  140. package/dist/providers/translation-provider.d.ts +1 -1
  141. package/dist/pushed-config-error-overlay/index.d.ts +1 -1
  142. package/dist/{quetzal-translations-CwNB-iql.d.ts → quetzal-translations-XeH3zQ9l.d.ts} +3 -3
  143. package/dist/{quetzal-translations-CwNB-iql.d.ts.map → quetzal-translations-XeH3zQ9l.d.ts.map} +1 -1
  144. package/dist/{redirect-page-urls-ofcg3AYr.d.ts → redirect-page-urls-CnGvn0UJ.d.ts} +2 -2
  145. package/dist/{redirect-page-urls-ofcg3AYr.d.ts.map → redirect-page-urls-CnGvn0UJ.d.ts.map} +1 -1
  146. package/dist/tanstack-start-server-context.d.ts +804 -485
  147. package/dist/tanstack-start-server-context.d.ts.map +1 -1
  148. package/dist/{translation-provider-C0uPBd41.d.ts → translation-provider-WOaZXqAz.d.ts} +2 -2
  149. package/dist/{translation-provider-C0uPBd41.d.ts.map → translation-provider-WOaZXqAz.d.ts.map} +1 -1
  150. package/dist/{url-targets-CWO0mjTr.d.ts → url-targets-DbhzuQtY.d.ts} +2 -2
  151. package/dist/{url-targets-CWO0mjTr.d.ts.map → url-targets-DbhzuQtY.d.ts.map} +1 -1
  152. package/package.json +4 -4
  153. package/src/components/message-cards/predefined-message-card.tsx +4 -2
  154. package/src/components/user-button.test.tsx +87 -0
  155. package/src/components/user-button.tsx +9 -9
  156. package/src/components-page/account-settings/settings/sign-out-section.tsx +9 -1
  157. package/src/components-page/onboarding.test.tsx +1 -0
  158. package/src/components-page/onboarding.tsx +16 -13
  159. package/src/lib/hexclave-app/apps/implementations/client-app-impl.external-token-store.test.ts +425 -0
  160. package/src/lib/hexclave-app/apps/implementations/client-app-impl.init-analytics.test.ts +79 -0
  161. package/src/lib/hexclave-app/apps/implementations/client-app-impl.ts +124 -13
  162. package/src/lib/hexclave-app/apps/implementations/external-token-store-session-adapter.ts +190 -0
  163. package/src/lib/hexclave-app/apps/interfaces/client-app.ts +17 -0
  164. package/src/lib/hexclave-app/common.ts +33 -0
  165. package/src/lib/hexclave-app/index.ts +4 -0
  166. package/src/lib/hexclave-app/users/index.ts +13 -1
  167. package/dist/admin-app-impl-MncU_Oxy.d.ts.map +0 -1
  168. package/dist/client-app-B0cTytS5.d.ts.map +0 -1
  169. package/dist/common-B2gkWlXX.d.ts.map +0 -1
@@ -67,12 +67,13 @@ import { StackClientApp, StackClientAppConstructorOptions, StackClientAppJson }
67
67
  import { _HexclaveAdminAppImplIncomplete } from "./admin-app-impl";
68
68
  import { TokenObject, clientVersion, createCache, createCacheBySession, createEmptyTokenStore, getAnalyticsBaseUrl, getDefaultExtraRequestHeaders, getDefaultProjectId, getDefaultPublishableClientKey, getUrls, resolveApiUrls, resolveConstructorOptions } from "./common";
69
69
  import { EventTracker } from "./event-tracker";
70
+ import { ExternalTokenStoreSessionAdapter, isExternalTokenStore } from "./external-token-store-session-adapter";
70
71
  import { augmentUrlWithPersistedRedirectBackState, getRawAfterAuthReturnTo, saveRedirectBackStateFromUrl } from "./redirect-back-state";
71
72
  import { recordRedirectAndThrowIfLoopDetected } from "./redirect-loop-breaker";
72
73
  import type { CrossDomainHandoffParams } from "./redirect-page-urls";
73
74
  import { crossDomainAuthQueryParams, getCrossDomainHandoffParamsFromCurrentUrl, planRedirectToHandler } from "./redirect-page-urls";
74
75
  import { subscribeSessionRefresh } from "./session-refresh-subscription";
75
- import { AnalyticsOptions, SessionRecorder, analyticsOptionsFromJson, analyticsOptionsToJson, getSessionReplayOptions } from "./session-replay";
76
+ import { AnalyticsOptions, SessionRecorder, analyticsOptionsFromJson, analyticsOptionsToJson, getSessionReplayOptions, isAnalyticsNotEnabledError } from "./session-replay";
76
77
 
77
78
  export function stripBrowserActionQueryParam() {
78
79
  let stripAttemptsRemaining = 20;
@@ -212,6 +213,10 @@ function throwSetupError(error: HexclaveSetupError): never {
212
213
  throw error;
213
214
  }
214
215
 
216
+ function createAnalyticsAppDisabledOnProjectError(): Error {
217
+ return new Error("initAnalytics() was called, but the Analytics app is not enabled on this Hexclave project, so the backend rejects all analytics uploads. Enable the Analytics app in the Hexclave dashboard (or in hexclave.config.ts), or remove the initAnalytics() call if this is intentional.");
218
+ }
219
+
215
220
  function getRedirectHelperInstruction(handlerName: string): string {
216
221
  if (handlerName === "handler") {
217
222
  return "Use a page-specific redirect helper such as app.redirectToSignIn() instead.";
@@ -370,7 +375,10 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
370
375
  private readonly _analyticsOptions: AnalyticsOptions | undefined;
371
376
  private _sessionRecorder: SessionRecorder | null = null;
372
377
  private _eventTracker: EventTracker | null = null;
378
+ private _initAnalyticsCalled = false;
379
+ private _analyticsAppDisabledOnProject = false;
373
380
  private _pendingSignOut: Promise<void> | null = null;
381
+ private readonly _externalTokenStoreSessionAdapter: ExternalTokenStoreSessionAdapter;
374
382
 
375
383
  private __DEMO_ENABLE_SLIGHT_FETCH_DELAY = false;
376
384
  private readonly _ownedAdminApps = new DependenciesMap<[InternalSession, string], _HexclaveAdminAppImplIncomplete<false, string>>();
@@ -794,6 +802,13 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
794
802
  }
795
803
  });
796
804
  }
805
+ this._externalTokenStoreSessionAdapter = new ExternalTokenStoreSessionAdapter(
806
+ (sessionOptions) => this._interface.createSession(sessionOptions),
807
+ async (providerId, token) => {
808
+ const exchange = await this._interface.exchangeExternalAuthToken(providerId, token);
809
+ return Result.orThrow(exchange).accessToken;
810
+ },
811
+ );
797
812
 
798
813
  this._tokenStoreInit = resolvedOptions.tokenStore;
799
814
  this._redirectMethod = resolvedOptions.redirectMethod || (isBrowserLike() ? "window" : "none");
@@ -836,24 +851,28 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
836
851
  return anonUser._internalSession;
837
852
  };
838
853
 
839
- const analyticsEnabled = this._analyticsOptions?.enabled !== false;
854
+ const recordsAnalytics = this._getAnalyticsDisabledReason() == null && isBrowserLike();
840
855
 
841
856
  const sessionReplayOptions = getSessionReplayOptions(this._analyticsOptions);
842
- if (analyticsEnabled && isBrowserLike() && this._hasPersistentTokenStore() && sessionReplayOptions.enabled) {
857
+ if (recordsAnalytics && sessionReplayOptions.enabled) {
843
858
  this._sessionRecorder = new SessionRecorder({
844
859
  projectId: this.projectId,
845
860
  sendBatch: async (body, opts) => {
846
- return await this._interface.sendSessionReplayBatch(body, await getAnalyticsSession(), opts);
861
+ return this._handleAnalyticsUploadResult(
862
+ await this._interface.sendSessionReplayBatch(body, await getAnalyticsSession(), opts),
863
+ );
847
864
  },
848
865
  }, sessionReplayOptions);
849
866
  this._sessionRecorder.start();
850
867
  }
851
868
 
852
- if (analyticsEnabled && isBrowserLike() && this._hasPersistentTokenStore()) {
869
+ if (recordsAnalytics) {
853
870
  this._eventTracker = new EventTracker({
854
871
  projectId: this.projectId,
855
872
  sendBatch: async (body, opts) => {
856
- return await this._interface.sendAnalyticsEventBatch(body, await getAnalyticsSession(), opts);
873
+ return this._handleAnalyticsUploadResult(
874
+ await this._interface.sendAnalyticsEventBatch(body, await getAnalyticsSession(), opts),
875
+ );
857
876
  },
858
877
  });
859
878
  this._eventTracker.start();
@@ -1731,6 +1750,13 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
1731
1750
  default: {
1732
1751
  if (tokenStoreInit === null) {
1733
1752
  return createEmptyTokenStore();
1753
+ } else if (typeof tokenStoreInit === "object" && isExternalTokenStore(tokenStoreInit)) {
1754
+ return this._externalTokenStoreSessionAdapter.getOrCreateTokenStore(tokenStoreInit, (store, previousSessionKey) => {
1755
+ this._sessionsByTokenStoreAndSessionKey
1756
+ .get(store)
1757
+ ?.get(previousSessionKey)
1758
+ ?.suggestAccessTokenExpired();
1759
+ });
1734
1760
  } else if (typeof tokenStoreInit === "object" && "headers" in tokenStoreInit) {
1735
1761
  if (this._requestTokenStores.has(tokenStoreInit)) return this._requestTokenStores.get(tokenStoreInit)!;
1736
1762
 
@@ -1799,28 +1825,29 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
1799
1825
  * - So different token stores are separated and don't leak information between each other, eg. if the same user sends two requests to the same server they should get a different session object
1800
1826
  */
1801
1827
  private _sessionsByTokenStoreAndSessionKey = new WeakMap<Store<TokenObject>, Map<string, InternalSession>>();
1828
+
1829
+ private _getSessionKeyForTokenStore(tokenStore: Store<TokenObject>, tokenObj: TokenObject): string {
1830
+ return this._externalTokenStoreSessionAdapter.getSessionKey(tokenStore, tokenObj);
1831
+ }
1802
1832
  /**
1803
1833
  * @param overrideTokenObj The tokens to build the session for, if they haven't been written to the token store yet
1804
1834
  * (so we can warm a sign-in's session before the token store publishes it).
1805
1835
  */
1806
1836
  protected _getSessionFromTokenStore(tokenStore: Store<TokenObject>, overrideTokenObj?: TokenObject): InternalSession {
1807
1837
  const tokenObj = overrideTokenObj ?? tokenStore.get();
1808
- const sessionKey = InternalSession.calculateSessionKey(tokenObj);
1838
+ const sessionKey = this._getSessionKeyForTokenStore(tokenStore, tokenObj);
1809
1839
  const existing = sessionKey ? this._sessionsByTokenStoreAndSessionKey.get(tokenStore)?.get(sessionKey) : null;
1810
1840
  if (existing) return existing;
1811
1841
 
1812
- const session = this._interface.createSession({
1813
- refreshToken: tokenObj.refreshToken,
1814
- accessToken: tokenObj.accessToken,
1815
- });
1842
+ const session = this._externalTokenStoreSessionAdapter.createSessionForTokenStore(tokenStore, tokenObj, sessionKey);
1816
1843
  session.onAccessTokenChange((newAccessToken) => {
1817
- tokenStore.update((old) => InternalSession.calculateSessionKey(old) === sessionKey ? {
1844
+ tokenStore.update((old) => this._getSessionKeyForTokenStore(tokenStore, old) === sessionKey ? {
1818
1845
  ...old,
1819
1846
  accessToken: newAccessToken?.token ?? null
1820
1847
  } : old);
1821
1848
  });
1822
1849
  session.onInvalidate(() => {
1823
- tokenStore.update((old) => InternalSession.calculateSessionKey(old) === sessionKey ? {
1850
+ tokenStore.update((old) => this._getSessionKeyForTokenStore(tokenStore, old) === sessionKey ? {
1824
1851
  ...old,
1825
1852
  accessToken: null,
1826
1853
  refreshToken: null,
@@ -1862,6 +1889,11 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
1862
1889
  if (!("accessToken" in tokens) || !("refreshToken" in tokens)) {
1863
1890
  throw new HexclaveAssertionError("Invalid tokens object; can't sign in with this", { tokens });
1864
1891
  }
1892
+ // An external token store keys its session by the provider's session, so Hexclave refresh tokens from a
1893
+ // first-party sign-in would be written into (and then silently replaced by) the provider's session.
1894
+ if (this.isExternalAuthApp()) {
1895
+ throw new Error("This app authenticates through an external provider and cannot sign in with Hexclave tokens. Sign in through the provider instead.");
1896
+ }
1865
1897
  const attemptId = ++this._signInAttemptCounter;
1866
1898
  const tokenStore = this._getOrCreateTokenStore(await this._createCookieHelper());
1867
1899
 
@@ -2371,6 +2403,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
2371
2403
  emailAuthEnabled: crud.auth_with_email,
2372
2404
  otpAuthEnabled: crud.otp_auth_enabled,
2373
2405
  oauthProviders: crud.oauth_providers,
2406
+ externalAuthProviders: crud.external_auth_providers,
2374
2407
  passkeyAuthEnabled: crud.passkey_auth_enabled,
2375
2408
  isMultiFactorRequired: crud.requires_totp_mfa,
2376
2409
  isAnonymous: crud.is_anonymous,
@@ -3529,6 +3562,69 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
3529
3562
  return crud && this._currentUserFromCrud(crud, session);
3530
3563
  }
3531
3564
 
3565
+ isExternalAuthApp(): boolean {
3566
+ return typeof this._tokenStoreInit === "object"
3567
+ && this._tokenStoreInit != null
3568
+ && isExternalTokenStore(this._tokenStoreInit);
3569
+ }
3570
+
3571
+ initAnalytics(): void {
3572
+ // This doesn't start anything: the constructor already starts analytics capture (see
3573
+ // _initializeAutomaticSideEffects). Pages that never import the module constructing the client app record no
3574
+ // analytics, which is easy to miss when the app is only imported where auth is used. Having a dedicated function
3575
+ // to call on every tracked page makes that import explicit, and gives setup docs and AI prompts a concrete step
3576
+ // to point at. Since the caller has thereby declared that they expect analytics, we fail loudly whenever we know
3577
+ // analytics won't be recorded.
3578
+ this._initAnalyticsCalled = true;
3579
+
3580
+ const disabledReason = this._getAnalyticsDisabledReason();
3581
+ if (disabledReason != null) {
3582
+ throw new Error(`initAnalytics() was called, but this Hexclave app will not record analytics because ${disabledReason}. Remove the initAnalytics() call if this is intentional.`);
3583
+ }
3584
+ if (this._analyticsAppDisabledOnProject) {
3585
+ throw createAnalyticsAppDisabledOnProjectError();
3586
+ }
3587
+
3588
+ // Outside the browser (eg. during SSR of a client component), analytics are never recorded, but the same module
3589
+ // runs again in the browser where they are, so this isn't an error.
3590
+ if (isBrowserLike() && this._eventTracker == null) {
3591
+ throw new HexclaveAssertionError("initAnalytics() was called in the browser and _getAnalyticsDisabledReason() returned null, but the constructor did not start the event tracker. The two must agree on when analytics are recorded.");
3592
+ }
3593
+ }
3594
+
3595
+ /**
3596
+ * Returns why this app will never record analytics, or null if it records them whenever it runs in a browser. The
3597
+ * constructor and initAnalytics() both use this, so that the conditions under which analytics start and the
3598
+ * conditions under which initAnalytics() throws can't drift apart.
3599
+ *
3600
+ * Whether the Analytics app is enabled on the project is not part of this, as the client only learns that once the
3601
+ * backend rejects an upload; see _handleAnalyticsUploadResult.
3602
+ */
3603
+ private _getAnalyticsDisabledReason(): string | null {
3604
+ if (this._analyticsOptions?.enabled === false) {
3605
+ return "the `analytics.enabled` constructor option is set to false";
3606
+ }
3607
+ if (this._options.automaticSideEffects === false) {
3608
+ return "the `automaticSideEffects` constructor option is set to false, which also disables analytics";
3609
+ }
3610
+ if (!this._hasPersistentTokenStore()) {
3611
+ return "the `tokenStore` constructor option is null; analytics require a persistent token store such as \"cookie\" (or \"nextjs-cookie\" in Next.js)";
3612
+ }
3613
+ return null;
3614
+ }
3615
+
3616
+ private _handleAnalyticsUploadResult(result: Result<Response, Error>): Result<Response, Error> {
3617
+ if (result.status === "error" && isAnalyticsNotEnabledError(result.error) && !this._analyticsAppDisabledOnProject) {
3618
+ this._analyticsAppDisabledOnProject = true;
3619
+ // initAnalytics() usually runs at module load, long before the first upload, so it can't throw this itself. If
3620
+ // it gets called after this point instead, it throws synchronously (see initAnalytics()).
3621
+ if (this._initAnalyticsCalled) {
3622
+ captureError("initAnalytics", createAnalyticsAppDisabledOnProjectError());
3623
+ }
3624
+ }
3625
+ return result;
3626
+ }
3627
+
3532
3628
  useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'redirect' }): ProjectCurrentUser<ProjectId>;
3533
3629
  useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'throw' }): ProjectCurrentUser<ProjectId>;
3534
3630
  useUser(options: GetCurrentUserOptions<HasTokenStore> & { or: 'anonymous' }): ProjectCurrentUser<ProjectId>;
@@ -3612,6 +3708,7 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
3612
3708
  primaryEmail: accessToken.payload.email,
3613
3709
  displayName: accessToken.payload.name,
3614
3710
  primaryEmailVerified: accessToken.payload.email_verified,
3711
+ selectedTeamId: accessToken.payload.selected_team_id,
3615
3712
  isAnonymous,
3616
3713
  isMultiFactorRequired: accessToken.payload.requires_totp_mfa,
3617
3714
  isRestricted: accessToken.payload.is_restricted,
@@ -3624,11 +3721,16 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
3624
3721
  if (!auth) {
3625
3722
  return null;
3626
3723
  }
3724
+ const selectedTeamId = auth.selected_team_id ?? null;
3725
+ if (selectedTeamId !== null && typeof selectedTeamId !== "string") {
3726
+ throw new HexclaveAssertionError("Expected the Convex selected_team_id claim to be a string or null.");
3727
+ }
3627
3728
  return {
3628
3729
  id: auth.subject,
3629
3730
  displayName: auth.name ?? null,
3630
3731
  primaryEmail: auth.email ?? null,
3631
3732
  primaryEmailVerified: auth.email_verified as boolean,
3733
+ selectedTeamId,
3632
3734
  isAnonymous: auth.is_anonymous as boolean,
3633
3735
  isMultiFactorRequired: auth.requires_totp_mfa as boolean,
3634
3736
  isRestricted: auth.is_restricted as boolean,
@@ -4203,6 +4305,12 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
4203
4305
  const signOutOperation = (async () => {
4204
4306
  // Preserve the old behavior of serializing concurrent sign-outs without coupling them to unrelated stores.
4205
4307
  await previousSignOut;
4308
+ const externalTokenStore = this._externalTokenStoreSessionAdapter.getExternalTokenStoreForSession(session);
4309
+ if (externalTokenStore != null) {
4310
+ throw new HexclaveAssertionError(
4311
+ `Cannot sign out an externally authenticated session through Hexclave. Sign out through the ${externalTokenStore.providerId} provider instead.`,
4312
+ );
4313
+ }
4206
4314
  await this._interface.signOut(session);
4207
4315
  if (options?.redirectUrl) {
4208
4316
  await this._redirectTo({ url: options.redirectUrl, replace: true });
@@ -4421,6 +4529,9 @@ export class _HexclaveClientAppImplIncomplete<HasTokenStore extends boolean, Pro
4421
4529
  if (typeof this._redirectMethod !== "string") {
4422
4530
  throw new HexclaveAssertionError("Cannot serialize to JSON from an application with a non-string redirect method");
4423
4531
  }
4532
+ if (typeof this._tokenStoreInit === "object" && this._tokenStoreInit != null && isExternalTokenStore(this._tokenStoreInit)) {
4533
+ throw new HexclaveAssertionError("Cannot serialize an app with an external token store because its callbacks are not serializable. Construct this app in the client runtime instead.");
4534
+ }
4424
4535
 
4425
4536
  const publishableClientKey = "publishableClientKey" in this._interface.options
4426
4537
  ? this._interface.options.publishableClientKey
@@ -0,0 +1,190 @@
1
+
2
+ //===========================================
3
+ // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
+ //===========================================
5
+ import { KnownErrors } from "@hexclave/shared";
6
+ import type { ExternalAuthProviderId } from "@hexclave/shared/dist/interface/external-auth";
7
+ import { AccessToken, InternalSession } from "@hexclave/shared/dist/sessions";
8
+ import { throwErr } from "@hexclave/shared/dist/utils/errors";
9
+ import { Store } from "@hexclave/shared/dist/utils/stores";
10
+ import type { ExternalTokenStore } from "../../common";
11
+ import { createEmptyTokenStore, type TokenObject } from "./common";
12
+
13
+ type ExternalTokenStoreState = {
14
+ generation: number,
15
+ providerSessionId: string | null | undefined,
16
+ };
17
+
18
+ type SessionOptions = {
19
+ refreshToken: string | null,
20
+ accessToken?: string | null,
21
+ sessionKey?: string,
22
+ refreshAccessTokenWithoutRefreshTokenCallback?: () => Promise<AccessToken | null>,
23
+ };
24
+
25
+ export function isExternalTokenStore(value: object): value is ExternalTokenStore {
26
+ return "type" in value && value.type === "external";
27
+ }
28
+
29
+ export class ExternalTokenStoreSessionAdapter {
30
+ private readonly storesByExternalTokenStore = new WeakMap<ExternalTokenStore, Store<TokenObject>>();
31
+ private readonly externalTokenStoresByStore = new WeakMap<Store<TokenObject>, ExternalTokenStore>();
32
+ private readonly externalTokenStoresBySession = new WeakMap<InternalSession, ExternalTokenStore>();
33
+ private readonly states = new WeakMap<ExternalTokenStore, ExternalTokenStoreState>();
34
+
35
+ constructor(
36
+ private readonly createSession: (options: SessionOptions) => InternalSession,
37
+ private readonly exchangeToken: (providerId: ExternalAuthProviderId, token: string) => Promise<string>,
38
+ ) {}
39
+
40
+ getOrCreateTokenStore(
41
+ externalTokenStore: ExternalTokenStore,
42
+ onProviderChange: (store: Store<TokenObject>, previousSessionKey: string) => void,
43
+ ): Store<TokenObject> {
44
+ const existing = this.storesByExternalTokenStore.get(externalTokenStore);
45
+ if (existing != null) {
46
+ return existing;
47
+ }
48
+
49
+ const store = createEmptyTokenStore();
50
+ this.storesByExternalTokenStore.set(externalTokenStore, store);
51
+ this.externalTokenStoresByStore.set(store, externalTokenStore);
52
+ this.states.set(externalTokenStore, {
53
+ generation: 0,
54
+ providerSessionId: externalTokenStore.getSessionId?.(),
55
+ });
56
+ externalTokenStore.subscribe?.(() => {
57
+ const state = this.states.get(externalTokenStore) ?? throwErr("External token store state was not initialized");
58
+ // Derive the previous session's key from the recorded state, not from a live getSessionId()
59
+ // read: by the time this notification fires, the provider has already switched sessions, so a
60
+ // live read would compute the *new* key and the expiry hint would target the wrong session.
61
+ const previousSessionKey = this.buildSessionKey(externalTokenStore, state);
62
+ const providerSessionId = externalTokenStore.getSessionId?.();
63
+ if (externalTokenStore.getSessionId == null || providerSessionId !== state.providerSessionId) {
64
+ state.generation += 1;
65
+ state.providerSessionId = providerSessionId;
66
+ }
67
+ onProviderChange(store, previousSessionKey);
68
+ store.set({ accessToken: null, refreshToken: null });
69
+ });
70
+ return store;
71
+ }
72
+
73
+ getSessionKey(tokenStore: Store<TokenObject>, tokenObject: TokenObject): string {
74
+ const externalTokenStore = this.externalTokenStoresByStore.get(tokenStore);
75
+ if (externalTokenStore == null) {
76
+ return InternalSession.calculateSessionKey(tokenObject);
77
+ }
78
+
79
+ const state = this.states.get(externalTokenStore) ?? throwErr("External token store state was not initialized");
80
+ // Read the provider session id live (instead of from state) so a session switch is reflected
81
+ // immediately, even before the store's subscribe notification has fired.
82
+ return this.buildSessionKey(externalTokenStore, {
83
+ generation: state.generation,
84
+ providerSessionId: externalTokenStore.getSessionId?.(),
85
+ });
86
+ }
87
+
88
+ private buildSessionKey(externalTokenStore: ExternalTokenStore, state: ExternalTokenStoreState): string {
89
+ if (externalTokenStore.getSessionId == null) {
90
+ return `external-${externalTokenStore.providerId}-${state.generation}`;
91
+ }
92
+ return state.providerSessionId == null
93
+ ? "not-logged-in"
94
+ : `external-${externalTokenStore.providerId}-${state.providerSessionId}`;
95
+ }
96
+
97
+ createSessionForTokenStore(
98
+ tokenStore: Store<TokenObject>,
99
+ tokenObject: TokenObject,
100
+ sessionKey: string,
101
+ ): InternalSession {
102
+ const externalTokenStore = this.externalTokenStoresByStore.get(tokenStore);
103
+ let session: InternalSession;
104
+ if (externalTokenStore == null) {
105
+ session = this.createSession({
106
+ refreshToken: tokenObject.refreshToken,
107
+ accessToken: tokenObject.accessToken,
108
+ });
109
+ } else if (sessionKey === "not-logged-in") {
110
+ // A provider can clear its session before its token store notification arrives; never let
111
+ // that transiently expose the previous provider session's cached Hexclave token.
112
+ session = this.createSession({
113
+ refreshToken: null,
114
+ accessToken: null,
115
+ sessionKey,
116
+ });
117
+ } else {
118
+ session = this.createSession({
119
+ refreshToken: null,
120
+ accessToken: tokenObject.accessToken,
121
+ sessionKey,
122
+ refreshAccessTokenWithoutRefreshTokenCallback: async () => {
123
+ const state = this.states.get(externalTokenStore) ?? throwErr("External token store state was not initialized");
124
+ const expectedGeneration = state.generation;
125
+ const assertSessionIdentityUnchanged = () => {
126
+ const liveSessionKey = this.buildSessionKey(externalTokenStore, {
127
+ generation: state.generation,
128
+ providerSessionId: externalTokenStore.getSessionId?.(),
129
+ });
130
+ if (state.generation !== expectedGeneration || liveSessionKey !== sessionKey) {
131
+ throw new Error("The external provider session changed while exchanging a token; retrying with the current provider session.");
132
+ }
133
+ };
134
+ // Returning null from this callback permanently invalidates the cached InternalSession, so
135
+ // we must only do it when the provider session is definitively gone — for transient states
136
+ // we throw instead, which surfaces the failure to the current caller but lets the next
137
+ // request retry the exchange.
138
+ const attemptExchange = async (isRetry: boolean): Promise<AccessToken | null> => {
139
+ assertSessionIdentityUnchanged();
140
+ const externalToken = await externalTokenStore.getToken();
141
+ assertSessionIdentityUnchanged();
142
+ if (externalToken == null) {
143
+ if (externalTokenStore.getSessionId?.() != null) {
144
+ // The provider reports an active session but handed out no token; this is usually a
145
+ // transient state (eg. its SDK is still initializing), so don't treat it as signed out.
146
+ throw new Error("The external token store returned no token even though it reports an active provider session. This is usually transient (eg. the provider SDK is still initializing) and the exchange will be retried on the next request.");
147
+ }
148
+ return null;
149
+ }
150
+ try {
151
+ const accessToken = await this.exchangeToken(externalTokenStore.providerId, externalToken);
152
+ const validatedAccessToken = AccessToken.createIfValid(accessToken)
153
+ ?? throwErr("External authentication exchange returned an invalid Hexclave access token");
154
+ // An explicit session key bypasses InternalSession's identity check. Refuse to install
155
+ // a token if the provider switched accounts while the exchange was in flight instead
156
+ // of returning null, which would permanently invalidate the reusable session.
157
+ assertSessionIdentityUnchanged();
158
+ return validatedAccessToken;
159
+ } catch (error) {
160
+ if (!KnownErrors.InvalidExternalAuthToken.isInstance(error)) {
161
+ throw error;
162
+ }
163
+ // The server rejects provider tokens that expired in flight with the same error as
164
+ // genuinely bad ones, so retry once with a freshly fetched provider token: the provider
165
+ // SDK replaces an expired token. If the fresh token is rejected too, the cause is not
166
+ // transient (eg. an issuer or client-ID misconfiguration), and it does not mean the
167
+ // provider session ended either: the backend re-establishes a Hexclave session for any
168
+ // valid provider token, so a rejection never signals revocation. Propagate the error
169
+ // instead of returning null, which would permanently invalidate this session and make
170
+ // a misconfiguration look like a silent sign-out.
171
+ if (isRetry) {
172
+ throw error;
173
+ }
174
+ return await attemptExchange(true);
175
+ }
176
+ };
177
+ return await attemptExchange(false);
178
+ },
179
+ });
180
+ }
181
+ if (externalTokenStore != null) {
182
+ this.externalTokenStoresBySession.set(session, externalTokenStore);
183
+ }
184
+ return session;
185
+ }
186
+
187
+ getExternalTokenStoreForSession(session: InternalSession): ExternalTokenStore | undefined {
188
+ return this.externalTokenStoresBySession.get(session);
189
+ }
190
+ }
@@ -83,6 +83,23 @@ export type StackClientApp<HasTokenStore extends boolean = boolean, ProjectId ex
83
83
  * `redirectToSignIn()`, `redirectToSignUp()`, `redirectToSignOut()`, or `redirectToAccountSettings()`.
84
84
  */
85
85
  readonly urls: Readonly<ResolvedHandlerUrls>,
86
+ /** Whether this app delegates authentication to an external provider token store. */
87
+ isExternalAuthApp(): boolean,
88
+
89
+ /**
90
+ * Marks the current page as one that should record analytics (page views, clicks, session replays, and clickmaps).
91
+ *
92
+ * Analytics capture starts automatically when the client app is constructed in the browser, so this function doesn't
93
+ * start anything itself. Call it at the top level of a client-side module that is loaded on every page you want to
94
+ * track (for example, your app's root layout or entry file); the call guarantees that the module creating the client
95
+ * app is actually imported, and therefore constructed, on that page.
96
+ *
97
+ * Throws if this app will never record analytics because of its constructor options (`analytics.enabled: false`,
98
+ * `automaticSideEffects: false`, or a `null` token store). If the Analytics app turns out to be disabled on the
99
+ * project, an error is reported as soon as the backend rejects the first upload. Outside the browser (eg. during
100
+ * server-side rendering), it doesn't throw for that reason alone.
101
+ */
102
+ initAnalytics(): void,
86
103
 
87
104
  signInWithOAuth(provider: string, options?: { returnTo?: string }): Promise<void>,
88
105
  signInWithCredential(options: { email: string, password: string, noRedirect?: boolean }): Promise<Result<undefined, KnownErrors["EmailPasswordMismatch"] | KnownErrors["InvalidTotpCode"]>>,
@@ -3,6 +3,7 @@
3
3
  // THIS FILE IS AUTO-GENERATED FROM TEMPLATE. DO NOT EDIT IT DIRECTLY UNLESS YOU ALSO EDIT THE CORRESPONDING FILE IN packages/template
4
4
  //===========================================
5
5
  import { ProviderType } from "@hexclave/shared/dist/utils/oauth";
6
+ import type { ExternalAuthProviderId } from "@hexclave/shared/dist/interface/external-auth";
6
7
  import type { GenericQueryCtx, UserIdentity } from "convex/server";
7
8
  export type {
8
9
  DefaultHandlerUrlTarget,
@@ -89,6 +90,37 @@ export type RequestLike = {
89
90
  | Record<string, string | null>,
90
91
  };
91
92
 
93
+ export type ExternalTokenStore = {
94
+ readonly type: "external",
95
+ readonly providerId: ExternalAuthProviderId,
96
+ getSessionId?(): string | null,
97
+ getToken(): Promise<string | null>,
98
+ /** The adapter retains this subscription for its own lifetime and does not unsubscribe it. */
99
+ subscribe?(callback: () => void): () => void,
100
+ };
101
+
102
+ type ExternalTokenStoreOptions = Omit<ExternalTokenStore, "type" | "providerId">;
103
+
104
+ function createExternalTokenStore(providerId: ExternalAuthProviderId, options: ExternalTokenStoreOptions): ExternalTokenStore {
105
+ return {
106
+ ...options,
107
+ type: "external",
108
+ providerId,
109
+ };
110
+ }
111
+
112
+ export function clerkTokenStore(options: ExternalTokenStoreOptions): ExternalTokenStore {
113
+ return createExternalTokenStore("clerk-integration", options);
114
+ }
115
+
116
+ export function betterAuthTokenStore(options: ExternalTokenStoreOptions): ExternalTokenStore {
117
+ return createExternalTokenStore("better-auth-integration", options);
118
+ }
119
+
120
+ export function workosTokenStore(options: ExternalTokenStoreOptions): ExternalTokenStore {
121
+ return createExternalTokenStore("workos-integration", options);
122
+ }
123
+
92
124
  export type TokenStoreInit<HasTokenStore extends boolean = boolean> =
93
125
  HasTokenStore extends true ? (
94
126
  | "cookie"
@@ -96,6 +128,7 @@ export type TokenStoreInit<HasTokenStore extends boolean = boolean> =
96
128
  | "memory"
97
129
  | RequestLike
98
130
  | { accessToken: string, refreshToken: string }
131
+ | ExternalTokenStore
99
132
  )
100
133
  : HasTokenStore extends false ? null
101
134
  : TokenStoreInit<true> | TokenStoreInit<false>;
@@ -83,13 +83,17 @@ export type {
83
83
  } from "./internal-api-keys";
84
84
 
85
85
  export {
86
+ betterAuthTokenStore,
87
+ clerkTokenStore,
86
88
  hexclaveAppInternalsSymbol,
89
+ workosTokenStore,
87
90
  } from "./common";
88
91
  export {
89
92
  getPagePrompt,
90
93
  } from "./url-targets";
91
94
  export type {
92
95
  GetCurrentUserOptions,
96
+ ExternalTokenStore,
93
97
  /** @deprecated Use GetCurrentUserOptions instead */
94
98
  GetCurrentUserOptions as GetUserOptions,
95
99
  HandlerUrlOptions,
@@ -160,6 +160,7 @@ export type BaseUser = {
160
160
  * @deprecated
161
161
  */
162
162
  readonly oauthProviders: readonly { id: string }[],
163
+ readonly externalAuthProviders: readonly { id: string }[],
163
164
  }
164
165
 
165
166
  export type UserExtra = {
@@ -301,7 +302,12 @@ export type TokenPartialUser = Pick<
301
302
  | "isMultiFactorRequired"
302
303
  | "isRestricted"
303
304
  | "restrictedReason"
304
- >
305
+ > & {
306
+ /**
307
+ * The ID of the user's selected team, read from the `selected_team_id` claim of the access token or Convex identity.
308
+ */
309
+ readonly selectedTeamId: string | null,
310
+ }
305
311
 
306
312
  export type SyncedPartialUser = TokenPartialUser & Pick<
307
313
  User,
@@ -355,6 +361,12 @@ export function userUpdateOptionsToCrud(options: UserUpdateOptions): CurrentUser
355
361
 
356
362
 
357
363
  export type ServerBaseUser = {
364
+ /**
365
+ * The selected team is a `ServerTeam` when non-null, so `listUsers()` returns full member details
366
+ * without fetching the team again.
367
+ */
368
+ readonly selectedTeam: ServerTeam | null,
369
+
358
370
  setPrimaryEmail(email: string | null, options?: { verified?: boolean | undefined }): Promise<void>,
359
371
 
360
372
  readonly lastActiveAt: Date,
@@ -1 +0,0 @@
1
- {"version":3,"file":"admin-app-impl-MncU_Oxy.d.ts","names":[],"sources":["../src/lib/hexclave-app/apps/implementations/client-app-impl.ts","../src/lib/hexclave-app/apps/implementations/server-app-impl.ts","../src/lib/hexclave-app/apps/implementations/admin-app-impl.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA4EgB,4BAAA;AAAA,KAgRX,+CAAA,4DAA2G,gCAAA,CAAiC,aAAA,EAAe,SAAA;EAAe,YAAA;AAAA;AAAA,cAElK,gCAAA,8EAA8G,cAAA,CAAe,aAAA,EAAe,SAAA;;;;;;;;kBAQvI,qBAAA;IAAyB,KAAA,SARuH,+BAAA;EAAA;EAAA,mBAU7I,QAAA,EAAU,+CAAA,CAAgD,aAAA,EAAe,SAAA;EAAA,mBACzE,aAAA;IAAiB,gBAAA;IAA2B,WAAA;IAAsB,SAAA,GAAY,uBAAA;EAAA;EAAA,UACvF,iBAAA;EAAA,UACA,UAAA,EAAY,uBAAA;EAAA,mBACH,eAAA,EAAiB,cAAA,CAAe,aAAA;EAAA,mBAChC,eAAA,EAAiB,cAAA;EAAA,mBACjB,WAAA,EAAa,iBAAA;EAAA,mBACb,oBAAA,EAAsB,OAAA,CAAQ,mBAAA;EAAA,iBAEhC,iBAAA;EAAA,QACT,gBAAA;EAAA,QACA,aAAA;EAAA,QACA,eAAA;EAAA,QAEA,gCAAA;EAAA,iBACS,eAAA;EAAA,iBAEA,iBAAA;EAAA,iBAyBA,oBAAA;EAAA,iBAGA,mBAAA;EAAA,iBAGA,4BAAA;EAAA,iBAMA,mCAAA;EAAA,iBAMA,sBAAA;EAtE0B;EAAA,iBA0E1B,4CAAA;EA1EuH;EAAA,iBAwFvH,gCAAA;EAAA,iBAaA,kCAAA;EAAA,iBAMA,qDAAA;EAAA,iBAaA,iDAAA;EAAA,iBA2BA,wBAAA;EAAA,iBAKA,qBAAA;EAAA,iBAKA,4BAAA;EAAA,iBAKA,gCAAA;EAAA,iBAGA,2BAAA;EAAA,iBAMA,iBAAA;EAAA,iBAOA,iBAAA;EAAA,iBAOA,4BAAA;EAAA,iBAOA,+BAAA;EAAA,iBAMA,cAAA;EAAA,iBAMA,cAAA;EAAA,iBAMA,gBAAA;EAAA,iBAMA,kBAAA;EAAA,iBAWA,kBAAA;EAAA,iBAWA,oBAAA;EAAA,iBAWA,kBAAA;EAAA,iBAWA,kBAAA;EAAA,iBAWA,qBAAA;EAAA,iBAeA,uBAAA;EAAA,iBAIA,yBAAA;EAAA,iBAIA,gCAAA;EAAA,QAET,0BAAA;EAAA,QACA,mCAAA;EAAA,QACA,4CAAA;EAAA,QACA,sCAAA;EAAA,QACA,8BAAA;EAAA,UAEQ,mBAAA,CAAoB,sBAAA,GAAyB,cAAA,GAAiB,OAAA,CAAQ,YAAA;EAoTjC;EAAA,UA1SrC,8BAAA,CAA+B,OAAA;IAC7C,OAAA,QAAe,OAAA,CAAQ,eAAA;IACvB,mBAAA,QAA2B,OAAA;MAAU,WAAA;IAAA;IACrC,aAAA;MAAuB,WAAA;IAAA;IACvB,UAAA,EAAY,YAAA;IACZ,KAAA;EAAA;IACK,QAAA;IAAgB,OAAA,EAAS,eAAA;EAAA;IAA6B,QAAA;EAAA,KAAsB,OAAA,CAAQ,yBAAA;EAAA,UA8DjF,kCAAA,CACR,IAAA;IAAQ,QAAA;IAAkB,mBAAA;EAAA,GAC1B,OAAA,EAAS,eAAA,GACR,eAAA;cA6BS,OAAA,EAAS,gCAAA,CAAiC,aAAA,EAAe,SAAA,GAAY,YAAA;IAAiB,gBAAA;IAA2B,WAAA;IAAsB,SAAA,GAAY,uBAAA;EAAA;EAAA,QAwDvJ,+BAAA;EAAA,UA0GE,qBAAA;EAAA,UAUA,2BAAA,CAA4B,QAAA,QAAgB,OAAA;EAAA,UAwBtC,4BAAA,CACd,sBAAA,GAAyB,cAAA,EACzB,OAAA;IAAY,2BAAA;EAAA,IAAuC,OAAA;EAAA,UAgB3C,0BAAA,CAA2B,sBAAA,GAAyB,cAAA;EAAA,UAWpD,yBAAA;EAAA,UAKA,iCAAA;EAAA,UAcA,sCAAA;EAAA,UAcA,yCAAA;EAAA,UAaA,kDAAA;EAAA,UAUA,4BAAA;EAAA,UAeM,6BAAA,CAA8B,KAAA,EAAO,UAAA,GAAa,OAAA;EAAA,UA8BlD,uCAAA,IAA2C,OAAA;EAAA,UAY3C,qCAAA,CAAsC,OAAA;IACpD,2BAAA;IACA,sBAAA,GAAyB,cAAA;EAAA,IACvB,OAAA;EAAA,UAaY,4CAAA,CAA6C,OAAA;IAC3D,GAAA;IACA,UAAA,EAAY,GAAA;IACZ,2BAAA;IACA,sBAAA,GAAyB,cAAA;EAAA,IACvB,OAAA;EAAA,UAsBY,iCAAA,CAAkC,qBAAA,GAAwB,GAAA,GAAM,OAAA;EAuwBzC;;;;;EAAA,UA3nB7B,oBAAA;EAAA,UAQM,oBAAA,CAAqB,IAAA,UAAc,OAAA,QAAY,OAAA;EAAA,UAIrD,uBAAA,CAAwB,IAAA,UAAc,OAAA;EAAA,UAKtC,iBAAA,EAAiB,KAAA,CAAA,WAAA;EAAA,UACjB,6BAAA,EAA6B,OAAA,SAAA,KAAA,CAAA,WAAA;EAAA,UAC7B,mBAAA,EAAmB,OAAA,CAAA,WAAA,EAAA,KAAA,CAAA,WAAA;EAAA,UACnB,8BAAA,EAAgC,KAAA,CAAM,WAAA;EAAA,QACxC,mCAAA;EAAA,cACM,6BAAA;EAAA,cAGA,uBAAA;EAAA,QAGN,0CAAA;EAAA,QAGA,2BAAA;EAAA,QAIA,qCAAA;EAAA,QAYA,yBAAA;EAAA,QAMA,wBAAA;EAAA,QAGA,6BAAA;EAAA,QAsBA,iCAAA;EAAA,UAkDE,qBAAA,CAAsB,OAAA,EAAS,MAAA,CAAO,OAAA,GAAU,WAAA;EAAA,QA2BlD,uCAAA;EAAA,cAOM,sBAAA;EAAA,cAOA,4BAAA;EAAA,QAGN,qBAAA;EAAA,QAMA,kCAAA;EAAA,QAWA,+BAAA;EAAA,QAeA,2BAAA;EAAA,QAmBA,iCAAA;EAAA,QAmBA,+BAAA;EAAA,QAwDM,yBAAA;EAAA,QAWA,uBAAA;EAAA,UAIJ,2BAAA,IAA+B,KAAA,CAAM,WAAA;EAAA,UAkErC,sBAAA,CAAuB,YAAA,EAAc,YAAA,EAAc,sBAAA,GAAyB,cAAA,GAAiB,KAAA,CAAM,WAAA;EAAA,UA2HnG,cAAA,CAAe,sBAAA,GAAyB,cAAA,GAAiB,KAAA,CAAM,WAAA;EAiQrC;;;;;;;;EAAA,QAlP5B,kCAAA;EAkWqC;;;;EAAA,UA7VnC,yBAAA,CAA0B,UAAA,EAAY,KAAA,CAAM,WAAA,GAAc,gBAAA,GAAmB,WAAA,GAAc,eAAA;EAAA,UA8BrF,WAAA,CACd,sBAAA,GAAyB,cAAA,EACzB,OAAA;IAAY,2BAAA;EAAA,IACX,OAAA,CAAQ,eAAA;EAAA,UAOD,WAAA,CAAY,sBAAA,GAAyB,cAAA,GAAiB,eAAA;EAAA,QAcxD,qBAAA;EAAA,UACQ,0BAAA,CAA2B,MAAA;IAAU,WAAA;IAA4B,YAAA;EAAA,IAAsB,OAAA;EAAA,UA4B7F,gCAAA,CAAiC,MAAA;IAAU,WAAA;IAA4B,YAAA;EAAA,IAAyB,cAAA;EAAA,UAUhG,wBAAA,CAAyB,sBAAA,GAAyB,cAAA,WAAyB,cAAA,OAAqB,SAAA;EAAA,UAIhG,2BAAA,CAA4B,sBAAA,GAAyB,cAAA,mBAAiC,cAAA,OAAqB,SAAA;EAAA,UAM3G,kBAAA;IAAgC,SAAA;EAAA;EAAA,UAIhC,sBAAA;IAA4C,SAAA;EAAA;EAAA,UAM5C,sBAAA,CAAuB,IAAA,EAAM,kBAAA,qBAAuC,OAAA;EAAA,UA2BpE,yBAAA,CAA0B,IAAA,EAAM,mBAAA,qBAAwC,sBAAA,qBAA2C,cAAA;EAAA,UAMnH,uBAAA,CAAwB,IAAA,EAAM,sBAAA,qBAA2C,QAAA;EAAA,UAUzE,iCAAA,CAAkC,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAM,kBAAA,qBAAuC,kBAAA;EAAA,UAYzG,qCAAA,CAAsC,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAM,kBAAA,qBAAuC,sBAAA;EAAA,UAmB7G,mBAAA,CACR,IAAA,EAAM,eAAA,qBAAoC,eAAA,qBAAoC,GAAA,CAAI,SAAA,QAAiB,6BAAA,IAAiC,GAAA,CAAI,SAAA,QAAiB,6BAAA,IACxJ,IAAA,CAAK,MAAA,0CAAgD,IAAA,CAAK,MAAA;EAAA,UA2BnD,qBAAA,CAAsB,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAM,eAAA,qBAAoC,MAAA;EAAA,UAC1F,qBAAA,CAAsB,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAM,eAAA,qBAAoC,MAAA;EAAA,UAC1F,qBAAA,CAAsB,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAM,GAAA,CAAI,SAAA,QAAiB,6BAAA,IAAiC,MAAA;EAAA,UAC5G,qBAAA,CAAsB,OAAA,EAAS,eAAA,EAAiB,IAAA,EAAM,GAAA,CAAI,SAAA,QAAiB,6BAAA,IAAiC,MAAA;EAAA,UAkB5G,mBAAA,CAAoB,IAAA,EAAM,SAAA,oBAA6B,OAAA,EAAS,eAAA,GAAkB,IAAA;EAAA,UAuElF,6BAAA,CAA8B,IAAA,EAAM,mBAAA,oBAAuC,OAAA,EAAS,eAAA,GAAkB,cAAA;EAAA,UA2BtG,mCAAA,CAAoC,IAAA,EAAM,0BAAA,oBAA8C,OAAA,EAAS,eAAA,GAAkB,oBAAA;EAAA,UAcnH,4BAAA,CAA6B,IAAA,EAAM,iBAAA,oBAAqC,OAAA,EAAS,eAAA,GAAkB,aAAA;EAAA,UA8CnG,mBAAA,CAAoB,IAAA,EAAM,QAAA,qBAA6B,IAAA;EAAA,UASvD,6BAAA,CAA8B,QAAA,EAAU,4BAAA,GAA+B,oBAAA;EAAA,UAwBvE,6BAAA,CAA8B,QAAA,EAAU,4BAAA,GAA+B,oBAAA;EAAA,UAUvE,4BAAA,CAA6B,QAAA;IACrC,YAAA;IACA,sBAAA;MACE,EAAA;MACA,KAAA;MACA,KAAA;MACA,SAAA;MACA,QAAA;IAAA;EAAA,IAEA,eAAA;EAAA,UAOM,WAAA,CAAY,OAAA,EAAS,eAAA,GAAkB,IAAA;EAAA,UAiFvC,4BAAA,CAA6B,IAAA,EAAM,sBAAA,oBAA0C,OAAA,EAAS,eAAA,GAAkB,yBAAA;EAAA,UAmBxG,eAAA,CAAgB,IAAA,EAAM,WAAA,CAAY,eAAA,sBAAqC,SAAA,qBAA8B,QAAA;EAAA,UA2BrG,2BAAA,CAA4B,IAAA,EAAM,WAAA,CAAY,eAAA,qBAAoC,OAAA,EAAS,eAAA,GAAkB,SAAA;EAAA,UAoW7G,wBAAA,CAAyB,OAAA,EAAS,eAAA,GAAkB,iBAAA;EAAA,UAoBpD,eAAA,CAAgB,cAAA,UAAwB,IAAA,mBAAuB,OAAA,EAAS,eAAA,UAAyB,IAAA,CAAK,QAAA;EAiE1G,OAAA,CAAQ,OAAA;IAAW,MAAA;IAAgB,MAAA;EAAA;IAAqB,MAAA;IAAgB,MAAA;EAAA;IAAqB,MAAA;IAAgB,gBAAA;EAAA,IAA6B,OAAA,CAAQ,IAAA;EAaxJ,OAAA,CAAQ,OAAA;IAAW,MAAA;IAAgB,MAAA;EAAA;IAAqB,MAAA;IAAgB,MAAA;EAAA;IAAqB,MAAA;IAAgB,gBAAA;EAAA,IAA6B,IAAA;EASpI,YAAA,CAAa,OAAA,EAAS,8BAAA,GAAiC,OAAA,CAAQ,oBAAA;EAc/D,YAAA,CAAa,OAAA,EAAS,8BAAA,GAAiC,OAAA,CAAQ,oBAAA;EAU/D,kBAAA,CAAmB,OAAA;IAAW,SAAA;IAAmB,cAAA;EAAA;IAA8B,SAAA;IAAmB,cAAA;IAAyB,MAAA;EAAA,IAAmB,OAAA;EAoBpJ,WAAA,CAAY,OAAA,EAAS,8BAAA,GAAiC,oBAAA;EAQtD,WAAA,CAAY,OAAA,EAAS,8BAAA,GAAiC,oBAAA;EAAA,UAS5C,oBAAA,CAAqB,IAAA,EAAM,WAAA,CAAY,eAAA,qBAAoC,OAAA,EAAS,eAAA,GAAkB,kBAAA,CAAmB,SAAA;EAAA,UAUzH,sBAAA,CAAuB,IAAA,EAAM,YAAA,qBAAiC,aAAA;EAAA,UAY9D,iBAAA,CAAkB,YAAA,UAAsB,OAAA,EAAS,eAAA,GAAkB,+BAAA;EAAA,IAczE,SAAA,IAAa,SAAA;EAAA,IAIb,OAAA;EAAA,QAII,wBAAA;EAAA,QAaA,2BAAA;EAAA,QAgBA,4BAAA;EAAA,QAaA,6BAAA;EAAA,QAaM,kCAAA;EAAA,UA+BE,UAAA,CAAW,GAAA,WAAc,OAAA;EAAA,IAqBrC,IAAA,IAAQ,QAAA,CAAS,mBAAA;EAAA,UAOX,QAAA,IAAY,QAAA,CAAS,mBAAA;EAAA,UAIrB,yCAAA;EAAA,UAyBA,yCAAA,CAA0C,UAAA,EAAY,GAAA,GAAM,wBAAA;EAAA,UAetD,uCAAA,CAAwC,UAAA,EAAY,GAAA,GAAM,OAAA,CAAQ,wBAAA;EAAA,UAexE,gCAAA;EAAA,UAeM,iCAAA,CAAkC,OAAA;IAChD,WAAA;IACA,KAAA;IACA,aAAA;IACA,wBAAA;IACA,2BAAA;IACA,sBAAA,GAAyB,cAAA;EAAA,IACvB,OAAA;EAAA,UA2DM,2CAAA,IAA+C,wBAAA;EAAA,UAYzC,cAAA,IAAc,OAAA,CAAA,GAAA;EAAA,UAOd,WAAA,CAAY,OAAA;IAAW,GAAA,EAAK,GAAA;IAAc,OAAA;EAAA,IAAmB,OAAA;EA6B7E,WAAA,KAAgB,EAAA;EAAA,UAYA,kBAAA,CAAmB,GAAA,UAAa,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAAA,UAW3D,kBAAA,CACd,WAAA,QAAmB,WAAA,EACnB,OAAA,GAAU,iBAAA,EACV,eAAA;IACE,2BAAA;IACA,sBAAA,GAAyB,cAAA;EAAA,IAC1B,OAAA;EAAA,UAQa,wBAAA,CACd,WAAA,QAAmB,WAAA,EACnB,OAAA,GAAU,iBAAA,EACV,eAAA;IACE,2BAAA;IACA,sBAAA,GAAyB,cAAA;EAAA,IAE1B,OAAA;EAAA,UA6EO,6BAAA,CAA8B,WAAA,QAAmB,WAAA;EAAA,UAMjD,8BAAA,CAA+B,WAAA,QAAmB,WAAA,EAAa,OAAA,GAAU,iBAAA;EAI7E,gBAAA,CAAiB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAC5C,gBAAA,CAAiB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAC5C,iBAAA,CAAkB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAO7C,2BAAA,CAA4B,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACvD,uBAAA,CAAwB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACnD,wBAAA,CAAyB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACpD,cAAA,CAAe,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAC1C,uBAAA,CAAwB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACnD,2BAAA,CAA4B,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACvD,qBAAA,CAAsB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACjD,qBAAA,CAAsB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACjD,oBAAA,CAAqB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAChD,sBAAA,CAAuB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAClD,yBAAA,CAA0B,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACrD,eAAA,CAAgB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAC3C,wBAAA,CAAyB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACpD,wBAAA,CAAyB,OAAA,GAAU,iBAAA,GAAiB,OAAA;EACpD,aAAA,CAAc,OAAA,GAAU,iBAAA,GAAiB,OAAA;EAEzC,uBAAA,CAAwB,KAAA,UAAe,OAAA;IAAY,WAAA;EAAA,IAAyB,OAAA,CAAQ,MAAA,YAAkB,WAAA;EAItG,kBAAA,CAAmB,KAAA,UAAe,OAAA;IACtC,WAAA;EAAA,IACE,OAAA,CAAQ,MAAA;IAAS,KAAA;EAAA,GAAiB,WAAA,gCAA2C,WAAA;EAU3E,aAAA,CAAc,OAAA;IAAW,QAAA;IAAkB,IAAA;EAAA,IAAiB,OAAA,CAAQ,MAAA,YAAkB,WAAA;EAItF,uBAAA,CAAwB,IAAA,WAAe,OAAA,CAAQ,MAAA,YAAkB,WAAA;EAIjE,wBAAA,CAAyB,IAAA,WAAe,OAAA,CAAQ,MAAA,YAAkB,WAAA,4BAAuC,WAAA;EAQzG,oBAAA,CAAqB,IAAA,WAAe,OAAA,CAAQ,MAAA,YAAkB,WAAA,4BAAuC,WAAA;EAcrG,wBAAA,CAAyB,IAAA,WAAe,OAAA,CAAQ,MAAA;IAAS,eAAA;EAAA,GAA2B,WAAA,4BAAuC,WAAA;EAc3H,WAAA,CAAY,IAAA,WAAe,OAAA,CAAQ,MAAA,YAAkB,WAAA;EAOrD,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAmB,OAAA,CAAQ,kBAAA,CAAmB,SAAA;EACxG,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAgB,OAAA,CAAQ,kBAAA,CAAmB,SAAA;EACrG,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAoB,OAAA,CAAQ,kBAAA,CAAmB,SAAA;EACzG,OAAA,CAAQ,OAAA,GAAU,qBAAA,CAAsB,aAAA,IAAiB,OAAA,CAAQ,kBAAA,CAAmB,SAAA;EAiD1F,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAmB,kBAAA,CAAmB,SAAA;EAChG,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAgB,kBAAA,CAAmB,SAAA;EAC7F,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAoB,kBAAA,CAAmB,SAAA;EACjG,OAAA,CAAQ,OAAA,GAAU,qBAAA,CAAsB,aAAA,IAAiB,kBAAA,CAAmB,SAAA;EAkE5E,+BAAA,CAAgC,OAAA,EAAS,eAAA,EAAiB,OAAA,EAAS,4BAAA,CAA6B,aAAA,IAAiB,gBAAA;EAqB3G,yBAAA,CAA0B,GAAA,EAAK,SAAA,GAAY,OAAA,CAAQ,gBAAA;EAiBnD,cAAA,CAAe,OAAA,EAAS,4BAAA,CAA6B,aAAA;IAAmB,IAAA;EAAA,IAAkB,OAAA,CAAQ,gBAAA;EAClG,cAAA,CAAe,OAAA,EAAS,4BAAA,CAA6B,aAAA;IAAmB,IAAA;EAAA,IAAmB,OAAA,CAAQ,gBAAA;EAiBzG,cAAA,CAAe,OAAA,EAAS,4BAAA,CAA6B,aAAA;IAAmB,IAAA;EAAA,IAAkB,gBAAA;EAC1F,cAAA,CAAe,OAAA,EAAS,4BAAA,CAA6B,aAAA;IAAmB,IAAA;EAAA,IAAmB,gBAAA;EAkB3F,mBAAA,CAAoB,OAAA;IAAW,UAAA,EAAY,cAAA;EAAA,KAAoB,IAAA;IAAQ,iBAAA;EAAA,MAAiC,OAAA;EAYlG,uBAAA,CAAwB,OAAA;IAAW,UAAA,EAAY,cAAA;EAAA,IAAmB,OAAA;EAAA,UAMxD,iBAAA,CAAkB,MAAA,EAAQ,iBAAA,EAAmB,OAAA,EAAS,eAAA,GAAe,OAAA;EAM/E,eAAA,CAAgB,QAAA,EAAU,YAAA,EAAc,OAAA;IAC5C,QAAA;EAAA,IACD,OAAA;EAoFoE;;;EAAA,UAjBrD,gBAAA,CAAiB,KAAA,EAAO,WAAA,uCAAkD,OAAA,EAAS,eAAA,GAAkB,OAAA;EAiBxB;;;;EAAA,UAA7E,sBAAA,OAA6B,QAAA,QAAgB,OAAA,CAAQ,MAAA,CAAO,CAAA,EAAG,CAAA,KAAM,OAAA,CAAQ,MAAA,CAAO,CAAA;IAAM,WAAA;IAAqB,YAAA;IAAsB,OAAA;EAAA,GAAoB,CAAA;EAcnK,oBAAA,CAAqB,OAAA;IACzB,KAAA;IACA,QAAA;IACA,UAAA;EAAA,IACE,OAAA,CAAQ,MAAA,YAAkB,WAAA,4BAAuC,WAAA;EA4B/D,oBAAA,CAAqB,OAAA;IACzB,KAAA;IACA,QAAA;IACA,UAAA;IACA,sBAAA;IACA,uBAAA;EAAA,IACE,OAAA,CAAQ,MAAA,YAAkB,WAAA,iCAA4C,WAAA,oDAA+D,WAAA,iCAA4C,WAAA;EA0D/K,kBAAA,IAAkB,OAAA;;;;EAqBlB,mBAAA,CAAoB,IAAA,UAAc,OAAA;IAAY,UAAA;EAAA,IAAyB,OAAA,CAAQ,MAAA,YAAkB,WAAA,4BAAuC,WAAA;EAmLX;;;;;;;;;;;;;;;;;;;;EA3H7H,cAAA,CAAe,OAAA;IACnB,MAAA;IACA,eAAA;IACA,WAAA;IACA,cAAA;IACA,UAAA,IAAc,GAAA,UAAa,SAAA;IAC3B,gBAAA;EAAA,IACE,OAAA,CAAQ,MAAA,SAAe,WAAA,mBAA8B,WAAA,0BAAqC,WAAA;EAmFxF,aAAA,CAAc,IAAA,UAAc,IAAA,UAAc,OAAA;IAAY,UAAA;EAAA,IAAyB,OAAA,CAAQ,MAAA,YAAkB,WAAA,4BAAuC,WAAA;EAiChJ,iBAAA,IAAqB,OAAA,CAAQ,MAAA,YAAkB,WAAA,kCAA6C,WAAA,sBAAiC,WAAA;EA0C7H,iBAAA,CACJ,OAAA;IACE,+BAAA;EAAA,IACD,OAAA;EAAA,UAwDa,QAAA,CAAS,OAAA,EAAS,eAAA,EAAiB,OAAA;IAAY,WAAA,GAAc,GAAA;EAAA,IAAiB,OAAA;EAAA,UA8B9E,8BAAA,IAAkC,OAAA;EAmB5C,OAAA,CAAQ,OAAA;IAAY,WAAA,GAAc,GAAA;IAAc,UAAA,GAAa,cAAA;EAAA,IAAmB,OAAA;EAOhF,cAAA,CAAe,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA,IAAmB,OAAA;EAQjE,cAAA,CAAe,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA;EAQlC,eAAA,CAAgB,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA,IAAmB,OAAA;EAQlE,eAAA,CAAgB,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA;EAQnC,sBAAA,CAAuB,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA,IAAmB,OAAA;EAIzE,sBAAA,CAAuB,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA;EAI1C,cAAA,CAAe,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA,IAAmB,OAAA;IAAU,cAAA;EAAA;EAM3E,cAAA,CAAe,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA;IAAqB,cAAA;EAAA;EAMvD,WAAA,CAAY,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA,IAAmB,OAAA;IAAU,WAAA;IAA4B,YAAA;EAAA;EAQpG,WAAA,CAAY,OAAA;IAAY,UAAA,GAAa,cAAA;EAAA;IAAqB,WAAA;IAA4B,YAAA;EAAA;EAQhF,UAAA,IAAc,OAAA,CAAQ,OAAA;EAK5B,UAAA,IAAc,OAAA;EAAA,UAKE,kBAAA,CAAmB,OAAA,EAAS,eAAA,GAAkB,OAAA,CAAQ,iBAAA;EAAA,UAS5D,iBAAA,CAAkB,OAAA,EAAS,eAAA,GAAkB,iBAAA;EAAA,UAQvC,cAAA,CAAe,OAAA,EAAS,eAAA,EAAiB,UAAA,EAAY,yBAAA;IAA8B,WAAA;IAAqB,MAAA;EAAA,IAAmB,OAAA,CAAQ,iBAAA;EAAA,UAWnI,YAAA,CAAa,OAAA,EAAS,eAAA,GAAe,OAAA;EAAA,UAKrC,eAAA,CAAgB,OAAA,EAAS,eAAA,GAAe,OAAA;EAAA,UASxC,aAAA,IAAa,OAAA;EAAA,UAIb,eAAA,IAAe,OAAA;EAAA,UAIf,qBAAA,CAAsB,OAAA,EAAS,eAAA,GAAe,OAAA;EAAA,YAIlD,0BAAA;8EAEgE,IAAA,EAChE,kBAAA,CAAmB,aAAA,EAAe,SAAA,MACvC,cAAA,CAAe,aAAA,EAAe,SAAA;EAAA;EAAA,KA6BhC,0BAAA;wBAEiB,kBAAA,CAAmB,aAAA,EAAe,SAAA;sCAwBlB,OAAA,CAAQ,eAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAMC,OAAA;MAAa,SAAA;IAAA,MAAoB,OAAA,CAAA,MAAA,CAAA,QAAA,EAAA,KAAA;4CAGhC,OAAA;MAAa,SAAA;IAAA,MAAoB,OAAA,CAAA,MAAA,CAAA,QAAA,EAAA,KAAA;mCAG9C,eAAA;gCAIjB,cAAA,EACI,WAAA,EAAW,WAAA,qCACe,OAAA,CAAA,QAAA;;;;;;;;kCAMR,GAAA,EAAG,OAAA;MAAc,OAAA;IAAA,MAAmB,OAAA;iDAGrB,WAAA,EAAW,OAAA,GAAY,iBAAA,KAAiB,OAAA;2CAG9C,WAAA,EAAW,OAAA,GAAY,iBAAA,KAAiB,OAAA;;;;MAelD,WAAA;MAAqB,YAAA;IAAA,MAAsB,OAAA;;2CAMtC,OAAA;EAAA;AAAA;;;cC51IjC,gCAAA,kEAAkG,gCAAA,CAAiC,aAAA,EAAe,SAAA;EAAA,UAC3I,UAAA,EAAY,uBAAA;EAAA,iBAGb,uBAAA;EAAA,iBAOA,iBAAA;EAAA,iBAqBA,gBAAA;EAAA,iBAIA,iBAAA;EAAA,iBAUA,gBAAA;EAAA,UAeD,sBAAA,CAAuB,MAAA,UAAgB,MAAA,WAAc,OAAA;EAAA,iBAOpD,+BAAA;EAAA,iBAGA,+BAAA;EAAA,iBAUA,oCAAA;EAAA,iBAMA,kCAAA;;mBAOA,2CAAA;;mBAcA,+BAAA;EAAA,iBAaA,iCAAA;EAAA,iBAMA,oDAAA;EAAA,iBAaA,8BAAA;EAAA,iBAKA,2BAAA;EAAA,iBAKA,2BAAA;EAAA,iBAKA,2BAAA;EAAA,iBAKA,kCAAA;EAAA,iBAKA,+BAAA;EAAA,iBAIA,uBAAA;EAAA,iBAIA,uBAAA;EAAA,iBASA,uBAAA;EAAA,iBASA,2BAAA;EAAA,iBAOA,uBAAA;EAAA,iBAUA,0BAAA;EAAA,iBAMA,qBAAA;EAAA,iBAMA,qBAAA;EAAA,iBAMA,uBAAA;EAAA,iBAMA,wBAAA;EAAA,iBAWA,wBAAA;EAAA,iBAWA,0BAAA;EAAA,UAWP,qBAAA,CAAsB,cAAA,UAAwB,IAAA,oBAAwB,IAAA,CAAK,QAAA;EAAA,QAmCvE,iBAAA;EAAA,UAMJ,kCAAA,CAAmC,IAAA,EAAM,sBAAA,qBAA2C,yBAAA;EAAA,UAmBpF,6BAAA,CAA8B,MAAA,UAAgB,IAAA,EAAM,mBAAA,qBAAwC,oBAAA;EAAA,UA6B5F,mCAAA,CAAoC,MAAA,UAAgB,IAAA,EAAM,0BAAA,qBAA+C,oBAAA;EAAA,UAezG,4BAAA,CAA6B,IAAA,EAAM,iBAAA;;;;;;;;;MAWpB,SAAA;MAAoB,KAAA;MAAgB,WAAA;MAAuB,sBAAA;IAAA,IAAqC,OAAA,CAAQ,MAAA,OAC3H,YAAA,QAAoB,WAAA,CAAY,0CAAA;;;cAgC1B,OAAA,EAAS,gCAAA,CAAiC,aAAA,EAAe,SAAA,GAAY,YAAA;IAAiB,gBAAA;IAA2B,WAAA;IAAsB,SAAA,GAAY,uBAAA;EAAA;EAAA,UAuBrJ,qBAAA,CAAsB,IAAA,EAAM,eAAA,qBAAoC,MAAA;EAAA,UAChE,qBAAA,CAAsB,IAAA,EAAM,eAAA,qBAAoC,MAAA;EAAA,UAChE,qBAAA,CAAsB,IAAA,EAAM,GAAA,CAAI,SAAA,QAAiB,6BAAA,IAAiC,MAAA;EAAA,UAClF,qBAAA,CAAsB,IAAA,EAAM,GAAA,CAAI,SAAA,QAAiB,6BAAA,IAAiC,MAAA;EAAA,UAuBlF,wCAAA,CACR,MAAA,UACA,IAAA;IAAQ,QAAA;IAAkB,mBAAA;EAAA,IACzB,eAAA;EAAA,UA6BO,mBAAA,CAAoB,IAAA,EAAM,SAAA,qBAA8B,UAAA;EAAA,UAuZxD,uBAAA,CAAwB,IAAA,EAAM,sBAAA,qBAA2C,cAAA;EAAA,UAYzE,iCAAA,CAAkC,IAAA,EAAM,kBAAA,qBAAuC,kBAAA;EAAA,UAY/E,qCAAA,CAAsC,MAAA,UAAgB,IAAA,EAAM,kBAAA,qBAAuC,sBAAA;EAAA,UAmB1F,oBAAA,CAAqB,IAAA,EAAM,SAAA,oBAA6B,OAAA,EAAS,eAAA,GAAkB,wBAAA,CAAyB,SAAA;EAAA,UAUrH,mBAAA,CAAoB,IAAA,EAAM,SAAA,qBAA8B,UAAA;EAAA,UAqFxD,mBAAA,CAAoB,QAAA;IAAY,IAAA;IAAkC,EAAA;EAAA,GAAc,IAAA,EAAM,QAAA,qBAA6B,UAAA;EAAA,UAkD7G,cAAA,CAAe,OAAA;IAAW,MAAA;EAAA,IAAmB,OAAA,CAAQ,MAAA;EAAA,UAKrD,cAAA,CAAe,OAAA;IAAW,MAAA;EAAA,IAAmB,OAAA,CAAQ,MAAA;EAAA,UAI3D,cAAA,CAAe,OAAA;IAAW,MAAA;EAAA,IAAmB,MAAA;EAAA,UAI7C,cAAA,CAAe,OAAA;IAAW,MAAA;EAAA,IAAmB,MAAA;EAAA,UAIvC,gBAAA,CAAiB,MAAA,WAAiB,OAAA,CAAQ,UAAA;EAAA,UAQ1C,gBAAA,CAAiB,GAAA,EAAK,SAAA,EAAW,gBAAA,YAA4B,OAAA,CAAQ,UAAA;EAAA,UAW3E,gBAAA,CAAiB,GAAA,EAAK,SAAA,EAAW,gBAAA,YAA4B,UAAA;EAAA,UAW7D,gBAAA,CAAiB,MAAA,WAAiB,UAAA;EAAA,UAQ5B,gBAAA,CAAiB,MAAA,WAAiB,OAAA,CAAQ,UAAA;EAAA,UAOhD,gBAAA,CAAiB,MAAA,WAAiB,UAAA;EAQtC,UAAA,CAAW,OAAA,EAAS,uBAAA,GAA0B,OAAA,CAAQ,UAAA;EAMtD,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAmB,OAAA,CAAQ,wBAAA,CAAyB,SAAA;EAC9G,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAgB,OAAA,CAAQ,wBAAA,CAAyB,SAAA;EAC3G,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAoB,OAAA,CAAQ,wBAAA,CAAyB,SAAA;EAC/G,OAAA,CAAQ,OAAA,GAAU,qBAAA,CAAsB,aAAA,IAAiB,OAAA,CAAQ,wBAAA,CAAyB,SAAA;EAC1F,OAAA,CAAQ,EAAA,WAAa,OAAA,CAAQ,UAAA;EAC7B,OAAA,CAAQ,OAAA;IAAW,MAAA;EAAA,IAAmB,OAAA,CAAQ,UAAA;EAC9C,OAAA,CAAQ,OAAA;IAAW,IAAA;IAAgB,GAAA,EAAK,SAAA;IAAW,EAAA;EAAA,IAAqC,OAAA,CAAQ,UAAA;EAqDhG,aAAA,IAAiB,OAAA,CAAQ,wBAAA,CAAyB,SAAA;EAKlD,iBAAA,CAAkB,MAAA,WAAiB,OAAA,CAAQ,UAAA;EAKjD,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAmB,wBAAA,CAAyB,SAAA;EACtG,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAgB,wBAAA,CAAyB,SAAA;EACnG,OAAA,CAAQ,OAAA,EAAS,qBAAA,CAAsB,aAAA;IAAmB,EAAA;EAAA,IAAoB,wBAAA,CAAyB,SAAA;EACvG,OAAA,CAAQ,OAAA,GAAU,qBAAA,CAAsB,aAAA,IAAiB,wBAAA,CAAyB,SAAA;EAClF,OAAA,CAAQ,EAAA,WAAa,UAAA;EACrB,OAAA,CAAQ,OAAA;IAAW,MAAA;EAAA,IAAmB,UAAA;EACtC,OAAA,CAAQ,OAAA;IAAW,IAAA;IAAgB,GAAA,EAAK,SAAA;IAAW,EAAA;EAAA,IAAqC,UAAA;EA2DxF,WAAA,CAAY,MAAA,WAAiB,UAAA;EAOvB,SAAA,CAAU,OAAA,GAAU,sBAAA,GAAyB,OAAA,CAAQ,UAAA;IAAiB,UAAA;EAAA;EAQ5E,QAAA,CAAS,OAAA,GAAU,sBAAA,GAAyB,UAAA;IAAiB,UAAA;EAAA;EAQ7D,yBAAA,CAA0B,IAAA,EAAM,mBAAA,qBAAwC,sBAAA,qBAA2C,mBAAA;EAMnH,uCAAA,CAAwC,IAAA,EAAM,6BAAA,oBAAiD,6BAAA;EAQ/F,0CAAA,CAA2C,IAAA,EAAM,gCAAA,oBAAoD,gCAAA;EAQ/F,OAAA,CAAQ,OAAA;IAAW,MAAA;IAAgB,MAAA;EAAA;IAAqB,MAAA;IAAgB,MAAA;EAAA;IAAqB,MAAA;IAAgB,gBAAA;EAAA,IAA6B,OAAA,CAAQ,UAAA;EAAA,UAaxI,iBAAA,CAAkB,YAAA,8BAA0C,UAAA,UAAoB,MAAA,WAAiB,OAAA;EAU3G,YAAA,CAAa,OAAA,EAAS,8BAAA,GAAiC,OAAA,CAAQ,oBAAA;EAYrE,OAAA,CAAQ,OAAA;IAAW,MAAA;IAAgB,MAAA;EAAA;IAAqB,MAAA;IAAgB,MAAA;EAAA;IAAqB,MAAA;IAAgB,gBAAA;EAAA,IAA6B,UAAA;EAAA,QAuBlI,gBAAA;EAYF,YAAA,CAAa,OAAA;IACd,MAAA;EAAA;IAAqB,MAAA;EAAA;IAAqB,gBAAA;EAAA;IAC1C,SAAA;EAAA;IAAwB,OAAA,EAAS,aAAA;EAAA;IAClC,QAAA;EAAA,KACA,OAAA;EAmBE,iBAAA,CAAkB,OAAA;IACnB,MAAA;EAAA;IAAqB,MAAA;EAAA;IAAqB,gBAAA;EAAA;IAC1C,SAAA;EAAA;IAAwB,OAAA,EAAS,aAAA;EAAA;IAClC,SAAA;EAAA,KACA,OAAA;EAOE,UAAA,CAAW,IAAA,EAAM,uBAAA,GAA0B,OAAA,CAAQ,UAAA;EAOnD,SAAA,CAAU,OAAA,GAAU,sBAAA,GAAyB,OAAA,CAAQ,UAAA;IAAiB,UAAA;EAAA;EAO5E,QAAA,CAAS,OAAA,GAAU,sBAAA,GAAyB,UAAA;IAAiB,UAAA;EAAA;EASvD,yBAAA,CAA0B,MAAA,UAAgB,OAAA;IAAY,SAAA;EAAA,IAAwB,OAAA;IAAU,MAAA;IAAgB,YAAA;EAAA;EAM9G,wBAAA,CAAyB,MAAA,UAAgB,OAAA;IAAY,SAAA;EAAA;IAA0B,MAAA;IAAgB,YAAA;EAAA;EAMzF,OAAA,CAAQ,OAAA;IAAW,MAAA;EAAA,IAAmB,OAAA,CAAQ,UAAA;EAC9C,OAAA,CAAQ,MAAA,WAAiB,OAAA,CAAQ,UAAA;EAcvC,OAAA,CAAQ,OAAA;IAAW,MAAA;EAAA,IAAmB,UAAA;EACtC,OAAA,CAAQ,MAAA,WAAiB,UAAA;EAAA,UAcf,2BAAA,CAA4B,EAAA,WAAa,cAAA;EAqB7C,iBAAA,CAAkB,EAAA,WAAa,OAAA,CAAQ,cAAA;EAI7C,iBAAA,CAAkB,EAAA,WAAa,cAAA;EAIzB,SAAA,CAAU,OAAA,EAAS,gBAAA,GAAmB,OAAA;EAKtC,qBAAA,IAAyB,OAAA,CAAQ,iBAAA;EAIvC,qBAAA,IAAyB,iBAAA;EAInB,0BAAA,IAA8B,OAAA;EAM9B,cAAA,CAAe,OAAA,EAAS,qBAAA,GAAwB,OAAA,CAAQ,sBAAA;EAIxD,kBAAA,CAAmB,OAAA,GAAU,yBAAA,GAA4B,OAAA,CAAQ,wBAAA;EAiCjE,gBAAA,CAAiB,eAAA,WAA0B,OAAA,CAAQ,kBAAA;EAiBnD,uBAAA,CAAwB,eAAA,UAAyB,OAAA,GAAU,8BAAA,GAAiC,OAAA,CAAQ,6BAAA;EAwBpG,2BAAA,CAA4B,eAAA,UAAyB,OAAA,WAAkB,OAAA,CAAQ,wCAAA;EAI/E,sBAAA,CAAuB,eAAA,UAAyB,OAAA;IAAY,MAAA;IAAiB,KAAA;EAAA,IAAmB,OAAA,CAAQ,4BAAA;EAAA,UAoBrF,eAAA,CAAgB,OAAA,EAAS,eAAA,GAAe,OAAA;EAAA,UAOxC,aAAA,IAAa,OAAA;EAWhC,mBAAA,CAAoB,OAAA;IACxB,MAAA;IACA,gBAAA;IACA,SAAA;IACA,KAAA;IACA,WAAA;IACA,sBAAA;EAAA,IACE,OAAA,CAAQ,MAAA,CAAO,mBAAA,EAAqB,YAAA,QAAoB,WAAA,CAAY,0CAAA;AAAA;;;KCpqDrE,iBAAA,GAAoB,OAAA,CAAQ,UAAA,CAAW,sBAAA;AAAA,cAqC/B,+BAAA,kEAAiG,gCAAA,CAAiC,aAAA,EAAe,SAAA,aAAsB,aAAA,CAAc,aAAA,EAAe,SAAA;EAAA,UAC7L,UAAA,EAAY,sBAAA;EAAA,iBAEb,kBAAA;EAAA,iBAGA,eAAA;EAAA,iBAGA,qBAAA;EAAA,iBAIA,qBAAA;EAAA,iBAGA,sBAAA;EAAA,iBAGA,yBAAA;EAAA,iBAGA,sBAAA;EAAA,iBAGA,oBAAA;EAAA,iBAGA,oCAAA;EAAA,iBAGA,uCAAA;EAAA,iBAGA,eAAA;EAAA,iBAMA,aAAA;EAAA,iBAIA,kBAAA;EAAA,iBAGA,uBAAA;EAAA,iBAGA,kBAAA;EAAA,iBAGA,qCAAA;EAAA,iBAGA,qBAAA;EAAA,iBAGA,uBAAA;EAAA,iBAUA,kBAAA;cAIL,OAAA,EAAS,+BAAA,CAAgC,aAAA,EAAe,SAAA,GAAY,YAAA;IAAiB,gBAAA;IAA2B,WAAA;IAAsB,SAAA,GAAY,sBAAA;EAAA;EA2B9J,oBAAA,CAAqB,IAAA;IAAQ,aAAA;EAAA,IAA0B,cAAA;EAIvD,0BAAA,CAA2B,IAAA,EAAM,YAAA,mBAA+B,SAAA,QAAiB,OAAA,SAAgB,iBAAA;EAUjG,qBAAA,CAAsB,IAAA,EAAM,YAAA,mBAA+B,SAAA,QAAiB,OAAA,SAAgB,YAAA;EA0L5F,2BAAA,CAA4B,IAAA,EAAM,iBAAA,oBAAqC,kBAAA;EASvE,kBAAA,CAAmB,IAAA,EAAM,iBAAA,GAAoB,SAAA;EAwB9B,UAAA,IAAc,OAAA,CAAQ,YAAA;EAO5B,UAAA,IAAc,YAAA;EAQjB,YAAA,IAAgB,OAAA,CAAQ,SAAA;EAI9B,YAAA,IAAgB,SAAA;EAAA,UAKN,iCAAA,CAAkC,IAAA,EAAM,0BAAA,GAA6B,kBAAA;EAAA,UAwBrE,6BAAA,CAA8B,IAAA,EAAM,mBAAA,oBAAuC,cAAA;EAAA,UAS3E,sCAAA,CAAuC,IAAA,EAAM,gCAAA,GAAmC,uBAAA;EASpF,mBAAA,IAAuB,OAAA,CAAQ,cAAA;EAKrC,kBAAA,IAAsB,cAAA;EAOhB,oBAAA,CAAqB,OAAA,EAAS,2BAAA,GAA8B,OAAA,CAAQ,uBAAA;EAO1E,cAAA;IAAoB,EAAA;IAAY,WAAA;EAAA;EAShC,iBAAA;IAAuB,EAAA;IAAY,WAAA;IAAqB,OAAA;IAAkB,SAAA;EAAA;EAW1E,cAAA;IAAoB,EAAA;IAAY,WAAA;IAAqB,OAAA;IAAqC,SAAA;IAAmB,MAAA,EAAQ,IAAA;EAAA;EAYrH,YAAA,IAAgB,aAAA;EAIV,eAAA,IAAmB,OAAA;IAAU,EAAA;IAAY,WAAA;EAAA;EAQzC,kBAAA,IAAsB,OAAA;IAAU,EAAA;IAAY,WAAA;IAAqB,OAAA;IAAkB,SAAA;EAAA;EAYnF,aAAA,IAAiB,OAAA,CAAQ,aAAA;EAKzB,cAAA,CAAe,OAAA;IAAW,EAAA;IAAY,WAAA;IAAsB,MAAA;EAAA,IAAmB,OAAA,CAAQ,uBAAA;EAUvF,oBAAA,CAAqB,UAAA,UAAoB,MAAA,WAAiB,OAAA,CAAQ,uBAAA;EAMlE,cAAA,CAAe,UAAA,WAAqB,OAAA;EAKpC,iBAAA,CAAkB,UAAA,UAAoB,QAAA,YAAoB,OAAA;EAK1D,oBAAA,CAAqB,UAAA,WAAqB,OAAA,CAAQ,oBAAA;EAIlD,gBAAA,CAAiB,UAAA,UAAoB,MAAA,EAAQ,uBAAA;IAA4B,YAAA;EAAA,IAAuB,OAAA;IAAU,IAAA,EAAM,uBAAA;IAA2B,UAAA;EAAA;EAC3I,gBAAA,CAAiB,UAAA,UAAoB,MAAA,GAAS,uBAAA,GAA0B,OAAA;IAAU,IAAA,EAAM,gBAAA;IAAoB,UAAA;EAAA;EAiC5G,cAAA,CAAe,KAAA,WAAgB,OAAA,CAAQ,uBAAA;EAIvC,kBAAA,CAAmB,UAAA,UAAoB,MAAA;IAAU,MAAA;IAAiB,KAAA;IAAgB,KAAA;IAA2C,OAAA;EAAA,IAA0B,OAAA;IAAU,aAAA;EAAA;EAWjK,mBAAA,CAAoB,UAAA,UAAoB,OAAA;IAAW,SAAA;IAAmB,MAAA;IAAiB,WAAA;EAAA,IAAyB,OAAA,CAAQ,0BAAA;EAwBxH,gBAAA,CAAiB,KAAA,WAAgB,OAAA;EAKjC,iBAAA,CAAkB,IAAA,UAAc,IAAA,aAAiB,OAAA;IAAU,OAAA;EAAA;EAS3D,eAAA,IAAmB,OAAA;IAAU,EAAA;IAAY,WAAA;IAAqB,OAAA;IAAqC,SAAA;IAAmB,MAAA,EAAQ,IAAA;EAAA;EAY9H,8BAAA,CAA+B,IAAA,EAAM,0CAAA,GAA6C,OAAA,CAAQ,mBAAA;EAM1F,8BAAA,CAA+B,YAAA,UAAsB,IAAA,EAAM,0CAAA,GAA0C,OAAA;EAKrG,8BAAA,CAA+B,YAAA,WAAuB,OAAA;EAKtD,6BAAA,IAAiC,OAAA,CAAQ,6BAAA;EAKzC,sCAAA,CACJ,OAAA;IAAW,KAAA;IAAe,MAAA;IAAiB,KAAA;EAAA,IAC1C,OAAA;IAAU,KAAA,EAAO,6BAAA;IAAiC,UAAA;EAAA;EAQrD,4BAAA,IAAgC,6BAAA;EAO1B,iCAAA,CAAkC,IAAA,EAAM,6CAAA,GAAgD,OAAA,CAAQ,sBAAA;EAMhG,iCAAA,CAAkC,YAAA,UAAsB,IAAA,EAAM,6CAAA,GAA6C,OAAA;EAK3G,iCAAA,CAAkC,YAAA,WAAuB,OAAA;EAKzD,gCAAA,IAAoC,OAAA,CAAQ,gCAAA;EAKlD,+BAAA,IAAmC,gCAAA;EAMnC,YAAA;IAAkB,KAAA;IAAe,GAAA;EAAA;EAAA,UAKR,eAAA,IAAe,OAAA;EAAA,UAOxB,qBAAA,IAAqB,OAAA;EAAA,UAOrB,uBAAA,IAAuB,OAAA;EAAA,UAId,aAAA,IAAa,OAAA;EAAA,KAQjC,0BAAA;6CAI0B,OAAA;MACb,YAAA;MAAuB,QAAA;MAAmB,OAAA;MAAkB,EAAA;MAAa,MAAA;MAAiB,KAAA;MAAgB,KAAA;IAAA,MACrH,eAAA;yCAYgC,oBAAA;gCAGT,iBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oGAknB8k1I,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA5mBtm1I,aAAA,CAAc,OAAA;IAClB,cAAA;IACA,WAAA,EAAa,WAAA;EAAA,IACX,OAAA,CAAQ,MAAA;IAAoB,YAAA;EAAA;EAgC1B,eAAA,CAAgB,OAAA;IAAW,UAAA;EAAA,IAAuB,OAAA,CAAQ,MAAA;IAAoB,YAAA;EAAA;EAY9E,cAAA,IAAkB,OAAA,CAAQ,cAAA;EAY1B,yBAAA,CAA0B,OAAA;IAAW,SAAA;IAAmB,eAAA;EAAA,IAA4B,OAAA,CAAQ,+BAAA;EAc5F,uBAAA,CAAwB,OAAA;IAAW,QAAA;IAAkB,SAAA;IAAmB,eAAA;EAAA,IAA4B,OAAA,CAAQ,0BAAA;EAW5G,uBAAA,IAA2B,OAAA,CAAQ,4BAAA;EAWnC,yBAAA,CAA0B,OAAA;IAAW,QAAA;EAAA,IAAqB,OAAA;IAAU,MAAA;EAAA;EAQpE,wBAAA,CAAyB,OAAA;IAAW,cAAA;EAAA,IAA2B,OAAA;IAAU,MAAA;EAAA;EAMzE,yBAAA,CAA0B,KAAA,UAAe,WAAA,WAAsB,OAAA;EAI/D,mBAAA,CAAoB,WAAA,WAAsB,OAAA;IAAU,EAAA;EAAA;EAOpD,mBAAA,CAAoB,EAAA,WAAa,OAAA;EAKjC,gBAAA,CAAiB,OAAA;IAAW,WAAA;IAAqB,OAAA;IAA0B,SAAA;EAAA,IAAuB,OAAA;IAAU,EAAA;EAAA;EAU5G,gBAAA,CAAiB,EAAA,UAAY,IAAA;IAAQ,WAAA;IAAsB,OAAA;IAAsC,SAAA;EAAA,IAAuB,OAAA;EASxH,gBAAA,CAAiB,EAAA,WAAa,OAAA;EAS9B,kBAAA,IAAsB,OAAA;EAItB,eAAA,CAAgB,QAAA,UAAkB,OAAA,QAAe,OAAA;EAIjD,gBAAA,CAAiB,QAAA,WAAmB,OAAA;IAAU,QAAA,EAAU,KAAA;EAAA;EAIxD,2BAAA,CAA4B,iBAAA,WAA4B,OAAA;IAAU,SAAA;EAAA;EAKlE,gBAAA,CAAiB,WAAA,WAAsB,OAAA;IAAU,EAAA;EAAA;EAMjD,eAAA,CAAgB,OAAA;IAAW,OAAA;IAAiC,cAAA;IAAyB,UAAA;IAAqB,iBAAA;EAAA,IAA+B,OAAA;EAI/I,eAAA,CAAgB,OAAA;IAAW,OAAA;IAAiC,cAAA;IAAyB,UAAA;IAAqB,iBAAA;EAAA;EAIpG,kCAAA,CAAmC,OAAA;IAAW,OAAA;IAAiC,cAAA;IAAyB,UAAA;IAAqB,iBAAA;IAA4B,cAAA;EAAA,IAAmD,OAAA;IAAU,IAAA;IAAc,eAAA,GAAkB,MAAA;EAAA;EAI5P,kCAAA,CAAmC,OAAA;IAAW,OAAA;IAAiC,cAAA;IAAyB,UAAA;IAAqB,iBAAA;IAA4B,cAAA;EAAA;IAAqD,IAAA;IAAc,eAAA,GAAkB,MAAA;EAAA;EAI9O,aAAA,CAAc,EAAA;IAAe,WAAA;IAAqB,SAAA;EAAA;EAO5C,gBAAA,CAAiB,EAAA,UAAY,SAAA,WAAoB,OAAA;EAMjD,gBAAA,CAAiB,EAAA,WAAa,OAAA;EAM9B,mBAAA,CAAoB,EAAA,UAAY,SAAA,UAAmB,OAAA,0BAAiC,OAAA;IAAU,YAAA;EAAA;EAM9F,aAAA,IAAiB,OAAA;IAAU,GAAA;EAAA;EAM3B,gCAAA,IAAoC,OAAA;IAAU,aAAA;EAAA;EAI9C,uBAAA,IAA2B,OAAA;IAAU,QAAA;IAAkB,OAAA,EAAS,KAAA;MAAQ,EAAA;MAAY,IAAA;MAAc,OAAA;MAAkB,SAAA;MAAoB,WAAA;IAAA;EAAA;EAIxI,0BAAA,CAA2B,QAAA,UAAkB,OAAA,EAAS,MAAA,yBAA+B,OAAA;EAIrF,wBAAA,CAAyB,OAAA;IAC3B,MAAA;IAAgB,MAAA;IAAgB,QAAA;IAAkB,SAAA;IAAoB,WAAA;EAAA;IACtE,MAAA;IAAgB,MAAA;IAAgB,QAAA;IAAkB,SAAA;IAAoB,WAAA;EAAA;IACtE,gBAAA;IAA0B,MAAA;IAAgB,QAAA;IAAkB,SAAA;IAAoB,WAAA;EAAA,KAChF,OAAA;EA0BE,iBAAA,CAAkB,OAAA;IACtB,IAAA;IACA,EAAA;IACA,SAAA;IACA,SAAA,EAAW,WAAA;IACX,SAAA;EAAA,IACE,OAAA;IAAU,mBAAA;EAAA;EAYR,gBAAA,CAAiB,MAAA;IAAU,MAAA;IAAiB,KAAA;IAAgB,IAAA,GAAO,eAAA;IAAiB,YAAA;IAA2C,UAAA;EAAA,IAAwB,OAAA;IAAU,YAAA,EAAc,WAAA;IAAe,UAAA;EAAA;EAAA,QAQ5L,uBAAA;EAgOF,gBAAA,CAAiB,OAAA;IAAY,MAAA;IAAiB,YAAA;IAAuB,MAAA;IAAiB,KAAA;IAAgB,MAAA;EAAA,IAAoB,OAAA;IAAU,KAAA,EAAO,gBAAA;IAAoB,UAAA;EAAA;EAc/J,cAAA,CAAe,EAAA,WAAa,OAAA,CAAQ,gBAAA;EAKpC,iBAAA,CAAkB,EAAA,UAAY,OAAA,EAAS,wBAAA,GAA2B,OAAA,CAAQ,gBAAA;EAW1E,gBAAA,CAAiB,EAAA,WAAa,OAAA,CAAQ,gBAAA;EAItC,kBAAA,CAAmB,EAAA,WAAa,OAAA,CAAQ,gBAAA;EAIxC,iBAAA,CAAkB,EAAA,WAAa,OAAA,CAAQ,gBAAA;EAI7C,eAAA,CAAgB,MAAA;IAAU,MAAA;IAAiB,KAAA;IAAgB,IAAA,GAAO,eAAA;IAAiB,YAAA;IAA2C,UAAA;EAAA;IAA0B,YAAA,EAAc,WAAA;IAAe,UAAA;EAAA;EAK/K,oBAAA,IAAwB,OAAA;IAAiB,UAAA;IAAoB,eAAA;IAA0B,iBAAA;IAA4B,eAAA;EAAA;EAIzH,oBAAA;IAA0B,UAAA;IAAoB,eAAA;IAA0B,iBAAA;IAA4B,eAAA;EAAA;EAK9F,oBAAA,CAAqB,OAAA,EAAS,wBAAA,GAA2B,OAAA,CAAQ,yBAAA;EAkBjE,4BAAA,CAA6B,OAAA;IAAW,MAAA;EAAA,IAAmB,OAAA,CAAQ,8BAAA;EAInE,sCAAA,CACJ,UAAA;IAAc,wBAAA;EAAA,GACd,KAAA,YACC,OAAA;IACD,aAAA,EAAe,KAAA;MACb,EAAA;MACA,WAAA;MACA,YAAA;MACA,gBAAA,EAAkB,gBAAA;IAAA;IAEpB,kBAAA;EAAA;AAAA"}