@eddyskywalker/dsh-chatgpt-subscription 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +34 -1
  2. package/README.md +67 -1
  3. package/lib/client.js +1566 -222
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +4882 -1114
  6. package/lib/types/client/ProviderHubSection.d.ts.map +1 -1
  7. package/lib/types/client/common/AccountPoolSection.d.ts +14 -0
  8. package/lib/types/client/common/AccountPoolSection.d.ts.map +1 -1
  9. package/lib/types/client/index.d.ts +1 -0
  10. package/lib/types/client/index.d.ts.map +1 -1
  11. package/lib/types/client/workbuddy/WorkBuddyComposerQuota.d.ts +26 -0
  12. package/lib/types/client/workbuddy/WorkBuddyComposerQuota.d.ts.map +1 -0
  13. package/lib/types/client/workbuddy/WorkBuddySection.d.ts +41 -0
  14. package/lib/types/client/workbuddy/WorkBuddySection.d.ts.map +1 -0
  15. package/lib/types/client/workbuddy/locales.d.ts +563 -0
  16. package/lib/types/client/workbuddy/locales.d.ts.map +1 -0
  17. package/lib/types/client/workbuddy/styles.d.ts +11 -0
  18. package/lib/types/client/workbuddy/styles.d.ts.map +1 -0
  19. package/lib/types/host/common/account-pool.d.ts +18 -0
  20. package/lib/types/host/common/account-pool.d.ts.map +1 -1
  21. package/lib/types/host/workbuddy/account-pool.d.ts +106 -0
  22. package/lib/types/host/workbuddy/account-pool.d.ts.map +1 -0
  23. package/lib/types/host/workbuddy/adapter.d.ts +97 -0
  24. package/lib/types/host/workbuddy/adapter.d.ts.map +1 -0
  25. package/lib/types/host/workbuddy/client.d.ts +90 -0
  26. package/lib/types/host/workbuddy/client.d.ts.map +1 -0
  27. package/lib/types/host/workbuddy/mapper.d.ts +114 -0
  28. package/lib/types/host/workbuddy/mapper.d.ts.map +1 -0
  29. package/lib/types/host/workbuddy/model-catalog.d.ts +108 -0
  30. package/lib/types/host/workbuddy/model-catalog.d.ts.map +1 -0
  31. package/lib/types/host/workbuddy/oauth.d.ts +38 -0
  32. package/lib/types/host/workbuddy/oauth.d.ts.map +1 -0
  33. package/lib/types/host/workbuddy/routes.d.ts +33 -0
  34. package/lib/types/host/workbuddy/routes.d.ts.map +1 -0
  35. package/lib/types/host/workbuddy/token-store.d.ts +216 -0
  36. package/lib/types/host/workbuddy/token-store.d.ts.map +1 -0
  37. package/lib/types/host/workbuddy/types.d.ts +127 -0
  38. package/lib/types/host/workbuddy/types.d.ts.map +1 -0
  39. package/lib/types/index.d.ts +5 -0
  40. package/lib/types/index.d.ts.map +1 -1
  41. package/lib/types/shared/account-pool-contracts.d.ts +8 -0
  42. package/lib/types/shared/account-pool-contracts.d.ts.map +1 -1
  43. package/lib/types/shared/workbuddy-contracts.d.ts +204 -0
  44. package/lib/types/shared/workbuddy-contracts.d.ts.map +1 -0
  45. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderHubSection.d.ts","sourceRoot":"","sources":["../../../src/client/ProviderHubSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAKjF,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,KAAK,KAAK,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG;IACvE,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B,CAAA;AAcD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAsC7F"}
1
+ {"version":3,"file":"ProviderHubSection.d.ts","sourceRoot":"","sources":["../../../src/client/ProviderHubSection.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAMjF,OAAO,EAAE,EAAE,EAAE,MAAM,cAAc,CAAA;AAEjC,KAAK,KAAK,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,WAAW,CAAC,OAAO,EAAE,CAAC,GAAG;IACvE,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAC3B,CAAA;AAeD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,CAAC,EAAE,aAAa,EAAE,GAAG,OAAO,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAuC7F"}
@@ -11,6 +11,13 @@ export interface AccountPoolSectionProps<TAccount extends PoolAccountSummaryDto
11
11
  /** Overrides the login button text while a sign-in flow is running. */
12
12
  loginBusyLabel?: string;
13
13
  onLogin(): void;
14
+ /**
15
+ * Replaces the single header button with the provider's own entry points.
16
+ *
17
+ * WorkBuddy signs in against two regional deployments, so one "add account"
18
+ * button cannot express it; every other line keeps the default button.
19
+ */
20
+ renderLoginActions?(): ReactNode;
14
21
  onSetPrimary(accountId: string): void;
15
22
  onDelete(accountId: string): void;
16
23
  onClearCooldown(accountId: string): void;
@@ -19,6 +26,13 @@ export interface AccountPoolSectionProps<TAccount extends PoolAccountSummaryDto
19
26
  onSetStrategy(strategy: AccountRotationStrategy): void;
20
27
  /** Provider-specific detail rows, rendered before the shared ones. */
21
28
  renderDetails?(account: TAccount): ReactNode;
29
+ /**
30
+ * Provider-specific per-account buttons, rendered before the shared ones.
31
+ *
32
+ * Used by a line that adopts accounts it does not own: hiding or restoring
33
+ * an externally-managed account replaces the delete it must never offer.
34
+ */
35
+ renderAccountActions?(account: TAccount): ReactNode;
22
36
  /** Value shown beside the storage label; defaults to a generic description. */
23
37
  storageValue?: string;
24
38
  /** Extra controls inside the group, after the account list. */
@@ -1 +1 @@
1
- {"version":3,"file":"AccountPoolSection.d.ts","sourceRoot":"","sources":["../../../../src/client/common/AccountPoolSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAElF,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,MAAM,WAAW,uBAAuB,CACtC,QAAQ,SAAS,qBAAqB,GAAG,qBAAqB,CAC9D,SAAQ,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,GAAG,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAC5F,QAAQ,EAAE,QAAQ,EAAE,CAAA;IACpB,mEAAmE;IACnE,MAAM,EAAE,iBAAiB,CAAA;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,IAAI,IAAI,CAAA;IACf,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,sEAAsE;IACtE,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,aAAa,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACtD,sEAAsE;IACtE,aAAa,CAAC,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC5C,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAEnF;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,SAAa,GAAG,OAAO,CAEvF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,SAAS,qBAAqB,GAAG,qBAAqB,EAC/F,KAAK,EAAE,uBAAuB,CAAC,QAAQ,CAAC,GACvC,KAAK,CAAC,YAAY,CAqIpB"}
1
+ {"version":3,"file":"AccountPoolSection.d.ts","sourceRoot":"","sources":["../../../../src/client/common/AccountPoolSection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAC7C,OAAO,KAAK,EACV,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACtB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAmB,KAAK,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAElF,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAEjE,MAAM,WAAW,uBAAuB,CACtC,QAAQ,SAAS,qBAAqB,GAAG,qBAAqB,CAC9D,SAAQ,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,iBAAiB,GAAG,kBAAkB,CAAC,EAAE,UAAU,CAAC;IAC5F,QAAQ,EAAE,QAAQ,EAAE,CAAA;IACpB,mEAAmE;IACnE,MAAM,EAAE,iBAAiB,CAAA;IACzB,yEAAyE;IACzE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,IAAI,IAAI,CAAA;IACf;;;;;OAKG;IACH,kBAAkB,CAAC,IAAI,SAAS,CAAA;IAChC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,sEAAsE;IACtE,SAAS,CAAC,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,aAAa,CAAC,QAAQ,EAAE,uBAAuB,GAAG,IAAI,CAAA;IACtD,sEAAsE;IACtE,aAAa,CAAC,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAA;IAC5C;;;;;OAKG;IACH,oBAAoB,CAAC,CAAC,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAA;IACnD,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,SAAS,CAAA;CACrB;AAED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAAC,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED,yDAAyD;AACzD,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,CAEnF;AAED,iEAAiE;AACjE,wBAAgB,aAAa,CAAC,OAAO,EAAE,qBAAqB,EAAE,GAAG,SAAa,GAAG,OAAO,CAEvF;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,SAAS,qBAAqB,GAAG,qBAAqB,EAC/F,KAAK,EAAE,uBAAuB,CAAC,QAAQ,CAAC,GACvC,KAAK,CAAC,YAAY,CA4IpB"}
@@ -6,6 +6,7 @@ declare module '@deepseek-ai/dsh-client-ui-slots' {
6
6
  'dsh-antigravity': any;
7
7
  'dsh-command-code': any;
8
8
  'dsh-kimi-code': any;
9
+ 'dsh-workbuddy': any;
9
10
  }
10
11
  }
11
12
  export declare const inject: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAenE,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAa/D,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,kBAAkB;QAC1B,0BAA0B,EAAE,SAAS,CAAA;QACrC,iBAAiB,EAAE,GAAG,CAAA;QACtB,kBAAkB,EAAE,GAAG,CAAA;QACvB,eAAe,EAAE,GAAG,CAAA;KACrB;CACF;AAED,eAAO,MAAM,MAAM,UAA0D,CAAA;AAE7E,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CA0H9C"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/client/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAenE,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAA;AAgB/D,OAAO,QAAQ,kCAAkC,CAAC;IAChD,UAAU,kBAAkB;QAC1B,0BAA0B,EAAE,SAAS,CAAA;QACrC,iBAAiB,EAAE,GAAG,CAAA;QACtB,kBAAkB,EAAE,GAAG,CAAA;QACvB,eAAe,EAAE,GAAG,CAAA;QACpB,eAAe,EAAE,GAAG,CAAA;KACrB;CACF;AAED,eAAO,MAAM,MAAM,UAA0D,CAAA;AAE7E,wBAAgB,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI,CA8I9C"}
@@ -0,0 +1,26 @@
1
+ import type { ModelDirectoryState } from '@deepseek-ai/dsh-client-ui-model-selection/client';
2
+ import type { PropsLocale, PropsRuntime } from '@deepseek-ai/dsh-client-ui-slots';
3
+ import type { WorkBuddyWebStatus } from '../../shared/workbuddy-contracts.ts';
4
+ import type { SnapshotStore } from '../store.ts';
5
+ import { NS_WORKBUDDY } from './locales.ts';
6
+ type Props = PropsRuntime<'conversation.input.right'> & PropsLocale<typeof NS_WORKBUDDY> & {
7
+ directory: SnapshotStore<ModelDirectoryState>;
8
+ loadModelDirectory: () => void;
9
+ };
10
+ interface BadgeFacts {
11
+ text: string;
12
+ tooltip: string;
13
+ level: 'normal' | 'warning' | 'danger';
14
+ }
15
+ /**
16
+ * Pick the most meaningful number for the badge.
17
+ *
18
+ * A bounded allowance is what a user spends down, so it wins over a bare credit
19
+ * balance; the balance shows only when no percentage is reported. The billing
20
+ * payload reports both a cycle meter and a package meter, and the cycle meter
21
+ * is the one that actually resets, so it is preferred when both exist.
22
+ */
23
+ export declare function selectBadgeFacts(status: WorkBuddyWebStatus | null): BadgeFacts | null;
24
+ export declare function WorkBuddyComposerQuota({ directory, loadModelDirectory }: Props): React.JSX.Element | null;
25
+ export {};
26
+ //# sourceMappingURL=WorkBuddyComposerQuota.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkBuddyComposerQuota.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/WorkBuddyComposerQuota.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mDAAmD,CAAA;AAC5F,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AACjF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAA;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAmB3C,KAAK,KAAK,GAAG,YAAY,CAAC,0BAA0B,CAAC,GACnD,WAAW,CAAC,OAAO,YAAY,CAAC,GAAG;IACjC,SAAS,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAA;IAC7C,kBAAkB,EAAE,MAAM,IAAI,CAAA;CAC/B,CAAA;AAEH,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAA;CACvC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,GAAG,UAAU,GAAG,IAAI,CAyBrF;AAED,wBAAgB,sBAAsB,CAAC,EAAE,SAAS,EAAE,kBAAkB,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAgEzG"}
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import type { WorkBuddyModelOption, WorkBuddyReasoningEffort } from '../../shared/workbuddy-contracts.ts';
3
+ interface Props {
4
+ onModelChange?: () => void;
5
+ loadModelDirectory?: () => void;
6
+ }
7
+ /** Parse "1M", "512K", "200000" into a positive integer token count. */
8
+ export declare function parsePositiveCapacity(value: string): number | null;
9
+ export declare function formatCapacity(value: number): string;
10
+ /** Mask a UIN so the card shows identity without publishing the full number. */
11
+ export declare function maskUin(uin?: string | null): string;
12
+ /** Shorten an absolute credential path to its file name for display. */
13
+ export declare function displayFile(file?: string | null): string;
14
+ /** One selectable default reasoning level, with the models that declare it. */
15
+ export interface ReasoningEffortChoice {
16
+ value: WorkBuddyReasoningEffort;
17
+ /** Model names that accept this level, in catalog order. */
18
+ models: string[];
19
+ }
20
+ /**
21
+ * Reasoning levels the default-effort control may offer.
22
+ *
23
+ * The levels come from what this account's models actually declare — never from
24
+ * the shipped enum alone. The setting is one global default applied to whichever
25
+ * model a conversation uses, so the list is their union; each entry carries the
26
+ * models behind it, and a level only some models accept is labelled as such.
27
+ * Order follows {@link WORKBUDDY_REASONING_EFFORTS}, which is the escalating
28
+ * order the upstream ladder uses.
29
+ */
30
+ export declare function reasoningEffortChoices(models: WorkBuddyModelOption[]): ReasoningEffortChoice[];
31
+ /**
32
+ * Whether a saved default is unusable for every model on this account.
33
+ *
34
+ * The adapter drops a level the chosen model does not accept instead of sending
35
+ * it, so a value that no model declares silently does nothing. Reporting it is
36
+ * what keeps that from looking like the setting was applied.
37
+ */
38
+ export declare function unsupportedReasoningEffort(configured: WorkBuddyReasoningEffort | null | undefined, models: WorkBuddyModelOption[]): WorkBuddyReasoningEffort | null;
39
+ export declare function WorkBuddySection({ onModelChange, loadModelDirectory }: Props): React.ReactElement;
40
+ export {};
41
+ //# sourceMappingURL=WorkBuddySection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WorkBuddySection.d.ts","sourceRoot":"","sources":["../../../../src/client/workbuddy/WorkBuddySection.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4D,MAAM,OAAO,CAAA;AAChF,OAAO,KAAK,EAEV,oBAAoB,EACpB,wBAAwB,EAEzB,MAAM,qCAAqC,CAAA;AAuB5C,UAAU,KAAK;IACb,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;IAC1B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAA;CAChC;AAiED,wEAAwE;AACxE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAOlE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIpD;AAuBD,gFAAgF;AAChF,wBAAgB,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAInD;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAIxD;AAED,+EAA+E;AAC/E,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,wBAAwB,CAAA;IAC/B,4DAA4D;IAC5D,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AAED;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,EAAE,GAAG,qBAAqB,EAAE,CAY9F;AAED;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,wBAAwB,GAAG,IAAI,GAAG,SAAS,EACvD,MAAM,EAAE,oBAAoB,EAAE,GAC7B,wBAAwB,GAAG,IAAI,CAIjC;AA+BD,wBAAgB,gBAAgB,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,EAAE,KAAK,GAAG,KAAK,CAAC,YAAY,CA4uBjG"}