experimental-agent 0.0.2 → 0.0.4

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 (57) hide show
  1. package/README.md +13 -2
  2. package/dist/agent-workflow.d.mts +11 -3
  3. package/dist/agent-workflow.d.ts +11 -3
  4. package/dist/agent-workflow.js +1921 -1144
  5. package/dist/agent-workflow.mjs +7 -3
  6. package/dist/chunk-3ODWQVIA.mjs +12 -0
  7. package/dist/chunk-64THY7Y7.mjs +155 -0
  8. package/dist/chunk-GSRJYPWF.mjs +284 -0
  9. package/dist/chunk-HJGPUEFC.mjs +42 -0
  10. package/dist/chunk-JCPQQWIK.mjs +2057 -0
  11. package/dist/chunk-JEE2FQ4O.mjs +844 -0
  12. package/dist/chunk-T7PMZLOX.mjs +79 -0
  13. package/dist/chunk-TQRCSTCF.mjs +103 -0
  14. package/dist/chunk-VBLZWXVE.mjs +318 -0
  15. package/dist/{types-DPXFq_r6.d.ts → client-6g79J0s3.d.mts} +866 -31
  16. package/dist/{types-DPXFq_r6.d.mts → client-6g79J0s3.d.ts} +866 -31
  17. package/dist/client-SREKHM6I.mjs +15 -0
  18. package/dist/client.d.mts +37 -0
  19. package/dist/client.d.ts +37 -0
  20. package/dist/client.js +58 -0
  21. package/dist/client.mjs +30 -0
  22. package/dist/{client-HUG4HT5L.mjs → handler-36FM5H35.mjs} +4 -5
  23. package/dist/index.d.mts +3 -4
  24. package/dist/index.d.ts +3 -4
  25. package/dist/index.js +3102 -1438
  26. package/dist/index.mjs +720 -147
  27. package/dist/lifecycle-workflow.d.mts +3 -10
  28. package/dist/lifecycle-workflow.d.ts +3 -10
  29. package/dist/lifecycle-workflow.js +170 -1246
  30. package/dist/lifecycle-workflow.mjs +5 -41
  31. package/dist/local-fs-handlers-P4WGW3QY.mjs +235 -0
  32. package/dist/next/loader.d.mts +14 -0
  33. package/dist/next/loader.d.ts +14 -0
  34. package/dist/next/loader.js +206 -0
  35. package/dist/next/loader.mjs +103 -0
  36. package/dist/next.d.mts +34 -0
  37. package/dist/next.d.ts +34 -0
  38. package/dist/next.js +329 -0
  39. package/dist/next.mjs +224 -0
  40. package/dist/process-manager-JAKAXROL.mjs +10 -0
  41. package/dist/{client-4Y3UPWFR.mjs → sandbox-QAPGBVYM.mjs} +4 -3
  42. package/dist/storage-Q376OZH3.mjs +20 -0
  43. package/dist/{vercel-2CFDMEHB.mjs → vercel-LLXAHKVJ.mjs} +3 -1
  44. package/dist/vercel-sdk-VHKEX2GQ.mjs +8 -0
  45. package/package.json +32 -19
  46. package/dist/chunk-24DJSI7C.mjs +0 -374
  47. package/dist/chunk-4RGMKC2M.mjs +0 -755
  48. package/dist/chunk-6ICYKNCC.mjs +0 -284
  49. package/dist/chunk-PGYYQ3WZ.mjs +0 -1088
  50. package/dist/client-BBpD9kKL.d.ts +0 -193
  51. package/dist/client-BGJViybU.d.mts +0 -193
  52. package/dist/lifecycle-workflow-steps-HHN46ZAD.mjs +0 -20
  53. package/dist/local-BYPFRMLZ.mjs +0 -282
  54. package/dist/process-manager-H2HF6G4G.mjs +0 -153
  55. package/dist/sandbox-BFA4ECEQ.mjs +0 -10
  56. package/dist/storage-2U2QFNWI.mjs +0 -27
  57. /package/dist/{chunk-36X6L7SK.mjs → chunk-TAXLUVIC.mjs} +0 -0
@@ -0,0 +1,103 @@
1
+ import {
2
+ package_default
3
+ } from "../chunk-T7PMZLOX.mjs";
4
+ import "../chunk-3ODWQVIA.mjs";
5
+
6
+ // src/next/loader.ts
7
+ import * as path from "node:path";
8
+ import { parseSync } from "@swc/core";
9
+ var PACKAGE_NAME = package_default.name;
10
+ var AGENT_PROTOCOL_VERSION = "v1";
11
+ var TYPESCRIPT_EXT_REGEX = /\.(ts|tsx|mts|cts)$/;
12
+ function agentRpcLoader(source) {
13
+ const { debug } = this.getOptions();
14
+ const log = debug ? (...args) => console.log("[agent-loader]", ...args) : () => void 0;
15
+ log("processing:", this.resourcePath);
16
+ if (!source.includes(PACKAGE_NAME)) {
17
+ log("skipping - no package name");
18
+ return source;
19
+ }
20
+ const filename = this.resourcePath;
21
+ const isTypeScript = TYPESCRIPT_EXT_REGEX.test(filename);
22
+ let ast;
23
+ try {
24
+ ast = parseSync(source, {
25
+ syntax: isTypeScript ? "typescript" : "ecmascript",
26
+ tsx: filename.endsWith(".tsx"),
27
+ jsx: filename.endsWith(".jsx")
28
+ });
29
+ } catch {
30
+ return source;
31
+ }
32
+ const agentExports = findAgentExports(ast);
33
+ if (agentExports.length === 0) {
34
+ log("skipping - no agent exports");
35
+ return source;
36
+ }
37
+ log("found agent exports:", agentExports);
38
+ const fileDir = path.dirname(filename);
39
+ const srcIndex = filename.lastIndexOf(`${path.sep}src${path.sep}`);
40
+ if (srcIndex === -1) {
41
+ log("skipping - no src dir found");
42
+ return source;
43
+ }
44
+ const srcDir = filename.substring(0, srcIndex + 4);
45
+ const appDir = path.join(srcDir, "app");
46
+ const stepsPath = path.join(
47
+ appDir,
48
+ ".well-known",
49
+ "agent",
50
+ AGENT_PROTOCOL_VERSION,
51
+ "steps.js"
52
+ );
53
+ let relativePath = path.relative(fileDir, stepsPath).replace(/\\/g, "/");
54
+ if (!(relativePath.startsWith("./") || relativePath.startsWith("../"))) {
55
+ relativePath = `./${relativePath}`;
56
+ }
57
+ const initCalls = agentExports.map((name) => {
58
+ const initName = `__init${name[0].toUpperCase()}${name.slice(1)}`;
59
+ return `${initName}(${name});`;
60
+ }).join("\n");
61
+ const initImports = agentExports.map((name) => `__init${name[0].toUpperCase()}${name.slice(1)}`).join(", ");
62
+ log("injecting init calls for:", agentExports);
63
+ return `${source}
64
+ import { ${initImports} } from "${relativePath}";
65
+ ${initCalls}`;
66
+ }
67
+ function findAgentExports(ast) {
68
+ let agentLocalName = null;
69
+ for (const item of ast.body) {
70
+ if (item.type === "ImportDeclaration" && item.source.value === PACKAGE_NAME) {
71
+ for (const specifier of item.specifiers) {
72
+ if (specifier.type === "ImportSpecifier") {
73
+ const imported = specifier.imported?.type === "Identifier" ? specifier.imported.value : specifier.local.value;
74
+ if (imported === "agent") {
75
+ agentLocalName = specifier.local.value;
76
+ break;
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ if (!agentLocalName) {
83
+ return [];
84
+ }
85
+ const exports = [];
86
+ for (const item of ast.body) {
87
+ if (item.type === "ExportDeclaration" && item.declaration) {
88
+ const decl = item.declaration;
89
+ if (decl.type === "VariableDeclaration") {
90
+ for (const declarator of decl.declarations) {
91
+ if (declarator.id.type === "Identifier" && declarator.init?.type === "CallExpression" && declarator.init.callee.type === "Identifier" && declarator.init.callee.value === agentLocalName) {
92
+ exports.push(declarator.id.value);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ return exports;
99
+ }
100
+ export {
101
+ agentRpcLoader as default
102
+ };
103
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL25leHQvbG9hZGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgTW9kdWxlLCBwYXJzZVN5bmMgfSBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIjtcblxudHlwZSBMb2FkZXJPcHRpb25zID0ge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59O1xuXG50eXBlIExvYWRlckNvbnRleHQgPSB7XG4gIHJlc291cmNlUGF0aDogc3RyaW5nO1xuICBnZXRPcHRpb25zKCk6IExvYWRlck9wdGlvbnM7XG59O1xuXG5jb25zdCBQQUNLQUdFX05BTUUgPSBwa2cubmFtZTtcbmNvbnN0IEFHRU5UX1BST1RPQ09MX1ZFUlNJT04gPSBcInYxXCI7XG5jb25zdCBUWVBFU0NSSVBUX0VYVF9SRUdFWCA9IC9cXC4odHN8dHN4fG10c3xjdHMpJC87XG5cbi8qKlxuICogV2VicGFjay9UdXJib3BhY2sgbG9hZGVyIHRoYXQgd2lyZXMgdXAgYWdlbnQucnBjIGJ5IHJlcXVpcmluZyBzdGVwcy5qc1xuICogYXQgdGhlIEVORCBvZiB0aGUgZmlsZS4gVXNpbmcgcmVxdWlyZSgpIGF2b2lkcyBpbXBvcnQgaG9pc3RpbmcgaXNzdWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZ2VudFJwY0xvYWRlcihcbiAgdGhpczogTG9hZGVyQ29udGV4dCxcbiAgc291cmNlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVidWcgfSA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICBjb25zdCBsb2cgPSBkZWJ1Z1xuICAgID8gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gY29uc29sZS5sb2coXCJbYWdlbnQtbG9hZGVyXVwiLCAuLi5hcmdzKVxuICAgIDogKCkgPT4gdW5kZWZpbmVkO1xuXG4gIGxvZyhcInByb2Nlc3Npbmc6XCIsIHRoaXMucmVzb3VyY2VQYXRoKTtcblxuICBpZiAoIXNvdXJjZS5pbmNsdWRlcyhQQUNLQUdFX05BTUUpKSB7XG4gICAgbG9nKFwic2tpcHBpbmcgLSBubyBwYWNrYWdlIG5hbWVcIik7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5yZXNvdXJjZVBhdGg7XG4gIGNvbnN0IGlzVHlwZVNjcmlwdCA9IFRZUEVTQ1JJUFRfRVhUX1JFR0VYLnRlc3QoZmlsZW5hbWUpO1xuXG4gIGxldCBhc3Q6IE1vZHVsZTtcbiAgdHJ5IHtcbiAgICBhc3QgPSBwYXJzZVN5bmMoc291cmNlLCB7XG4gICAgICBzeW50YXg6IGlzVHlwZVNjcmlwdCA/IFwidHlwZXNjcmlwdFwiIDogXCJlY21hc2NyaXB0XCIsXG4gICAgICB0c3g6IGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRzeFwiKSxcbiAgICAgIGpzeDogZmlsZW5hbWUuZW5kc1dpdGgoXCIuanN4XCIpLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgY29uc3QgYWdlbnRFeHBvcnRzID0gZmluZEFnZW50RXhwb3J0cyhhc3QpO1xuICBpZiAoYWdlbnRFeHBvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZyhcInNraXBwaW5nIC0gbm8gYWdlbnQgZXhwb3J0c1wiKTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgbG9nKFwiZm91bmQgYWdlbnQgZXhwb3J0czpcIiwgYWdlbnRFeHBvcnRzKTtcblxuICAvLyBDYWxjdWxhdGUgcGF0aCB0byBzdGVwcy5qc1xuICBjb25zdCBmaWxlRGlyID0gcGF0aC5kaXJuYW1lKGZpbGVuYW1lKTtcbiAgY29uc3Qgc3JjSW5kZXggPSBmaWxlbmFtZS5sYXN0SW5kZXhPZihgJHtwYXRoLnNlcH1zcmMke3BhdGguc2VwfWApO1xuICBpZiAoc3JjSW5kZXggPT09IC0xKSB7XG4gICAgbG9nKFwic2tpcHBpbmcgLSBubyBzcmMgZGlyIGZvdW5kXCIpO1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICBjb25zdCBzcmNEaXIgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgc3JjSW5kZXggKyA0KTtcbiAgY29uc3QgYXBwRGlyID0gcGF0aC5qb2luKHNyY0RpciwgXCJhcHBcIik7XG4gIGNvbnN0IHN0ZXBzUGF0aCA9IHBhdGguam9pbihcbiAgICBhcHBEaXIsXG4gICAgXCIud2VsbC1rbm93blwiLFxuICAgIFwiYWdlbnRcIixcbiAgICBBR0VOVF9QUk9UT0NPTF9WRVJTSU9OLFxuICAgIFwic3RlcHMuanNcIlxuICApO1xuICBsZXQgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmaWxlRGlyLCBzdGVwc1BhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gIGlmICghKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpKSB7XG4gICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgfVxuXG4gIC8vIEltcG9ydCB0aGUgaW5pdCBmdW5jdGlvbiBmcm9tIHN0ZXBzLmpzIGFuZCBjYWxsIGl0IGZvciBlYWNoIGFnZW50XG4gIC8vIHN0ZXBzLmpzIG5vIGxvbmdlciBpbXBvcnRzIHRoZSBhZ2VudCwgc28gbm8gY2lyY3VsYXIgZGVwZW5kZW5jeVxuICBjb25zdCBpbml0Q2FsbHMgPSBhZ2VudEV4cG9ydHNcbiAgICAubWFwKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCBpbml0TmFtZSA9IGBfX2luaXQke25hbWVbMF0udG9VcHBlckNhc2UoKX0ke25hbWUuc2xpY2UoMSl9YDtcbiAgICAgIHJldHVybiBgJHtpbml0TmFtZX0oJHtuYW1lfSk7YDtcbiAgICB9KVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIGNvbnN0IGluaXRJbXBvcnRzID0gYWdlbnRFeHBvcnRzXG4gICAgLm1hcCgobmFtZSkgPT4gYF9faW5pdCR7bmFtZVswXS50b1VwcGVyQ2FzZSgpfSR7bmFtZS5zbGljZSgxKX1gKVxuICAgIC5qb2luKFwiLCBcIik7XG5cbiAgbG9nKFwiaW5qZWN0aW5nIGluaXQgY2FsbHMgZm9yOlwiLCBhZ2VudEV4cG9ydHMpO1xuICByZXR1cm4gYCR7c291cmNlfVxuaW1wb3J0IHsgJHtpbml0SW1wb3J0c30gfSBmcm9tIFwiJHtyZWxhdGl2ZVBhdGh9XCI7XG4ke2luaXRDYWxsc31gO1xufVxuXG5mdW5jdGlvbiBmaW5kQWdlbnRFeHBvcnRzKGFzdDogTW9kdWxlKTogc3RyaW5nW10ge1xuICBsZXQgYWdlbnRMb2NhbE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBhc3QuYm9keSkge1xuICAgIGlmIChcbiAgICAgIGl0ZW0udHlwZSA9PT0gXCJJbXBvcnREZWNsYXJhdGlvblwiICYmXG4gICAgICBpdGVtLnNvdXJjZS52YWx1ZSA9PT0gUEFDS0FHRV9OQU1FXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHNwZWNpZmllciBvZiBpdGVtLnNwZWNpZmllcnMpIHtcbiAgICAgICAgaWYgKHNwZWNpZmllci50eXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0ZWQgPVxuICAgICAgICAgICAgc3BlY2lmaWVyLmltcG9ydGVkPy50eXBlID09PSBcIklkZW50aWZpZXJcIlxuICAgICAgICAgICAgICA/IHNwZWNpZmllci5pbXBvcnRlZC52YWx1ZVxuICAgICAgICAgICAgICA6IHNwZWNpZmllci5sb2NhbC52YWx1ZTtcblxuICAgICAgICAgIGlmIChpbXBvcnRlZCA9PT0gXCJhZ2VudFwiKSB7XG4gICAgICAgICAgICBhZ2VudExvY2FsTmFtZSA9IHNwZWNpZmllci5sb2NhbC52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghYWdlbnRMb2NhbE5hbWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBleHBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBhc3QuYm9keSkge1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwiRXhwb3J0RGVjbGFyYXRpb25cIiAmJiBpdGVtLmRlY2xhcmF0aW9uKSB7XG4gICAgICBjb25zdCBkZWNsID0gaXRlbS5kZWNsYXJhdGlvbjtcbiAgICAgIGlmIChkZWNsLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRvciBvZiBkZWNsLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRlY2xhcmF0b3IuaWQudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgICAgIGRlY2xhcmF0b3IuaW5pdD8udHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiICYmXG4gICAgICAgICAgICBkZWNsYXJhdG9yLmluaXQuY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAgICAgICBkZWNsYXJhdG9yLmluaXQuY2FsbGVlLnZhbHVlID09PSBhZ2VudExvY2FsTmFtZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXhwb3J0cy5wdXNoKGRlY2xhcmF0b3IuaWQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBvcnRzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7O0FBQUEsWUFBWSxVQUFVO0FBQ3RCLFNBQXNCLGlCQUFpQjtBQVl2QyxJQUFNLGVBQWUsZ0JBQUk7QUFDekIsSUFBTSx5QkFBeUI7QUFDL0IsSUFBTSx1QkFBdUI7QUFNZCxTQUFSLGVBRUwsUUFDUTtBQUNSLFFBQU0sRUFBRSxNQUFNLElBQUksS0FBSyxXQUFXO0FBQ2xDLFFBQU0s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
@@ -0,0 +1,34 @@
1
+ import { NextConfig } from 'next';
2
+
3
+ type WithAgentConfig = {
4
+ /** Enable debug logging */
5
+ debug?: boolean;
6
+ };
7
+ type WorkflowConfigFn = (phase: string, ctx: {
8
+ defaultConfig: NextConfig;
9
+ }) => Promise<NextConfig>;
10
+ type NextConfigInput = NextConfig | ((phase: string, ctx: {
11
+ defaultConfig: NextConfig;
12
+ }) => Promise<NextConfig>);
13
+ /**
14
+ * Next.js plugin that configures agent support.
15
+ *
16
+ * - Detects agents and generates RPC steps with "use step" in .well-known/agent/v1/
17
+ * - Generates AGENT_SECRET for secure RPC calls
18
+ * - Wraps withWorkflow for workflow support
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * // next.config.ts
23
+ * import { withAgent } from "experimental-agent/next";
24
+ *
25
+ * // Option 1: withAgent handles everything (recommended)
26
+ * export default withAgent({});
27
+ *
28
+ * // Option 2: Compose with other plugins
29
+ * export default withAgent(withSomeOtherPlugin({}));
30
+ * ```
31
+ */
32
+ declare function withAgent(configOrFn: NextConfigInput, agentConfig?: WithAgentConfig): WorkflowConfigFn;
33
+
34
+ export { type WithAgentConfig, withAgent };
package/dist/next.d.ts ADDED
@@ -0,0 +1,34 @@
1
+ import { NextConfig } from 'next';
2
+
3
+ type WithAgentConfig = {
4
+ /** Enable debug logging */
5
+ debug?: boolean;
6
+ };
7
+ type WorkflowConfigFn = (phase: string, ctx: {
8
+ defaultConfig: NextConfig;
9
+ }) => Promise<NextConfig>;
10
+ type NextConfigInput = NextConfig | ((phase: string, ctx: {
11
+ defaultConfig: NextConfig;
12
+ }) => Promise<NextConfig>);
13
+ /**
14
+ * Next.js plugin that configures agent support.
15
+ *
16
+ * - Detects agents and generates RPC steps with "use step" in .well-known/agent/v1/
17
+ * - Generates AGENT_SECRET for secure RPC calls
18
+ * - Wraps withWorkflow for workflow support
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * // next.config.ts
23
+ * import { withAgent } from "experimental-agent/next";
24
+ *
25
+ * // Option 1: withAgent handles everything (recommended)
26
+ * export default withAgent({});
27
+ *
28
+ * // Option 2: Compose with other plugins
29
+ * export default withAgent(withSomeOtherPlugin({}));
30
+ * ```
31
+ */
32
+ declare function withAgent(configOrFn: NextConfigInput, agentConfig?: WithAgentConfig): WorkflowConfigFn;
33
+
34
+ export { type WithAgentConfig, withAgent };
package/dist/next.js ADDED
@@ -0,0 +1,329 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/next/index.ts
31
+ var next_exports = {};
32
+ __export(next_exports, {
33
+ withAgent: () => withAgent
34
+ });
35
+ module.exports = __toCommonJS(next_exports);
36
+ var crypto = __toESM(require("crypto"));
37
+ var fs = __toESM(require("fs"));
38
+ var path = __toESM(require("path"));
39
+
40
+ // package.json
41
+ var package_default = {
42
+ name: "experimental-agent",
43
+ version: "0.0.4",
44
+ main: "./dist/index.js",
45
+ module: "./dist/index.mjs",
46
+ types: "./dist/index.d.ts",
47
+ sideEffects: true,
48
+ license: "MIT",
49
+ files: [
50
+ "dist/**"
51
+ ],
52
+ exports: {
53
+ ".": {
54
+ types: "./dist/index.d.ts",
55
+ import: "./dist/index.mjs",
56
+ require: "./dist/index.js"
57
+ },
58
+ "./next": {
59
+ types: "./dist/next.d.ts",
60
+ import: "./dist/next.mjs",
61
+ require: "./dist/next.js"
62
+ },
63
+ "./next/loader": {
64
+ types: "./dist/next/loader.d.ts",
65
+ import: "./dist/next/loader.mjs",
66
+ require: "./dist/next/loader.js"
67
+ },
68
+ "./client": {
69
+ types: "./dist/client.d.ts",
70
+ import: "./dist/client.mjs",
71
+ require: "./dist/client.js"
72
+ }
73
+ },
74
+ scripts: {
75
+ build: "tsup",
76
+ dev: "tsup --watch",
77
+ clean: "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
78
+ release: "pnpm build && npm publish",
79
+ typecheck: "tsc --noEmit",
80
+ test: "vitest run",
81
+ "test:watch": "vitest"
82
+ },
83
+ dependencies: {
84
+ "@hono/node-server": "^1.19.9",
85
+ "@swc/core": "^1.10.0",
86
+ "@vercel/oidc": "^3.1.0",
87
+ "better-all": "^0.0.5",
88
+ errore: "^0.8.2",
89
+ "fast-deep-equal": "^3.1.3",
90
+ glob: "^11.0.0",
91
+ hono: "^4.11.6",
92
+ sandbox: "^1.0.18",
93
+ ulid: "^3.0.2",
94
+ zod: "^4.3.6"
95
+ },
96
+ devDependencies: {
97
+ "@agent/tsconfig": "workspace:*",
98
+ "@types/node": "^20.11.24",
99
+ dotenv: "^17.2.3",
100
+ next: "^16.0.0",
101
+ tsup: "^8.0.2",
102
+ "type-fest": "^5.4.2",
103
+ typescript: "5.5.4",
104
+ vitest: "^3.0.0"
105
+ },
106
+ peerDependencies: {
107
+ ai: "^6.0.0",
108
+ workflow: "https://workflow-docs-7evupb64d.vercel.sh/workflow.tgz"
109
+ },
110
+ publishConfig: {
111
+ access: "public"
112
+ }
113
+ };
114
+
115
+ // src/next/index.ts
116
+ var PACKAGE_NAME = package_default.name;
117
+ var AGENT_PROTOCOL_VERSION = "v1";
118
+ var FILE_EXT_REGEX = /\.(ts|tsx|js|jsx)$/;
119
+ var AGENT_EXPORT_REGEX = /export\s+const\s+(\w+)\s*=\s*agent\s*\(/g;
120
+ var DEFAULT_WORKFLOW_DIRS = ["pages", "app", "src/pages", "src/app"];
121
+ function shortHash(str) {
122
+ let hash = 0;
123
+ for (let i = 0; i < str.length; i++) {
124
+ const char = str.charCodeAt(i);
125
+ hash = (hash << 5) - hash + char;
126
+ hash &= hash;
127
+ }
128
+ return Math.abs(hash).toString(36).slice(0, 6);
129
+ }
130
+ function getAppDir(cwd) {
131
+ const srcAppDir = path.join(cwd, "src", "app");
132
+ if (fs.existsSync(srcAppDir)) {
133
+ return "src/app";
134
+ }
135
+ return "app";
136
+ }
137
+ function detectAgents(cwd, debug) {
138
+ const agents = [];
139
+ const dirsToScan = [path.join(cwd, "src"), cwd];
140
+ function scanDir(dir) {
141
+ if (!fs.existsSync(dir)) {
142
+ return;
143
+ }
144
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
145
+ for (const entry of entries) {
146
+ const fullPath = path.join(dir, entry.name);
147
+ if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules" && entry.name !== "src") {
148
+ scanDir(fullPath);
149
+ } else if (entry.isFile() && FILE_EXT_REGEX.test(entry.name)) {
150
+ try {
151
+ const content = fs.readFileSync(fullPath, "utf-8");
152
+ if (content.includes(PACKAGE_NAME) && content.includes("agent(")) {
153
+ const exportMatches = content.matchAll(AGENT_EXPORT_REGEX);
154
+ for (const match of exportMatches) {
155
+ agents.push({
156
+ exportName: match[1],
157
+ filePath: fullPath,
158
+ uniqueId: ""
159
+ // Will be set after all agents are found
160
+ });
161
+ if (debug) {
162
+ console.log(
163
+ `[withAgent] Found agent: ${match[1]} in ${fullPath}`
164
+ );
165
+ }
166
+ }
167
+ }
168
+ } catch {
169
+ }
170
+ }
171
+ }
172
+ }
173
+ for (const dir of dirsToScan) {
174
+ scanDir(dir);
175
+ }
176
+ const nameCounts = /* @__PURE__ */ new Map();
177
+ for (const agent of agents) {
178
+ nameCounts.set(
179
+ agent.exportName,
180
+ (nameCounts.get(agent.exportName) || 0) + 1
181
+ );
182
+ }
183
+ for (const agent of agents) {
184
+ const count = nameCounts.get(agent.exportName) ?? 0;
185
+ if (count > 1) {
186
+ agent.uniqueId = `${agent.exportName}_${shortHash(agent.filePath)}`;
187
+ } else {
188
+ agent.uniqueId = agent.exportName;
189
+ }
190
+ }
191
+ return agents;
192
+ }
193
+ function generateAgentFiles(agents, outputDir, _cwd, debug) {
194
+ if (agents.length === 0) {
195
+ if (debug) {
196
+ console.log("[withAgent] No agents found, skipping generation");
197
+ }
198
+ return;
199
+ }
200
+ if (!fs.existsSync(outputDir)) {
201
+ fs.mkdirSync(outputDir, { recursive: true });
202
+ }
203
+ const rpcFunctions = agents.map((a) => {
204
+ let agentRelPath = path.relative(outputDir, a.filePath).replace(/\\/g, "/");
205
+ if (!agentRelPath.startsWith(".")) {
206
+ agentRelPath = `./${agentRelPath}`;
207
+ }
208
+ return `
209
+ export const ${a.uniqueId}Rpc = async (params) => {
210
+ "use step";
211
+ const { ${a.exportName} } = await import("${agentRelPath}");
212
+ const res = await ${a.exportName}.handler(params);
213
+ if (res instanceof Response) {
214
+ return res.json();
215
+ }
216
+ return res;
217
+ };`;
218
+ }).join("\n");
219
+ const initFunctions = agents.map(
220
+ (a) => `
221
+ export function __init${a.exportName[0].toUpperCase()}${a.exportName.slice(
222
+ 1
223
+ )}(agent) {
224
+ agent.rpc = ${a.uniqueId}Rpc;
225
+ }`
226
+ ).join("\n");
227
+ const stepsContent = `// Auto-generated by withAgent - do not edit
228
+ ${rpcFunctions}
229
+ ${initFunctions}
230
+ `;
231
+ const stepsPath = path.join(outputDir, "steps.js");
232
+ fs.writeFileSync(stepsPath, stepsContent);
233
+ const routeContent = `// Auto-generated by withAgent - triggers workflow discovery
234
+ import "./steps.js";
235
+ export function GET() {
236
+ return new Response("ok");
237
+ }
238
+ `;
239
+ const routePath = path.join(outputDir, "route.js");
240
+ fs.writeFileSync(routePath, routeContent);
241
+ const gitignorePath = path.join(outputDir, ".gitignore");
242
+ if (!fs.existsSync(gitignorePath)) {
243
+ fs.writeFileSync(gitignorePath, "*\n");
244
+ }
245
+ if (debug) {
246
+ console.log(`[withAgent] Generated agent files at ${outputDir}`);
247
+ }
248
+ }
249
+ function withAgent(configOrFn, agentConfig) {
250
+ const debug = agentConfig?.debug ?? false;
251
+ const cwd = process.cwd();
252
+ const appDir = getAppDir(cwd);
253
+ const agentDir = `${appDir}/.well-known/agent/${AGENT_PROTOCOL_VERSION}`;
254
+ const agents = detectAgents(cwd, debug);
255
+ const outputDir = path.join(cwd, agentDir);
256
+ generateAgentFiles(agents, outputDir, cwd, debug);
257
+ const agentFilePaths = agents.map((a) => a.filePath);
258
+ const loaderPath = require.resolve("./next/loader");
259
+ if (debug) {
260
+ console.log("[withAgent] loader path:", loaderPath);
261
+ console.log("[withAgent] agent files:", agentFilePaths);
262
+ console.log("[withAgent] agent dir:", agentDir);
263
+ }
264
+ const agentPathRegex = agentFilePaths.length > 0 ? new RegExp(
265
+ `${agentFilePaths.map(
266
+ (p) => path.relative(cwd, p).replace(/\\/g, "/").replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
267
+ ).join("|")}$`
268
+ ) : null;
269
+ let withWorkflow;
270
+ try {
271
+ withWorkflow = require("workflow/next").withWorkflow;
272
+ } catch {
273
+ console.warn(
274
+ "[withAgent] workflow/next not found. Make sure workflow is installed."
275
+ );
276
+ return typeof configOrFn === "function" ? configOrFn : async () => configOrFn;
277
+ }
278
+ const baseConfigFn = withWorkflow(configOrFn, {
279
+ workflows: {
280
+ dirs: [...DEFAULT_WORKFLOW_DIRS, agentDir]
281
+ }
282
+ });
283
+ return async (phase, ctx) => {
284
+ const nextConfig = await baseConfigFn(phase, ctx);
285
+ if (!process.env.AGENT_SECRET) {
286
+ nextConfig.env = {
287
+ ...nextConfig.env,
288
+ AGENT_SECRET: crypto.randomUUID()
289
+ };
290
+ if (debug) {
291
+ console.log("[withAgent] Generated AGENT_SECRET");
292
+ }
293
+ }
294
+ if (!agentPathRegex || agentFilePaths.length === 0) {
295
+ return nextConfig;
296
+ }
297
+ const rules = nextConfig.turbopack?.rules || {};
298
+ for (const key of ["*.ts", "*.tsx", "*.js", "*.jsx"]) {
299
+ const existingRule = rules[key];
300
+ if (!existingRule) {
301
+ continue;
302
+ }
303
+ rules[key] = {
304
+ ...existingRule,
305
+ loaders: [loaderPath, ...existingRule.loaders || []],
306
+ condition: {
307
+ any: [existingRule.condition, { path: agentPathRegex }]
308
+ }
309
+ };
310
+ }
311
+ const existingWebpack = nextConfig.webpack;
312
+ nextConfig.webpack = (webpackConfig, context) => {
313
+ webpackConfig.module.rules.push({
314
+ test: (resourcePath) => agentFilePaths.includes(resourcePath),
315
+ use: [{ loader: loaderPath }]
316
+ });
317
+ return existingWebpack?.(webpackConfig, context) ?? webpackConfig;
318
+ };
319
+ if (debug) {
320
+ console.log("[withAgent] Added agent loader to turbopack rules");
321
+ }
322
+ return nextConfig;
323
+ };
324
+ }
325
+ // Annotate the CommonJS export names for ESM import in node:
326
+ 0 && (module.exports = {
327
+ withAgent
328
+ });
329
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25leHQvaW5kZXgudHMiLCAiLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWcgfSBmcm9tIFwibmV4dFwiO1xuaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCI7XG5cbmV4cG9ydCB0eXBlIFdpdGhBZ2VudENvbmZpZyA9IHtcbiAgLyoqIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFBBQ0tBR0VfTkFNRSA9IHBrZy5uYW1lO1xuY29uc3QgQUdFTlRfUFJPVE9DT0xfVkVSU0lPTiA9IFwidjFcIjtcbmNvbnN0IEZJTEVfRVhUX1JFR0VYID0gL1xcLih0c3x0c3h8anN8anN4KSQvO1xuY29uc3QgQUdFTlRfRVhQT1JUX1JFR0VYID0gL2V4cG9ydFxccytjb25zdFxccysoXFx3KylcXHMqPVxccyphZ2VudFxccypcXCgvZztcbmNvbnN0IERFRkFVTFRfV09SS0ZMT1dfRElSUyA9IFtcInBhZ2VzXCIsIFwiYXBwXCIsIFwic3JjL3BhZ2VzXCIsIFwic3JjL2FwcFwiXTtcblxudHlwZSBEZXRlY3RlZEFnZW50ID0ge1xuICBleHBvcnROYW1lOiBzdHJpbmc7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllcjogZXhwb3J0TmFtZSBvciBleHBvcnROYW1lX2hhc2ggaWYgZHVwbGljYXRlcyBleGlzdCAqL1xuICB1bmlxdWVJZDogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gc2hvcnRIYXNoKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGhhc2ggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQml0d2lzZU9wZXJhdG9yczogaW50ZW50aW9uYWwgaGFzaCBjb21wdXRhdGlvblxuICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaGFyO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9CaXR3aXNlT3BlcmF0b3JzOiBjb252ZXJ0IHRvIDMyLWJpdCBpbnRlZ2VyXG4gICAgaGFzaCAmPSBoYXNoO1xuICB9XG4gIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNikuc2xpY2UoMCwgNik7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBwcm9qZWN0IHVzZXMgc3JjL2FwcCBvciBhcHAgZGlyZWN0b3J5IHN0cnVjdHVyZS5cbiAqIFJldHVybnMgdGhlIGFwcCBkaXJlY3RvcnkgcGF0aCByZWxhdGl2ZSB0byBjd2QuXG4gKi9cbmZ1bmN0aW9uIGdldEFwcERpcihjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNyY0FwcERpciA9IHBhdGguam9pbihjd2QsIFwic3JjXCIsIFwiYXBwXCIpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhzcmNBcHBEaXIpKSB7XG4gICAgcmV0dXJuIFwic3JjL2FwcFwiO1xuICB9XG4gIHJldHVybiBcImFwcFwiO1xufVxuXG4vKipcbiAqIFNjYW5zIGZvciBhZ2VudCBleHBvcnRzIGluIHRoZSBwcm9qZWN0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RBZ2VudHMoY3dkOiBzdHJpbmcsIGRlYnVnOiBib29sZWFuKTogRGV0ZWN0ZWRBZ2VudFtdIHtcbiAgY29uc3QgYWdlbnRzOiBEZXRlY3RlZEFnZW50W10gPSBbXTtcblxuICBjb25zdCBkaXJzVG9TY2FuID0gW3BhdGguam9pbihjd2QsIFwic3JjXCIpLCBjd2RdO1xuXG4gIGZ1bmN0aW9uIHNjYW5EaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoXG4gICAgICAgIGVudHJ5LmlzRGlyZWN0b3J5KCkgJiZcbiAgICAgICAgIWVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiZcbiAgICAgICAgZW50cnkubmFtZSAhPT0gXCJub2RlX21vZHVsZXNcIiAmJlxuICAgICAgICBlbnRyeS5uYW1lICE9PSBcInNyY1wiXG4gICAgICApIHtcbiAgICAgICAgc2NhbkRpcihmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIEZJTEVfRVhUX1JFR0VYLnRlc3QoZW50cnkubmFtZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKFBBQ0tBR0VfTkFNRSkgJiYgY29udGVudC5pbmNsdWRlcyhcImFnZW50KFwiKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0TWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2hBbGwoQUdFTlRfRVhQT1JUX1JFR0VYKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZXhwb3J0TWF0Y2hlcykge1xuICAgICAgICAgICAgICBhZ2VudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXhwb3J0TmFtZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgZmlsZVBhdGg6IGZ1bGxQYXRoLFxuICAgICAgICAgICAgICAgIHVuaXF1ZUlkOiBcIlwiLCAvLyBXaWxsIGJlIHNldCBhZnRlciBhbGwgYWdlbnRzIGFyZSBmb3VuZFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgW3dpdGhBZ2VudF0gRm91bmQgYWdlbnQ6ICR7bWF0Y2hbMV19IGluICR7ZnVsbFBhdGh9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSByZWFkIGVycm9yc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBkaXIgb2YgZGlyc1RvU2Nhbikge1xuICAgIHNjYW5EaXIoZGlyKTtcbiAgfVxuXG4gIC8vIEFzc2lnbiB1bmlxdWUgSURzIC0gYWRkIGhhc2ggc3VmZml4IGlmIGR1cGxpY2F0ZSBleHBvcnQgbmFtZXMgZXhpc3RcbiAgY29uc3QgbmFtZUNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgYWdlbnQgb2YgYWdlbnRzKSB7XG4gICAgbmFtZUNvdW50cy5zZXQoXG4gICAgICBhZ2VudC5leHBvcnROYW1lLFxuICAgICAgKG5hbWVDb3VudHMuZ2V0KGFnZW50LmV4cG9ydE5hbWUpIHx8IDApICsgMVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGFnZW50IG9mIGFnZW50cykge1xuICAgIGNvbnN0IGNvdW50ID0gbmFtZUNvdW50cy5nZXQoYWdlbnQuZXhwb3J0TmFtZSkgPz8gMDtcbiAgICBpZiAoY291bnQgPiAxKSB7XG4gICAgICBhZ2VudC51bmlxdWVJZCA9IGAke2FnZW50LmV4cG9ydE5hbWV9XyR7c2hvcnRIYXNoKGFnZW50LmZpbGVQYXRoKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZ2VudC51bmlxdWVJZCA9IGFnZW50LmV4cG9ydE5hbWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFnZW50cztcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYWxsIGFnZW50IGZpbGVzIGluIC53ZWxsLWtub3duL2FnZW50L3YxLzpcbiAqIC0gc3RlcHMuanM6IFJQQyBzdGVwIGZ1bmN0aW9ucyB3aXRoIFwidXNlIHN0ZXBcIlxuICogLSByb3V0ZS5qczogdHJpZ2dlcnMgd29ya2Zsb3cgZGlzY292ZXJ5XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRGaWxlcyhcbiAgYWdlbnRzOiBEZXRlY3RlZEFnZW50W10sXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICBfY3dkOiBzdHJpbmcsXG4gIGRlYnVnOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW3dpdGhBZ2VudF0gTm8gYWdlbnRzIGZvdW5kLCBza2lwcGluZyBnZW5lcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgIGZzLm1rZGlyU3luYyhvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN0ZXAgZnVuY3Rpb25zIHRoYXQgdXNlIGR5bmFtaWMgaW1wb3J0LlxuICAgKiBEeW5hbWljIGltcG9ydCBlbnN1cmVzIHRoZSBhZ2VudCBtb2R1bGUgbG9hZHMgKGluY2x1ZGluZyBsb2FkZXItaW5qZWN0ZWQgaW5pdClcbiAgICogd2hlbiB0aGUgc3RlcCBydW5zIGluIHdvcmtmbG93IGNvbnRleHQsIGF2b2lkaW5nIHRoZSBcIm5vdCBpbml0aWFsaXplZFwiIGVycm9yLlxuICAgKlxuICAgKiBVc2VzIHVuaXF1ZUlkIGZvciBmdW5jdGlvbiBuYW1lcyB0byBoYW5kbGUgZHVwbGljYXRlIGV4cG9ydCBuYW1lcyBhY3Jvc3MgZmlsZXMuXG4gICAqL1xuICBjb25zdCBycGNGdW5jdGlvbnMgPSBhZ2VudHNcbiAgICAubWFwKChhKSA9PiB7XG4gICAgICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgcGF0aCBmcm9tIHN0ZXBzLmpzIHRvIHRoZSBhZ2VudCBmaWxlXG4gICAgICBsZXQgYWdlbnRSZWxQYXRoID0gcGF0aFxuICAgICAgICAucmVsYXRpdmUob3V0cHV0RGlyLCBhLmZpbGVQYXRoKVxuICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5cbiAgICAgIGlmICghYWdlbnRSZWxQYXRoLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICAgIGFnZW50UmVsUGF0aCA9IGAuLyR7YWdlbnRSZWxQYXRofWA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgXG5leHBvcnQgY29uc3QgJHthLnVuaXF1ZUlkfVJwYyA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCB7ICR7YS5leHBvcnROYW1lfSB9ID0gYXdhaXQgaW1wb3J0KFwiJHthZ2VudFJlbFBhdGh9XCIpO1xuICBjb25zdCByZXMgPSBhd2FpdCAke2EuZXhwb3J0TmFtZX0uaGFuZGxlcihwYXJhbXMpO1xuICBpZiAocmVzIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtgO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgLyoqXG4gICAqIEluaXQgZnVuY3Rpb25zIHdpcmUgdXAgYWdlbnQucnBjIGluIHRoZSBtYWluIGFwcCBjb250ZXh0LlxuICAgKiBVc2VzIGV4cG9ydE5hbWUgZm9yIHRoZSBmdW5jdGlvbiBuYW1lIChsb2FkZXIgbWF0Y2hlcyBieSBleHBvcnQgbmFtZSksXG4gICAqIGJ1dCByZWZlcmVuY2VzIHVuaXF1ZUlkIGZvciB0aGUgUnBjIGZ1bmN0aW9uLlxuICAgKi9cbiAgY29uc3QgaW5pdEZ1bmN0aW9ucyA9IGFnZW50c1xuICAgIC5tYXAoXG4gICAgICAoYSkgPT4gYFxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdCR7YS5leHBvcnROYW1lWzBdLnRvVXBwZXJDYXNlKCl9JHthLmV4cG9ydE5hbWUuc2xpY2UoXG4gICAgICAgIDFcbiAgICAgICl9KGFnZW50KSB7XG4gIGFnZW50LnJwYyA9ICR7YS51bmlxdWVJZH1ScGM7XG59YFxuICAgIClcbiAgICAuam9pbihcIlxcblwiKTtcblxuICBjb25zdCBzdGVwc0NvbnRlbnQgPSBgLy8gQXV0by1nZW5lcmF0ZWQgYnkgd2l0aEFnZW50IC0gZG8gbm90IGVkaXRcbiR7cnBjRnVuY3Rpb25zfVxuJHtpbml0RnVuY3Rpb25zfVxuYDtcblxuICBjb25zdCBzdGVwc1BhdGggPSBwYXRoLmpvaW4ob3V0cHV0RGlyLCBcInN0ZXBzLmpzXCIpO1xuICBmcy53cml0ZUZpbGVTeW5jKHN0ZXBzUGF0aCwgc3RlcHNDb250ZW50KTtcblxuICAvKipcbiAgICogR2VuZXJhdGUgcm91dGUuanMgdGhhdCBpbXBvcnRzIHN0ZXBzLmpzLlxuICAgKiBUaGlzIGVuc3VyZXMgd29ya2Zsb3cgZGlzY292ZXJzIHRoZSBcInVzZSBzdGVwXCIgZnVuY3Rpb25zLlxuICAgKiBObyBhY3R1YWwgaGFuZGxlciBuZWVkZWQgLSBzdG9yYWdlIFJQQyB1c2VzIHRoZSBzdGVwIGZ1bmN0aW9uIGRpcmVjdGx5LlxuICAgKi9cbiAgY29uc3Qgcm91dGVDb250ZW50ID0gYC8vIEF1dG8tZ2VuZXJhdGVkIGJ5IHdpdGhBZ2VudCAtIHRyaWdnZXJzIHdvcmtmbG93IGRpc2NvdmVyeVxuaW1wb3J0IFwiLi9zdGVwcy5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIEdFVCgpIHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShcIm9rXCIpO1xufVxuYDtcblxuICBjb25zdCByb3V0ZVBhdGggPSBwYXRoLmpvaW4ob3V0cHV0RGlyLCBcInJvdXRlLmpzXCIpO1xuICBmcy53cml0ZUZpbGVTeW5jKHJvdXRlUGF0aCwgcm91dGVDb250ZW50KTtcblxuICAvLyBBZGQgLmdpdGlnbm9yZVxuICBjb25zdCBnaXRpZ25vcmVQYXRoID0gcGF0aC5qb2luKG91dHB1dERpciwgXCIuZ2l0aWdub3JlXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZ2l0aWdub3JlUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGdpdGlnbm9yZVBhdGgsIFwiKlxcblwiKTtcbiAgfVxuXG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKGBbd2l0aEFnZW50XSBHZW5lcmF0ZWQgYWdlbnQgZmlsZXMgYXQgJHtvdXRwdXREaXJ9YCk7XG4gIH1cbn1cblxudHlwZSBUdXJib3BhY2tSdWxlID0ge1xuICBsb2FkZXJzPzogc3RyaW5nW107XG4gIGNvbmRpdGlvbj86IHtcbiAgICBhbGw/OiB1bmtub3duW107XG4gICAgYW55PzogdW5rbm93bltdO1xuICAgIHBhdGg/OiBSZWdFeHA7XG4gICAgY29udGVudD86IFJlZ0V4cDtcbiAgICBub3Q/OiB1bmtub3duO1xuICB9O1xufTtcblxudHlwZSBXb3JrZmxvd0NvbmZpZ0ZuID0gKFxuICBwaGFzZTogc3RyaW5nLFxuICBjdHg6IHsgZGVmYXVsdENvbmZpZzogTmV4dENvbmZpZyB9XG4pID0+IFByb21pc2U8TmV4dENvbmZpZz47XG5cbnR5cGUgTmV4dENvbmZpZ0lucHV0ID1cbiAgfCBOZXh0Q29uZmlnXG4gIHwgKChcbiAgICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgICBjdHg6IHsgZGVmYXVsdENvbmZpZzogTmV4dENvbmZpZyB9XG4gICAgKSA9PiBQcm9taXNlPE5leHRDb25maWc+KTtcblxuLyoqXG4gKiBOZXh0LmpzIHBsdWdpbiB0aGF0IGNvbmZpZ3VyZXMgYWdlbnQgc3VwcG9ydC5cbiAqXG4gKiAtIERldGVjdHMgYWdlbnRzIGFuZCBnZW5lcmF0ZXMgUlBDIHN0ZXBzIHdpdGggXCJ1c2Ugc3RlcFwiIGluIC53ZWxsLWtub3duL2FnZW50L3YxL1xuICogLSBHZW5lcmF0ZXMgQUdFTlRfU0VDUkVUIGZvciBzZWN1cmUgUlBDIGNhbGxzXG4gKiAtIFdyYXBzIHdpdGhXb3JrZmxvdyBmb3Igd29ya2Zsb3cgc3VwcG9ydFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gbmV4dC5jb25maWcudHNcbiAqIGltcG9ydCB7IHdpdGhBZ2VudCB9IGZyb20gXCJleHBlcmltZW50YWwtYWdlbnQvbmV4dFwiO1xuICpcbiAqIC8vIE9wdGlvbiAxOiB3aXRoQWdlbnQgaGFuZGxlcyBldmVyeXRoaW5nIChyZWNvbW1lbmRlZClcbiAqIGV4cG9ydCBkZWZhdWx0IHdpdGhBZ2VudCh7fSk7XG4gKlxuICogLy8gT3B0aW9uIDI6IENvbXBvc2Ugd2l0aCBvdGhlciBwbHVnaW5zXG4gKiBleHBvcnQgZGVmYXVsdCB3aXRoQWdlbnQod2l0aFNvbWVPdGhlclBsdWdpbih7fSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQWdlbnQoXG4gIGNvbmZpZ09yRm46IE5leHRDb25maWdJbnB1dCxcbiAgYWdlbnRDb25maWc/OiBXaXRoQWdlbnRDb25maWdcbik6IFdvcmtmbG93Q29uZmlnRm4ge1xuICBjb25zdCBkZWJ1ZyA9IGFnZW50Q29uZmlnPy5kZWJ1ZyA/PyBmYWxzZTtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBEZXRlY3QgYXBwIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHNyYy9hcHAgdnMgYXBwKVxuICBjb25zdCBhcHBEaXIgPSBnZXRBcHBEaXIoY3dkKTtcbiAgY29uc3QgYWdlbnREaXIgPSBgJHthcHBEaXJ9Ly53ZWxsLWtub3duL2FnZW50LyR7QUdFTlRfUFJPVE9DT0xfVkVSU0lPTn1gO1xuXG4gIC8vIERldGVjdCBhZ2VudHMgYW5kIGdlbmVyYXRlIGZpbGVzIEZJUlNUIChiZWZvcmUgd29ya2Zsb3cgZGlzY292ZXJzIHRoZW0pXG4gIGNvbnN0IGFnZW50cyA9IGRldGVjdEFnZW50cyhjd2QsIGRlYnVnKTtcbiAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5qb2luKGN3ZCwgYWdlbnREaXIpO1xuICBnZW5lcmF0ZUFnZW50RmlsZXMoYWdlbnRzLCBvdXRwdXREaXIsIGN3ZCwgZGVidWcpO1xuXG4gIGNvbnN0IGFnZW50RmlsZVBhdGhzID0gYWdlbnRzLm1hcCgoYSkgPT4gYS5maWxlUGF0aCk7XG4gIGNvbnN0IGxvYWRlclBhdGggPSByZXF1aXJlLnJlc29sdmUoXCIuL25leHQvbG9hZGVyXCIpO1xuXG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKFwiW3dpdGhBZ2VudF0gbG9hZGVyIHBhdGg6XCIsIGxvYWRlclBhdGgpO1xuICAgIGNvbnNvbGUubG9nKFwiW3dpdGhBZ2VudF0gYWdlbnQgZmlsZXM6XCIsIGFnZW50RmlsZVBhdGhzKTtcbiAgICBjb25zb2xlLmxvZyhcIlt3aXRoQWdlbnRdIGFnZW50IGRpcjpcIiwgYWdlbnREaXIpO1xuICB9XG5cbiAgLy8gQnVpbGQgcmVnZXggdG8gbWF0Y2ggYWdlbnQgZmlsZSBwYXRoc1xuICBjb25zdCBhZ2VudFBhdGhSZWdleCA9XG4gICAgYWdlbnRGaWxlUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyBuZXcgUmVnRXhwKFxuICAgICAgICAgIGAke2FnZW50RmlsZVBhdGhzXG4gICAgICAgICAgICAubWFwKChwKSA9PlxuICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgICAgLnJlbGF0aXZlKGN3ZCwgcClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbihcInxcIil9JGBcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgcGFzcyB0aHJvdWdoIHdpdGhXb3JrZmxvdyAtIGl0IGhhbmRsZXMgYm90aCBOZXh0Q29uZmlnIGFuZCBhc3luYyBmdW5jdGlvbnMuXG4gICAqIFRoaXMgZW5zdXJlcyB3b3JrZmxvdyBpcyBhbHdheXMgY29uZmlndXJlZCwgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSB1c2VyIHBhc3NlZC5cbiAgICovXG4gIGxldCB3aXRoV29ya2Zsb3c6IChcbiAgICBjb25maWc6IE5leHRDb25maWdJbnB1dCxcbiAgICBvcHRpb25zPzogeyB3b3JrZmxvd3M/OiB7IGRpcnM/OiBzdHJpbmdbXSB9IH1cbiAgKSA9PiBXb3JrZmxvd0NvbmZpZ0ZuO1xuICB0cnkge1xuICAgIHdpdGhXb3JrZmxvdyA9IHJlcXVpcmUoXCJ3b3JrZmxvdy9uZXh0XCIpLndpdGhXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbd2l0aEFnZW50XSB3b3JrZmxvdy9uZXh0IG5vdCBmb3VuZC4gTWFrZSBzdXJlIHdvcmtmbG93IGlzIGluc3RhbGxlZC5cIlxuICAgICk7XG4gICAgcmV0dXJuIHR5cGVvZiBjb25maWdPckZuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY29uZmlnT3JGblxuICAgICAgOiBhc3luYyAoKSA9PiBjb25maWdPckZuO1xuICB9XG5cbiAgY29uc3QgYmFzZUNvbmZpZ0ZuID0gd2l0aFdvcmtmbG93KGNvbmZpZ09yRm4sIHtcbiAgICB3b3JrZmxvd3M6IHtcbiAgICAgIGRpcnM6IFsuLi5ERUZBVUxUX1dPUktGTE9XX0RJUlMsIGFnZW50RGlyXSxcbiAgICB9LFxuICB9KTtcblxuICAvKipcbiAgICogUmV0dXJuIGEgd3JhcHBlciB0aGF0IHJ1bnMgQUZURVIgd29ya2Zsb3cgcHJvY2Vzc2VzLCB0aGVuIGFkZHMgb3VyIGxvYWRlci5cbiAgICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3b3JrZmxvdyBvdmVyd3JpdGVzIHR1cmJvcGFjayBydWxlcyAtIHdlIG5lZWQgdG9cbiAgICogbW9kaWZ5IHRoZW0gYWZ0ZXIgd29ya2Zsb3cgaXMgZG9uZS5cbiAgICovXG4gIHJldHVybiBhc3luYyAocGhhc2UsIGN0eCkgPT4ge1xuICAgIGNvbnN0IG5leHRDb25maWcgPSBhd2FpdCBiYXNlQ29uZmlnRm4ocGhhc2UsIGN0eCk7XG5cbiAgICAvLyBTZXQgdXAgQUdFTlRfU0VDUkVUIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgIGlmICghcHJvY2Vzcy5lbnYuQUdFTlRfU0VDUkVUKSB7XG4gICAgICBuZXh0Q29uZmlnLmVudiA9IHtcbiAgICAgICAgLi4ubmV4dENvbmZpZy5lbnYsXG4gICAgICAgIEFHRU5UX1NFQ1JFVDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbd2l0aEFnZW50XSBHZW5lcmF0ZWQgQUdFTlRfU0VDUkVUXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYWdlbnRQYXRoUmVnZXggfHwgYWdlbnRGaWxlUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV4dENvbmZpZztcbiAgICB9XG5cbiAgICAvLyBNb2RpZnkgdHVyYm9wYWNrIHJ1bGVzIHRvIGluY2x1ZGUgb3VyIGxvYWRlciBmb3IgYWdlbnQgZmlsZXNcbiAgICBjb25zdCBydWxlcyA9IChuZXh0Q29uZmlnLnR1cmJvcGFjaz8ucnVsZXMgfHwge30pIGFzIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFR1cmJvcGFja1J1bGVcbiAgICA+O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgW1wiKi50c1wiLCBcIioudHN4XCIsIFwiKi5qc1wiLCBcIiouanN4XCJdKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1J1bGUgPSBydWxlc1trZXldO1xuICAgICAgaWYgKCFleGlzdGluZ1J1bGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogV29ya2Zsb3cncyBydWxlIGhhczogY29uZGl0aW9uLmFsbCA9IFt7IG5vdDogcGF0aCB9LCB7IGNvbnRlbnQ6IC91c2Ugc3RlcHwuLi4vIH1dXG4gICAgICAgKiBXZSB3YW50OiBydW4gbG9hZGVyIGlmIHdvcmtmbG93J3MgY29uZGl0aW9ucyBtYXRjaCBPUiBpdCdzIGFuIGFnZW50IGZpbGUuXG4gICAgICAgKiBTbyB3ZSB3cmFwIGluOiBjb25kaXRpb24uYW55ID0gW2V4aXN0aW5nQ29uZGl0aW9uLCB7IHBhdGg6IGFnZW50UGF0aFJlZ2V4IH1dXG4gICAgICAgKi9cbiAgICAgIHJ1bGVzW2tleV0gPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nUnVsZSxcbiAgICAgICAgbG9hZGVyczogW2xvYWRlclBhdGgsIC4uLihleGlzdGluZ1J1bGUubG9hZGVycyB8fCBbXSldLFxuICAgICAgICBjb25kaXRpb246IHtcbiAgICAgICAgICBhbnk6IFtleGlzdGluZ1J1bGUuY29uZGl0aW9uLCB7IHBhdGg6IGFnZW50UGF0aFJlZ2V4IH1dLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIGNvbmZpZ3VyZSB3ZWJwYWNrIGZvciBub24tdHVyYm9wYWNrIGJ1aWxkc1xuICAgIGNvbnN0IGV4aXN0aW5nV2VicGFjayA9IG5leHRDb25maWcud2VicGFjaztcbiAgICBuZXh0Q29uZmlnLndlYnBhY2sgPSAod2VicGFja0NvbmZpZywgY29udGV4dCkgPT4ge1xuICAgICAgd2VicGFja0NvbmZpZy5tb2R1bGUucnVsZXMucHVzaCh7XG4gICAgICAgIHRlc3Q6IChyZXNvdXJjZVBhdGg6IHN0cmluZykgPT4gYWdlbnRGaWxlUGF0aHMuaW5jbHVkZXMocmVzb3VyY2VQYXRoKSxcbiAgICAgICAgdXNlOiBbeyBsb2FkZXI6IGxvYWRlclBhdGggfV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBleGlzdGluZ1dlYnBhY2s/Lih3ZWJwYWNrQ29uZmlnLCBjb250ZXh0KSA/PyB3ZWJwYWNrQ29uZmlnO1xuICAgIH07XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW3dpdGhBZ2VudF0gQWRkZWQgYWdlbnQgbG9hZGVyIHRvIHR1cmJvcGFjayBydWxlc1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENvbmZpZztcbiAgfTtcbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcImV4cGVyaW1lbnRhbC1hZ2VudFwiLFxuICBcInZlcnNpb25cIjogXCIwLjAuNFwiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJtb2R1bGVcIjogXCIuL2Rpc3QvaW5kZXgubWpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcInNpZGVFZmZlY3RzXCI6IHRydWUsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3QvKipcIlxuICBdLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9uZXh0XCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbmV4dC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9uZXh0Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L25leHQuanNcIlxuICAgIH0sXG4gICAgXCIuL25leHQvbG9hZGVyXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIuanNcIlxuICAgIH0sXG4gICAgXCIuL2NsaWVudFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2NsaWVudC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9jbGllbnQubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvY2xpZW50LmpzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJidWlsZFwiOiBcInRzdXBcIixcbiAgICBcImRldlwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwiY2xlYW5cIjogXCJybSAtcmYgLnR1cmJvICYmIHJtIC1yZiBub2RlX21vZHVsZXMgJiYgcm0gLXJmIGRpc3RcIixcbiAgICBcInJlbGVhc2VcIjogXCJwbnBtIGJ1aWxkICYmIG5wbSBwdWJsaXNoXCIsXG4gICAgXCJ0eXBlY2hlY2tcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3QgcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGhvbm8vbm9kZS1zZXJ2ZXJcIjogXCJeMS4xOS45XCIsXG4gICAgXCJAc3djL2NvcmVcIjogXCJeMS4xMC4wXCIsXG4gICAgXCJAdmVyY2VsL29pZGNcIjogXCJeMy4xLjBcIixcbiAgICBcImJldHRlci1hbGxcIjogXCJeMC4wLjVcIixcbiAgICBcImVycm9yZVwiOiBcIl4wLjguMlwiLFxuICAgIFwiZmFzdC1kZWVwLWVxdWFsXCI6IFwiXjMuMS4zXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwiaG9ub1wiOiBcIl40LjExLjZcIixcbiAgICBcInNhbmRib3hcIjogXCJeMS4wLjE4XCIsXG4gICAgXCJ1bGlkXCI6IFwiXjMuMC4yXCIsXG4gICAgXCJ6b2RcIjogXCJeNC4zLjZcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYWdlbnQvdHNjb25maWdcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMTEuMjRcIixcbiAgICBcImRvdGVudlwiOiBcIl4xNy4yLjNcIixcbiAgICBcIm5leHRcIjogXCJeMTYuMC4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMC4yXCIsXG4gICAgXCJ0eXBlLWZlc3RcIjogXCJeNS40LjJcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCI1LjUuNFwiLFxuICAgIFwidml0ZXN0XCI6IFwiXjMuMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImFpXCI6IFwiXjYuMC4wXCIsXG4gICAgXCJ3b3JrZmxvd1wiOiBcImh0dHBzOi8vd29ya2Zsb3ctZG9jcy03ZXZ1cGI2NGQudmVyY2VsLnNoL3dvcmtmbG93LnRnelwiXG4gIH0sXG4gIFwicHVibGlzaENvbmZpZ1wiOiB7XG4gICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBd0I7QUFDeEIsU0FBb0I7QUFDcEIsV0FBc0I7OztBQ0Z0QjtBQUFBLEVBQ0UsTUFBUTtBQUFBLEVBQ1IsU0FBVztBQUFBLEVBQ1gsTUFBUTtBQUFBLEVBQ1IsUUFBVTtBQUFBLEVBQ1YsT0FBUztBQUFBLEVBQ1QsYUFBZTtBQUFBLEVBQ2YsU0FBVztBQUFBLEVBQ1gsT0FBUztBQUFBLElBQ1A7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFXO0FBQUEsSUFDVCxLQUFLO0FBQUEsTUFDSCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLE1BQ2YsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNB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