eddev 2.3.31 → 2.4.0-beta.2

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 (106) hide show
  1. package/dist/app/entry/ssr-root-client.d.ts +0 -2
  2. package/dist/app/entry/ssr-root-client.d.ts.map +1 -1
  3. package/dist/app/lib/blocks/block-debugger.d.ts.map +1 -1
  4. package/dist/app/lib/blocks/block-debugger.js +19 -2
  5. package/dist/app/lib/devtools/components/panels/StructurePanel.js +1 -1
  6. package/dist/app/server/assets.d.ts +45 -0
  7. package/dist/app/server/assets.d.ts.map +1 -0
  8. package/dist/app/server/assets.js +15 -0
  9. package/dist/app/server/index.d.ts +4 -0
  10. package/dist/app/server/index.d.ts.map +1 -1
  11. package/dist/app/server/index.js +3 -0
  12. package/dist/app/server/proxy-wp-admin.d.ts +6 -2
  13. package/dist/app/server/proxy-wp-admin.d.ts.map +1 -1
  14. package/dist/app/server/proxy-wp-admin.js +29 -57
  15. package/dist/app/server/render-ssr-page.d.ts +2 -6
  16. package/dist/app/server/render-ssr-page.d.ts.map +1 -1
  17. package/dist/app/server/render-ssr-page.js +9 -8
  18. package/dist/app/server/rpc-handler.d.ts +14 -0
  19. package/dist/app/server/rpc-handler.d.ts.map +1 -0
  20. package/dist/app/server/rpc-handler.js +63 -0
  21. package/dist/app/server/server-app.d.ts +22 -0
  22. package/dist/app/server/server-app.d.ts.map +1 -0
  23. package/dist/app/server/server-app.js +186 -0
  24. package/dist/app/server/server-context.d.ts +5 -5
  25. package/dist/app/server/server-context.d.ts.map +1 -1
  26. package/dist/app/server/server-context.js +21 -13
  27. package/dist/app/server/utils/fetch-origin.d.ts +13 -0
  28. package/dist/app/server/utils/fetch-origin.d.ts.map +1 -0
  29. package/dist/app/server/utils/fetch-origin.js +21 -0
  30. package/dist/app/server/utils/request.d.ts +20 -0
  31. package/dist/app/server/utils/request.d.ts.map +1 -0
  32. package/dist/app/server/utils/request.js +60 -0
  33. package/dist/node/cli/cli-worker.d.ts +10 -6
  34. package/dist/node/cli/cli-worker.d.ts.map +1 -1
  35. package/dist/node/cli/cli-worker.js +7 -14
  36. package/dist/node/cli/cli.js +37 -43
  37. package/dist/node/cli/display/CLIApp.d.ts +2 -4
  38. package/dist/node/cli/display/CLIApp.d.ts.map +1 -1
  39. package/dist/node/cli/display/CLIApp.js +2 -3
  40. package/dist/node/cli/version.d.ts +1 -1
  41. package/dist/node/cli/version.d.ts.map +1 -1
  42. package/dist/node/cli/version.js +1 -1
  43. package/dist/node/compiler/app-codegen.d.ts +18 -0
  44. package/dist/node/compiler/app-codegen.d.ts.map +1 -0
  45. package/dist/node/compiler/app-codegen.js +473 -0
  46. package/dist/node/compiler/build-serverless.d.ts +16 -0
  47. package/dist/node/compiler/build-serverless.d.ts.map +1 -0
  48. package/dist/node/compiler/build-serverless.js +40 -0
  49. package/dist/node/compiler/bundler.spa.d.ts +33 -0
  50. package/dist/node/compiler/bundler.spa.d.ts.map +1 -0
  51. package/dist/node/compiler/bundler.spa.js +59 -0
  52. package/dist/node/compiler/dev-css-links.d.ts +25 -0
  53. package/dist/node/compiler/dev-css-links.d.ts.map +1 -0
  54. package/dist/node/compiler/dev-css-links.js +87 -0
  55. package/dist/node/compiler/dev-server.d.ts +2 -0
  56. package/dist/node/compiler/dev-server.d.ts.map +1 -1
  57. package/dist/node/compiler/dev-server.js +43 -75
  58. package/dist/node/compiler/get-vite-config.d.ts +37 -6
  59. package/dist/node/compiler/get-vite-config.d.ts.map +1 -1
  60. package/dist/node/compiler/get-vite-config.js +113 -121
  61. package/dist/node/compiler/serverless-app.d.ts +35 -0
  62. package/dist/node/compiler/serverless-app.d.ts.map +1 -0
  63. package/dist/node/compiler/serverless-app.js +332 -0
  64. package/dist/node/compiler/transforms/block-meta.d.ts +10 -0
  65. package/dist/node/compiler/transforms/block-meta.d.ts.map +1 -0
  66. package/dist/node/compiler/transforms/block-meta.js +27 -0
  67. package/dist/node/compiler/transforms/component-names.d.ts +19 -0
  68. package/dist/node/compiler/transforms/component-names.d.ts.map +1 -0
  69. package/dist/node/compiler/transforms/component-names.js +45 -0
  70. package/dist/node/compiler/transforms/index.d.ts +36 -0
  71. package/dist/node/compiler/transforms/index.d.ts.map +1 -0
  72. package/dist/node/compiler/transforms/index.js +80 -0
  73. package/dist/node/compiler/transforms/types.d.ts +48 -0
  74. package/dist/node/compiler/transforms/types.d.ts.map +1 -0
  75. package/dist/node/compiler/transforms/types.js +1 -0
  76. package/dist/node/project/config.d.ts +1 -1
  77. package/dist/node/project/config.d.ts.map +1 -1
  78. package/dist/node/project/config.js +1 -1
  79. package/dist/node/project/env.js +1 -1
  80. package/dist/node/project/project-log.d.ts +7 -0
  81. package/dist/node/project/project-log.d.ts.map +1 -0
  82. package/dist/node/project/project-log.js +6 -0
  83. package/dist/node/project/project.d.ts +2 -2
  84. package/dist/node/project/project.d.ts.map +1 -1
  85. package/dist/node/project/project.js +3 -3
  86. package/dist/node/utils/fs.d.ts +70 -69
  87. package/dist/node/utils/fs.d.ts.map +1 -1
  88. package/package.json +12 -13
  89. package/skills/eddev/docs/devtool/cli.mdx +10 -8
  90. package/tsconfig.node.json +17 -5
  91. package/types.env.d.ts +1 -1
  92. package/dist/node/compiler/build-vinxi.d.ts +0 -9
  93. package/dist/node/compiler/build-vinxi.d.ts.map +0 -1
  94. package/dist/node/compiler/build-vinxi.js +0 -39
  95. package/dist/node/compiler/bundler.admin.d.ts +0 -14
  96. package/dist/node/compiler/bundler.admin.d.ts.map +0 -1
  97. package/dist/node/compiler/bundler.admin.js +0 -37
  98. package/dist/node/compiler/bundler.frontend.d.ts +0 -15
  99. package/dist/node/compiler/bundler.frontend.d.ts.map +0 -1
  100. package/dist/node/compiler/bundler.frontend.js +0 -51
  101. package/dist/node/compiler/vinxi-app.d.ts +0 -23
  102. package/dist/node/compiler/vinxi-app.d.ts.map +0 -1
  103. package/dist/node/compiler/vinxi-app.js +0 -261
  104. package/dist/node/compiler/vinxi-codegen.d.ts +0 -13
  105. package/dist/node/compiler/vinxi-codegen.d.ts.map +0 -1
  106. package/dist/node/compiler/vinxi-codegen.js +0 -764
@@ -2,10 +2,9 @@ import chalk from "chalk";
2
2
  import { Command } from "commander";
3
3
  import { setDefaultResultOrder } from "dns";
4
4
  import { config as importDotEnv } from "dotenv";
5
- import { AdminBundler, adminLog } from "../compiler/bundler.admin.js";
6
- import { FrontendBundler, frontendLog } from "../compiler/bundler.frontend.js";
5
+ import { SPABundler, spaLog } from "../compiler/bundler.spa.js";
7
6
  import { DevServer, serverlessLog } from "../compiler/dev-server.js";
8
- import { createVinxiCodegen } from "../compiler/vinxi-codegen.js";
7
+ import { createAppCodegen } from "../compiler/app-codegen.js";
9
8
  import { GraphQLGenerator, graphqlLog } from "../graphql/graphql-codegen.js";
10
9
  import { BuildInfoWriter } from "../project/eddev-build-file.js";
11
10
  import { Project, projectLog } from "../project/project.js";
@@ -15,14 +14,14 @@ import { configureCliMode } from "./cli-mode.js";
15
14
  import { CLIWorker } from "./cli-worker.js";
16
15
  import { bootCLIUI } from "./display/boot-cli-app.js";
17
16
  import { VERSION } from "./version.js";
18
- import { buildVinxi } from "../compiler/build-vinxi.js";
17
+ import { buildServerless } from "../compiler/build-serverless.js";
19
18
  import { createConsole } from "../utils/stateful-log.js";
20
19
  import { join, relative } from "path";
21
20
  import { ensureSelfSignedCert } from "../utils/self-signed-cert.js";
22
21
  import { parseURL } from "ufo";
23
22
  import { corePlugins } from "../compiler/get-vite-config.js";
24
23
  import { build } from "vite";
25
- import rollupVisualizer from "rollup-plugin-visualizer";
24
+ import { visualizer } from "rollup-plugin-visualizer";
26
25
  import { execa } from "execa";
27
26
  importDotEnv();
28
27
  const program = new Command()
@@ -42,7 +41,7 @@ program.command("create-favicons").action(async () => {
42
41
  program
43
42
  .command("dev")
44
43
  .description("Run in dev mode")
45
- .option("-m, --mode <mode>", "Comma separated list of modes, or a single mode.", "frontend,admin,graphql,serverless")
44
+ .option("-m, --mode <mode>", 'Comma separated list of modes: "spa", "graphql", "serverless". "frontend" and "admin" build just one of the SPA bundles.', "spa,graphql,serverless")
46
45
  .option("--fast", "Shorthand for --mode graphql,serverless", false)
47
46
  .option("--https <enabled>", "Use HTTPS for the dev server", (val) => val === "true" || val === "1", true)
48
47
  .option("--verbose", "Show extra debugging info", false)
@@ -70,11 +69,18 @@ program
70
69
  if (options.fast) {
71
70
  options.mode = "graphql,serverless";
72
71
  }
72
+ const modes = new Set(String(options.mode || "spa,graphql,serverless")
73
+ .split(",")
74
+ .map((mode) => mode.trim()));
75
+ const spaTargets = [];
76
+ if (modes.has("spa") || modes.has("frontend"))
77
+ spaTargets.push("frontend");
78
+ if (modes.has("spa") || modes.has("admin"))
79
+ spaTargets.push("cms");
73
80
  const tasks = {
74
- admin: !options.mode || options.mode.includes("admin"),
75
- frontend: !options.mode || options.mode.includes("frontend"),
76
- serverless: !options.mode || options.mode.includes("serverless"),
77
- graphql: !options.mode || options.mode.includes("graphql"),
81
+ spa: spaTargets.length > 0,
82
+ serverless: modes.has("serverless"),
83
+ graphql: modes.has("graphql"),
78
84
  };
79
85
  // https://github.com/node-fetch/node-fetch/issues/1624#issuecomment-1407717012
80
86
  setDefaultResultOrder("ipv4first");
@@ -91,8 +97,7 @@ program
91
97
  getProject: () => project,
92
98
  logs: {
93
99
  project: projectLog,
94
- adminBundle: tasks.admin ? adminLog : undefined,
95
- frontendBundle: tasks.frontend ? frontendLog : undefined,
100
+ spa: tasks.spa ? spaLog : undefined,
96
101
  serverless: tasks.serverless ? serverlessLog : undefined,
97
102
  graphql: tasks.graphql ? graphqlLog : undefined,
98
103
  },
@@ -119,8 +124,8 @@ program
119
124
  const infoWriter = new BuildInfoWriter(project);
120
125
  infoWriter.watch();
121
126
  infoWriter.write();
122
- if (tasks.admin || tasks.frontend) {
123
- const spaStaging = createVinxiCodegen({
127
+ if (tasks.spa) {
128
+ const spaStaging = createAppCodegen({
124
129
  mode: "development",
125
130
  project,
126
131
  serverless: false,
@@ -128,20 +133,13 @@ program
128
133
  });
129
134
  await spaStaging.runAndWatch();
130
135
  }
131
- // Boot up admin in a worker
132
- if (tasks.admin) {
136
+ // Boot up the SPA client (frontend + admin bundles) in a worker
137
+ if (tasks.spa) {
133
138
  new CLIWorker({
134
- log: adminLog,
135
- mode: "admin",
136
- verbose: options.verbose,
137
- });
138
- }
139
- // Boot up frontend in a worker
140
- if (tasks.frontend) {
141
- new CLIWorker({
142
- log: frontendLog,
143
- mode: "frontend",
139
+ log: spaLog,
140
+ mode: "spa",
144
141
  verbose: options.verbose,
142
+ spaTargets,
145
143
  });
146
144
  }
147
145
  // Load the compiler
@@ -171,7 +169,7 @@ program
171
169
  console.info = (...args) => {
172
170
  serverlessLog.info(...args);
173
171
  };
174
- const serverlessStaging = createVinxiCodegen({
172
+ const serverlessStaging = createAppCodegen({
175
173
  mode: "development",
176
174
  project,
177
175
  serverless: true,
@@ -215,8 +213,8 @@ program
215
213
  const project = await Project.create({
216
214
  rootDir: process.cwd(),
217
215
  });
218
- const buildServerless = options.serverless || process.env.VERCEL;
219
- if (buildServerless) {
216
+ const shouldBuildServerless = options.serverless || process.env.VERCEL;
217
+ if (shouldBuildServerless) {
220
218
  // Verify that the we have access to the origin
221
219
  const result = await project.verifyOriginAccess();
222
220
  if (!result.success) {
@@ -224,15 +222,16 @@ program
224
222
  process.exit(1);
225
223
  return;
226
224
  }
227
- await buildVinxi({
225
+ await buildServerless({
228
226
  project,
229
227
  console,
230
228
  });
229
+ console.log("Done building serverless app");
231
230
  }
232
231
  else {
233
232
  const infoWriter = new BuildInfoWriter(project);
234
233
  // Generate bootstrap files
235
- const codegen = createVinxiCodegen({
234
+ const codegen = createAppCodegen({
236
235
  mode: "production",
237
236
  project: project,
238
237
  serverless: false,
@@ -240,16 +239,13 @@ program
240
239
  await codegen.run();
241
240
  console.info("Building for SPA WordPress (Frontend and Admin)");
242
241
  // Load the compiler
243
- const admin = new AdminBundler(project, {
244
- mode: "production",
245
- });
246
- const frontend = new FrontendBundler(project, {
242
+ const spa = new SPABundler(project, {
247
243
  mode: "production",
248
244
  });
249
245
  const graphql = new GraphQLGenerator(project, {
250
246
  optimize: true,
251
247
  });
252
- await Promise.all([infoWriter.write(), admin.start(), frontend.start(), graphql.start()]);
248
+ await Promise.all([infoWriter.write(), spa.start(), graphql.start()]);
253
249
  console.log("Done building SPA WordPress");
254
250
  }
255
251
  });
@@ -276,15 +272,13 @@ program
276
272
  rootDir: process.cwd(),
277
273
  });
278
274
  // Generate bootstrap files
279
- const codegen = createVinxiCodegen({
275
+ const codegen = createAppCodegen({
280
276
  mode: "production",
281
277
  project: project,
282
278
  serverless: false,
283
279
  });
284
280
  await codegen.run();
285
281
  const outDir = relative(project.rootDir, "./dist/frontend-analysis/");
286
- // @ts-ignore
287
- const visualizer = rollupVisualizer.default;
288
282
  await build({
289
283
  plugins: [
290
284
  ...corePlugins({
@@ -309,7 +303,7 @@ program
309
303
  modulePreload: false,
310
304
  outDir: outDir,
311
305
  lib: undefined,
312
- rollupOptions: {
306
+ rolldownOptions: {
313
307
  input: "./.eddev/prod/entry.client.tsx",
314
308
  },
315
309
  },
@@ -319,7 +313,7 @@ program
319
313
  });
320
314
  program
321
315
  .command("preview")
322
- .description("Run a local production build, which was previously built with `eddev build --serverless`")
316
+ .description("Run a local production build, which was previously built with `TARGET=node-server eddev build --serverless`")
323
317
  .option("--host", "Hostname to serve the application", "")
324
318
  .option("--port <port>", "Port to serve the application", "8080")
325
319
  .action(async (options) => {
@@ -348,9 +342,9 @@ program
348
342
  watch: false,
349
343
  rootDir: process.cwd(),
350
344
  });
351
- const entry = ".output/server/index.mjs";
345
+ const entry = ".eddev/output/server/index.mjs";
352
346
  console.info("Looking for production serverless build in: " + entry + "...");
353
- await import(join(process.cwd(), ".output/server/index.mjs"));
347
+ await import(join(process.cwd(), entry));
354
348
  console.log("Visit " + chalk.cyan(`https://${process.env.HOST}:${process.env.PORT}`) + " to see your app.");
355
349
  });
356
350
  program
@@ -1,16 +1,14 @@
1
1
  import type { graphqlLog } from "../../graphql/graphql-codegen.js";
2
2
  import type { Project, projectLog } from "../../project/project.js";
3
- import type { adminLog } from "../../compiler/bundler.admin.js";
4
- import type { frontendLog } from "../../compiler/bundler.frontend.js";
3
+ import type { spaLog } from "../../compiler/bundler.spa.js";
5
4
  import { serverlessLog } from "../../compiler/dev-server.js";
6
5
  export type CLIDisplayProps = {
7
6
  getProject: () => Project;
8
7
  logs: {
9
8
  project?: typeof projectLog;
10
9
  graphql?: typeof graphqlLog;
11
- frontendBundle?: typeof frontendLog;
10
+ spa?: typeof spaLog;
12
11
  serverless?: typeof serverlessLog;
13
- adminBundle?: typeof adminLog;
14
12
  };
15
13
  };
16
14
  export declare function CLIApp(props: CLIDisplayProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"CLIApp.d.ts","sourceRoot":"","sources":["../../../../src/node/cli/display/CLIApp.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAQ5D,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAA;IACzB,IAAI,EAAE;QACJ,OAAO,CAAC,EAAE,OAAO,UAAU,CAAA;QAC3B,OAAO,CAAC,EAAE,OAAO,UAAU,CAAA;QAC3B,cAAc,CAAC,EAAE,OAAO,WAAW,CAAA;QACnC,UAAU,CAAC,EAAE,OAAO,aAAa,CAAA;QACjC,WAAW,CAAC,EAAE,OAAO,QAAQ,CAAA;KAC9B,CAAA;CACF,CAAA;AAOD,wBAAgB,MAAM,CAAC,KAAK,EAAE,eAAe,+BAmG5C"}
1
+ {"version":3,"file":"CLIApp.d.ts","sourceRoot":"","sources":["../../../../src/node/cli/display/CLIApp.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAQ5D,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAA;IACzB,IAAI,EAAE;QACJ,OAAO,CAAC,EAAE,OAAO,UAAU,CAAA;QAC3B,OAAO,CAAC,EAAE,OAAO,UAAU,CAAA;QAC3B,GAAG,CAAC,EAAE,OAAO,MAAM,CAAA;QACnB,UAAU,CAAC,EAAE,OAAO,aAAa,CAAA;KAClC,CAAA;CACF,CAAA;AAOD,wBAAgB,MAAM,CAAC,KAAK,EAAE,eAAe,+BAkG5C"}
@@ -47,11 +47,10 @@ export function CLIApp(props) {
47
47
  const logs = useStatefulLogs({
48
48
  projectLog: props.logs.project,
49
49
  graphqlLog: props.logs.graphql,
50
- frontendLog: props.logs.frontendBundle,
51
- adminLog: props.logs.adminBundle,
50
+ spaLog: props.logs.spa,
52
51
  serverlessLog: props.logs.serverless,
53
52
  });
54
- const mainLog = logs.serverlessLog || logs.frontendLog || logs.adminLog || logs.graphqlLog || logs.projectLog;
53
+ const mainLog = logs.serverlessLog || logs.spaLog || logs.graphqlLog || logs.projectLog;
55
54
  const logList = Object.entries(logs).filter(([key, log]) => log !== mainLog);
56
55
  return (_jsxs(_Fragment, { children: [_jsx(Static, { items: mainLog ? mainLog.entries : [], children: (item, i) => {
57
56
  return _jsx(LogItem, { item: item }, item.id);
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "2.3.31";
1
+ export declare const VERSION = "2.4.0-beta.2";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/node/cli/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,WAAW,CAAA"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../src/node/cli/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,iBAAiB,CAAA"}
@@ -1 +1 @@
1
- export const VERSION = "2.3.31";
1
+ export const VERSION = "2.4.0-beta.2";
@@ -0,0 +1,18 @@
1
+ import { Project } from "../project/project.js";
2
+ import { FSCodegen } from "../utils/fs-codegen.js";
3
+ type Options = {
4
+ mode: "development" | "production";
5
+ serverless: boolean;
6
+ project: Project;
7
+ endpoint?: string;
8
+ };
9
+ /** The generated entry folder, relative to `.eddev`: `dev`, `prod`, `dev-spa` or `prod-spa`. */
10
+ export declare function getAppFolder(opts: Pick<Options, "mode" | "serverless">): string;
11
+ export declare function runAppCodegen(opts: Options): Promise<void>;
12
+ /**
13
+ * Generates the entry points and manifests in `.eddev/<folder>`, which the bundlers compile.
14
+ * SPA mode gets client + admin entries; serverless mode additionally gets the server entry.
15
+ */
16
+ export declare function createAppCodegen(opts: Options): FSCodegen;
17
+ export {};
18
+ //# sourceMappingURL=app-codegen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-codegen.d.ts","sourceRoot":"","sources":["../../../src/node/compiler/app-codegen.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAGlD,KAAK,OAAO,GAAG;IACb,IAAI,EAAE,aAAa,GAAG,YAAY,CAAA;IAClC,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,CAAC,UAEtE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,OAAO,iBAIhD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,aA8d7C"}