cdk-nextjs 0.7.5 → 0.7.7

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 (69) hide show
  1. package/.jsii +38 -38
  2. package/.jsii.tabl.json +1 -1
  3. package/README.md +12 -3
  4. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +31 -13
  5. package/docs/adapter-runtime.md +1 -1
  6. package/docs/caching-guide.md +11 -1
  7. package/docs/harness-coverage.md +11 -9
  8. package/lib/adapter/adapter.mjs +220 -149
  9. package/lib/adapter/aws-cache-store.d.ts +242 -7
  10. package/lib/adapter/aws-cache-store.js +520 -54
  11. package/lib/adapter/aws-cache-store.test.js +710 -3
  12. package/lib/adapter/build-outputs.js +23 -1
  13. package/lib/adapter/build-outputs.test.js +18 -1
  14. package/lib/adapter/cache-handler.d.ts +4 -3
  15. package/lib/adapter/cache-handler.js +1 -1
  16. package/lib/adapter/cache-handler.mjs +552 -91
  17. package/lib/adapter/cache-handler.test.js +31 -1
  18. package/lib/adapter/cache-utils.d.ts +68 -2
  19. package/lib/adapter/cache-utils.js +108 -2
  20. package/lib/adapter/cache-utils.test.js +45 -1
  21. package/lib/adapter/init-cache.d.ts +1 -1
  22. package/lib/adapter/init-cache.js +60 -37
  23. package/lib/adapter/init-cache.test.js +55 -2
  24. package/lib/adapter/local-file-cache-handler.d.ts +2 -2
  25. package/lib/adapter/local-file-cache-handler.js +4 -5
  26. package/lib/adapter/s3-cache-handler.d.ts +23 -7
  27. package/lib/adapter/s3-cache-handler.js +63 -27
  28. package/lib/adapter/s3-cache-handler.test.js +168 -1
  29. package/lib/adapter/use-cache-common.d.ts +53 -1
  30. package/lib/adapter/use-cache-common.js +121 -14
  31. package/lib/adapter/use-cache-common.test.js +138 -1
  32. package/lib/adapter/use-cache-default-handler.js +36 -6
  33. package/lib/adapter/use-cache-default-handler.mjs +557 -51
  34. package/lib/adapter/use-cache-handlers.test.js +247 -7
  35. package/lib/adapter/use-cache-remote-handler.js +10 -9
  36. package/lib/adapter/use-cache-remote-handler.mjs +597 -101
  37. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +2 -1
  38. package/lib/lambdas/post-deploy/prune-revalidation-table.js +35 -13
  39. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +19 -1
  40. package/lib/nextjs-api.js +1 -1
  41. package/lib/nextjs-build/nextjs-build.d.ts +0 -7
  42. package/lib/nextjs-build/nextjs-build.js +4 -11
  43. package/lib/nextjs-build/nextjs-build.test.js +4 -3
  44. package/lib/nextjs-cache.js +1 -1
  45. package/lib/nextjs-compute/nextjs-containers.js +1 -1
  46. package/lib/nextjs-compute/nextjs-functions.js +1 -1
  47. package/lib/nextjs-distribution.js +1 -1
  48. package/lib/nextjs-post-deploy.js +1 -1
  49. package/lib/nextjs-static-assets.js +1 -1
  50. package/lib/root-constructs/nextjs-base-construct.js +1 -1
  51. package/lib/root-constructs/nextjs-global-containers.js +1 -1
  52. package/lib/root-constructs/nextjs-global-functions.js +1 -1
  53. package/lib/root-constructs/nextjs-regional-containers.js +1 -1
  54. package/lib/root-constructs/nextjs-regional-functions.js +1 -1
  55. package/lib/runtime/core.js +18 -4
  56. package/lib/runtime/core.test.js +17 -1
  57. package/lib/runtime/image.d.ts +19 -0
  58. package/lib/runtime/image.js +28 -2
  59. package/lib/runtime/image.test.js +43 -1
  60. package/lib/runtime/lambda.mjs +30 -6
  61. package/lib/runtime/server.mjs +30 -6
  62. package/lib/runtime/tag-manifest.d.ts +15 -0
  63. package/lib/runtime/tag-manifest.js +24 -0
  64. package/lib/runtime/tag-manifest.test.d.ts +1 -0
  65. package/lib/runtime/tag-manifest.test.js +21 -0
  66. package/lib/utils/deployment-build-id.d.ts +11 -0
  67. package/lib/utils/deployment-build-id.js +15 -0
  68. package/package.json +3 -3
  69. package/scripts/e2e-harness/README.md +1 -1
@@ -1,6 +1,10 @@
1
1
  import type { ShimIncomingMessage } from "./http/request";
2
2
  import { ShimServerResponse } from "./http/response";
3
3
  import { AdapterManifest } from "./manifest";
4
+ /** The modules only the image cache needs, loaded with it. */
5
+ interface NextImageCacheModules {
6
+ readonly responseCache: typeof import("next/dist/server/response-cache/index.js");
7
+ }
4
8
  export interface ImageOptimizerOptions {
5
9
  readonly deploymentRoot: string;
6
10
  readonly manifest: AdapterManifest;
@@ -74,3 +78,18 @@ export declare class RuntimeImageOptimizer {
74
78
  private loadCache;
75
79
  private fetchLocal;
76
80
  }
81
+ /**
82
+ * `new ResponseCache(...)` for images, on either side of next 16.3.8. Before
83
+ * it the constructor took `minimalMode`; from it, `{ minimalMode, route }`, and
84
+ * it throws without a `route` - `next-server.js` passes `"image"`. Neither form
85
+ * can stand in for the other: an older `next` takes the options object as a
86
+ * truthy `minimalMode`, and 16.3.8 rejects a bare `false`.
87
+ *
88
+ * Told apart by whether the constructor accepts the older form rather than by
89
+ * the version, which a canary does not order, or by its private fields: 16.3.8
90
+ * destructures a bare `false` into no `route` and throws. Only that throw
91
+ * selects the newer form; any other error from the constructor is rethrown
92
+ * rather than read as a version.
93
+ */
94
+ export declare function newImageResponseCache(ResponseCache: NextImageCacheModules["responseCache"]["default"]): InstanceType<NextImageCacheModules["responseCache"]["default"]>;
95
+ export {};
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RuntimeImageOptimizer = void 0;
4
+ exports.newImageResponseCache = newImageResponseCache;
4
5
  /* eslint-disable import/no-extraneous-dependencies */
5
6
  /**
6
7
  * `/_next/image`, folded into the runtime core.
@@ -224,7 +225,7 @@ async function loadImageCache({ deploymentRoot, manifest, importModule }, loaded
224
225
  });
225
226
  }
226
227
  return {
227
- responses: new modules.responseCache.default(false),
228
+ responses: newImageResponseCache(modules.responseCache.default),
228
229
  images: new next.optimizer.ImageOptimizerCache({
229
230
  distDir,
230
231
  nextConfig,
@@ -232,6 +233,31 @@ async function loadImageCache({ deploymentRoot, manifest, importModule }, loaded
232
233
  }),
233
234
  };
234
235
  }
236
+ /**
237
+ * `new ResponseCache(...)` for images, on either side of next 16.3.8. Before
238
+ * it the constructor took `minimalMode`; from it, `{ minimalMode, route }`, and
239
+ * it throws without a `route` - `next-server.js` passes `"image"`. Neither form
240
+ * can stand in for the other: an older `next` takes the options object as a
241
+ * truthy `minimalMode`, and 16.3.8 rejects a bare `false`.
242
+ *
243
+ * Told apart by whether the constructor accepts the older form rather than by
244
+ * the version, which a canary does not order, or by its private fields: 16.3.8
245
+ * destructures a bare `false` into no `route` and throws. Only that throw
246
+ * selects the newer form; any other error from the constructor is rethrown
247
+ * rather than read as a version.
248
+ */
249
+ function newImageResponseCache(ResponseCache) {
250
+ const Legacy = ResponseCache;
251
+ try {
252
+ return new Legacy(false);
253
+ }
254
+ catch (err) {
255
+ if (!String(err?.message).includes("requires a source route")) {
256
+ throw err;
257
+ }
258
+ return new ResponseCache({ minimalMode: false, route: "image" });
259
+ }
260
+ }
235
261
  /**
236
262
  * `formatDynamicImportPath` from `next/dist/lib/format-dynamic-import-path.js`,
237
263
  * restated: `next build` doesn't trace that module into the deployment, so
@@ -293,4 +319,4 @@ function loadImageRuntime({ deploymentRoot, manifest }) {
293
319
  },
294
320
  };
295
321
  }
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxzREFBc0Q7QUFDdEQ7Ozs7Ozs7O0dBUUc7QUFDSCxxQ0FBdUM7QUFDdkMseUNBQStEO0FBQy9ELHVDQUF3RDtBQUl4RCw4Q0FBdUU7QUFDdkUsK0NBQWtFO0FBRWxFLGlEQUE0QztBQUM1QyxpQ0FBOEM7QUF5RjlDLE1BQWEscUJBQXFCO0lBS0k7SUFKbkIsRUFBRSxHQUFHLElBQUEsZUFBUSxHQUFFLENBQUM7SUFDekIsTUFBTSxDQUF1QztJQUM3QyxVQUFVLENBQXVCO0lBRXpDLFlBQW9DLE9BQThCO1FBQTlCLFlBQU8sR0FBUCxPQUFPLENBQXVCO0lBQUcsQ0FBQztJQUV0RTs7Ozs7O09BTUc7SUFDSSxTQUFTO1FBQ2QsSUFBSSxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxFQUFFLFlBQVksRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDckMsT0FBTyxZQUFZLENBQUMsTUFBTSxLQUFLLFNBQVMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7SUFDeEUsQ0FBQztJQUVNLEtBQUssQ0FBQyxNQUFNLENBQ2pCLEdBQXdCLEVBQ3hCLEdBQXVCLEVBQ3ZCLEdBQVEsRUFDUixTQUE4QztRQUU5Qyw2RUFBNkU7UUFDN0Usa0VBQWtFO1FBQ2xFLHNDQUFzQztRQUN0QyxJQUFJLENBQUMsTUFBTSxLQUFLLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3ZELE1BQU0sRUFDSixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGtCQUFrQixFQUNsQixjQUFjLEVBQ2Qs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LElBQUEseUJBQVUsRUFBQyxxQ0FBcUMsQ0FBQztRQUM1RCxXQUFXLEVBQUUsSUFBQSx5QkFBVSxFQUFDLGtDQUFrQyxDQUFDO0tBQzVELENBQUM7SUFDRixNQUFNLElBQUksR0FBRyxJQUFBLGdCQUFJLEVBQ2YsY0FBYyxFQUNkLFFBQVEsQ0FBQyxrQkFBa0IsRUFDM0IsUUFBUSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQ3ZCLDRCQUE0QixDQUM3QixDQUFDO0lBQ0YsTUFBTSxRQUFRLEdBQXdCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxzQkFBWSxFQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLE9BQU87UUFDTCxJQUFJO1FBQ0osVUFBVTtRQUNWLFlBQVksRUFBRTtZQUNaLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0I7WUFDdEMsR0FBRyxVQUFVLENBQUMsTUFBTTtTQUNyQjtLQUNGLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vKipcbiAqIGAvX25leHQvaW1hZ2VgLCBmb2xkZWQgaW50byB0aGUgcnVudGltZSBjb3JlLlxuICpcbiAqIFRoZSByZXNwb25zZSBpcyB3cml0dGVuIHRvIGEge0BsaW5rIFNoaW1TZXJ2ZXJSZXNwb25zZX0gcmF0aGVyIHRoYW4gc3RyYWlnaHQgdG9cbiAqIGEgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbSwgc28gaXQgY29tcG9zZXMgd2l0aCByb3V0aW5nOiBkaXNwYXRjaCBvbmx5IGNsYXNzaWZpZXNcbiAqIGEgcmVxdWVzdCBhcyBpbWFnZSBvcHRpbWl6YXRpb24gKmFmdGVyKiBtaWRkbGV3YXJlIGhhcyBoYWQgaXQsIHdoaWNoIGlzIHdoYXRcbiAqIG1ha2VzIGBOZXh0UmVzcG9uc2UucmV3cml0ZSgpYCBvbnRvIGFuIGltYWdlIHdvcmsuIFRoYXQgaXMgYWxzbyB3aHkgdGhlcmUgaXMgbm9cbiAqIGxvbmdlciBhIGRlZGljYXRlZCBpbWFnZSBvcHRpbWl6YXRpb24gTGFtYmRhIOKAlCBtaWRkbGV3YXJlIG5ldmVyIHJhbiBmb3IgaXQuXG4gKi9cbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBpc0Fic29sdXRlIGFzIGlzQWJzb2x1dGVQYXRoLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCwgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnQ29tcGxldGUgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9jb25maWctc2hhcmVkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlZFJvdXRlS2luZCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNoaW1JbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwiLi9odHRwL3JlcXVlc3RcIjtcbmltcG9ydCB7IGFzU2VydmVyUmVzcG9uc2UsIFNoaW1TZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCIuL2h0dHAvcmVzcG9uc2VcIjtcbmltcG9ydCB7IGZldGNoRnJvbVMzLCByZXNvbHZlRXJyb3JSZXNwb25zZSB9IGZyb20gXCIuL2ltYWdlLXV0aWxzXCI7XG5pbXBvcnQgeyBBZGFwdGVyTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgbmV4dE1vZHVsZSB9IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZSwgczNDbGllbnQgfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8qKlxuICogUmVxdWlyZWQgdGhyb3VnaCB7QGxpbmsgbmV4dE1vZHVsZX0gcmF0aGVyIHRoYW4gaW1wb3J0ZWQsIGJlY2F1c2UgYG5leHRgIGlzXG4gKiBleHRlcm5hbCB0byB0aGUgc2hlbGwgYnVuZGxlcyBhbmQgZG9lcyBub3QgcmVzb2x2ZSBmcm9tIHdoZXJlIHRoZXkgc2l0LiBFdmVyeVxuICogdHlwZSBoZXJlIGlzIHN0aWxsIHRoZSByZWFsIG9uZTogYHR5cGVvZiBpbXBvcnQoLi4uKWAgaXMgZXJhc2VkLlxuICovXG5pbnRlcmZhY2UgTmV4dEltYWdlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IGNvbmZpZ1NoYXJlZDogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiKTtcbiAgcmVhZG9ubHkgaW1hZ2VDb25maWc6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9pbWFnZS1jb25maWcuanNcIik7XG4gIHJlYWRvbmx5IG9wdGltaXplcjogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIpO1xuICByZWFkb25seSBzZXJ2ZVN0YXRpYzogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIpO1xufVxuXG4vKiogVGhlIG1vZHVsZXMgb25seSB0aGUgaW1hZ2UgY2FjaGUgbmVlZHMsIGxvYWRlZCB3aXRoIGl0LiAqL1xuaW50ZXJmYWNlIE5leHRJbWFnZUNhY2hlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlQ2FjaGU6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpO1xufVxuXG4vKiogQSBgY2FjaGVIYW5kbGVyYCBjbGFzcywgYXMgYG5leHQuY29uZmlnYCdzIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBleHBvcnRzIGl0LiAqL1xudHlwZSBDYWNoZUhhbmRsZXJDbGFzcyA9IG5ldyAoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKSA9PiBOb25OdWxsYWJsZTxcbiAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJJbWFnZU9wdGltaXplckNhY2hlXCJdXG4gID5bMF1bXCJjYWNoZUhhbmRsZXJcIl1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvb3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUVgLiBFbXB0eSB3aGVuIHRoZSBzb3VyY2VzIGFyZSBvbiBkaXNrXG4gICAqIChgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCksIHdoaWNoIHNlbmRzIGV2ZXJ5IG9uZSB0byBgZmV0Y2hJbnRlcm5hbGAuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuIEVtcHR5IHdoZW4gdGhlIGFzc2V0cyBzaXQgYXQgdGhlIHJvb3RcbiAgICogb2YgdGhlIGJ1Y2tldCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRLZXlQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcXVlc3RzIGEgbG9jYWwgc291cmNlIGZyb20gdGhlIGFwcCdzIG93biByb3V0ZXMsIGZvciBvbmUgUzMgaGFzIG5vIGZpbGVcbiAgICogZm9yOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyP2lkPTQyXCI+YCwgc2VydmVkIGJ5IGEgcm91dGUgaGFuZGxlci4gYG5leHRcbiAgICogc3RhcnRgIGZldGNoZXMgZXZlcnkgbG9jYWwgc291cmNlIHRoYXQgd2F5IChgZmV0Y2hJbnRlcm5hbEltYWdlYCk7IGhlcmUgaXRcbiAgICogaXMgdGhlIGZhbGxiYWNrLCBzaW5jZSBuZWFybHkgZXZlcnkgc291cmNlIGlzIGEgZmlsZSwgYW5kIGEgYEdldE9iamVjdGAgaXNcbiAgICogZmFyIGNoZWFwZXIgdGhhbiBhIHJvdXRlIGludm9jYXRpb24uXG4gICAqXG4gICAqIEdpdmVuIHRoZSByZXF1ZXN0IGJlaW5nIG9wdGltaXplZCwgZm9yIGl0cyBhdXRob3JpdHk7IGxpa2UgYG5leHQgc3RhcnRgLFxuICAgKiB0aGUgdmlld2VyJ3MgY29va2llcyBhbmQgb3RoZXIgaGVhZGVycyBhcmUgbm90IHRoZSBpbXBsZW1lbnRhdGlvbidzIHRvXG4gICAqIGZvcndhcmQuIEFuZCBnaXZlbiBgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlgLCBwYXN0IHdoaWNoIGl0IHN0b3BzXG4gICAqIHJlYWRpbmcgYW5kIGFuc3dlcnMge0BsaW5rIEludGVybmFsSW1hZ2VSZXNwb25zZS50b29MYXJnZX0uXG4gICAqL1xuICByZWFkb25seSBmZXRjaEludGVybmFsOiAoXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICBtYXhpbXVtUmVzcG9uc2VCb2R5OiBudW1iZXIsXG4gICkgPT4gUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+O1xuICAvKipcbiAgICogTG9hZHMgdGhlIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBmcm9tIGl0cyBmaWxlIFVSTC4gQSBzZWFtIGZvciB0ZXN0cywgd2hpY2hcbiAgICogcnVuIGFzIENvbW1vbkpTIGFuZCBjYW5ub3QgYGltcG9ydCgpYCBhIFVSTC5cbiAgICogQGRlZmF1bHQgLSBgaW1wb3J0KClgXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRNb2R1bGU/OiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKiBUaGUgcmVzcG9uc2Uge0BsaW5rIEltYWdlT3B0aW1pemVyT3B0aW9ucy5mZXRjaEludGVybmFsfSBnb3QuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsSW1hZ2VSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgcmVhZG9ubHkgYm9keTogQnVmZmVyO1xuICAvKipcbiAgICogVGhlIGBmdW5jdGlvbkdyb3Vwc2AgZ3JvdXAgd2hvc2UgcGFja2FnZSBoYXMgdGhlIHJvdXRlIHRoYXQgc2VydmVzIHRoZVxuICAgKiBzb3VyY2UsIHdoZW4gaXQgaXMgbm90IHRoaXMgZnVuY3Rpb24nczogdGhlcmUgaXMgbm8gcmVzcG9uc2UgdG8gdXNlLCBhbmRcbiAgICogdGhlIG9wdGltaXplciBhbnN3ZXJzIGFuIGV4cGxpY2l0IDUwMiByYXRoZXIgdGhhbiBhIFwibm90IGEgdmFsaWQgaW1hZ2VcIi5cbiAgICovXG4gIHJlYWRvbmx5IG90aGVyR3JvdXA/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBwYXNzZWQgYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgc28gaXQgd2FzIGN1dCBvZmY6IGEgNDEzLCBhc1xuICAgKiBgbmV4dCBzdGFydGAgYW5zd2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IHRvb0xhcmdlPzogYm9vbGVhbjtcbn1cblxuLyoqIFdoYXQgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBpcyByZWFkIGZvci4gKi9cbmludGVyZmFjZSBSZXF1aXJlZFNlcnZlckZpbGVzIHtcbiAgY29uZmlnOiBOZXh0Q29uZmlnQ29tcGxldGU7XG59XG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHMzID0gczNDbGllbnQoKTtcbiAgcHJpdmF0ZSBsb2FkZWQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPjtcbiAgcHJpdmF0ZSBpbWFnZUNhY2hlPzogUHJvbWlzZTxJbWFnZUNhY2hlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbWFnZU9wdGltaXplck9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFwcCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAgYXQgYWxsLiBgbmV4dCBzdGFydGAgYW5zd2VycyA0MDRcbiAgICogd2hlbiBgaW1hZ2VzLnVub3B0aW1pemVkYCBpcyBzZXQgb3IgYSBub24tZGVmYXVsdCBgbG9hZGVyYCBpcyBjb25maWd1cmVkXG4gICAqIChgbmV4dC1zZXJ2ZXIuanNgKSwgYW5kIHNvIGRvZXMgdGhlIHJ1bnRpbWU6IG90aGVyd2lzZSBhbnlvbmUgY2FuIG1ha2UgdGhlXG4gICAqIGNvbXB1dGUgcnVuIHNoYXJwIGFuZCB3cml0ZSB0aGUgaW1hZ2UgY2FjaGUgb24gYW4gZW5kcG9pbnQgdGhlIGFwcCB0dXJuZWRcbiAgICogb2ZmLlxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgaW1hZ2VzQ29uZmlnIH0gPSB0aGlzLmxvYWRlZDtcbiAgICByZXR1cm4gaW1hZ2VzQ29uZmlnLmxvYWRlciA9PT0gXCJkZWZhdWx0XCIgJiYgIWltYWdlc0NvbmZpZy51bm9wdGltaXplZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHVybDogVVJMLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlc29sdmVkIG9uIHRoZSBmaXJzdCBpbWFnZSByZXF1ZXN0IHJhdGhlciB0aGFuIGF0IGNvbGQgc3RhcnQ6IGFuIGFwcCB3aXRoXG4gICAgLy8gbm8gYDxJbWFnZT5gIHNob3VsZCBwYXkgbmVpdGhlciB0aGUgYG5leHRgIG1vZHVsZSBsb2FkcyBub3IgdGhlXG4gICAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBwYXJzZS5cbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgbmV4dCwgbmV4dENvbmZpZywgaW1hZ2VzQ29uZmlnIH0gPSB0aGlzLmxvYWRlZDtcbiAgICBjb25zdCB7XG4gICAgICBJbWFnZUVycm9yLFxuICAgICAgSW1hZ2VPcHRpbWl6ZXJDYWNoZSxcbiAgICAgIGZldGNoRXh0ZXJuYWxJbWFnZSxcbiAgICAgIGltYWdlT3B0aW1pemVyLFxuICAgICAgc2VuZFJlc3BvbnNlLFxuICAgIH0gPSBuZXh0Lm9wdGltaXplcjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBJbWFnZU9wdGltaXplckNhY2hlLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgICByZXEgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiBJbWFnZU9wdGltaXplckNhY2hlLnZhbGlkYXRlUGFyYW1zXG4gICAgICAgID5bMF0sXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyh1cmwuc2VhcmNoUGFyYW1zKSxcbiAgICAgICAgbmV4dENvbmZpZyxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgaWYgKFwiZXJyb3JNZXNzYWdlXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBzZW5kVGV4dChyZXMsIDQwMCwgcGFyYW1zLmVycm9yTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaHJlZiwgaXNBYnNvbHV0ZSB9ID0gcGFyYW1zO1xuICAgICAgY29uc3Qgb3B0aW1pemUgPSBhc3luYyAocHJldmlvdXNDYWNoZUVudHJ5PzogUHJldmlvdXNJbWFnZUVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwc3RyZWFtID0gaXNBYnNvbHV0ZVxuICAgICAgICAgID8gYXdhaXQgZmV0Y2hFeHRlcm5hbEltYWdlKFxuICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcuZGFuZ2Vyb3VzbHlBbGxvd0xvY2FsSVAsXG4gICAgICAgICAgICAgIGltYWdlc0NvbmZpZy5tYXhpbXVtUmVzcG9uc2VCb2R5LFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlZGlyZWN0cyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuZmV0Y2hMb2NhbChcbiAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICBuZXh0Q29uZmlnLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICAgICAgICAgICAgbmV4dC5vcHRpbWl6ZXIsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG9wdGltaXplZCA9IGF3YWl0IGltYWdlT3B0aW1pemVyKFxuICAgICAgICAgIHVwc3RyZWFtLFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHBlcmltZW50YWw6IG5leHRDb25maWcuZXhwZXJpbWVudGFsLFxuICAgICAgICAgICAgaW1hZ2VzOiB7XG4gICAgICAgICAgICAgIGRhbmdlcm91c2x5QWxsb3dTVkc6IGltYWdlc0NvbmZpZy5kYW5nZXJvdXNseUFsbG93U1ZHLFxuICAgICAgICAgICAgICBtaW5pbXVtQ2FjaGVUVEw6IGltYWdlc0NvbmZpZy5taW5pbXVtQ2FjaGVUVEwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBpc0RldjogZmFsc2UsIHByZXZpb3VzQ2FjaGVFbnRyeSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGBpbWFnZU9wdGltaXplcmAgcmVwb3J0cyBhIGZhaWxlZCBvcHRpbWl6YXRpb24gYnkgcmV0dXJuaW5nIHRoZVxuICAgICAgICAvLyB1bnRvdWNoZWQgdXBzdHJlYW0gaW1hZ2UgYWxvbmdzaWRlIGBlcnJvcmAgcmF0aGVyIHRoYW4gdGhyb3dpbmcsIHNvXG4gICAgICAgIC8vIHdpdGhvdXQgdGhpcyBhIGJyb2tlbiBgc2hhcnBgIGluc3RhbGwgc2VydmVzIGZ1bGwtc2l6ZSBvcmlnaW5hbHMgd2l0aFxuICAgICAgICAvLyBhIDIwMCBpbmRlZmluaXRlbHkgYW5kIG5vdGhpbmcgaW4gdGhlIGxvZ3Mgc2F5cyB3aHkuXG4gICAgICAgIGlmIChvcHRpbWl6ZWQuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBvcHRpbWl6ZSAke2hyZWZ9LCBzZXJ2aW5nIHRoZSB1bm9wdGltaXplZCBvcmlnaW5hbDpgLFxuICAgICAgICAgICAgb3B0aW1pemVkLmVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wdGltaXplZDtcbiAgICAgIH07XG5cbiAgICAgIC8vIE5leHQncyBvd24gcmVzcG9uc2Ugd3JpdGVyLCByYXRoZXIgdGhhbiBhIHJlc3RhdGVtZW50IG9mIGl0LCBzbyB0aGVcbiAgICAgIC8vIGhlYWRlcnMgYG5leHQgc3RhcnRgIHNlbmRzIGNvbWUgd2l0aCBpdDogdGhlIHllYXItbG9uZyBgaW1tdXRhYmxlYCBmb3JcbiAgICAgIC8vIGEgYC9fbmV4dC9zdGF0aWMvbWVkaWFgIHNyYywgYElmLU5vbmUtTWF0Y2hgIGFzIGBmcmVzaGAgcmVhZHMgaXQgKHdlYWtcbiAgICAgIC8vIGFuZCBsaXN0ZWQgdGFncywgYENhY2hlLUNvbnRyb2w6IG5vLWNhY2hlYCksIGEgYENvbnRlbnQtRGlzcG9zaXRpb25gXG4gICAgICAvLyB0aGF0IFJGQyA1OTg3LWVuY29kZXMgYSBmaWxlbmFtZSBgd3JpdGVIZWFkYCB3b3VsZCByZWplY3QgYXNcbiAgICAgIC8vIG5vbi1sYXRpbjEsIGBDb250ZW50LUxlbmd0aGAsIGFuZCBubyBib2R5IGZvciBIRUFELiBUaGUgcmVzdGF0ZWRcbiAgICAgIC8vIHZlcnNpb24gaGFkIGRyaWZ0ZWQgb24gZXZlcnkgb25lIG9mIHRob3NlLlxuICAgICAgY29uc3Qgc2VuZCA9IChcbiAgICAgICAgZXh0ZW5zaW9uOiBzdHJpbmcsXG4gICAgICAgIGJ1ZmZlcjogQnVmZmVyLFxuICAgICAgICBldGFnOiBzdHJpbmcsXG4gICAgICAgIHhDYWNoZTogXCJNSVNTXCIgfCBcIkhJVFwiIHwgXCJTVEFMRVwiLFxuICAgICAgICBtYXhBZ2U6IG51bWJlcixcbiAgICAgICkgPT4ge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDIwMDtcbiAgICAgICAgc2VuZFJlc3BvbnNlKFxuICAgICAgICAgIHJlcSBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHNlbmRSZXNwb25zZT5bMF0sXG4gICAgICAgICAgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLFxuICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICBldGFnLFxuICAgICAgICAgIHBhcmFtcy5pc1N0YXRpYyxcbiAgICAgICAgICB4Q2FjaGUsXG4gICAgICAgICAgaW1hZ2VzQ29uZmlnLFxuICAgICAgICAgIG1heEFnZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGBuZXh0IHN0YXJ0YCdzIGBoYW5kbGVOZXh0SW1hZ2VSZXF1ZXN0YCwgc3RlcCBmb3Igc3RlcDogYVxuICAgICAgLy8gYFJlc3BvbnNlQ2FjaGVgIG92ZXIgYW4gYEltYWdlT3B0aW1pemVyQ2FjaGVgIGJhY2tlZCBieSB0aGUgYXBwJ3NcbiAgICAgIC8vIGBjYWNoZUhhbmRsZXJgLCBzbyBhIGhpdCBza2lwcyB0aGUgZmV0Y2ggYW5kIGBzaGFycGAsIGEgc3RhbGUgZW50cnkgaXNcbiAgICAgIC8vIHNlcnZlZCB3aGlsZSBpdCBpcyByZWdlbmVyYXRlZCwgYW5kIGNvbmN1cnJlbnQgbWlzc2VzIGZvciBvbmUgaW1hZ2VcbiAgICAgIC8vIG9wdGltaXplIGl0IG9uY2UuIFRoZSBhcHAncyBgY2FjaGVIYW5kbGVyYCBpcyB0aGUgUzMgY2FjaGUsIHdoaWNoIHRoZVxuICAgICAgLy8gYWRhcHRlciB0dXJucyBvbiB3aXRoIGBpbWFnZXMuY3VzdG9tQ2FjaGVIYW5kbGVyYDogd2l0aCBubyBDRE4gaW4gZnJvbnRcbiAgICAgIC8vICh0aGUgUmVnaW9uYWwgdHlwZXMpIGV2ZXJ5IHJlcXVlc3Qgd291bGQgb3RoZXJ3aXNlIHJ1biBgc2hhcnBgIGFnYWluLFxuICAgICAgLy8gYW5kIGJlaGluZCBDbG91ZEZyb250IGVhY2ggZWRnZSBtaXNzIGlzIGFuIFMzIHJlYWQgaW5zdGVhZC5cbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5sb2FkQ2FjaGUodGhpcy5sb2FkZWQpO1xuICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCBjYWNoZS5yZXNwb25zZXMuZ2V0KFxuICAgICAgICBJbWFnZU9wdGltaXplckNhY2hlLmdldENhY2hlS2V5KHBhcmFtcyksXG4gICAgICAgIGFzeW5jICh7IHByZXZpb3VzQ2FjaGVFbnRyeSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBidWZmZXIsIGNvbnRlbnRUeXBlLCBtYXhBZ2UsIGV0YWcsIHVwc3RyZWFtRXRhZyB9ID1cbiAgICAgICAgICAgIGF3YWl0IG9wdGltaXplKHByZXZpb3VzQ2FjaGVFbnRyeSBhcyBQcmV2aW91c0ltYWdlRW50cnkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBraW5kOiBJTUFHRV9LSU5ELFxuICAgICAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgICAgIGV0YWcsXG4gICAgICAgICAgICAgIGV4dGVuc2lvbjogbmV4dC5zZXJ2ZVN0YXRpYy5nZXRFeHRlbnNpb24oY29udGVudFR5cGUpID8/IFwiXCIsXG4gICAgICAgICAgICAgIHVwc3RyZWFtRXRhZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHsgcmV2YWxpZGF0ZTogbWF4QWdlLCBleHBpcmU6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZUtpbmQ6IElNQUdFX0tJTkQsXG4gICAgICAgICAgaW5jcmVtZW50YWxDYWNoZTogZGVmZXJXcml0ZXMoY2FjaGUuaW1hZ2VzLCB3YWl0VW50aWwpLFxuICAgICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICAgIC8vIEEgc3RhbGUgZW50cnkgaXMgc2VydmVkIGF0IG9uY2UgYW5kIHJlZ2VuZXJhdGVkIGluIHRoZSBiYWNrZ3JvdW5kO1xuICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgYSBMYW1iZGEgY291bGQgZnJlZXplIHdpdGggdGhlIHJlZ2VuZXJhdGlvbiBoYWxmIGRvbmUuXG4gICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgUGFyYW1ldGVyczxJbWFnZUNhY2hlW1wicmVzcG9uc2VzXCJdW1wiZ2V0XCJdPlsyXSxcbiAgICAgICk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5Py52YWx1ZSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGtpbmQ6IHN0cmluZztcbiAgICAgICAgICAgIGV4dGVuc2lvbjogc3RyaW5nO1xuICAgICAgICAgICAgYnVmZmVyOiBCdWZmZXI7XG4gICAgICAgICAgICBldGFnOiBzdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodmFsdWU/LmtpbmQgIT09IElNQUdFX0tJTkQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGltYWdlIGNhY2hlIHJldHVybmVkIG5vIGltYWdlIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgc2VuZChcbiAgICAgICAgdmFsdWUuZXh0ZW5zaW9uLFxuICAgICAgICB2YWx1ZS5idWZmZXIsXG4gICAgICAgIHZhbHVlLmV0YWcsXG4gICAgICAgIGVudHJ5IS5pc01pc3MgPyBcIk1JU1NcIiA6IGVudHJ5IS5pc1N0YWxlID8gXCJTVEFMRVwiIDogXCJISVRcIixcbiAgICAgICAgZW50cnkhLmNhY2hlQ29udHJvbD8ucmV2YWxpZGF0ZSB8fCAwLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgeyBzdGF0dXNDb2RlLCBtZXNzYWdlIH0gPSByZXNvbHZlRXJyb3JSZXNwb25zZShlcnJvciwgSW1hZ2VFcnJvcik7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA+PSA1MDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkltYWdlIG9wdGltaXphdGlvbiBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHNlbmRUZXh0KHJlcywgc3RhdHVzQ29kZSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2aWN0ZWQgb24gZmFpbHVyZSwgYXMgYEVudHJ5cG9pbnRSZWdpc3RyeS5sb2FkYCBldmljdHMgYSBmYWlsZWQgbW9kdWxlIGxvYWQ6XG4gICAqIGEgdHJhbnNpZW50IGZhaWx1cmUgaW1wb3J0aW5nIHRoZSBgY2FjaGVIYW5kbGVyYCAoRU1GSUxFIHVuZGVyIGEgY29sZC1zdGFydFxuICAgKiBidXJzdCkgd291bGQgb3RoZXJ3aXNlIDUwMCBldmVyeSBpbWFnZSByZXF1ZXN0IHVudGlsIHRoZSBzYW5kYm94IHJlY3ljbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ2FjaGUoXG4gICAgbG9hZGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPixcbiAgKTogUHJvbWlzZTxJbWFnZUNhY2hlPiB7XG4gICAgaWYgKCF0aGlzLmltYWdlQ2FjaGUpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gbG9hZEltYWdlQ2FjaGUodGhpcy5vcHRpb25zLCBsb2FkZWQpO1xuICAgICAgdGhpcy5pbWFnZUNhY2hlID0gY2FjaGU7XG4gICAgICBjYWNoZS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlQ2FjaGUgPT09IGNhY2hlKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUNhY2hlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hMb2NhbChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIG5leHRDb25maWc6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRJbWFnZVJ1bnRpbWU+W1wibmV4dENvbmZpZ1wiXSxcbiAgICBtYXhpbXVtUmVzcG9uc2VCb2R5OiBudW1iZXIsXG4gICAgb3B0aW1pemVyOiBOZXh0SW1hZ2VNb2R1bGVzW1wib3B0aW1pemVyXCJdLFxuICApIHtcbiAgICBjb25zdCB7IGJ1Y2tldCwgZmV0Y2hJbnRlcm5hbCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIC8vIE5vIGJ1Y2tldCB3aGVuIHRoZSBzb3VyY2VzIGFyZSBvbiBkaXNrIChgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCksIGFuZFxuICAgIC8vIHRoZSByb3V0ZXMgc2VydmUgdGhvc2UgYXMgdGhleSBzZXJ2ZSBhbnl0aGluZyBTMyBoYXMgbm8gZmlsZSBmb3IuXG4gICAgaWYgKGJ1Y2tldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICAgICAgdGhpcy5zMyxcbiAgICAgICAgICBidWNrZXQsXG4gICAgICAgICAgaHJlZixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1cmxCYXNlUGF0aDogbmV4dENvbmZpZy5iYXNlUGF0aCxcbiAgICAgICAgICAgIGtleVByZWZpeDogdGhpcy5vcHRpb25zLmJ1Y2tldEtleVByZWZpeCxcbiAgICAgICAgICAgIGFzc2V0UHJlZml4OiBuZXh0Q29uZmlnLmFzc2V0UHJlZml4LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBidWZmZXI6IHJlc3VsdC5idWZmZXIsXG4gICAgICAgICAgY29udGVudFR5cGU6IHJlc3VsdC5jb250ZW50VHlwZSxcbiAgICAgICAgICBjYWNoZUNvbnRyb2w6IG51bGwsXG4gICAgICAgICAgZXRhZzogcmVzdWx0LmV0YWcsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSBcIk5vU3VjaEtleVwiO1xuICAgICAgICBpZiAoIW1pc3NpbmcpIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoYXQgYGZldGNoSW50ZXJuYWxJbWFnZWAgY2hlY2tzLCBhbmQgdGhyb3dzLCBmb3IgdGhlIHNhbWUgcmVzcG9uc2UuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bVJlc3BvbnNlQm9keSk7XG4gICAgaWYgKHJlc3BvbnNlLm90aGVyR3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSBkZXBsb3ltZW50IHByb2JsZW0sIG5vdCBhIGJhZCBgdXJsYDogbGVhdmUgdGhlIHJvdXRlIGluIHRoZSBkZWZhdWx0XG4gICAgICAvLyBncm91cCwgb3Igc2VydmUgdGhlIGltYWdlIGFzIGEgZmlsZSAocHVibGljLyBvciBhIHN0YXRpYyBpbXBvcnQpLlxuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA1MDIsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaXRzIHNvdXJjZSBpcyBhIHJvdXRlIGluIGFub3RoZXIgJyArXG4gICAgICAgICAgYGZ1bmN0aW9uR3JvdXBzIGdyb3VwIChcIiR7cmVzcG9uc2Uub3RoZXJHcm91cH1cIiksIHdoaWNoIHRoZSBpbWFnZSBgICtcbiAgICAgICAgICBcIm9wdGltaXplciBjYW5ub3QgZmV0Y2hcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS50b29MYXJnZSkge1xuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA0MTMsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaW50ZXJuYWwgcmVzcG9uc2UgaXMgaW52YWxpZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLnN0YXR1c0NvZGUgfHwgcmVzcG9uc2UuYm9keS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBvcHRpbWl6ZXIuSW1hZ2VFcnJvcihcbiAgICAgICAgNDAwLFxuICAgICAgICAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgdmFsaWQgYnV0IGludGVybmFsIHJlc3BvbnNlIGlzIGludmFsaWQnLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlcjogcmVzcG9uc2UuYm9keSxcbiAgICAgIGNvbnRlbnRUeXBlOiBmaXJzdFZhbHVlKHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pID8/IG51bGwsXG4gICAgICBjYWNoZUNvbnRyb2w6IGZpcnN0VmFsdWUocmVzcG9uc2UuaGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0pID8/IG51bGwsXG4gICAgICBldGFnOiBvcHRpbWl6ZXIuZXh0cmFjdEV0YWcoXG4gICAgICAgIGZpcnN0VmFsdWUocmVzcG9uc2UuaGVhZGVycy5ldGFnKSA/PyBudWxsLFxuICAgICAgICByZXNwb25zZS5ib2R5LFxuICAgICAgKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogYENhY2hlZFJvdXRlS2luZC5JTUFHRWAsIHdoaWNoIGlzIGFsc28gYFJvdXRlS2luZC5JTUFHRWAuIFJlc3RhdGVkOiB0aGUgZW51bSBpc1xuICogYSBydW50aW1lIHZhbHVlIG9mIGBuZXh0YCwgd2hpY2ggdGhlIGJ1bmRsZSBjYW5ub3QgaW1wb3J0LlxuICovXG5jb25zdCBJTUFHRV9LSU5EID0gXCJJTUFHRVwiIGFzIENhY2hlZFJvdXRlS2luZC5JTUFHRTtcblxuLyoqIGBpbWFnZU9wdGltaXplcmAncyBgcHJldmlvdXNDYWNoZUVudHJ5YC4gKi9cbnR5cGUgUHJldmlvdXNJbWFnZUVudHJ5ID0gUGFyYW1ldGVyczxcbiAgTmV4dEltYWdlTW9kdWxlc1tcIm9wdGltaXplclwiXVtcImltYWdlT3B0aW1pemVyXCJdXG4+WzNdW1wicHJldmlvdXNDYWNoZUVudHJ5XCJdO1xuXG5pbnRlcmZhY2UgSW1hZ2VDYWNoZSB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlczogSW5zdGFuY2VUeXBlPFxuICAgIE5leHRJbWFnZUNhY2hlTW9kdWxlc1tcInJlc3BvbnNlQ2FjaGVcIl1bXCJkZWZhdWx0XCJdXG4gID47XG4gIHJlYWRvbmx5IGltYWdlczogSW5zdGFuY2VUeXBlPFxuICAgIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJJbWFnZU9wdGltaXplckNhY2hlXCJdXG4gID47XG59XG5cbi8qKlxuICogVGhlIGFwcCdzIGBjYWNoZUhhbmRsZXJgLCBjb25zdHJ1Y3RlZCB0aGUgd2F5IGBuZXh0IHN0YXJ0YCBjb25zdHJ1Y3RzIGl0IGZvclxuICogaW1hZ2VzIChgbmV4dC1zZXJ2ZXIuanNgLCBgaGFuZGxlTmV4dEltYWdlUmVxdWVzdGApOiBvbmNlLCBhbmQga2VwdCwgc28gaXRzXG4gKiBpbi1tZW1vcnkgbGF5ZXIgbGFzdHMgYWNyb3NzIHJlcXVlc3RzLiBJdHMgcGF0aCBpbiBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gXG4gKiBpcyByZWxhdGl2ZSB0byB0aGUgZGlzdCBkaXI7IHNlZSB7QGxpbmsgY2FjaGVIYW5kbGVyVXJsfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZEltYWdlQ2FjaGUoXG4gIHsgZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0LCBpbXBvcnRNb2R1bGUgfTogSW1hZ2VPcHRpbWl6ZXJPcHRpb25zLFxuICBsb2FkZWQ6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRJbWFnZVJ1bnRpbWU+LFxuKTogUHJvbWlzZTxJbWFnZUNhY2hlPiB7XG4gIGNvbnN0IHsgbmV4dCwgbmV4dENvbmZpZyB9ID0gbG9hZGVkO1xuICBjb25zdCBtb2R1bGVzOiBOZXh0SW1hZ2VDYWNoZU1vZHVsZXMgPSB7XG4gICAgcmVzcG9uc2VDYWNoZTogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGUvaW5kZXguanNcIiksXG4gIH07XG4gIGNvbnN0IGRpc3REaXIgPSBqb2luKFxuICAgIGRlcGxveW1lbnRSb290LFxuICAgIG1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpcixcbiAgICBtYW5pZmVzdC5jb25maWcuZGlzdERpcixcbiAgKTtcbiAgbGV0IGNhY2hlSGFuZGxlcjogSW5zdGFuY2VUeXBlPENhY2hlSGFuZGxlckNsYXNzPiB8IHVuZGVmaW5lZDtcbiAgaWYgKG5leHRDb25maWcuY2FjaGVIYW5kbGVyKSB7XG4gICAgY29uc3QgdXJsID0gY2FjaGVIYW5kbGVyVXJsKGRpc3REaXIsIG5leHRDb25maWcuY2FjaGVIYW5kbGVyKTtcbiAgICBjb25zdCBpbXBvcnRlZCA9IChhd2FpdCAoaW1wb3J0TW9kdWxlXG4gICAgICA/IGltcG9ydE1vZHVsZSh1cmwpXG4gICAgICA6IGltcG9ydCh1cmwpKSkgYXMgeyBkZWZhdWx0PzogQ2FjaGVIYW5kbGVyQ2xhc3MgfSAmIENhY2hlSGFuZGxlckNsYXNzO1xuICAgIGNvbnN0IENhY2hlSGFuZGxlciA9IGltcG9ydGVkLmRlZmF1bHQgPz8gaW1wb3J0ZWQ7XG4gICAgY2FjaGVIYW5kbGVyID0gbmV3IENhY2hlSGFuZGxlcih7XG4gICAgICBkZXY6IGZhbHNlLFxuICAgICAgZmx1c2hUb0Rpc2s6IG5leHRDb25maWcuZXhwZXJpbWVudGFsLmlzckZsdXNoVG9EaXNrLFxuICAgICAgc2VydmVyRGlzdERpcjogam9pbihkaXN0RGlyLCBcInNlcnZlclwiKSxcbiAgICAgIG1heE1lbW9yeUNhY2hlU2l6ZTogbmV4dENvbmZpZy5jYWNoZU1heE1lbW9yeVNpemUsXG4gICAgICByZXZhbGlkYXRlZFRhZ3M6IFtdLFxuICAgICAgX3JlcXVlc3RIZWFkZXJzOiB7fSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlc3BvbnNlczogbmV3IG1vZHVsZXMucmVzcG9uc2VDYWNoZS5kZWZhdWx0KGZhbHNlKSxcbiAgICBpbWFnZXM6IG5ldyBuZXh0Lm9wdGltaXplci5JbWFnZU9wdGltaXplckNhY2hlKHtcbiAgICAgIGRpc3REaXIsXG4gICAgICBuZXh0Q29uZmlnLFxuICAgICAgY2FjaGVIYW5kbGVyLFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIGBmb3JtYXREeW5hbWljSW1wb3J0UGF0aGAgZnJvbSBgbmV4dC9kaXN0L2xpYi9mb3JtYXQtZHluYW1pYy1pbXBvcnQtcGF0aC5qc2AsXG4gKiByZXN0YXRlZDogYG5leHQgYnVpbGRgIGRvZXNuJ3QgdHJhY2UgdGhhdCBtb2R1bGUgaW50byB0aGUgZGVwbG95bWVudCwgc29cbiAqIGxvYWRpbmcgaXQgZmFpbGVkIGV2ZXJ5IGltYWdlIHJlcXVlc3Qgd2l0aCB0aGUgY2FjaGUgb24uXG4gKi9cbmZ1bmN0aW9uIGNhY2hlSGFuZGxlclVybChkaXN0RGlyOiBzdHJpbmcsIGNhY2hlSGFuZGxlcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGF0aCA9IGNhY2hlSGFuZGxlci5zdGFydHNXaXRoKFwiZmlsZTovL1wiKVxuICAgID8gZmlsZVVSTFRvUGF0aChjYWNoZUhhbmRsZXIpXG4gICAgOiBjYWNoZUhhbmRsZXI7XG4gIHJldHVybiBwYXRoVG9GaWxlVVJMKFxuICAgIGlzQWJzb2x1dGVQYXRoKHBhdGgpID8gcGF0aCA6IGpvaW4oZGlzdERpciwgcGF0aCksXG4gICkudG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBgaW1hZ2VzYCwgd2l0aCBpdHMgYHNldGAgbW92ZWQgb2ZmIHRoZSByZXNwb25zZSdzIGNyaXRpY2FsIHBhdGguXG4gKlxuICogYFJlc3BvbnNlQ2FjaGVgIGF3YWl0cyB0aGUgd3JpdGUgb2YgYSBmcmVzaGx5IG9wdGltaXplZCBpbWFnZSBiZWZvcmUgaXQgaGFuZHNcbiAqIHRoZSBpbWFnZSBiYWNrLCBzbyBldmVyeSBtaXNzIHBhaWQgYW4gUzMgYFB1dE9iamVjdGAgKH4zMCBtcyBtZWFzdXJlZCkgYmVmb3JlXG4gKiBpdHMgZmlyc3QgYnl0ZS4gVGhlIHdyaXRlIGlzIHJlZ2lzdGVyZWQgd2l0aCBgd2FpdFVudGlsYCBpbnN0ZWFkLCB3aGljaCB0aGVcbiAqIHJ1bnRpbWUgZHJhaW5zIGJlZm9yZSBhIExhbWJkYSBpbnZvY2F0aW9uIHJldHVybnMgb3IgYSBjb250YWluZXIgc2h1dHMgZG93bixcbiAqIHNvIGl0IHN0aWxsIGxhbmRzLiBBIGZhaWxlZCB3cml0ZSBpcyBsb2dnZWQ7IHRoZSBuZXh0IHJlcXVlc3Qgb3B0aW1pemVzIHRoZVxuICogaW1hZ2UgYWdhaW4sIHdoaWNoIGlzIHdoYXQgaXQgd291bGQgaGF2ZSBkb25lIGFueXdheS5cbiAqL1xuZnVuY3Rpb24gZGVmZXJXcml0ZXMoXG4gIGltYWdlczogSW1hZ2VDYWNoZVtcImltYWdlc1wiXSxcbiAgd2FpdFVudGlsOiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZCxcbik6IEltYWdlQ2FjaGVbXCJpbWFnZXNcIl0ge1xuICBjb25zdCBkZWZlcnJlZCA9IE9iamVjdC5jcmVhdGUoaW1hZ2VzKSBhcyBJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdO1xuICBkZWZlcnJlZC5zZXQgPSAoLi4uYXJnczogUGFyYW1ldGVyczxJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdW1wic2V0XCJdPikgPT4ge1xuICAgIHdhaXRVbnRpbChcbiAgICAgIGltYWdlcy5zZXQoLi4uYXJncykuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgdG8gY2FjaGUgYW4gb3B0aW1pemVkIGltYWdlOlwiLCBlcnJvcik7XG4gICAgICB9KSxcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgfTtcbiAgcmV0dXJuIGRlZmVycmVkO1xufVxuXG5mdW5jdGlvbiBzZW5kVGV4dChcbiAgcmVzOiBTaGltU2VydmVyUmVzcG9uc2UsXG4gIHN0YXR1c0NvZGU6IG51bWJlcixcbiAgYm9keTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIHJlcy5zdGF0dXNDb2RlID0gc3RhdHVzQ29kZTtcbiAgcmVzLnNldEhlYWRlcihcIkNvbnRlbnQtVHlwZVwiLCBcInRleHQvcGxhaW5cIik7XG4gIHJlcy5lbmQoYm9keSk7XG59XG5cbi8qKlxuICogVGhlIGltYWdlIGNvbmZpZyBjb21lcyBmcm9tIHRoZSBhcHAncyBvd24gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCwgbm90IHRoZVxuICogYWRhcHRlciBtYW5pZmVzdDogYGltYWdlT3B0aW1pemVyYCByZWFkcyB3aG9sZSBgZXhwZXJpbWVudGFsYCBhbmQgYGltYWdlc2BcbiAqIG9iamVjdHMsIGFuZCBtaXJyb3JpbmcgdGhvc2UgaW50byB0aGUgbWFuaWZlc3Qgd291bGQgYmUgYSBzZWNvbmQgZGVmaW5pdGlvbiBvZlxuICogdGhlIHNhbWUgdGhpbmcgdGhhdCBzaWxlbnRseSBnb2VzIHN0YWxlIG9uIGEgYG5leHRgIG1pbm9yLlxuICovXG5mdW5jdGlvbiBsb2FkSW1hZ2VSdW50aW1lKHsgZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0IH06IEltYWdlT3B0aW1pemVyT3B0aW9ucykge1xuICBjb25zdCBuZXh0OiBOZXh0SW1hZ2VNb2R1bGVzID0ge1xuICAgIGNvbmZpZ1NoYXJlZDogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiKSxcbiAgICBpbWFnZUNvbmZpZzogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zaGFyZWQvbGliL2ltYWdlLWNvbmZpZy5qc1wiKSxcbiAgICBvcHRpbWl6ZXI6IG5leHRNb2R1bGUoXCJuZXh0L2Rpc3Qvc2VydmVyL2ltYWdlLW9wdGltaXplci5qc1wiKSxcbiAgICBzZXJ2ZVN0YXRpYzogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIpLFxuICB9O1xuICBjb25zdCBwYXRoID0gam9pbihcbiAgICBkZXBsb3ltZW50Um9vdCxcbiAgICBtYW5pZmVzdC5yZWxhdGl2ZVByb2plY3REaXIsXG4gICAgbWFuaWZlc3QuY29uZmlnLmRpc3REaXIsXG4gICAgXCJyZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiLFxuICApO1xuICBjb25zdCByZXF1aXJlZDogUmVxdWlyZWRTZXJ2ZXJGaWxlcyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmLThcIikpO1xuICBjb25zdCBuZXh0Q29uZmlnID0gbmV4dC5jb25maWdTaGFyZWQuZ2V0TmV4dENvbmZpZ1J1bnRpbWUocmVxdWlyZWQuY29uZmlnKTtcbiAgcmV0dXJuIHtcbiAgICBuZXh0LFxuICAgIG5leHRDb25maWcsXG4gICAgaW1hZ2VzQ29uZmlnOiB7XG4gICAgICAuLi5uZXh0LmltYWdlQ29uZmlnLmltYWdlQ29uZmlnRGVmYXVsdCxcbiAgICAgIC4uLm5leHRDb25maWcuaW1hZ2VzLFxuICAgIH0sXG4gIH07XG59XG4iXX0=
322
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcnVudGltZS9pbWFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFpZEEsc0RBY0M7QUEvZEQsc0RBQXNEO0FBQ3REOzs7Ozs7OztHQVFHO0FBQ0gscUNBQXVDO0FBQ3ZDLHlDQUErRDtBQUMvRCx1Q0FBd0Q7QUFJeEQsOENBQXVFO0FBQ3ZFLCtDQUFrRTtBQUVsRSxpREFBNEM7QUFDNUMsaUNBQThDO0FBeUY5QyxNQUFhLHFCQUFxQjtJQUtJO0lBSm5CLEVBQUUsR0FBRyxJQUFBLGVBQVEsR0FBRSxDQUFDO0lBQ3pCLE1BQU0sQ0FBdUM7SUFDN0MsVUFBVSxDQUF1QjtJQUV6QyxZQUFvQyxPQUE4QjtRQUE5QixZQUFPLEdBQVAsT0FBTyxDQUF1QjtJQUFHLENBQUM7SUFFdEU7Ozs7OztPQU1HO0lBQ0ksU0FBUztRQUNkLElBQUksQ0FBQyxNQUFNLEtBQUssZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE9BQU8sWUFBWSxDQUFDLE1BQU0sS0FBSyxTQUFTLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO0lBQ3hFLENBQUM7SUFFTSxLQUFLLENBQUMsTUFBTSxDQUNqQixHQUF3QixFQUN4QixHQUF1QixFQUN2QixHQUFRLEVBQ1IsU0FBOEM7UUFFOUMsNkVBQTZFO1FBQzdFLGtFQUFrRTtRQUNsRSxzQ0FBc0M7UUFDdEMsSUFBSSxDQUFDLE1BQU0sS0FBSyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2RCxNQUFNLEVBQ0osVUFBVSxFQUNWLG1CQUFtQixFQUNuQixrQkFBa0IsRUFD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Iiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vKipcbiAqIGAvX25leHQvaW1hZ2VgLCBmb2xkZWQgaW50byB0aGUgcnVudGltZSBjb3JlLlxuICpcbiAqIFRoZSByZXNwb25zZSBpcyB3cml0dGVuIHRvIGEge0BsaW5rIFNoaW1TZXJ2ZXJSZXNwb25zZX0gcmF0aGVyIHRoYW4gc3RyYWlnaHQgdG9cbiAqIGEgTGFtYmRhIHJlc3BvbnNlIHN0cmVhbSwgc28gaXQgY29tcG9zZXMgd2l0aCByb3V0aW5nOiBkaXNwYXRjaCBvbmx5IGNsYXNzaWZpZXNcbiAqIGEgcmVxdWVzdCBhcyBpbWFnZSBvcHRpbWl6YXRpb24gKmFmdGVyKiBtaWRkbGV3YXJlIGhhcyBoYWQgaXQsIHdoaWNoIGlzIHdoYXRcbiAqIG1ha2VzIGBOZXh0UmVzcG9uc2UucmV3cml0ZSgpYCBvbnRvIGFuIGltYWdlIHdvcmsuIFRoYXQgaXMgYWxzbyB3aHkgdGhlcmUgaXMgbm9cbiAqIGxvbmdlciBhIGRlZGljYXRlZCBpbWFnZSBvcHRpbWl6YXRpb24gTGFtYmRhIOKAlCBtaWRkbGV3YXJlIG5ldmVyIHJhbiBmb3IgaXQuXG4gKi9cbmltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBpc0Fic29sdXRlIGFzIGlzQWJzb2x1dGVQYXRoLCBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCwgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnQ29tcGxldGUgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9jb25maWctc2hhcmVkLmpzXCI7XG5pbXBvcnQgdHlwZSB7IENhY2hlZFJvdXRlS2luZCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL3R5cGVzLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFNoaW1JbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwiLi9odHRwL3JlcXVlc3RcIjtcbmltcG9ydCB7IGFzU2VydmVyUmVzcG9uc2UsIFNoaW1TZXJ2ZXJSZXNwb25zZSB9IGZyb20gXCIuL2h0dHAvcmVzcG9uc2VcIjtcbmltcG9ydCB7IGZldGNoRnJvbVMzLCByZXNvbHZlRXJyb3JSZXNwb25zZSB9IGZyb20gXCIuL2ltYWdlLXV0aWxzXCI7XG5pbXBvcnQgeyBBZGFwdGVyTWFuaWZlc3QgfSBmcm9tIFwiLi9tYW5pZmVzdFwiO1xuaW1wb3J0IHsgbmV4dE1vZHVsZSB9IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZSwgczNDbGllbnQgfSBmcm9tIFwiLi91dGlsXCI7XG5cbi8qKlxuICogUmVxdWlyZWQgdGhyb3VnaCB7QGxpbmsgbmV4dE1vZHVsZX0gcmF0aGVyIHRoYW4gaW1wb3J0ZWQsIGJlY2F1c2UgYG5leHRgIGlzXG4gKiBleHRlcm5hbCB0byB0aGUgc2hlbGwgYnVuZGxlcyBhbmQgZG9lcyBub3QgcmVzb2x2ZSBmcm9tIHdoZXJlIHRoZXkgc2l0LiBFdmVyeVxuICogdHlwZSBoZXJlIGlzIHN0aWxsIHRoZSByZWFsIG9uZTogYHR5cGVvZiBpbXBvcnQoLi4uKWAgaXMgZXJhc2VkLlxuICovXG5pbnRlcmZhY2UgTmV4dEltYWdlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IGNvbmZpZ1NoYXJlZDogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvY29uZmlnLXNoYXJlZC5qc1wiKTtcbiAgcmVhZG9ubHkgaW1hZ2VDb25maWc6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9pbWFnZS1jb25maWcuanNcIik7XG4gIHJlYWRvbmx5IG9wdGltaXplcjogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIpO1xuICByZWFkb25seSBzZXJ2ZVN0YXRpYzogdHlwZW9mIGltcG9ydChcIm5leHQvZGlzdC9zZXJ2ZXIvc2VydmUtc3RhdGljLmpzXCIpO1xufVxuXG4vKiogVGhlIG1vZHVsZXMgb25seSB0aGUgaW1hZ2UgY2FjaGUgbmVlZHMsIGxvYWRlZCB3aXRoIGl0LiAqL1xuaW50ZXJmYWNlIE5leHRJbWFnZUNhY2hlTW9kdWxlcyB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlQ2FjaGU6IHR5cGVvZiBpbXBvcnQoXCJuZXh0L2Rpc3Qvc2VydmVyL3Jlc3BvbnNlLWNhY2hlL2luZGV4LmpzXCIpO1xufVxuXG4vKiogQSBgY2FjaGVIYW5kbGVyYCBjbGFzcywgYXMgYG5leHQuY29uZmlnYCdzIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBleHBvcnRzIGl0LiAqL1xudHlwZSBDYWNoZUhhbmRsZXJDbGFzcyA9IG5ldyAoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKSA9PiBOb25OdWxsYWJsZTxcbiAgQ29uc3RydWN0b3JQYXJhbWV0ZXJzPFxuICAgIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJJbWFnZU9wdGltaXplckNhY2hlXCJdXG4gID5bMF1bXCJjYWNoZUhhbmRsZXJcIl1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgZGVwbG95bWVudFJvb3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgbWFuaWZlc3Q6IEFkYXB0ZXJNYW5pZmVzdDtcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUVgLiBFbXB0eSB3aGVuIHRoZSBzb3VyY2VzIGFyZSBvbiBkaXNrXG4gICAqIChgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCksIHdoaWNoIHNlbmRzIGV2ZXJ5IG9uZSB0byBgZmV0Y2hJbnRlcm5hbGAuXG4gICAqL1xuICByZWFkb25seSBidWNrZXQ6IHN0cmluZztcbiAgLyoqXG4gICAqIGBDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWGAuIEVtcHR5IHdoZW4gdGhlIGFzc2V0cyBzaXQgYXQgdGhlIHJvb3RcbiAgICogb2YgdGhlIGJ1Y2tldCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQuXG4gICAqL1xuICByZWFkb25seSBidWNrZXRLZXlQcmVmaXg6IHN0cmluZztcbiAgLyoqXG4gICAqIFJlcXVlc3RzIGEgbG9jYWwgc291cmNlIGZyb20gdGhlIGFwcCdzIG93biByb3V0ZXMsIGZvciBvbmUgUzMgaGFzIG5vIGZpbGVcbiAgICogZm9yOiBgPEltYWdlIHNyYz1cIi9hcGkvYXZhdGFyP2lkPTQyXCI+YCwgc2VydmVkIGJ5IGEgcm91dGUgaGFuZGxlci4gYG5leHRcbiAgICogc3RhcnRgIGZldGNoZXMgZXZlcnkgbG9jYWwgc291cmNlIHRoYXQgd2F5IChgZmV0Y2hJbnRlcm5hbEltYWdlYCk7IGhlcmUgaXRcbiAgICogaXMgdGhlIGZhbGxiYWNrLCBzaW5jZSBuZWFybHkgZXZlcnkgc291cmNlIGlzIGEgZmlsZSwgYW5kIGEgYEdldE9iamVjdGAgaXNcbiAgICogZmFyIGNoZWFwZXIgdGhhbiBhIHJvdXRlIGludm9jYXRpb24uXG4gICAqXG4gICAqIEdpdmVuIHRoZSByZXF1ZXN0IGJlaW5nIG9wdGltaXplZCwgZm9yIGl0cyBhdXRob3JpdHk7IGxpa2UgYG5leHQgc3RhcnRgLFxuICAgKiB0aGUgdmlld2VyJ3MgY29va2llcyBhbmQgb3RoZXIgaGVhZGVycyBhcmUgbm90IHRoZSBpbXBsZW1lbnRhdGlvbidzIHRvXG4gICAqIGZvcndhcmQuIEFuZCBnaXZlbiBgaW1hZ2VzLm1heGltdW1SZXNwb25zZUJvZHlgLCBwYXN0IHdoaWNoIGl0IHN0b3BzXG4gICAqIHJlYWRpbmcgYW5kIGFuc3dlcnMge0BsaW5rIEludGVybmFsSW1hZ2VSZXNwb25zZS50b29MYXJnZX0uXG4gICAqL1xuICByZWFkb25seSBmZXRjaEludGVybmFsOiAoXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIHJlcTogU2hpbUluY29taW5nTWVzc2FnZSxcbiAgICBtYXhpbXVtUmVzcG9uc2VCb2R5OiBudW1iZXIsXG4gICkgPT4gUHJvbWlzZTxJbnRlcm5hbEltYWdlUmVzcG9uc2U+O1xuICAvKipcbiAgICogTG9hZHMgdGhlIGBjYWNoZUhhbmRsZXJgIG1vZHVsZSBmcm9tIGl0cyBmaWxlIFVSTC4gQSBzZWFtIGZvciB0ZXN0cywgd2hpY2hcbiAgICogcnVuIGFzIENvbW1vbkpTIGFuZCBjYW5ub3QgYGltcG9ydCgpYCBhIFVSTC5cbiAgICogQGRlZmF1bHQgLSBgaW1wb3J0KClgXG4gICAqL1xuICByZWFkb25seSBpbXBvcnRNb2R1bGU/OiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8dW5rbm93bj47XG59XG5cbi8qKiBUaGUgcmVzcG9uc2Uge0BsaW5rIEltYWdlT3B0aW1pemVyT3B0aW9ucy5mZXRjaEludGVybmFsfSBnb3QuICovXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsSW1hZ2VSZXNwb25zZSB7XG4gIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgaGVhZGVyczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQ+PjtcbiAgcmVhZG9ubHkgYm9keTogQnVmZmVyO1xuICAvKipcbiAgICogVGhlIGBmdW5jdGlvbkdyb3Vwc2AgZ3JvdXAgd2hvc2UgcGFja2FnZSBoYXMgdGhlIHJvdXRlIHRoYXQgc2VydmVzIHRoZVxuICAgKiBzb3VyY2UsIHdoZW4gaXQgaXMgbm90IHRoaXMgZnVuY3Rpb24nczogdGhlcmUgaXMgbm8gcmVzcG9uc2UgdG8gdXNlLCBhbmRcbiAgICogdGhlIG9wdGltaXplciBhbnN3ZXJzIGFuIGV4cGxpY2l0IDUwMiByYXRoZXIgdGhhbiBhIFwibm90IGEgdmFsaWQgaW1hZ2VcIi5cbiAgICovXG4gIHJlYWRvbmx5IG90aGVyR3JvdXA/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgYm9keSBwYXNzZWQgYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgc28gaXQgd2FzIGN1dCBvZmY6IGEgNDEzLCBhc1xuICAgKiBgbmV4dCBzdGFydGAgYW5zd2Vycy5cbiAgICovXG4gIHJlYWRvbmx5IHRvb0xhcmdlPzogYm9vbGVhbjtcbn1cblxuLyoqIFdoYXQgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBpcyByZWFkIGZvci4gKi9cbmludGVyZmFjZSBSZXF1aXJlZFNlcnZlckZpbGVzIHtcbiAgY29uZmlnOiBOZXh0Q29uZmlnQ29tcGxldGU7XG59XG5cbmV4cG9ydCBjbGFzcyBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IHMzID0gczNDbGllbnQoKTtcbiAgcHJpdmF0ZSBsb2FkZWQ/OiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPjtcbiAgcHJpdmF0ZSBpbWFnZUNhY2hlPzogUHJvbWlzZTxJbWFnZUNhY2hlPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBJbWFnZU9wdGltaXplck9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGFwcCBzZXJ2ZXMgYC9fbmV4dC9pbWFnZWAgYXQgYWxsLiBgbmV4dCBzdGFydGAgYW5zd2VycyA0MDRcbiAgICogd2hlbiBgaW1hZ2VzLnVub3B0aW1pemVkYCBpcyBzZXQgb3IgYSBub24tZGVmYXVsdCBgbG9hZGVyYCBpcyBjb25maWd1cmVkXG4gICAqIChgbmV4dC1zZXJ2ZXIuanNgKSwgYW5kIHNvIGRvZXMgdGhlIHJ1bnRpbWU6IG90aGVyd2lzZSBhbnlvbmUgY2FuIG1ha2UgdGhlXG4gICAqIGNvbXB1dGUgcnVuIHNoYXJwIGFuZCB3cml0ZSB0aGUgaW1hZ2UgY2FjaGUgb24gYW4gZW5kcG9pbnQgdGhlIGFwcCB0dXJuZWRcbiAgICogb2ZmLlxuICAgKi9cbiAgcHVibGljIGlzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgaW1hZ2VzQ29uZmlnIH0gPSB0aGlzLmxvYWRlZDtcbiAgICByZXR1cm4gaW1hZ2VzQ29uZmlnLmxvYWRlciA9PT0gXCJkZWZhdWx0XCIgJiYgIWltYWdlc0NvbmZpZy51bm9wdGltaXplZDtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGUoXG4gICAgcmVxOiBTaGltSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogU2hpbVNlcnZlclJlc3BvbnNlLFxuICAgIHVybDogVVJMLFxuICAgIHdhaXRVbnRpbDogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIFJlc29sdmVkIG9uIHRoZSBmaXJzdCBpbWFnZSByZXF1ZXN0IHJhdGhlciB0aGFuIGF0IGNvbGQgc3RhcnQ6IGFuIGFwcCB3aXRoXG4gICAgLy8gbm8gYDxJbWFnZT5gIHNob3VsZCBwYXkgbmVpdGhlciB0aGUgYG5leHRgIG1vZHVsZSBsb2FkcyBub3IgdGhlXG4gICAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBwYXJzZS5cbiAgICB0aGlzLmxvYWRlZCA/Pz0gbG9hZEltYWdlUnVudGltZSh0aGlzLm9wdGlvbnMpO1xuICAgIGNvbnN0IHsgbmV4dCwgbmV4dENvbmZpZywgaW1hZ2VzQ29uZmlnIH0gPSB0aGlzLmxvYWRlZDtcbiAgICBjb25zdCB7XG4gICAgICBJbWFnZUVycm9yLFxuICAgICAgSW1hZ2VPcHRpbWl6ZXJDYWNoZSxcbiAgICAgIGZldGNoRXh0ZXJuYWxJbWFnZSxcbiAgICAgIGltYWdlT3B0aW1pemVyLFxuICAgICAgc2VuZFJlc3BvbnNlLFxuICAgIH0gPSBuZXh0Lm9wdGltaXplcjtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJhbXMgPSBJbWFnZU9wdGltaXplckNhY2hlLnZhbGlkYXRlUGFyYW1zKFxuICAgICAgICByZXEgYXMgdW5rbm93biBhcyBQYXJhbWV0ZXJzPFxuICAgICAgICAgIHR5cGVvZiBJbWFnZU9wdGltaXplckNhY2hlLnZhbGlkYXRlUGFyYW1zXG4gICAgICAgID5bMF0sXG4gICAgICAgIE9iamVjdC5mcm9tRW50cmllcyh1cmwuc2VhcmNoUGFyYW1zKSxcbiAgICAgICAgbmV4dENvbmZpZyxcbiAgICAgICAgZmFsc2UsXG4gICAgICApO1xuICAgICAgaWYgKFwiZXJyb3JNZXNzYWdlXCIgaW4gcGFyYW1zKSB7XG4gICAgICAgIHJldHVybiBzZW5kVGV4dChyZXMsIDQwMCwgcGFyYW1zLmVycm9yTWVzc2FnZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHsgaHJlZiwgaXNBYnNvbHV0ZSB9ID0gcGFyYW1zO1xuICAgICAgY29uc3Qgb3B0aW1pemUgPSBhc3luYyAocHJldmlvdXNDYWNoZUVudHJ5PzogUHJldmlvdXNJbWFnZUVudHJ5KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwc3RyZWFtID0gaXNBYnNvbHV0ZVxuICAgICAgICAgID8gYXdhaXQgZmV0Y2hFeHRlcm5hbEltYWdlKFxuICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcuZGFuZ2Vyb3VzbHlBbGxvd0xvY2FsSVAsXG4gICAgICAgICAgICAgIGltYWdlc0NvbmZpZy5tYXhpbXVtUmVzcG9uc2VCb2R5LFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlZGlyZWN0cyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICA6IGF3YWl0IHRoaXMuZmV0Y2hMb2NhbChcbiAgICAgICAgICAgICAgcmVxLFxuICAgICAgICAgICAgICBocmVmLFxuICAgICAgICAgICAgICBuZXh0Q29uZmlnLFxuICAgICAgICAgICAgICBpbWFnZXNDb25maWcubWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICAgICAgICAgICAgbmV4dC5vcHRpbWl6ZXIsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG9wdGltaXplZCA9IGF3YWl0IGltYWdlT3B0aW1pemVyKFxuICAgICAgICAgIHVwc3RyZWFtLFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHBlcmltZW50YWw6IG5leHRDb25maWcuZXhwZXJpbWVudGFsLFxuICAgICAgICAgICAgaW1hZ2VzOiB7XG4gICAgICAgICAgICAgIGRhbmdlcm91c2x5QWxsb3dTVkc6IGltYWdlc0NvbmZpZy5kYW5nZXJvdXNseUFsbG93U1ZHLFxuICAgICAgICAgICAgICBtaW5pbXVtQ2FjaGVUVEw6IGltYWdlc0NvbmZpZy5taW5pbXVtQ2FjaGVUVEwsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBpc0RldjogZmFsc2UsIHByZXZpb3VzQ2FjaGVFbnRyeSB9LFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIGBpbWFnZU9wdGltaXplcmAgcmVwb3J0cyBhIGZhaWxlZCBvcHRpbWl6YXRpb24gYnkgcmV0dXJuaW5nIHRoZVxuICAgICAgICAvLyB1bnRvdWNoZWQgdXBzdHJlYW0gaW1hZ2UgYWxvbmdzaWRlIGBlcnJvcmAgcmF0aGVyIHRoYW4gdGhyb3dpbmcsIHNvXG4gICAgICAgIC8vIHdpdGhvdXQgdGhpcyBhIGJyb2tlbiBgc2hhcnBgIGluc3RhbGwgc2VydmVzIGZ1bGwtc2l6ZSBvcmlnaW5hbHMgd2l0aFxuICAgICAgICAvLyBhIDIwMCBpbmRlZmluaXRlbHkgYW5kIG5vdGhpbmcgaW4gdGhlIGxvZ3Mgc2F5cyB3aHkuXG4gICAgICAgIGlmIChvcHRpbWl6ZWQuZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYEZhaWxlZCB0byBvcHRpbWl6ZSAke2hyZWZ9LCBzZXJ2aW5nIHRoZSB1bm9wdGltaXplZCBvcmlnaW5hbDpgLFxuICAgICAgICAgICAgb3B0aW1pemVkLmVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wdGltaXplZDtcbiAgICAgIH07XG5cbiAgICAgIC8vIE5leHQncyBvd24gcmVzcG9uc2Ugd3JpdGVyLCByYXRoZXIgdGhhbiBhIHJlc3RhdGVtZW50IG9mIGl0LCBzbyB0aGVcbiAgICAgIC8vIGhlYWRlcnMgYG5leHQgc3RhcnRgIHNlbmRzIGNvbWUgd2l0aCBpdDogdGhlIHllYXItbG9uZyBgaW1tdXRhYmxlYCBmb3JcbiAgICAgIC8vIGEgYC9fbmV4dC9zdGF0aWMvbWVkaWFgIHNyYywgYElmLU5vbmUtTWF0Y2hgIGFzIGBmcmVzaGAgcmVhZHMgaXQgKHdlYWtcbiAgICAgIC8vIGFuZCBsaXN0ZWQgdGFncywgYENhY2hlLUNvbnRyb2w6IG5vLWNhY2hlYCksIGEgYENvbnRlbnQtRGlzcG9zaXRpb25gXG4gICAgICAvLyB0aGF0IFJGQyA1OTg3LWVuY29kZXMgYSBmaWxlbmFtZSBgd3JpdGVIZWFkYCB3b3VsZCByZWplY3QgYXNcbiAgICAgIC8vIG5vbi1sYXRpbjEsIGBDb250ZW50LUxlbmd0aGAsIGFuZCBubyBib2R5IGZvciBIRUFELiBUaGUgcmVzdGF0ZWRcbiAgICAgIC8vIHZlcnNpb24gaGFkIGRyaWZ0ZWQgb24gZXZlcnkgb25lIG9mIHRob3NlLlxuICAgICAgY29uc3Qgc2VuZCA9IChcbiAgICAgICAgZXh0ZW5zaW9uOiBzdHJpbmcsXG4gICAgICAgIGJ1ZmZlcjogQnVmZmVyLFxuICAgICAgICBldGFnOiBzdHJpbmcsXG4gICAgICAgIHhDYWNoZTogXCJNSVNTXCIgfCBcIkhJVFwiIHwgXCJTVEFMRVwiLFxuICAgICAgICBtYXhBZ2U6IG51bWJlcixcbiAgICAgICkgPT4ge1xuICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDIwMDtcbiAgICAgICAgc2VuZFJlc3BvbnNlKFxuICAgICAgICAgIHJlcSBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8dHlwZW9mIHNlbmRSZXNwb25zZT5bMF0sXG4gICAgICAgICAgYXNTZXJ2ZXJSZXNwb25zZShyZXMpLFxuICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgZXh0ZW5zaW9uLFxuICAgICAgICAgIGJ1ZmZlcixcbiAgICAgICAgICBldGFnLFxuICAgICAgICAgIHBhcmFtcy5pc1N0YXRpYyxcbiAgICAgICAgICB4Q2FjaGUsXG4gICAgICAgICAgaW1hZ2VzQ29uZmlnLFxuICAgICAgICAgIG1heEFnZSxcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgKTtcbiAgICAgIH07XG5cbiAgICAgIC8vIGBuZXh0IHN0YXJ0YCdzIGBoYW5kbGVOZXh0SW1hZ2VSZXF1ZXN0YCwgc3RlcCBmb3Igc3RlcDogYVxuICAgICAgLy8gYFJlc3BvbnNlQ2FjaGVgIG92ZXIgYW4gYEltYWdlT3B0aW1pemVyQ2FjaGVgIGJhY2tlZCBieSB0aGUgYXBwJ3NcbiAgICAgIC8vIGBjYWNoZUhhbmRsZXJgLCBzbyBhIGhpdCBza2lwcyB0aGUgZmV0Y2ggYW5kIGBzaGFycGAsIGEgc3RhbGUgZW50cnkgaXNcbiAgICAgIC8vIHNlcnZlZCB3aGlsZSBpdCBpcyByZWdlbmVyYXRlZCwgYW5kIGNvbmN1cnJlbnQgbWlzc2VzIGZvciBvbmUgaW1hZ2VcbiAgICAgIC8vIG9wdGltaXplIGl0IG9uY2UuIFRoZSBhcHAncyBgY2FjaGVIYW5kbGVyYCBpcyB0aGUgUzMgY2FjaGUsIHdoaWNoIHRoZVxuICAgICAgLy8gYWRhcHRlciB0dXJucyBvbiB3aXRoIGBpbWFnZXMuY3VzdG9tQ2FjaGVIYW5kbGVyYDogd2l0aCBubyBDRE4gaW4gZnJvbnRcbiAgICAgIC8vICh0aGUgUmVnaW9uYWwgdHlwZXMpIGV2ZXJ5IHJlcXVlc3Qgd291bGQgb3RoZXJ3aXNlIHJ1biBgc2hhcnBgIGFnYWluLFxuICAgICAgLy8gYW5kIGJlaGluZCBDbG91ZEZyb250IGVhY2ggZWRnZSBtaXNzIGlzIGFuIFMzIHJlYWQgaW5zdGVhZC5cbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5sb2FkQ2FjaGUodGhpcy5sb2FkZWQpO1xuICAgICAgY29uc3QgZW50cnkgPSBhd2FpdCBjYWNoZS5yZXNwb25zZXMuZ2V0KFxuICAgICAgICBJbWFnZU9wdGltaXplckNhY2hlLmdldENhY2hlS2V5KHBhcmFtcyksXG4gICAgICAgIGFzeW5jICh7IHByZXZpb3VzQ2FjaGVFbnRyeSB9KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBidWZmZXIsIGNvbnRlbnRUeXBlLCBtYXhBZ2UsIGV0YWcsIHVwc3RyZWFtRXRhZyB9ID1cbiAgICAgICAgICAgIGF3YWl0IG9wdGltaXplKHByZXZpb3VzQ2FjaGVFbnRyeSBhcyBQcmV2aW91c0ltYWdlRW50cnkpO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICBraW5kOiBJTUFHRV9LSU5ELFxuICAgICAgICAgICAgICBidWZmZXIsXG4gICAgICAgICAgICAgIGV0YWcsXG4gICAgICAgICAgICAgIGV4dGVuc2lvbjogbmV4dC5zZXJ2ZVN0YXRpYy5nZXRFeHRlbnNpb24oY29udGVudFR5cGUpID8/IFwiXCIsXG4gICAgICAgICAgICAgIHVwc3RyZWFtRXRhZyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjYWNoZUNvbnRyb2w6IHsgcmV2YWxpZGF0ZTogbWF4QWdlLCBleHBpcmU6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICByb3V0ZUtpbmQ6IElNQUdFX0tJTkQsXG4gICAgICAgICAgaW5jcmVtZW50YWxDYWNoZTogZGVmZXJXcml0ZXMoY2FjaGUuaW1hZ2VzLCB3YWl0VW50aWwpLFxuICAgICAgICAgIGlzRmFsbGJhY2s6IGZhbHNlLFxuICAgICAgICAgIC8vIEEgc3RhbGUgZW50cnkgaXMgc2VydmVkIGF0IG9uY2UgYW5kIHJlZ2VuZXJhdGVkIGluIHRoZSBiYWNrZ3JvdW5kO1xuICAgICAgICAgIC8vIHdpdGhvdXQgdGhpcywgYSBMYW1iZGEgY291bGQgZnJlZXplIHdpdGggdGhlIHJlZ2VuZXJhdGlvbiBoYWxmIGRvbmUuXG4gICAgICAgICAgd2FpdFVudGlsLFxuICAgICAgICB9IGFzIHVua25vd24gYXMgUGFyYW1ldGVyczxJbWFnZUNhY2hlW1wicmVzcG9uc2VzXCJdW1wiZ2V0XCJdPlsyXSxcbiAgICAgICk7XG4gICAgICBjb25zdCB2YWx1ZSA9IGVudHJ5Py52YWx1ZSBhc1xuICAgICAgICB8IHtcbiAgICAgICAgICAgIGtpbmQ6IHN0cmluZztcbiAgICAgICAgICAgIGV4dGVuc2lvbjogc3RyaW5nO1xuICAgICAgICAgICAgYnVmZmVyOiBCdWZmZXI7XG4gICAgICAgICAgICBldGFnOiBzdHJpbmc7XG4gICAgICAgICAgfVxuICAgICAgICB8IG51bGxcbiAgICAgICAgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAodmFsdWU/LmtpbmQgIT09IElNQUdFX0tJTkQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlIGltYWdlIGNhY2hlIHJldHVybmVkIG5vIGltYWdlIGVudHJ5XCIpO1xuICAgICAgfVxuICAgICAgc2VuZChcbiAgICAgICAgdmFsdWUuZXh0ZW5zaW9uLFxuICAgICAgICB2YWx1ZS5idWZmZXIsXG4gICAgICAgIHZhbHVlLmV0YWcsXG4gICAgICAgIGVudHJ5IS5pc01pc3MgPyBcIk1JU1NcIiA6IGVudHJ5IS5pc1N0YWxlID8gXCJTVEFMRVwiIDogXCJISVRcIixcbiAgICAgICAgZW50cnkhLmNhY2hlQ29udHJvbD8ucmV2YWxpZGF0ZSB8fCAwLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgeyBzdGF0dXNDb2RlLCBtZXNzYWdlIH0gPSByZXNvbHZlRXJyb3JSZXNwb25zZShlcnJvciwgSW1hZ2VFcnJvcik7XG4gICAgICBpZiAoc3RhdHVzQ29kZSA+PSA1MDApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkltYWdlIG9wdGltaXphdGlvbiBmYWlsZWQ6XCIsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHNlbmRUZXh0KHJlcywgc3RhdHVzQ29kZSwgbWVzc2FnZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV2aWN0ZWQgb24gZmFpbHVyZSwgYXMgYEVudHJ5cG9pbnRSZWdpc3RyeS5sb2FkYCBldmljdHMgYSBmYWlsZWQgbW9kdWxlIGxvYWQ6XG4gICAqIGEgdHJhbnNpZW50IGZhaWx1cmUgaW1wb3J0aW5nIHRoZSBgY2FjaGVIYW5kbGVyYCAoRU1GSUxFIHVuZGVyIGEgY29sZC1zdGFydFxuICAgKiBidXJzdCkgd291bGQgb3RoZXJ3aXNlIDUwMCBldmVyeSBpbWFnZSByZXF1ZXN0IHVudGlsIHRoZSBzYW5kYm94IHJlY3ljbGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBsb2FkQ2FjaGUoXG4gICAgbG9hZGVkOiBSZXR1cm5UeXBlPHR5cGVvZiBsb2FkSW1hZ2VSdW50aW1lPixcbiAgKTogUHJvbWlzZTxJbWFnZUNhY2hlPiB7XG4gICAgaWYgKCF0aGlzLmltYWdlQ2FjaGUpIHtcbiAgICAgIGNvbnN0IGNhY2hlID0gbG9hZEltYWdlQ2FjaGUodGhpcy5vcHRpb25zLCBsb2FkZWQpO1xuICAgICAgdGhpcy5pbWFnZUNhY2hlID0gY2FjaGU7XG4gICAgICBjYWNoZS5jYXRjaCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmltYWdlQ2FjaGUgPT09IGNhY2hlKSB7XG4gICAgICAgICAgdGhpcy5pbWFnZUNhY2hlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW1hZ2VDYWNoZTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2hMb2NhbChcbiAgICByZXE6IFNoaW1JbmNvbWluZ01lc3NhZ2UsXG4gICAgaHJlZjogc3RyaW5nLFxuICAgIG5leHRDb25maWc6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRJbWFnZVJ1bnRpbWU+W1wibmV4dENvbmZpZ1wiXSxcbiAgICBtYXhpbXVtUmVzcG9uc2VCb2R5OiBudW1iZXIsXG4gICAgb3B0aW1pemVyOiBOZXh0SW1hZ2VNb2R1bGVzW1wib3B0aW1pemVyXCJdLFxuICApIHtcbiAgICBjb25zdCB7IGJ1Y2tldCwgZmV0Y2hJbnRlcm5hbCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIC8vIE5vIGJ1Y2tldCB3aGVuIHRoZSBzb3VyY2VzIGFyZSBvbiBkaXNrIChgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCksIGFuZFxuICAgIC8vIHRoZSByb3V0ZXMgc2VydmUgdGhvc2UgYXMgdGhleSBzZXJ2ZSBhbnl0aGluZyBTMyBoYXMgbm8gZmlsZSBmb3IuXG4gICAgaWYgKGJ1Y2tldCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmV0Y2hGcm9tUzMoXG4gICAgICAgICAgdGhpcy5zMyxcbiAgICAgICAgICBidWNrZXQsXG4gICAgICAgICAgaHJlZixcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1cmxCYXNlUGF0aDogbmV4dENvbmZpZy5iYXNlUGF0aCxcbiAgICAgICAgICAgIGtleVByZWZpeDogdGhpcy5vcHRpb25zLmJ1Y2tldEtleVByZWZpeCxcbiAgICAgICAgICAgIGFzc2V0UHJlZml4OiBuZXh0Q29uZmlnLmFzc2V0UHJlZml4LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBidWZmZXI6IHJlc3VsdC5idWZmZXIsXG4gICAgICAgICAgY29udGVudFR5cGU6IHJlc3VsdC5jb250ZW50VHlwZSxcbiAgICAgICAgICBjYWNoZUNvbnRyb2w6IG51bGwsXG4gICAgICAgICAgZXRhZzogcmVzdWx0LmV0YWcsXG4gICAgICAgIH07XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zdCBtaXNzaW5nID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJiBlcnJvci5uYW1lID09PSBcIk5vU3VjaEtleVwiO1xuICAgICAgICBpZiAoIW1pc3NpbmcpIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoYXQgYGZldGNoSW50ZXJuYWxJbWFnZWAgY2hlY2tzLCBhbmQgdGhyb3dzLCBmb3IgdGhlIHNhbWUgcmVzcG9uc2UuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaEludGVybmFsKGhyZWYsIHJlcSwgbWF4aW11bVJlc3BvbnNlQm9keSk7XG4gICAgaWYgKHJlc3BvbnNlLm90aGVyR3JvdXAgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSBkZXBsb3ltZW50IHByb2JsZW0sIG5vdCBhIGJhZCBgdXJsYDogbGVhdmUgdGhlIHJvdXRlIGluIHRoZSBkZWZhdWx0XG4gICAgICAvLyBncm91cCwgb3Igc2VydmUgdGhlIGltYWdlIGFzIGEgZmlsZSAocHVibGljLyBvciBhIHN0YXRpYyBpbXBvcnQpLlxuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA1MDIsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaXRzIHNvdXJjZSBpcyBhIHJvdXRlIGluIGFub3RoZXIgJyArXG4gICAgICAgICAgYGZ1bmN0aW9uR3JvdXBzIGdyb3VwIChcIiR7cmVzcG9uc2Uub3RoZXJHcm91cH1cIiksIHdoaWNoIHRoZSBpbWFnZSBgICtcbiAgICAgICAgICBcIm9wdGltaXplciBjYW5ub3QgZmV0Y2hcIixcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChyZXNwb25zZS50b29MYXJnZSkge1xuICAgICAgdGhyb3cgbmV3IG9wdGltaXplci5JbWFnZUVycm9yKFxuICAgICAgICA0MTMsXG4gICAgICAgICdcInVybFwiIHBhcmFtZXRlciBpcyB2YWxpZCBidXQgaW50ZXJuYWwgcmVzcG9uc2UgaXMgaW52YWxpZCcsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXJlc3BvbnNlLnN0YXR1c0NvZGUgfHwgcmVzcG9uc2UuYm9keS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBvcHRpbWl6ZXIuSW1hZ2VFcnJvcihcbiAgICAgICAgNDAwLFxuICAgICAgICAnXCJ1cmxcIiBwYXJhbWV0ZXIgaXMgdmFsaWQgYnV0IGludGVybmFsIHJlc3BvbnNlIGlzIGludmFsaWQnLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlcjogcmVzcG9uc2UuYm9keSxcbiAgICAgIGNvbnRlbnRUeXBlOiBmaXJzdFZhbHVlKHJlc3BvbnNlLmhlYWRlcnNbXCJjb250ZW50LXR5cGVcIl0pID8/IG51bGwsXG4gICAgICBjYWNoZUNvbnRyb2w6IGZpcnN0VmFsdWUocmVzcG9uc2UuaGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0pID8/IG51bGwsXG4gICAgICBldGFnOiBvcHRpbWl6ZXIuZXh0cmFjdEV0YWcoXG4gICAgICAgIGZpcnN0VmFsdWUocmVzcG9uc2UuaGVhZGVycy5ldGFnKSA/PyBudWxsLFxuICAgICAgICByZXNwb25zZS5ib2R5LFxuICAgICAgKSxcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogYENhY2hlZFJvdXRlS2luZC5JTUFHRWAsIHdoaWNoIGlzIGFsc28gYFJvdXRlS2luZC5JTUFHRWAuIFJlc3RhdGVkOiB0aGUgZW51bSBpc1xuICogYSBydW50aW1lIHZhbHVlIG9mIGBuZXh0YCwgd2hpY2ggdGhlIGJ1bmRsZSBjYW5ub3QgaW1wb3J0LlxuICovXG5jb25zdCBJTUFHRV9LSU5EID0gXCJJTUFHRVwiIGFzIENhY2hlZFJvdXRlS2luZC5JTUFHRTtcblxuLyoqIGBpbWFnZU9wdGltaXplcmAncyBgcHJldmlvdXNDYWNoZUVudHJ5YC4gKi9cbnR5cGUgUHJldmlvdXNJbWFnZUVudHJ5ID0gUGFyYW1ldGVyczxcbiAgTmV4dEltYWdlTW9kdWxlc1tcIm9wdGltaXplclwiXVtcImltYWdlT3B0aW1pemVyXCJdXG4+WzNdW1wicHJldmlvdXNDYWNoZUVudHJ5XCJdO1xuXG5pbnRlcmZhY2UgSW1hZ2VDYWNoZSB7XG4gIHJlYWRvbmx5IHJlc3BvbnNlczogSW5zdGFuY2VUeXBlPFxuICAgIE5leHRJbWFnZUNhY2hlTW9kdWxlc1tcInJlc3BvbnNlQ2FjaGVcIl1bXCJkZWZhdWx0XCJdXG4gID47XG4gIHJlYWRvbmx5IGltYWdlczogSW5zdGFuY2VUeXBlPFxuICAgIE5leHRJbWFnZU1vZHVsZXNbXCJvcHRpbWl6ZXJcIl1bXCJJbWFnZU9wdGltaXplckNhY2hlXCJdXG4gID47XG59XG5cbi8qKlxuICogVGhlIGFwcCdzIGBjYWNoZUhhbmRsZXJgLCBjb25zdHJ1Y3RlZCB0aGUgd2F5IGBuZXh0IHN0YXJ0YCBjb25zdHJ1Y3RzIGl0IGZvclxuICogaW1hZ2VzIChgbmV4dC1zZXJ2ZXIuanNgLCBgaGFuZGxlTmV4dEltYWdlUmVxdWVzdGApOiBvbmNlLCBhbmQga2VwdCwgc28gaXRzXG4gKiBpbi1tZW1vcnkgbGF5ZXIgbGFzdHMgYWNyb3NzIHJlcXVlc3RzLiBJdHMgcGF0aCBpbiBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gXG4gKiBpcyByZWxhdGl2ZSB0byB0aGUgZGlzdCBkaXI7IHNlZSB7QGxpbmsgY2FjaGVIYW5kbGVyVXJsfS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZEltYWdlQ2FjaGUoXG4gIHsgZGVwbG95bWVudFJvb3QsIG1hbmlmZXN0LCBpbXBvcnRNb2R1bGUgfTogSW1hZ2VPcHRpbWl6ZXJPcHRpb25zLFxuICBsb2FkZWQ6IFJldHVyblR5cGU8dHlwZW9mIGxvYWRJbWFnZVJ1bnRpbWU+LFxuKTogUHJvbWlzZTxJbWFnZUNhY2hlPiB7XG4gIGNvbnN0IHsgbmV4dCwgbmV4dENvbmZpZyB9ID0gbG9hZGVkO1xuICBjb25zdCBtb2R1bGVzOiBOZXh0SW1hZ2VDYWNoZU1vZHVsZXMgPSB7XG4gICAgcmVzcG9uc2VDYWNoZTogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvcmVzcG9uc2UtY2FjaGUvaW5kZXguanNcIiksXG4gIH07XG4gIGNvbnN0IGRpc3REaXIgPSBqb2luKFxuICAgIGRlcGxveW1lbnRSb290LFxuICAgIG1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpcixcbiAgICBtYW5pZmVzdC5jb25maWcuZGlzdERpcixcbiAgKTtcbiAgbGV0IGNhY2hlSGFuZGxlcjogSW5zdGFuY2VUeXBlPENhY2hlSGFuZGxlckNsYXNzPiB8IHVuZGVmaW5lZDtcbiAgaWYgKG5leHRDb25maWcuY2FjaGVIYW5kbGVyKSB7XG4gICAgY29uc3QgdXJsID0gY2FjaGVIYW5kbGVyVXJsKGRpc3REaXIsIG5leHRDb25maWcuY2FjaGVIYW5kbGVyKTtcbiAgICBjb25zdCBpbXBvcnRlZCA9IChhd2FpdCAoaW1wb3J0TW9kdWxlXG4gICAgICA/IGltcG9ydE1vZHVsZSh1cmwpXG4gICAgICA6IGltcG9ydCh1cmwpKSkgYXMgeyBkZWZhdWx0PzogQ2FjaGVIYW5kbGVyQ2xhc3MgfSAmIENhY2hlSGFuZGxlckNsYXNzO1xuICAgIGNvbnN0IENhY2hlSGFuZGxlciA9IGltcG9ydGVkLmRlZmF1bHQgPz8gaW1wb3J0ZWQ7XG4gICAgY2FjaGVIYW5kbGVyID0gbmV3IENhY2hlSGFuZGxlcih7XG4gICAgICBkZXY6IGZhbHNlLFxuICAgICAgZmx1c2hUb0Rpc2s6IG5leHRDb25maWcuZXhwZXJpbWVudGFsLmlzckZsdXNoVG9EaXNrLFxuICAgICAgc2VydmVyRGlzdERpcjogam9pbihkaXN0RGlyLCBcInNlcnZlclwiKSxcbiAgICAgIG1heE1lbW9yeUNhY2hlU2l6ZTogbmV4dENvbmZpZy5jYWNoZU1heE1lbW9yeVNpemUsXG4gICAgICByZXZhbGlkYXRlZFRhZ3M6IFtdLFxuICAgICAgX3JlcXVlc3RIZWFkZXJzOiB7fSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlc3BvbnNlczogbmV3SW1hZ2VSZXNwb25zZUNhY2hlKG1vZHVsZXMucmVzcG9uc2VDYWNoZS5kZWZhdWx0KSxcbiAgICBpbWFnZXM6IG5ldyBuZXh0Lm9wdGltaXplci5JbWFnZU9wdGltaXplckNhY2hlKHtcbiAgICAgIGRpc3REaXIsXG4gICAgICBuZXh0Q29uZmlnLFxuICAgICAgY2FjaGVIYW5kbGVyLFxuICAgIH0pLFxuICB9O1xufVxuXG4vKipcbiAqIGBuZXcgUmVzcG9uc2VDYWNoZSguLi4pYCBmb3IgaW1hZ2VzLCBvbiBlaXRoZXIgc2lkZSBvZiBuZXh0IDE2LjMuOC4gQmVmb3JlXG4gKiBpdCB0aGUgY29uc3RydWN0b3IgdG9vayBgbWluaW1hbE1vZGVgOyBmcm9tIGl0LCBgeyBtaW5pbWFsTW9kZSwgcm91dGUgfWAsIGFuZFxuICogaXQgdGhyb3dzIHdpdGhvdXQgYSBgcm91dGVgIC0gYG5leHQtc2VydmVyLmpzYCBwYXNzZXMgYFwiaW1hZ2VcImAuIE5laXRoZXIgZm9ybVxuICogY2FuIHN0YW5kIGluIGZvciB0aGUgb3RoZXI6IGFuIG9sZGVyIGBuZXh0YCB0YWtlcyB0aGUgb3B0aW9ucyBvYmplY3QgYXMgYVxuICogdHJ1dGh5IGBtaW5pbWFsTW9kZWAsIGFuZCAxNi4zLjggcmVqZWN0cyBhIGJhcmUgYGZhbHNlYC5cbiAqXG4gKiBUb2xkIGFwYXJ0IGJ5IHdoZXRoZXIgdGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgdGhlIG9sZGVyIGZvcm0gcmF0aGVyIHRoYW4gYnlcbiAqIHRoZSB2ZXJzaW9uLCB3aGljaCBhIGNhbmFyeSBkb2VzIG5vdCBvcmRlciwgb3IgYnkgaXRzIHByaXZhdGUgZmllbGRzOiAxNi4zLjhcbiAqIGRlc3RydWN0dXJlcyBhIGJhcmUgYGZhbHNlYCBpbnRvIG5vIGByb3V0ZWAgYW5kIHRocm93cy4gT25seSB0aGF0IHRocm93XG4gKiBzZWxlY3RzIHRoZSBuZXdlciBmb3JtOyBhbnkgb3RoZXIgZXJyb3IgZnJvbSB0aGUgY29uc3RydWN0b3IgaXMgcmV0aHJvd25cbiAqIHJhdGhlciB0aGFuIHJlYWQgYXMgYSB2ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV3SW1hZ2VSZXNwb25zZUNhY2hlKFxuICBSZXNwb25zZUNhY2hlOiBOZXh0SW1hZ2VDYWNoZU1vZHVsZXNbXCJyZXNwb25zZUNhY2hlXCJdW1wiZGVmYXVsdFwiXSxcbik6IEluc3RhbmNlVHlwZTxOZXh0SW1hZ2VDYWNoZU1vZHVsZXNbXCJyZXNwb25zZUNhY2hlXCJdW1wiZGVmYXVsdFwiXT4ge1xuICBjb25zdCBMZWdhY3kgPSBSZXNwb25zZUNhY2hlIGFzIHVua25vd24gYXMgbmV3IChcbiAgICBtaW5pbWFsTW9kZTogYm9vbGVhbixcbiAgKSA9PiBJbnN0YW5jZVR5cGU8dHlwZW9mIFJlc3BvbnNlQ2FjaGU+O1xuICB0cnkge1xuICAgIHJldHVybiBuZXcgTGVnYWN5KGZhbHNlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKCFTdHJpbmcoKGVyciBhcyBFcnJvcik/Lm1lc3NhZ2UpLmluY2x1ZGVzKFwicmVxdWlyZXMgYSBzb3VyY2Ugcm91dGVcIikpIHtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZUNhY2hlKHsgbWluaW1hbE1vZGU6IGZhbHNlLCByb3V0ZTogXCJpbWFnZVwiIH0pO1xuICB9XG59XG5cbi8qKlxuICogYGZvcm1hdER5bmFtaWNJbXBvcnRQYXRoYCBmcm9tIGBuZXh0L2Rpc3QvbGliL2Zvcm1hdC1keW5hbWljLWltcG9ydC1wYXRoLmpzYCxcbiAqIHJlc3RhdGVkOiBgbmV4dCBidWlsZGAgZG9lc24ndCB0cmFjZSB0aGF0IG1vZHVsZSBpbnRvIHRoZSBkZXBsb3ltZW50LCBzb1xuICogbG9hZGluZyBpdCBmYWlsZWQgZXZlcnkgaW1hZ2UgcmVxdWVzdCB3aXRoIHRoZSBjYWNoZSBvbi5cbiAqL1xuZnVuY3Rpb24gY2FjaGVIYW5kbGVyVXJsKGRpc3REaXI6IHN0cmluZywgY2FjaGVIYW5kbGVyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXRoID0gY2FjaGVIYW5kbGVyLnN0YXJ0c1dpdGgoXCJmaWxlOi8vXCIpXG4gICAgPyBmaWxlVVJMVG9QYXRoKGNhY2hlSGFuZGxlcilcbiAgICA6IGNhY2hlSGFuZGxlcjtcbiAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwoXG4gICAgaXNBYnNvbHV0ZVBhdGgocGF0aCkgPyBwYXRoIDogam9pbihkaXN0RGlyLCBwYXRoKSxcbiAgKS50b1N0cmluZygpO1xufVxuXG4vKipcbiAqIGBpbWFnZXNgLCB3aXRoIGl0cyBgc2V0YCBtb3ZlZCBvZmYgdGhlIHJlc3BvbnNlJ3MgY3JpdGljYWwgcGF0aC5cbiAqXG4gKiBgUmVzcG9uc2VDYWNoZWAgYXdhaXRzIHRoZSB3cml0ZSBvZiBhIGZyZXNobHkgb3B0aW1pemVkIGltYWdlIGJlZm9yZSBpdCBoYW5kc1xuICogdGhlIGltYWdlIGJhY2ssIHNvIGV2ZXJ5IG1pc3MgcGFpZCBhbiBTMyBgUHV0T2JqZWN0YCAofjMwIG1zIG1lYXN1cmVkKSBiZWZvcmVcbiAqIGl0cyBmaXJzdCBieXRlLiBUaGUgd3JpdGUgaXMgcmVnaXN0ZXJlZCB3aXRoIGB3YWl0VW50aWxgIGluc3RlYWQsIHdoaWNoIHRoZVxuICogcnVudGltZSBkcmFpbnMgYmVmb3JlIGEgTGFtYmRhIGludm9jYXRpb24gcmV0dXJucyBvciBhIGNvbnRhaW5lciBzaHV0cyBkb3duLFxuICogc28gaXQgc3RpbGwgbGFuZHMuIEEgZmFpbGVkIHdyaXRlIGlzIGxvZ2dlZDsgdGhlIG5leHQgcmVxdWVzdCBvcHRpbWl6ZXMgdGhlXG4gKiBpbWFnZSBhZ2Fpbiwgd2hpY2ggaXMgd2hhdCBpdCB3b3VsZCBoYXZlIGRvbmUgYW55d2F5LlxuICovXG5mdW5jdGlvbiBkZWZlcldyaXRlcyhcbiAgaW1hZ2VzOiBJbWFnZUNhY2hlW1wiaW1hZ2VzXCJdLFxuICB3YWl0VW50aWw6IChwcm9taXNlOiBQcm9taXNlPHVua25vd24+KSA9PiB2b2lkLFxuKTogSW1hZ2VDYWNoZVtcImltYWdlc1wiXSB7XG4gIGNvbnN0IGRlZmVycmVkID0gT2JqZWN0LmNyZWF0ZShpbWFnZXMpIGFzIEltYWdlQ2FjaGVbXCJpbWFnZXNcIl07XG4gIGRlZmVycmVkLnNldCA9ICguLi5hcmdzOiBQYXJhbWV0ZXJzPEltYWdlQ2FjaGVbXCJpbWFnZXNcIl1bXCJzZXRcIl0+KSA9PiB7XG4gICAgd2FpdFVudGlsKFxuICAgICAgaW1hZ2VzLnNldCguLi5hcmdzKS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcihcIkZhaWxlZCB0byBjYWNoZSBhbiBvcHRpbWl6ZWQgaW1hZ2U6XCIsIGVycm9yKTtcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9O1xuICByZXR1cm4gZGVmZXJyZWQ7XG59XG5cbmZ1bmN0aW9uIHNlbmRUZXh0KFxuICByZXM6IFNoaW1TZXJ2ZXJSZXNwb25zZSxcbiAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICBib2R5OiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgcmVzLnN0YXR1c0NvZGUgPSBzdGF0dXNDb2RlO1xuICByZXMuc2V0SGVhZGVyKFwiQ29udGVudC1UeXBlXCIsIFwidGV4dC9wbGFpblwiKTtcbiAgcmVzLmVuZChib2R5KTtcbn1cblxuLyoqXG4gKiBUaGUgaW1hZ2UgY29uZmlnIGNvbWVzIGZyb20gdGhlIGFwcCdzIG93biBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gLCBub3QgdGhlXG4gKiBhZGFwdGVyIG1hbmlmZXN0OiBgaW1hZ2VPcHRpbWl6ZXJgIHJlYWRzIHdob2xlIGBleHBlcmltZW50YWxgIGFuZCBgaW1hZ2VzYFxuICogb2JqZWN0cywgYW5kIG1pcnJvcmluZyB0aG9zZSBpbnRvIHRoZSBtYW5pZmVzdCB3b3VsZCBiZSBhIHNlY29uZCBkZWZpbml0aW9uIG9mXG4gKiB0aGUgc2FtZSB0aGluZyB0aGF0IHNpbGVudGx5IGdvZXMgc3RhbGUgb24gYSBgbmV4dGAgbWlub3IuXG4gKi9cbmZ1bmN0aW9uIGxvYWRJbWFnZVJ1bnRpbWUoeyBkZXBsb3ltZW50Um9vdCwgbWFuaWZlc3QgfTogSW1hZ2VPcHRpbWl6ZXJPcHRpb25zKSB7XG4gIGNvbnN0IG5leHQ6IE5leHRJbWFnZU1vZHVsZXMgPSB7XG4gICAgY29uZmlnU2hhcmVkOiBuZXh0TW9kdWxlKFwibmV4dC9kaXN0L3NlcnZlci9jb25maWctc2hhcmVkLmpzXCIpLFxuICAgIGltYWdlQ29uZmlnOiBuZXh0TW9kdWxlKFwibmV4dC9kaXN0L3NoYXJlZC9saWIvaW1hZ2UtY29uZmlnLmpzXCIpLFxuICAgIG9wdGltaXplcjogbmV4dE1vZHVsZShcIm5leHQvZGlzdC9zZXJ2ZXIvaW1hZ2Utb3B0aW1pemVyLmpzXCIpLFxuICAgIHNlcnZlU3RhdGljOiBuZXh0TW9kdWxlKFwibmV4dC9kaXN0L3NlcnZlci9zZXJ2ZS1zdGF0aWMuanNcIiksXG4gIH07XG4gIGNvbnN0IHBhdGggPSBqb2luKFxuICAgIGRlcGxveW1lbnRSb290LFxuICAgIG1hbmlmZXN0LnJlbGF0aXZlUHJvamVjdERpcixcbiAgICBtYW5pZmVzdC5jb25maWcuZGlzdERpcixcbiAgICBcInJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uXCIsXG4gICk7XG4gIGNvbnN0IHJlcXVpcmVkOiBSZXF1aXJlZFNlcnZlckZpbGVzID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGYtOFwiKSk7XG4gIGNvbnN0IG5leHRDb25maWcgPSBuZXh0LmNvbmZpZ1NoYXJlZC5nZXROZXh0Q29uZmlnUnVudGltZShyZXF1aXJlZC5jb25maWcpO1xuICByZXR1cm4ge1xuICAgIG5leHQsXG4gICAgbmV4dENvbmZpZyxcbiAgICBpbWFnZXNDb25maWc6IHtcbiAgICAgIC4uLm5leHQuaW1hZ2VDb25maWcuaW1hZ2VDb25maWdEZWZhdWx0LFxuICAgICAgLi4ubmV4dENvbmZpZy5pbWFnZXMsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
@@ -137,6 +137,48 @@ async function request(src, init = {}) {
137
137
  await Promise.allSettled(pending);
138
138
  return { head: head, body: Buffer.concat(chunks).toString() };
139
139
  }
140
+ describe("newImageResponseCache", () => {
141
+ /** next < 16.3.8's `ResponseCache`: `(minimal_mode, maxSize, ttl)`. */
142
+ class LegacyResponseCache {
143
+ minimal_mode;
144
+ constructor(minimalMode) {
145
+ this.minimal_mode = minimalMode;
146
+ }
147
+ }
148
+ /**
149
+ * next >= 16.3.8's: `({ minimalMode, route, ... })`, throwing without a route.
150
+ * The field is renamed here to show the choice doesn't depend on it.
151
+ */
152
+ class RouteResponseCache {
153
+ mode;
154
+ constructor({ minimalMode, route, }) {
155
+ if (!route)
156
+ throw new Error("Response cache requires a source route");
157
+ this.mode = minimalMode;
158
+ }
159
+ }
160
+ const construct = (ResponseCache) => (0, image_1.newImageResponseCache)(ResponseCache);
161
+ it("passes { minimalMode, route: 'image' } to a next that takes it", () => {
162
+ const cache = construct(RouteResponseCache);
163
+ expect(cache).toBeInstanceOf(RouteResponseCache);
164
+ expect(cache.mode).toBe(false);
165
+ });
166
+ // By what the constructor accepts, not the version: a canary cut before
167
+ // 16.3.8's change reads as newer than it.
168
+ it("passes minimalMode alone to a next that took the options as minimalMode", () => {
169
+ const cache = construct(LegacyResponseCache);
170
+ expect(cache).toBeInstanceOf(LegacyResponseCache);
171
+ expect(cache.minimal_mode).toBe(false);
172
+ });
173
+ it("rethrows a constructor error that isn't the missing route", () => {
174
+ class BrokenResponseCache {
175
+ constructor() {
176
+ throw new Error("boom");
177
+ }
178
+ }
179
+ expect(() => construct(BrokenResponseCache)).toThrow("boom");
180
+ });
181
+ });
140
182
  describe("RuntimeImageOptimizer.isEnabled", () => {
141
183
  const withImages = (images) => optimizerFor({ images });
142
184
  // Where `next start` answers 404 rather than optimize.
@@ -402,4 +444,4 @@ describe("RuntimeImageOptimizer cache", () => {
402
444
  }
403
445
  });
404
446
  });
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2ltYWdlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hDLGlGQUFpRjtBQUNqRix5RUFBeUU7QUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQztJQUM1RCxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUMxQixDQUFDLENBQUMsQ0FBQztBQUVKLHFDQUFnRTtBQUNoRSx5Q0FBZ0Q7QUFDaEQscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw2Q0FBdUM7QUFFdkMsNEVBQXFFO0FBQ3JFLDBFQUEwRTtBQUMxRSw0Q0FBcUQ7QUFDckQsOENBQW1FO0FBQ25FLHNDQUF5QztBQUN6QyxtQ0FBdUU7QUFFdkUsaURBQTZDO0FBRTdDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUMzQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUM7QUFFdEIsaUZBQWlGO0FBQ2pGLFNBQVMsS0FBSyxDQUFDLGNBQXVDLEVBQUU7SUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBVyxFQUFDLElBQUEsZ0JBQUksRUFBQyxJQUFBLGdCQUFNLEdBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDOUQsSUFBQSxtQkFBUyxFQUFDLElBQUEsZ0JBQUksRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMvQixJQUFBLHVCQUFhLEVBQ1gsSUFBQSxnQkFBSSxFQUFDLElBQUksRUFBRSxrQ0FBa0MsQ0FBQyxFQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFD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R0FBRyxDQUFDO1FBQzFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsR0FBRyxHQUFHLEtBQUssV0FBVyxHQUFHLEVBQUUsS0FBSztZQUN4RCxNQUFNLElBQUksQ0FBQztZQUNYLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQztZQUNILE1BQU0sT0FBTyxHQUE0QixFQUFFLENBQUM7WUFDNUMsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsc0JBQXNCLEVBQUU7Z0JBQ2xELEdBQUcsRUFBRSxZQUFZLEVBQUU7Z0JBQ25CLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7YUFDOUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRTdDLE9BQU8sRUFBRSxDQUFDO1lBQ1YsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzNCLE1BQU0sQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO2dCQUFTLENBQUM7WUFDVCxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcbi8vIFRoZSByZWFsIG1vZHVsZSwgd2l0aCB0aGUgb25lIHN0ZXAgdGhhdCBuZWVkcyBgc2hhcnBgIHN0dWJiZWQgb3V0OiB0aGVzZSB0ZXN0c1xuLy8gYXJlIGFib3V0IHRoZSByZXNwb25zZSBgaGFuZGxlYCB3cml0ZXMsIG5vdCBhYm91dCBvcHRpbWl6aW5nIGFuIGltYWdlLlxuamVzdC5tb2NrKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiwgKCkgPT4gKHtcbiAgLi4uamVzdC5yZXF1aXJlQWN0dWFsKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiksXG4gIGltYWdlT3B0aW1pemVyOiBqZXN0LmZuKCksXG59KSk7XG5cbmltcG9ydCB7IG1rZGlyU3luYywgbWtkdGVtcFN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVIZWFkZXJWYWx1ZSB9IGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHsgaW1hZ2VPcHRpbWl6ZXIgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIjtcbmltcG9ydCB7IGltYWdlQ29uZmlnRGVmYXVsdCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9pbWFnZS1jb25maWcuanNcIjtcbmltcG9ydCB7IFNoaW1JbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwiLi9odHRwL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc3BvbnNlSGVhZCwgU2hpbVNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgcGlwZVRvU2luayB9IGZyb20gXCIuL2h0dHAvc2lua1wiO1xuaW1wb3J0IHsgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zLCBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgfSBmcm9tIFwiLi9pbWFnZVwiO1xuaW1wb3J0IHsgQWRhcHRlck1hbmlmZXN0IH0gZnJvbSBcIi4vbWFuaWZlc3RcIjtcbmltcG9ydCB7IHVzZU5leHRGcm9tIH0gZnJvbSBcIi4vbmV4dC1tb2R1bGVzXCI7XG5cbmNvbnN0IFBORyA9IEJ1ZmZlci5mcm9tKFwib3B0aW1pemVkLWJ5dGVzXCIpO1xuY29uc3QgRVRBRyA9IFwiYWJjMTIzXCI7XG5cbi8qKiBKdXN0IHdoYXQgYGxvYWRJbWFnZVJ1bnRpbWVgIHJlYWRzOiB3aGVyZSBgcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25gIGlzLiAqL1xuZnVuY3Rpb24gc3RhZ2UoZXh0cmFDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30pOiBzdHJpbmcge1xuICBjb25zdCByb290ID0gbWtkdGVtcFN5bmMoam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLWltYWdlLVwiKSk7XG4gIG1rZGlyU3luYyhqb2luKHJvb3QsIFwiLm5leHRcIikpO1xuICB3cml0ZUZpbGVTeW5jKFxuICAgIGpvaW4ocm9vdCwgXCIubmV4dC9yZXF1aXJlZC1zZXJ2ZXItZmlsZXMuanNvblwiKSxcbiAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBjb25maWc6IHtcbiAgICAgICAgYmFzZVBhdGg6IFwiXCIsXG4gICAgICAgIGV4cGVyaW1lbnRhbDoge30sXG4gICAgICAgIGltYWdlczogeyAuLi5pbWFnZUNvbmZpZ0RlZmF1bHQsIGxvY2FsUGF0dGVybnM6IHVuZGVmaW5lZCB9LFxuICAgICAgICAuLi5leHRyYUNvbmZpZyxcbiAgICAgIH0sXG4gICAgfSksXG4gICk7XG4gIHJldHVybiByb290O1xufVxuXG4vKiogVGhlIGFwcCdzIGBjYWNoZUhhbmRsZXJgLCByZWR1Y2VkIHRvIGEgbWFwOiB3aGF0IHRoZSBTMyBoYW5kbGVyIGlzIHRvIGl0LiAqL1xuY2xhc3MgTWFwQ2FjaGVIYW5kbGVyIHtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBlbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd24+KCk7XG4gIHB1YmxpYyBzdGF0aWMgb3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikge1xuICAgIE1hcENhY2hlSGFuZGxlci5vcHRpb25zID0gb3B0aW9ucztcbiAgfVxuICBwdWJsaWMgYXN5bmMgZ2V0KGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIE1hcENhY2hlSGFuZGxlci5lbnRyaWVzLmdldChrZXkpID8/IG51bGw7XG4gIH1cbiAgcHVibGljIGFzeW5jIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5zZXQoa2V5LCB7IHZhbHVlLCBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCkgfSk7XG4gIH1cbn1cblxubGV0IGltcG9ydGVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IHMzSGl0ID0ge1xuICBzZW5kOiBhc3luYyAoKSA9PiAoe1xuICAgIEJvZHk6IFtCdWZmZXIuZnJvbShcInVwc3RyZWFtLWJ5dGVzXCIpXSxcbiAgICBDb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICBFVGFnOiAnXCJ1cHN0cmVhbVwiJyxcbiAgfSksXG59IGFzIHVua25vd24gYXMgUzNDbGllbnQ7XG5cbi8qKiBBbiBvcHRpbWl6ZXIgb3ZlciB7QGxpbmsgTWFwQ2FjaGVIYW5kbGVyfSwgYXMgdGhlIGFkYXB0ZXIgY29uZmlndXJlcyBvbmUuICovXG5mdW5jdGlvbiBvcHRpbWl6ZXJGb3IoXG4gIG9wdGlvbnM6IHtcbiAgICBpbWFnZXM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmZXRjaEludGVybmFsPzogSW1hZ2VPcHRpbWl6ZXJPcHRpb25zW1wiZmV0Y2hJbnRlcm5hbFwiXTtcbiAgICBpbXBvcnRNb2R1bGU/OiBJbWFnZU9wdGltaXplck9wdGlvbnNbXCJpbXBvcnRNb2R1bGVcIl07XG4gICAgczM/OiBTM0NsaWVudDtcbiAgICBidWNrZXQ/OiBzdHJpbmc7XG4gIH0gPSB7fSxcbik6IFJ1bnRpbWVJbWFnZU9wdGltaXplciB7XG4gIGNvbnN0IHZpYSA9IG5ldyBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIoe1xuICAgIGRlcGxveW1lbnRSb290OiBzdGFnZSh7XG4gICAgICBjYWNoZUhhbmRsZXI6IFwiLi4vbm9kZV9tb2R1bGVzL2Nkay1uZXh0anMvbGliL2FkYXB0ZXIvY2FjaGUtaGFuZGxlci5tanNcIixcbiAgICAgIGNhY2hlTWF4TWVtb3J5U2l6ZTogMCxcbiAgICAgIC4uLihvcHRpb25zLmltYWdlc1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIGltYWdlczoge1xuICAgICAgICAgICAgICAuLi5pbWFnZUNvbmZpZ0RlZmF1bHQsXG4gICAgICAgICAgICAgIGxvY2FsUGF0dGVybnM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucy5pbWFnZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSksXG4gICAgbWFuaWZlc3Q6IHtcbiAgICAgIHJlbGF0aXZlUHJvamVjdERpcjogXCJcIixcbiAgICAgIGNvbmZpZzogeyBkaXN0RGlyOiBcIi5uZXh0XCIgfSxcbiAgICB9IGFzIHVua25vd24gYXMgQWRhcHRlck1hbmlmZXN0LFxuICAgIGJ1Y2tldDogb3B0aW9ucy5idWNrZXQgPz8gXCJhc3NldHNcIixcbiAgICBidWNrZXRLZXlQcmVmaXg6IFwiXCIsXG4gICAgZmV0Y2hJbnRlcm5hbDpcbiAgICAgIG9wdGlvbnMuZmV0Y2hJbnRlcm5hbCA/P1xuICAgICAgKGFzeW5jICgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5leHBlY3RlZCBmZXRjaEludGVybmFsXCIpO1xuICAgICAgfSksXG4gICAgaW1wb3J0TW9kdWxlOlxuICAgICAgb3B0aW9ucy5pbXBvcnRNb2R1bGUgPz9cbiAgICAgIChhc3luYyAodXJsKSA9PiB7XG4gICAgICAgIGltcG9ydGVkID0gdXJsO1xuICAgICAgICByZXR1cm4geyBkZWZhdWx0OiBNYXBDYWNoZUhhbmRsZXIgfTtcbiAgICAgIH0pLFxuICB9KTtcbiAgKHZpYSBhcyB1bmtub3duIGFzIHsgczM6IFMzQ2xpZW50IH0pLnMzID0gb3B0aW9ucy5zMyA/PyBzM0hpdDtcbiAgcmV0dXJuIHZpYTtcbn1cblxubGV0IG9wdGltaXplcjogUnVudGltZUltYWdlT3B0aW1pemVyO1xuXG5iZWZvcmVBbGwoKCkgPT4ge1xuICB1c2VOZXh0RnJvbShqb2luKF9fZGlybmFtZSwgXCIuLi8uLlwiKSk7XG4gIG9wdGltaXplciA9IG9wdGltaXplckZvcigpO1xufSk7XG5cbmJlZm9yZUVhY2goKCkgPT4ge1xuICBNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5jbGVhcigpO1xuICBpbXBvcnRlZCA9IHVuZGVmaW5lZDtcbiAgKGltYWdlT3B0aW1pemVyIGFzIGplc3QuTW9jaykubW9ja0NsZWFyKCk7XG4gIChpbWFnZU9wdGltaXplciBhcyBqZXN0Lk1vY2spLm1vY2tSZXNvbHZlZFZhbHVlKHtcbiAgICBidWZmZXI6IFBORyxcbiAgICBjb250ZW50VHlwZTogXCJpbWFnZS93ZWJwXCIsXG4gICAgbWF4QWdlOiA2MCxcbiAgICBldGFnOiBFVEFHLFxuICB9KTtcbn0pO1xuXG5pbnRlcmZhY2UgQW5zd2VyIHtcbiAgcmVhZG9ubHkgaGVhZDogUmVzcG9uc2VIZWFkO1xuICByZWFkb25seSBib2R5OiBzdHJpbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoXG4gIHNyYzogc3RyaW5nLFxuICBpbml0OiB7XG4gICAgbWV0aG9kPzogc3RyaW5nO1xuICAgIGhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAgIHZpYT86IFJ1bnRpbWVJbWFnZU9wdGltaXplcjtcbiAgICB3YWl0VW50aWw/OiAocHJvbWlzZTogUHJvbWlzZTx1bmtub3duPikgPT4gdm9pZDtcbiAgfSA9IHt9LFxuKTogUHJvbWlzZTxBbnN3ZXI+IHtcbiAgY29uc3QgdXJsID0gbmV3IFVSTChcbiAgICBgaHR0cHM6Ly9zaG9wLmV4YW1wbGUudGVzdC9fbmV4dC9pbWFnZT91cmw9JHtlbmNvZGVVUklDb21wb25lbnQoc3JjKX0mdz02NDAmcT03NWAsXG4gICk7XG4gIGNvbnN0IHJlcSA9IG5ldyBTaGltSW5jb21pbmdNZXNzYWdlKHtcbiAgICBtZXRob2Q6IGluaXQubWV0aG9kID8/IFwiR0VUXCIsXG4gICAgdXJsOiBgJHt1cmwucGF0aG5hbWV9JHt1cmwuc2VhcmNofWAsXG4gICAgaGVhZGVyczogeyBhY2NlcHQ6IFwiaW1hZ2Uvd2VicFwiLCAuLi5pbml0LmhlYWRlcnMgfSxcbiAgfSk7XG4gIGNvbnN0IHJlcyA9IG5ldyBTaGltU2VydmVyUmVzcG9uc2UoKTtcbiAgbGV0IGhlYWQ6IFJlc3BvbnNlSGVhZCB8IHVuZGVmaW5lZDtcbiAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICBjb25zdCBkb25lID0gcGlwZVRvU2luayhcbiAgICByZXEsXG4gICAgcmVzLFxuICAgIHtcbiAgICAgIGJlZ2luKHJlc3BvbnNlSGVhZCkge1xuICAgICAgICBoZWFkID0gcmVzcG9uc2VIZWFkO1xuICAgICAgICByZXR1cm4gbmV3IFdyaXRhYmxlKHtcbiAgICAgICAgICB3cml0ZShjaHVuaywgX2VuY29kaW5nLCBjYWxsYmFjaykge1xuICAgICAgICAgICAgY2h1bmtzLnB1c2goQnVmZmVyLmZyb20oY2h1bmspKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgeyBjb21wcmVzczogZmFsc2UgfSxcbiAgKTtcbiAgY29uc3QgcGVuZGluZzogQXJyYXk8UHJvbWlzZTx1bmtub3duPj4gPSBbXTtcbiAgYXdhaXQgKGluaXQudmlhID8/IG9wdGltaXplcikuaGFuZGxlKFxuICAgIHJlcSxcbiAgICByZXMsXG4gICAgdXJsLFxuICAgIGluaXQud2FpdFVudGlsID8/ICgocHJvbWlzZSkgPT4gcGVuZGluZy5wdXNoKHByb21pc2UpKSxcbiAgKTtcbiAgYXdhaXQgZG9uZTtcbiAgLy8gU2V0dGxlZCwgbm90IGF3YWl0ZWQ6IHRoZSBydW50aW1lIGxvZ3MgYSByZWplY3Rpb24gcmF0aGVyIHRoYW4gZmFpbGluZyBvbiBpdC5cbiAgYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHBlbmRpbmcpO1xuICByZXR1cm4geyBoZWFkOiBoZWFkISwgYm9keTogQnVmZmVyLmNvbmNhdChjaHVua3MpLnRvU3RyaW5nKCkgfTtcbn1cblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIuaXNFbmFibGVkXCIsICgpID0+IHtcbiAgY29uc3Qgd2l0aEltYWdlcyA9IChpbWFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PlxuICAgIG9wdGltaXplckZvcih7IGltYWdlcyB9KTtcblxuICAvLyBXaGVyZSBgbmV4dCBzdGFydGAgYW5zd2VycyA0MDQgcmF0aGVyIHRoYW4gb3B0aW1pemUuXG4gIGl0KFwiaXMgb2ZmIGZvciBpbWFnZXMudW5vcHRpbWl6ZWQgYW5kIGZvciBhIG5vbi1kZWZhdWx0IGxvYWRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHdpdGhJbWFnZXMoe30pLmlzRW5hYmxlZCgpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdCh3aXRoSW1hZ2VzKHsgdW5vcHRpbWl6ZWQ6IHRydWUgfSkuaXNFbmFibGVkKCkpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChcbiAgICAgIHdpdGhJbWFnZXMoeyBsb2FkZXI6IFwiY3VzdG9tXCIsIGxvYWRlckZpbGU6IFwiLi9sb2FkZXIuanNcIiB9KS5pc0VuYWJsZWQoKSxcbiAgICApLnRvQmUoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlJ1bnRpbWVJbWFnZU9wdGltaXplciByZXNwb25zZVwiLCAoKSA9PiB7XG4gIGl0KFwiYW5zd2VycyB3aXRoIHRoZSBoZWFkZXJzIG5leHQgc3RhcnQgc2VuZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSB9ID0gYXdhaXQgcmVxdWVzdChcIi9waG90b3MvbG9nby5wbmdcIik7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChoZWFkLmhlYWRlcnMpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTYwLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgIFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2Uvd2VicFwiLFxuICAgICAgXCJjb250ZW50LWxlbmd0aFwiOiBTdHJpbmcoUE5HLmxlbmd0aCksXG4gICAgICBcImNvbnRlbnQtZGlzcG9zaXRpb25cIjogJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPVwibG9nby53ZWJwXCInLFxuICAgICAgXCJjb250ZW50LXNlY3VyaXR5LXBvbGljeVwiOiBpbWFnZUNvbmZpZ0RlZmF1bHQuY29udGVudFNlY3VyaXR5UG9saWN5LFxuICAgICAgZXRhZzogRVRBRyxcbiAgICAgIHZhcnk6IFwiQWNjZXB0XCIsXG4gICAgICBcIngtbmV4dGpzLWNhY2hlXCI6IFwiTUlTU1wiLFxuICAgIH0pO1xuICAgIGV4cGVjdChib2R5KS50b0JlKFBORy50b1N0cmluZygpKTtcbiAgfSk7XG5cbiAgLy8gQ29udGVudC1oYXNoZWQsIHNvIHRoZSBuYW1lIGNoYW5nZXMgd2hlbmV2ZXIgdGhlIGJ5dGVzIGRvLlxuICBpdChcImNhY2hlcyBhIHN0YXRpY2FsbHkgaW1wb3J0ZWQgaW1hZ2UgZm9yIGEgeWVhciwgaW1tdXRhYmxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvX25leHQvc3RhdGljL21lZGlhL2xvZ28uM2YyYTFjLnBuZ1wiKTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzW1wiY2FjaGUtY29udHJvbFwiXSkudG9CZShcbiAgICAgIFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwMCwgaW1tdXRhYmxlXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gYHdyaXRlSGVhZGAgcmVqZWN0cyBhIGhlYWRlciB2YWx1ZSBvdXRzaWRlIGxhdGluMSB3aXRoIEVSUl9JTlZBTElEX0NIQVIsXG4gIC8vIGFuZCB0aGUgTGFtYmRhIHNpbmsgd3JpdGVzIHRoZSBoZWFkIHRocm91Z2ggaXQuXG4gIGl0KFwiZW5jb2RlcyBhIG5vbi1sYXRpbjEgZmlsZW5hbWUgcmF0aGVyIHRoYW4gc2VuZGluZyBpdCByYXdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi/DvG1sYXV0LeWGmeecny5wbmdcIik7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkLmhlYWRlcnNbXCJjb250ZW50LWRpc3Bvc2l0aW9uXCJdO1xuICAgIGV4cGVjdChkaXNwb3NpdGlvbikudG9NYXRjaCgvXmF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiW15cIl0qXCI7IGZpbGVuYW1lXFwqPS8pO1xuICAgIGV4cGVjdChkaXNwb3NpdGlvbikudG9Db250YWluKFxuICAgICAgYGZpbGVuYW1lKj1VVEYtOCcnJHtlbmNvZGVVUklDb21wb25lbnQoXCLDvG1sYXV0LeWGmeecny53ZWJwXCIpfWAsXG4gICAgKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHZhbGlkYXRlSGVhZGVyVmFsdWUoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsIGRpc3Bvc2l0aW9uKSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0LmVhY2goW1xuICAgIFtcInRoZSBleGFjdCB0YWdcIiwgRVRBR10sXG4gICAgW1wiYSB3ZWFrIGZvcm0gb2YgaXRcIiwgYFcvJHtFVEFHfWBdLFxuICAgIFtcImEgbGlzdCBjb250YWluaW5nIGl0XCIsIGBcIm90aGVyXCIsICR7RVRBR31gXSxcbiAgICBbXCJhIHdpbGRjYXJkXCIsIFwiKlwiXSxcbiAgXSkoXCJhbnN3ZXJzIDMwNCB0byBJZi1Ob25lLU1hdGNoIHdpdGggJXNcIiwgYXN5bmMgKF9uYW1lLCBpZk5vbmVNYXRjaCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSB9ID0gYXdhaXQgcmVxdWVzdChcIi9sb2dvLnBuZ1wiLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiaWYtbm9uZS1tYXRjaFwiOiBpZk5vbmVNYXRjaCB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMzA0KTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzLmV0YWcpLnRvQmUoRVRBRyk7XG4gICAgZXhwZWN0KGhlYWQuaGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0pLnRvQmUoXG4gICAgICBcInB1YmxpYywgbWF4LWFnZT02MCwgbXVzdC1yZXZhbGlkYXRlXCIsXG4gICAgKTtcbiAgICBleHBlY3QoYm9keSkudG9CZShcIlwiKTtcbiAgfSk7XG5cbiAgaXQoXCJhbnN3ZXJzIDIwMCB0byBhbiBJZi1Ob25lLU1hdGNoIHRoYXQgZG9lcyBub3QgbWF0Y2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi9sb2dvLnBuZ1wiLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiaWYtbm9uZS1tYXRjaFwiOiAnXCJvdGhlclwiJyB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgaGVhZGVycyBidXQgbm8gYm9keSB0byBIRUFEXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3QoXCIvbG9nby5wbmdcIiwgeyBtZXRob2Q6IFwiSEVBRFwiIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0pLnRvQmUoU3RyaW5nKFBORy5sZW5ndGgpKTtcbiAgICBleHBlY3QoYm9keSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgc291cmNlc1wiLCAoKSA9PiB7XG4gIC8vIGBuZXh0IHN0YXJ0YCBmZXRjaGVzIGEgcmVtb3RlIHNvdXJjZSBvbmx5IHdoZW4gYHJlbW90ZVBhdHRlcm5zYCBvciBgZG9tYWluc2BcbiAgLy8gYWxsb3cgaXQ7IHRoZSBzdGFnZSdzIGNvbmZpZyBhbGxvd3Mgbm9uZS4gQW55dGhpbmcgZWxzZSB3b3VsZCBtYWtlIHRoZVxuICAvLyBvcHRpbWl6ZXIgYW4gb3BlbiBwcm94eSBpbnRvIHdoYXRldmVyIGl0IGNhbiByZWFjaC5cbiAgaXQuZWFjaChbXG4gICAgW1wiYW5vdGhlciBvcmlnaW5cIiwgXCJodHRwczovL2V2aWwuZXhhbXBsZS50ZXN0L3gucG5nXCJdLFxuICAgIFtcImluc3RhbmNlIG1ldGFkYXRhXCIsIFwiaHR0cDovLzE2OS4yNTQuMTY5LjI1NC9sYXRlc3QvbWV0YS1kYXRhL1wiXSxcbiAgICBbXCJhIHByb3RvY29sLXJlbGF0aXZlIHVybFwiLCBcIi8vZXZpbC5leGFtcGxlLnRlc3QveC5wbmdcIl0sXG4gIF0pKFwicmVqZWN0cyBhIHJlbW90ZSBzb3VyY2UgdGhhdCBpcyBub3QgYWxsb3dlZDogJXNcIiwgYXN5bmMgKF9uYW1lLCBzcmMpID0+IHtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3Qoc3JjKTtcbiAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDQwMCk7XG4gICAgZXhwZWN0KGJvZHkpLnRvTWF0Y2goL1widXJsXCIgcGFyYW1ldGVyLyk7XG4gICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3aXRoUzNNaXNzKFxuICAgIGZldGNoSW50ZXJuYWw/OiBJbWFnZU9wdGltaXplck9wdGlvbnNbXCJmZXRjaEludGVybmFsXCJdLFxuICApOiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICAgIHJldHVybiBvcHRpbWl6ZXJGb3Ioe1xuICAgICAgZmV0Y2hJbnRlcm5hbCxcbiAgICAgIHMzOiB7XG4gICAgICAgIHNlbmQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIm1pc3NpbmdcIiksIHsgbmFtZTogXCJOb1N1Y2hLZXlcIiB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBTM0NsaWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIGl0KFwiZmFsbHMgYmFjayB0byB0aGUgYXBwJ3Mgcm91dGVzIGZvciBhIHNvdXJjZSBTMyBoYXMgbm8gZmlsZSBmb3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZldGNoSW50ZXJuYWwgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBcInB1YmxpYywgbWF4LWFnZT0xMjBcIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBCdWZmZXIuZnJvbShcInJvdXRlLWJ5dGVzXCIpLFxuICAgIH0pKTtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvYXBpL2F2YXRhcj9pZD00MlwiLCB7XG4gICAgICB2aWE6IHdpdGhTM01pc3MoZmV0Y2hJbnRlcm5hbCksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChmZXRjaEludGVybmFsKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFwiL2FwaS9hdmF0YXI/aWQ9NDJcIixcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgaW1hZ2VDb25maWdEZWZhdWx0Lm1heGltdW1SZXNwb25zZUJvZHksXG4gICAgKTtcbiAgICBleHBlY3QoKGltYWdlT3B0aW1pemVyIGFzIGplc3QuTW9jaykubW9jay5sYXN0Q2FsbFswXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBidWZmZXI6IEJ1ZmZlci5mcm9tKFwicm91dGUtYnl0ZXNcIiksXG4gICAgICBjb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIGNhY2hlQ29udHJvbDogXCJwdWJsaWMsIG1heC1hZ2U9MTIwXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgOiB0aGUgZmlsZSBpcyBvbiBkaXNrLCBhbmQgYSBHZXRPYmplY3QgZm9yIGl0IGlzXG4gIC8vIGEgd2FzdGVkIHJvdW5kIHRyaXAuXG4gIGl0KFwiZ29lcyBzdHJhaWdodCB0byB0aGUgYXBwJ3Mgcm91dGVzIHdoZW4gdGhlcmUgaXMgbm8gYnVja2V0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZW5kID0gamVzdC5mbigpO1xuICAgIGNvbnN0IGZldGNoSW50ZXJuYWwgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2UvcG5nXCIgfSxcbiAgICAgIGJvZHk6IEJ1ZmZlci5mcm9tKFwiZGlzay1ieXRlc1wiKSxcbiAgICB9KSk7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL2xvZ28ucG5nXCIsIHtcbiAgICAgIHZpYTogb3B0aW1pemVyRm9yKHtcbiAgICAgICAgYnVja2V0OiBcIlwiLFxuICAgICAgICBmZXRjaEludGVybmFsLFxuICAgICAgICBzMzogeyBzZW5kIH0gYXMgdW5rbm93biBhcyBTM0NsaWVudCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICBleHBlY3Qoc2VuZCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3QoZmV0Y2hJbnRlcm5hbCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBcIi9sb2dvLnBuZ1wiLFxuICAgICAgZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICBpbWFnZUNvbmZpZ0RlZmF1bHQubWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImFuc3dlcnMgNDAwIHdoZW4gdGhlIHJvdXRlIHNlbmRzIG5vIGJvZHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi9hcGkvYXZhdGFyP2lkPTQyXCIsIHtcbiAgICAgIHZpYTogd2l0aFMzTWlzcyhhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICB9KSksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSg0MDApO1xuICB9KTtcblxuICBpdChcImFuc3dlcnMgYW4gZXhwbGljaXQgNTAyIGZvciBhIHNvdXJjZSBzZXJ2ZWQgYnkgYW5vdGhlciBmdW5jdGlvbkdyb3VwcyBncm91cFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwiZXJyb3JcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBoZWFkLCBib2R5IH0gPSBhd2FpdCByZXF1ZXN0KFwiL2FwaS9hdmF0YXI/aWQ9NDJcIiwge1xuICAgICAgICB2aWE6IHdpdGhTM01pc3MoYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgICAgICBvdGhlckdyb3VwOiBcImF2YXRhcnNcIixcbiAgICAgICAgfSkpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDUwMik7XG4gICAgICBleHBlY3QoYm9keSkudG9NYXRjaCgvYW5vdGhlciBmdW5jdGlvbkdyb3VwcyBncm91cC8pO1xuICAgICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlcnJvci5tb2NrUmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgd2hpY2ggYG5leHQgc3RhcnRgIGVuZm9yY2VzIG9uIGxvY2FsXG4gIC8vIHNvdXJjZXMgdG9vOiBwYXN0IGl0LCB0aGUgc291cmNlIGlzIG5vdCByZWFkIGludG8gbWVtb3J5LlxuICBpdChcImFuc3dlcnMgNDEzIGZvciBhIHJvdXRlIHJlc3BvbnNlIG92ZXIgbWF4aW11bVJlc3BvbnNlQm9keVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL2FwaS9leHBvcnRcIiwge1xuICAgICAgdmlhOiB3aXRoUzNNaXNzKGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIHRvb0xhcmdlOiB0cnVlLFxuICAgICAgfSkpLFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoNDEzKTtcbiAgICBleHBlY3QoaW1hZ2VPcHRpbWl6ZXIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyA0MTMgZm9yIGFuIFMzIG9iamVjdCBvdmVyIG1heGltdW1SZXNwb25zZUJvZHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi92aWRlby5tcDRcIiwge1xuICAgICAgdmlhOiBvcHRpbWl6ZXJGb3Ioe1xuICAgICAgICBpbWFnZXM6IHsgbWF4aW11bVJlc3BvbnNlQm9keTogMTAgfSxcbiAgICAgICAgczM6IHtcbiAgICAgICAgICBzZW5kOiBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgQm9keTogW0J1ZmZlci5mcm9tKFwibmV2ZXIgcmVhZFwiKV0sXG4gICAgICAgICAgICBDb250ZW50TGVuZ3RoOiAxMSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIFMzQ2xpZW50LFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSg0MTMpO1xuICAgIGV4cGVjdChpbWFnZU9wdGltaXplcikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgY2FjaGVcIiwgKCkgPT4ge1xuICBpdChcIm9wdGltaXplcyBvbmNlLCB0aGVuIGFuc3dlcnMgZnJvbSB0aGUgY2FjaGUgaGFuZGxlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmlhID0gb3B0aW1pemVyRm9yKCk7XG4gICAgY29uc3QgZmlyc3QgPSBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9jYWNoZWQucG5nXCIsIHsgdmlhIH0pO1xuICAgIGV4cGVjdChmaXJzdC5oZWFkLmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSkudG9CZShcIk1JU1NcIik7XG4gICAgZXhwZWN0KGZpcnN0LmJvZHkpLnRvQmUoUE5HLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3Qgc2Vjb25kID0gYXdhaXQgcmVxdWVzdChcIi9waG90b3MvY2FjaGVkLnBuZ1wiLCB7IHZpYSB9KTtcbiAgICBleHBlY3Qoc2Vjb25kLmhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChzZWNvbmQuaGVhZC5oZWFkZXJzW1wieC1uZXh0anMtY2FjaGVcIl0pLnRvQmUoXCJISVRcIik7XG4gICAgZXhwZWN0KHNlY29uZC5ib2R5KS50b0JlKFBORy50b1N0cmluZygpKTtcbiAgICBleHBlY3Qoc2Vjb25kLmhlYWQuaGVhZGVycy5ldGFnKS50b0JlKEVUQUcpO1xuICAgIGV4cGVjdChpbWFnZU9wdGltaXplcikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuXG4gICAgLy8gVGhlIGVudHJ5IGBuZXh0IHN0YXJ0YCB3b3VsZCBoYXZlIHdyaXR0ZW4uXG4gICAgY29uc3QgW2VudHJ5XSA9IFsuLi5NYXBDYWNoZUhhbmRsZXIuZW50cmllcy52YWx1ZXMoKV0gYXMgQXJyYXk8e1xuICAgICAgdmFsdWU6IHsga2luZDogc3RyaW5nOyBleHRlbnNpb246IHN0cmluZyB9O1xuICAgIH0+O1xuICAgIGV4cGVjdChlbnRyeS52YWx1ZSkudG9NYXRjaE9iamVjdCh7IGtpbmQ6IFwiSU1BR0VcIiwgZXh0ZW5zaW9uOiBcIndlYnBcIiB9KTtcbiAgfSk7XG5cbiAgLy8gQW5vdGhlciBpbnN0YW5jZTogbm90aGluZyBpbiBtZW1vcnksIHNvIHRoZSBoaXQgaXMgdGhlIGNhY2hlIGhhbmRsZXIncy5cbiAgaXQoXCJzaGFyZXMgdGhlIG9wdGltaXplZCBpbWFnZSBhY3Jvc3MgaW5zdGFuY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9zaGFyZWQucG5nXCIsIHsgdmlhOiBvcHRpbWl6ZXJGb3IoKSB9KTtcbiAgICBjb25zdCBvdGhlciA9IGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL3NoYXJlZC5wbmdcIiwgeyB2aWE6IG9wdGltaXplckZvcigpIH0pO1xuICAgIGV4cGVjdChvdGhlci5oZWFkLmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSkudG9CZShcIkhJVFwiKTtcbiAgICBleHBlY3QoaW1hZ2VPcHRpbWl6ZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBuYW1lcyBpdCByZWxhdGl2ZSB0byB0aGUgZGlzdCBkaXIuXG4gIGl0KFwibG9hZHMgdGhlIGFwcCdzIGNhY2hlSGFuZGxlciBmcm9tIHdoZXJlIG5leHQgc3RhcnQgd291bGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL2NhY2hlZC5wbmdcIiwgeyB2aWE6IG9wdGltaXplckZvcigpIH0pO1xuICAgIGV4cGVjdChpbXBvcnRlZCkudG9NYXRjaChcbiAgICAgIC9eZmlsZTpcXC9cXC8uKlxcL25vZGVfbW9kdWxlc1xcL2Nkay1uZXh0anNcXC9saWJcXC9hZGFwdGVyXFwvY2FjaGUtaGFuZGxlclxcLm1qcyQvLFxuICAgICk7XG4gICAgZXhwZWN0KE1hcENhY2hlSGFuZGxlci5vcHRpb25zKS50b01hdGNoT2JqZWN0KHsgZGV2OiBmYWxzZSB9KTtcbiAgfSk7XG5cbiAgLy8gQSB0cmFuc2llbnQgZmFpbHVyZSBsb2FkaW5nIHRoZSBjYWNoZUhhbmRsZXIgKEVNRklMRSBpbiBhIGNvbGQtc3RhcnRcbiAgLy8gYnVyc3QpIG11c3Qgbm90IGZhaWwgZXZlcnkgbGF0ZXIgaW1hZ2UgcmVxdWVzdCBvbiB0aGUgaW5zdGFuY2UuXG4gIGl0KFwicmV0cmllcyBsb2FkaW5nIHRoZSBjYWNoZUhhbmRsZXIgYWZ0ZXIgYSBmYWlsZWQgbG9hZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwiZXJyb3JcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1wb3J0TW9kdWxlID0gamVzdFxuICAgICAgICAuZm4oKVxuICAgICAgICAubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkVNRklMRVwiKSlcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKHsgZGVmYXVsdDogTWFwQ2FjaGVIYW5kbGVyIH0pO1xuICAgICAgY29uc3QgdmlhID0gb3B0aW1pemVyRm9yKHsgaW1wb3J0TW9kdWxlIH0pO1xuICAgICAgZXhwZWN0KFxuICAgICAgICAoYXdhaXQgcmVxdWVzdChcIi9waG90b3MvcmV0cnkucG5nXCIsIHsgdmlhIH0pKS5oZWFkLnN0YXR1c0NvZGUsXG4gICAgICApLnRvQmUoNTAwKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgKGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL3JldHJ5LnBuZ1wiLCB7IHZpYSB9KSkuaGVhZC5zdGF0dXNDb2RlLFxuICAgICAgKS50b0JlKDIwMCk7XG4gICAgICBleHBlY3QoaW1wb3J0TW9kdWxlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVycm9yLm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBUaGUgd3JpdGUgb2YgYSBmcmVzaCBpbWFnZSBnb2VzIHRvIGB3YWl0VW50aWxgLCBub3QgaW4gZnJvbnQgb2YgdGhlXG4gIC8vIHJlc3BvbnNlOiB0aGUgaW1hZ2UgaXMgc2VudCBiZWZvcmUgdGhlIGNhY2hlIGhhbmRsZXIgaGFzIGl0LlxuICBpdChcIndyaXRlcyBhIG1pc3MgdG8gdGhlIGNhY2hlIGFmdGVyIGFuc3dlcmluZywgdGhyb3VnaCB3YWl0VW50aWxcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEEgd3JpdGUgdGhhdCBjYW4ndCBmaW5pc2ggdW50aWwgcmVsZWFzZWQ6IGlmIHRoZSByZXNwb25zZSB3YWl0ZWQgb24gaXQsXG4gICAgLy8gYHJlcXVlc3RgIHdvdWxkIG5ldmVyIHJldHVybi5cbiAgICBsZXQgcmVsZWFzZSE6ICgpID0+IHZvaWQ7XG4gICAgY29uc3QgZ2F0ZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVsZWFzZSA9IHJlc29sdmUpKTtcbiAgICBjb25zdCBzZXQgPSBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldDtcbiAgICBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldCA9IGFzeW5jIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBhd2FpdCBnYXRlO1xuICAgICAgcmV0dXJuIHNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gICAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL2RlZmVycmVkLnBuZ1wiLCB7XG4gICAgICAgIHZpYTogb3B0aW1pemVyRm9yKCksXG4gICAgICAgIHdhaXRVbnRpbDogKHByb21pc2UpID0+IHBlbmRpbmcucHVzaChwcm9taXNlKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGZpcnN0LmhlYWQuaGVhZGVyc1tcIngtbmV4dGpzLWNhY2hlXCJdKS50b0JlKFwiTUlTU1wiKTtcbiAgICAgIGV4cGVjdChNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5zaXplKS50b0JlKDApO1xuXG4gICAgICByZWxlYXNlKCk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nKTtcbiAgICAgIGV4cGVjdChNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5zaXplKS50b0JlKDEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldCA9IHNldDtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0=
447
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lL2ltYWdlLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0FBQ2hDLGlGQUFpRjtBQUNqRix5RUFBeUU7QUFDekUsSUFBSSxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQztJQUM1RCxjQUFjLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtDQUMxQixDQUFDLENBQUMsQ0FBQztBQUVKLHFDQUFnRTtBQUNoRSx5Q0FBZ0Q7QUFDaEQscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQyw2Q0FBdUM7QUFFdkMsNEVBQXFFO0FBQ3JFLDBFQUEwRTtBQUMxRSw0Q0FBcUQ7QUFDckQsOENBQW1FO0FBQ25FLHNDQUF5QztBQUN6QyxtQ0FJaUI7QUFFakIsaURBQTZDO0FBRTdDLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUMzQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUM7QUFFdEIsaUZBQWlGO0FBQ2pGLFNBQVMsS0FBSyxDQUFDLGNBQXVDLEVBQUU7SUFDdEQsTUFBTSxJQUFJLEdBQUcsSUFBQSxxQkFBVyxFQUFDLElBQUEsZ0JBQUksRUFBQyxJQUFBLGdCQUFNLEdBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDOUQsSUFBQSxtQkFBUyxFQUFDLElBQUEsZ0JBQUksRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMvQixJQUFBLHVCQUFhLEVBQ1gsSUFBQSxnQkFBSSxFQUFDLElBQUksRUFBRSxrQ0FBa0MsQ0FBQyxFQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFD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QUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQyxDQUFDO2dCQUFTLENBQUM7WUFDVCxlQUFlLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmplc3QubW9jayhcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKTtcbi8vIFRoZSByZWFsIG1vZHVsZSwgd2l0aCB0aGUgb25lIHN0ZXAgdGhhdCBuZWVkcyBgc2hhcnBgIHN0dWJiZWQgb3V0OiB0aGVzZSB0ZXN0c1xuLy8gYXJlIGFib3V0IHRoZSByZXNwb25zZSBgaGFuZGxlYCB3cml0ZXMsIG5vdCBhYm91dCBvcHRpbWl6aW5nIGFuIGltYWdlLlxuamVzdC5tb2NrKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiwgKCkgPT4gKHtcbiAgLi4uamVzdC5yZXF1aXJlQWN0dWFsKFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIiksXG4gIGltYWdlT3B0aW1pemVyOiBqZXN0LmZuKCksXG59KSk7XG5cbmltcG9ydCB7IG1rZGlyU3luYywgbWtkdGVtcFN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgdmFsaWRhdGVIZWFkZXJWYWx1ZSB9IGZyb20gXCJub2RlOmh0dHBcIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgV3JpdGFibGUgfSBmcm9tIFwibm9kZTpzdHJlYW1cIjtcbmltcG9ydCB7IFMzQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zM1wiO1xuaW1wb3J0IHsgaW1hZ2VPcHRpbWl6ZXIgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9pbWFnZS1vcHRpbWl6ZXIuanNcIjtcbmltcG9ydCB7IGltYWdlQ29uZmlnRGVmYXVsdCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2hhcmVkL2xpYi9pbWFnZS1jb25maWcuanNcIjtcbmltcG9ydCB7IFNoaW1JbmNvbWluZ01lc3NhZ2UgfSBmcm9tIFwiLi9odHRwL3JlcXVlc3RcIjtcbmltcG9ydCB7IFJlc3BvbnNlSGVhZCwgU2hpbVNlcnZlclJlc3BvbnNlIH0gZnJvbSBcIi4vaHR0cC9yZXNwb25zZVwiO1xuaW1wb3J0IHsgcGlwZVRvU2luayB9IGZyb20gXCIuL2h0dHAvc2lua1wiO1xuaW1wb3J0IHtcbiAgSW1hZ2VPcHRpbWl6ZXJPcHRpb25zLFxuICBuZXdJbWFnZVJlc3BvbnNlQ2FjaGUsXG4gIFJ1bnRpbWVJbWFnZU9wdGltaXplcixcbn0gZnJvbSBcIi4vaW1hZ2VcIjtcbmltcG9ydCB7IEFkYXB0ZXJNYW5pZmVzdCB9IGZyb20gXCIuL21hbmlmZXN0XCI7XG5pbXBvcnQgeyB1c2VOZXh0RnJvbSB9IGZyb20gXCIuL25leHQtbW9kdWxlc1wiO1xuXG5jb25zdCBQTkcgPSBCdWZmZXIuZnJvbShcIm9wdGltaXplZC1ieXRlc1wiKTtcbmNvbnN0IEVUQUcgPSBcImFiYzEyM1wiO1xuXG4vKiogSnVzdCB3aGF0IGBsb2FkSW1hZ2VSdW50aW1lYCByZWFkczogd2hlcmUgYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBpcy4gKi9cbmZ1bmN0aW9uIHN0YWdlKGV4dHJhQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9KTogc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IG1rZHRlbXBTeW5jKGpvaW4odG1wZGlyKCksIFwiY2RrLW5leHRqcy1pbWFnZS1cIikpO1xuICBta2RpclN5bmMoam9pbihyb290LCBcIi5uZXh0XCIpKTtcbiAgd3JpdGVGaWxlU3luYyhcbiAgICBqb2luKHJvb3QsIFwiLm5leHQvcmVxdWlyZWQtc2VydmVyLWZpbGVzLmpzb25cIiksXG4gICAgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgY29uZmlnOiB7XG4gICAgICAgIGJhc2VQYXRoOiBcIlwiLFxuICAgICAgICBleHBlcmltZW50YWw6IHt9LFxuICAgICAgICBpbWFnZXM6IHsgLi4uaW1hZ2VDb25maWdEZWZhdWx0LCBsb2NhbFBhdHRlcm5zOiB1bmRlZmluZWQgfSxcbiAgICAgICAgLi4uZXh0cmFDb25maWcsXG4gICAgICB9LFxuICAgIH0pLFxuICApO1xuICByZXR1cm4gcm9vdDtcbn1cblxuLyoqIFRoZSBhcHAncyBgY2FjaGVIYW5kbGVyYCwgcmVkdWNlZCB0byBhIG1hcDogd2hhdCB0aGUgUzMgaGFuZGxlciBpcyB0byBpdC4gKi9cbmNsYXNzIE1hcENhY2hlSGFuZGxlciB7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCB1bmtub3duPigpO1xuICBwdWJsaWMgc3RhdGljIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBwdWJsaWMgY29uc3RydWN0b3Iob3B0aW9uczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHtcbiAgICBNYXBDYWNoZUhhbmRsZXIub3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cbiAgcHVibGljIGFzeW5jIGdldChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiBNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5nZXQoa2V5KSA/PyBudWxsO1xuICB9XG4gIHB1YmxpYyBhc3luYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgTWFwQ2FjaGVIYW5kbGVyLmVudHJpZXMuc2V0KGtleSwgeyB2YWx1ZSwgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpIH0pO1xuICB9XG59XG5cbmxldCBpbXBvcnRlZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG5jb25zdCBzM0hpdCA9IHtcbiAgc2VuZDogYXN5bmMgKCkgPT4gKHtcbiAgICBCb2R5OiBbQnVmZmVyLmZyb20oXCJ1cHN0cmVhbS1ieXRlc1wiKV0sXG4gICAgQ29udGVudFR5cGU6IFwiaW1hZ2UvcG5nXCIsXG4gICAgRVRhZzogJ1widXBzdHJlYW1cIicsXG4gIH0pLFxufSBhcyB1bmtub3duIGFzIFMzQ2xpZW50O1xuXG4vKiogQW4gb3B0aW1pemVyIG92ZXIge0BsaW5rIE1hcENhY2hlSGFuZGxlcn0sIGFzIHRoZSBhZGFwdGVyIGNvbmZpZ3VyZXMgb25lLiAqL1xuZnVuY3Rpb24gb3B0aW1pemVyRm9yKFxuICBvcHRpb25zOiB7XG4gICAgaW1hZ2VzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgZmV0Y2hJbnRlcm5hbD86IEltYWdlT3B0aW1pemVyT3B0aW9uc1tcImZldGNoSW50ZXJuYWxcIl07XG4gICAgaW1wb3J0TW9kdWxlPzogSW1hZ2VPcHRpbWl6ZXJPcHRpb25zW1wiaW1wb3J0TW9kdWxlXCJdO1xuICAgIHMzPzogUzNDbGllbnQ7XG4gICAgYnVja2V0Pzogc3RyaW5nO1xuICB9ID0ge30sXG4pOiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICBjb25zdCB2aWEgPSBuZXcgUnVudGltZUltYWdlT3B0aW1pemVyKHtcbiAgICBkZXBsb3ltZW50Um9vdDogc3RhZ2Uoe1xuICAgICAgY2FjaGVIYW5kbGVyOiBcIi4uL25vZGVfbW9kdWxlcy9jZGstbmV4dGpzL2xpYi9hZGFwdGVyL2NhY2hlLWhhbmRsZXIubWpzXCIsXG4gICAgICBjYWNoZU1heE1lbW9yeVNpemU6IDAsXG4gICAgICAuLi4ob3B0aW9ucy5pbWFnZXNcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpbWFnZXM6IHtcbiAgICAgICAgICAgICAgLi4uaW1hZ2VDb25maWdEZWZhdWx0LFxuICAgICAgICAgICAgICBsb2NhbFBhdHRlcm5zOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIC4uLm9wdGlvbnMuaW1hZ2VzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0pLFxuICAgIG1hbmlmZXN0OiB7XG4gICAgICByZWxhdGl2ZVByb2plY3REaXI6IFwiXCIsXG4gICAgICBjb25maWc6IHsgZGlzdERpcjogXCIubmV4dFwiIH0sXG4gICAgfSBhcyB1bmtub3duIGFzIEFkYXB0ZXJNYW5pZmVzdCxcbiAgICBidWNrZXQ6IG9wdGlvbnMuYnVja2V0ID8/IFwiYXNzZXRzXCIsXG4gICAgYnVja2V0S2V5UHJlZml4OiBcIlwiLFxuICAgIGZldGNoSW50ZXJuYWw6XG4gICAgICBvcHRpb25zLmZldGNoSW50ZXJuYWwgPz9cbiAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlVuZXhwZWN0ZWQgZmV0Y2hJbnRlcm5hbFwiKTtcbiAgICAgIH0pLFxuICAgIGltcG9ydE1vZHVsZTpcbiAgICAgIG9wdGlvbnMuaW1wb3J0TW9kdWxlID8/XG4gICAgICAoYXN5bmMgKHVybCkgPT4ge1xuICAgICAgICBpbXBvcnRlZCA9IHVybDtcbiAgICAgICAgcmV0dXJuIHsgZGVmYXVsdDogTWFwQ2FjaGVIYW5kbGVyIH07XG4gICAgICB9KSxcbiAgfSk7XG4gICh2aWEgYXMgdW5rbm93biBhcyB7IHMzOiBTM0NsaWVudCB9KS5zMyA9IG9wdGlvbnMuczMgPz8gczNIaXQ7XG4gIHJldHVybiB2aWE7XG59XG5cbmxldCBvcHRpbWl6ZXI6IFJ1bnRpbWVJbWFnZU9wdGltaXplcjtcblxuYmVmb3JlQWxsKCgpID0+IHtcbiAgdXNlTmV4dEZyb20oam9pbihfX2Rpcm5hbWUsIFwiLi4vLi5cIikpO1xuICBvcHRpbWl6ZXIgPSBvcHRpbWl6ZXJGb3IoKTtcbn0pO1xuXG5iZWZvcmVFYWNoKCgpID0+IHtcbiAgTWFwQ2FjaGVIYW5kbGVyLmVudHJpZXMuY2xlYXIoKTtcbiAgaW1wb3J0ZWQgPSB1bmRlZmluZWQ7XG4gIChpbWFnZU9wdGltaXplciBhcyBqZXN0Lk1vY2spLm1vY2tDbGVhcigpO1xuICAoaW1hZ2VPcHRpbWl6ZXIgYXMgamVzdC5Nb2NrKS5tb2NrUmVzb2x2ZWRWYWx1ZSh7XG4gICAgYnVmZmVyOiBQTkcsXG4gICAgY29udGVudFR5cGU6IFwiaW1hZ2Uvd2VicFwiLFxuICAgIG1heEFnZTogNjAsXG4gICAgZXRhZzogRVRBRyxcbiAgfSk7XG59KTtcblxuaW50ZXJmYWNlIEFuc3dlciB7XG4gIHJlYWRvbmx5IGhlYWQ6IFJlc3BvbnNlSGVhZDtcbiAgcmVhZG9ubHkgYm9keTogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0KFxuICBzcmM6IHN0cmluZyxcbiAgaW5pdDoge1xuICAgIG1ldGhvZD86IHN0cmluZztcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICB2aWE/OiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXI7XG4gICAgd2FpdFVudGlsPzogKHByb21pc2U6IFByb21pc2U8dW5rbm93bj4pID0+IHZvaWQ7XG4gIH0gPSB7fSxcbik6IFByb21pc2U8QW5zd2VyPiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwoXG4gICAgYGh0dHBzOi8vc2hvcC5leGFtcGxlLnRlc3QvX25leHQvaW1hZ2U/dXJsPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHNyYyl9Jnc9NjQwJnE9NzVgLFxuICApO1xuICBjb25zdCByZXEgPSBuZXcgU2hpbUluY29taW5nTWVzc2FnZSh7XG4gICAgbWV0aG9kOiBpbml0Lm1ldGhvZCA/PyBcIkdFVFwiLFxuICAgIHVybDogYCR7dXJsLnBhdGhuYW1lfSR7dXJsLnNlYXJjaH1gLFxuICAgIGhlYWRlcnM6IHsgYWNjZXB0OiBcImltYWdlL3dlYnBcIiwgLi4uaW5pdC5oZWFkZXJzIH0sXG4gIH0pO1xuICBjb25zdCByZXMgPSBuZXcgU2hpbVNlcnZlclJlc3BvbnNlKCk7XG4gIGxldCBoZWFkOiBSZXNwb25zZUhlYWQgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNodW5rczogQnVmZmVyW10gPSBbXTtcbiAgY29uc3QgZG9uZSA9IHBpcGVUb1NpbmsoXG4gICAgcmVxLFxuICAgIHJlcyxcbiAgICB7XG4gICAgICBiZWdpbihyZXNwb25zZUhlYWQpIHtcbiAgICAgICAgaGVhZCA9IHJlc3BvbnNlSGVhZDtcbiAgICAgICAgcmV0dXJuIG5ldyBXcml0YWJsZSh7XG4gICAgICAgICAgd3JpdGUoY2h1bmssIF9lbmNvZGluZywgY2FsbGJhY2spIHtcbiAgICAgICAgICAgIGNodW5rcy5wdXNoKEJ1ZmZlci5mcm9tKGNodW5rKSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuICAgIHsgY29tcHJlc3M6IGZhbHNlIH0sXG4gICk7XG4gIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gIGF3YWl0IChpbml0LnZpYSA/PyBvcHRpbWl6ZXIpLmhhbmRsZShcbiAgICByZXEsXG4gICAgcmVzLFxuICAgIHVybCxcbiAgICBpbml0LndhaXRVbnRpbCA/PyAoKHByb21pc2UpID0+IHBlbmRpbmcucHVzaChwcm9taXNlKSksXG4gICk7XG4gIGF3YWl0IGRvbmU7XG4gIC8vIFNldHRsZWQsIG5vdCBhd2FpdGVkOiB0aGUgcnVudGltZSBsb2dzIGEgcmVqZWN0aW9uIHJhdGhlciB0aGFuIGZhaWxpbmcgb24gaXQuXG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChwZW5kaW5nKTtcbiAgcmV0dXJuIHsgaGVhZDogaGVhZCEsIGJvZHk6IEJ1ZmZlci5jb25jYXQoY2h1bmtzKS50b1N0cmluZygpIH07XG59XG5cbmRlc2NyaWJlKFwibmV3SW1hZ2VSZXNwb25zZUNhY2hlXCIsICgpID0+IHtcbiAgdHlwZSBSZXNwb25zZUNhY2hlQ2xhc3MgPSBQYXJhbWV0ZXJzPHR5cGVvZiBuZXdJbWFnZVJlc3BvbnNlQ2FjaGU+WzBdO1xuXG4gIC8qKiBuZXh0IDwgMTYuMy44J3MgYFJlc3BvbnNlQ2FjaGVgOiBgKG1pbmltYWxfbW9kZSwgbWF4U2l6ZSwgdHRsKWAuICovXG4gIGNsYXNzIExlZ2FjeVJlc3BvbnNlQ2FjaGUge1xuICAgIHJlYWRvbmx5IG1pbmltYWxfbW9kZTogdW5rbm93bjtcbiAgICBjb25zdHJ1Y3RvcihtaW5pbWFsTW9kZTogdW5rbm93bikge1xuICAgICAgdGhpcy5taW5pbWFsX21vZGUgPSBtaW5pbWFsTW9kZTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIG5leHQgPj0gMTYuMy44J3M6IGAoeyBtaW5pbWFsTW9kZSwgcm91dGUsIC4uLiB9KWAsIHRocm93aW5nIHdpdGhvdXQgYSByb3V0ZS5cbiAgICogVGhlIGZpZWxkIGlzIHJlbmFtZWQgaGVyZSB0byBzaG93IHRoZSBjaG9pY2UgZG9lc24ndCBkZXBlbmQgb24gaXQuXG4gICAqL1xuICBjbGFzcyBSb3V0ZVJlc3BvbnNlQ2FjaGUge1xuICAgIHJlYWRvbmx5IG1vZGU6IHVua25vd247XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgbWluaW1hbE1vZGUsXG4gICAgICByb3V0ZSxcbiAgICB9OiB7XG4gICAgICBtaW5pbWFsTW9kZTogYm9vbGVhbjtcbiAgICAgIHJvdXRlPzogdW5rbm93bjtcbiAgICB9KSB7XG4gICAgICBpZiAoIXJvdXRlKSB0aHJvdyBuZXcgRXJyb3IoXCJSZXNwb25zZSBjYWNoZSByZXF1aXJlcyBhIHNvdXJjZSByb3V0ZVwiKTtcbiAgICAgIHRoaXMubW9kZSA9IG1pbmltYWxNb2RlO1xuICAgIH1cbiAgfVxuICBjb25zdCBjb25zdHJ1Y3QgPSAoUmVzcG9uc2VDYWNoZTogbmV3IChhcmc6IG5ldmVyKSA9PiBvYmplY3QpID0+XG4gICAgbmV3SW1hZ2VSZXNwb25zZUNhY2hlKFxuICAgICAgUmVzcG9uc2VDYWNoZSBhcyB1bmtub3duIGFzIFJlc3BvbnNlQ2FjaGVDbGFzcyxcbiAgICApIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgaXQoXCJwYXNzZXMgeyBtaW5pbWFsTW9kZSwgcm91dGU6ICdpbWFnZScgfSB0byBhIG5leHQgdGhhdCB0YWtlcyBpdFwiLCAoKSA9PiB7XG4gICAgY29uc3QgY2FjaGUgPSBjb25zdHJ1Y3QoUm91dGVSZXNwb25zZUNhY2hlKTtcbiAgICBleHBlY3QoY2FjaGUpLnRvQmVJbnN0YW5jZU9mKFJvdXRlUmVzcG9uc2VDYWNoZSk7XG4gICAgZXhwZWN0KGNhY2hlLm1vZGUpLnRvQmUoZmFsc2UpO1xuICB9KTtcblxuICAvLyBCeSB3aGF0IHRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzLCBub3QgdGhlIHZlcnNpb246IGEgY2FuYXJ5IGN1dCBiZWZvcmVcbiAgLy8gMTYuMy44J3MgY2hhbmdlIHJlYWRzIGFzIG5ld2VyIHRoYW4gaXQuXG4gIGl0KFwicGFzc2VzIG1pbmltYWxNb2RlIGFsb25lIHRvIGEgbmV4dCB0aGF0IHRvb2sgdGhlIG9wdGlvbnMgYXMgbWluaW1hbE1vZGVcIiwgKCkgPT4ge1xuICAgIGNvbnN0IGNhY2hlID0gY29uc3RydWN0KExlZ2FjeVJlc3BvbnNlQ2FjaGUpO1xuICAgIGV4cGVjdChjYWNoZSkudG9CZUluc3RhbmNlT2YoTGVnYWN5UmVzcG9uc2VDYWNoZSk7XG4gICAgZXhwZWN0KGNhY2hlLm1pbmltYWxfbW9kZSkudG9CZShmYWxzZSk7XG4gIH0pO1xuXG4gIGl0KFwicmV0aHJvd3MgYSBjb25zdHJ1Y3RvciBlcnJvciB0aGF0IGlzbid0IHRoZSBtaXNzaW5nIHJvdXRlXCIsICgpID0+IHtcbiAgICBjbGFzcyBCcm9rZW5SZXNwb25zZUNhY2hlIHtcbiAgICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJib29tXCIpO1xuICAgICAgfVxuICAgIH1cbiAgICBleHBlY3QoKCkgPT4gY29uc3RydWN0KEJyb2tlblJlc3BvbnNlQ2FjaGUpKS50b1Rocm93KFwiYm9vbVwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIuaXNFbmFibGVkXCIsICgpID0+IHtcbiAgY29uc3Qgd2l0aEltYWdlcyA9IChpbWFnZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PlxuICAgIG9wdGltaXplckZvcih7IGltYWdlcyB9KTtcblxuICAvLyBXaGVyZSBgbmV4dCBzdGFydGAgYW5zd2VycyA0MDQgcmF0aGVyIHRoYW4gb3B0aW1pemUuXG4gIGl0KFwiaXMgb2ZmIGZvciBpbWFnZXMudW5vcHRpbWl6ZWQgYW5kIGZvciBhIG5vbi1kZWZhdWx0IGxvYWRlclwiLCAoKSA9PiB7XG4gICAgZXhwZWN0KHdpdGhJbWFnZXMoe30pLmlzRW5hYmxlZCgpKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdCh3aXRoSW1hZ2VzKHsgdW5vcHRpbWl6ZWQ6IHRydWUgfSkuaXNFbmFibGVkKCkpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChcbiAgICAgIHdpdGhJbWFnZXMoeyBsb2FkZXI6IFwiY3VzdG9tXCIsIGxvYWRlckZpbGU6IFwiLi9sb2FkZXIuanNcIiB9KS5pc0VuYWJsZWQoKSxcbiAgICApLnRvQmUoZmFsc2UpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZShcIlJ1bnRpbWVJbWFnZU9wdGltaXplciByZXNwb25zZVwiLCAoKSA9PiB7XG4gIGl0KFwiYW5zd2VycyB3aXRoIHRoZSBoZWFkZXJzIG5leHQgc3RhcnQgc2VuZHNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSB9ID0gYXdhaXQgcmVxdWVzdChcIi9waG90b3MvbG9nby5wbmdcIik7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChoZWFkLmhlYWRlcnMpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgXCJjYWNoZS1jb250cm9sXCI6IFwicHVibGljLCBtYXgtYWdlPTYwLCBtdXN0LXJldmFsaWRhdGVcIixcbiAgICAgIFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2Uvd2VicFwiLFxuICAgICAgXCJjb250ZW50LWxlbmd0aFwiOiBTdHJpbmcoUE5HLmxlbmd0aCksXG4gICAgICBcImNvbnRlbnQtZGlzcG9zaXRpb25cIjogJ2F0dGFjaG1lbnQ7IGZpbGVuYW1lPVwibG9nby53ZWJwXCInLFxuICAgICAgXCJjb250ZW50LXNlY3VyaXR5LXBvbGljeVwiOiBpbWFnZUNvbmZpZ0RlZmF1bHQuY29udGVudFNlY3VyaXR5UG9saWN5LFxuICAgICAgZXRhZzogRVRBRyxcbiAgICAgIHZhcnk6IFwiQWNjZXB0XCIsXG4gICAgICBcIngtbmV4dGpzLWNhY2hlXCI6IFwiTUlTU1wiLFxuICAgIH0pO1xuICAgIGV4cGVjdChib2R5KS50b0JlKFBORy50b1N0cmluZygpKTtcbiAgfSk7XG5cbiAgLy8gQ29udGVudC1oYXNoZWQsIHNvIHRoZSBuYW1lIGNoYW5nZXMgd2hlbmV2ZXIgdGhlIGJ5dGVzIGRvLlxuICBpdChcImNhY2hlcyBhIHN0YXRpY2FsbHkgaW1wb3J0ZWQgaW1hZ2UgZm9yIGEgeWVhciwgaW1tdXRhYmxlXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvX25leHQvc3RhdGljL21lZGlhL2xvZ28uM2YyYTFjLnBuZ1wiKTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzW1wiY2FjaGUtY29udHJvbFwiXSkudG9CZShcbiAgICAgIFwicHVibGljLCBtYXgtYWdlPTMxNTM2MDAwMCwgaW1tdXRhYmxlXCIsXG4gICAgKTtcbiAgfSk7XG5cbiAgLy8gYHdyaXRlSGVhZGAgcmVqZWN0cyBhIGhlYWRlciB2YWx1ZSBvdXRzaWRlIGxhdGluMSB3aXRoIEVSUl9JTlZBTElEX0NIQVIsXG4gIC8vIGFuZCB0aGUgTGFtYmRhIHNpbmsgd3JpdGVzIHRoZSBoZWFkIHRocm91Z2ggaXQuXG4gIGl0KFwiZW5jb2RlcyBhIG5vbi1sYXRpbjEgZmlsZW5hbWUgcmF0aGVyIHRoYW4gc2VuZGluZyBpdCByYXdcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi/DvG1sYXV0LeWGmeecny5wbmdcIik7XG4gICAgY29uc3QgZGlzcG9zaXRpb24gPSBoZWFkLmhlYWRlcnNbXCJjb250ZW50LWRpc3Bvc2l0aW9uXCJdO1xuICAgIGV4cGVjdChkaXNwb3NpdGlvbikudG9NYXRjaCgvXmF0dGFjaG1lbnQ7IGZpbGVuYW1lPVwiW15cIl0qXCI7IGZpbGVuYW1lXFwqPS8pO1xuICAgIGV4cGVjdChkaXNwb3NpdGlvbikudG9Db250YWluKFxuICAgICAgYGZpbGVuYW1lKj1VVEYtOCcnJHtlbmNvZGVVUklDb21wb25lbnQoXCLDvG1sYXV0LeWGmeecny53ZWJwXCIpfWAsXG4gICAgKTtcbiAgICBleHBlY3QoKCkgPT5cbiAgICAgIHZhbGlkYXRlSGVhZGVyVmFsdWUoXCJDb250ZW50LURpc3Bvc2l0aW9uXCIsIGRpc3Bvc2l0aW9uKSxcbiAgICApLm5vdC50b1Rocm93KCk7XG4gIH0pO1xuXG4gIGl0LmVhY2goW1xuICAgIFtcInRoZSBleGFjdCB0YWdcIiwgRVRBR10sXG4gICAgW1wiYSB3ZWFrIGZvcm0gb2YgaXRcIiwgYFcvJHtFVEFHfWBdLFxuICAgIFtcImEgbGlzdCBjb250YWluaW5nIGl0XCIsIGBcIm90aGVyXCIsICR7RVRBR31gXSxcbiAgICBbXCJhIHdpbGRjYXJkXCIsIFwiKlwiXSxcbiAgXSkoXCJhbnN3ZXJzIDMwNCB0byBJZi1Ob25lLU1hdGNoIHdpdGggJXNcIiwgYXN5bmMgKF9uYW1lLCBpZk5vbmVNYXRjaCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCwgYm9keSB9ID0gYXdhaXQgcmVxdWVzdChcIi9sb2dvLnBuZ1wiLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiaWYtbm9uZS1tYXRjaFwiOiBpZk5vbmVNYXRjaCB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMzA0KTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzLmV0YWcpLnRvQmUoRVRBRyk7XG4gICAgZXhwZWN0KGhlYWQuaGVhZGVyc1tcImNhY2hlLWNvbnRyb2xcIl0pLnRvQmUoXG4gICAgICBcInB1YmxpYywgbWF4LWFnZT02MCwgbXVzdC1yZXZhbGlkYXRlXCIsXG4gICAgKTtcbiAgICBleHBlY3QoYm9keSkudG9CZShcIlwiKTtcbiAgfSk7XG5cbiAgaXQoXCJhbnN3ZXJzIDIwMCB0byBhbiBJZi1Ob25lLU1hdGNoIHRoYXQgZG9lcyBub3QgbWF0Y2hcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi9sb2dvLnBuZ1wiLCB7XG4gICAgICBoZWFkZXJzOiB7IFwiaWYtbm9uZS1tYXRjaFwiOiAnXCJvdGhlclwiJyB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgfSk7XG5cbiAgaXQoXCJzZW5kcyB0aGUgaGVhZGVycyBidXQgbm8gYm9keSB0byBIRUFEXCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3QoXCIvbG9nby5wbmdcIiwgeyBtZXRob2Q6IFwiSEVBRFwiIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICBleHBlY3QoaGVhZC5oZWFkZXJzW1wiY29udGVudC1sZW5ndGhcIl0pLnRvQmUoU3RyaW5nKFBORy5sZW5ndGgpKTtcbiAgICBleHBlY3QoYm9keSkudG9CZShcIlwiKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgc291cmNlc1wiLCAoKSA9PiB7XG4gIC8vIGBuZXh0IHN0YXJ0YCBmZXRjaGVzIGEgcmVtb3RlIHNvdXJjZSBvbmx5IHdoZW4gYHJlbW90ZVBhdHRlcm5zYCBvciBgZG9tYWluc2BcbiAgLy8gYWxsb3cgaXQ7IHRoZSBzdGFnZSdzIGNvbmZpZyBhbGxvd3Mgbm9uZS4gQW55dGhpbmcgZWxzZSB3b3VsZCBtYWtlIHRoZVxuICAvLyBvcHRpbWl6ZXIgYW4gb3BlbiBwcm94eSBpbnRvIHdoYXRldmVyIGl0IGNhbiByZWFjaC5cbiAgaXQuZWFjaChbXG4gICAgW1wiYW5vdGhlciBvcmlnaW5cIiwgXCJodHRwczovL2V2aWwuZXhhbXBsZS50ZXN0L3gucG5nXCJdLFxuICAgIFtcImluc3RhbmNlIG1ldGFkYXRhXCIsIFwiaHR0cDovLzE2OS4yNTQuMTY5LjI1NC9sYXRlc3QvbWV0YS1kYXRhL1wiXSxcbiAgICBbXCJhIHByb3RvY29sLXJlbGF0aXZlIHVybFwiLCBcIi8vZXZpbC5leGFtcGxlLnRlc3QveC5wbmdcIl0sXG4gIF0pKFwicmVqZWN0cyBhIHJlbW90ZSBzb3VyY2UgdGhhdCBpcyBub3QgYWxsb3dlZDogJXNcIiwgYXN5bmMgKF9uYW1lLCBzcmMpID0+IHtcbiAgICBjb25zdCB7IGhlYWQsIGJvZHkgfSA9IGF3YWl0IHJlcXVlc3Qoc3JjKTtcbiAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDQwMCk7XG4gICAgZXhwZWN0KGJvZHkpLnRvTWF0Y2goL1widXJsXCIgcGFyYW1ldGVyLyk7XG4gICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICB9KTtcblxuICBmdW5jdGlvbiB3aXRoUzNNaXNzKFxuICAgIGZldGNoSW50ZXJuYWw/OiBJbWFnZU9wdGltaXplck9wdGlvbnNbXCJmZXRjaEludGVybmFsXCJdLFxuICApOiBSdW50aW1lSW1hZ2VPcHRpbWl6ZXIge1xuICAgIHJldHVybiBvcHRpbWl6ZXJGb3Ioe1xuICAgICAgZmV0Y2hJbnRlcm5hbCxcbiAgICAgIHMzOiB7XG4gICAgICAgIHNlbmQ6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBPYmplY3QuYXNzaWduKG5ldyBFcnJvcihcIm1pc3NpbmdcIiksIHsgbmFtZTogXCJOb1N1Y2hLZXlcIiB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgdW5rbm93biBhcyBTM0NsaWVudCxcbiAgICB9KTtcbiAgfVxuXG4gIGl0KFwiZmFsbHMgYmFjayB0byB0aGUgYXBwJ3Mgcm91dGVzIGZvciBhIHNvdXJjZSBTMyBoYXMgbm8gZmlsZSBmb3JcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IGZldGNoSW50ZXJuYWwgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBoZWFkZXJzOiB7XG4gICAgICAgIFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2UvcG5nXCIsXG4gICAgICAgIFwiY2FjaGUtY29udHJvbFwiOiBcInB1YmxpYywgbWF4LWFnZT0xMjBcIixcbiAgICAgIH0sXG4gICAgICBib2R5OiBCdWZmZXIuZnJvbShcInJvdXRlLWJ5dGVzXCIpLFxuICAgIH0pKTtcbiAgICBjb25zdCB7IGhlYWQgfSA9IGF3YWl0IHJlcXVlc3QoXCIvYXBpL2F2YXRhcj9pZD00MlwiLCB7XG4gICAgICB2aWE6IHdpdGhTM01pc3MoZmV0Y2hJbnRlcm5hbCksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChmZXRjaEludGVybmFsKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIFwiL2FwaS9hdmF0YXI/aWQ9NDJcIixcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpLFxuICAgICAgaW1hZ2VDb25maWdEZWZhdWx0Lm1heGltdW1SZXNwb25zZUJvZHksXG4gICAgKTtcbiAgICBleHBlY3QoKGltYWdlT3B0aW1pemVyIGFzIGplc3QuTW9jaykubW9jay5sYXN0Q2FsbFswXSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBidWZmZXI6IEJ1ZmZlci5mcm9tKFwicm91dGUtYnl0ZXNcIiksXG4gICAgICBjb250ZW50VHlwZTogXCJpbWFnZS9wbmdcIixcbiAgICAgIGNhY2hlQ29udHJvbDogXCJwdWJsaWMsIG1heC1hZ2U9MTIwXCIsXG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgOiB0aGUgZmlsZSBpcyBvbiBkaXNrLCBhbmQgYSBHZXRPYmplY3QgZm9yIGl0IGlzXG4gIC8vIGEgd2FzdGVkIHJvdW5kIHRyaXAuXG4gIGl0KFwiZ29lcyBzdHJhaWdodCB0byB0aGUgYXBwJ3Mgcm91dGVzIHdoZW4gdGhlcmUgaXMgbm8gYnVja2V0XCIsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBzZW5kID0gamVzdC5mbigpO1xuICAgIGNvbnN0IGZldGNoSW50ZXJuYWwgPSBqZXN0LmZuKGFzeW5jICgpID0+ICh7XG4gICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiaW1hZ2UvcG5nXCIgfSxcbiAgICAgIGJvZHk6IEJ1ZmZlci5mcm9tKFwiZGlzay1ieXRlc1wiKSxcbiAgICB9KSk7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL2xvZ28ucG5nXCIsIHtcbiAgICAgIHZpYTogb3B0aW1pemVyRm9yKHtcbiAgICAgICAgYnVja2V0OiBcIlwiLFxuICAgICAgICBmZXRjaEludGVybmFsLFxuICAgICAgICBzMzogeyBzZW5kIH0gYXMgdW5rbm93biBhcyBTM0NsaWVudCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoMjAwKTtcbiAgICBleHBlY3Qoc2VuZCkubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBleHBlY3QoZmV0Y2hJbnRlcm5hbCkudG9IYXZlQmVlbkNhbGxlZFdpdGgoXG4gICAgICBcIi9sb2dvLnBuZ1wiLFxuICAgICAgZXhwZWN0LmFueXRoaW5nKCksXG4gICAgICBpbWFnZUNvbmZpZ0RlZmF1bHQubWF4aW11bVJlc3BvbnNlQm9keSxcbiAgICApO1xuICB9KTtcblxuICBpdChcImFuc3dlcnMgNDAwIHdoZW4gdGhlIHJvdXRlIHNlbmRzIG5vIGJvZHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi9hcGkvYXZhdGFyP2lkPTQyXCIsIHtcbiAgICAgIHZpYTogd2l0aFMzTWlzcyhhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdGF0dXNDb2RlOiA0MDQsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICB9KSksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSg0MDApO1xuICB9KTtcblxuICBpdChcImFuc3dlcnMgYW4gZXhwbGljaXQgNTAyIGZvciBhIHNvdXJjZSBzZXJ2ZWQgYnkgYW5vdGhlciBmdW5jdGlvbkdyb3VwcyBncm91cFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwiZXJyb3JcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBoZWFkLCBib2R5IH0gPSBhd2FpdCByZXF1ZXN0KFwiL2FwaS9hdmF0YXI/aWQ9NDJcIiwge1xuICAgICAgICB2aWE6IHdpdGhTM01pc3MoYXN5bmMgKCkgPT4gKHtcbiAgICAgICAgICBzdGF0dXNDb2RlOiAwLFxuICAgICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICAgIGJvZHk6IEJ1ZmZlci5hbGxvYygwKSxcbiAgICAgICAgICBvdGhlckdyb3VwOiBcImF2YXRhcnNcIixcbiAgICAgICAgfSkpLFxuICAgICAgfSk7XG4gICAgICBleHBlY3QoaGVhZC5zdGF0dXNDb2RlKS50b0JlKDUwMik7XG4gICAgICBleHBlY3QoYm9keSkudG9NYXRjaCgvYW5vdGhlciBmdW5jdGlvbkdyb3VwcyBncm91cC8pO1xuICAgICAgZXhwZWN0KGltYWdlT3B0aW1pemVyKS5ub3QudG9IYXZlQmVlbkNhbGxlZCgpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBlcnJvci5tb2NrUmVzdG9yZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gYGltYWdlcy5tYXhpbXVtUmVzcG9uc2VCb2R5YCwgd2hpY2ggYG5leHQgc3RhcnRgIGVuZm9yY2VzIG9uIGxvY2FsXG4gIC8vIHNvdXJjZXMgdG9vOiBwYXN0IGl0LCB0aGUgc291cmNlIGlzIG5vdCByZWFkIGludG8gbWVtb3J5LlxuICBpdChcImFuc3dlcnMgNDEzIGZvciBhIHJvdXRlIHJlc3BvbnNlIG92ZXIgbWF4aW11bVJlc3BvbnNlQm9keVwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBoZWFkIH0gPSBhd2FpdCByZXF1ZXN0KFwiL2FwaS9leHBvcnRcIiwge1xuICAgICAgdmlhOiB3aXRoUzNNaXNzKGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIGhlYWRlcnM6IHt9LFxuICAgICAgICBib2R5OiBCdWZmZXIuYWxsb2MoMCksXG4gICAgICAgIHRvb0xhcmdlOiB0cnVlLFxuICAgICAgfSkpLFxuICAgIH0pO1xuICAgIGV4cGVjdChoZWFkLnN0YXR1c0NvZGUpLnRvQmUoNDEzKTtcbiAgICBleHBlY3QoaW1hZ2VPcHRpbWl6ZXIpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KFwiYW5zd2VycyA0MTMgZm9yIGFuIFMzIG9iamVjdCBvdmVyIG1heGltdW1SZXNwb25zZUJvZHlcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgaGVhZCB9ID0gYXdhaXQgcmVxdWVzdChcIi92aWRlby5tcDRcIiwge1xuICAgICAgdmlhOiBvcHRpbWl6ZXJGb3Ioe1xuICAgICAgICBpbWFnZXM6IHsgbWF4aW11bVJlc3BvbnNlQm9keTogMTAgfSxcbiAgICAgICAgczM6IHtcbiAgICAgICAgICBzZW5kOiBhc3luYyAoKSA9PiAoe1xuICAgICAgICAgICAgQm9keTogW0J1ZmZlci5mcm9tKFwibmV2ZXIgcmVhZFwiKV0sXG4gICAgICAgICAgICBDb250ZW50TGVuZ3RoOiAxMSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSBhcyB1bmtub3duIGFzIFMzQ2xpZW50LFxuICAgICAgfSksXG4gICAgfSk7XG4gICAgZXhwZWN0KGhlYWQuc3RhdHVzQ29kZSkudG9CZSg0MTMpO1xuICAgIGV4cGVjdChpbWFnZU9wdGltaXplcikubm90LnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJSdW50aW1lSW1hZ2VPcHRpbWl6ZXIgY2FjaGVcIiwgKCkgPT4ge1xuICBpdChcIm9wdGltaXplcyBvbmNlLCB0aGVuIGFuc3dlcnMgZnJvbSB0aGUgY2FjaGUgaGFuZGxlclwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmlhID0gb3B0aW1pemVyRm9yKCk7XG4gICAgY29uc3QgZmlyc3QgPSBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9jYWNoZWQucG5nXCIsIHsgdmlhIH0pO1xuICAgIGV4cGVjdChmaXJzdC5oZWFkLmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSkudG9CZShcIk1JU1NcIik7XG4gICAgZXhwZWN0KGZpcnN0LmJvZHkpLnRvQmUoUE5HLnRvU3RyaW5nKCkpO1xuXG4gICAgY29uc3Qgc2Vjb25kID0gYXdhaXQgcmVxdWVzdChcIi9waG90b3MvY2FjaGVkLnBuZ1wiLCB7IHZpYSB9KTtcbiAgICBleHBlY3Qoc2Vjb25kLmhlYWQuc3RhdHVzQ29kZSkudG9CZSgyMDApO1xuICAgIGV4cGVjdChzZWNvbmQuaGVhZC5oZWFkZXJzW1wieC1uZXh0anMtY2FjaGVcIl0pLnRvQmUoXCJISVRcIik7XG4gICAgZXhwZWN0KHNlY29uZC5ib2R5KS50b0JlKFBORy50b1N0cmluZygpKTtcbiAgICBleHBlY3Qoc2Vjb25kLmhlYWQuaGVhZGVycy5ldGFnKS50b0JlKEVUQUcpO1xuICAgIGV4cGVjdChpbWFnZU9wdGltaXplcikudG9IYXZlQmVlbkNhbGxlZFRpbWVzKDEpO1xuXG4gICAgLy8gVGhlIGVudHJ5IGBuZXh0IHN0YXJ0YCB3b3VsZCBoYXZlIHdyaXR0ZW4uXG4gICAgY29uc3QgW2VudHJ5XSA9IFsuLi5NYXBDYWNoZUhhbmRsZXIuZW50cmllcy52YWx1ZXMoKV0gYXMgQXJyYXk8e1xuICAgICAgdmFsdWU6IHsga2luZDogc3RyaW5nOyBleHRlbnNpb246IHN0cmluZyB9O1xuICAgIH0+O1xuICAgIGV4cGVjdChlbnRyeS52YWx1ZSkudG9NYXRjaE9iamVjdCh7IGtpbmQ6IFwiSU1BR0VcIiwgZXh0ZW5zaW9uOiBcIndlYnBcIiB9KTtcbiAgfSk7XG5cbiAgLy8gQW5vdGhlciBpbnN0YW5jZTogbm90aGluZyBpbiBtZW1vcnksIHNvIHRoZSBoaXQgaXMgdGhlIGNhY2hlIGhhbmRsZXIncy5cbiAgaXQoXCJzaGFyZXMgdGhlIG9wdGltaXplZCBpbWFnZSBhY3Jvc3MgaW5zdGFuY2VzXCIsIGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCByZXF1ZXN0KFwiL3Bob3Rvcy9zaGFyZWQucG5nXCIsIHsgdmlhOiBvcHRpbWl6ZXJGb3IoKSB9KTtcbiAgICBjb25zdCBvdGhlciA9IGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL3NoYXJlZC5wbmdcIiwgeyB2aWE6IG9wdGltaXplckZvcigpIH0pO1xuICAgIGV4cGVjdChvdGhlci5oZWFkLmhlYWRlcnNbXCJ4LW5leHRqcy1jYWNoZVwiXSkudG9CZShcIkhJVFwiKTtcbiAgICBleHBlY3QoaW1hZ2VPcHRpbWl6ZXIpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgfSk7XG5cbiAgLy8gYHJlcXVpcmVkLXNlcnZlci1maWxlcy5qc29uYCBuYW1lcyBpdCByZWxhdGl2ZSB0byB0aGUgZGlzdCBkaXIuXG4gIGl0KFwibG9hZHMgdGhlIGFwcCdzIGNhY2hlSGFuZGxlciBmcm9tIHdoZXJlIG5leHQgc3RhcnQgd291bGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL2NhY2hlZC5wbmdcIiwgeyB2aWE6IG9wdGltaXplckZvcigpIH0pO1xuICAgIGV4cGVjdChpbXBvcnRlZCkudG9NYXRjaChcbiAgICAgIC9eZmlsZTpcXC9cXC8uKlxcL25vZGVfbW9kdWxlc1xcL2Nkay1uZXh0anNcXC9saWJcXC9hZGFwdGVyXFwvY2FjaGUtaGFuZGxlclxcLm1qcyQvLFxuICAgICk7XG4gICAgZXhwZWN0KE1hcENhY2hlSGFuZGxlci5vcHRpb25zKS50b01hdGNoT2JqZWN0KHsgZGV2OiBmYWxzZSB9KTtcbiAgfSk7XG5cbiAgLy8gQSB0cmFuc2llbnQgZmFpbHVyZSBsb2FkaW5nIHRoZSBjYWNoZUhhbmRsZXIgKEVNRklMRSBpbiBhIGNvbGQtc3RhcnRcbiAgLy8gYnVyc3QpIG11c3Qgbm90IGZhaWwgZXZlcnkgbGF0ZXIgaW1hZ2UgcmVxdWVzdCBvbiB0aGUgaW5zdGFuY2UuXG4gIGl0KFwicmV0cmllcyBsb2FkaW5nIHRoZSBjYWNoZUhhbmRsZXIgYWZ0ZXIgYSBmYWlsZWQgbG9hZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgZXJyb3IgPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwiZXJyb3JcIikubW9ja0ltcGxlbWVudGF0aW9uKCgpID0+IHt9KTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW1wb3J0TW9kdWxlID0gamVzdFxuICAgICAgICAuZm4oKVxuICAgICAgICAubW9ja1JlamVjdGVkVmFsdWVPbmNlKG5ldyBFcnJvcihcIkVNRklMRVwiKSlcbiAgICAgICAgLm1vY2tSZXNvbHZlZFZhbHVlKHsgZGVmYXVsdDogTWFwQ2FjaGVIYW5kbGVyIH0pO1xuICAgICAgY29uc3QgdmlhID0gb3B0aW1pemVyRm9yKHsgaW1wb3J0TW9kdWxlIH0pO1xuICAgICAgZXhwZWN0KFxuICAgICAgICAoYXdhaXQgcmVxdWVzdChcIi9waG90b3MvcmV0cnkucG5nXCIsIHsgdmlhIH0pKS5oZWFkLnN0YXR1c0NvZGUsXG4gICAgICApLnRvQmUoNTAwKTtcbiAgICAgIGV4cGVjdChcbiAgICAgICAgKGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL3JldHJ5LnBuZ1wiLCB7IHZpYSB9KSkuaGVhZC5zdGF0dXNDb2RlLFxuICAgICAgKS50b0JlKDIwMCk7XG4gICAgICBleHBlY3QoaW1wb3J0TW9kdWxlKS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGVycm9yLm1vY2tSZXN0b3JlKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyBUaGUgd3JpdGUgb2YgYSBmcmVzaCBpbWFnZSBnb2VzIHRvIGB3YWl0VW50aWxgLCBub3QgaW4gZnJvbnQgb2YgdGhlXG4gIC8vIHJlc3BvbnNlOiB0aGUgaW1hZ2UgaXMgc2VudCBiZWZvcmUgdGhlIGNhY2hlIGhhbmRsZXIgaGFzIGl0LlxuICBpdChcIndyaXRlcyBhIG1pc3MgdG8gdGhlIGNhY2hlIGFmdGVyIGFuc3dlcmluZywgdGhyb3VnaCB3YWl0VW50aWxcIiwgYXN5bmMgKCkgPT4ge1xuICAgIC8vIEEgd3JpdGUgdGhhdCBjYW4ndCBmaW5pc2ggdW50aWwgcmVsZWFzZWQ6IGlmIHRoZSByZXNwb25zZSB3YWl0ZWQgb24gaXQsXG4gICAgLy8gYHJlcXVlc3RgIHdvdWxkIG5ldmVyIHJldHVybi5cbiAgICBsZXQgcmVsZWFzZSE6ICgpID0+IHZvaWQ7XG4gICAgY29uc3QgZ2F0ZSA9IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiAocmVsZWFzZSA9IHJlc29sdmUpKTtcbiAgICBjb25zdCBzZXQgPSBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldDtcbiAgICBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldCA9IGFzeW5jIGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgICBhd2FpdCBnYXRlO1xuICAgICAgcmV0dXJuIHNldC5jYWxsKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBlbmRpbmc6IEFycmF5PFByb21pc2U8dW5rbm93bj4+ID0gW107XG4gICAgICBjb25zdCBmaXJzdCA9IGF3YWl0IHJlcXVlc3QoXCIvcGhvdG9zL2RlZmVycmVkLnBuZ1wiLCB7XG4gICAgICAgIHZpYTogb3B0aW1pemVyRm9yKCksXG4gICAgICAgIHdhaXRVbnRpbDogKHByb21pc2UpID0+IHBlbmRpbmcucHVzaChwcm9taXNlKSxcbiAgICAgIH0pO1xuICAgICAgZXhwZWN0KGZpcnN0LmhlYWQuaGVhZGVyc1tcIngtbmV4dGpzLWNhY2hlXCJdKS50b0JlKFwiTUlTU1wiKTtcbiAgICAgIGV4cGVjdChNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5zaXplKS50b0JlKDApO1xuXG4gICAgICByZWxlYXNlKCk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbChwZW5kaW5nKTtcbiAgICAgIGV4cGVjdChNYXBDYWNoZUhhbmRsZXIuZW50cmllcy5zaXplKS50b0JlKDEpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBNYXBDYWNoZUhhbmRsZXIucHJvdG90eXBlLnNldCA9IHNldDtcbiAgICB9XG4gIH0pO1xufSk7XG4iXX0=
@@ -35889,9 +35889,9 @@ var require_dist_cjs16 = __commonJS({
35889
35889
  }
35890
35890
  });
35891
35891
 
35892
- // node_modules/.pnpm/@next+routing@16.3.6/node_modules/@next/routing/dist/index.js
35892
+ // node_modules/.pnpm/@next+routing@16.3.8/node_modules/@next/routing/dist/index.js
35893
35893
  var require_dist = __commonJS({
35894
- "node_modules/.pnpm/@next+routing@16.3.6/node_modules/@next/routing/dist/index.js"(exports, module) {
35894
+ "node_modules/.pnpm/@next+routing@16.3.8/node_modules/@next/routing/dist/index.js"(exports, module) {
35895
35895
  (() => {
35896
35896
  "use strict";
35897
35897
  var e5 = {};
@@ -38359,7 +38359,7 @@ async function loadImageCache({ deploymentRoot, manifest, importModule }, loaded
38359
38359
  });
38360
38360
  }
38361
38361
  return {
38362
- responses: new modules.responseCache.default(false),
38362
+ responses: newImageResponseCache(modules.responseCache.default),
38363
38363
  images: new next.optimizer.ImageOptimizerCache({
38364
38364
  distDir,
38365
38365
  nextConfig,
@@ -38367,6 +38367,17 @@ async function loadImageCache({ deploymentRoot, manifest, importModule }, loaded
38367
38367
  })
38368
38368
  };
38369
38369
  }
38370
+ function newImageResponseCache(ResponseCache) {
38371
+ const Legacy = ResponseCache;
38372
+ try {
38373
+ return new Legacy(false);
38374
+ } catch (err) {
38375
+ if (!String(err?.message).includes("requires a source route")) {
38376
+ throw err;
38377
+ }
38378
+ return new ResponseCache({ minimalMode: false, route: "image" });
38379
+ }
38380
+ }
38370
38381
  function cacheHandlerUrl(distDir, cacheHandler) {
38371
38382
  const path = cacheHandler.startsWith("file://") ? fileURLToPath(cacheHandler) : cacheHandler;
38372
38383
  return pathToFileURL(
@@ -38636,6 +38647,16 @@ function httpDate(value) {
38636
38647
  return date2 && !Number.isNaN(date2.getTime()) ? date2 : void 0;
38637
38648
  }
38638
38649
 
38650
+ // src/runtime/tag-manifest.ts
38651
+ var TAG_MANIFEST_SYMBOL = /* @__PURE__ */ Symbol.for(
38652
+ "cdk-nextjs.use-cache.tag-manifest"
38653
+ );
38654
+ async function catchUpTags(render) {
38655
+ const global = globalThis;
38656
+ const manifest = global[TAG_MANIFEST_SYMBOL];
38657
+ return manifest ? manifest.catchUp(render) : render();
38658
+ }
38659
+
38639
38660
  // src/runtime/core.ts
38640
38661
  var NextjsRuntime = class {
38641
38662
  constructor(options) {
@@ -38783,7 +38804,7 @@ var NextjsRuntime = class {
38783
38804
  const search = toSearch(invocationQuery);
38784
38805
  req.url = search ? `${pathname}?${search}` : pathname;
38785
38806
  req.headers = toIncomingHttpHeaders(result.requestHeaders);
38786
- await handler2(req, asServerResponse(res), {
38807
+ const options = {
38787
38808
  waitUntil,
38788
38809
  requestMeta: {
38789
38810
  // The resolved query, stated rather than left to be re-derived.
@@ -38858,7 +38879,9 @@ var NextjsRuntime = class {
38858
38879
  // mocked `req`/`res`).
38859
38880
  revalidate: (config) => this.revalidate(config, request)
38860
38881
  }
38861
- });
38882
+ };
38883
+ const render = () => handler2(req, asServerResponse(res), options);
38884
+ await (result.entrypoint.type === "app-page" ? catchUpTags(render) : render());
38862
38885
  if (!res.writableEnded && result.entrypoint.type !== "page-api") {
38863
38886
  res.end();
38864
38887
  }
@@ -39145,7 +39168,8 @@ var NextjsRuntime = class {
39145
39168
  if (target.kind === "entrypoint") {
39146
39169
  const handler2 = await this.entrypoints.load(target.entrypoint);
39147
39170
  req.url = requestedUrl ?? req.url;
39148
- await handler2(req, asServerResponse(res), { waitUntil });
39171
+ const render = () => handler2(req, asServerResponse(res), { waitUntil });
39172
+ await (target.entrypoint.type === "app-page" ? catchUpTags(render) : render());
39149
39173
  if (!res.writableEnded) {
39150
39174
  res.end();
39151
39175
  }