@privos_ai/app-server 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +90 -0
  3. package/dist/app-descriptor.d.ts +39 -0
  4. package/dist/app-descriptor.d.ts.map +1 -0
  5. package/dist/app-descriptor.js +71 -0
  6. package/dist/app-descriptor.js.map +1 -0
  7. package/dist/auth/user-token.d.ts +44 -0
  8. package/dist/auth/user-token.d.ts.map +1 -0
  9. package/dist/auth/user-token.js +108 -0
  10. package/dist/auth/user-token.js.map +1 -0
  11. package/dist/context/identity-assertions.d.ts +18 -0
  12. package/dist/context/identity-assertions.d.ts.map +1 -0
  13. package/dist/context/identity-assertions.js +37 -0
  14. package/dist/context/identity-assertions.js.map +1 -0
  15. package/dist/context/identity-mode.d.ts +3 -0
  16. package/dist/context/identity-mode.d.ts.map +1 -0
  17. package/dist/context/identity-mode.js +6 -0
  18. package/dist/context/identity-mode.js.map +1 -0
  19. package/dist/context/tool-call-context.d.ts +29 -0
  20. package/dist/context/tool-call-context.d.ts.map +1 -0
  21. package/dist/context/tool-call-context.js +2 -0
  22. package/dist/context/tool-call-context.js.map +1 -0
  23. package/dist/direct/express-router.d.ts +35 -0
  24. package/dist/direct/express-router.d.ts.map +1 -0
  25. package/dist/direct/express-router.js +148 -0
  26. package/dist/direct/express-router.js.map +1 -0
  27. package/dist/direct/http-ingress.d.ts +84 -0
  28. package/dist/direct/http-ingress.d.ts.map +1 -0
  29. package/dist/direct/http-ingress.js +124 -0
  30. package/dist/direct/http-ingress.js.map +1 -0
  31. package/dist/index.d.ts +22 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +13 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/protocol/dispatch.d.ts +7 -0
  36. package/dist/protocol/dispatch.d.ts.map +1 -0
  37. package/dist/protocol/dispatch.js +78 -0
  38. package/dist/protocol/dispatch.js.map +1 -0
  39. package/dist/protocol/errors.d.ts +16 -0
  40. package/dist/protocol/errors.d.ts.map +1 -0
  41. package/dist/protocol/errors.js +84 -0
  42. package/dist/protocol/errors.js.map +1 -0
  43. package/dist/protocol/logging.d.ts +16 -0
  44. package/dist/protocol/logging.d.ts.map +1 -0
  45. package/dist/protocol/logging.js +18 -0
  46. package/dist/protocol/logging.js.map +1 -0
  47. package/dist/protocol/types.d.ts +54 -0
  48. package/dist/protocol/types.d.ts.map +1 -0
  49. package/dist/protocol/types.js +7 -0
  50. package/dist/protocol/types.js.map +1 -0
  51. package/dist/relay/message-adapter.d.ts +9 -0
  52. package/dist/relay/message-adapter.d.ts.map +1 -0
  53. package/dist/relay/message-adapter.js +32 -0
  54. package/dist/relay/message-adapter.js.map +1 -0
  55. package/dist/relay/relay-client.d.ts +63 -0
  56. package/dist/relay/relay-client.d.ts.map +1 -0
  57. package/dist/relay/relay-client.js +447 -0
  58. package/dist/relay/relay-client.js.map +1 -0
  59. package/dist/runtime.d.ts +104 -0
  60. package/dist/runtime.d.ts.map +1 -0
  61. package/dist/runtime.js +351 -0
  62. package/dist/runtime.js.map +1 -0
  63. package/package.json +64 -0
@@ -0,0 +1,16 @@
1
+ export interface RedactedLogFields {
2
+ method?: string;
3
+ toolName?: string;
4
+ id?: string | number | null;
5
+ durationMs?: number;
6
+ resultBytes?: number;
7
+ errorCode?: number;
8
+ identityState?: string;
9
+ transport?: string;
10
+ traceId?: string;
11
+ warning?: string;
12
+ }
13
+ /** Safe summary for logs — never include tokens, mail bodies, or secrets. */
14
+ export declare function summarizeForLog(fields: RedactedLogFields): Record<string, unknown>;
15
+ export declare function estimateJsonBytes(value: unknown): number;
16
+ //# sourceMappingURL=logging.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.d.ts","sourceRoot":"","sources":["../../src/protocol/logging.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAMlF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAMxD"}
@@ -0,0 +1,18 @@
1
+ /** Safe summary for logs — never include tokens, mail bodies, or secrets. */
2
+ export function summarizeForLog(fields) {
3
+ const out = {};
4
+ for (const [key, value] of Object.entries(fields)) {
5
+ if (value !== undefined)
6
+ out[key] = value;
7
+ }
8
+ return out;
9
+ }
10
+ export function estimateJsonBytes(value) {
11
+ try {
12
+ return Buffer.byteLength(JSON.stringify(value), 'utf8');
13
+ }
14
+ catch {
15
+ return -1;
16
+ }
17
+ }
18
+ //# sourceMappingURL=logging.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/protocol/logging.ts"],"names":[],"mappings":"AAaA,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,MAAyB;IACxD,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC/C,IAAI,CAAC;QACJ,OAAO,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,CAAC,CAAC,CAAC;IACX,CAAC;AACF,CAAC"}
@@ -0,0 +1,54 @@
1
+ /** JSON-RPC 2.0 id. Explicit `null` is distinct from a missing id property. */
2
+ export type JsonRpcId = string | number | null;
3
+ export interface JsonRpcErrorObject {
4
+ code: number;
5
+ message: string;
6
+ data?: unknown;
7
+ }
8
+ export interface McpRequest {
9
+ jsonrpc: '2.0';
10
+ id: JsonRpcId;
11
+ method: string;
12
+ params?: unknown;
13
+ }
14
+ export interface McpNotification {
15
+ jsonrpc: '2.0';
16
+ method: string;
17
+ params?: unknown;
18
+ }
19
+ export interface McpResultResponse {
20
+ jsonrpc: '2.0';
21
+ id: JsonRpcId;
22
+ result: unknown;
23
+ }
24
+ export interface McpErrorResponse {
25
+ jsonrpc: '2.0';
26
+ id: JsonRpcId;
27
+ error: JsonRpcErrorObject;
28
+ }
29
+ export type McpResponse = McpResultResponse | McpErrorResponse;
30
+ /** Application-facing request — runtime already handled initialize / notifications. */
31
+ export type ApplicationMcpMethod = 'tools/list' | 'tools/call' | 'resources/read' | (string & {});
32
+ export interface ApplicationMcpRequest {
33
+ jsonrpc: '2.0';
34
+ id: JsonRpcId;
35
+ method: ApplicationMcpMethod;
36
+ params?: unknown;
37
+ }
38
+ export type ParsedInbound = {
39
+ kind: 'request';
40
+ message: McpRequest;
41
+ } | {
42
+ kind: 'notification';
43
+ message: McpNotification;
44
+ } | {
45
+ kind: 'response';
46
+ message: Record<string, unknown>;
47
+ } | {
48
+ kind: 'invalid';
49
+ error: JsonRpcErrorObject;
50
+ id: JsonRpcId | undefined;
51
+ };
52
+ export declare function hasOwnId(value: object): boolean;
53
+ export declare function isJsonRpcId(value: unknown): value is JsonRpcId;
54
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,eAAe;IAC/B,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAE/D,uFAAuF;AACvF,MAAM,MAAM,oBAAoB,GAAG,YAAY,GAAG,YAAY,GAAG,gBAAgB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAElG,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,SAAS,CAAC;IACd,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,MAAM,aAAa,GACtB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,GACxC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAC;IAAC,EAAE,EAAE,SAAS,GAAG,SAAS,CAAA;CAAE,CAAC;AAE7E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D"}
@@ -0,0 +1,7 @@
1
+ export function hasOwnId(value) {
2
+ return Object.prototype.hasOwnProperty.call(value, 'id');
3
+ }
4
+ export function isJsonRpcId(value) {
5
+ return value === null || typeof value === 'string' || typeof value === 'number';
6
+ }
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/protocol/types.ts"],"names":[],"mappings":"AAoDA,MAAM,UAAU,QAAQ,CAAC,KAAa;IACrC,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAc;IACzC,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;AACjF,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { RawData } from 'ws';
2
+ export declare class MessageTooLargeError extends Error {
3
+ readonly bytes: number;
4
+ readonly maxBytes: number;
5
+ constructor(bytes: number, maxBytes: number);
6
+ }
7
+ /** Convert ws RawData to UTF-8 text with a hard size limit. */
8
+ export declare function rawDataToText(data: RawData, maxMessageBytes?: number): string;
9
+ //# sourceMappingURL=message-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-adapter.d.ts","sourceRoot":"","sources":["../../src/relay/message-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAIlC,qBAAa,oBAAqB,SAAQ,KAAK;aAClB,KAAK,EAAE,MAAM;aAAkB,QAAQ,EAAE,MAAM;gBAA/C,KAAK,EAAE,MAAM,EAAkB,QAAQ,EAAE,MAAM;CAI3E;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAC5B,IAAI,EAAE,OAAO,EACb,eAAe,SAA4B,GACzC,MAAM,CAgBR"}
@@ -0,0 +1,32 @@
1
+ const DEFAULT_MAX_MESSAGE_BYTES = 8 * 1024 * 1024;
2
+ export class MessageTooLargeError extends Error {
3
+ bytes;
4
+ maxBytes;
5
+ constructor(bytes, maxBytes) {
6
+ super(`WebSocket message exceeds maxMessageBytes (${bytes} > ${maxBytes})`);
7
+ this.bytes = bytes;
8
+ this.maxBytes = maxBytes;
9
+ this.name = 'MessageTooLargeError';
10
+ }
11
+ }
12
+ /** Convert ws RawData to UTF-8 text with a hard size limit. */
13
+ export function rawDataToText(data, maxMessageBytes = DEFAULT_MAX_MESSAGE_BYTES) {
14
+ let buf;
15
+ if (Buffer.isBuffer(data)) {
16
+ buf = data;
17
+ }
18
+ else if (data instanceof ArrayBuffer) {
19
+ buf = Buffer.from(data);
20
+ }
21
+ else if (Array.isArray(data)) {
22
+ buf = Buffer.concat(data);
23
+ }
24
+ else {
25
+ buf = Buffer.from(String(data));
26
+ }
27
+ if (buf.byteLength > maxMessageBytes) {
28
+ throw new MessageTooLargeError(buf.byteLength, maxMessageBytes);
29
+ }
30
+ return buf.toString('utf8');
31
+ }
32
+ //# sourceMappingURL=message-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message-adapter.js","sourceRoot":"","sources":["../../src/relay/message-adapter.ts"],"names":[],"mappings":"AAEA,MAAM,yBAAyB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAElD,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAClB;IAA+B;IAA3D,YAA4B,KAAa,EAAkB,QAAgB;QAC1E,KAAK,CAAC,8CAA8C,KAAK,MAAM,QAAQ,GAAG,CAAC,CAAC;QADjD,UAAK,GAAL,KAAK,CAAQ;QAAkB,aAAQ,GAAR,QAAQ,CAAQ;QAE1E,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACpC,CAAC;CACD;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAC5B,IAAa,EACb,eAAe,GAAG,yBAAyB;IAE3C,IAAI,GAAW,CAAC;IAChB,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3B,GAAG,GAAG,IAAI,CAAC;IACZ,CAAC;SAAM,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QACxC,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;SAAM,CAAC;QACP,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,GAAG,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;QACtC,MAAM,IAAI,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,63 @@
1
+ import WebSocket from 'ws';
2
+ import { type AppDescriptor } from '../app-descriptor.js';
3
+ import type { AuthOptions } from '../auth/user-token.js';
4
+ import { AppServerRuntime, type AppErrorMapper, type AppMcpHandler, type AppServerRuntimeOptions, type CallerCredentialExtractor, type RelayCallerAuthSurface, type RuntimeLimits, type UiResourceProvider } from '../runtime.js';
5
+ export interface PairAppMeta {
6
+ name: string;
7
+ description?: string;
8
+ version?: string;
9
+ icon?: string;
10
+ scopes?: string[];
11
+ }
12
+ export interface PairingResult {
13
+ privosUrl: string;
14
+ clientId: string;
15
+ clientSecret: string;
16
+ mcpAppId?: string;
17
+ }
18
+ export interface RelayClientOptions {
19
+ privosUrl: string;
20
+ clientId: string;
21
+ clientSecret: string;
22
+ descriptor: AppDescriptor | (() => AppDescriptor | Promise<AppDescriptor>);
23
+ handler: AppMcpHandler;
24
+ ui?: UiResourceProvider;
25
+ auth?: AuthOptions;
26
+ mapAppError?: AppErrorMapper;
27
+ limits?: RuntimeLimits;
28
+ logger?: AppServerRuntimeOptions['logger'];
29
+ /**
30
+ * Extract credentials from reserved Relay auth surface only (`_meta` / `meta`).
31
+ * Never receives `params` / `arguments`.
32
+ */
33
+ extractCallerCredential?: CallerCredentialExtractor<RelayCallerAuthSurface>;
34
+ oauthTimeoutMs?: number;
35
+ /** Timeout waiting for WebSocket `open` after create (default 15s). */
36
+ openHandshakeTimeoutMs?: number;
37
+ /** Injected for tests. */
38
+ fetchImpl?: typeof fetch;
39
+ WebSocketImpl?: typeof WebSocket;
40
+ runtime?: AppServerRuntime;
41
+ }
42
+ export interface RelayHandle {
43
+ /** Stop reconnecting and close the active socket. */
44
+ stop(): Promise<void>;
45
+ /** Resolves when the first successful connection opens (or rejects if stopped first). */
46
+ whenConnected(): Promise<void>;
47
+ }
48
+ /**
49
+ * Pair with Privos using a one-time pairing URL.
50
+ * Does not persist credentials — caller is responsible for saving them.
51
+ */
52
+ export declare function pairOverWebSocket(pairUrl: string, appMeta: PairAppMeta, WebSocketImpl?: typeof WebSocket, options?: {
53
+ timeoutMs?: number;
54
+ }): Promise<PairingResult>;
55
+ export declare function pairFromDescriptor(pairUrl: string, descriptor: AppDescriptor, WebSocketImpl?: typeof WebSocket, options?: {
56
+ timeoutMs?: number;
57
+ }): Promise<PairingResult>;
58
+ /**
59
+ * Connect to PrivOS relay WebSocket with exponential backoff, token refresh,
60
+ * single reconnect timer, and explicit stop().
61
+ */
62
+ export declare function connectRelay(opts: RelayClientOptions): RelayHandle;
63
+ //# sourceMappingURL=relay-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relay-client.d.ts","sourceRoot":"","sources":["../../src/relay/relay-client.ts"],"names":[],"mappings":"AAAA,OAAO,SAA2B,MAAM,IAAI,CAAC;AAE7C,OAAO,EAEN,KAAK,aAAa,EAClB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMzD,OAAO,EACN,gBAAgB,EAIhB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,uBAAuB,EAC5B,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAC3B,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,MAAM,eAAe,CAAC;AAGvB,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,aAAa;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAOD,MAAM,WAAW,kBAAkB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,aAAa,GAAG,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IAC3E,OAAO,EAAE,aAAa,CAAC;IACvB,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACxB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,WAAW,CAAC,EAAE,cAAc,CAAC;IAC7B,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,MAAM,CAAC,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAC3C;;;OAGG;IACH,uBAAuB,CAAC,EAAE,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uEAAuE;IACvE,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,0BAA0B;IAC1B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,SAAS,CAAC;IACjC,OAAO,CAAC,EAAE,gBAAgB,CAAC;CAC3B;AAED,MAAM,WAAW,WAAW;IAC3B,qDAAqD;IACrD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,yFAAyF;IACzF,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,WAAW,EACpB,aAAa,GAAE,OAAO,SAAqB,EAC3C,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,OAAO,CAAC,aAAa,CAAC,CA+GxB;AAED,wBAAsB,kBAAkB,CACvC,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,aAAa,EACzB,aAAa,CAAC,EAAE,OAAO,SAAS,EAChC,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9B,OAAO,CAAC,aAAa,CAAC,CAOxB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,WAAW,CA0WlE"}