cdk-nextjs 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (266) hide show
  1. package/.jsii +2467 -2714
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +1725 -1909
  4. package/CLAUDE.md +2 -1
  5. package/README.md +429 -130
  6. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +152 -170
  7. package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
  8. package/docs/adapter-runtime.md +185 -0
  9. package/docs/breaking-changes.md +687 -4
  10. package/docs/caching-guide.md +156 -112
  11. package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
  12. package/docs/development-guide.md +1 -1
  13. package/docs/harness-coverage.md +598 -0
  14. package/docs/init-cache-deployment.md +32 -1
  15. package/docs/next-build-output-guide.md +30 -20
  16. package/examples/README.md +5 -1
  17. package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
  18. package/lib/adapter/__fixtures__/app-playground.json +4917 -0
  19. package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
  20. package/lib/adapter/adapter.mjs +1548 -185
  21. package/lib/adapter/adapter.test.js +106 -0
  22. package/lib/adapter/aws-cache-store.d.ts +489 -0
  23. package/lib/adapter/aws-cache-store.js +1004 -0
  24. package/lib/adapter/aws-cache-store.test.d.ts +1 -0
  25. package/lib/adapter/aws-cache-store.test.js +361 -0
  26. package/lib/adapter/build-outputs.d.ts +80 -0
  27. package/lib/adapter/build-outputs.js +852 -0
  28. package/lib/adapter/build-outputs.test.d.ts +1 -0
  29. package/lib/adapter/build-outputs.test.js +861 -0
  30. package/lib/adapter/cache-handler.d.ts +9 -2
  31. package/lib/adapter/cache-handler.js +72 -96
  32. package/lib/adapter/cache-handler.mjs +18956 -17774
  33. package/lib/adapter/cache-handler.test.js +263 -31
  34. package/lib/adapter/cache-kinds.d.ts +32 -0
  35. package/lib/adapter/cache-kinds.js +35 -0
  36. package/lib/adapter/cache-kinds.test.d.ts +1 -0
  37. package/lib/adapter/cache-kinds.test.js +69 -0
  38. package/lib/adapter/cache-utils.d.ts +90 -0
  39. package/lib/adapter/cache-utils.js +199 -4
  40. package/lib/adapter/cache-utils.test.d.ts +1 -0
  41. package/lib/adapter/cache-utils.test.js +179 -0
  42. package/lib/adapter/function-groups.d.ts +215 -0
  43. package/lib/adapter/function-groups.js +1099 -0
  44. package/lib/adapter/function-groups.test.d.ts +1 -0
  45. package/lib/adapter/function-groups.test.js +743 -0
  46. package/lib/adapter/init-cache.d.ts +6 -0
  47. package/lib/adapter/init-cache.js +245 -0
  48. package/lib/adapter/init-cache.test.d.ts +1 -0
  49. package/lib/adapter/init-cache.test.js +137 -0
  50. package/lib/adapter/local-file-cache-handler.d.ts +23 -0
  51. package/lib/adapter/local-file-cache-handler.js +52 -1
  52. package/lib/adapter/memory-cache-handler.d.ts +26 -17
  53. package/lib/adapter/memory-cache-handler.js +32 -50
  54. package/lib/adapter/memory-cache-handler.test.js +105 -85
  55. package/lib/adapter/s3-cache-handler.d.ts +179 -40
  56. package/lib/adapter/s3-cache-handler.js +807 -277
  57. package/lib/adapter/s3-cache-handler.test.js +1186 -31
  58. package/lib/adapter/use-cache-common.d.ts +90 -0
  59. package/lib/adapter/use-cache-common.js +250 -0
  60. package/lib/adapter/use-cache-common.test.d.ts +1 -0
  61. package/lib/adapter/use-cache-common.test.js +646 -0
  62. package/lib/adapter/use-cache-default-handler.d.ts +24 -0
  63. package/lib/adapter/use-cache-default-handler.js +90 -0
  64. package/lib/adapter/use-cache-default-handler.mjs +38645 -0
  65. package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
  66. package/lib/adapter/use-cache-handlers.test.js +349 -0
  67. package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
  68. package/lib/adapter/use-cache-remote-handler.js +186 -0
  69. package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
  70. package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
  71. package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
  72. package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
  73. package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
  74. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
  75. package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
  76. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
  77. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  78. package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +13 -0
  79. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
  80. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +11 -2
  81. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
  82. package/lib/index.d.ts +6 -7
  83. package/lib/index.js +2 -4
  84. package/lib/lambdas/post-deploy/post-deploy.lambda.js +3 -2
  85. package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
  86. package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
  87. package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
  88. package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
  89. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
  90. package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
  91. package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
  92. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
  93. package/lib/lambdas/post-deploy/prune-s3.d.ts +19 -3
  94. package/lib/lambdas/post-deploy/prune-s3.js +54 -15
  95. package/lib/lambdas/post-deploy/prune-s3.test.d.ts +1 -0
  96. package/lib/lambdas/post-deploy/prune-s3.test.js +255 -0
  97. package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
  98. package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
  99. package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
  100. package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
  101. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
  102. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
  103. package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
  104. package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
  105. package/lib/nextjs-api.d.ts +107 -18
  106. package/lib/nextjs-api.js +349 -39
  107. package/lib/nextjs-api.test.js +582 -1
  108. package/lib/nextjs-build/global-containers.Dockerfile +15 -10
  109. package/lib/nextjs-build/nextjs-build.d.ts +339 -63
  110. package/lib/nextjs-build/nextjs-build.js +684 -327
  111. package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
  112. package/lib/nextjs-build/nextjs-build.test.js +412 -0
  113. package/lib/nextjs-build/patch-fetch.js +1 -1
  114. package/lib/nextjs-build/patch-fetch.test.js +166 -11
  115. package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
  116. package/lib/nextjs-cache.d.ts +82 -4
  117. package/lib/nextjs-cache.js +186 -10
  118. package/lib/nextjs-cache.test.js +176 -1
  119. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
  120. package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
  121. package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
  122. package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
  123. package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
  124. package/lib/nextjs-compute/nextjs-containers.js +57 -20
  125. package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
  126. package/lib/nextjs-compute/nextjs-functions.js +113 -67
  127. package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
  128. package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
  129. package/lib/nextjs-distribution.d.ts +194 -23
  130. package/lib/nextjs-distribution.js +535 -62
  131. package/lib/nextjs-distribution.test.d.ts +1 -0
  132. package/lib/nextjs-distribution.test.js +697 -0
  133. package/lib/nextjs-post-deploy.d.ts +23 -3
  134. package/lib/nextjs-post-deploy.js +14 -10
  135. package/lib/nextjs-post-deploy.test.d.ts +1 -0
  136. package/lib/nextjs-post-deploy.test.js +34 -0
  137. package/lib/nextjs-static-assets.d.ts +23 -4
  138. package/lib/nextjs-static-assets.js +29 -6
  139. package/lib/nextjs-static-assets.test.js +20 -1
  140. package/lib/root-constructs/nextjs-base-construct.d.ts +105 -45
  141. package/lib/root-constructs/nextjs-base-construct.js +144 -34
  142. package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
  143. package/lib/root-constructs/nextjs-global-containers.js +20 -70
  144. package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
  145. package/lib/root-constructs/nextjs-global-functions.js +52 -69
  146. package/lib/root-constructs/nextjs-regional-containers.d.ts +25 -5
  147. package/lib/root-constructs/nextjs-regional-containers.js +17 -15
  148. package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
  149. package/lib/root-constructs/nextjs-regional-functions.js +8 -25
  150. package/lib/runtime/api-gateway-path.d.ts +34 -0
  151. package/lib/runtime/api-gateway-path.js +71 -0
  152. package/lib/runtime/api-gateway-path.test.d.ts +1 -0
  153. package/lib/runtime/api-gateway-path.test.js +65 -0
  154. package/lib/runtime/case-redirect.d.ts +22 -0
  155. package/lib/runtime/case-redirect.js +63 -0
  156. package/lib/runtime/case-redirect.test.d.ts +1 -0
  157. package/lib/runtime/case-redirect.test.js +32 -0
  158. package/lib/runtime/core.d.ts +234 -0
  159. package/lib/runtime/core.js +1213 -0
  160. package/lib/runtime/core.test.d.ts +1 -0
  161. package/lib/runtime/core.test.js +1678 -0
  162. package/lib/runtime/deployment-root.d.ts +13 -0
  163. package/lib/runtime/deployment-root.js +29 -0
  164. package/lib/runtime/dispatch.d.ts +331 -0
  165. package/lib/runtime/dispatch.js +751 -0
  166. package/lib/runtime/dispatch.test.d.ts +1 -0
  167. package/lib/runtime/dispatch.test.js +853 -0
  168. package/lib/runtime/entrypoints.d.ts +57 -0
  169. package/lib/runtime/entrypoints.js +115 -0
  170. package/lib/runtime/http/abort-signal.d.ts +6 -0
  171. package/lib/runtime/http/abort-signal.js +19 -0
  172. package/lib/runtime/http/abort-signal.test.d.ts +1 -0
  173. package/lib/runtime/http/abort-signal.test.js +49 -0
  174. package/lib/runtime/http/node-server.d.ts +38 -0
  175. package/lib/runtime/http/node-server.js +99 -0
  176. package/lib/runtime/http/node-server.test.d.ts +1 -0
  177. package/lib/runtime/http/node-server.test.js +96 -0
  178. package/lib/runtime/http/node-sink.d.ts +16 -0
  179. package/lib/runtime/http/node-sink.js +48 -0
  180. package/lib/runtime/http/node-sink.test.d.ts +1 -0
  181. package/lib/runtime/http/node-sink.test.js +66 -0
  182. package/lib/runtime/http/request.d.ts +62 -0
  183. package/lib/runtime/http/request.js +134 -0
  184. package/lib/runtime/http/request.test.d.ts +1 -0
  185. package/lib/runtime/http/request.test.js +103 -0
  186. package/lib/runtime/http/response.d.ts +77 -0
  187. package/lib/runtime/http/response.js +229 -0
  188. package/lib/runtime/http/response.test.d.ts +1 -0
  189. package/lib/runtime/http/response.test.js +178 -0
  190. package/lib/runtime/http/sink.d.ts +73 -0
  191. package/lib/runtime/http/sink.js +188 -0
  192. package/lib/runtime/http/sink.test.d.ts +1 -0
  193. package/lib/runtime/http/sink.test.js +257 -0
  194. package/lib/runtime/image-utils.d.ts +78 -0
  195. package/lib/runtime/image-utils.js +129 -0
  196. package/lib/runtime/image-utils.test.d.ts +1 -0
  197. package/lib/runtime/image-utils.test.js +237 -0
  198. package/lib/runtime/image.d.ts +76 -0
  199. package/lib/runtime/image.js +296 -0
  200. package/lib/runtime/image.test.d.ts +1 -0
  201. package/lib/runtime/image.test.js +405 -0
  202. package/lib/runtime/lambda-event.d.ts +4 -0
  203. package/lib/runtime/lambda-event.js +113 -0
  204. package/lib/runtime/lambda-event.test.d.ts +1 -0
  205. package/lib/runtime/lambda-event.test.js +119 -0
  206. package/lib/runtime/lambda.mjs +41595 -0
  207. package/lib/runtime/load-module.d.ts +8 -0
  208. package/lib/runtime/load-module.js +35 -0
  209. package/lib/runtime/manifest.d.ts +215 -0
  210. package/lib/runtime/manifest.js +118 -0
  211. package/lib/runtime/middleware.d.ts +43 -0
  212. package/lib/runtime/middleware.js +113 -0
  213. package/lib/runtime/middleware.test.d.ts +1 -0
  214. package/lib/runtime/middleware.test.js +259 -0
  215. package/lib/runtime/next-modules.d.ts +55 -0
  216. package/lib/runtime/next-modules.js +124 -0
  217. package/lib/runtime/next-modules.test.d.ts +1 -0
  218. package/lib/runtime/next-modules.test.js +34 -0
  219. package/lib/runtime/public-files.d.ts +32 -0
  220. package/lib/runtime/public-files.js +117 -0
  221. package/lib/runtime/public-files.test.d.ts +1 -0
  222. package/lib/runtime/public-files.test.js +97 -0
  223. package/lib/runtime/server.mjs +41588 -0
  224. package/lib/runtime/static-files.d.ts +50 -0
  225. package/lib/runtime/static-files.js +266 -0
  226. package/lib/runtime/static-files.test.d.ts +1 -0
  227. package/lib/runtime/static-files.test.js +118 -0
  228. package/lib/runtime/util.d.ts +28 -0
  229. package/lib/runtime/util.js +79 -0
  230. package/lib/utils/base-path.d.ts +123 -11
  231. package/lib/utils/base-path.js +276 -39
  232. package/lib/utils/base-path.test.js +275 -50
  233. package/lib/utils/get-architecture.d.ts +7 -8
  234. package/lib/utils/get-architecture.js +12 -13
  235. package/lib/utils/zip-directory.d.ts +14 -0
  236. package/lib/utils/zip-directory.js +121 -0
  237. package/lib/utils/zip-directory.test.d.ts +1 -0
  238. package/lib/utils/zip-directory.test.js +99 -0
  239. package/package.json +22 -3
  240. package/scripts/capture-adapter-fixture.mjs +325 -0
  241. package/scripts/e2e-deploy.sh +398 -0
  242. package/scripts/e2e-harness/README.md +707 -0
  243. package/scripts/e2e-harness/app.js +370 -0
  244. package/scripts/e2e-harness/common.sh +249 -0
  245. package/scripts/e2e-harness/screen.mjs +302 -0
  246. package/scripts/e2e-harness/stage-proxy.mjs +145 -0
  247. package/scripts/e2e-harness/type-filters.mjs +47 -0
  248. package/scripts/e2e-logs.sh +75 -0
  249. package/scripts/e2e-offline.sh +91 -0
  250. package/scripts/e2e-sweep.sh +370 -0
  251. package/scripts/e2e-warm.sh +114 -0
  252. package/scripts/zero-config-build.mjs +418 -0
  253. package/docs/1k-concurrent-users-executions.png +0 -0
  254. package/docs/plans/adapter-runtime-release.md +0 -362
  255. package/docs/plans/phase-0-image-function-opt-in.md +0 -295
  256. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
  257. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
  258. package/lib/image-optimization/handler-utils.d.ts +0 -34
  259. package/lib/image-optimization/handler-utils.js +0 -83
  260. package/lib/image-optimization/handler-utils.test.js +0 -178
  261. package/lib/nextjs-build/functions.Dockerfile +0 -31
  262. package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
  263. package/lib/nextjs-compute/nextjs-image-function.js +0 -59
  264. package/lib/utils/experimental-flags.d.ts +0 -24
  265. package/lib/utils/experimental-flags.js +0 -30
  266. /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
@@ -1,8 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const node_fs_1 = require("node:fs");
4
- const node_os_1 = require("node:os");
5
- const node_path_1 = require("node:path");
6
3
  const constants_1 = require("../constants");
7
4
  const base_path_1 = require("./base-path");
8
5
  const GLOBAL = [constants_1.NextjsType.GLOBAL_FUNCTIONS, constants_1.NextjsType.GLOBAL_CONTAINERS];
@@ -22,6 +19,21 @@ describe("normalizeBasePath", () => {
22
19
  expect((0, base_path_1.normalizeBasePath)("/team/app/")).toBe("team/app");
23
20
  });
24
21
  });
22
+ describe("wholeAppInvalidationPaths", () => {
23
+ it("is the whole distribution without a basePath", () => {
24
+ expect((0, base_path_1.wholeAppInvalidationPaths)()).toEqual(["/*"]);
25
+ expect((0, base_path_1.wholeAppInvalidationPaths)("")).toEqual(["/*"]);
26
+ });
27
+ it("covers the app's root and RSC payload, but no sibling prefix", () => {
28
+ for (const basePath of ["/base", "base", "/base/"]) {
29
+ expect((0, base_path_1.wholeAppInvalidationPaths)(basePath)).toEqual([
30
+ "/base",
31
+ "/base?*",
32
+ "/base/*",
33
+ ]);
34
+ }
35
+ });
36
+ });
25
37
  describe("joinPath", () => {
26
38
  const origin = "https://d111111abcdef8.cloudfront.net";
27
39
  it("drops empty parts", () => {
@@ -41,48 +53,152 @@ describe("joinPath", () => {
41
53
  expect((0, base_path_1.joinPath)()).toBe("");
42
54
  expect((0, base_path_1.joinPath)(undefined, "", "/")).toBe("");
43
55
  });
56
+ // How `NextjsRegionalContainers.url` appends the app's basePath: the ALB
57
+ // forwards every path to the container unchanged, so the app only answers
58
+ // under its own basePath and the bare ALB URL would 404.
59
+ it("appends an app basePath to a bare ALB origin", () => {
60
+ const alb = "http://my-alb-123.us-east-1.elb.amazonaws.com";
61
+ expect((0, base_path_1.joinPath)(alb, "base")).toBe(`${alb}/base`);
62
+ expect((0, base_path_1.joinPath)(alb, "team/app")).toBe(`${alb}/team/app`);
63
+ // An app with no basePath is served at the origin itself.
64
+ expect((0, base_path_1.joinPath)(alb, "")).toBe(alb);
65
+ });
44
66
  });
45
- describe("readNextConfigBasePath", () => {
46
- let dotNextPath;
47
- let warn;
48
- beforeEach(() => {
49
- dotNextPath = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "base-path-"));
50
- warn = jest.spyOn(console, "warn").mockImplementation(() => { });
51
- });
52
- afterEach(() => {
53
- warn.mockRestore();
54
- (0, node_fs_1.rmSync)(dotNextPath, { recursive: true, force: true });
55
- });
56
- function writeRequiredServerFiles(contents) {
57
- (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dotNextPath, "required-server-files.json"), contents);
58
- }
59
- it("reads the app's basePath and strips the leading slash", () => {
60
- writeRequiredServerFiles(JSON.stringify({ config: { basePath: "/prod" } }));
61
- expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("prod");
62
- expect(warn).not.toHaveBeenCalled();
63
- });
64
- it("returns an empty string when the app sets no basePath", () => {
65
- // `next build` writes basePath: "" rather than omitting it.
66
- writeRequiredServerFiles(JSON.stringify({ config: { basePath: "" } }));
67
- expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("");
68
- expect(warn).not.toHaveBeenCalled();
69
- });
70
- // Degrading to "" is deliberate, but it's indistinguishable from an app that
71
- // sets no basePath, so it has to be visible: the Global constructs derive
72
- // their basePath from this value and would otherwise 404 every static asset
73
- // with nothing but a silent fallback to explain it.
74
- it("warns when required-server-files.json is missing", () => {
75
- expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("");
76
- expect(warn).toHaveBeenCalledWith(expect.stringContaining("required-server-files.json"));
77
- });
78
- it("warns when the file isn't valid JSON", () => {
79
- writeRequiredServerFiles("not json");
80
- expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("");
81
- expect(warn).toHaveBeenCalledWith(expect.stringContaining("Could not read basePath"));
82
- });
83
- it("returns an empty string when the file has no config key", () => {
84
- writeRequiredServerFiles(JSON.stringify({ files: [] }));
85
- expect((0, base_path_1.readNextConfigBasePath)(dotNextPath)).toBe("");
67
+ describe("prefixWithBasePath", () => {
68
+ // The health check path is handed to things that talk to the app directly (an
69
+ // ALB target group, the container's own health probe), and the app only
70
+ // answers under its basePath. Unprefixed, every check 404s: the target never
71
+ // turns healthy, so tasks are killed on the health check interval and the
72
+ // deployment rolls back.
73
+ it("prefixes a health check path with the app's basePath", () => {
74
+ expect((0, base_path_1.prefixWithBasePath)("base", "/api/health")).toBe("/base/api/health");
75
+ expect((0, base_path_1.prefixWithBasePath)("/base/", "/api/health")).toBe("/base/api/health");
76
+ });
77
+ it("leaves the path untouched when the app sets no basePath", () => {
78
+ expect((0, base_path_1.prefixWithBasePath)(undefined, "/api/health")).toBe("/api/health");
79
+ expect((0, base_path_1.prefixWithBasePath)("", "/api/health")).toBe("/api/health");
80
+ expect((0, base_path_1.prefixWithBasePath)("/", "/api/health")).toBe("/api/health");
81
+ });
82
+ it("always returns a leading slash, whatever the path came with", () => {
83
+ // The ALB health check and the readiness check URL both need an absolute
84
+ // path, so the result can't come back bare. Without a basePath a bare path
85
+ // used to pass straight through, which concatenated into
86
+ // "http://127.0.0.1:3000api/health" as the readiness check URL.
87
+ expect((0, base_path_1.prefixWithBasePath)("base", "api/health")).toBe("/base/api/health");
88
+ expect((0, base_path_1.prefixWithBasePath)(undefined, "api/health")).toBe("/api/health");
89
+ expect((0, base_path_1.prefixWithBasePath)("", "api/health")).toBe("/api/health");
90
+ });
91
+ // The path is what the app routes, without basePath, and it is prefixed
92
+ // whether or not it already looks prefixed: an app can route "/base/base/..."
93
+ // legitimately, so treating a leading "/base" as already-prefixed would make
94
+ // that path unreachable and give the prop two meanings. Users who prefixed
95
+ // `healthCheckPath` by hand to work around the missing prefix drop it on
96
+ // upgrade — documented in docs/breaking-changes.md under 0.6.0.
97
+ it("prefixes a path that already looks prefixed", () => {
98
+ expect((0, base_path_1.prefixWithBasePath)("base", "/base/api/health")).toBe("/base/base/api/health");
99
+ });
100
+ // A `trailingSlash: true` app redirects "/api/health" to "/api/health/" with a
101
+ // 308, which an ALB health check doesn't count as healthy, so the slash the
102
+ // user wrote has to survive.
103
+ it("preserves a trailing slash", () => {
104
+ expect((0, base_path_1.prefixWithBasePath)("base", "/api/health/")).toBe("/base/api/health/");
105
+ expect((0, base_path_1.prefixWithBasePath)(undefined, "/api/health/")).toBe("/api/health/");
106
+ });
107
+ it("handles a nested basePath, as REGIONAL_FUNCTIONS can produce", () => {
108
+ // An app at the `prod` stage nested under "/base" sets `basePath:
109
+ // "/prod/base"`, and the readiness check hits the local server, so the
110
+ // whole prefix has to be there.
111
+ expect((0, base_path_1.prefixWithBasePath)("/prod/base", "/api/health")).toBe("/prod/base/api/health");
112
+ });
113
+ });
114
+ describe("basePathPrefix", () => {
115
+ it("spells every basePath the way Next.js does", () => {
116
+ for (const value of ["/base", "base", "/base/", "//base//"]) {
117
+ expect((0, base_path_1.basePathPrefix)(value)).toBe("/base");
118
+ }
119
+ expect((0, base_path_1.basePathPrefix)("/a/b/")).toBe("/a/b");
120
+ expect((0, base_path_1.basePathPrefix)("/")).toBe("");
121
+ expect((0, base_path_1.basePathPrefix)(undefined)).toBe("");
122
+ });
123
+ });
124
+ describe("relativeAssetPrefix", () => {
125
+ it("reads a path-style assetPrefix with one leading slash", () => {
126
+ expect((0, base_path_1.relativeAssetPrefix)("/custom-asset-prefix")).toBe("/custom-asset-prefix");
127
+ expect((0, base_path_1.relativeAssetPrefix)("custom-asset-prefix/")).toBe("/custom-asset-prefix");
128
+ expect((0, base_path_1.relativeAssetPrefix)("")).toBe("");
129
+ expect((0, base_path_1.relativeAssetPrefix)("/")).toBe("");
130
+ });
131
+ it("ignores an absolute assetPrefix", () => {
132
+ // It names an origin cdk-nextjs does not serve, so there is no behavior to
133
+ // add and nothing the distribution could get wrong.
134
+ for (const assetPrefix of [
135
+ "https://cdn.example.com",
136
+ "http://cdn.example.com/x",
137
+ "//cdn.example.com",
138
+ ]) {
139
+ expect((0, base_path_1.relativeAssetPrefix)(assetPrefix)).toBe("");
140
+ }
141
+ });
142
+ });
143
+ describe("assetPrefixPath", () => {
144
+ it("reports the path an absolute assetPrefix carries too", () => {
145
+ // `relativeAssetPrefix` answers "is this a prefix the regional NextjsTypes
146
+ // cannot serve"; this answers "what path do bundle URLs carry", and an
147
+ // absolute prefix with a path carries one — `next build` compiles a
148
+ // rewrite for it, so `next start` serves bundles there. See
149
+ // `test/e2e/app-dir/asset-prefix-absolute`.
150
+ for (const [assetPrefix, path] of [
151
+ ["https://example.vercel.sh/custom-asset-prefix", "/custom-asset-prefix"],
152
+ ["//example.vercel.sh/cdn/", "/cdn"],
153
+ ["https://example.vercel.sh/", ""],
154
+ ["https://example.vercel.sh", ""],
155
+ ["/cdn", "/cdn"],
156
+ ["", ""],
157
+ ]) {
158
+ expect((0, base_path_1.assetPrefixPath)(assetPrefix)).toBe(path);
159
+ }
160
+ });
161
+ });
162
+ describe("isAssetPrefixUnserved", () => {
163
+ const REGIONAL = [
164
+ constants_1.NextjsType.REGIONAL_FUNCTIONS,
165
+ constants_1.NextjsType.REGIONAL_CONTAINERS,
166
+ ];
167
+ it.each(REGIONAL)("%s: does not flag the assetPrefix Next.js derives from basePath", (nextjsType) => {
168
+ // The regression this function was extracted for. An app that sets only
169
+ // `basePath: "/prod"` — `examples/regional-functions`, and every regional
170
+ // deployment with a basePath — gets
171
+ // `{"assetPrefix":"/prod","basePath":"/prod"}` in
172
+ // `required-server-files.json`, because Next.js resolves one from the other.
173
+ // Flagging that told users their bundles would 404 at the one path that does
174
+ // serve them, on every synth.
175
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod", "prod")).toBe(false);
176
+ // Both sides arrive in different shapes — the assetPrefix reader adds a
177
+ // leading slash, the basePath reader strips one — so the comparison has to
178
+ // normalize rather than compare strings.
179
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod", "/prod/")).toBe(false);
180
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/a/b", "a/b")).toBe(false);
181
+ });
182
+ it.each(REGIONAL)("%s: flags a prefix nothing serves", (nextjsType) => {
183
+ // A genuinely different prefix is the case the warning exists for: bundles are
184
+ // requested at `/cdn/_next/static/...` and neither API Gateway's
185
+ // `_next/static` resource nor the container's own files answer there.
186
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", "prod")).toBe(true);
187
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", undefined)).toBe(true);
188
+ // A prefix *under* the basePath is still a different path, not a match.
189
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/prod/cdn", "prod")).toBe(true);
190
+ });
191
+ it.each(GLOBAL)("%s: flags nothing, having a behavior for it", (nextjsType) => {
192
+ // `NextjsDistribution` adds a cache behavior for the prefix, so on these types
193
+ // any prefix is served.
194
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", "prod")).toBe(false);
195
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "/cdn", undefined)).toBe(false);
196
+ });
197
+ it.each(Object.values(constants_1.NextjsType))("%s: flags nothing when there is no prefix", (nextjsType) => {
198
+ // `relativeAssetPrefix` already reduces an absolute prefix to `""`,
199
+ // which is the supported way to serve assets from another origin.
200
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "", "prod")).toBe(false);
201
+ expect((0, base_path_1.isAssetPrefixUnserved)(nextjsType, "", undefined)).toBe(false);
86
202
  });
87
203
  });
88
204
  describe("resolveBasePath", () => {
@@ -120,12 +236,71 @@ describe("resolveBasePath", () => {
120
236
  });
121
237
  });
122
238
  describe(constants_1.NextjsType.REGIONAL_FUNCTIONS, () => {
239
+ const RF = constants_1.NextjsType.REGIONAL_FUNCTIONS;
240
+ const stage = (name) => ({
241
+ strippedPrefix: name,
242
+ customDomain: false,
243
+ });
244
+ const domain = (mapping = "") => ({
245
+ strippedPrefix: mapping,
246
+ customDomain: true,
247
+ });
248
+ let warn;
249
+ beforeEach(() => {
250
+ warn = jest.spyOn(console, "warn").mockImplementation(() => { });
251
+ });
252
+ afterEach(() => warn.mockRestore());
123
253
  // API Gateway strips the stage before matching resources, so an app served
124
- // at the default `prod` stage sets basePath: "/prod" and leaves the prop
125
- // unset. Same shape as a custom domain base path mapping. Deriving here
126
- // would nest every resource under a path the stage already consumed.
127
- it("does not derive the app's basePath", () => {
128
- expect((0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, undefined, "/prod")).toBeUndefined();
254
+ // at the default `prod` stage sets basePath: "/prod" and its resources live
255
+ // at the root. Mounting them under "prod" would nest every resource under a
256
+ // path the stage already consumed.
257
+ // A domain attached with `addDomainName({ basePath: "v1" })` strips "/v1"
258
+ // where synth can't see it; "/" is how the user says so. Deriving would
259
+ // mount everything under "v1", which the stripped requests never reach.
260
+ it('mounts at the root when the prop is "/", instead of deriving', () => {
261
+ expect((0, base_path_1.resolveBasePath)(RF, "/", "/v1")).toBeUndefined();
262
+ expect((0, base_path_1.resolveBasePath)(RF, "/", "/v1", domain())).toBeUndefined();
263
+ expect((0, base_path_1.resolveBasePath)(RF, "/", "/prod/base")).toBeUndefined();
264
+ // Unset still derives.
265
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/v1")).toBe("v1");
266
+ });
267
+ it("mounts an app whose basePath is the stage at the root", () => {
268
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/prod")).toBeUndefined();
269
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/test", stage("test"))).toBeUndefined();
270
+ expect(warn).not.toHaveBeenCalled();
271
+ });
272
+ it("mounts the rest of a basePath nested below the stage", () => {
273
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/prod/base")).toBe("base");
274
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/v2/a/b", stage("v2"))).toBe("a/b");
275
+ });
276
+ // The case that used to 404 every bundle: a custom domain mapped at the root
277
+ // strips nothing, so the app's basePath is a real resource path, and left at
278
+ // the root `_next/static` fell through to the Lambda catch-all.
279
+ it("mounts an app under its whole basePath when nothing strips it", () => {
280
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", domain())).toBe("docs");
281
+ expect(warn).not.toHaveBeenCalled();
282
+ });
283
+ it("strips a custom domain's base path mapping like a stage", () => {
284
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/app", domain("app"))).toBeUndefined();
285
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/app/docs", domain("app"))).toBe("docs");
286
+ });
287
+ it("matches the stage on a segment boundary", () => {
288
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/production", domain())).toBe("production");
289
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/production", stage("prod"))).toBe("production");
290
+ });
291
+ // Without a custom domain the app's own links miss the stage, which synth
292
+ // can say but not fix - a domain attached with `addDomainName` is invisible.
293
+ it("warns when an execute-api app's basePath lacks the stage", () => {
294
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs")).toBe("docs");
295
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/prod/docs"`'));
296
+ });
297
+ it("warns when a custom domain's base path mapping is missing from the app's basePath", () => {
298
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", domain("v1"))).toBe("docs");
299
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/v1/docs"`'));
300
+ });
301
+ it("derives nothing when the stage is a token", () => {
302
+ expect((0, base_path_1.resolveBasePath)(RF, undefined, "/docs", { customDomain: false })).toBeUndefined();
303
+ expect(warn).not.toHaveBeenCalled();
129
304
  });
130
305
  // The stripped prefix is part of what the app emits but never part of the
131
306
  // resource path, so an app at the `prod` stage nested under "/base" sets
@@ -139,6 +314,56 @@ describe("resolveBasePath", () => {
139
314
  // emit "/prod/..." while the resources live under "/prod/base/...".
140
315
  expect(() => (0, base_path_1.resolveBasePath)(constants_1.NextjsType.REGIONAL_FUNCTIONS, "/prod", "/prod/base")).toThrow(/nests every API Gateway resource under that path/);
141
316
  });
317
+ // Any other leading prefix is served at `/prod/base/...` while the app
318
+ // links to `/foo/base/...`, so only the stripped prefix itself qualifies.
319
+ // Behind a custom domain synth can see, that is certain.
320
+ it("only accepts the stripped prefix in front of the prop", () => {
321
+ expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/app/docs", domain("app"))).toBe("docs");
322
+ expect(() => (0, base_path_1.resolveBasePath)(RF, "/docs", "/prod/docs", domain("app"))).toThrow(/nests every API Gateway resource under that path/);
323
+ // A custom domain mapped at the root strips nothing, so only equality works.
324
+ expect(() => (0, base_path_1.resolveBasePath)(RF, "/docs", "/v1/docs", domain())).toThrow(/nests every API Gateway resource under that path/);
325
+ });
326
+ // On the execute-api endpoint a domain attached later with
327
+ // `addDomainName({ basePath: "v1" })` can strip the leading part, and an
328
+ // explicit prop wins, so any other leading prefix warns instead.
329
+ it("warns on another leading prefix when only the stage is known", () => {
330
+ expect((0, base_path_1.resolveBasePath)(RF, "/app", "/v1/app")).toBe("app");
331
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('addDomainName({ basePath: "v1" })'));
332
+ warn.mockClear();
333
+ expect((0, base_path_1.resolveBasePath)(RF, "/base", "/prod/x/base")).toBe("base");
334
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('addDomainName({ basePath: "prod/x" })'));
335
+ });
336
+ it("falls back to a trailing segment when the stage is a token", () => {
337
+ expect((0, base_path_1.resolveBasePath)(RF, "/base", "/foo/base", { customDomain: false })).toBe("base");
338
+ });
339
+ // Agreeing with the app is not enough when the value starts with the stage:
340
+ // resources under "prod" are only reached at "/prod/prod/...".
341
+ // Certain behind a custom domain synth can see; on the execute-api
342
+ // endpoint an `addDomainName()` domain mapped at the root makes it right,
343
+ // so there it only warns.
344
+ it("rejects a prop equal to an app basePath that starts with the stage", () => {
345
+ expect(() => (0, base_path_1.resolveBasePath)(RF, "/app", "/app", domain("app"))).toThrow(/strips "\/app"/);
346
+ expect(() => (0, base_path_1.resolveBasePath)(RF, "/app/base", "/app/base", domain("app"))).toThrow(/Leave the prop unset/);
347
+ expect((0, base_path_1.resolveBasePath)(RF, "/prod", "/prod")).toBe("prod");
348
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('strips "/prod" before matching resources'));
349
+ warn.mockClear();
350
+ expect((0, base_path_1.resolveBasePath)(RF, "/prod/base", "/prod/base")).toBe("prod/base");
351
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining("addDomainName()"));
352
+ });
353
+ it("accepts a matching prop and app basePath nothing strips", () => {
354
+ expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/docs", domain())).toBe("docs");
355
+ expect((0, base_path_1.resolveBasePath)(RF, "/prod", "/prod", { customDomain: false })).toBe("prod");
356
+ expect(warn).not.toHaveBeenCalled();
357
+ });
358
+ // Matching the app is the unset case's problem again when a stage or
359
+ // mapping is stripped that the app's basePath lacks, so it warns the same.
360
+ it("warns when a matching prop and app basePath lack the stage", () => {
361
+ expect((0, base_path_1.resolveBasePath)(RF, "/production", "/production")).toBe("production");
362
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/prod/production"`'));
363
+ warn.mockClear();
364
+ expect((0, base_path_1.resolveBasePath)(RF, "/docs", "/docs", domain("v1"))).toBe("docs");
365
+ expect(warn).toHaveBeenCalledWith(expect.stringContaining('Set `basePath: "/v1/docs"`'));
366
+ });
142
367
  // The reverse is never right: the prop nests every resource, including the
143
368
  // catch-all, under a path the app never links to.
144
369
  it("rejects the prop setting a basePath the app doesn't", () => {
@@ -160,4 +385,4 @@ describe("resolveBasePath", () => {
160
385
  });
161
386
  });
162
387
  });
163
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1wYXRoLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYmFzZS1wYXRoLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBNkQ7QUFDN0QscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw0Q0FBMEM7QUFDMUMsMkNBS3FCO0FBRXJCLE1BQU0sTUFBTSxHQUFHLENBQUMsc0JBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFM0UsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIs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LHNCQUFVLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUMzRCxDQUFDLE9BQU8sQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQVUsQ0FBQyxtQkFBbUIsRUFBRSxHQUFHLEVBQUU7UUFDNUMsMkVBQTJFO1FBQzNFLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUsRUFBRSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUMxRCxNQUFNLFVBQVUsR0FBRyxzQkFBVSxDQUFDLG1CQUFtQixDQUFDO1lBQ2xELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMxRCxNQUFNLENBQUMsSUFBQSwyQkFBZSxFQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxNQUFNLENBQUMsSUFBQSwyQkFBZSxFQUFDLFVBQVUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBta2R0ZW1wU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgTmV4dGpzVHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGpvaW5QYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcmVhZE5leHRDb25maWdCYXNlUGF0aCxcbiAgcmVzb2x2ZUJhc2VQYXRoLFxufSBmcm9tIFwiLi9iYXNlLXBhdGhcIjtcblxuY29uc3QgR0xPQkFMID0gW05leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUywgTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU107XG5cbmRlc2NyaWJlKFwibm9ybWFsaXplQmFzZVBhdGhcIiwgKCkgPT4ge1xuICBpdChcInJlZHVjZXMgdmFsdWVzIGFkZHJlc3NpbmcgdGhlIHNhbWUgcGF0aCB0byB0aGUgc2FtZSBzZWdtZW50XCIsICgpID0+IHtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiL2Jhc2UvXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvL2Jhc2UvL1wiKSkudG9CZShcImJhc2VcIik7XG4gIH0pO1xuXG4gIGl0KFwibWFwcyB1bmRlZmluZWQgYW5kIGVtcHR5IHZhbHVlcyB0byBhbiBlbXB0eSBzdHJpbmdcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aCh1bmRlZmluZWQpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIlwiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvXCIpKS50b0JlKFwiXCIpO1xuICB9KTtcblxuICBpdChcImtlZXBzIGludGVyaW9yIHNsYXNoZXMgb2YgYSBuZXN0ZWQgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi90ZWFtL2FwcC9cIikpLnRvQmUoXCJ0ZWFtL2FwcFwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJqb2luUGF0aFwiLCAoKSA9PiB7XG4gIGNvbnN0IG9yaWdpbiA9IFwiaHR0cHM6Ly9kMTExMTExYWJjZGVmOC5jbG91ZGZyb250Lm5ldFwiO1xuXG4gIGl0KFwiZHJvcHMgZW1wdHkgcGFydHNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4pKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCJcIikpLnRvQmUob3JpZ2luKTtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCB1bmRlZmluZWQpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCIvXCIpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKFwiXCIsIFwiYmFzZVwiLCB1bmRlZmluZWQsIFwiX25leHQvc3RhdGljXCIpKS50b0JlKFxuICAgICAgXCJiYXNlL19uZXh0L3N0YXRpY1wiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwiam9pbnMgd2l0aCBleGFjdGx5IG9uZSBzbGFzaCByZWdhcmRsZXNzIG9mIGVhY2ggcGFydCdzIHNsYXNoZXNcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiL2Jhc2VcIikpLnRvQmUoYCR7b3JpZ2lufS9iYXNlYCk7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCJiYXNlL1wiKSkudG9CZShgJHtvcmlnaW59L2Jhc2VgKTtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCBcIi90ZWFtL2FwcC9cIikpLnRvQmUoYCR7b3JpZ2lufS90ZWFtL2FwcGApO1xuICAgIGV4cGVjdChqb2luUGF0aChcIi9iYXNlL1wiLCBcIi9fbmV4dC9zdGF0aWMve2tleX1cIikpLnRvQmUoXG4gICAgICBcImJhc2UvX25leHQvc3RhdGljL3trZXl9XCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIGV2ZXJ5IHBhcnQgaXMgZW1wdHlcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChqb2luUGF0aCgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChqb2luUGF0aCh1bmRlZmluZWQsIFwiXCIsIFwiL1wiKSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoXCIsICgpID0+IHtcbiAgbGV0IGRvdE5leHRQYXRoOiBzdHJpbmc7XG4gIGxldCB3YXJuOiBqZXN0LlNweUluc3RhbmNlO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRvdE5leHRQYXRoID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJiYXNlLXBhdGgtXCIpKTtcbiAgICB3YXJuID0gamVzdC5zcHlPbihjb25zb2xlLCBcIndhcm5cIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgfSk7XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICB3YXJuLm1vY2tSZXN0b3JlKCk7XG4gICAgcm1TeW5jKGRvdE5leHRQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHdyaXRlUmVxdWlyZWRTZXJ2ZXJGaWxlcyhjb250ZW50czogc3RyaW5nKSB7XG4gICAgd3JpdGVGaWxlU3luYyhqb2luKGRvdE5leHRQYXRoLCBcInJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uXCIpLCBjb250ZW50cyk7XG4gIH1cblxuICBpdChcInJlYWRzIHRoZSBhcHAncyBiYXNlUGF0aCBhbmQgc3RyaXBzIHRoZSBsZWFkaW5nIHNsYXNoXCIsICgpID0+IHtcbiAgICB3cml0ZVJlcXVpcmVkU2VydmVyRmlsZXMoSlNPTi5zdHJpbmdpZnkoeyBjb25maWc6IHsgYmFzZVBhdGg6IFwiL3Byb2RcIiB9IH0pKTtcblxuICAgIGV4cGVjdChyZWFkTmV4dENvbmZpZ0Jhc2VQYXRoKGRvdE5leHRQYXRoKSkudG9CZShcInByb2RcIik7XG4gICAgZXhwZWN0KHdhcm4pLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiB0aGUgYXBwIHNldHMgbm8gYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIC8vIGBuZXh0IGJ1aWxkYCB3cml0ZXMgYmFzZVBhdGg6IFwiXCIgcmF0aGVyIHRoYW4gb21pdHRpbmcgaXQuXG4gICAgd3JpdGVSZXF1aXJlZFNlcnZlckZpbGVzKEpTT04uc3RyaW5naWZ5KHsgY29uZmlnOiB7IGJhc2VQYXRoOiBcIlwiIH0gfSkpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICAvLyBEZWdyYWRpbmcgdG8gXCJcIiBpcyBkZWxpYmVyYXRlLCBidXQgaXQncyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGFuIGFwcCB0aGF0XG4gIC8vIHNldHMgbm8gYmFzZVBhdGgsIHNvIGl0IGhhcyB0byBiZSB2aXNpYmxlOiB0aGUgR2xvYmFsIGNvbnN0cnVjdHMgZGVyaXZlXG4gIC8vIHRoZWlyIGJhc2VQYXRoIGZyb20gdGhpcyB2YWx1ZSBhbmQgd291bGQgb3RoZXJ3aXNlIDQwNCBldmVyeSBzdGF0aWMgYXNzZXRcbiAgLy8gd2l0aCBub3RoaW5nIGJ1dCBhIHNpbGVudCBmYWxsYmFjayB0byBleHBsYWluIGl0LlxuICBpdChcIndhcm5zIHdoZW4gcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb24gaXMgbWlzc2luZ1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwicmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIiksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJ3YXJucyB3aGVuIHRoZSBmaWxlIGlzbid0IHZhbGlkIEpTT05cIiwgKCkgPT4ge1xuICAgIHdyaXRlUmVxdWlyZWRTZXJ2ZXJGaWxlcyhcIm5vdCBqc29uXCIpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKFwiQ291bGQgbm90IHJlYWQgYmFzZVBhdGhcIiksXG4gICAgKTtcbiAgfSk7XG5cbiAgaXQoXCJyZXR1cm5zIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBmaWxlIGhhcyBubyBjb25maWcga2V5XCIsICgpID0+IHtcbiAgICB3cml0ZVJlcXVpcmVkU2VydmVyRmlsZXMoSlNPTi5zdHJpbmdpZnkoeyBmaWxlczogW10gfSkpO1xuXG4gICAgZXhwZWN0KHJlYWROZXh0Q29uZmlnQmFzZVBhdGgoZG90TmV4dFBhdGgpKS50b0JlKFwiXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInJlc29sdmVCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIGRlc2NyaWJlLmVhY2goT2JqZWN0LnZhbHVlcyhOZXh0anNUeXBlKSkoXCIlc1wiLCAobmV4dGpzVHlwZSkgPT4ge1xuICAgIGl0KFwicmVzb2x2ZXMgdG8gdW5kZWZpbmVkIHdoZW4gYm90aCBhcmUgdW5zZXRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIlwiLCBcIlwiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgLy8gTm9ybWFsaXplcyB0byBlbXB0eSwgc28gaXQncyB0aGUgc2FtZSBhcyB1bnNldCByYXRoZXIgdGhhbiBhIHByZWZpeC5cbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG5cbiAgICAvLyBPbmUgc2hhcGUgb3V0LCB3aGF0ZXZlciBzaGFwZSBjYW1lIGluOiBjb25zdW1lcnMgdGhhdCBuZWVkIGEgbGVhZGluZ1xuICAgIC8vIHNsYXNoIChvbmx5IGBOZXh0anNEaXN0cmlidXRpb25gJ3MgcGF0aCBwYXR0ZXJucykgYWRkIHRoZWlyIG93biwgc29cbiAgICAvLyBub3RoaW5nIGRvd25zdHJlYW0gaGFzIHRvIHJlLW5vcm1hbGl6ZS5cbiAgICBpdChcIm5vcm1hbGl6ZXMgdGhlIHByb3Agd2hlbiBpdCBtYXRjaGVzIHRoZSBhcHBcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9iYXNlXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcImJhc2VcIiwgXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2Jhc2UvXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcImJhc2UvL1wiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUuZWFjaChHTE9CQUwpKFwiJXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICAvLyBDbG91ZEZyb250IHVzZXMgdGhlIHJlcXVlc3QgcGF0aCB2ZXJiYXRpbSBhcyB0aGUgUzMgb2JqZWN0IGtleSwgc28gdGhlXG4gICAgLy8gcHJvcCBoYXMgdG8gYmUgdGhlIHByZWZpeCB0aGUgYXBwIGVtaXRzIOKAlCB0aGVyZSdzIGV4YWN0bHkgb25lIHZhbGlkIHZhbHVlLFxuICAgIC8vIHdoaWNoIG1ha2VzIHRoZSBhcHAncyBjb25maWcgdGhlIHNvdXJjZSBvZiB0cnV0aC5cbiAgICBpdChcImRlcml2ZXMgdGhlIHByb3AgZnJvbSB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCB1bmRlZmluZWQsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIlwiLCBcImJhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCB1bmRlZmluZWQsIFwiL3RlYW0vYXBwL1wiKSkudG9CZShcbiAgICAgICAgXCJ0ZWFtL2FwcFwiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYmFzZVwiKSkudG9UaHJvdyhcbiAgICAgICAgL0Nsb3VkRnJvbnQgc2VydmVzIHN0YXRpYyBhc3NldHMgc3RyYWlnaHQgZnJvbSBTMy8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYVwiLCBcIi9iXCIpKS50b1Rocm93KFxuICAgICAgICAncHJvcCBpcyBcIi9hXCIgYnV0IHlvdXIgTmV4dC5qcyBhcHBcXCdzIGNvbmZpZyBzZXRzIGBiYXNlUGF0aGAgdG8gXCIvYlwiJyxcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCAoKSA9PiB7XG4gICAgLy8gQVBJIEdhdGV3YXkgc3RyaXBzIHRoZSBzdGFnZSBiZWZvcmUgbWF0Y2hpbmcgcmVzb3VyY2VzLCBzbyBhbiBhcHAgc2VydmVkXG4gICAgLy8gYXQgdGhlIGRlZmF1bHQgYHByb2RgIHN0YWdlIHNldHMgYmFzZVBhdGg6IFwiL3Byb2RcIiBhbmQgbGVhdmVzIHRoZSBwcm9wXG4gICAgLy8gdW5zZXQuIFNhbWUgc2hhcGUgYXMgYSBjdXN0b20gZG9tYWluIGJhc2UgcGF0aCBtYXBwaW5nLiBEZXJpdmluZyBoZXJlXG4gICAgLy8gd291bGQgbmVzdCBldmVyeSByZXNvdXJjZSB1bmRlciBhIHBhdGggdGhlIHN0YWdlIGFscmVhZHkgY29uc3VtZWQuXG4gICAgaXQoXCJkb2VzIG5vdCBkZXJpdmUgdGhlIGFwcCdzIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCB1bmRlZmluZWQsIFwiL3Byb2RcIiksXG4gICAgICApLnRvQmVVbmRlZmluZWQoKTtcbiAgICB9KTtcblxuICAgIC8vIFRoZSBzdHJpcHBlZCBwcmVmaXggaXMgcGFydCBvZiB3aGF0IHRoZSBhcHAgZW1pdHMgYnV0IG5ldmVyIHBhcnQgb2YgdGhlXG4gICAgLy8gcmVzb3VyY2UgcGF0aCwgc28gYW4gYXBwIGF0IHRoZSBgcHJvZGAgc3RhZ2UgbmVzdGVkIHVuZGVyIFwiL2Jhc2VcIiBzZXRzXG4gICAgLy8gYmFzZVBhdGg6IFwiL3Byb2QvYmFzZVwiIGFuZCB0aGUgcHJvcCB0byBcIi9iYXNlXCIuXG4gICAgaXQoXCJhY2NlcHRzIGFuIGFwcCBiYXNlUGF0aCB0aGF0IGVuZHMgd2l0aCB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgXCIvYmFzZVwiLCBcIi9wcm9kL2Jhc2VcIiksXG4gICAgICApLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJvbmx5IGFjY2VwdHMgdGhlIHByb3AgYXMgYSB3aG9sZSB0cmFpbGluZyBwYXRoIHNlZ21lbnRcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgXCIvc2VcIiwgXCIvcHJvZC9iYXNlXCIpLFxuICAgICAgKS50b1Rocm93KC9uZXN0cyBldmVyeSBBUEkgR2F0ZXdheSByZXNvdXJjZSB1bmRlciB0aGF0IHBhdGgvKTtcbiAgICAgIC8vIExlYWRpbmcsIG5vdCB0cmFpbGluZzogQVBJIEdhdGV3YXkgc3RyaXBzIHRoZSBzdGFnZSwgc28gdGhlIGFwcCB3b3VsZFxuICAgICAgLy8gZW1pdCBcIi9wcm9kLy4uLlwiIHdoaWxlIHRoZSByZXNvdXJjZXMgbGl2ZSB1bmRlciBcIi9wcm9kL2Jhc2UvLi4uXCIuXG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9wcm9kXCIsIFwiL3Byb2QvYmFzZVwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmV2ZXJzZSBpcyBuZXZlciByaWdodDogdGhlIHByb3AgbmVzdHMgZXZlcnkgcmVzb3VyY2UsIGluY2x1ZGluZyB0aGVcbiAgICAvLyBjYXRjaC1hbGwsIHVuZGVyIGEgcGF0aCB0aGUgYXBwIG5ldmVyIGxpbmtzIHRvLlxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2FcIiwgXCIvYlwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUywgKCkgPT4ge1xuICAgIC8vIGJhc2VQYXRoIG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGhlcmU6IHRoZSBBTEIgZm9yd2FyZHMgZXZlcnkgcGF0aFxuICAgIC8vIHRvIHRoZSBjb250YWluZXIsIHdoaWNoIHNlcnZlcyBpdHMgb3duIHN0YXRpYyBhc3NldHMuIFNvIGFueSBjb21iaW5hdGlvblxuICAgIC8vIGlzIHZhbGlkLCBhbmQgdGhlIGFwcCdzIGJhc2VQYXRoIGlzIG5ldmVyIGRlcml2ZWQgaW50byB0aGUgYnVja2V0IHByZWZpeC5cbiAgICBpdChcImFjY2VwdHMgYW55IGNvbWJpbmF0aW9uLCBhbHdheXMga2VlcGluZyB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXh0anNUeXBlID0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIsIFwiL2JcIikpLnRvQmUoXCJhXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIpKS50b0JlKFwiYVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
388
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1wYXRoLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvYmFzZS1wYXRoLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw0Q0FBMEM7QUFDMUMsMkNBVXFCO0FBRXJCLE1BQU0sTUFBTSxHQUFHLENBQUMsc0JBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxzQkFBVSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFFM0UsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtJQUNqQyxFQUFFLENBQUMsNkRBQTZELEVBQUUsR0FBRyxFQUFFO1FBQ3JFLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxJQUFBLDZCQUFpQixFQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JELENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLG9EQUFvRCxFQUFFLEdBQUcsRUFBRTtRQUM1RCxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QyxNQUFNLENBQUMsSUFBQSw2QkFBaUIsRUFBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFF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QUFDLHNCQUFVLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLENBQ3hELENBQUMsT0FBTyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFO1lBQ3RDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FDVixJQUFBLDJCQUFlLEVBQUMsc0JBQVUsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQzNELENBQUMsT0FBTyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7UUFDaEUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxzQkFBVSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUM1QywyRUFBMkU7UUFDM0UsMkVBQTJFO1FBQzNFLDRFQUE0RTtRQUM1RSxFQUFFLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1lBQzFELE1BQU0sVUFBVSxHQUFHLHNCQUFVLENBQUMsbUJBQW1CLENBQUM7WUFDbEQsTUFBTSxDQUFDLElBQUEsMkJBQWUsRUFBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFBLDJCQUFlLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5leHRqc1R5cGUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBhc3NldFByZWZpeFBhdGgsXG4gIGJhc2VQYXRoUHJlZml4LFxuICBpc0Fzc2V0UHJlZml4VW5zZXJ2ZWQsXG4gIGpvaW5QYXRoLFxuICBub3JtYWxpemVCYXNlUGF0aCxcbiAgcHJlZml4V2l0aEJhc2VQYXRoLFxuICByZWxhdGl2ZUFzc2V0UHJlZml4LFxuICByZXNvbHZlQmFzZVBhdGgsXG4gIHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMsXG59IGZyb20gXCIuL2Jhc2UtcGF0aFwiO1xuXG5jb25zdCBHTE9CQUwgPSBbTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TLCBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXTtcblxuZGVzY3JpYmUoXCJub3JtYWxpemVCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIGl0KFwicmVkdWNlcyB2YWx1ZXMgYWRkcmVzc2luZyB0aGUgc2FtZSBwYXRoIHRvIHRoZSBzYW1lIHNlZ21lbnRcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCJiYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICBleHBlY3Qobm9ybWFsaXplQmFzZVBhdGgoXCIvYmFzZS9cIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi8vYmFzZS8vXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgfSk7XG5cbiAgaXQoXCJtYXBzIHVuZGVmaW5lZCBhbmQgZW1wdHkgdmFsdWVzIHRvIGFuIGVtcHR5IHN0cmluZ1wiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKHVuZGVmaW5lZCkpLnRvQmUoXCJcIik7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiXCIpKS50b0JlKFwiXCIpO1xuICAgIGV4cGVjdChub3JtYWxpemVCYXNlUGF0aChcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIGl0KFwia2VlcHMgaW50ZXJpb3Igc2xhc2hlcyBvZiBhIG5lc3RlZCBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KG5vcm1hbGl6ZUJhc2VQYXRoKFwiL3RlYW0vYXBwL1wiKSkudG9CZShcInRlYW0vYXBwXCIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIndob2xlQXBwSW52YWxpZGF0aW9uUGF0aHNcIiwgKCkgPT4ge1xuICBpdChcImlzIHRoZSB3aG9sZSBkaXN0cmlidXRpb24gd2l0aG91dCBhIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICBleHBlY3Qod2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocygpKS50b0VxdWFsKFtcIi8qXCJdKTtcbiAgICBleHBlY3Qod2hvbGVBcHBJbnZhbGlkYXRpb25QYXRocyhcIlwiKSkudG9FcXVhbChbXCIvKlwiXSk7XG4gIH0pO1xuXG4gIGl0KFwiY292ZXJzIHRoZSBhcHAncyByb290IGFuZCBSU0MgcGF5bG9hZCwgYnV0IG5vIHNpYmxpbmcgcHJlZml4XCIsICgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGJhc2VQYXRoIG9mIFtcIi9iYXNlXCIsIFwiYmFzZVwiLCBcIi9iYXNlL1wiXSkge1xuICAgICAgZXhwZWN0KHdob2xlQXBwSW52YWxpZGF0aW9uUGF0aHMoYmFzZVBhdGgpKS50b0VxdWFsKFtcbiAgICAgICAgXCIvYmFzZVwiLFxuICAgICAgICBcIi9iYXNlPypcIixcbiAgICAgICAgXCIvYmFzZS8qXCIsXG4gICAgICBdKTtcbiAgICB9XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiam9pblBhdGhcIiwgKCkgPT4ge1xuICBjb25zdCBvcmlnaW4gPSBcImh0dHBzOi8vZDExMTExMWFiY2RlZjguY2xvdWRmcm9udC5uZXRcIjtcblxuICBpdChcImRyb3BzIGVtcHR5IHBhcnRzXCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiXCIpKS50b0JlKG9yaWdpbik7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgdW5kZWZpbmVkKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiL1wiKSkudG9CZShvcmlnaW4pO1xuICAgIGV4cGVjdChqb2luUGF0aChcIlwiLCBcImJhc2VcIiwgdW5kZWZpbmVkLCBcIl9uZXh0L3N0YXRpY1wiKSkudG9CZShcbiAgICAgIFwiYmFzZS9fbmV4dC9zdGF0aWNcIixcbiAgICApO1xuICB9KTtcblxuICBpdChcImpvaW5zIHdpdGggZXhhY3RseSBvbmUgc2xhc2ggcmVnYXJkbGVzcyBvZiBlYWNoIHBhcnQncyBzbGFzaGVzXCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgob3JpZ2luLCBcIi9iYXNlXCIpKS50b0JlKGAke29yaWdpbn0vYmFzZWApO1xuICAgIGV4cGVjdChqb2luUGF0aChvcmlnaW4sIFwiYmFzZS9cIikpLnRvQmUoYCR7b3JpZ2lufS9iYXNlYCk7XG4gICAgZXhwZWN0KGpvaW5QYXRoKG9yaWdpbiwgXCIvdGVhbS9hcHAvXCIpKS50b0JlKGAke29yaWdpbn0vdGVhbS9hcHBgKTtcbiAgICBleHBlY3Qoam9pblBhdGgoXCIvYmFzZS9cIiwgXCIvX25leHQvc3RhdGljL3trZXl9XCIpKS50b0JlKFxuICAgICAgXCJiYXNlL19uZXh0L3N0YXRpYy97a2V5fVwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwicmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgd2hlbiBldmVyeSBwYXJ0IGlzIGVtcHR5XCIsICgpID0+IHtcbiAgICBleHBlY3Qoam9pblBhdGgoKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3Qoam9pblBhdGgodW5kZWZpbmVkLCBcIlwiLCBcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIC8vIEhvdyBgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzLnVybGAgYXBwZW5kcyB0aGUgYXBwJ3MgYmFzZVBhdGg6IHRoZSBBTEJcbiAgLy8gZm9yd2FyZHMgZXZlcnkgcGF0aCB0byB0aGUgY29udGFpbmVyIHVuY2hhbmdlZCwgc28gdGhlIGFwcCBvbmx5IGFuc3dlcnNcbiAgLy8gdW5kZXIgaXRzIG93biBiYXNlUGF0aCBhbmQgdGhlIGJhcmUgQUxCIFVSTCB3b3VsZCA0MDQuXG4gIGl0KFwiYXBwZW5kcyBhbiBhcHAgYmFzZVBhdGggdG8gYSBiYXJlIEFMQiBvcmlnaW5cIiwgKCkgPT4ge1xuICAgIGNvbnN0IGFsYiA9IFwiaHR0cDovL215LWFsYi0xMjMudXMtZWFzdC0xLmVsYi5hbWF6b25hd3MuY29tXCI7XG4gICAgZXhwZWN0KGpvaW5QYXRoKGFsYiwgXCJiYXNlXCIpKS50b0JlKGAke2FsYn0vYmFzZWApO1xuICAgIGV4cGVjdChqb2luUGF0aChhbGIsIFwidGVhbS9hcHBcIikpLnRvQmUoYCR7YWxifS90ZWFtL2FwcGApO1xuICAgIC8vIEFuIGFwcCB3aXRoIG5vIGJhc2VQYXRoIGlzIHNlcnZlZCBhdCB0aGUgb3JpZ2luIGl0c2VsZi5cbiAgICBleHBlY3Qoam9pblBhdGgoYWxiLCBcIlwiKSkudG9CZShhbGIpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcInByZWZpeFdpdGhCYXNlUGF0aFwiLCAoKSA9PiB7XG4gIC8vIFRoZSBoZWFsdGggY2hlY2sgcGF0aCBpcyBoYW5kZWQgdG8gdGhpbmdzIHRoYXQgdGFsayB0byB0aGUgYXBwIGRpcmVjdGx5IChhblxuICAvLyBBTEIgdGFyZ2V0IGdyb3VwLCB0aGUgY29udGFpbmVyJ3Mgb3duIGhlYWx0aCBwcm9iZSksIGFuZCB0aGUgYXBwIG9ubHlcbiAgLy8gYW5zd2VycyB1bmRlciBpdHMgYmFzZVBhdGguIFVucHJlZml4ZWQsIGV2ZXJ5IGNoZWNrIDQwNHM6IHRoZSB0YXJnZXQgbmV2ZXJcbiAgLy8gdHVybnMgaGVhbHRoeSwgc28gdGFza3MgYXJlIGtpbGxlZCBvbiB0aGUgaGVhbHRoIGNoZWNrIGludGVydmFsIGFuZCB0aGVcbiAgLy8gZGVwbG95bWVudCByb2xscyBiYWNrLlxuICBpdChcInByZWZpeGVzIGEgaGVhbHRoIGNoZWNrIHBhdGggd2l0aCB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCJiYXNlXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYmFzZS9hcGkvaGVhbHRoXCIpO1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCIvYmFzZS9cIiwgXCIvYXBpL2hlYWx0aFwiKSkudG9CZShcbiAgICAgIFwiL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIGl0KFwibGVhdmVzIHRoZSBwYXRoIHVudG91Y2hlZCB3aGVuIHRoZSBhcHAgc2V0cyBubyBiYXNlUGF0aFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZWZpeFdpdGhCYXNlUGF0aCh1bmRlZmluZWQsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiL1wiLCBcIi9hcGkvaGVhbHRoXCIpKS50b0JlKFwiL2FwaS9oZWFsdGhcIik7XG4gIH0pO1xuXG4gIGl0KFwiYWx3YXlzIHJldHVybnMgYSBsZWFkaW5nIHNsYXNoLCB3aGF0ZXZlciB0aGUgcGF0aCBjYW1lIHdpdGhcIiwgKCkgPT4ge1xuICAgIC8vIFRoZSBBTEIgaGVhbHRoIGNoZWNrIGFuZCB0aGUgcmVhZGluZXNzIGNoZWNrIFVSTCBib3RoIG5lZWQgYW4gYWJzb2x1dGVcbiAgICAvLyBwYXRoLCBzbyB0aGUgcmVzdWx0IGNhbid0IGNvbWUgYmFjayBiYXJlLiBXaXRob3V0IGEgYmFzZVBhdGggYSBiYXJlIHBhdGhcbiAgICAvLyB1c2VkIHRvIHBhc3Mgc3RyYWlnaHQgdGhyb3VnaCwgd2hpY2ggY29uY2F0ZW5hdGVkIGludG9cbiAgICAvLyBcImh0dHA6Ly8xMjcuMC4wLjE6MzAwMGFwaS9oZWFsdGhcIiBhcyB0aGUgcmVhZGluZXNzIGNoZWNrIFVSTC5cbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiYmFzZVwiLCBcImFwaS9oZWFsdGhcIikpLnRvQmUoXCIvYmFzZS9hcGkvaGVhbHRoXCIpO1xuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgodW5kZWZpbmVkLCBcImFwaS9oZWFsdGhcIikpLnRvQmUoXCIvYXBpL2hlYWx0aFwiKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiXCIsIFwiYXBpL2hlYWx0aFwiKSkudG9CZShcIi9hcGkvaGVhbHRoXCIpO1xuICB9KTtcblxuICAvLyBUaGUgcGF0aCBpcyB3aGF0IHRoZSBhcHAgcm91dGVzLCB3aXRob3V0IGJhc2VQYXRoLCBhbmQgaXQgaXMgcHJlZml4ZWRcbiAgLy8gd2hldGhlciBvciBub3QgaXQgYWxyZWFkeSBsb29rcyBwcmVmaXhlZDogYW4gYXBwIGNhbiByb3V0ZSBcIi9iYXNlL2Jhc2UvLi4uXCJcbiAgLy8gbGVnaXRpbWF0ZWx5LCBzbyB0cmVhdGluZyBhIGxlYWRpbmcgXCIvYmFzZVwiIGFzIGFscmVhZHktcHJlZml4ZWQgd291bGQgbWFrZVxuICAvLyB0aGF0IHBhdGggdW5yZWFjaGFibGUgYW5kIGdpdmUgdGhlIHByb3AgdHdvIG1lYW5pbmdzLiBVc2VycyB3aG8gcHJlZml4ZWRcbiAgLy8gYGhlYWx0aENoZWNrUGF0aGAgYnkgaGFuZCB0byB3b3JrIGFyb3VuZCB0aGUgbWlzc2luZyBwcmVmaXggZHJvcCBpdCBvblxuICAvLyB1cGdyYWRlIOKAlCBkb2N1bWVudGVkIGluIGRvY3MvYnJlYWtpbmctY2hhbmdlcy5tZCB1bmRlciAwLjYuMC5cbiAgaXQoXCJwcmVmaXhlcyBhIHBhdGggdGhhdCBhbHJlYWR5IGxvb2tzIHByZWZpeGVkXCIsICgpID0+IHtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKFwiYmFzZVwiLCBcIi9iYXNlL2FwaS9oZWFsdGhcIikpLnRvQmUoXG4gICAgICBcIi9iYXNlL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xuXG4gIC8vIEEgYHRyYWlsaW5nU2xhc2g6IHRydWVgIGFwcCByZWRpcmVjdHMgXCIvYXBpL2hlYWx0aFwiIHRvIFwiL2FwaS9oZWFsdGgvXCIgd2l0aCBhXG4gIC8vIDMwOCwgd2hpY2ggYW4gQUxCIGhlYWx0aCBjaGVjayBkb2Vzbid0IGNvdW50IGFzIGhlYWx0aHksIHNvIHRoZSBzbGFzaCB0aGVcbiAgLy8gdXNlciB3cm90ZSBoYXMgdG8gc3Vydml2ZS5cbiAgaXQoXCJwcmVzZXJ2ZXMgYSB0cmFpbGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHByZWZpeFdpdGhCYXNlUGF0aChcImJhc2VcIiwgXCIvYXBpL2hlYWx0aC9cIikpLnRvQmUoXG4gICAgICBcIi9iYXNlL2FwaS9oZWFsdGgvXCIsXG4gICAgKTtcbiAgICBleHBlY3QocHJlZml4V2l0aEJhc2VQYXRoKHVuZGVmaW5lZCwgXCIvYXBpL2hlYWx0aC9cIikpLnRvQmUoXCIvYXBpL2hlYWx0aC9cIik7XG4gIH0pO1xuXG4gIGl0KFwiaGFuZGxlcyBhIG5lc3RlZCBiYXNlUGF0aCwgYXMgUkVHSU9OQUxfRlVOQ1RJT05TIGNhbiBwcm9kdWNlXCIsICgpID0+IHtcbiAgICAvLyBBbiBhcHAgYXQgdGhlIGBwcm9kYCBzdGFnZSBuZXN0ZWQgdW5kZXIgXCIvYmFzZVwiIHNldHMgYGJhc2VQYXRoOlxuICAgIC8vIFwiL3Byb2QvYmFzZVwiYCwgYW5kIHRoZSByZWFkaW5lc3MgY2hlY2sgaGl0cyB0aGUgbG9jYWwgc2VydmVyLCBzbyB0aGVcbiAgICAvLyB3aG9sZSBwcmVmaXggaGFzIHRvIGJlIHRoZXJlLlxuICAgIGV4cGVjdChwcmVmaXhXaXRoQmFzZVBhdGgoXCIvcHJvZC9iYXNlXCIsIFwiL2FwaS9oZWFsdGhcIikpLnRvQmUoXG4gICAgICBcIi9wcm9kL2Jhc2UvYXBpL2hlYWx0aFwiLFxuICAgICk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiYmFzZVBhdGhQcmVmaXhcIiwgKCkgPT4ge1xuICBpdChcInNwZWxscyBldmVyeSBiYXNlUGF0aCB0aGUgd2F5IE5leHQuanMgZG9lc1wiLCAoKSA9PiB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiBbXCIvYmFzZVwiLCBcImJhc2VcIiwgXCIvYmFzZS9cIiwgXCIvL2Jhc2UvL1wiXSkge1xuICAgICAgZXhwZWN0KGJhc2VQYXRoUHJlZml4KHZhbHVlKSkudG9CZShcIi9iYXNlXCIpO1xuICAgIH1cbiAgICBleHBlY3QoYmFzZVBhdGhQcmVmaXgoXCIvYS9iL1wiKSkudG9CZShcIi9hL2JcIik7XG4gICAgZXhwZWN0KGJhc2VQYXRoUHJlZml4KFwiL1wiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3QoYmFzZVBhdGhQcmVmaXgodW5kZWZpbmVkKSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJyZWxhdGl2ZUFzc2V0UHJlZml4XCIsICgpID0+IHtcbiAgaXQoXCJyZWFkcyBhIHBhdGgtc3R5bGUgYXNzZXRQcmVmaXggd2l0aCBvbmUgbGVhZGluZyBzbGFzaFwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHJlbGF0aXZlQXNzZXRQcmVmaXgoXCIvY3VzdG9tLWFzc2V0LXByZWZpeFwiKSkudG9CZShcbiAgICAgIFwiL2N1c3RvbS1hc3NldC1wcmVmaXhcIixcbiAgICApO1xuICAgIGV4cGVjdChyZWxhdGl2ZUFzc2V0UHJlZml4KFwiY3VzdG9tLWFzc2V0LXByZWZpeC9cIikpLnRvQmUoXG4gICAgICBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCIsXG4gICAgKTtcbiAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChcIlwiKSkudG9CZShcIlwiKTtcbiAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChcIi9cIikpLnRvQmUoXCJcIik7XG4gIH0pO1xuXG4gIGl0KFwiaWdub3JlcyBhbiBhYnNvbHV0ZSBhc3NldFByZWZpeFwiLCAoKSA9PiB7XG4gICAgLy8gSXQgbmFtZXMgYW4gb3JpZ2luIGNkay1uZXh0anMgZG9lcyBub3Qgc2VydmUsIHNvIHRoZXJlIGlzIG5vIGJlaGF2aW9yIHRvXG4gICAgLy8gYWRkIGFuZCBub3RoaW5nIHRoZSBkaXN0cmlidXRpb24gY291bGQgZ2V0IHdyb25nLlxuICAgIGZvciAoY29uc3QgYXNzZXRQcmVmaXggb2YgW1xuICAgICAgXCJodHRwczovL2Nkbi5leGFtcGxlLmNvbVwiLFxuICAgICAgXCJodHRwOi8vY2RuLmV4YW1wbGUuY29tL3hcIixcbiAgICAgIFwiLy9jZG4uZXhhbXBsZS5jb21cIixcbiAgICBdKSB7XG4gICAgICBleHBlY3QocmVsYXRpdmVBc3NldFByZWZpeChhc3NldFByZWZpeCkpLnRvQmUoXCJcIik7XG4gICAgfVxuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcImFzc2V0UHJlZml4UGF0aFwiLCAoKSA9PiB7XG4gIGl0KFwicmVwb3J0cyB0aGUgcGF0aCBhbiBhYnNvbHV0ZSBhc3NldFByZWZpeCBjYXJyaWVzIHRvb1wiLCAoKSA9PiB7XG4gICAgLy8gYHJlbGF0aXZlQXNzZXRQcmVmaXhgIGFuc3dlcnMgXCJpcyB0aGlzIGEgcHJlZml4IHRoZSByZWdpb25hbCBOZXh0anNUeXBlc1xuICAgIC8vIGNhbm5vdCBzZXJ2ZVwiOyB0aGlzIGFuc3dlcnMgXCJ3aGF0IHBhdGggZG8gYnVuZGxlIFVSTHMgY2FycnlcIiwgYW5kIGFuXG4gICAgLy8gYWJzb2x1dGUgcHJlZml4IHdpdGggYSBwYXRoIGNhcnJpZXMgb25lIOKAlCBgbmV4dCBidWlsZGAgY29tcGlsZXMgYVxuICAgIC8vIHJld3JpdGUgZm9yIGl0LCBzbyBgbmV4dCBzdGFydGAgc2VydmVzIGJ1bmRsZXMgdGhlcmUuIFNlZVxuICAgIC8vIGB0ZXN0L2UyZS9hcHAtZGlyL2Fzc2V0LXByZWZpeC1hYnNvbHV0ZWAuXG4gICAgZm9yIChjb25zdCBbYXNzZXRQcmVmaXgsIHBhdGhdIG9mIFtcbiAgICAgIFtcImh0dHBzOi8vZXhhbXBsZS52ZXJjZWwuc2gvY3VzdG9tLWFzc2V0LXByZWZpeFwiLCBcIi9jdXN0b20tYXNzZXQtcHJlZml4XCJdLFxuICAgICAgW1wiLy9leGFtcGxlLnZlcmNlbC5zaC9jZG4vXCIsIFwiL2NkblwiXSxcbiAgICAgIFtcImh0dHBzOi8vZXhhbXBsZS52ZXJjZWwuc2gvXCIsIFwiXCJdLFxuICAgICAgW1wiaHR0cHM6Ly9leGFtcGxlLnZlcmNlbC5zaFwiLCBcIlwiXSxcbiAgICAgIFtcIi9jZG5cIiwgXCIvY2RuXCJdLFxuICAgICAgW1wiXCIsIFwiXCJdLFxuICAgIF0gYXMgY29uc3QpIHtcbiAgICAgIGV4cGVjdChhc3NldFByZWZpeFBhdGgoYXNzZXRQcmVmaXgpKS50b0JlKHBhdGgpO1xuICAgIH1cbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJpc0Fzc2V0UHJlZml4VW5zZXJ2ZWRcIiwgKCkgPT4ge1xuICBjb25zdCBSRUdJT05BTCA9IFtcbiAgICBOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUyxcbiAgICBOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMsXG4gIF07XG5cbiAgaXQuZWFjaChSRUdJT05BTCkoXG4gICAgXCIlczogZG9lcyBub3QgZmxhZyB0aGUgYXNzZXRQcmVmaXggTmV4dC5qcyBkZXJpdmVzIGZyb20gYmFzZVBhdGhcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gVGhlIHJlZ3Jlc3Npb24gdGhpcyBmdW5jdGlvbiB3YXMgZXh0cmFjdGVkIGZvci4gQW4gYXBwIHRoYXQgc2V0cyBvbmx5XG4gICAgICAvLyBgYmFzZVBhdGg6IFwiL3Byb2RcImAg4oCUIGBleGFtcGxlcy9yZWdpb25hbC1mdW5jdGlvbnNgLCBhbmQgZXZlcnkgcmVnaW9uYWxcbiAgICAgIC8vIGRlcGxveW1lbnQgd2l0aCBhIGJhc2VQYXRoIOKAlCBnZXRzXG4gICAgICAvLyBge1wiYXNzZXRQcmVmaXhcIjpcIi9wcm9kXCIsXCJiYXNlUGF0aFwiOlwiL3Byb2RcIn1gIGluXG4gICAgICAvLyBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gLCBiZWNhdXNlIE5leHQuanMgcmVzb2x2ZXMgb25lIGZyb20gdGhlIG90aGVyLlxuICAgICAgLy8gRmxhZ2dpbmcgdGhhdCB0b2xkIHVzZXJzIHRoZWlyIGJ1bmRsZXMgd291bGQgNDA0IGF0IHRoZSBvbmUgcGF0aCB0aGF0IGRvZXNcbiAgICAgIC8vIHNlcnZlIHRoZW0sIG9uIGV2ZXJ5IHN5bnRoLlxuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9wcm9kXCIsIFwicHJvZFwiKSkudG9CZShmYWxzZSk7XG4gICAgICAvLyBCb3RoIHNpZGVzIGFycml2ZSBpbiBkaWZmZXJlbnQgc2hhcGVzIOKAlCB0aGUgYXNzZXRQcmVmaXggcmVhZGVyIGFkZHMgYVxuICAgICAgLy8gbGVhZGluZyBzbGFzaCwgdGhlIGJhc2VQYXRoIHJlYWRlciBzdHJpcHMgb25lIOKAlCBzbyB0aGUgY29tcGFyaXNvbiBoYXMgdG9cbiAgICAgIC8vIG5vcm1hbGl6ZSByYXRoZXIgdGhhbiBjb21wYXJlIHN0cmluZ3MuXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiL3Byb2RcIiwgXCIvcHJvZC9cIikpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9hL2JcIiwgXCJhL2JcIikpLnRvQmUoZmFsc2UpO1xuICAgIH0sXG4gICk7XG5cbiAgaXQuZWFjaChSRUdJT05BTCkoXCIlczogZmxhZ3MgYSBwcmVmaXggbm90aGluZyBzZXJ2ZXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICAvLyBBIGdlbnVpbmVseSBkaWZmZXJlbnQgcHJlZml4IGlzIHRoZSBjYXNlIHRoZSB3YXJuaW5nIGV4aXN0cyBmb3I6IGJ1bmRsZXMgYXJlXG4gICAgLy8gcmVxdWVzdGVkIGF0IGAvY2RuL19uZXh0L3N0YXRpYy8uLi5gIGFuZCBuZWl0aGVyIEFQSSBHYXRld2F5J3NcbiAgICAvLyBgX25leHQvc3RhdGljYCByZXNvdXJjZSBub3IgdGhlIGNvbnRhaW5lcidzIG93biBmaWxlcyBhbnN3ZXIgdGhlcmUuXG4gICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9jZG5cIiwgXCJwcm9kXCIpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChpc0Fzc2V0UHJlZml4VW5zZXJ2ZWQobmV4dGpzVHlwZSwgXCIvY2RuXCIsIHVuZGVmaW5lZCkpLnRvQmUodHJ1ZSk7XG4gICAgLy8gQSBwcmVmaXggKnVuZGVyKiB0aGUgYmFzZVBhdGggaXMgc3RpbGwgYSBkaWZmZXJlbnQgcGF0aCwgbm90IGEgbWF0Y2guXG4gICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9wcm9kL2NkblwiLCBcInByb2RcIikpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIGl0LmVhY2goR0xPQkFMKShcbiAgICBcIiVzOiBmbGFncyBub3RoaW5nLCBoYXZpbmcgYSBiZWhhdmlvciBmb3IgaXRcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gYE5leHRqc0Rpc3RyaWJ1dGlvbmAgYWRkcyBhIGNhY2hlIGJlaGF2aW9yIGZvciB0aGUgcHJlZml4LCBzbyBvbiB0aGVzZSB0eXBlc1xuICAgICAgLy8gYW55IHByZWZpeCBpcyBzZXJ2ZWQuXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiL2NkblwiLCBcInByb2RcIikpLnRvQmUoZmFsc2UpO1xuICAgICAgZXhwZWN0KGlzQXNzZXRQcmVmaXhVbnNlcnZlZChuZXh0anNUeXBlLCBcIi9jZG5cIiwgdW5kZWZpbmVkKSkudG9CZShmYWxzZSk7XG4gICAgfSxcbiAgKTtcblxuICBpdC5lYWNoKE9iamVjdC52YWx1ZXMoTmV4dGpzVHlwZSkpKFxuICAgIFwiJXM6IGZsYWdzIG5vdGhpbmcgd2hlbiB0aGVyZSBpcyBubyBwcmVmaXhcIixcbiAgICAobmV4dGpzVHlwZSkgPT4ge1xuICAgICAgLy8gYHJlbGF0aXZlQXNzZXRQcmVmaXhgIGFscmVhZHkgcmVkdWNlcyBhbiBhYnNvbHV0ZSBwcmVmaXggdG8gYFwiXCJgLFxuICAgICAgLy8gd2hpY2ggaXMgdGhlIHN1cHBvcnRlZCB3YXkgdG8gc2VydmUgYXNzZXRzIGZyb20gYW5vdGhlciBvcmlnaW4uXG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiXCIsIFwicHJvZFwiKSkudG9CZShmYWxzZSk7XG4gICAgICBleHBlY3QoaXNBc3NldFByZWZpeFVuc2VydmVkKG5leHRqc1R5cGUsIFwiXCIsIHVuZGVmaW5lZCkpLnRvQmUoZmFsc2UpO1xuICAgIH0sXG4gICk7XG59KTtcblxuZGVzY3JpYmUoXCJyZXNvbHZlQmFzZVBhdGhcIiwgKCkgPT4ge1xuICBkZXNjcmliZS5lYWNoKE9iamVjdC52YWx1ZXMoTmV4dGpzVHlwZSkpKFwiJXNcIiwgKG5leHRqc1R5cGUpID0+IHtcbiAgICBpdChcInJlc29sdmVzIHRvIHVuZGVmaW5lZCB3aGVuIGJvdGggYXJlIHVuc2V0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJcIiwgXCJcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIC8vIE5vcm1hbGl6ZXMgdG8gZW1wdHksIHNvIGl0J3MgdGhlIHNhbWUgYXMgdW5zZXQgcmF0aGVyIHRoYW4gYSBwcmVmaXguXG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL1wiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gT25lIHNoYXBlIG91dCwgd2hhdGV2ZXIgc2hhcGUgY2FtZSBpbjogY29uc3VtZXJzIHRoYXQgbmVlZCBhIGxlYWRpbmdcbiAgICAvLyBzbGFzaCAob25seSBgTmV4dGpzRGlzdHJpYnV0aW9uYCdzIHBhdGggcGF0dGVybnMpIGFkZCB0aGVpciBvd24sIHNvXG4gICAgLy8gbm90aGluZyBkb3duc3RyZWFtIGhhcyB0byByZS1ub3JtYWxpemUuXG4gICAgaXQoXCJub3JtYWxpemVzIHRoZSBwcm9wIHdoZW4gaXQgbWF0Y2hlcyB0aGUgYXBwXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCIvYmFzZVwiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJiYXNlXCIsIFwiL2Jhc2VcIikpLnRvQmUoXCJiYXNlXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9iYXNlL1wiLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJiYXNlLy9cIiwgXCIvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlLmVhY2goR0xPQkFMKShcIiVzXCIsIChuZXh0anNUeXBlKSA9PiB7XG4gICAgLy8gQ2xvdWRGcm9udCB1c2VzIHRoZSByZXF1ZXN0IHBhdGggdmVyYmF0aW0gYXMgdGhlIFMzIG9iamVjdCBrZXksIHNvIHRoZVxuICAgIC8vIHByb3AgaGFzIHRvIGJlIHRoZSBwcmVmaXggdGhlIGFwcCBlbWl0cyDigJQgdGhlcmUncyBleGFjdGx5IG9uZSB2YWxpZCB2YWx1ZSxcbiAgICAvLyB3aGljaCBtYWtlcyB0aGUgYXBwJ3MgY29uZmlnIHRoZSBzb3VyY2Ugb2YgdHJ1dGguXG4gICAgaXQoXCJkZXJpdmVzIHRoZSBwcm9wIGZyb20gdGhlIGFwcCdzIGJhc2VQYXRoXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgXCJcIiwgXCJiYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi90ZWFtL2FwcC9cIikpLnRvQmUoXG4gICAgICAgIFwidGVhbS9hcHBcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcInJlamVjdHMgdGhlIHByb3Agc2V0dGluZyBhIGJhc2VQYXRoIHRoZSBhcHAgZG9lc24ndFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2Jhc2VcIikpLnRvVGhyb3coXG4gICAgICAgIC9DbG91ZEZyb250IHNlcnZlcyBzdGF0aWMgYXNzZXRzIHN0cmFpZ2h0IGZyb20gUzMvLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwicmVqZWN0cyB0d28gZGlmZmVyZW50IHZhbHVlc1wiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT4gcmVzb2x2ZUJhc2VQYXRoKG5leHRqc1R5cGUsIFwiL2FcIiwgXCIvYlwiKSkudG9UaHJvdyhcbiAgICAgICAgJ3Byb3AgaXMgXCIvYVwiIGJ1dCB5b3VyIE5leHQuanMgYXBwXFwncyBjb25maWcgc2V0cyBgYmFzZVBhdGhgIHRvIFwiL2JcIicsXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZShOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OUywgKCkgPT4ge1xuICAgIGNvbnN0IFJGID0gTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlM7XG4gICAgY29uc3Qgc3RhZ2UgPSAobmFtZTogc3RyaW5nKSA9PiAoe1xuICAgICAgc3RyaXBwZWRQcmVmaXg6IG5hbWUsXG4gICAgICBjdXN0b21Eb21haW46IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGRvbWFpbiA9IChtYXBwaW5nID0gXCJcIikgPT4gKHtcbiAgICAgIHN0cmlwcGVkUHJlZml4OiBtYXBwaW5nLFxuICAgICAgY3VzdG9tRG9tYWluOiB0cnVlLFxuICAgIH0pO1xuICAgIGxldCB3YXJuOiBqZXN0LlNweUluc3RhbmNlO1xuICAgIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgICAgd2FybiA9IGplc3Quc3B5T24oY29uc29sZSwgXCJ3YXJuXCIpLm1vY2tJbXBsZW1lbnRhdGlvbigoKSA9PiB7fSk7XG4gICAgfSk7XG4gICAgYWZ0ZXJFYWNoKCgpID0+IHdhcm4ubW9ja1Jlc3RvcmUoKSk7XG5cbiAgICAvLyBBUEkgR2F0ZXdheSBzdHJpcHMgdGhlIHN0YWdlIGJlZm9yZSBtYXRjaGluZyByZXNvdXJjZXMsIHNvIGFuIGFwcCBzZXJ2ZWRcbiAgICAvLyBhdCB0aGUgZGVmYXVsdCBgcHJvZGAgc3RhZ2Ugc2V0cyBiYXNlUGF0aDogXCIvcHJvZFwiIGFuZCBpdHMgcmVzb3VyY2VzIGxpdmVcbiAgICAvLyBhdCB0aGUgcm9vdC4gTW91bnRpbmcgdGhlbSB1bmRlciBcInByb2RcIiB3b3VsZCBuZXN0IGV2ZXJ5IHJlc291cmNlIHVuZGVyIGFcbiAgICAvLyBwYXRoIHRoZSBzdGFnZSBhbHJlYWR5IGNvbnN1bWVkLlxuICAgIC8vIEEgZG9tYWluIGF0dGFjaGVkIHdpdGggYGFkZERvbWFpbk5hbWUoeyBiYXNlUGF0aDogXCJ2MVwiIH0pYCBzdHJpcHMgXCIvdjFcIlxuICAgIC8vIHdoZXJlIHN5bnRoIGNhbid0IHNlZSBpdDsgXCIvXCIgaXMgaG93IHRoZSB1c2VyIHNheXMgc28uIERlcml2aW5nIHdvdWxkXG4gICAgLy8gbW91bnQgZXZlcnl0aGluZyB1bmRlciBcInYxXCIsIHdoaWNoIHRoZSBzdHJpcHBlZCByZXF1ZXN0cyBuZXZlciByZWFjaC5cbiAgICBpdCgnbW91bnRzIGF0IHRoZSByb290IHdoZW4gdGhlIHByb3AgaXMgXCIvXCIsIGluc3RlYWQgb2YgZGVyaXZpbmcnLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9cIiwgXCIvdjFcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL1wiLCBcIi92MVwiLCBkb21haW4oKSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL1wiLCBcIi9wcm9kL2Jhc2VcIikpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIC8vIFVuc2V0IHN0aWxsIGRlcml2ZXMuXG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3YxXCIpKS50b0JlKFwidjFcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIm1vdW50cyBhbiBhcHAgd2hvc2UgYmFzZVBhdGggaXMgdGhlIHN0YWdlIGF0IHRoZSByb290XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZFwiKSkudG9CZVVuZGVmaW5lZCgpO1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvdGVzdFwiLCBzdGFnZShcInRlc3RcIikpLFxuICAgICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3Qod2Fybikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIGl0KFwibW91bnRzIHRoZSByZXN0IG9mIGEgYmFzZVBhdGggbmVzdGVkIGJlbG93IHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3Byb2QvYmFzZVwiKSkudG9CZShcImJhc2VcIik7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL3YyL2EvYlwiLCBzdGFnZShcInYyXCIpKSkudG9CZShcbiAgICAgICAgXCJhL2JcIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgY2FzZSB0aGF0IHVzZWQgdG8gNDA0IGV2ZXJ5IGJ1bmRsZTogYSBjdXN0b20gZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdFxuICAgIC8vIHN0cmlwcyBub3RoaW5nLCBzbyB0aGUgYXBwJ3MgYmFzZVBhdGggaXMgYSByZWFsIHJlc291cmNlIHBhdGgsIGFuZCBsZWZ0IGF0XG4gICAgLy8gdGhlIHJvb3QgYF9uZXh0L3N0YXRpY2AgZmVsbCB0aHJvdWdoIHRvIHRoZSBMYW1iZGEgY2F0Y2gtYWxsLlxuICAgIGl0KFwibW91bnRzIGFuIGFwcCB1bmRlciBpdHMgd2hvbGUgYmFzZVBhdGggd2hlbiBub3RoaW5nIHN0cmlwcyBpdFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2RvY3NcIiwgZG9tYWluKCkpKS50b0JlKFwiZG9jc1wiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgaXQoXCJzdHJpcHMgYSBjdXN0b20gZG9tYWluJ3MgYmFzZSBwYXRoIG1hcHBpbmcgbGlrZSBhIHN0YWdlXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2FwcFwiLCBkb21haW4oXCJhcHBcIikpLFxuICAgICAgKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2FwcC9kb2NzXCIsIGRvbWFpbihcImFwcFwiKSkpLnRvQmUoXG4gICAgICAgIFwiZG9jc1wiLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwibWF0Y2hlcyB0aGUgc3RhZ2Ugb24gYSBzZWdtZW50IGJvdW5kYXJ5XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZHVjdGlvblwiLCBkb21haW4oKSkpLnRvQmUoXG4gICAgICAgIFwicHJvZHVjdGlvblwiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvcHJvZHVjdGlvblwiLCBzdGFnZShcInByb2RcIikpKS50b0JlKFxuICAgICAgICBcInByb2R1Y3Rpb25cIixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBXaXRob3V0IGEgY3VzdG9tIGRvbWFpbiB0aGUgYXBwJ3Mgb3duIGxpbmtzIG1pc3MgdGhlIHN0YWdlLCB3aGljaCBzeW50aFxuICAgIC8vIGNhbiBzYXkgYnV0IG5vdCBmaXggLSBhIGRvbWFpbiBhdHRhY2hlZCB3aXRoIGBhZGREb21haW5OYW1lYCBpcyBpbnZpc2libGUuXG4gICAgaXQoXCJ3YXJucyB3aGVuIGFuIGV4ZWN1dGUtYXBpIGFwcCdzIGJhc2VQYXRoIGxhY2tzIHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCB1bmRlZmluZWQsIFwiL2RvY3NcIikpLnRvQmUoXCJkb2NzXCIpO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnU2V0IGBiYXNlUGF0aDogXCIvcHJvZC9kb2NzXCJgJyksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoXCJ3YXJucyB3aGVuIGEgY3VzdG9tIGRvbWFpbidzIGJhc2UgcGF0aCBtYXBwaW5nIGlzIG1pc3NpbmcgZnJvbSB0aGUgYXBwJ3MgYmFzZVBhdGhcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgdW5kZWZpbmVkLCBcIi9kb2NzXCIsIGRvbWFpbihcInYxXCIpKSkudG9CZShcbiAgICAgICAgXCJkb2NzXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZygnU2V0IGBiYXNlUGF0aDogXCIvdjEvZG9jc1wiYCcpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZGVyaXZlcyBub3RoaW5nIHdoZW4gdGhlIHN0YWdlIGlzIGEgdG9rZW5cIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KFxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoUkYsIHVuZGVmaW5lZCwgXCIvZG9jc1wiLCB7IGN1c3RvbURvbWFpbjogZmFsc2UgfSksXG4gICAgICApLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh3YXJuKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0pO1xuXG4gICAgLy8gVGhlIHN0cmlwcGVkIHByZWZpeCBpcyBwYXJ0IG9mIHdoYXQgdGhlIGFwcCBlbWl0cyBidXQgbmV2ZXIgcGFydCBvZiB0aGVcbiAgICAvLyByZXNvdXJjZSBwYXRoLCBzbyBhbiBhcHAgYXQgdGhlIGBwcm9kYCBzdGFnZSBuZXN0ZWQgdW5kZXIgXCIvYmFzZVwiIHNldHNcbiAgICAvLyBiYXNlUGF0aDogXCIvcHJvZC9iYXNlXCIgYW5kIHRoZSBwcm9wIHRvIFwiL2Jhc2VcIi5cbiAgICBpdChcImFjY2VwdHMgYW4gYXBwIGJhc2VQYXRoIHRoYXQgZW5kcyB3aXRoIHRoZSBwcm9wXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9iYXNlXCIsIFwiL3Byb2QvYmFzZVwiKSxcbiAgICAgICkudG9CZShcImJhc2VcIik7XG4gICAgfSk7XG5cbiAgICBpdChcIm9ubHkgYWNjZXB0cyB0aGUgcHJvcCBhcyBhIHdob2xlIHRyYWlsaW5nIHBhdGggc2VnbWVudFwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKE5leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TLCBcIi9zZVwiLCBcIi9wcm9kL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgICAgLy8gTGVhZGluZywgbm90IHRyYWlsaW5nOiBBUEkgR2F0ZXdheSBzdHJpcHMgdGhlIHN0YWdlLCBzbyB0aGUgYXBwIHdvdWxkXG4gICAgICAvLyBlbWl0IFwiL3Byb2QvLi4uXCIgd2hpbGUgdGhlIHJlc291cmNlcyBsaXZlIHVuZGVyIFwiL3Byb2QvYmFzZS8uLi5cIi5cbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL3Byb2RcIiwgXCIvcHJvZC9iYXNlXCIpLFxuICAgICAgKS50b1Rocm93KC9uZXN0cyBldmVyeSBBUEkgR2F0ZXdheSByZXNvdXJjZSB1bmRlciB0aGF0IHBhdGgvKTtcbiAgICB9KTtcblxuICAgIC8vIEFueSBvdGhlciBsZWFkaW5nIHByZWZpeCBpcyBzZXJ2ZWQgYXQgYC9wcm9kL2Jhc2UvLi4uYCB3aGlsZSB0aGUgYXBwXG4gICAgLy8gbGlua3MgdG8gYC9mb28vYmFzZS8uLi5gLCBzbyBvbmx5IHRoZSBzdHJpcHBlZCBwcmVmaXggaXRzZWxmIHF1YWxpZmllcy5cbiAgICAvLyBCZWhpbmQgYSBjdXN0b20gZG9tYWluIHN5bnRoIGNhbiBzZWUsIHRoYXQgaXMgY2VydGFpbi5cbiAgICBpdChcIm9ubHkgYWNjZXB0cyB0aGUgc3RyaXBwZWQgcHJlZml4IGluIGZyb250IG9mIHRoZSBwcm9wXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2RvY3NcIiwgXCIvYXBwL2RvY3NcIiwgZG9tYWluKFwiYXBwXCIpKSkudG9CZShcbiAgICAgICAgXCJkb2NzXCIsXG4gICAgICApO1xuICAgICAgZXhwZWN0KCgpID0+XG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi9wcm9kL2RvY3NcIiwgZG9tYWluKFwiYXBwXCIpKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgICAvLyBBIGN1c3RvbSBkb21haW4gbWFwcGVkIGF0IHRoZSByb290IHN0cmlwcyBub3RoaW5nLCBzbyBvbmx5IGVxdWFsaXR5IHdvcmtzLlxuICAgICAgZXhwZWN0KCgpID0+IHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi92MS9kb2NzXCIsIGRvbWFpbigpKSkudG9UaHJvdyhcbiAgICAgICAgL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8sXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgLy8gT24gdGhlIGV4ZWN1dGUtYXBpIGVuZHBvaW50IGEgZG9tYWluIGF0dGFjaGVkIGxhdGVyIHdpdGhcbiAgICAvLyBgYWRkRG9tYWluTmFtZSh7IGJhc2VQYXRoOiBcInYxXCIgfSlgIGNhbiBzdHJpcCB0aGUgbGVhZGluZyBwYXJ0LCBhbmQgYW5cbiAgICAvLyBleHBsaWNpdCBwcm9wIHdpbnMsIHNvIGFueSBvdGhlciBsZWFkaW5nIHByZWZpeCB3YXJucyBpbnN0ZWFkLlxuICAgIGl0KFwid2FybnMgb24gYW5vdGhlciBsZWFkaW5nIHByZWZpeCB3aGVuIG9ubHkgdGhlIHN0YWdlIGlzIGtub3duXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2FwcFwiLCBcIi92MS9hcHBcIikpLnRvQmUoXCJhcHBcIik7XG4gICAgICBleHBlY3Qod2FybikudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdhZGREb21haW5OYW1lKHsgYmFzZVBhdGg6IFwidjFcIiB9KScpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9iYXNlXCIsIFwiL3Byb2QveC9iYXNlXCIpKS50b0JlKFwiYmFzZVwiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ2FkZERvbWFpbk5hbWUoeyBiYXNlUGF0aDogXCJwcm9kL3hcIiB9KScpLFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KFwiZmFsbHMgYmFjayB0byBhIHRyYWlsaW5nIHNlZ21lbnQgd2hlbiB0aGUgc3RhZ2UgaXMgYSB0b2tlblwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvYmFzZVwiLCBcIi9mb28vYmFzZVwiLCB7IGN1c3RvbURvbWFpbjogZmFsc2UgfSksXG4gICAgICApLnRvQmUoXCJiYXNlXCIpO1xuICAgIH0pO1xuXG4gICAgLy8gQWdyZWVpbmcgd2l0aCB0aGUgYXBwIGlzIG5vdCBlbm91Z2ggd2hlbiB0aGUgdmFsdWUgc3RhcnRzIHdpdGggdGhlIHN0YWdlOlxuICAgIC8vIHJlc291cmNlcyB1bmRlciBcInByb2RcIiBhcmUgb25seSByZWFjaGVkIGF0IFwiL3Byb2QvcHJvZC8uLi5cIi5cbiAgICAvLyBDZXJ0YWluIGJlaGluZCBhIGN1c3RvbSBkb21haW4gc3ludGggY2FuIHNlZTsgb24gdGhlIGV4ZWN1dGUtYXBpXG4gICAgLy8gZW5kcG9pbnQgYW4gYGFkZERvbWFpbk5hbWUoKWAgZG9tYWluIG1hcHBlZCBhdCB0aGUgcm9vdCBtYWtlcyBpdCByaWdodCxcbiAgICAvLyBzbyB0aGVyZSBpdCBvbmx5IHdhcm5zLlxuICAgIGl0KFwicmVqZWN0cyBhIHByb3AgZXF1YWwgdG8gYW4gYXBwIGJhc2VQYXRoIHRoYXQgc3RhcnRzIHdpdGggdGhlIHN0YWdlXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PiByZXNvbHZlQmFzZVBhdGgoUkYsIFwiL2FwcFwiLCBcIi9hcHBcIiwgZG9tYWluKFwiYXBwXCIpKSkudG9UaHJvdyhcbiAgICAgICAgL3N0cmlwcyBcIlxcL2FwcFwiLyxcbiAgICAgICk7XG4gICAgICBleHBlY3QoKCkgPT5cbiAgICAgICAgcmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9hcHAvYmFzZVwiLCBcIi9hcHAvYmFzZVwiLCBkb21haW4oXCJhcHBcIikpLFxuICAgICAgKS50b1Rocm93KC9MZWF2ZSB0aGUgcHJvcCB1bnNldC8pO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgXCIvcHJvZFwiLCBcIi9wcm9kXCIpKS50b0JlKFwicHJvZFwiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ3N0cmlwcyBcIi9wcm9kXCIgYmVmb3JlIG1hdGNoaW5nIHJlc291cmNlcycpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9wcm9kL2Jhc2VcIiwgXCIvcHJvZC9iYXNlXCIpKS50b0JlKFwicHJvZC9iYXNlXCIpO1xuICAgICAgZXhwZWN0KHdhcm4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKFxuICAgICAgICBleHBlY3Quc3RyaW5nQ29udGFpbmluZyhcImFkZERvbWFpbk5hbWUoKVwiKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBpdChcImFjY2VwdHMgYSBtYXRjaGluZyBwcm9wIGFuZCBhcHAgYmFzZVBhdGggbm90aGluZyBzdHJpcHNcIiwgKCkgPT4ge1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChSRiwgXCIvZG9jc1wiLCBcIi9kb2NzXCIsIGRvbWFpbigpKSkudG9CZShcImRvY3NcIik7XG4gICAgICBleHBlY3QoXG4gICAgICAgIHJlc29sdmVCYXNlUGF0aChSRiwgXCIvcHJvZFwiLCBcIi9wcm9kXCIsIHsgY3VzdG9tRG9tYWluOiBmYWxzZSB9KSxcbiAgICAgICkudG9CZShcInByb2RcIik7XG4gICAgICBleHBlY3Qod2Fybikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICB9KTtcblxuICAgIC8vIE1hdGNoaW5nIHRoZSBhcHAgaXMgdGhlIHVuc2V0IGNhc2UncyBwcm9ibGVtIGFnYWluIHdoZW4gYSBzdGFnZSBvclxuICAgIC8vIG1hcHBpbmcgaXMgc3RyaXBwZWQgdGhhdCB0aGUgYXBwJ3MgYmFzZVBhdGggbGFja3MsIHNvIGl0IHdhcm5zIHRoZSBzYW1lLlxuICAgIGl0KFwid2FybnMgd2hlbiBhIG1hdGNoaW5nIHByb3AgYW5kIGFwcCBiYXNlUGF0aCBsYWNrIHRoZSBzdGFnZVwiLCAoKSA9PiB7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9wcm9kdWN0aW9uXCIsIFwiL3Byb2R1Y3Rpb25cIikpLnRvQmUoXG4gICAgICAgIFwicHJvZHVjdGlvblwiLFxuICAgICAgKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1NldCBgYmFzZVBhdGg6IFwiL3Byb2QvcHJvZHVjdGlvblwiYCcpLFxuICAgICAgKTtcbiAgICAgIHdhcm4ubW9ja0NsZWFyKCk7XG4gICAgICBleHBlY3QocmVzb2x2ZUJhc2VQYXRoKFJGLCBcIi9kb2NzXCIsIFwiL2RvY3NcIiwgZG9tYWluKFwidjFcIikpKS50b0JlKFwiZG9jc1wiKTtcbiAgICAgIGV4cGVjdCh3YXJuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICAgZXhwZWN0LnN0cmluZ0NvbnRhaW5pbmcoJ1NldCBgYmFzZVBhdGg6IFwiL3YxL2RvY3NcImAnKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBUaGUgcmV2ZXJzZSBpcyBuZXZlciByaWdodDogdGhlIHByb3AgbmVzdHMgZXZlcnkgcmVzb3VyY2UsIGluY2x1ZGluZyB0aGVcbiAgICAvLyBjYXRjaC1hbGwsIHVuZGVyIGEgcGF0aCB0aGUgYXBwIG5ldmVyIGxpbmtzIHRvLlxuICAgIGl0KFwicmVqZWN0cyB0aGUgcHJvcCBzZXR0aW5nIGEgYmFzZVBhdGggdGhlIGFwcCBkb2Vzbid0XCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2Jhc2VcIiksXG4gICAgICApLnRvVGhyb3coL25lc3RzIGV2ZXJ5IEFQSSBHYXRld2F5IHJlc291cmNlIHVuZGVyIHRoYXQgcGF0aC8pO1xuICAgIH0pO1xuXG4gICAgaXQoXCJyZWplY3RzIHR3byBkaWZmZXJlbnQgdmFsdWVzXCIsICgpID0+IHtcbiAgICAgIGV4cGVjdCgoKSA9PlxuICAgICAgICByZXNvbHZlQmFzZVBhdGgoTmV4dGpzVHlwZS5SRUdJT05BTF9GVU5DVElPTlMsIFwiL2FcIiwgXCIvYlwiKSxcbiAgICAgICkudG9UaHJvdygvbmVzdHMgZXZlcnkgQVBJIEdhdGV3YXkgcmVzb3VyY2UgdW5kZXIgdGhhdCBwYXRoLyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUywgKCkgPT4ge1xuICAgIC8vIGJhc2VQYXRoIG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0IGhlcmU6IHRoZSBBTEIgZm9yd2FyZHMgZXZlcnkgcGF0aFxuICAgIC8vIHRvIHRoZSBjb250YWluZXIsIHdoaWNoIHNlcnZlcyBpdHMgb3duIHN0YXRpYyBhc3NldHMuIFNvIGFueSBjb21iaW5hdGlvblxuICAgIC8vIGlzIHZhbGlkLCBhbmQgdGhlIGFwcCdzIGJhc2VQYXRoIGlzIG5ldmVyIGRlcml2ZWQgaW50byB0aGUgYnVja2V0IHByZWZpeC5cbiAgICBpdChcImFjY2VwdHMgYW55IGNvbWJpbmF0aW9uLCBhbHdheXMga2VlcGluZyB0aGUgcHJvcFwiLCAoKSA9PiB7XG4gICAgICBjb25zdCBuZXh0anNUeXBlID0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIsIFwiL2JcIikpLnRvQmUoXCJhXCIpO1xuICAgICAgZXhwZWN0KHJlc29sdmVCYXNlUGF0aChuZXh0anNUeXBlLCBcIi9hXCIpKS50b0JlKFwiYVwiKTtcbiAgICAgIGV4cGVjdChyZXNvbHZlQmFzZVBhdGgobmV4dGpzVHlwZSwgdW5kZWZpbmVkLCBcIi9iXCIpKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -1,12 +1,11 @@
1
1
  import { Architecture } from "aws-cdk-lib/aws-lambda";
2
2
  /**
3
- * Host architecture normalized to the two Lambda supports, spelled the way
4
- * Sharp's `@img/sharp-<platform>-<arch>` packages spell it.
5
- *
6
- * The Lambda's architecture and the Sharp binaries bundled into its asset must
7
- * come from this one value: deriving them separately lets them disagree on a
8
- * host that is neither x64 nor arm (e.g. s390x), which produces a Lambda that
9
- * fails to load its own bindings.
3
+ * The host's architecture as a Lambda one: the Functions types' default, so
4
+ * any native dependency `next build` traced from this machine runs as built.
10
5
  */
11
- export declare function getNodeArchitecture(): string;
12
6
  export declare function getLambdaArchitecture(): Architecture;
7
+ /**
8
+ * `architecture` spelled the way Sharp's `@img/sharp-<platform>-<arch>`
9
+ * packages spell it.
10
+ */
11
+ export declare function toNodeArchitecture(architecture: Architecture): string;
@@ -1,23 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getNodeArchitecture = getNodeArchitecture;
4
3
  exports.getLambdaArchitecture = getLambdaArchitecture;
4
+ exports.toNodeArchitecture = toNodeArchitecture;
5
5
  const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
6
  /**
7
- * Host architecture normalized to the two Lambda supports, spelled the way
8
- * Sharp's `@img/sharp-<platform>-<arch>` packages spell it.
9
- *
10
- * The Lambda's architecture and the Sharp binaries bundled into its asset must
11
- * come from this one value: deriving them separately lets them disagree on a
12
- * host that is neither x64 nor arm (e.g. s390x), which produces a Lambda that
13
- * fails to load its own bindings.
7
+ * The host's architecture as a Lambda one: the Functions types' default, so
8
+ * any native dependency `next build` traced from this machine runs as built.
14
9
  */
15
- function getNodeArchitecture() {
16
- return process.arch.startsWith("arm") ? "arm64" : "x64";
17
- }
18
10
  function getLambdaArchitecture() {
19
- return getNodeArchitecture() === "arm64"
11
+ return process.arch.startsWith("arm")
20
12
  ? aws_lambda_1.Architecture.ARM_64
21
13
  : aws_lambda_1.Architecture.X86_64;
22
14
  }
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFyY2hpdGVjdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9nZXQtYXJjaGl0ZWN0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0Esa0RBRUM7QUFFRCxzREFJQztBQW5CRCx1REFBc0Q7QUFFdEQ7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFnQixtQkFBbUI7SUFDakMsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDMUQsQ0FBQztBQUVELFNBQWdCLHFCQUFxQjtJQUNuQyxPQUFPLG1CQUFtQixFQUFFLEtBQUssT0FBTztRQUN0QyxDQUFDLENBQUMseUJBQVksQ0FBQyxNQUFNO1FBQ3JCLENBQUMsQ0FBQyx5QkFBWSxDQUFDLE1BQU0sQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuLyoqXG4gKiBIb3N0IGFyY2hpdGVjdHVyZSBub3JtYWxpemVkIHRvIHRoZSB0d28gTGFtYmRhIHN1cHBvcnRzLCBzcGVsbGVkIHRoZSB3YXlcbiAqIFNoYXJwJ3MgYEBpbWcvc2hhcnAtPHBsYXRmb3JtPi08YXJjaD5gIHBhY2thZ2VzIHNwZWxsIGl0LlxuICpcbiAqIFRoZSBMYW1iZGEncyBhcmNoaXRlY3R1cmUgYW5kIHRoZSBTaGFycCBiaW5hcmllcyBidW5kbGVkIGludG8gaXRzIGFzc2V0IG11c3RcbiAqIGNvbWUgZnJvbSB0aGlzIG9uZSB2YWx1ZTogZGVyaXZpbmcgdGhlbSBzZXBhcmF0ZWx5IGxldHMgdGhlbSBkaXNhZ3JlZSBvbiBhXG4gKiBob3N0IHRoYXQgaXMgbmVpdGhlciB4NjQgbm9yIGFybSAoZS5nLiBzMzkweCksIHdoaWNoIHByb2R1Y2VzIGEgTGFtYmRhIHRoYXRcbiAqIGZhaWxzIHRvIGxvYWQgaXRzIG93biBiaW5kaW5ncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVBcmNoaXRlY3R1cmUoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHByb2Nlc3MuYXJjaC5zdGFydHNXaXRoKFwiYXJtXCIpID8gXCJhcm02NFwiIDogXCJ4NjRcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExhbWJkYUFyY2hpdGVjdHVyZSgpOiBBcmNoaXRlY3R1cmUge1xuICByZXR1cm4gZ2V0Tm9kZUFyY2hpdGVjdHVyZSgpID09PSBcImFybTY0XCJcbiAgICA/IEFyY2hpdGVjdHVyZS5BUk1fNjRcbiAgICA6IEFyY2hpdGVjdHVyZS5YODZfNjQ7XG59XG4iXX0=
15
+ /**
16
+ * `architecture` spelled the way Sharp's `@img/sharp-<platform>-<arch>`
17
+ * packages spell it.
18
+ */
19
+ function toNodeArchitecture(architecture) {
20
+ return architecture.name === aws_lambda_1.Architecture.ARM_64.name ? "arm64" : "x64";
21
+ }
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LWFyY2hpdGVjdHVyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9nZXQtYXJjaGl0ZWN0dXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsc0RBSUM7QUFNRCxnREFFQztBQWxCRCx1REFBc0Q7QUFFdEQ7OztHQUdHO0FBQ0gsU0FBZ0IscUJBQXFCO0lBQ25DLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1FBQ25DLENBQUMsQ0FBQyx5QkFBWSxDQUFDLE1BQU07UUFDckIsQ0FBQyxDQUFDLHlCQUFZLENBQUMsTUFBTSxDQUFDO0FBQzFCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxZQUEwQjtJQUMzRCxPQUFPLFlBQVksQ0FBQyxJQUFJLEtBQUsseUJBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMxRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQXJjaGl0ZWN0dXJlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcblxuLyoqXG4gKiBUaGUgaG9zdCdzIGFyY2hpdGVjdHVyZSBhcyBhIExhbWJkYSBvbmU6IHRoZSBGdW5jdGlvbnMgdHlwZXMnIGRlZmF1bHQsIHNvXG4gKiBhbnkgbmF0aXZlIGRlcGVuZGVuY3kgYG5leHQgYnVpbGRgIHRyYWNlZCBmcm9tIHRoaXMgbWFjaGluZSBydW5zIGFzIGJ1aWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGFtYmRhQXJjaGl0ZWN0dXJlKCk6IEFyY2hpdGVjdHVyZSB7XG4gIHJldHVybiBwcm9jZXNzLmFyY2guc3RhcnRzV2l0aChcImFybVwiKVxuICAgID8gQXJjaGl0ZWN0dXJlLkFSTV82NFxuICAgIDogQXJjaGl0ZWN0dXJlLlg4Nl82NDtcbn1cblxuLyoqXG4gKiBgYXJjaGl0ZWN0dXJlYCBzcGVsbGVkIHRoZSB3YXkgU2hhcnAncyBgQGltZy9zaGFycC08cGxhdGZvcm0+LTxhcmNoPmBcbiAqIHBhY2thZ2VzIHNwZWxsIGl0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdG9Ob2RlQXJjaGl0ZWN0dXJlKGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGFyY2hpdGVjdHVyZS5uYW1lID09PSBBcmNoaXRlY3R1cmUuQVJNXzY0Lm5hbWUgPyBcImFybTY0XCIgOiBcIng2NFwiO1xufVxuIl19