experimental-agent 0.2.3 → 0.4.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.
- package/README.md +103 -241
- package/dist/adapter-zgOel4wW.d.mts +256 -0
- package/dist/adapter-zgOel4wW.d.ts +256 -0
- package/dist/chunk-BFFNCESS.mjs +302 -0
- package/dist/chunk-C4VSUEY2.mjs +72 -0
- package/dist/chunk-GKASMIBR.mjs +50 -0
- package/dist/chunk-IV75IMEW.mjs +328 -0
- package/dist/chunk-JO3JDCH5.mjs +107 -0
- package/dist/chunk-MSTM6W3Y.mjs +99 -0
- package/dist/chunk-MSWINCCM.mjs +128 -0
- package/dist/chunk-RT72C52I.mjs +324 -0
- package/dist/chunk-ZUFJJYC4.mjs +150 -0
- package/dist/{handler-FRUPZ4LX.mjs → docker-QPCLWLYR.mjs} +3 -4
- package/dist/entry-6HYg5qqg.d.mts +36 -0
- package/dist/entry-BrWOmEK2.d.ts +36 -0
- package/dist/index.d.mts +401 -18
- package/dist/index.d.ts +401 -18
- package/dist/index.js +3396 -5500
- package/dist/index.mjs +3511 -1166
- package/dist/lifecycle-workflow-steps.d.mts +5 -0
- package/dist/lifecycle-workflow-steps.d.ts +5 -0
- package/dist/lifecycle-workflow-steps.js +263 -0
- package/dist/lifecycle-workflow-steps.mjs +9 -0
- package/dist/lifecycle-workflow.d.mts +6 -6
- package/dist/lifecycle-workflow.d.ts +6 -6
- package/dist/lifecycle-workflow.js +192 -905
- package/dist/lifecycle-workflow.mjs +3 -1
- package/dist/local-KJ3BSIFJ.mjs +8 -0
- package/dist/next/loader.js +31 -7
- package/dist/next/loader.mjs +1 -1
- package/dist/next.js +35 -8
- package/dist/next.mjs +6 -3
- package/dist/{process-manager-JDUJDYGU.mjs → process-manager-WQHAIVRB.mjs} +1 -1
- package/dist/sandbox.d.mts +6 -0
- package/dist/sandbox.d.ts +6 -0
- package/dist/sandbox.js +1070 -0
- package/dist/sandbox.mjs +19 -0
- package/dist/steps-BIsP57pm.d.mts +173 -0
- package/dist/steps-DShnXBLf.d.ts +173 -0
- package/dist/storage.d.mts +17 -0
- package/dist/storage.d.ts +17 -0
- package/dist/storage.js +368 -0
- package/dist/storage.mjs +16 -0
- package/dist/vercel-QZ6INPMV.mjs +11 -0
- package/package.json +29 -5
- package/dist/agent-workflow.d.mts +0 -30
- package/dist/agent-workflow.d.ts +0 -30
- package/dist/agent-workflow.js +0 -5433
- package/dist/agent-workflow.mjs +0 -14
- package/dist/chunk-7M6UPURS.mjs +0 -75
- package/dist/chunk-AML2VCQS.mjs +0 -1287
- package/dist/chunk-FQ67QZOI.mjs +0 -75
- package/dist/chunk-NO7RHGTH.mjs +0 -2367
- package/dist/chunk-NXDVNJRS.mjs +0 -106
- package/dist/chunk-OZZVS6L5.mjs +0 -139
- package/dist/chunk-SJVFFE5D.mjs +0 -402
- package/dist/chunk-TAXLUVIC.mjs +0 -1
- package/dist/chunk-TGNVXSMX.mjs +0 -399
- package/dist/chunk-YRYXN7W4.mjs +0 -48
- package/dist/chunk-ZIAHPXOJ.mjs +0 -595
- package/dist/client-BKA7XBGW.mjs +0 -15
- package/dist/client-CEeSFGva.d.mts +0 -2376
- package/dist/client-CEeSFGva.d.ts +0 -2376
- package/dist/docker-FB2MJTHJ.mjs +0 -12
- package/dist/local-fs-handlers-SYOCKTPN.mjs +0 -447
- package/dist/sandbox-UENKQV3T.mjs +0 -21
- package/dist/storage-LSDMRW73.mjs +0 -20
- package/dist/vercel-SD3JTECG.mjs +0 -20
- package/dist/vercel-sdk-I6A4MVAN.mjs +0 -8
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
// package.json
|
|
2
|
+
var package_default = {
|
|
3
|
+
name: "experimental-agent",
|
|
4
|
+
version: "0.4.0",
|
|
5
|
+
main: "./dist/index.js",
|
|
6
|
+
module: "./dist/index.mjs",
|
|
7
|
+
types: "./dist/index.d.ts",
|
|
8
|
+
sideEffects: true,
|
|
9
|
+
license: "MIT",
|
|
10
|
+
files: [
|
|
11
|
+
"dist/**"
|
|
12
|
+
],
|
|
13
|
+
exports: {
|
|
14
|
+
".": {
|
|
15
|
+
types: "./dist/index.d.ts",
|
|
16
|
+
import: "./dist/index.mjs",
|
|
17
|
+
require: "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"./storage": {
|
|
20
|
+
types: "./dist/storage.d.ts",
|
|
21
|
+
import: "./dist/storage.mjs",
|
|
22
|
+
require: "./dist/storage.js"
|
|
23
|
+
},
|
|
24
|
+
"./sandbox": {
|
|
25
|
+
types: "./dist/sandbox.d.ts",
|
|
26
|
+
import: "./dist/sandbox.mjs",
|
|
27
|
+
require: "./dist/sandbox.js"
|
|
28
|
+
},
|
|
29
|
+
"./next": {
|
|
30
|
+
types: "./dist/next.d.ts",
|
|
31
|
+
import: "./dist/next.mjs",
|
|
32
|
+
require: "./dist/next.js"
|
|
33
|
+
},
|
|
34
|
+
"./next/loader": {
|
|
35
|
+
types: "./dist/next/loader.d.ts",
|
|
36
|
+
import: "./dist/next/loader.mjs",
|
|
37
|
+
require: "./dist/next/loader.js"
|
|
38
|
+
},
|
|
39
|
+
"./client": {
|
|
40
|
+
types: "./dist/client.d.ts",
|
|
41
|
+
import: "./dist/client.mjs",
|
|
42
|
+
require: "./dist/client.js"
|
|
43
|
+
},
|
|
44
|
+
"./lifecycle-workflow": {
|
|
45
|
+
types: "./dist/lifecycle-workflow.d.ts",
|
|
46
|
+
import: "./dist/lifecycle-workflow.mjs",
|
|
47
|
+
require: "./dist/lifecycle-workflow.js"
|
|
48
|
+
},
|
|
49
|
+
"./lifecycle-workflow-steps": {
|
|
50
|
+
types: "./dist/lifecycle-workflow-steps.d.ts",
|
|
51
|
+
import: "./dist/lifecycle-workflow-steps.mjs",
|
|
52
|
+
require: "./dist/lifecycle-workflow-steps.js"
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
scripts: {
|
|
56
|
+
build: "tsup",
|
|
57
|
+
dev: "tsup --watch",
|
|
58
|
+
clean: "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
|
|
59
|
+
release: "pnpm build && npm publish",
|
|
60
|
+
typecheck: "tsc --noEmit",
|
|
61
|
+
test: "vitest run",
|
|
62
|
+
"test:watch": "vitest"
|
|
63
|
+
},
|
|
64
|
+
dependencies: {
|
|
65
|
+
"@swc/core": "^1.10.0",
|
|
66
|
+
"@vercel/kv2": "^0.0.18",
|
|
67
|
+
"@vercel/oidc": "^3.1.0",
|
|
68
|
+
"@vercel/sandbox": "1.7.1",
|
|
69
|
+
"@workflow/serde": "4.1.0-beta.2",
|
|
70
|
+
"better-all": "^0.0.5",
|
|
71
|
+
errore: "^0.14.0",
|
|
72
|
+
"fast-deep-equal": "^3.1.3",
|
|
73
|
+
ulid: "^3.0.2",
|
|
74
|
+
zod: "^4.3.6"
|
|
75
|
+
},
|
|
76
|
+
devDependencies: {
|
|
77
|
+
"@agent/tsconfig": "workspace:*",
|
|
78
|
+
"@ai-sdk/react": "^3.0.88",
|
|
79
|
+
"@types/node": "^20.11.24",
|
|
80
|
+
dotenv: "^17.2.3",
|
|
81
|
+
next: "^16.0.0",
|
|
82
|
+
react: "^19.2.4",
|
|
83
|
+
tsup: "^8.0.2",
|
|
84
|
+
typescript: "5.5.4",
|
|
85
|
+
vitest: "^3.0.0",
|
|
86
|
+
workflow: "4.1.0-beta.60"
|
|
87
|
+
},
|
|
88
|
+
peerDependencies: {
|
|
89
|
+
ai: "^6.0.0"
|
|
90
|
+
},
|
|
91
|
+
publishConfig: {
|
|
92
|
+
access: "public"
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export {
|
|
97
|
+
package_default
|
|
98
|
+
};
|
|
99
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJ7XG4gIFwibmFtZVwiOiBcImV4cGVyaW1lbnRhbC1hZ2VudFwiLFxuICBcInZlcnNpb25cIjogXCIwLjQuMFwiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJtb2R1bGVcIjogXCIuL2Rpc3QvaW5kZXgubWpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcInNpZGVFZmZlY3RzXCI6IHRydWUsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3QvKipcIlxuICBdLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9zdG9yYWdlXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3Qvc3RvcmFnZS5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9zdG9yYWdlLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L3N0b3JhZ2UuanNcIlxuICAgIH0sXG4gICAgXCIuL3NhbmRib3hcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9zYW5kYm94LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L3NhbmRib3gubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3Qvc2FuZGJveC5qc1wiXG4gICAgfSxcbiAgICBcIi4vbmV4dFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbmV4dC5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9uZXh0LmpzXCJcbiAgICB9LFxuICAgIFwiLi9uZXh0L2xvYWRlclwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L25leHQvbG9hZGVyLmpzXCJcbiAgICB9LFxuICAgIFwiLi9jbGllbnRcIjoge1xuICAgICAgXCJ0eXBlc1wiOiBcIi4vZGlzdC9jbGllbnQuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvY2xpZW50Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2NsaWVudC5qc1wiXG4gICAgfSxcbiAgICBcIi4vbGlmZWN5Y2xlLXdvcmtmbG93XCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbGlmZWN5Y2xlLXdvcmtmbG93LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2xpZmVjeWNsZS13b3JrZmxvdy5tanNcIixcbiAgICAgIFwicmVxdWlyZVwiOiBcIi4vZGlzdC9saWZlY3ljbGUtd29ya2Zsb3cuanNcIlxuICAgIH0sXG4gICAgXCIuL2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwc1wiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2xpZmVjeWNsZS13b3JrZmxvdy1zdGVwcy5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9saWZlY3ljbGUtd29ya2Zsb3ctc3RlcHMubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvbGlmZWN5Y2xlLXdvcmtmbG93LXN0ZXBzLmpzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJidWlsZFwiOiBcInRzdXBcIixcbiAgICBcImRldlwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwiY2xlYW5cIjogXCJybSAtcmYgLnR1cmJvICYmIHJtIC1yZiBub2RlX21vZHVsZXMgJiYgcm0gLXJmIGRpc3RcIixcbiAgICBcInJlbGVhc2VcIjogXCJwbnBtIGJ1aWxkICYmIG5wbSBwdWJsaXNoXCIsXG4gICAgXCJ0eXBlY2hlY2tcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3QgcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQHN3Yy9jb3JlXCI6IFwiXjEuMTAuMFwiLFxuICAgIFwiQHZlcmNlbC9rdjJcIjogXCJeMC4wLjE4XCIsXG4gICAgXCJAdmVyY2VsL29pZGNcIjogXCJeMy4xLjBcIixcbiAgICBcIkB2ZXJjZWwvc2FuZGJveFwiOiBcIjEuNy4xXCIsXG4gICAgXCJAd29ya2Zsb3cvc2VyZGVcIjogXCI0LjEuMC1iZXRhLjJcIixcbiAgICBcImJldHRlci1hbGxcIjogXCJeMC4wLjVcIixcbiAgICBcImVycm9yZVwiOiBcIl4wLjE0LjBcIixcbiAgICBcImZhc3QtZGVlcC1lcXVhbFwiOiBcIl4zLjEuM1wiLFxuICAgIFwidWxpZFwiOiBcIl4zLjAuMlwiLFxuICAgIFwiem9kXCI6IFwiXjQuMy42XCJcbiAgfSxcbiAgXCJkZXZEZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGFnZW50L3RzY29uZmlnXCI6IFwid29ya3NwYWNlOipcIixcbiAgICBcIkBhaS1zZGsvcmVhY3RcIjogXCJeMy4wLjg4XCIsXG4gICAgXCJAdHlwZXMvbm9kZVwiOiBcIl4yMC4xMS4yNFwiLFxuICAgIFwiZG90ZW52XCI6IFwiXjE3LjIuM1wiLFxuICAgIFwibmV4dFwiOiBcIl4xNi4wLjBcIixcbiAgICBcInJlYWN0XCI6IFwiXjE5LjIuNFwiLFxuICAgIFwidHN1cFwiOiBcIl44LjAuMlwiLFxuICAgIFwidHlwZXNjcmlwdFwiOiBcIjUuNS40XCIsXG4gICAgXCJ2aXRlc3RcIjogXCJeMy4wLjBcIixcbiAgICBcIndvcmtmbG93XCI6IFwiNC4xLjAtYmV0YS42MFwiXG4gIH0sXG4gIFwicGVlckRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJhaVwiOiBcIl42LjAuMFwiXG4gIH0sXG4gIFwicHVibGlzaENvbmZpZ1wiOiB7XG4gICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUE7QUFBQSxFQUNFLE1BQVE7QUFBQSxFQUNSLFNBQVc7QUFBQSxFQUNYLE1BQVE7QUFBQSxFQUNSLFFBQVU7QUFBQSxFQUNWLE9BQVM7QUFBQSxFQUNULGFBQWU7QUFBQSxFQUNmLFNBQVc7QUFBQSxFQUNYLE9BQVM7QUFBQSxJQUNQO0FBQUEsRUFDRjtBQUFBLEVBQ0EsU0FBVztBQUFBLElBQ1QsS0FBSztBQUFBLE1BQ0gsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLGFBQWE7QUFBQSxNQUNYLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSxhQUFhO0FBQUEsTUFDWCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLE1BQ2YsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLFlBQVk7QUFBQSxNQUNWLE9BQVM7QUFBQSxNQUNULFFBQVU7QUFBQSxNQUNWLFNBQVc7QUFBQSxJQUNiO0FBQUEsSUFDQSx3QkFBd0I7QUFBQSxNQUN0QixPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsOEJBQThCO0FBQUEsTUFDNUIsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFXO0FBQUEsSUFDVCxPQUFTO0FBQUEsSUFDVCxLQUFPO0FBQUEsSUFDUCxPQUFTO0FBQUEsSUFDVCxTQUFXO0FBQUEsSUFDWCxXQUFhO0FBQUEsSUFDYixNQUFRO0FBQUEsSUFDUixjQUFjO0FBQUEsRUFDaEI7QUFBQSxFQUNBLGNBQWdCO0FBQUEsSUFDZCxhQUFhO0FBQUEsSUFDYixlQUFlO0FBQUEsSUFDZixnQkFBZ0I7QUFBQSxJQUNoQixtQkFBbUI7QUFBQSxJQUNuQixtQkFBbUI7QUFBQSxJQUNuQixjQUFjO0FBQUEsSUFDZCxRQUFVO0FBQUEsSUFDVixtQkFBbUI7QUFBQSxJQUNuQixNQUFRO0FBQUEsSUFDUixLQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ0EsaUJBQW1CO0FBQUEsSUFDakIsbUJBQW1CO0FBQUEsSUFDbkIsaUJBQWlCO0FBQUEsSUFDakIsZUFBZTtBQUFBLElBQ2YsUUFBVTtBQUFBLElBQ1YsTUFBUTtBQUFBLElBQ1IsT0FBUztBQUFBLElBQ1QsTUFBUTtBQUFBLElBQ1IsWUFBYztBQUFBLElBQ2QsUUFBVTtBQUFBLElBQ1YsVUFBWTtBQUFBLEVBQ2Q7QUFBQSxFQUNBLGtCQUFvQjtBQUFBLElBQ2xCLElBQU07QUFBQSxFQUNSO0FBQUEsRUFDQSxlQUFpQjtBQUFBLElBQ2YsUUFBVTtBQUFBLEVBQ1o7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
// src/utils/logger.ts
|
|
2
|
+
var LOG_LEVEL_PRIORITY = {
|
|
3
|
+
info: 0,
|
|
4
|
+
warn: 1,
|
|
5
|
+
error: 2,
|
|
6
|
+
silent: 3
|
|
7
|
+
};
|
|
8
|
+
function getLevel(config) {
|
|
9
|
+
return config.level ?? "warn";
|
|
10
|
+
}
|
|
11
|
+
function getPrefix(config) {
|
|
12
|
+
return config.prefix ?? "agent";
|
|
13
|
+
}
|
|
14
|
+
function shouldLog(config, level) {
|
|
15
|
+
return LOG_LEVEL_PRIORITY[level] >= LOG_LEVEL_PRIORITY[getLevel(config)];
|
|
16
|
+
}
|
|
17
|
+
function formatTag(config, subsystem) {
|
|
18
|
+
return `[${getPrefix(config)}:${config.name}:${subsystem}]`;
|
|
19
|
+
}
|
|
20
|
+
function formatData(context, extra) {
|
|
21
|
+
const merged = { ...context, ...extra };
|
|
22
|
+
const entries = Object.entries(merged).filter(
|
|
23
|
+
([, v]) => v !== void 0 && v !== null
|
|
24
|
+
);
|
|
25
|
+
if (entries.length === 0) {
|
|
26
|
+
return void 0;
|
|
27
|
+
}
|
|
28
|
+
return Object.fromEntries(entries);
|
|
29
|
+
}
|
|
30
|
+
var Logger = class _Logger {
|
|
31
|
+
subsystem;
|
|
32
|
+
config;
|
|
33
|
+
context;
|
|
34
|
+
constructor({
|
|
35
|
+
subsystem,
|
|
36
|
+
config,
|
|
37
|
+
context
|
|
38
|
+
}) {
|
|
39
|
+
this.subsystem = subsystem;
|
|
40
|
+
this.config = config;
|
|
41
|
+
this.context = context ?? {};
|
|
42
|
+
}
|
|
43
|
+
child({
|
|
44
|
+
subsystem,
|
|
45
|
+
context
|
|
46
|
+
}) {
|
|
47
|
+
return new _Logger({
|
|
48
|
+
config: this.config,
|
|
49
|
+
subsystem: subsystem ? `${this.subsystem}:${subsystem}` : this.subsystem,
|
|
50
|
+
context: { ...this.context, ...context }
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
withContext(context) {
|
|
54
|
+
return new _Logger({
|
|
55
|
+
config: this.config,
|
|
56
|
+
subsystem: this.subsystem,
|
|
57
|
+
context: { ...this.context, ...context }
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
info(message, data) {
|
|
61
|
+
if (!shouldLog(this.config, "info")) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const d = formatData(this.context, data);
|
|
65
|
+
if (d) {
|
|
66
|
+
console.info(formatTag(this.config, this.subsystem), message, d);
|
|
67
|
+
} else {
|
|
68
|
+
console.info(formatTag(this.config, this.subsystem), message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
warn(message, data) {
|
|
72
|
+
if (!shouldLog(this.config, "warn")) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const d = formatData(this.context, data);
|
|
76
|
+
if (d) {
|
|
77
|
+
console.warn(formatTag(this.config, this.subsystem), message, d);
|
|
78
|
+
} else {
|
|
79
|
+
console.warn(formatTag(this.config, this.subsystem), message);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
error(message, data) {
|
|
83
|
+
if (!shouldLog(this.config, "error")) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
const d = formatData(this.context, data);
|
|
87
|
+
if (d) {
|
|
88
|
+
console.error(formatTag(this.config, this.subsystem), message, d);
|
|
89
|
+
} else {
|
|
90
|
+
console.error(formatTag(this.config, this.subsystem), message);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Returns a function that, when called, logs the elapsed time at info level.
|
|
95
|
+
* Pass `logOnStart: true` to also log when the timer begins.
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* const done = log.time("sandbox setup", { sandboxId }, { logOnStart: true });
|
|
99
|
+
* await setup();
|
|
100
|
+
* done(); // start: [agent:default:sandbox] sandbox setup { sandboxId: '...' }
|
|
101
|
+
* // end: [agent:default:sandbox] sandbox setup { sandboxId: '...', durationMs: 123 }
|
|
102
|
+
*/
|
|
103
|
+
time(message, data, opts) {
|
|
104
|
+
if (opts?.logOnStart) {
|
|
105
|
+
this.info(`[start] ${message}`, data);
|
|
106
|
+
}
|
|
107
|
+
const t0 = Date.now();
|
|
108
|
+
return (endData) => {
|
|
109
|
+
this.info(opts?.logOnStart ? `[end] ${message}` : message, {
|
|
110
|
+
...data,
|
|
111
|
+
...endData,
|
|
112
|
+
durationMs: Date.now() - t0
|
|
113
|
+
});
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
function createLogger({
|
|
118
|
+
config,
|
|
119
|
+
subsystem,
|
|
120
|
+
context
|
|
121
|
+
}) {
|
|
122
|
+
return new Logger({ config, subsystem, context });
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export {
|
|
126
|
+
createLogger
|
|
127
|
+
};
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3V0aWxzL2xvZ2dlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSBcImluZm9cIiB8IFwid2FyblwiIHwgXCJlcnJvclwiIHwgXCJzaWxlbnRcIjtcblxuY29uc3QgTE9HX0xFVkVMX1BSSU9SSVRZOiBSZWNvcmQ8TG9nTGV2ZWwsIG51bWJlcj4gPSB7XG4gIGluZm86IDAsXG4gIHdhcm46IDEsXG4gIGVycm9yOiAyLFxuICBzaWxlbnQ6IDMsXG59O1xuXG5leHBvcnQgdHlwZSBMb2dDb250ZXh0ID0ge1xuICBzZXNzaW9uSWQ/OiBzdHJpbmc7XG4gIG1lc3NhZ2VJZD86IHN0cmluZztcbiAgc2FuZGJveElkPzogc3RyaW5nO1xuICBba2V5OiBzdHJpbmddOiB1bmtub3duO1xufTtcblxuZXhwb3J0IHR5cGUgTG9nZ2luZ0NvbmZpZyA9IHtcbiAgbGV2ZWw/OiBMb2dMZXZlbDtcbiAgLyoqXG4gICAqIFRvcC1sZXZlbCBsYWJlbCBmb3IgYWxsIGxvZyBsaW5lcy5cbiAgICogQGRlZmF1bHQgXCJhZ2VudFwiXG4gICAqIEBleGFtcGxlIFwibXktYXBwXCIgXHUyMTkyIFtteS1hcHA6ZGVmYXVsdDp3b3JrZmxvd11cbiAgICovXG4gIHByZWZpeD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbn07XG5cbmZ1bmN0aW9uIGdldExldmVsKGNvbmZpZzogTG9nZ2luZ0NvbmZpZyk6IExvZ0xldmVsIHtcbiAgcmV0dXJuIGNvbmZpZy5sZXZlbCA/PyBcIndhcm5cIjtcbn1cblxuZnVuY3Rpb24gZ2V0UHJlZml4KGNvbmZpZzogTG9nZ2luZ0NvbmZpZyk6IHN0cmluZyB7XG4gIHJldHVybiBjb25maWcucHJlZml4ID8/IFwiYWdlbnRcIjtcbn1cblxuZnVuY3Rpb24gc2hvdWxkTG9nKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgbGV2ZWw6IExvZ0xldmVsKTogYm9vbGVhbiB7XG4gIHJldHVybiBMT0dfTEVWRUxfUFJJT1JJVFlbbGV2ZWxdID49IExPR19MRVZFTF9QUklPUklUWVtnZXRMZXZlbChjb25maWcpXTtcbn1cblxuZnVuY3Rpb24gZm9ybWF0VGFnKGNvbmZpZzogTG9nZ2luZ0NvbmZpZywgc3Vic3lzdGVtOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFske2dldFByZWZpeChjb25maWcpfToke2NvbmZpZy5uYW1lfToke3N1YnN5c3RlbX1dYDtcbn1cblxuZnVuY3Rpb24gZm9ybWF0RGF0YShcbiAgY29udGV4dDogTG9nQ29udGV4dCxcbiAgZXh0cmE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICBjb25zdCBtZXJnZWQgPSB7IC4uLmNvbnRleHQsIC4uLmV4dHJhIH07XG4gIGNvbnN0IGVudHJpZXMgPSBPYmplY3QuZW50cmllcyhtZXJnZWQpLmZpbHRlcihcbiAgICAoWywgdl0pID0+IHYgIT09IHVuZGVmaW5lZCAmJiB2ICE9PSBudWxsXG4gICk7XG4gIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIHJlYWRvbmx5IHN1YnN5c3RlbTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogTG9nZ2luZ0NvbmZpZztcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBMb2dDb250ZXh0O1xuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBzdWJzeXN0ZW0sXG4gICAgY29uZmlnLFxuICAgIGNvbnRleHQsXG4gIH06IHtcbiAgICBzdWJzeXN0ZW06IHN0cmluZztcbiAgICBjb25maWc6IExvZ2dpbmdDb25maWc7XG4gICAgY29udGV4dD86IExvZ0NvbnRleHQ7XG4gIH0pIHtcbiAgICB0aGlzLnN1YnN5c3RlbSA9IHN1YnN5c3RlbTtcbiAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZztcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0ID8/IHt9O1xuICB9XG5cbiAgY2hpbGQoe1xuICAgIHN1YnN5c3RlbSxcbiAgICBjb250ZXh0LFxuICB9OiB7XG4gICAgc3Vic3lzdGVtPzogc3RyaW5nO1xuICAgIGNvbnRleHQ/OiBMb2dDb250ZXh0O1xuICB9KTogTG9nZ2VyIHtcbiAgICByZXR1cm4gbmV3IExvZ2dlcih7XG4gICAgICBjb25maWc6IHRoaXMuY29uZmlnLFxuICAgICAgc3Vic3lzdGVtOiBzdWJzeXN0ZW0gPyBgJHt0aGlzLnN1YnN5c3RlbX06JHtzdWJzeXN0ZW19YCA6IHRoaXMuc3Vic3lzdGVtLFxuICAgICAgY29udGV4dDogeyAuLi50aGlzLmNvbnRleHQsIC4uLmNvbnRleHQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHdpdGhDb250ZXh0KGNvbnRleHQ6IExvZ0NvbnRleHQpOiBMb2dnZXIge1xuICAgIHJldHVybiBuZXcgTG9nZ2VyKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICBzdWJzeXN0ZW06IHRoaXMuc3Vic3lzdGVtLFxuICAgICAgY29udGV4dDogeyAuLi50aGlzLmNvbnRleHQsIC4uLmNvbnRleHQgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAoIXNob3VsZExvZyh0aGlzLmNvbmZpZywgXCJpbmZvXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBmb3JtYXREYXRhKHRoaXMuY29udGV4dCwgZGF0YSk7XG4gICAgaWYgKGQpIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSwgZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUuaW5mbyhmb3JtYXRUYWcodGhpcy5jb25maWcsIHRoaXMuc3Vic3lzdGVtKSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICghc2hvdWxkTG9nKHRoaXMuY29uZmlnLCBcIndhcm5cIikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IGZvcm1hdERhdGEodGhpcy5jb250ZXh0LCBkYXRhKTtcbiAgICBpZiAoZCkge1xuICAgICAgY29uc29sZS53YXJuKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlLCBkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIGlmICghc2hvdWxkTG9nKHRoaXMuY29uZmlnLCBcImVycm9yXCIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGQgPSBmb3JtYXREYXRhKHRoaXMuY29udGV4dCwgZGF0YSk7XG4gICAgaWYgKGQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0VGFnKHRoaXMuY29uZmlnLCB0aGlzLnN1YnN5c3RlbSksIG1lc3NhZ2UsIGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKGZvcm1hdFRhZyh0aGlzLmNvbmZpZywgdGhpcy5zdWJzeXN0ZW0pLCBtZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCBsb2dzIHRoZSBlbGFwc2VkIHRpbWUgYXQgaW5mbyBsZXZlbC5cbiAgICogUGFzcyBgbG9nT25TdGFydDogdHJ1ZWAgdG8gYWxzbyBsb2cgd2hlbiB0aGUgdGltZXIgYmVnaW5zLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBjb25zdCBkb25lID0gbG9nLnRpbWUoXCJzYW5kYm94IHNldHVwXCIsIHsgc2FuZGJveElkIH0sIHsgbG9nT25TdGFydDogdHJ1ZSB9KTtcbiAgICogYXdhaXQgc2V0dXAoKTtcbiAgICogZG9uZSgpOyAvLyBzdGFydDogW2FnZW50OmRlZmF1bHQ6c2FuZGJveF0gc2FuZGJveCBzZXR1cCB7IHNhbmRib3hJZDogJy4uLicgfVxuICAgKiAgICAgICAgIC8vIGVuZDogICBbYWdlbnQ6ZGVmYXVsdDpzYW5kYm94XSBzYW5kYm94IHNldHVwIHsgc2FuZGJveElkOiAnLi4uJywgZHVyYXRpb25NczogMTIzIH1cbiAgICovXG4gIHRpbWUoXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBvcHRzPzogeyBsb2dPblN0YXJ0PzogYm9vbGVhbiB9XG4gICk6IChlbmREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZvaWQge1xuICAgIGlmIChvcHRzPy5sb2dPblN0YXJ0KSB7XG4gICAgICB0aGlzLmluZm8oYFtzdGFydF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH1cbiAgICBjb25zdCB0MCA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIChlbmREYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgIHRoaXMuaW5mbyhvcHRzPy5sb2dPblN0YXJ0ID8gYFtlbmRdICR7bWVzc2FnZX1gIDogbWVzc2FnZSwge1xuICAgICAgICAuLi5kYXRhLFxuICAgICAgICAuLi5lbmREYXRhLFxuICAgICAgICBkdXJhdGlvbk1zOiBEYXRlLm5vdygpIC0gdDAsXG4gICAgICB9KTtcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMb2dnZXIoe1xuICBjb25maWcsXG4gIHN1YnN5c3RlbSxcbiAgY29udGV4dCxcbn06IHtcbiAgY29uZmlnOiBMb2dnaW5nQ29uZmlnO1xuICBzdWJzeXN0ZW06IHN0cmluZztcbiAgY29udGV4dD86IExvZ0NvbnRleHQ7XG59KTogTG9nZ2VyIHtcbiAgcmV0dXJuIG5ldyBMb2dnZXIoeyBjb25maWcsIHN1YnN5c3RlbSwgY29udGV4dCB9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFFQSxJQUFNLHFCQUErQztBQUFBLEVBQ25ELE1BQU07QUFBQSxFQUNOLE1BQU07QUFBQSxFQUNOLE9BQU87QUFBQSxFQUNQLFFBQVE7QUFDVjtBQW9CQSxTQUFTLFNBQVMsUUFBaUM7QUFDakQsU0FBTyxPQUFPLFNBQVM7QUFDekI7QUFFQSxTQUFTLFVBQVUsUUFBK0I7QUFDaEQsU0FBTyxPQUFPLFVBQVU7QUFDMUI7QUFFQSxTQUFTLFVBQVUsUUFBdUIsT0FBMEI7QUFDbEUsU0FBTyxtQkFBbUIsS0FBSyxLQUFLLG1CQUFtQixTQUFTLE1BQU0sQ0FBQztBQUN6RTtBQUVBLFNBQVMsVUFBVSxRQUF1QixXQUEyQjtBQUNuRSxTQUFPLElBQUksVUFBVSxNQUFNLENBQUMsSUFBSSxPQUFPLElBQUksSUFBSSxTQUFTO0FBQzFEO0FBRUEsU0FBUyxXQUNQLFNBQ0EsT0FDcUM7QUFDckMsUUFBTSxTQUFTLEVBQUUsR0FBRyxTQUFTLEdBQUcsTUFBTTtBQUN0QyxRQUFNLFVBQVUsT0FBTyxRQUFRLE1BQU0sRUFBRTtBQUFBLElBQ3JDLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxNQUFNLFVBQWEsTUFBTTtBQUFBLEVBQ3RDO0FBQ0EsTUFBSSxRQUFRLFdBQVcsR0FBRztBQUN4QixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sT0FBTyxZQUFZLE9BQU87QUFDbkM7QUFFTyxJQUFNLFNBQU4sTUFBTSxRQUFPO0FBQUEsRUFDVDtBQUFBLEVBQ1E7QUFBQSxFQUNBO0FBQUEsRUFFakIsWUFBWTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFB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
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import {
|
|
2
|
+
sandboxLifecycleWorkflow
|
|
3
|
+
} from "./chunk-GKASMIBR.mjs";
|
|
4
|
+
|
|
5
|
+
// src/sandbox/bindings/vercel.ts
|
|
6
|
+
import { start as startWorkflow } from "workflow/api";
|
|
7
|
+
async function loadSandboxSDK() {
|
|
8
|
+
return (await import("@vercel/sandbox")).Sandbox;
|
|
9
|
+
}
|
|
10
|
+
var MAX_TIMEOUT_MS = 5 * 60 * 60 * 1e3;
|
|
11
|
+
var HOME_DIR = "/home/vercel-sandbox";
|
|
12
|
+
var DEFAULT_VCPUS = 2;
|
|
13
|
+
function isSandboxGoneError(e) {
|
|
14
|
+
if (!(e instanceof Error)) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const status = e.response?.status ?? e.cause?.response?.status;
|
|
18
|
+
if (status === 410 || status === 422) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
const msg = e.message || String(e);
|
|
22
|
+
return msg.includes("Expected a stream of command data") || msg.includes("Expected a stream of logs");
|
|
23
|
+
}
|
|
24
|
+
var getTestCredentials = () => process.env.NODE_ENV === "test" ? {
|
|
25
|
+
token: process.env.TEST_VERCEL_TOKEN,
|
|
26
|
+
teamId: process.env.TEST_VERCEL_TEAM_ID,
|
|
27
|
+
projectId: process.env.TEST_VERCEL_PROJECT_ID
|
|
28
|
+
} : {};
|
|
29
|
+
async function createSdk({
|
|
30
|
+
resources,
|
|
31
|
+
ports,
|
|
32
|
+
networkPolicy,
|
|
33
|
+
snapshotId
|
|
34
|
+
}) {
|
|
35
|
+
const SandboxSDK = await loadSandboxSDK();
|
|
36
|
+
const base = {
|
|
37
|
+
resources,
|
|
38
|
+
timeout: MAX_TIMEOUT_MS,
|
|
39
|
+
...ports ? { ports } : {},
|
|
40
|
+
...networkPolicy ? { networkPolicy } : {},
|
|
41
|
+
...getTestCredentials()
|
|
42
|
+
};
|
|
43
|
+
if (snapshotId) {
|
|
44
|
+
return SandboxSDK.create({
|
|
45
|
+
...base,
|
|
46
|
+
source: { type: "snapshot", snapshotId }
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return SandboxSDK.create(base);
|
|
50
|
+
}
|
|
51
|
+
async function createSetupSnapshot({
|
|
52
|
+
sandboxOpts,
|
|
53
|
+
run,
|
|
54
|
+
storage,
|
|
55
|
+
snapshotVersion,
|
|
56
|
+
log
|
|
57
|
+
}) {
|
|
58
|
+
let tempSdk = null;
|
|
59
|
+
try {
|
|
60
|
+
tempSdk = await createSdk(sandboxOpts);
|
|
61
|
+
const tempInstance = new VercelSandboxInstance(tempSdk);
|
|
62
|
+
await run(tempInstance);
|
|
63
|
+
const snapshot = await tempSdk.snapshot();
|
|
64
|
+
await storage.setup.set(snapshotVersion, {
|
|
65
|
+
version: snapshotVersion,
|
|
66
|
+
snapshotId: snapshot.snapshotId,
|
|
67
|
+
createdAt: Date.now(),
|
|
68
|
+
lastUsedAt: null
|
|
69
|
+
});
|
|
70
|
+
await tempSdk.stop().catch(() => void 0);
|
|
71
|
+
} catch (error) {
|
|
72
|
+
log.error("failed to create setup snapshot", {
|
|
73
|
+
snapshotVersion,
|
|
74
|
+
cause: error
|
|
75
|
+
});
|
|
76
|
+
if (tempSdk) {
|
|
77
|
+
await tempSdk.stop().catch(() => void 0);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
var VercelSandboxInstance = class {
|
|
82
|
+
sdk;
|
|
83
|
+
cwd;
|
|
84
|
+
constructor(sdk, cwd) {
|
|
85
|
+
this.sdk = sdk;
|
|
86
|
+
this.cwd = cwd ?? HOME_DIR;
|
|
87
|
+
}
|
|
88
|
+
async exec({
|
|
89
|
+
command,
|
|
90
|
+
args,
|
|
91
|
+
cwd,
|
|
92
|
+
env,
|
|
93
|
+
sudo,
|
|
94
|
+
signal
|
|
95
|
+
}) {
|
|
96
|
+
const output = await this.sdk.runCommand({
|
|
97
|
+
cmd: command,
|
|
98
|
+
args,
|
|
99
|
+
cwd: cwd ?? this.cwd,
|
|
100
|
+
env,
|
|
101
|
+
sudo,
|
|
102
|
+
signal,
|
|
103
|
+
detached: true
|
|
104
|
+
});
|
|
105
|
+
let stdout = "";
|
|
106
|
+
let stderr = "";
|
|
107
|
+
const logBuffer = [];
|
|
108
|
+
const state = {
|
|
109
|
+
resolve: null,
|
|
110
|
+
consumed: false
|
|
111
|
+
};
|
|
112
|
+
const consumeLogs = (async () => {
|
|
113
|
+
try {
|
|
114
|
+
for await (const entry of output.logs()) {
|
|
115
|
+
if (entry.stream === "stdout") {
|
|
116
|
+
stdout += entry.data;
|
|
117
|
+
} else {
|
|
118
|
+
stderr += entry.data;
|
|
119
|
+
}
|
|
120
|
+
logBuffer.push(entry);
|
|
121
|
+
state.resolve?.();
|
|
122
|
+
}
|
|
123
|
+
} catch {
|
|
124
|
+
}
|
|
125
|
+
state.consumed = true;
|
|
126
|
+
state.resolve?.();
|
|
127
|
+
})();
|
|
128
|
+
async function* logs() {
|
|
129
|
+
let index = 0;
|
|
130
|
+
while (!state.consumed || index < logBuffer.length) {
|
|
131
|
+
if (index < logBuffer.length) {
|
|
132
|
+
yield logBuffer[index++];
|
|
133
|
+
} else {
|
|
134
|
+
await new Promise((r) => {
|
|
135
|
+
state.resolve = r;
|
|
136
|
+
});
|
|
137
|
+
state.resolve = null;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
const result = consumeLogs.then(async () => {
|
|
142
|
+
try {
|
|
143
|
+
const finished = await output.wait();
|
|
144
|
+
return { stdout, stderr, exitCode: finished.exitCode };
|
|
145
|
+
} catch (e) {
|
|
146
|
+
if (isSandboxGoneError(e)) {
|
|
147
|
+
return { stdout, stderr, exitCode: 1 };
|
|
148
|
+
}
|
|
149
|
+
throw e;
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
return { commandId: output.cmdId, logs, result };
|
|
153
|
+
}
|
|
154
|
+
async readFile({
|
|
155
|
+
path: filePath
|
|
156
|
+
}) {
|
|
157
|
+
try {
|
|
158
|
+
return await this.sdk.readFileToBuffer({ path: filePath, cwd: this.cwd });
|
|
159
|
+
} catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
async writeFiles({
|
|
164
|
+
files,
|
|
165
|
+
destPath
|
|
166
|
+
}) {
|
|
167
|
+
if (files.length === 0) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const path = await import("path");
|
|
171
|
+
const nativeFiles = files.map((file) => {
|
|
172
|
+
const filePath = path.posix.join(destPath, file.path);
|
|
173
|
+
const absolutePath = path.posix.isAbsolute(filePath) ? filePath : path.posix.join(this.cwd, filePath);
|
|
174
|
+
return {
|
|
175
|
+
path: absolutePath,
|
|
176
|
+
content: typeof file.content === "string" ? Buffer.from(file.content) : file.content
|
|
177
|
+
};
|
|
178
|
+
});
|
|
179
|
+
await this.sdk.writeFiles(nativeFiles);
|
|
180
|
+
const shellScripts = nativeFiles.filter((f) => f.path.endsWith(".sh"));
|
|
181
|
+
if (shellScripts.length > 0) {
|
|
182
|
+
const result = await this.exec({
|
|
183
|
+
command: "chmod",
|
|
184
|
+
args: ["+x", ...shellScripts.map((f) => f.path)]
|
|
185
|
+
});
|
|
186
|
+
await result.result;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// biome-ignore lint/suspicious/useAwait: synchronous SDK call
|
|
190
|
+
async getDomain({
|
|
191
|
+
port
|
|
192
|
+
}) {
|
|
193
|
+
return this.sdk.domain(port);
|
|
194
|
+
}
|
|
195
|
+
async kill({
|
|
196
|
+
commandId
|
|
197
|
+
}) {
|
|
198
|
+
const cmd = await this.sdk.getCommand(commandId);
|
|
199
|
+
await cmd.kill();
|
|
200
|
+
}
|
|
201
|
+
// biome-ignore lint/suspicious/useAwait: synchronous SDK getter
|
|
202
|
+
async getStatus() {
|
|
203
|
+
const status = this.sdk.status;
|
|
204
|
+
if (status === "snapshotting") {
|
|
205
|
+
return "stopping";
|
|
206
|
+
}
|
|
207
|
+
if (status === "aborted") {
|
|
208
|
+
return "failed";
|
|
209
|
+
}
|
|
210
|
+
return status;
|
|
211
|
+
}
|
|
212
|
+
async start() {
|
|
213
|
+
const result = await this.exec({ command: "true" });
|
|
214
|
+
await result.result;
|
|
215
|
+
}
|
|
216
|
+
async stop() {
|
|
217
|
+
await this.sdk.stop();
|
|
218
|
+
}
|
|
219
|
+
async snapshot() {
|
|
220
|
+
const snap = await this.sdk.snapshot();
|
|
221
|
+
return { snapshotId: snap.snapshotId };
|
|
222
|
+
}
|
|
223
|
+
async updateNetworkPolicy({
|
|
224
|
+
policy
|
|
225
|
+
}) {
|
|
226
|
+
return await this.sdk.updateNetworkPolicy(policy);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
function vercelSandbox() {
|
|
230
|
+
return {
|
|
231
|
+
type: "vercel",
|
|
232
|
+
async create({ agent, setup, record, signal: _signal, log }) {
|
|
233
|
+
const storage = agent.storage;
|
|
234
|
+
const config = setup.config ?? {};
|
|
235
|
+
const cwd = config.cwd;
|
|
236
|
+
const resources = config.resources ?? { vcpus: DEFAULT_VCPUS };
|
|
237
|
+
const ports = config.ports;
|
|
238
|
+
const networkPolicy = config.networkPolicy ?? setup.networkPolicy ?? void 0;
|
|
239
|
+
const sandboxOpts = {
|
|
240
|
+
resources,
|
|
241
|
+
ports,
|
|
242
|
+
networkPolicy,
|
|
243
|
+
snapshotId: config.snapshotId
|
|
244
|
+
};
|
|
245
|
+
const _startLifecycle = (vercelSandboxId) => {
|
|
246
|
+
if (!record) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
startWorkflow(sandboxLifecycleWorkflow, [
|
|
250
|
+
{
|
|
251
|
+
input: {
|
|
252
|
+
agent,
|
|
253
|
+
sandboxId: record.id,
|
|
254
|
+
vercelSandboxId,
|
|
255
|
+
config: config.lifecycle
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
]).catch((e) => {
|
|
259
|
+
log.error("failed to start lifecycle workflow", { cause: e });
|
|
260
|
+
});
|
|
261
|
+
};
|
|
262
|
+
if (setup.version) {
|
|
263
|
+
const existing = await storage.setup.get(setup.version);
|
|
264
|
+
if (existing?.snapshotId) {
|
|
265
|
+
const sdk2 = await createSdk({
|
|
266
|
+
...sandboxOpts,
|
|
267
|
+
snapshotId: existing.snapshotId
|
|
268
|
+
});
|
|
269
|
+
const instance2 = new VercelSandboxInstance(sdk2, cwd);
|
|
270
|
+
storage.setup.set(setup.version, {
|
|
271
|
+
...existing,
|
|
272
|
+
version: setup.version,
|
|
273
|
+
lastUsedAt: Date.now()
|
|
274
|
+
}).catch(() => void 0);
|
|
275
|
+
return {
|
|
276
|
+
instance: instance2,
|
|
277
|
+
metadata: { sandboxId: sdk2.sandboxId }
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (setup.run) {
|
|
282
|
+
if (!setup.version) {
|
|
283
|
+
log.error("setup.run provided without setup.version", { setup });
|
|
284
|
+
throw new Error("setup.run provided without setup.version");
|
|
285
|
+
}
|
|
286
|
+
createSetupSnapshot({
|
|
287
|
+
sandboxOpts,
|
|
288
|
+
run: setup.run,
|
|
289
|
+
storage,
|
|
290
|
+
snapshotVersion: setup.version,
|
|
291
|
+
log
|
|
292
|
+
}).catch((error) => {
|
|
293
|
+
log.error("background setup snapshot failed", { cause: error });
|
|
294
|
+
});
|
|
295
|
+
const sdk2 = await createSdk(sandboxOpts);
|
|
296
|
+
const instance2 = new VercelSandboxInstance(sdk2, cwd);
|
|
297
|
+
await setup.run(instance2);
|
|
298
|
+
return {
|
|
299
|
+
instance: instance2,
|
|
300
|
+
metadata: { sandboxId: sdk2.sandboxId }
|
|
301
|
+
};
|
|
302
|
+
}
|
|
303
|
+
const sdk = await createSdk(sandboxOpts);
|
|
304
|
+
const instance = new VercelSandboxInstance(sdk, cwd);
|
|
305
|
+
return {
|
|
306
|
+
instance,
|
|
307
|
+
metadata: { sandboxId: sdk.sandboxId }
|
|
308
|
+
};
|
|
309
|
+
},
|
|
310
|
+
async connect({ metadata }) {
|
|
311
|
+
const SandboxSDK = await loadSandboxSDK();
|
|
312
|
+
const sdk = await SandboxSDK.get({
|
|
313
|
+
sandboxId: metadata.sandboxId,
|
|
314
|
+
...getTestCredentials()
|
|
315
|
+
});
|
|
316
|
+
return new VercelSandboxInstance(sdk);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
export {
|
|
322
|
+
vercelSandbox
|
|
323
|
+
};
|
|
324
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3NhbmRib3gvYmluZGluZ3MvdmVyY2VsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBzdGFydCBhcyBzdGFydFdvcmtmbG93IH0gZnJvbSBcIndvcmtmbG93L2FwaVwiO1xuaW1wb3J0IHR5cGUgeyBTdG9yYWdlIH0gZnJvbSBcIi4uLy4uL3N0b3JhZ2VcIjtcbmltcG9ydCB0eXBlIHsgTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL2xvZ2dlclwiO1xuaW1wb3J0IHR5cGUgeyBFeGVjUmVzdWx0LCBTYW5kYm94QmluZGluZywgU2FuZGJveEluc3RhbmNlIH0gZnJvbSBcIi4uL2FkYXB0ZXJcIjtcbmltcG9ydCB0eXBlIHsgTGlmZWN5Y2xlQ29uZmlnIH0gZnJvbSBcIi4vdmVyY2VsLWxpZmVjeWNsZS9zdGVwc1wiO1xuaW1wb3J0IHsgc2FuZGJveExpZmVjeWNsZVdvcmtmbG93IH0gZnJvbSBcIi4vdmVyY2VsLWxpZmVjeWNsZS93b3JrZmxvd1wiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkU2FuZGJveFNESygpIHtcbiAgcmV0dXJuIChhd2FpdCBpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikpLlNhbmRib3g7XG59XG5cbmNvbnN0IE1BWF9USU1FT1VUX01TID0gNSAqIDYwICogNjAgKiAxMDAwOyAvLyA1IGhvdXJzXG5jb25zdCBIT01FX0RJUiA9IFwiL2hvbWUvdmVyY2VsLXNhbmRib3hcIjtcbmNvbnN0IERFRkFVTFRfVkNQVVMgPSAyO1xuXG5leHBvcnQgdHlwZSBWZXJjZWxCaW5kaW5nQ29uZmlnID0ge1xuICBjd2Q/OiBzdHJpbmc7XG4gIHJlc291cmNlcz86IHsgdmNwdXM6IG51bWJlciB9O1xuICBwb3J0cz86IG51bWJlcltdO1xuICBuZXR3b3JrUG9saWN5PzogaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLk5ldHdvcmtQb2xpY3k7XG4gIHNuYXBzaG90SWQ/OiBzdHJpbmc7XG4gIGxpZmVjeWNsZT86IExpZmVjeWNsZUNvbmZpZztcbn07XG5cbmV4cG9ydCB0eXBlIFZlcmNlbEJpbmRpbmdNZXRhZGF0YSA9IHtcbiAgc2FuZGJveElkOiBzdHJpbmc7XG59O1xuXG50eXBlIENyZWF0ZVNhbmRib3hPcHRzID0ge1xuICByZXNvdXJjZXM6IHsgdmNwdXM6IG51bWJlciB9O1xuICBwb3J0cz86IG51bWJlcltdO1xuICBuZXR3b3JrUG9saWN5PzogaW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLk5ldHdvcmtQb2xpY3k7XG4gIHNuYXBzaG90SWQ/OiBzdHJpbmc7XG59O1xuXG5mdW5jdGlvbiBpc1NhbmRib3hHb25lRXJyb3IoZTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShlIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3Qgc3RhdHVzID1cbiAgICAoZSBhcyB7IHJlc3BvbnNlPzogeyBzdGF0dXM/OiBudW1iZXIgfSB9KS5yZXNwb25zZT8uc3RhdHVzID8/XG4gICAgKGUgYXMgeyBjYXVzZT86IHsgcmVzcG9uc2U/OiB7IHN0YXR1cz86IG51bWJlciB9IH0gfSkuY2F1c2U/LnJlc3BvbnNlXG4gICAgICA/LnN0YXR1cztcblxuICBpZiAoc3RhdHVzID09PSA0MTAgfHwgc3RhdHVzID09PSA0MjIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IG1zZyA9IGUubWVzc2FnZSB8fCBTdHJpbmcoZSk7XG4gIHJldHVybiAoXG4gICAgbXNnLmluY2x1ZGVzKFwiRXhwZWN0ZWQgYSBzdHJlYW0gb2YgY29tbWFuZCBkYXRhXCIpIHx8XG4gICAgbXNnLmluY2x1ZGVzKFwiRXhwZWN0ZWQgYSBzdHJlYW0gb2YgbG9nc1wiKVxuICApO1xufVxuXG5jb25zdCBnZXRUZXN0Q3JlZGVudGlhbHMgPSAoKSA9PlxuICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCJcbiAgICA/IHtcbiAgICAgICAgdG9rZW46IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RPS0VOLFxuICAgICAgICB0ZWFtSWQ6IHByb2Nlc3MuZW52LlRFU1RfVkVSQ0VMX1RFQU1fSUQsXG4gICAgICAgIHByb2plY3RJZDogcHJvY2Vzcy5lbnYuVEVTVF9WRVJDRUxfUFJPSkVDVF9JRCxcbiAgICAgIH1cbiAgICA6IHt9O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVTZGsoe1xuICByZXNvdXJjZXMsXG4gIHBvcnRzLFxuICBuZXR3b3JrUG9saWN5LFxuICBzbmFwc2hvdElkLFxufTogQ3JlYXRlU2FuZGJveE9wdHMpIHtcbiAgY29uc3QgU2FuZGJveFNESyA9IGF3YWl0IGxvYWRTYW5kYm94U0RLKCk7XG4gIGNvbnN0IGJhc2UgPSB7XG4gICAgcmVzb3VyY2VzLFxuICAgIHRpbWVvdXQ6IE1BWF9USU1FT1VUX01TLFxuICAgIC4uLihwb3J0cyA/IHsgcG9ydHMgfSA6IHt9KSxcbiAgICAuLi4obmV0d29ya1BvbGljeSA/IHsgbmV0d29ya1BvbGljeSB9IDoge30pLFxuICAgIC4uLmdldFRlc3RDcmVkZW50aWFscygpLFxuICB9O1xuXG4gIGlmIChzbmFwc2hvdElkKSB7XG4gICAgcmV0dXJuIFNhbmRib3hTREsuY3JlYXRlKHtcbiAgICAgIC4uLmJhc2UsXG4gICAgICBzb3VyY2U6IHsgdHlwZTogXCJzbmFwc2hvdFwiIGFzIGNvbnN0LCBzbmFwc2hvdElkIH0sXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gU2FuZGJveFNESy5jcmVhdGUoYmFzZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNldHVwU25hcHNob3Qoe1xuICBzYW5kYm94T3B0cyxcbiAgcnVuLFxuICBzdG9yYWdlLFxuICBzbmFwc2hvdFZlcnNpb24sXG4gIGxvZyxcbn06IHtcbiAgc2FuZGJveE9wdHM6IENyZWF0ZVNhbmRib3hPcHRzO1xuICBydW46IChzYW5kYm94OiBTYW5kYm94SW5zdGFuY2UpID0+IFByb21pc2U8dm9pZD47XG4gIHN0b3JhZ2U6IFN0b3JhZ2U7XG4gIHNuYXBzaG90VmVyc2lvbjogc3RyaW5nO1xuICBsb2c6IExvZ2dlcjtcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHRlbXBTZGs6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlU2RrPj4gfCBudWxsID0gbnVsbDtcbiAgdHJ5IHtcbiAgICB0ZW1wU2RrID0gYXdhaXQgY3JlYXRlU2RrKHNhbmRib3hPcHRzKTtcbiAgICBjb25zdCB0ZW1wSW5zdGFuY2UgPSBuZXcgVmVyY2VsU2FuZGJveEluc3RhbmNlKHRlbXBTZGspO1xuICAgIGF3YWl0IHJ1bih0ZW1wSW5zdGFuY2UpO1xuICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgdGVtcFNkay5zbmFwc2hvdCgpO1xuICAgIGF3YWl0IHN0b3JhZ2Uuc2V0dXAuc2V0KHNuYXBzaG90VmVyc2lvbiwge1xuICAgICAgdmVyc2lvbjogc25hcHNob3RWZXJzaW9uLFxuICAgICAgc25hcHNob3RJZDogc25hcHNob3Quc25hcHNob3RJZCxcbiAgICAgIGNyZWF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgIGxhc3RVc2VkQXQ6IG51bGwsXG4gICAgfSk7XG4gICAgYXdhaXQgdGVtcFNkay5zdG9wKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2cuZXJyb3IoXCJmYWlsZWQgdG8gY3JlYXRlIHNldHVwIHNuYXBzaG90XCIsIHtcbiAgICAgIHNuYXBzaG90VmVyc2lvbixcbiAgICAgIGNhdXNlOiBlcnJvcixcbiAgICB9KTtcbiAgICBpZiAodGVtcFNkaykge1xuICAgICAgYXdhaXQgdGVtcFNkay5zdG9wKCkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgVmVyY2VsU2FuZGJveEluc3RhbmNlIGltcGxlbWVudHMgU2FuZGJveEluc3RhbmNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzZGs6IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKS5TYW5kYm94O1xuICByZWFkb25seSBjd2Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzZGs6IGltcG9ydChcIkB2ZXJjZWwvc2FuZGJveFwiKS5TYW5kYm94LCBjd2Q/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNkayA9IHNkaztcbiAgICB0aGlzLmN3ZCA9IGN3ZCA/PyBIT01FX0RJUjtcbiAgfVxuXG4gIGFzeW5jIGV4ZWMoe1xuICAgIGNvbW1hbmQsXG4gICAgYXJncyxcbiAgICBjd2QsXG4gICAgZW52LFxuICAgIHN1ZG8sXG4gICAgc2lnbmFsLFxuICB9OiB7XG4gICAgY29tbWFuZDogc3RyaW5nO1xuICAgIGFyZ3M/OiBzdHJpbmdbXTtcbiAgICBjd2Q/OiBzdHJpbmc7XG4gICAgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBzdWRvPzogYm9vbGVhbjtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8RXhlY1Jlc3VsdD4ge1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2RrLnJ1bkNvbW1hbmQoe1xuICAgICAgY21kOiBjb21tYW5kLFxuICAgICAgYXJncyxcbiAgICAgIGN3ZDogY3dkID8/IHRoaXMuY3dkLFxuICAgICAgZW52LFxuICAgICAgc3VkbyxcbiAgICAgIHNpZ25hbCxcbiAgICAgIGRldGFjaGVkOiB0cnVlLFxuICAgIH0pO1xuXG4gICAgbGV0IHN0ZG91dCA9IFwiXCI7XG4gICAgbGV0IHN0ZGVyciA9IFwiXCI7XG4gICAgY29uc3QgbG9nQnVmZmVyOiB7IHN0cmVhbTogXCJzdGRvdXRcIiB8IFwic3RkZXJyXCI7IGRhdGE6IHN0cmluZyB9W10gPSBbXTtcbiAgICBjb25zdCBzdGF0ZSA9IHtcbiAgICAgIHJlc29sdmU6IG51bGwgYXMgKCgpID0+IHZvaWQpIHwgbnVsbCxcbiAgICAgIGNvbnN1bWVkOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgY29uc3QgY29uc3VtZUxvZ3MgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBlbnRyeSBvZiBvdXRwdXQubG9ncygpKSB7XG4gICAgICAgICAgaWYgKGVudHJ5LnN0cmVhbSA9PT0gXCJzdGRvdXRcIikge1xuICAgICAgICAgICAgc3Rkb3V0ICs9IGVudHJ5LmRhdGE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0ZGVyciArPSBlbnRyeS5kYXRhO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxvZ0J1ZmZlci5wdXNoKGVudHJ5KTtcbiAgICAgICAgICBzdGF0ZS5yZXNvbHZlPy4oKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIFNhbmRib3ggbWF5IGhhdmUgYmVlbiBzdG9wcGVkIFx1MjAxNCBsb2dzIGVuZHBvaW50IHJldHVybnMgNDIyXG4gICAgICB9XG4gICAgICBzdGF0ZS5jb25zdW1lZCA9IHRydWU7XG4gICAgICBzdGF0ZS5yZXNvbHZlPy4oKTtcbiAgICB9KSgpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24qIGxvZ3MoKTogQXN5bmNJdGVyYWJsZTx7XG4gICAgICBzdHJlYW06IFwic3Rkb3V0XCIgfCBcInN0ZGVyclwiO1xuICAgICAgZGF0YTogc3RyaW5nO1xuICAgIH0+IHtcbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAoIXN0YXRlLmNvbnN1bWVkIHx8IGluZGV4IDwgbG9nQnVmZmVyLmxlbmd0aCkge1xuICAgICAgICBpZiAoaW5kZXggPCBsb2dCdWZmZXIubGVuZ3RoKSB7XG4gICAgICAgICAgeWllbGQgbG9nQnVmZmVyW2luZGV4KytdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyKSA9PiB7XG4gICAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gcjtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBzdGF0ZS5yZXNvbHZlID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbnN1bWVMb2dzLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgZmluaXNoZWQgPSBhd2FpdCBvdXRwdXQud2FpdCgpO1xuICAgICAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IGZpbmlzaGVkLmV4aXRDb2RlIH07XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChpc1NhbmRib3hHb25lRXJyb3IoZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGRvdXQsIHN0ZGVyciwgZXhpdENvZGU6IDEgfTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgY29tbWFuZElkOiBvdXRwdXQuY21kSWQsIGxvZ3MsIHJlc3VsdCB9O1xuICB9XG5cbiAgYXN5bmMgcmVhZEZpbGUoe1xuICAgIHBhdGg6IGZpbGVQYXRoLFxuICB9OiB7XG4gICAgcGF0aDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxCdWZmZXIgfCBudWxsPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnNkay5yZWFkRmlsZVRvQnVmZmVyKHsgcGF0aDogZmlsZVBhdGgsIGN3ZDogdGhpcy5jd2QgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhc3luYyB3cml0ZUZpbGVzKHtcbiAgICBmaWxlcyxcbiAgICBkZXN0UGF0aCxcbiAgfToge1xuICAgIGZpbGVzOiB7IHBhdGg6IHN0cmluZzsgY29udGVudDogc3RyaW5nIHwgQnVmZmVyIH1bXTtcbiAgICBkZXN0UGF0aDogc3RyaW5nO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKGZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGggPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gICAgY29uc3QgbmF0aXZlRmlsZXMgPSBmaWxlcy5tYXAoKGZpbGUpID0+IHtcbiAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5wb3NpeC5qb2luKGRlc3RQYXRoLCBmaWxlLnBhdGgpO1xuICAgICAgY29uc3QgYWJzb2x1dGVQYXRoID0gcGF0aC5wb3NpeC5pc0Fic29sdXRlKGZpbGVQYXRoKVxuICAgICAgICA/IGZpbGVQYXRoXG4gICAgICAgIDogcGF0aC5wb3NpeC5qb2luKHRoaXMuY3dkLCBmaWxlUGF0aCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwYXRoOiBhYnNvbHV0ZVBhdGgsXG4gICAgICAgIGNvbnRlbnQ6XG4gICAgICAgICAgdHlwZW9mIGZpbGUuY29udGVudCA9PT0gXCJzdHJpbmdcIlxuICAgICAgICAgICAgPyBCdWZmZXIuZnJvbShmaWxlLmNvbnRlbnQpXG4gICAgICAgICAgICA6IGZpbGUuY29udGVudCxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBhd2FpdCB0aGlzLnNkay53cml0ZUZpbGVzKG5hdGl2ZUZpbGVzKTtcblxuICAgIGNvbnN0IHNoZWxsU2NyaXB0cyA9IG5hdGl2ZUZpbGVzLmZpbHRlcigoZikgPT4gZi5wYXRoLmVuZHNXaXRoKFwiLnNoXCIpKTtcbiAgICBpZiAoc2hlbGxTY3JpcHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlYyh7XG4gICAgICAgIGNvbW1hbmQ6IFwiY2htb2RcIixcbiAgICAgICAgYXJnczogW1wiK3hcIiwgLi4uc2hlbGxTY3JpcHRzLm1hcCgoZikgPT4gZi5wYXRoKV0sXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gICAgfVxuICB9XG5cbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy91c2VBd2FpdDogc3luY2hyb25vdXMgU0RLIGNhbGxcbiAgYXN5bmMgZ2V0RG9tYWluKHtcbiAgICBwb3J0LFxuICB9OiB7XG4gICAgcG9ydDogbnVtYmVyO1xuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsO1xuICB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5zZGsuZG9tYWluKHBvcnQpO1xuICB9XG5cbiAgYXN5bmMga2lsbCh7XG4gICAgY29tbWFuZElkLFxuICB9OiB7XG4gICAgY29tbWFuZElkOiBzdHJpbmc7XG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjbWQgPSBhd2FpdCB0aGlzLnNkay5nZXRDb21tYW5kKGNvbW1hbmRJZCk7XG4gICAgYXdhaXQgY21kLmtpbGwoKTtcbiAgfVxuXG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvdXNlQXdhaXQ6IHN5bmNocm9ub3VzIFNESyBnZXR0ZXJcbiAgYXN5bmMgZ2V0U3RhdHVzKCk6IFByb21pc2U8XG4gICAgXCJwZW5kaW5nXCIgfCBcInJ1bm5pbmdcIiB8IFwic3RvcHBpbmdcIiB8IFwic3RvcHBlZFwiIHwgXCJmYWlsZWRcIlxuICA+IHtcbiAgICBjb25zdCBzdGF0dXMgPSB0aGlzLnNkay5zdGF0dXM7XG4gICAgLy8gTWFwIFNESy1vbmx5IHN0YXR1c2VzIHRvIG91ciBpbnRlcmZhY2UncyB1bmlvblxuICAgIGlmIChzdGF0dXMgPT09IFwic25hcHNob3R0aW5nXCIpIHtcbiAgICAgIHJldHVybiBcInN0b3BwaW5nXCI7XG4gICAgfVxuICAgIGlmIChzdGF0dXMgPT09IFwiYWJvcnRlZFwiKSB7XG4gICAgICByZXR1cm4gXCJmYWlsZWRcIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1cztcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFRoZSBWZXJjZWwgU0RLIGRvZXNuJ3QgaGF2ZSBhIHJlc3VtZSBtZXRob2QuXG4gICAgLy8gUnVuIGEgbm8tb3AgY29tbWFuZCB0byB2ZXJpZnkgdGhlIHNhbmRib3ggaXMgcmVhY2hhYmxlLlxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZXhlYyh7IGNvbW1hbmQ6IFwidHJ1ZVwiIH0pO1xuICAgIGF3YWl0IHJlc3VsdC5yZXN1bHQ7XG4gIH1cblxuICBhc3luYyBzdG9wKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuc2RrLnN0b3AoKTtcbiAgfVxuXG4gIGFzeW5jIHNuYXBzaG90KCk6IFByb21pc2U8eyBzbmFwc2hvdElkOiBzdHJpbmcgfT4ge1xuICAgIGNvbnN0IHNuYXAgPSBhd2FpdCB0aGlzLnNkay5zbmFwc2hvdCgpO1xuICAgIHJldHVybiB7IHNuYXBzaG90SWQ6IHNuYXAuc25hcHNob3RJZCB9O1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlTmV0d29ya1BvbGljeSh7XG4gICAgcG9saWN5LFxuICB9OiB7XG4gICAgcG9saWN5OiBpbXBvcnQoXCJAdmVyY2VsL3NhbmRib3hcIikuTmV0d29ya1BvbGljeTtcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgfSk6IFByb21pc2U8aW1wb3J0KFwiQHZlcmNlbC9zYW5kYm94XCIpLk5ldHdvcmtQb2xpY3k+IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZGsudXBkYXRlTmV0d29ya1BvbGljeShwb2xpY3kpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2ZXJjZWxTYW5kYm94KCk6IFNhbmRib3hCaW5kaW5nPFxuICBcInZlcmNlbFwiLFxuICBWZXJjZWxCaW5kaW5nQ29uZmlnLFxuICBWZXJjZWxCaW5kaW5nTWV0YWRhdGFcbj4ge1xuICByZXR1cm4ge1xuICAgIHR5cGU6IFwidmVyY2VsXCIsXG4gICAgYXN5bmMgY3JlYXRlKHsgYWdlbnQsIHNldHVwLCByZWNvcmQsIHNpZ25hbDogX3NpZ25hbCwgbG9nIH0pIHtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBhZ2VudC5zdG9yYWdlO1xuICAgICAgY29uc3QgY29uZmlnID0gc2V0dXAuY29uZmlnID8/IHt9O1xuICAgICAgY29uc3QgY3dkID0gY29uZmlnLmN3ZDtcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IGNvbmZpZy5yZXNvdXJjZXMgPz8geyB2Y3B1czogREVGQVVMVF9WQ1BVUyB9O1xuICAgICAgY29uc3QgcG9ydHMgPSBjb25maWcucG9ydHM7XG4gICAgICBjb25zdCBuZXR3b3JrUG9saWN5ID1cbiAgICAgICAgY29uZmlnLm5ldHdvcmtQb2xpY3kgPz8gc2V0dXAubmV0d29ya1BvbGljeSA/PyB1bmRlZmluZWQ7XG5cbiAgICAgIGNvbnN0IHNhbmRib3hPcHRzOiBDcmVhdGVTYW5kYm94T3B0cyA9IHtcbiAgICAgICAgcmVzb3VyY2VzLFxuICAgICAgICBwb3J0cyxcbiAgICAgICAgbmV0d29ya1BvbGljeSxcbiAgICAgICAgc25hcHNob3RJZDogY29uZmlnLnNuYXBzaG90SWQsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBfc3RhcnRMaWZlY3ljbGUgPSAodmVyY2VsU2FuZGJveElkOiBzdHJpbmcpID0+IHtcbiAgICAgICAgaWYgKCFyZWNvcmQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRXb3JrZmxvdyhzYW5kYm94TGlmZWN5Y2xlV29ya2Zsb3csIFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpbnB1dDoge1xuICAgICAgICAgICAgICBhZ2VudCxcbiAgICAgICAgICAgICAgc2FuZGJveElkOiByZWNvcmQuaWQsXG4gICAgICAgICAgICAgIHZlcmNlbFNhbmRib3hJZCxcbiAgICAgICAgICAgICAgY29uZmlnOiBjb25maWcubGlmZWN5Y2xlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdKS5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgIGxvZy5lcnJvcihcImZhaWxlZCB0byBzdGFydCBsaWZlY3ljbGUgd29ya2Zsb3dcIiwgeyBjYXVzZTogZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4gICAgICBpZiAoc2V0dXAudmVyc2lvbikge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IGF3YWl0IHN0b3JhZ2Uuc2V0dXAuZ2V0KHNldHVwLnZlcnNpb24pO1xuICAgICAgICBpZiAoZXhpc3Rpbmc/LnNuYXBzaG90SWQpIHtcbiAgICAgICAgICBjb25zdCBzZGsgPSBhd2FpdCBjcmVhdGVTZGsoe1xuICAgICAgICAgICAgLi4uc2FuZGJveE9wdHMsXG4gICAgICAgICAgICBzbmFwc2hvdElkOiBleGlzdGluZy5zbmFwc2hvdElkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IFZlcmNlbFNhbmRib3hJbnN0YW5jZShzZGssIGN3ZCk7XG5cbiAgICAgICAgICBzdG9yYWdlLnNldHVwXG4gICAgICAgICAgICAuc2V0KHNldHVwLnZlcnNpb24sIHtcbiAgICAgICAgICAgICAgLi4uZXhpc3RpbmcsXG4gICAgICAgICAgICAgIHZlcnNpb246IHNldHVwLnZlcnNpb24sXG4gICAgICAgICAgICAgIGxhc3RVc2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgICAgICBtZXRhZGF0YTogeyBzYW5kYm94SWQ6IHNkay5zYW5kYm94SWQgfSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXR1cC5ydW4pIHtcbiAgICAgICAgaWYgKCFzZXR1cC52ZXJzaW9uKSB7XG4gICAgICAgICAgbG9nLmVycm9yKFwic2V0dXAucnVuIHByb3ZpZGVkIHdpdGhvdXQgc2V0dXAudmVyc2lvblwiLCB7IHNldHVwIH0pO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInNldHVwLnJ1biBwcm92aWRlZCB3aXRob3V0IHNldHVwLnZlcnNpb25cIik7XG4gICAgICAgIH1cbiAgICAgICAgY3JlYXRlU2V0dXBTbmFwc2hvdCh7XG4gICAgICAgICAgc2FuZGJveE9wdHMsXG4gICAgICAgICAgcnVuOiBzZXR1cC5ydW4sXG4gICAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgICBzbmFwc2hvdFZlcnNpb246IHNldHVwLnZlcnNpb24sXG4gICAgICAgICAgbG9nLFxuICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBsb2cuZXJyb3IoXCJiYWNrZ3JvdW5kIHNldHVwIHNuYXBzaG90IGZhaWxlZFwiLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgc2RrID0gYXdhaXQgY3JlYXRlU2RrKHNhbmRib3hPcHRzKTtcbiAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVmVyY2VsU2FuZGJveEluc3RhbmNlKHNkaywgY3dkKTtcbiAgICAgICAgYXdhaXQgc2V0dXAucnVuKGluc3RhbmNlKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGluc3RhbmNlLFxuICAgICAgICAgIG1ldGFkYXRhOiB7IHNhbmRib3hJZDogc2RrLnNhbmRib3hJZCB9LFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzZGsgPSBhd2FpdCBjcmVhdGVTZGsoc2FuZGJveE9wdHMpO1xuICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgVmVyY2VsU2FuZGJveEluc3RhbmNlKHNkaywgY3dkKTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaW5zdGFuY2UsXG4gICAgICAgIG1ldGFkYXRhOiB7IHNhbmRib3hJZDogc2RrLnNhbmRib3hJZCB9LFxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgYXN5bmMgY29ubmVjdCh7IG1ldGFkYXRhIH0pIHtcbiAgICAgIGNvbnN0IFNhbmRib3hTREsgPSBhd2FpdCBsb2FkU2FuZGJveFNESygpO1xuICAgICAgY29uc3Qgc2RrID0gYXdhaXQgU2FuZGJveFNESy5nZXQoe1xuICAgICAgICBzYW5kYm94SWQ6IG1ldGFkYXRhLnNhbmRib3hJZCxcbiAgICAgICAgLi4uZ2V0VGVzdENyZWRlbnRpYWxzKCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXcgVmVyY2VsU2FuZGJveEluc3RhbmNlKHNkayk7XG4gICAgfSxcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBQUEsU0FBUyxTQUFTLHFCQUFxQjtBQU92QyxlQUFlLGlCQUFpQjtBQUM5QixVQUFRLE1BQU0sT0FBTyxpQkFBaUIsR0FBRztBQUMzQztBQUVBLElBQU0saUJBQWlCLElBQUksS0FBSyxLQUFLO0FBQ3JDLElBQU0sV0FBVztBQUNqQixJQUFNLGdCQUFnQjtBQXNCdEIsU0FBUyxtQkFBbUIsR0FBcUI7QUFDL0MsTUFBSSxFQUFFLGFBQWEsUUFBUTtBQUN6QixXQUFPO0FBQUEsRUFDVDtBQUVBLFFBQU0sU0FDSCxFQUF5QyxVQUFVLFVBQ25ELEVBQXFELE9BQU8sVUFDekQ7QUFFTixNQUFJLFdBQVcsT0FBTyxXQUFXLEtBQUs7QUFDcEMsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLE1BQU0sRUFBRSxXQUFXLE9BQU8sQ0FBQztBQUNqQyxTQUNFLElBQUksU0FBUyxtQ0FBbUMsS0FDaEQsSUFBSSxTQUFTLDJCQUEyQjtBQUU1QztBQUVBLElBQU0scUJBQXFCLE1BQ3pCLFFBQVEsSUFBSSxhQUFhLFNBQ3JCO0FBQUEsRUFDRSxPQUFPLFFBQVEsSUFBSTtBQUFBLEVBQ25CLFFBQVEsUUFBUSxJQUFJO0FBQUEsRUFDcEIsV0FBVyxRQUFRLElBQUk7QUFDekIsSUFDQSxDQUFDO0FBRVAsZUFBZSxVQUFVO0FBQUEsRUFDdkI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUFzQjtBQUNwQixRQUFNLGFBQWEsTUFBTSxlQUFlO0FBQ3hDLFFBQU0sT0FBTztBQUFBLElBQ1g7QUFBQSxJQUNBLFNBQVM7QUFBQSxJQUNULEdBQUksUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQUEsSUFD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QUksTUFBTSxTQUFTO0FBQUEsWUFDbEIsR0FBRztBQUFBLFlBQ0gsU0FBUyxNQUFNO0FBQUEsWUFDZixZQUFZLEtBQUssSUFBSTtBQUFBLFVBQ3ZCLENBQUMsRUFDQSxNQUFNLE1BQU0sTUFBUztBQUV4QixpQkFBTztBQUFBLFlBQ0wsVUFBQUM7QUFBQSxZQUNBLFVBQVUsRUFBRSxXQUFXRCxLQUFJLFVBQVU7QUFBQSxVQUN2QztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBRUEsVUFBSSxNQUFNLEtBQUs7QUFDYixZQUFJLENBQUMsTUFBTSxTQUFTO0FBQ2xCLGNBQUksTUFBTSw0Q0FBNEMsRUFBRSxNQUFNLENBQUM7QUFDL0QsZ0JBQU0sSUFBSSxNQUFNLDBDQUEwQztBQUFBLFFBQzVEO0FBQ0EsNEJBQW9CO0FBQUEsVUFDbEI7QUFBQSxVQUNBLEtBQUssTUFBTTtBQUFBLFVBQ1g7QUFBQSxVQUNBLGlCQUFpQixNQUFNO0FBQUEsVUFDdkI7QUFBQSxRQUNGLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVTtBQUNsQixjQUFJLE1BQU0sb0NBQW9DLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFBQSxRQUNoRSxDQUFDO0FBRUQsY0FBTUEsT0FBTSxNQUFNLFVBQVUsV0FBVztBQUN2QyxjQUFNQyxZQUFXLElBQUksc0JBQXNCRCxNQUFLLEdBQUc7QUFDbkQsY0FBTSxNQUFNLElBQUlDLFNBQVE7QUFFeEIsZUFBTztBQUFBLFVBQ0wsVUFBQUE7QUFBQSxVQUNBLFVBQVUsRUFBRSxXQUFXRCxLQUFJLFVBQVU7QUFBQSxRQUN2QztBQUFBLE1BQ0Y7QUFFQSxZQUFNLE1BQU0sTUFBTSxVQUFVLFdBQVc7QUFDdkMsWUFBTSxXQUFXLElBQUksc0JBQXNCLEtBQUssR0FBRztBQUVuRCxhQUFPO0FBQUEsUUFDTDtBQUFBLFFBQ0EsVUFBVSxFQUFFLFdBQVcsSUFBSSxVQUFVO0FBQUEsTUFDdkM7QUFBQSxJQUNGO0FBQUEsSUFFQSxNQUFNLFFBQVEsRUFBRSxTQUFTLEdBQUc7QUFDMUIsWUFBTSxhQUFhLE1BQU0sZUFBZTtBQUN4QyxZQUFNLE1BQU0sTUFBTSxXQUFXLElBQUk7QUFBQSxRQUMvQixXQUFXLFNBQVM7QUFBQSxRQUNwQixHQUFHLG1CQUFtQjtBQUFBLE1BQ3hCLENBQUM7QUFDRCxhQUFPLElBQUksc0JBQXNCLEdBQUc7QUFBQSxJQUN0QztBQUFBLEVBQ0Y7QUFDRjsiLAogICJuYW1lcyI6IFsic2RrIiwgImluc3RhbmNlIl0KfQo=
|