gateproof 0.2.2 → 0.5.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 (98) hide show
  1. package/README.md +1396 -320
  2. package/dist/cloudflare/index.d.ts +4 -6
  3. package/dist/cloudflare/index.d.ts.map +1 -1
  4. package/dist/cloudflare/index.js +9 -43
  5. package/dist/cloudflare/index.js.map +1 -1
  6. package/dist/index.d.ts +263 -66
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1327 -204
  9. package/dist/index.js.map +1 -1
  10. package/package.json +18 -40
  11. package/dist/act.d.ts +0 -33
  12. package/dist/act.d.ts.map +0 -1
  13. package/dist/act.js +0 -25
  14. package/dist/act.js.map +0 -1
  15. package/dist/action-executors.d.ts +0 -22
  16. package/dist/action-executors.d.ts.map +0 -1
  17. package/dist/action-executors.js +0 -135
  18. package/dist/action-executors.js.map +0 -1
  19. package/dist/assert.d.ts +0 -39
  20. package/dist/assert.d.ts.map +0 -1
  21. package/dist/assert.js +0 -88
  22. package/dist/assert.js.map +0 -1
  23. package/dist/cli/gateproof.d.ts +0 -3
  24. package/dist/cli/gateproof.d.ts.map +0 -1
  25. package/dist/cli/gateproof.js +0 -472
  26. package/dist/cli/gateproof.js.map +0 -1
  27. package/dist/cloudflare/analytics.d.ts +0 -9
  28. package/dist/cloudflare/analytics.d.ts.map +0 -1
  29. package/dist/cloudflare/analytics.js +0 -98
  30. package/dist/cloudflare/analytics.js.map +0 -1
  31. package/dist/cloudflare/cli-stream.d.ts +0 -7
  32. package/dist/cloudflare/cli-stream.d.ts.map +0 -1
  33. package/dist/cloudflare/cli-stream.js +0 -85
  34. package/dist/cloudflare/cli-stream.js.map +0 -1
  35. package/dist/cloudflare/polling-backend.d.ts +0 -18
  36. package/dist/cloudflare/polling-backend.d.ts.map +0 -1
  37. package/dist/cloudflare/polling-backend.js +0 -53
  38. package/dist/cloudflare/polling-backend.js.map +0 -1
  39. package/dist/cloudflare/workers-logs.d.ts +0 -9
  40. package/dist/cloudflare/workers-logs.d.ts.map +0 -1
  41. package/dist/cloudflare/workers-logs.js +0 -51
  42. package/dist/cloudflare/workers-logs.js.map +0 -1
  43. package/dist/constants.d.ts +0 -11
  44. package/dist/constants.d.ts.map +0 -1
  45. package/dist/constants.js +0 -11
  46. package/dist/constants.js.map +0 -1
  47. package/dist/http-backend.d.ts +0 -23
  48. package/dist/http-backend.d.ts.map +0 -1
  49. package/dist/http-backend.js +0 -124
  50. package/dist/http-backend.js.map +0 -1
  51. package/dist/observe.d.ts +0 -26
  52. package/dist/observe.d.ts.map +0 -1
  53. package/dist/observe.js +0 -84
  54. package/dist/observe.js.map +0 -1
  55. package/dist/prd/define-prd.d.ts +0 -7
  56. package/dist/prd/define-prd.d.ts.map +0 -1
  57. package/dist/prd/define-prd.js +0 -8
  58. package/dist/prd/define-prd.js.map +0 -1
  59. package/dist/prd/index.d.ts +0 -5
  60. package/dist/prd/index.d.ts.map +0 -1
  61. package/dist/prd/index.js +0 -4
  62. package/dist/prd/index.js.map +0 -1
  63. package/dist/prd/runner.d.ts +0 -22
  64. package/dist/prd/runner.d.ts.map +0 -1
  65. package/dist/prd/runner.js +0 -221
  66. package/dist/prd/runner.js.map +0 -1
  67. package/dist/prd/scope-check.d.ts +0 -28
  68. package/dist/prd/scope-check.d.ts.map +0 -1
  69. package/dist/prd/scope-check.js +0 -135
  70. package/dist/prd/scope-check.js.map +0 -1
  71. package/dist/prd/types.d.ts +0 -22
  72. package/dist/prd/types.d.ts.map +0 -1
  73. package/dist/prd/types.js +0 -2
  74. package/dist/prd/types.js.map +0 -1
  75. package/dist/provider.d.ts +0 -6
  76. package/dist/provider.d.ts.map +0 -1
  77. package/dist/provider.js +0 -2
  78. package/dist/provider.js.map +0 -1
  79. package/dist/report.d.ts +0 -67
  80. package/dist/report.d.ts.map +0 -1
  81. package/dist/report.js +0 -51
  82. package/dist/report.js.map +0 -1
  83. package/dist/test-helpers.d.ts +0 -12
  84. package/dist/test-helpers.d.ts.map +0 -1
  85. package/dist/test-helpers.js +0 -33
  86. package/dist/test-helpers.js.map +0 -1
  87. package/dist/types.d.ts +0 -41
  88. package/dist/types.d.ts.map +0 -1
  89. package/dist/types.js +0 -2
  90. package/dist/types.js.map +0 -1
  91. package/dist/utils.d.ts +0 -22
  92. package/dist/utils.d.ts.map +0 -1
  93. package/dist/utils.js +0 -49
  94. package/dist/utils.js.map +0 -1
  95. package/dist/validation.d.ts +0 -6
  96. package/dist/validation.d.ts.map +0 -1
  97. package/dist/validation.js +0 -38
  98. package/dist/validation.js.map +0 -1
@@ -1,33 +0,0 @@
1
- /**
2
- * Test utilities for gateproof
3
- * Shared helpers used across test files
4
- */
5
- import { Effect, Queue, Runtime } from "effect";
6
- import { createObserveResource } from "./observe";
7
- /**
8
- * Creates a test observe resource from a queue
9
- * Used in test files to simulate log streams
10
- */
11
- export function createTestObserveResource(queue) {
12
- const backend = {
13
- start: () => Effect.succeed({
14
- async *[Symbol.asyncIterator]() {
15
- const runtime = Runtime.defaultRuntime;
16
- while (true) {
17
- try {
18
- const log = await Runtime.runPromise(runtime)(Queue.take(queue).pipe(Effect.timeout("100 millis"), Effect.catchAll(() => Effect.succeed(null))));
19
- if (log === null)
20
- break;
21
- yield log;
22
- }
23
- catch {
24
- break;
25
- }
26
- }
27
- }
28
- }),
29
- stop: () => Effect.void
30
- };
31
- return createObserveResource(backend);
32
- }
33
- //# sourceMappingURL=test-helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../src/test-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEhD,OAAO,EAAE,qBAAqB,EAAgB,MAAM,WAAW,CAAC;AAEhE;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAuB;IAC/D,MAAM,OAAO,GAAY;QACvB,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAqB;YAC9C,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC3B,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;gBACvC,OAAO,IAAI,EAAE,CAAC;oBACZ,IAAI,CAAC;wBACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CACpB,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAkB,CAAC,CAAC,CAC1D,CACF,CAAC;wBACF,IAAI,GAAG,KAAK,IAAI;4BAAE,MAAM;wBACxB,MAAM,GAAG,CAAC;oBACZ,CAAC;oBAAC,MAAM,CAAC;wBACP,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;SACF,CAAC;QACF,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;KACxB,CAAC;IACF,OAAO,qBAAqB,CAAC,OAAO,CAAC,CAAC;AACxC,CAAC"}
package/dist/types.d.ts DELETED
@@ -1,41 +0,0 @@
1
- export interface Log {
2
- requestId?: string;
3
- timestamp?: string;
4
- stage?: string;
5
- action?: string;
6
- status?: "start" | "success" | "error" | "info";
7
- error?: {
8
- tag: string;
9
- message: string;
10
- stack?: string;
11
- };
12
- data?: Record<string, unknown>;
13
- durationMs?: number;
14
- [k: string]: unknown;
15
- }
16
- export interface LogFilter {
17
- requestId?: string;
18
- stage?: string;
19
- action?: string;
20
- status?: "start" | "success" | "error" | "info";
21
- since?: Date;
22
- until?: Date;
23
- }
24
- export type LogStream = AsyncIterable<Log>;
25
- export interface GateResult {
26
- status: "success" | "failed" | "timeout";
27
- durationMs: number;
28
- logs: Log[];
29
- evidence: {
30
- requestIds: string[];
31
- stagesSeen: string[];
32
- actionsSeen: string[];
33
- errorTags: string[];
34
- };
35
- error?: Error;
36
- }
37
- export interface ObserveConfig {
38
- backend: string;
39
- [k: string]: unknown;
40
- }
41
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAChD,KAAK,CAAC,EAAE;QACN,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC;IAChD,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;CACd;AAED,MAAM,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;AAE3C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,QAAQ,EAAE;QACR,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,UAAU,EAAE,MAAM,EAAE,CAAC;QACrB,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB"}
package/dist/types.js DELETED
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=types.js.map
package/dist/types.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/dist/utils.d.ts DELETED
@@ -1,22 +0,0 @@
1
- /**
2
- * Shared utilities for gateproof gates
3
- * These utilities reduce boilerplate and standardize common patterns
4
- */
5
- import { type GateSpec, type GateResult } from "./index";
6
- import { type Backend } from "./observe";
7
- /**
8
- * Creates an empty backend that yields no logs
9
- * Useful for gates that validate HTTP endpoints without log observation
10
- */
11
- export declare function createEmptyBackend(): Backend;
12
- /**
13
- * Creates an observe resource from an empty backend
14
- * Convenience wrapper for the common pattern
15
- */
16
- export declare function createEmptyObserveResource(): import("./observe").ObserveResource;
17
- /**
18
- * Runs a gate with standardized error handling
19
- * Returns a result object with consistent structure even on errors
20
- */
21
- export declare function runGateWithErrorHandling(gate: GateSpec, name: string): Promise<GateResult>;
22
- //# sourceMappingURL=utils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAQ,KAAK,QAAQ,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAyB,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAGhE;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAU5C;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,wCAEzC;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,QAAQ,EACd,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,UAAU,CAAC,CAcrB"}
package/dist/utils.js DELETED
@@ -1,49 +0,0 @@
1
- /**
2
- * Shared utilities for gateproof gates
3
- * These utilities reduce boilerplate and standardize common patterns
4
- */
5
- import { Effect } from "effect";
6
- import { Gate } from "./index";
7
- import { createObserveResource } from "./observe";
8
- /**
9
- * Creates an empty backend that yields no logs
10
- * Useful for gates that validate HTTP endpoints without log observation
11
- */
12
- export function createEmptyBackend() {
13
- return {
14
- start: () => Effect.succeed({
15
- async *[Symbol.asyncIterator]() {
16
- return;
17
- },
18
- }),
19
- stop: () => Effect.void,
20
- };
21
- }
22
- /**
23
- * Creates an observe resource from an empty backend
24
- * Convenience wrapper for the common pattern
25
- */
26
- export function createEmptyObserveResource() {
27
- return createObserveResource(createEmptyBackend());
28
- }
29
- /**
30
- * Runs a gate with standardized error handling
31
- * Returns a result object with consistent structure even on errors
32
- */
33
- export async function runGateWithErrorHandling(gate, name) {
34
- try {
35
- return await Gate.run(gate);
36
- }
37
- catch (unknownError) {
38
- const error = unknownError instanceof Error ? unknownError : new Error(String(unknownError));
39
- console.error(` ❌ Error: ${error.message}`);
40
- return {
41
- status: "failed",
42
- durationMs: 0,
43
- logs: [],
44
- evidence: { actionsSeen: [], errorTags: [], requestIds: [], stagesSeen: [] },
45
- error: error instanceof Error ? error : new Error(String(error)),
46
- };
47
- }
48
- }
49
- //# sourceMappingURL=utils.js.map
package/dist/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,IAAI,EAAkC,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,qBAAqB,EAAgB,MAAM,WAAW,CAAC;AAGhE;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CACV,MAAM,CAAC,OAAO,CAAqB;YACnC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;gBAC3B,OAAO;YACT,CAAC;SACF,CAAC;QACF,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;KACxB,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B;IACxC,OAAO,qBAAqB,CAAC,kBAAkB,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAc,EACd,IAAY;IAEZ,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,YAAY,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,YAAY,YAAY,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAC,KAAK,CAAC,eAAe,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,QAAiB;YACzB,UAAU,EAAE,CAAC;YACb,IAAI,EAAE,EAAE;YACR,QAAQ,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE;YAC5E,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SACjE,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -1,6 +0,0 @@
1
- import { Effect } from "effect";
2
- import { GateError } from "./index";
3
- export declare function validateWorkerName(name: string): Effect.Effect<string, GateError>;
4
- export declare function validateUrl(url: string): Effect.Effect<string, GateError>;
5
- export declare function validateCommand(command: string): Effect.Effect<string, GateError>;
6
- //# sourceMappingURL=validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAQjF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAUzE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAgBjF"}
@@ -1,38 +0,0 @@
1
- import { Effect } from "effect";
2
- import { GateError } from "./index";
3
- export function validateWorkerName(name) {
4
- if (!name || typeof name !== "string") {
5
- return Effect.fail(new GateError({ cause: new Error("Worker name must be a non-empty string") }));
6
- }
7
- if (!/^[a-z0-9_-]+$/i.test(name)) {
8
- return Effect.fail(new GateError({ cause: new Error("Worker name contains invalid characters") }));
9
- }
10
- return Effect.succeed(name);
11
- }
12
- export function validateUrl(url) {
13
- try {
14
- const parsed = new URL(url);
15
- if (!["http:", "https:"].includes(parsed.protocol)) {
16
- return Effect.fail(new GateError({ cause: new Error("URL must use http or https protocol") }));
17
- }
18
- return Effect.succeed(url);
19
- }
20
- catch {
21
- return Effect.fail(new GateError({ cause: new Error("Invalid URL format") }));
22
- }
23
- }
24
- export function validateCommand(command) {
25
- if (!command || typeof command !== "string") {
26
- return Effect.fail(new GateError({ cause: new Error("Command must be a non-empty string") }));
27
- }
28
- // Extremely strict shell safety: block common shell metacharacters and expansion patterns
29
- const dangerous = /[;&|`$(){}[\]<>\\'"\n\r\t]/;
30
- const envExpansion = /\$\w+|\$\{[^}]+\}/;
31
- if (dangerous.test(command) || envExpansion.test(command)) {
32
- return Effect.fail(new GateError({
33
- cause: new Error("Command contains potentially dangerous shell characters")
34
- }));
35
- }
36
- return Effect.succeed(command);
37
- }
38
- //# sourceMappingURL=validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,wCAAwC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,yCAAyC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrG,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,qCAAqC,CAAC,EAAE,CAAC,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,oCAAoC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChG,CAAC;IACD,0FAA0F;IAC1F,MAAM,SAAS,GACb,4BAA4B,CAAC;IAC/B,MAAM,YAAY,GAAG,mBAAmB,CAAC;IACzC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,OAAO,MAAM,CAAC,IAAI,CAChB,IAAI,SAAS,CAAC;YACZ,KAAK,EAAE,IAAI,KAAK,CAAC,yDAAyD,CAAC;SAC5E,CAAC,CACH,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}