@nikovirtala/projen-constructs 0.3.79 → 0.3.81

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 (35) hide show
  1. package/.jsii +264 -131
  2. package/README.md +104 -0
  3. package/docs/api/classes/Bundler.html +33 -6
  4. package/docs/api/classes/Colima.html +4 -0
  5. package/docs/api/classes/LambdaFunctionCodeBundle.html +22 -2
  6. package/docs/api/classes/LambdaFunctionConstructGenerator.html +4 -0
  7. package/docs/api/classes/LocalStack.html +4 -0
  8. package/docs/api/functions/convertToPosixPath.html +2 -0
  9. package/docs/api/functions/renderBundleName.html +9 -1
  10. package/docs/api/index.html +129 -0
  11. package/docs/api/interfaces/Bundle.html +12 -3
  12. package/docs/api/interfaces/BundlerOptions.html +40 -4
  13. package/docs/api/interfaces/BundlingOptions.html +139 -12
  14. package/docs/api/interfaces/LambdaFunctionCodeBundleOptions.html +53 -5
  15. package/docs/api/interfaces/LambdaFunctionCodeBundlerOptions.html +26 -3
  16. package/docs/api/interfaces/LambdaFunctionConstructGeneratorOptions.html +90 -8
  17. package/docs/api/interfaces/LocalStackOptions.html +46 -4
  18. package/lib/components/bundle-lambda-function-code.d.ts +243 -0
  19. package/lib/components/bundle-lambda-function-code.js +75 -5
  20. package/lib/components/colima.d.ts +5 -0
  21. package/lib/components/colima.js +7 -2
  22. package/lib/components/homebrew.js +1 -1
  23. package/lib/components/lambda-function-construct-generator.d.ts +54 -0
  24. package/lib/components/lambda-function-construct-generator.js +7 -2
  25. package/lib/components/localstack.d.ts +32 -0
  26. package/lib/components/localstack.js +14 -2
  27. package/lib/components/mise.js +1 -1
  28. package/lib/components/typedoc.js +1 -1
  29. package/lib/components/vitest.js +1 -1
  30. package/lib/project-generator.js +1 -1
  31. package/lib/projects/awscdk-construct-library.generated.js +1 -1
  32. package/lib/projects/awscdk-typescript-app.generated.js +1 -1
  33. package/lib/projects/jsii.generated.js +1 -1
  34. package/lib/projects/typescript.generated.js +1 -1
  35. package/package.json +1 -1
@@ -41,30 +41,58 @@ const path = __importStar(require("node:path"));
41
41
  const node_path_1 = require("node:path");
42
42
  const case_1 = require("case");
43
43
  const projen_1 = require("projen");
44
+ /**
45
+ * Renders the bundle name of an entrypoint: its path without the extension and without a leading `src` directory.
46
+ *
47
+ * @example renderBundleName("src/handlers/foo.lambda.ts") // "handlers/foo.lambda"
48
+ */
44
49
  function renderBundleName(entrypoint) {
45
50
  const parts = (0, node_path_1.join)(entrypoint).split(node_path_1.sep);
46
51
  if (parts[0] === "src") {
47
- parts.shift();
52
+ parts.shift(); // just remove 'src' if its the first element for ergonomics
48
53
  }
49
54
  const p = parts.join(node_path_1.sep);
50
55
  const dir = (0, node_path_1.dirname)(p);
51
56
  const base = (0, node_path_1.basename)(p, (0, node_path_1.extname)(p));
52
57
  return (0, node_path_1.join)(dir, base);
53
58
  }
59
+ /**
60
+ * Converts the given path string to posix if it wasn't already.
61
+ */
54
62
  function convertToPosixPath(p) {
55
63
  return p.split(node_path_1.sep).join(node_path_1.posix.sep);
56
64
  }
65
+ /**
66
+ * Adds support for bundling JavaScript applications and dependencies into a
67
+ * single file.
68
+ */
57
69
  class Bundler extends projen_1.Component {
58
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Bundler", version: "0.3.79" };
70
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Bundler", version: "0.3.81" };
71
+ /**
72
+ * Returns the `Bundler` instance associated with a project or `undefined` if
73
+ * there is no Bundler.
74
+ *
75
+ * @param project The project
76
+ * @returns A bundler
77
+ */
59
78
  static of(project) {
60
79
  const isBundler = (o) => o instanceof Bundler;
61
80
  return project.components.find(isBundler);
62
81
  }
82
+ /**
83
+ * The semantic version requirement for `esbuild` (if defined).
84
+ */
63
85
  esbuildVersion;
86
+ /**
87
+ * Root bundle directory.
88
+ */
64
89
  bundledir;
65
90
  _task;
66
91
  addToPreCompile;
67
92
  loaders;
93
+ /**
94
+ * Creates a `Bundler`.
95
+ */
68
96
  constructor(project, options = {}) {
69
97
  super(project);
70
98
  this.esbuildVersion = options.esbuildVersion;
@@ -72,6 +100,12 @@ class Bundler extends projen_1.Component {
72
100
  this.addToPreCompile = options.addToPreCompile ?? true;
73
101
  this.loaders = options.loaders;
74
102
  }
103
+ /**
104
+ * Gets or creates the singleton "bundle" task of the project.
105
+ *
106
+ * If the project doesn't have a "bundle" task, it will be created and spawned
107
+ * during the pre-compile phase (unless `addToPreCompile` is `false`).
108
+ */
75
109
  get bundleTask() {
76
110
  if (!this._task) {
77
111
  this.addBundlingSupport();
@@ -84,6 +118,13 @@ class Bundler extends projen_1.Component {
84
118
  }
85
119
  return this._task;
86
120
  }
121
+ /**
122
+ * Adds a task to the project which bundles a specific entrypoint and all of
123
+ * its dependencies into a single javascript output file.
124
+ *
125
+ * @param entrypoint The relative path of the artifact within the project
126
+ * @param options Bundling options
127
+ */
87
128
  addBundle(entrypoint, options) {
88
129
  const name = renderBundleName(entrypoint);
89
130
  const outdir = path.posix.join(this.bundledir, name);
@@ -147,6 +188,11 @@ class Bundler extends projen_1.Component {
147
188
  outfile: outfile,
148
189
  };
149
190
  }
191
+ /**
192
+ * Add bundling support to a project. This is called implicitly when
193
+ * `bundleTask` is referenced first. It adds the dependency on `esbuild`,
194
+ * gitignore/npmignore, etc.
195
+ */
150
196
  addBundlingSupport() {
151
197
  const ignoreEntry = `/${this.bundledir}/`;
152
198
  this.project.addGitIgnore(ignoreEntry);
@@ -156,8 +202,32 @@ class Bundler extends projen_1.Component {
156
202
  }
157
203
  }
158
204
  exports.Bundler = Bundler;
205
+ /**
206
+ * Generates a pre-bundled AWS Lambda Function code asset from handler code.
207
+ *
208
+ * Adds a task to the project's `Bundler` that uses `esbuild` to bundle the
209
+ * handler into the assets directory, and generates a file (e.g. `src/foo-code.ts`)
210
+ * exporting an `aws_lambda.Code` constant (e.g. `FooFunctionCode`) that points to
211
+ * the bundle. Pass it as the `code` of an `aws_lambda.Function`.
212
+ *
213
+ * Requires a `Bundler` component in the project.
214
+ *
215
+ * @example
216
+ *
217
+ * new Bundler(myProject);
218
+ * new LambdaFunctionCodeBundle(myProject, {
219
+ * entrypoint: "src/foo.lambda.ts",
220
+ * extension: ".lambda.ts",
221
+ * });
222
+ */
159
223
  class LambdaFunctionCodeBundle extends projen_1.Component {
160
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundle", version: "0.3.79" };
224
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundle", version: "0.3.81" };
225
+ /**
226
+ * Defines a pre-bundled AWS Lambda Function code asset from handler code.
227
+ *
228
+ * @param project The project to use
229
+ * @param options Options
230
+ */
161
231
  constructor(project, options) {
162
232
  super(project);
163
233
  const bundler = Bundler.of(project);
@@ -203,7 +273,7 @@ exports.LambdaFunctionCodeBundle = LambdaFunctionCodeBundle;
203
273
  * Creates Lambda Function code bundles from entrypoints discovered in the project's source tree.
204
274
  */
205
275
  class LambdaFunctionCodeBundler extends projen_1.cdk.AutoDiscoverBase {
206
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundler", version: "0.3.79" };
276
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionCodeBundler", version: "0.3.81" };
207
277
  constructor(project, options) {
208
278
  super(project, {
209
279
  projectdir: options.srcdir,
@@ -219,4 +289,4 @@ class LambdaFunctionCodeBundler extends projen_1.cdk.AutoDiscoverBase {
219
289
  }
220
290
  }
221
291
  exports.LambdaFunctionCodeBundler = LambdaFunctionCodeBundler;
222
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLWxhbWJkYS1mdW5jdGlvbi1jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvYnVuZGxlLWxhbWJkYS1mdW5jdGlvbi1jb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWNBLDRDQVNDO0FBRUQsZ0RBRUM7O0FBM0JELGdEQUFrQztBQUNsQyx5Q0FBeUU7QUFDekUsK0JBQThCO0FBQzlCLG1DQVNnQjtBQUVoQixTQUFnQixnQkFBZ0IsQ0FBQyxVQUFrQjtJQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFBLGdCQUFJLEVBQUMsVUFBVSxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQUcsQ0FBQyxDQUFDO0lBQzFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQ3JCLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFHLENBQUMsQ0FBQztJQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFBLG1CQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBQSxvQkFBUSxFQUFDLENBQUMsRUFBRSxJQUFBLG1CQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxPQUFPLElBQUEsZ0JBQUksRUFBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELFNBQWdCLGtCQUFrQixDQUFDLENBQVM7SUFDeEMsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLGVBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFTRCxNQUFhLE9BQVEsU0FBUSxrQkFBUzs7SUFDM0IsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFn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QUM7UUFDNUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxrQkFBa0IsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7O0FBbERMLDREQW1EQztBQVFEOztHQUVHO0FBQ0gsTUFBYSx5QkFBMEIsU0FBUSxZQUFHLENBQUMsZ0JBQWdCOztJQUMvRCxZQUFZLE9BQWdCLEVBQUUsT0FBeUM7UUFDbkUsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNYLFVBQVUsRUFBRSxPQUFPLENBQUMsTUFBTTtZQUMxQixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsS0FBSyxNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEMsSUFBSSx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUN2QyxHQUFHLE9BQU8sQ0FBQyxhQUFhO2dCQUN4QixVQUFVLEVBQUUsVUFBVTtnQkFDdEIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2FBQy9CLENBQUMsQ0FBQztRQUNQLENBQUM7SUFDTCxDQUFDOztBQWRMLDhEQWVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgZGlybmFtZSwgZXh0bmFtZSwgam9pbiwgcG9zaXgsIHNlcCB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHBhc2NhbCB9IGZyb20gXCJjYXNlXCI7XG5pbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBjZGssXG4gICAgRGVwZW5kZW5jeVR5cGUsXG4gICAgamF2YXNjcmlwdCxcbiAgICB0eXBlIFByb2plY3QsXG4gICAgU291cmNlQ29kZSxcbiAgICB0eXBlIFRhc2ssXG4gICAgdHlwZSB0eXBlc2NyaXB0LFxufSBmcm9tIFwicHJvamVuXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJCdW5kbGVOYW1lKGVudHJ5cG9pbnQ6IHN0cmluZykge1xuICAgIGNvbnN0IHBhcnRzID0gam9pbihlbnRyeXBvaW50KS5zcGxpdChzZXApO1xuICAgIGlmIChwYXJ0c1swXSA9PT0gXCJzcmNcIikge1xuICAgICAgICBwYXJ0cy5zaGlmdCgpO1xuICAgIH1cbiAgICBjb25zdCBwID0gcGFydHMuam9pbihzZXApO1xuICAgIGNvbnN0IGRpciA9IGRpcm5hbWUocCk7XG4gICAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKHAsIGV4dG5hbWUocCkpO1xuICAgIHJldHVybiBqb2luKGRpciwgYmFzZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VG9Qb3NpeFBhdGgocDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHAuc3BsaXQoc2VwKS5qb2luKHBvc2l4LnNlcCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVuZGxlck9wdGlvbnMge1xuICAgIHJlYWRvbmx5IGVzYnVpbGRWZXJzaW9uPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGFzc2V0c0Rpcj86IHN0cmluZztcbiAgICByZWFkb25seSBhZGRUb1ByZUNvbXBpbGU/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGxvYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xufVxuXG5leHBvcnQgY2xhc3MgQnVuZGxlciBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgcHVibGljIHN0YXRpYyBvZihwcm9qZWN0OiBQcm9qZWN0KTogQnVuZGxlciB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IGlzQnVuZGxlciA9IChvOiBDb21wb25lbnQpOiBvIGlzIEJ1bmRsZXIgPT4gbyBpbnN0YW5jZW9mIEJ1bmRsZXI7XG4gICAgICAgIHJldHVybiBwcm9qZWN0LmNvbXBvbmVudHMuZmluZChpc0J1bmRsZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWFkb25seSBlc2J1aWxkVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIHB1YmxpYyByZWFkb25seSBidW5kbGVkaXI6IHN0cmluZztcblxuICAgIHByaXZhdGUgX3Rhc2s6IFRhc2sgfCB1bmRlZmluZWQ7XG4gICAgcHJpdmF0ZSByZWFkb25seSBhZGRUb1ByZUNvbXBpbGU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2FkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICAgIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IEJ1bmRsZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCk7XG4gICAgICAgIHRoaXMuZXNidWlsZFZlcnNpb24gPSBvcHRpb25zLmVzYnVpbGRWZXJzaW9uO1xuICAgICAgICB0aGlzLmJ1bmRsZWRpciA9IG9wdGlvbnMuYXNzZXRzRGlyID8/IFwiYXNzZXRzXCI7XG4gICAgICAgIHRoaXMuYWRkVG9QcmVDb21waWxlID0gb3B0aW9ucy5hZGRUb1ByZUNvbXBpbGUgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkZXJzID0gb3B0aW9ucy5sb2FkZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgYnVuZGxlVGFzaygpOiBUYXNrIHtcbiAgICAgICAgaWYgKCF0aGlzLl90YXNrKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEJ1bmRsaW5nU3VwcG9ydCgpO1xuICAgICAgICAgICAgdGhpcy5fdGFzayA9IHRoaXMucHJvamVjdC50YXNrcy5hZGRUYXNrKFwiYnVuZGxlXCIsIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJQcmVwYXJlIGFzc2V0c1wiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5hZGRUb1ByZUNvbXBpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QucHJlQ29tcGlsZVRhc2suc3Bhd24odGhpcy5fdGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2s7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEJ1bmRsZShlbnRyeXBvaW50OiBzdHJpbmcsIG9wdGlvbnM6IEJ1bmRsaW5nT3B0aW9ucyk6IEJ1bmRsZSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSByZW5kZXJCdW5kbGVOYW1lKGVudHJ5cG9pbnQpO1xuICAgICAgICBjb25zdCBvdXRkaXIgPSBwYXRoLnBvc2l4LmpvaW4odGhpcy5idW5kbGVkaXIsIG5hbWUpO1xuICAgICAgICBjb25zdCBvdXRmaWxlID0gcGF0aC5wb3NpeC5qb2luKG91dGRpciwgb3B0aW9ucy5vdXRmaWxlID8/IFwiaW5kZXgubWpzXCIpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBvcHRpb25zLnRhcmdldCA/PyBcImVzbmV4dFwiO1xuICAgICAgICBjb25zdCBwbGF0Zm9ybSA9IG9wdGlvbnMucGxhdGZvcm0gPz8gXCJub2RlXCI7XG4gICAgICAgIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0ID8/IFwiZXNtXCI7XG4gICAgICAgIGNvbnN0IHNvdXJjZW1hcCA9IG9wdGlvbnMuc291cmNlbWFwID8/IHRydWU7XG4gICAgICAgIGNvbnN0IHNvdXJjZXNDb250ZW50ID0gb3B0aW9ucy5zb3VyY2VzQ29udGVudCA/PyBmYWxzZTtcbiAgICAgICAgY29uc3QgbWluaWZ5ID0gb3B0aW9ucy5taW5pZnkgPz8gdHJ1ZTtcbiAgICAgICAgY29uc3QgbWFpbkZpZWxkcyA9IG9wdGlvbnMubWFpbkZpZWxkcyA/PyBcIm1vZHVsZSxtYWluXCI7XG4gICAgICAgIGNvbnN0IGJhbm5lciA9XG4gICAgICAgICAgICBvcHRpb25zLmJhbm5lciA/P1xuICAgICAgICAgICAgXCI6anM9aW1wb3J0IHsgY3JlYXRlUmVxdWlyZSBhcyB0b3BMZXZlbENyZWF0ZVJlcXVpcmUgfSBmcm9tICdtb2R1bGUnO2NvbnN0IHJlcXVpcmUgPSB0b3BMZXZlbENyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKVwiO1xuXG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbXG4gICAgICAgICAgICBcImVzYnVpbGRcIixcbiAgICAgICAgICAgIFwiLS1idW5kbGVcIixcbiAgICAgICAgICAgIGVudHJ5cG9pbnQsXG4gICAgICAgICAgICBgLS10YXJnZXQ9XCIke3RhcmdldH1cImAsXG4gICAgICAgICAgICBgLS1wbGF0Zm9ybT1cIiR7cGxhdGZvcm19XCJgLFxuICAgICAgICAgICAgYC0tb3V0ZmlsZT1cIiR7b3V0ZmlsZX1cImAsXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgdHNjb25maWcgPSBvcHRpb25zLnRzY29uZmlnUGF0aCA/PyBmYWxzZTtcbiAgICAgICAgaWYgKHRzY29uZmlnKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goYC0tdHNjb25maWc9XCIke3RzY29uZmlnfVwiYCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHggb2Ygb3B0aW9ucy5leHRlcm5hbHMgPz8gW10pIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChgLS1leHRlcm5hbDoke3h9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc291cmNlbWFwKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goXCItLXNvdXJjZW1hcFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3VyY2VzQ29udGVudCkge1xuICAgICAgICAgICAgYXJncy5wdXNoKGAtLXNvdXJjZXMtY29udGVudD0ke3NvdXJjZXNDb250ZW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1pbmlmeSkge1xuICAgICAgICAgICAgYXJncy5wdXNoKFwiLS1taW5pZnlcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZm9ybWF0KSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goYC0tZm9ybWF0PSR7Zm9ybWF0fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1haW5GaWVsZHMpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChgLS1tYWluLWZpZWxkcz0ke21haW5GaWVsZHN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYmFubmVyKSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goYC0tYmFubmVyJHtiYW5uZXJ9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkZXJzID0gKG9wdGlvbnMubG9hZGVycyA/PyBmYWxzZSkgPyBvcHRpb25zLmxvYWRlcnMgOiAodGhpcy5sb2FkZXJzID8/IGZhbHNlKTtcbiAgICAgICAgaWYgKGxvYWRlcnMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2V4dGVuc2lvbiwgbG9hZGVyXSBvZiBPYmplY3QuZW50cmllcyhsb2FkZXJzKSkge1xuICAgICAgICAgICAgICAgIGFyZ3MucHVzaChgLS1sb2FkZXI6LiR7ZXh0ZW5zaW9ufT0ke2xvYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1bmRsZVRhc2sgPSB0aGlzLnByb2plY3QuYWRkVGFzayhgYnVuZGxlOiR7bmFtZX1gLCB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogYENyZWF0ZSBhIEphdmFTY3JpcHQgYnVuZGxlIGZyb20gJHtlbnRyeXBvaW50fWAsXG4gICAgICAgICAgICBleGVjOiBhcmdzLmpvaW4oXCIgXCIpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmJ1bmRsZVRhc2suc3Bhd24oYnVuZGxlVGFzayk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJ1bmRsZVRhc2s6IGJ1bmRsZVRhc2ssXG4gICAgICAgICAgICBvdXRkaXI6IG91dGRpcixcbiAgICAgICAgICAgIG91dGZpbGU6IG91dGZpbGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGRCdW5kbGluZ1N1cHBvcnQoKSB7XG4gICAgICAgIGNvbnN0IGlnbm9yZUVudHJ5ID0gYC8ke3RoaXMuYnVuZGxlZGlyfS9gO1xuICAgICAgICB0aGlzLnByb2plY3QuYWRkR2l0SWdub3JlKGlnbm9yZUVudHJ5KTtcbiAgICAgICAgdGhpcy5wcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYCEke2lnbm9yZUVudHJ5fWApO1xuICAgICAgICBjb25zdCBkZXAgPSB0aGlzLmVzYnVpbGRWZXJzaW9uID8gYGVzYnVpbGRAJHt0aGlzLmVzYnVpbGRWZXJzaW9ufWAgOiBcImVzYnVpbGRcIjtcbiAgICAgICAgdGhpcy5wcm9qZWN0LmRlcHMuYWRkRGVwZW5kZW5jeShkZXAsIERlcGVuZGVuY3lUeXBlLkJVSUxEKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVuZGxlIHtcbiAgICByZWFkb25seSBidW5kbGVUYXNrOiBUYXNrO1xuICAgIHJlYWRvbmx5IG91dGZpbGU6IHN0cmluZztcbiAgICByZWFkb25seSBvdXRkaXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdW5kbGluZ09wdGlvbnMge1xuICAgIHJlYWRvbmx5IGV4dGVybmFscz86IHN0cmluZ1tdO1xuICAgIHJlYWRvbmx5IHNvdXJjZW1hcD86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgdGFyZ2V0Pzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHBsYXRmb3JtPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG91dGZpbGU/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGxvYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgIHJlYWRvbmx5IGZvcm1hdD86IHN0cmluZztcbiAgICByZWFkb25seSBtaW5pZnk/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHNvdXJjZXNDb250ZW50PzogYm9vbGVhbjtcbiAgICByZWFkb25seSBtYWluRmllbGRzPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGJhbm5lcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGVPcHRpb25zIHtcbiAgICByZWFkb25seSBlbnRyeXBvaW50OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgZXh0ZW5zaW9uOiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgY29uc3RydWN0RmlsZT86IHN0cmluZztcbiAgICByZWFkb25seSBjb25zdHJ1Y3ROYW1lPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGJ1bmRsaW5nT3B0aW9ucz86IEJ1bmRsaW5nT3B0aW9ucztcbn1cblxuZXhwb3J0IGNsYXNzIExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogTGFtYmRhRnVuY3Rpb25Db2RlQnVuZGxlT3B0aW9ucykge1xuICAgICAgICBzdXBlcihwcm9qZWN0KTtcblxuICAgICAgICBjb25zdCBidW5kbGVyID0gQnVuZGxlci5vZihwcm9qZWN0KTtcbiAgICAgICAgaWYgKCFidW5kbGVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBidW5kbGVyIGZvdW5kLiBQbGVhc2UgYWRkIGEgQnVuZGxlciBjb21wb25lbnQgdG8geW91ciBwcm9qZWN0LlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGVzbGludCA9IGphdmFzY3JpcHQuRXNsaW50Lm9mKHByb2plY3QpO1xuICAgICAgICBlc2xpbnQ/LmFsbG93RGV2RGVwcyhvcHRpb25zLmVudHJ5cG9pbnQpO1xuXG4gICAgICAgIGNvbnN0IGVudHJ5cG9pbnQgPSBvcHRpb25zLmVudHJ5cG9pbnQ7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IG9wdGlvbnMuZXh0ZW5zaW9uID8/IFwiLmxhbWJkYS50c1wiO1xuXG4gICAgICAgIGlmICghZW50cnlwb2ludC5lbmRzV2l0aChleHRlbnNpb24pKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZW50cnlwb2ludH0gbXVzdCBoYXZlIGEgJHtleHRlbnNpb259IGV4dGVuc2lvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBwYXRoLnBvc2l4LmpvaW4ocGF0aC5kaXJuYW1lKGVudHJ5cG9pbnQpLCBwYXRoLmJhc2VuYW1lKGVudHJ5cG9pbnQsIGV4dGVuc2lvbikpO1xuICAgICAgICBjb25zdCBjb25zdHJ1Y3RGaWxlID0gb3B0aW9ucy5jb25zdHJ1Y3RGaWxlID8/IGAke2Jhc2VQYXRofS1jb2RlLnRzYDtcblxuICAgICAgICBpZiAocGF0aC5leHRuYW1lKGNvbnN0cnVjdEZpbGUpICE9PSBcIi50c1wiKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvbnN0cnVjdCBmaWxlIG5hbWUgXCIke2NvbnN0cnVjdEZpbGV9XCIgbXVzdCBoYXZlIGEgLnRzIGV4dGVuc2lvbmApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uc3RydWN0TmFtZSA9IG9wdGlvbnMuY29uc3RydWN0TmFtZSA/PyBgJHtwYXNjYWwocGF0aC5iYXNlbmFtZShiYXNlUGF0aCkpfUZ1bmN0aW9uQ29kZWA7XG5cbiAgICAgICAgY29uc3QgYnVuZGxlID0gYnVuZGxlci5hZGRCdW5kbGUoZW50cnlwb2ludCwge1xuICAgICAgICAgICAgLi4ub3B0aW9ucy5idW5kbGluZ09wdGlvbnMsXG4gICAgICAgICAgICB0c2NvbmZpZ1BhdGg6IChwcm9qZWN0IGFzIHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3QpPy50c2NvbmZpZ0Rldj8uZmlsZU5hbWUsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG91dGZpbGVBYnMgPSBwYXRoLmpvaW4ocHJvamVjdC5vdXRkaXIsIGJ1bmRsZS5vdXRmaWxlKTtcbiAgICAgICAgY29uc3QgY29uc3RydWN0QWJzID0gcGF0aC5qb2luKHByb2plY3Qub3V0ZGlyLCBjb25zdHJ1Y3RGaWxlKTtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVPdXRmaWxlID0gcGF0aC5yZWxhdGl2ZShwYXRoLmRpcm5hbWUoY29uc3RydWN0QWJzKSwgcGF0aC5kaXJuYW1lKG91dGZpbGVBYnMpKTtcblxuICAgICAgICBjb25zdCBzcmMgPSBuZXcgU291cmNlQ29kZShwcm9qZWN0LCBjb25zdHJ1Y3RGaWxlKTtcbiAgICAgICAgaWYgKHNyYy5tYXJrZXIpIHtcbiAgICAgICAgICAgIHNyYy5saW5lKGAvLyAke3NyYy5tYXJrZXJ9YCk7XG4gICAgICAgIH1cbiAgICAgICAgc3JjLmxpbmUoXCJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1wiKTtcbiAgICAgICAgc3JjLmxpbmUoXCJpbXBvcnQgeyBhd3NfbGFtYmRhIH0gZnJvbSAnYXdzLWNkay1saWInO1wiKTtcbiAgICAgICAgc3JjLmxpbmUoKTtcbiAgICAgICAgc3JjLm9wZW4oYGV4cG9ydCBjb25zdCAke2NvbnN0cnVjdE5hbWV9ID0gYXdzX2xhbWJkYS5Db2RlLmZyb21Bc3NldChgKTtcbiAgICAgICAgc3JjLmxpbmUoYHBhdGguam9pbihfX2Rpcm5hbWUsICcke2NvbnZlcnRUb1Bvc2l4UGF0aChyZWxhdGl2ZU91dGZpbGUpfScpLGApO1xuICAgICAgICBzcmMuY2xvc2UoXCIpO1wiKTtcblxuICAgICAgICB0aGlzLnByb2plY3QubG9nZ2VyLnZlcmJvc2UoYCR7YmFzZVBhdGh9OiBjb25zdHJ1Y3QgXCIke2NvbnN0cnVjdE5hbWV9XCIgZ2VuZXJhdGVkIHVuZGVyIFwiJHtjb25zdHJ1Y3RGaWxlfVwiYCk7XG4gICAgICAgIHRoaXMucHJvamVjdC5sb2dnZXIudmVyYm9zZShgJHtiYXNlUGF0aH06IGJ1bmRsZSB0YXNrIFwiJHtidW5kbGUuYnVuZGxlVGFzay5uYW1lfVwiYCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZXJPcHRpb25zIHtcbiAgICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcbiAgICByZWFkb25seSBzcmNkaXI6IHN0cmluZztcbiAgICByZWFkb25seSBidW5kbGVPcHRpb25zPzogTGFtYmRhRnVuY3Rpb25Db2RlQnVuZGxlT3B0aW9ucztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIExhbWJkYSBGdW5jdGlvbiBjb2RlIGJ1bmRsZXMgZnJvbSBlbnRyeXBvaW50cyBkaXNjb3ZlcmVkIGluIHRoZSBwcm9qZWN0J3Mgc291cmNlIHRyZWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGVyIGV4dGVuZHMgY2RrLkF1dG9EaXNjb3ZlckJhc2Uge1xuICAgIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZXJPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKHByb2plY3QsIHtcbiAgICAgICAgICAgIHByb2plY3RkaXI6IG9wdGlvbnMuc3JjZGlyLFxuICAgICAgICAgICAgZXh0ZW5zaW9uOiBvcHRpb25zLmV4dGVuc2lvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBlbnRyeXBvaW50IG9mIHRoaXMuZW50cnlwb2ludHMpIHtcbiAgICAgICAgICAgIG5ldyBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGUodGhpcy5wcm9qZWN0LCB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucy5idW5kbGVPcHRpb25zLFxuICAgICAgICAgICAgICAgIGVudHJ5cG9pbnQ6IGVudHJ5cG9pbnQsXG4gICAgICAgICAgICAgICAgZXh0ZW5zaW9uOiBvcHRpb25zLmV4dGVuc2lvbixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
292
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVuZGxlLWxhbWJkYS1mdW5jdGlvbi1jb2RlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvYnVuZGxlLWxhbWJkYS1mdW5jdGlvbi1jb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW1CQSw0Q0FTQztBQUtELGdEQUVDOztBQW5DRCxnREFBa0M7QUFDbEMseUNBQXlFO0FBQ3pFLCtCQUE4QjtBQUM5QixtQ0FTZ0I7QUFFaEI7Ozs7R0FJRztBQUNILFNBQWdCLGdCQUFnQixDQUFDLFVBQWtCO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUEsZ0JBQUksRUFBQyxVQUFVLENBQUMsQ0FBQyxLQUFLLENBQUMsZUFBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDckIsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsNERBQTREO0lBQy9FLENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQUcsQ0FBQyxDQUFDO0lBQzFCLE1BQU0sR0FBRyxHQUFHLElBQUEsbUJBQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztJQUN2QixNQUFNLElBQUksR0FBRyxJQUFBLG9CQUFRLEVBQUMsQ0FBQyxFQUFFLElBQUEsbUJBQU8sRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sSUFBQSxnQkFBSSxFQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxDQUFTO0lBQ3hDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBb0NEOzs7R0FHRztBQUNILE1B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QUFDLHlCQUF5QixrQkFBa0IsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxRQUFRLGdCQUFnQixhQUFhLHNCQUFzQixhQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQzVHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsa0JBQWtCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN4RixDQUFDOztBQXhETCw0REF5REM7QUE2QkQ7O0dBRUc7QUFDSCxNQUFhLHlCQUEwQixTQUFRLFlBQUcsQ0FBQyxnQkFBZ0I7O0lBQy9ELFlBQVksT0FBZ0IsRUFBRSxPQUF5QztRQUNuRSxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQ1gsVUFBVSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQzFCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztTQUMvQixDQUFDLENBQUM7UUFFSCxLQUFLLE1BQU0sVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN4QyxJQUFJLHdCQUF3QixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7Z0JBQ3ZDLEdBQUcsT0FBTyxDQUFDLGFBQWE7Z0JBQ3hCLFVBQVUsRUFBRSxVQUFVO2dCQUN0QixTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7YUFDL0IsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUM7O0FBZEwsOERBZUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGJhc2VuYW1lLCBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCBwb3NpeCwgc2VwIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgcGFzY2FsIH0gZnJvbSBcImNhc2VcIjtcbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIGNkayxcbiAgICBEZXBlbmRlbmN5VHlwZSxcbiAgICBqYXZhc2NyaXB0LFxuICAgIHR5cGUgUHJvamVjdCxcbiAgICBTb3VyY2VDb2RlLFxuICAgIHR5cGUgVGFzayxcbiAgICB0eXBlIHR5cGVzY3JpcHQsXG59IGZyb20gXCJwcm9qZW5cIjtcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBidW5kbGUgbmFtZSBvZiBhbiBlbnRyeXBvaW50OiBpdHMgcGF0aCB3aXRob3V0IHRoZSBleHRlbnNpb24gYW5kIHdpdGhvdXQgYSBsZWFkaW5nIGBzcmNgIGRpcmVjdG9yeS5cbiAqXG4gKiBAZXhhbXBsZSByZW5kZXJCdW5kbGVOYW1lKFwic3JjL2hhbmRsZXJzL2Zvby5sYW1iZGEudHNcIikgLy8gXCJoYW5kbGVycy9mb28ubGFtYmRhXCJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckJ1bmRsZU5hbWUoZW50cnlwb2ludDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFydHMgPSBqb2luKGVudHJ5cG9pbnQpLnNwbGl0KHNlcCk7XG4gICAgaWYgKHBhcnRzWzBdID09PSBcInNyY1wiKSB7XG4gICAgICAgIHBhcnRzLnNoaWZ0KCk7IC8vIGp1c3QgcmVtb3ZlICdzcmMnIGlmIGl0cyB0aGUgZmlyc3QgZWxlbWVudCBmb3IgZXJnb25vbWljc1xuICAgIH1cbiAgICBjb25zdCBwID0gcGFydHMuam9pbihzZXApO1xuICAgIGNvbnN0IGRpciA9IGRpcm5hbWUocCk7XG4gICAgY29uc3QgYmFzZSA9IGJhc2VuYW1lKHAsIGV4dG5hbWUocCkpO1xuICAgIHJldHVybiBqb2luKGRpciwgYmFzZSk7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGdpdmVuIHBhdGggc3RyaW5nIHRvIHBvc2l4IGlmIGl0IHdhc24ndCBhbHJlYWR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvUG9zaXhQYXRoKHA6IHN0cmluZykge1xuICAgIHJldHVybiBwLnNwbGl0KHNlcCkuam9pbihwb3NpeC5zZXApO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBCdW5kbGVyYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCdW5kbGVyT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIHNlbWFudGljIHZlcnNpb24gcmVxdWlyZW1lbnQgZm9yIGBlc2J1aWxkYC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IC0gbm8gc3BlY2lmaWMgdmVyc2lvbiAoaW1wbGllcyBsYXRlc3QpXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXNidWlsZFZlcnNpb24/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZGlyZWN0b3J5IGZvciBhbGwgYnVuZGxlcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiYXNzZXRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBhc3NldHNEaXI/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBJbnN0YWxsIHRoZSBgYnVuZGxlYCBjb21tYW5kIGFzIGEgcHJlLWNvbXBpbGUgcGhhc2UuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcmVhZG9ubHkgYWRkVG9QcmVDb21waWxlPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIE1hcCBvZiBmaWxlIGV4dGVuc2lvbnMgKHdpdGhvdXQgZG90KSBhbmQgbG9hZGVycyB0byB1c2UgZm9yIHRoaXMgZmlsZSB0eXBlLlxuICAgICAqIExvYWRlcnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBlc2J1aWxkIGNvbW1hbmQgYnkgYC0tbG9hZGVyOi5leHRlbnNpb249bG9hZGVyYFxuICAgICAqXG4gICAgICogQGRlZmF1bHQgLSBubyBsb2FkZXJzXG4gICAgICovXG4gICAgcmVhZG9ubHkgbG9hZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG59XG5cbi8qKlxuICogQWRkcyBzdXBwb3J0IGZvciBidW5kbGluZyBKYXZhU2NyaXB0IGFwcGxpY2F0aW9ucyBhbmQgZGVwZW5kZW5jaWVzIGludG8gYVxuICogc2luZ2xlIGZpbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBCdW5kbGVyIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBgQnVuZGxlcmAgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGEgcHJvamVjdCBvciBgdW5kZWZpbmVkYCBpZlxuICAgICAqIHRoZXJlIGlzIG5vIEJ1bmRsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJvamVjdCBUaGUgcHJvamVjdFxuICAgICAqIEByZXR1cm5zIEEgYnVuZGxlclxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgb2YocHJvamVjdDogUHJvamVjdCk6IEJ1bmRsZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBpc0J1bmRsZXIgPSAobzogQ29tcG9uZW50KTogbyBpcyBCdW5kbGVyID0+IG8gaW5zdGFuY2VvZiBCdW5kbGVyO1xuICAgICAgICByZXR1cm4gcHJvamVjdC5jb21wb25lbnRzLmZpbmQoaXNCdW5kbGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgc2VtYW50aWMgdmVyc2lvbiByZXF1aXJlbWVudCBmb3IgYGVzYnVpbGRgIChpZiBkZWZpbmVkKS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZXNidWlsZFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqIFJvb3QgYnVuZGxlIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgYnVuZGxlZGlyOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIF90YXNrOiBUYXNrIHwgdW5kZWZpbmVkO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgYWRkVG9QcmVDb21waWxlOiBib29sZWFuO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbG9hZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgYEJ1bmRsZXJgLlxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKHByb2plY3Q6IFByb2plY3QsIG9wdGlvbnM6IEJ1bmRsZXJPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCk7XG4gICAgICAgIHRoaXMuZXNidWlsZFZlcnNpb24gPSBvcHRpb25zLmVzYnVpbGRWZXJzaW9uO1xuICAgICAgICB0aGlzLmJ1bmRsZWRpciA9IG9wdGlvbnMuYXNzZXRzRGlyID8/IFwiYXNzZXRzXCI7XG4gICAgICAgIHRoaXMuYWRkVG9QcmVDb21waWxlID0gb3B0aW9ucy5hZGRUb1ByZUNvbXBpbGUgPz8gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkZXJzID0gb3B0aW9ucy5sb2FkZXJzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgb3IgY3JlYXRlcyB0aGUgc2luZ2xldG9uIFwiYnVuZGxlXCIgdGFzayBvZiB0aGUgcHJvamVjdC5cbiAgICAgKlxuICAgICAqIElmIHRoZSBwcm9qZWN0IGRvZXNuJ3QgaGF2ZSBhIFwiYnVuZGxlXCIgdGFzaywgaXQgd2lsbCBiZSBjcmVhdGVkIGFuZCBzcGF3bmVkXG4gICAgICogZHVyaW5nIHRoZSBwcmUtY29tcGlsZSBwaGFzZSAodW5sZXNzIGBhZGRUb1ByZUNvbXBpbGVgIGlzIGBmYWxzZWApLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgYnVuZGxlVGFzaygpOiBUYXNrIHtcbiAgICAgICAgaWYgKCF0aGlzLl90YXNrKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEJ1bmRsaW5nU3VwcG9ydCgpO1xuICAgICAgICAgICAgdGhpcy5fdGFzayA9IHRoaXMucHJvamVjdC50YXNrcy5hZGRUYXNrKFwiYnVuZGxlXCIsIHtcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJQcmVwYXJlIGFzc2V0c1wiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGhpcy5hZGRUb1ByZUNvbXBpbGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb2plY3QucHJlQ29tcGlsZVRhc2suc3Bhd24odGhpcy5fdGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3Rhc2s7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkcyBhIHRhc2sgdG8gdGhlIHByb2plY3Qgd2hpY2ggYnVuZGxlcyBhIHNwZWNpZmljIGVudHJ5cG9pbnQgYW5kIGFsbCBvZlxuICAgICAqIGl0cyBkZXBlbmRlbmNpZXMgaW50byBhIHNpbmdsZSBqYXZhc2NyaXB0IG91dHB1dCBmaWxlLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVudHJ5cG9pbnQgVGhlIHJlbGF0aXZlIHBhdGggb2YgdGhlIGFydGlmYWN0IHdpdGhpbiB0aGUgcHJvamVjdFxuICAgICAqIEBwYXJhbSBvcHRpb25zIEJ1bmRsaW5nIG9wdGlvbnNcbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQnVuZGxlKGVudHJ5cG9pbnQ6IHN0cmluZywgb3B0aW9uczogQnVuZGxpbmdPcHRpb25zKTogQnVuZGxlIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHJlbmRlckJ1bmRsZU5hbWUoZW50cnlwb2ludCk7XG4gICAgICAgIGNvbnN0IG91dGRpciA9IHBhdGgucG9zaXguam9pbih0aGlzLmJ1bmRsZWRpciwgbmFtZSk7XG4gICAgICAgIGNvbnN0IG91dGZpbGUgPSBwYXRoLnBvc2l4LmpvaW4ob3V0ZGlyLCBvcHRpb25zLm91dGZpbGUgPz8gXCJpbmRleC5tanNcIik7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnMudGFyZ2V0ID8/IFwiZXNuZXh0XCI7XG4gICAgICAgIGNvbnN0IHBsYXRmb3JtID0gb3B0aW9ucy5wbGF0Zm9ybSA/PyBcIm5vZGVcIjtcbiAgICAgICAgY29uc3QgZm9ybWF0ID0gb3B0aW9ucy5mb3JtYXQgPz8gXCJlc21cIjtcbiAgICAgICAgY29uc3Qgc291cmNlbWFwID0gb3B0aW9ucy5zb3VyY2VtYXAgPz8gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc291cmNlc0NvbnRlbnQgPSBvcHRpb25zLnNvdXJjZXNDb250ZW50ID8/IGZhbHNlO1xuICAgICAgICBjb25zdCBtaW5pZnkgPSBvcHRpb25zLm1pbmlmeSA/PyB0cnVlO1xuICAgICAgICBjb25zdCBtYWluRmllbGRzID0gb3B0aW9ucy5tYWluRmllbGRzID8/IFwibW9kdWxlLG1haW5cIjtcbiAgICAgICAgY29uc3QgYmFubmVyID1cbiAgICAgICAgICAgIG9wdGlvbnMuYmFubmVyID8/XG4gICAgICAgICAgICBcIjpqcz1pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIGFzIHRvcExldmVsQ3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSc7Y29uc3QgcmVxdWlyZSA9IHRvcExldmVsQ3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXCI7XG5cbiAgICAgICAgY29uc3QgYXJncyA9IFtcbiAgICAgICAgICAgIFwiZXNidWlsZFwiLFxuICAgICAgICAgICAgXCItLWJ1bmRsZVwiLFxuICAgICAgICAgICAgZW50cnlwb2ludCxcbiAgICAgICAgICAgIGAtLXRhcmdldD1cIiR7dGFyZ2V0fVwiYCxcbiAgICAgICAgICAgIGAtLXBsYXRmb3JtPVwiJHtwbGF0Zm9ybX1cImAsXG4gICAgICAgICAgICBgLS1vdXRmaWxlPVwiJHtvdXRmaWxlfVwiYCxcbiAgICAgICAgXTtcblxuICAgICAgICBjb25zdCB0c2NvbmZpZyA9IG9wdGlvbnMudHNjb25maWdQYXRoID8/IGZhbHNlO1xuICAgICAgICBpZiAodHNjb25maWcpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChgLS10c2NvbmZpZz1cIiR7dHNjb25maWd9XCJgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgeCBvZiBvcHRpb25zLmV4dGVybmFscyA/PyBbXSkge1xuICAgICAgICAgICAgYXJncy5wdXNoKGAtLWV4dGVybmFsOiR7eH1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3VyY2VtYXApIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChcIi0tc291cmNlbWFwXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNvdXJjZXNDb250ZW50KSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goYC0tc291cmNlcy1jb250ZW50PSR7c291cmNlc0NvbnRlbnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWluaWZ5KSB7XG4gICAgICAgICAgICBhcmdzLnB1c2goXCItLW1pbmlmeVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JtYXQpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChgLS1mb3JtYXQ9JHtmb3JtYXR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWFpbkZpZWxkcykge1xuICAgICAgICAgICAgYXJncy5wdXNoKGAtLW1haW4tZmllbGRzPSR7bWFpbkZpZWxkc31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChiYW5uZXIpIHtcbiAgICAgICAgICAgIGFyZ3MucHVzaChgLS1iYW5uZXIke2Jhbm5lcn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvYWRlcnMgPSAob3B0aW9ucy5sb2FkZXJzID8/IGZhbHNlKSA/IG9wdGlvbnMubG9hZGVycyA6ICh0aGlzLmxvYWRlcnMgPz8gZmFsc2UpO1xuICAgICAgICBpZiAobG9hZGVycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZXh0ZW5zaW9uLCBsb2FkZXJdIG9mIE9iamVjdC5lbnRyaWVzKGxvYWRlcnMpKSB7XG4gICAgICAgICAgICAgICAgYXJncy5wdXNoKGAtLWxvYWRlcjouJHtleHRlbnNpb259PSR7bG9hZGVyfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnVuZGxlVGFzayA9IHRoaXMucHJvamVjdC5hZGRUYXNrKGBidW5kbGU6JHtuYW1lfWAsIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ3JlYXRlIGEgSmF2YVNjcmlwdCBidW5kbGUgZnJvbSAke2VudHJ5cG9pbnR9YCxcbiAgICAgICAgICAgIGV4ZWM6IGFyZ3Muam9pbihcIiBcIiksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYnVuZGxlVGFzay5zcGF3bihidW5kbGVUYXNrKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYnVuZGxlVGFzazogYnVuZGxlVGFzayxcbiAgICAgICAgICAgIG91dGRpcjogb3V0ZGlyLFxuICAgICAgICAgICAgb3V0ZmlsZTogb3V0ZmlsZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYnVuZGxpbmcgc3VwcG9ydCB0byBhIHByb2plY3QuIFRoaXMgaXMgY2FsbGVkIGltcGxpY2l0bHkgd2hlblxuICAgICAqIGBidW5kbGVUYXNrYCBpcyByZWZlcmVuY2VkIGZpcnN0LiBJdCBhZGRzIHRoZSBkZXBlbmRlbmN5IG9uIGBlc2J1aWxkYCxcbiAgICAgKiBnaXRpZ25vcmUvbnBtaWdub3JlLCBldGMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBhZGRCdW5kbGluZ1N1cHBvcnQoKSB7XG4gICAgICAgIGNvbnN0IGlnbm9yZUVudHJ5ID0gYC8ke3RoaXMuYnVuZGxlZGlyfS9gO1xuICAgICAgICB0aGlzLnByb2plY3QuYWRkR2l0SWdub3JlKGlnbm9yZUVudHJ5KTtcbiAgICAgICAgdGhpcy5wcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYCEke2lnbm9yZUVudHJ5fWApO1xuICAgICAgICBjb25zdCBkZXAgPSB0aGlzLmVzYnVpbGRWZXJzaW9uID8gYGVzYnVpbGRAJHt0aGlzLmVzYnVpbGRWZXJzaW9ufWAgOiBcImVzYnVpbGRcIjtcbiAgICAgICAgdGhpcy5wcm9qZWN0LmRlcHMuYWRkRGVwZW5kZW5jeShkZXAsIERlcGVuZGVuY3lUeXBlLkJVSUxEKTtcbiAgICB9XG59XG5cbi8qKlxuICogQSBidW5kbGUgY3JlYXRlZCBieSBgQnVuZGxlci5hZGRCdW5kbGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmRsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRhc2sgdGhhdCBwcm9kdWNlcyB0aGlzIGJ1bmRsZS5cbiAgICAgKi9cbiAgICByZWFkb25seSBidW5kbGVUYXNrOiBUYXNrO1xuXG4gICAgLyoqXG4gICAgICogTG9jYXRpb24gb2YgdGhlIG91dHB1dCBmaWxlIChyZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3QpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG91dGZpbGU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEJhc2UgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIG91dHB1dCBmaWxlIChyZWxhdGl2ZSB0byBwcm9qZWN0IHJvb3QpLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IG91dGRpcjogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGJ1bmRsaW5nLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJ1bmRsaW5nT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogWW91IGNhbiBtYXJrIGEgZmlsZSBvciBhIHBhY2thZ2UgYXMgZXh0ZXJuYWwgdG8gZXhjbHVkZSBpdCBmcm9tIHlvdXIgYnVpbGQuXG4gICAgICogSW5zdGVhZCBvZiBiZWluZyBidW5kbGVkLCB0aGUgaW1wb3J0IHdpbGwgYmUgcHJlc2VydmVkICh1c2luZyByZXF1aXJlIGZvclxuICAgICAqIHRoZSBpaWZlIGFuZCBjanMgZm9ybWF0cyBhbmQgdXNpbmcgaW1wb3J0IGZvciB0aGUgZXNtIGZvcm1hdCkgYW5kIHdpbGwgYmVcbiAgICAgKiBldmFsdWF0ZWQgYXQgcnVuIHRpbWUgaW5zdGVhZC5cbiAgICAgKlxuICAgICAqIFRoaXMgaGFzIHNldmVyYWwgdXNlcy4gRmlyc3Qgb2YgYWxsLCBpdCBjYW4gYmUgdXNlZCB0byB0cmltIHVubmVjZXNzYXJ5XG4gICAgICogY29kZSBmcm9tIHlvdXIgYnVuZGxlIGZvciBhIGNvZGUgcGF0aCB0aGF0IHlvdSBrbm93IHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQuXG4gICAgICogRm9yIGV4YW1wbGUsIGEgcGFja2FnZSBtYXkgY29udGFpbiBjb2RlIHRoYXQgb25seSBydW5zIGluIG5vZGUgYnV0IHlvdSB3aWxsXG4gICAgICogb25seSBiZSB1c2luZyB0aGF0IHBhY2thZ2UgaW4gdGhlIGJyb3dzZXIuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gaW1wb3J0XG4gICAgICogY29kZSBpbiBub2RlIGF0IHJ1biB0aW1lIGZyb20gYSBwYWNrYWdlIHRoYXQgY2Fubm90IGJlIGJ1bmRsZWQuIEZvclxuICAgICAqIGV4YW1wbGUsIHRoZSBmc2V2ZW50cyBwYWNrYWdlIGNvbnRhaW5zIGEgbmF0aXZlIGV4dGVuc2lvbiwgd2hpY2ggZXNidWlsZFxuICAgICAqIGRvZXNuJ3Qgc3VwcG9ydC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFtdXG4gICAgICovXG4gICAgcmVhZG9ubHkgZXh0ZXJuYWxzPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGEgc291cmNlIG1hcCBpbiB0aGUgYnVuZGxlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNvdXJjZW1hcD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBlc2J1aWxkIHRhcmdldC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiZXNuZXh0XCJcbiAgICAgKi9cbiAgICByZWFkb25seSB0YXJnZXQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBlc2J1aWxkIHBsYXRmb3JtLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJub2RlXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBwbGF0Zm9ybT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEJ1bmRsZXIgb3V0cHV0IHBhdGggcmVsYXRpdmUgdG8gdGhlIGFzc2V0J3Mgb3V0cHV0IGRpcmVjdG9yeS5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiaW5kZXgubWpzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBvdXRmaWxlPzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIHBhdGggb2YgdGhlIHRzY29uZmlnLmpzb24gZmlsZSB0byB1c2UgZm9yIGJ1bmRsaW5nLlxuICAgICAqXG4gICAgICogYExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZWAgYWx3YXlzIHNldHMgdGhpcyB0byB0aGUgcHJvamVjdCdzIGRldmVsb3BtZW50IHRzY29uZmlnLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgLSBubyB0c2NvbmZpZyBpcyBwYXNzZWQgdG8gZXNidWlsZFxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRzY29uZmlnUGF0aD86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE1hcCBvZiBmaWxlIGV4dGVuc2lvbnMgKHdpdGhvdXQgZG90KSBhbmQgbG9hZGVycyB0byB1c2UgZm9yIHRoaXMgZmlsZSB0eXBlLlxuICAgICAqIExvYWRlcnMgYXJlIGFwcGVuZGVkIHRvIHRoZSBlc2J1aWxkIGNvbW1hbmQgYnkgYC0tbG9hZGVyOi5leHRlbnNpb249bG9hZGVyYFxuICAgICAqXG4gICAgICogQGRlZmF1bHQgLSB0aGUgbG9hZGVycyBvZiB0aGUgYEJ1bmRsZXJgXG4gICAgICovXG4gICAgcmVhZG9ubHkgbG9hZGVycz86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH07XG5cbiAgICAvKipcbiAgICAgKiBPdXRwdXQgZm9ybWF0IGZvciB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQgZmlsZXM6IGBcImlpZmVcImAsIGBcImNqc1wiYCBvciBgXCJlc21cImAuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcImVzbVwiXG4gICAgICogQHNlZSBodHRwczovL2VzYnVpbGQuZ2l0aHViLmlvL2FwaS8jZm9ybWF0XG4gICAgICovXG4gICAgcmVhZG9ubHkgZm9ybWF0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogTWluaWZ5IHRoZSBidW5kbGUuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICogQHNlZSBodHRwczovL2VzYnVpbGQuZ2l0aHViLmlvL2FwaS8jbWluaWZ5XG4gICAgICovXG4gICAgcmVhZG9ubHkgbWluaWZ5PzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlIGluIHRoZSBzb3VyY2UgbWFwLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgKiBAc2VlIGh0dHBzOi8vZXNidWlsZC5naXRodWIuaW8vYXBpLyNzb3VyY2VzLWNvbnRlbnRcbiAgICAgKi9cbiAgICByZWFkb25seSBzb3VyY2VzQ29udGVudD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBgcGFja2FnZS5qc29uYCBmaWVsZHMgZXNidWlsZCB0cmllcyB3aGVuIHJlc29sdmluZyBhIHBhY2thZ2UuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIm1vZHVsZSxtYWluXCJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZXNidWlsZC5naXRodWIuaW8vYXBpLyNtYWluLWZpZWxkc1xuICAgICAqL1xuICAgIHJlYWRvbmx5IG1haW5GaWVsZHM/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBlc2J1aWxkIGAtLWJhbm5lcmAgYXJndW1lbnQsIGFwcGVuZGVkIGFzIGlzIChzbyBpdCBzdGFydHMgd2l0aCB0aGUgZmlsZSB0eXBlLCBlLmcuIGA6anM9YCkuXG4gICAgICpcbiAgICAgKiBUaGUgZGVmYXVsdCBkZWZpbmVzIGByZXF1aXJlYCBzbyB0aGF0IENvbW1vbkpTIGRlcGVuZGVuY2llcyB3b3JrIGluIGFuIEVTIG1vZHVsZSBidW5kbGUuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIjpqcz1pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIGFzIHRvcExldmVsQ3JlYXRlUmVxdWlyZSB9IGZyb20gJ21vZHVsZSc7Y29uc3QgcmVxdWlyZSA9IHRvcExldmVsQ3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpXCJcbiAgICAgKiBAc2VlIGh0dHBzOi8vZXNidWlsZC5naXRodWIuaW8vYXBpLyNiYW5uZXJcbiAgICAgKi9cbiAgICByZWFkb25seSBiYW5uZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Db2RlQnVuZGxlT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBwYXRoIGZyb20gdGhlIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkgdG8gYSBUeXBlU2NyaXB0IGZpbGUgd2hpY2ggY29udGFpbnNcbiAgICAgKiB0aGUgQVdTIExhbWJkYSBoYW5kbGVyIGVudHJ5cG9pbnQgKGV4cG9ydHMgYSBgaGFuZGxlcmAgZnVuY3Rpb24pLlxuICAgICAqXG4gICAgICogVGhpcyBpcyByZWxhdGl2ZSB0byB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QuXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBcInNyYy9zdWJkaXIvZm9vLmxhbWJkYS50c1wiXG4gICAgICovXG4gICAgcmVhZG9ubHkgZW50cnlwb2ludDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogU3VmZml4IGZvciBBV1MgTGFtYmRhIGhhbmRsZXJzLlxuICAgICAqXG4gICAgICogQGV4YW1wbGUgXCIubGFtYmRhLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBleHRlbnNpb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgVHlwZVNjcmlwdCBzb3VyY2UgZmlsZS4gVGhpcyBmaWxlIHNob3VsZCBhbHNvIGJlXG4gICAgICogdW5kZXIgdGhlIHNvdXJjZSB0cmVlLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgLSBUaGUgcGF0aCBvZiB0aGUgZW50cnlwb2ludCBmaWxlLCB3aXRoIHRoZSBgLWNvZGUudHNgIHN1ZmZpeFxuICAgICAqIGluc3RlYWQgb2YgdGhlIGV4dGVuc2lvbiAoZS5nLiBgc3JjL2Zvby1jb2RlLnRzYCkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29uc3RydWN0RmlsZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgYGF3c19sYW1iZGEuQ29kZWAgY29uc3RhbnQuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAtIEEgcGFzY2FsIGNhc2VkIHZlcnNpb24gb2YgdGhlIG5hbWUgb2YgdGhlIGVudHJ5cG9pbnQgZmlsZSwgd2l0aFxuICAgICAqIHRoZSBzdWZmaXggYEZ1bmN0aW9uQ29kZWAgKGUuZy4gYFJlc2l6ZUltYWdlRnVuY3Rpb25Db2RlYCkuXG4gICAgICovXG4gICAgcmVhZG9ubHkgY29uc3RydWN0TmFtZT86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEJ1bmRsaW5nIG9wdGlvbnMgZm9yIHRoaXMgQVdTIExhbWJkYSBGdW5jdGlvbi5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHRzIG9mIGBCdW5kbGluZ09wdGlvbnNgXG4gICAgICovXG4gICAgcmVhZG9ubHkgYnVuZGxpbmdPcHRpb25zPzogQnVuZGxpbmdPcHRpb25zO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHByZS1idW5kbGVkIEFXUyBMYW1iZGEgRnVuY3Rpb24gY29kZSBhc3NldCBmcm9tIGhhbmRsZXIgY29kZS5cbiAqXG4gKiBBZGRzIGEgdGFzayB0byB0aGUgcHJvamVjdCdzIGBCdW5kbGVyYCB0aGF0IHVzZXMgYGVzYnVpbGRgIHRvIGJ1bmRsZSB0aGVcbiAqIGhhbmRsZXIgaW50byB0aGUgYXNzZXRzIGRpcmVjdG9yeSwgYW5kIGdlbmVyYXRlcyBhIGZpbGUgKGUuZy4gYHNyYy9mb28tY29kZS50c2ApXG4gKiBleHBvcnRpbmcgYW4gYGF3c19sYW1iZGEuQ29kZWAgY29uc3RhbnQgKGUuZy4gYEZvb0Z1bmN0aW9uQ29kZWApIHRoYXQgcG9pbnRzIHRvXG4gKiB0aGUgYnVuZGxlLiBQYXNzIGl0IGFzIHRoZSBgY29kZWAgb2YgYW4gYGF3c19sYW1iZGEuRnVuY3Rpb25gLlxuICpcbiAqIFJlcXVpcmVzIGEgYEJ1bmRsZXJgIGNvbXBvbmVudCBpbiB0aGUgcHJvamVjdC5cbiAqXG4gKiBAZXhhbXBsZVxuICpcbiAqIG5ldyBCdW5kbGVyKG15UHJvamVjdCk7XG4gKiBuZXcgTGFtYmRhRnVuY3Rpb25Db2RlQnVuZGxlKG15UHJvamVjdCwge1xuICogICBlbnRyeXBvaW50OiBcInNyYy9mb28ubGFtYmRhLnRzXCIsXG4gKiAgIGV4dGVuc2lvbjogXCIubGFtYmRhLnRzXCIsXG4gKiB9KTtcbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZSBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgLyoqXG4gICAgICogRGVmaW5lcyBhIHByZS1idW5kbGVkIEFXUyBMYW1iZGEgRnVuY3Rpb24gY29kZSBhc3NldCBmcm9tIGhhbmRsZXIgY29kZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwcm9qZWN0IFRoZSBwcm9qZWN0IHRvIHVzZVxuICAgICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGVPcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKHByb2plY3QpO1xuXG4gICAgICAgIGNvbnN0IGJ1bmRsZXIgPSBCdW5kbGVyLm9mKHByb2plY3QpO1xuICAgICAgICBpZiAoIWJ1bmRsZXIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGJ1bmRsZXIgZm91bmQuIFBsZWFzZSBhZGQgYSBCdW5kbGVyIGNvbXBvbmVudCB0byB5b3VyIHByb2plY3QuXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXNsaW50ID0gamF2YXNjcmlwdC5Fc2xpbnQub2YocHJvamVjdCk7XG4gICAgICAgIGVzbGludD8uYWxsb3dEZXZEZXBzKG9wdGlvbnMuZW50cnlwb2ludCk7XG5cbiAgICAgICAgY29uc3QgZW50cnlwb2ludCA9IG9wdGlvbnMuZW50cnlwb2ludDtcbiAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gb3B0aW9ucy5leHRlbnNpb24gPz8gXCIubGFtYmRhLnRzXCI7XG5cbiAgICAgICAgaWYgKCFlbnRyeXBvaW50LmVuZHNXaXRoKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtlbnRyeXBvaW50fSBtdXN0IGhhdmUgYSAke2V4dGVuc2lvbn0gZXh0ZW5zaW9uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHBhdGgucG9zaXguam9pbihwYXRoLmRpcm5hbWUoZW50cnlwb2ludCksIHBhdGguYmFzZW5hbWUoZW50cnlwb2ludCwgZXh0ZW5zaW9uKSk7XG4gICAgICAgIGNvbnN0IGNvbnN0cnVjdEZpbGUgPSBvcHRpb25zLmNvbnN0cnVjdEZpbGUgPz8gYCR7YmFzZVBhdGh9LWNvZGUudHNgO1xuXG4gICAgICAgIGlmIChwYXRoLmV4dG5hbWUoY29uc3RydWN0RmlsZSkgIT09IFwiLnRzXCIpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ29uc3RydWN0IGZpbGUgbmFtZSBcIiR7Y29uc3RydWN0RmlsZX1cIiBtdXN0IGhhdmUgYSAudHMgZXh0ZW5zaW9uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb25zdHJ1Y3ROYW1lID0gb3B0aW9ucy5jb25zdHJ1Y3ROYW1lID8/IGAke3Bhc2NhbChwYXRoLmJhc2VuYW1lKGJhc2VQYXRoKSl9RnVuY3Rpb25Db2RlYDtcblxuICAgICAgICBjb25zdCBidW5kbGUgPSBidW5kbGVyLmFkZEJ1bmRsZShlbnRyeXBvaW50LCB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLmJ1bmRsaW5nT3B0aW9ucyxcbiAgICAgICAgICAgIHRzY29uZmlnUGF0aDogKHByb2plY3QgYXMgdHlwZXNjcmlwdC5UeXBlU2NyaXB0UHJvamVjdCk/LnRzY29uZmlnRGV2Py5maWxlTmFtZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3Qgb3V0ZmlsZUFicyA9IHBhdGguam9pbihwcm9qZWN0Lm91dGRpciwgYnVuZGxlLm91dGZpbGUpO1xuICAgICAgICBjb25zdCBjb25zdHJ1Y3RBYnMgPSBwYXRoLmpvaW4ocHJvamVjdC5vdXRkaXIsIGNvbnN0cnVjdEZpbGUpO1xuICAgICAgICBjb25zdCByZWxhdGl2ZU91dGZpbGUgPSBwYXRoLnJlbGF0aXZlKHBhdGguZGlybmFtZShjb25zdHJ1Y3RBYnMpLCBwYXRoLmRpcm5hbWUob3V0ZmlsZUFicykpO1xuXG4gICAgICAgIGNvbnN0IHNyYyA9IG5ldyBTb3VyY2VDb2RlKHByb2plY3QsIGNvbnN0cnVjdEZpbGUpO1xuICAgICAgICBpZiAoc3JjLm1hcmtlcikge1xuICAgICAgICAgICAgc3JjLmxpbmUoYC8vICR7c3JjLm1hcmtlcn1gKTtcbiAgICAgICAgfVxuICAgICAgICBzcmMubGluZShcImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XCIpO1xuICAgICAgICBzcmMubGluZShcImltcG9ydCB7IGF3c19sYW1iZGEgfSBmcm9tICdhd3MtY2RrLWxpYic7XCIpO1xuICAgICAgICBzcmMubGluZSgpO1xuICAgICAgICBzcmMub3BlbihgZXhwb3J0IGNvbnN0ICR7Y29uc3RydWN0TmFtZX0gPSBhd3NfbGFtYmRhLkNvZGUuZnJvbUFzc2V0KGApO1xuICAgICAgICBzcmMubGluZShgcGF0aC5qb2luKF9fZGlybmFtZSwgJyR7Y29udmVydFRvUG9zaXhQYXRoKHJlbGF0aXZlT3V0ZmlsZSl9JyksYCk7XG4gICAgICAgIHNyYy5jbG9zZShcIik7XCIpO1xuXG4gICAgICAgIHRoaXMucHJvamVjdC5sb2dnZXIudmVyYm9zZShgJHtiYXNlUGF0aH06IGNvbnN0cnVjdCBcIiR7Y29uc3RydWN0TmFtZX1cIiBnZW5lcmF0ZWQgdW5kZXIgXCIke2NvbnN0cnVjdEZpbGV9XCJgKTtcbiAgICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci52ZXJib3NlKGAke2Jhc2VQYXRofTogYnVuZGxlIHRhc2sgXCIke2J1bmRsZS5idW5kbGVUYXNrLm5hbWV9XCJgKTtcbiAgICB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZXJgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Db2RlQnVuZGxlck9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIExvY2F0ZSBmaWxlcyB3aXRoIHRoZSBnaXZlbiBleHRlbnNpb24uXG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBcIi5sYW1iZGEudHNcIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGV4dGVuc2lvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogUHJvamVjdCBzb3VyY2UgdHJlZSAocmVsYXRpdmUgdG8gcHJvamVjdCBvdXRwdXQgZGlyZWN0b3J5KS5cbiAgICAgKi9cbiAgICByZWFkb25seSBzcmNkaXI6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE9wdGlvbnMgZm9yIEFXUyBMYW1iZGEgRnVuY3Rpb24gYnVuZGxpbmcsIGFwcGxpZWQgdG8gZXZlcnkgZGlzY292ZXJlZCBlbnRyeXBvaW50LlxuICAgICAqXG4gICAgICogVGhlIGBlbnRyeXBvaW50YCBhbmQgYGV4dGVuc2lvbmAgZ2l2ZW4gaGVyZSBhcmUgaWdub3JlZDogZWFjaCBidW5kbGUgdXNlcyBpdHNcbiAgICAgKiBkaXNjb3ZlcmVkIGVudHJ5cG9pbnQgYW5kIHRoZSBgZXh0ZW5zaW9uYCBvZiB0aGUgYnVuZGxlci5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHRzIG9mIGBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGVPcHRpb25zYFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJ1bmRsZU9wdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkNvZGVCdW5kbGVPcHRpb25zO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgTGFtYmRhIEZ1bmN0aW9uIGNvZGUgYnVuZGxlcyBmcm9tIGVudHJ5cG9pbnRzIGRpc2NvdmVyZWQgaW4gdGhlIHByb2plY3QncyBzb3VyY2UgdHJlZS5cbiAqL1xuZXhwb3J0IGNsYXNzIExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZXIgZXh0ZW5kcyBjZGsuQXV0b0Rpc2NvdmVyQmFzZSB7XG4gICAgY29uc3RydWN0b3IocHJvamVjdDogUHJvamVjdCwgb3B0aW9uczogTGFtYmRhRnVuY3Rpb25Db2RlQnVuZGxlck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCwge1xuICAgICAgICAgICAgcHJvamVjdGRpcjogb3B0aW9ucy5zcmNkaXIsXG4gICAgICAgICAgICBleHRlbnNpb246IG9wdGlvbnMuZXh0ZW5zaW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5cG9pbnQgb2YgdGhpcy5lbnRyeXBvaW50cykge1xuICAgICAgICAgICAgbmV3IExhbWJkYUZ1bmN0aW9uQ29kZUJ1bmRsZSh0aGlzLnByb2plY3QsIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLmJ1bmRsZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZW50cnlwb2ludDogZW50cnlwb2ludCxcbiAgICAgICAgICAgICAgICBleHRlbnNpb246IG9wdGlvbnMuZXh0ZW5zaW9uLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -1,5 +1,10 @@
1
1
  import type { IConstruct } from "constructs";
2
2
  import { Component } from "projen/lib/component";
3
+ /**
4
+ * Colima component for projen projects.
5
+ *
6
+ * Adds Colima support to your project with automatic installation and startup.
7
+ */
3
8
  export declare class Colima extends Component {
4
9
  constructor(scope: IConstruct);
5
10
  }
@@ -5,8 +5,13 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
5
  const component_1 = require("projen/lib/component");
6
6
  const task_shell_1 = require("projen/lib/task-shell");
7
7
  const homebrew_1 = require("./homebrew");
8
+ /**
9
+ * Colima component for projen projects.
10
+ *
11
+ * Adds Colima support to your project with automatic installation and startup.
12
+ */
8
13
  class Colima extends component_1.Component {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Colima", version: "0.3.79" };
14
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Colima", version: "0.3.81" };
10
15
  constructor(scope) {
11
16
  super(scope);
12
17
  const project = this.project;
@@ -25,4 +30,4 @@ class Colima extends component_1.Component {
25
30
  }
26
31
  }
27
32
  exports.Colima = Colima;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29saW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvY29saW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFFQSxvREFBaUQ7QUFDakQsc0RBQWtEO0FBQ2xELHlDQUFzQztBQUV0QyxNQUFhLE1BQU8sU0FBUSxxQkFBUzs7SUFDakMsWUFBWSxLQUFpQjtRQUN6QixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBa0IsQ0FBQztRQUV4QyxJQUFJLFFBQVEsR0FBRyxtQkFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLFFBQVEsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDdEIsMkVBQTJFO1lBQzNFLGtDQUFrQztZQUNsQyxLQUFLLEVBQUUsc0JBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDdkIsSUFBSSxFQUFFLCtDQUErQztTQUN4RCxDQUFDLENBQUM7SUFDUCxDQUFDOztBQXBCTCx3QkFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInByb2plbi9saWIvY29tcG9uZW50XCI7XG5pbXBvcnQgeyBUYXNrU2hlbGwgfSBmcm9tIFwicHJvamVuL2xpYi90YXNrLXNoZWxsXCI7XG5pbXBvcnQgeyBIb21lYnJldyB9IGZyb20gXCIuL2hvbWVicmV3XCI7XG5cbmV4cG9ydCBjbGFzcyBDb2xpbWEgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0KSB7XG4gICAgICAgIHN1cGVyKHNjb3BlKTtcblxuICAgICAgICBjb25zdCBwcm9qZWN0ID0gdGhpcy5wcm9qZWN0IGFzIFByb2plY3Q7XG5cbiAgICAgICAgbGV0IGhvbWVicmV3ID0gSG9tZWJyZXcub2YocHJvamVjdCk7XG4gICAgICAgIGlmICghaG9tZWJyZXcpIHtcbiAgICAgICAgICAgIGhvbWVicmV3ID0gbmV3IEhvbWVicmV3KHByb2plY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaG9tZWJyZXcuYWRkUGFja2FnZShcImNvbGltYVwiKTtcbiAgICAgICAgaG9tZWJyZXcuYWRkUGFja2FnZShcImRvY2tlclwiKTtcblxuICAgICAgICBwcm9qZWN0LmFkZFRhc2soXCJjb2xpbWFcIiwge1xuICAgICAgICAgICAgLy8gbXVsdGlwbGUgcmVkaXJlY3RzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHByb2plbidzIGJ1aWx0LWluIGNyb3NzLXBsYXRmb3JtXG4gICAgICAgICAgICAvLyBzaGVsbCwgc28gcnVuIHRoaXMgdGhyb3VnaCBiYXNoXG4gICAgICAgICAgICBzaGVsbDogVGFza1NoZWxsLmJhc2goKSxcbiAgICAgICAgICAgIGV4ZWM6IFwiY29saW1hIHN0YXR1cyA+L2Rldi9udWxsIDI+JjEgfHwgY29saW1hIHN0YXJ0XCIsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29saW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvY29saW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFFQSxvREFBaUQ7QUFDakQsc0RBQWtEO0FBQ2xELHlDQUFzQztBQUV0Qzs7OztHQUlHO0FBQ0gsTUFBYSxNQUFPLFNBQVEscUJBQVM7O0lBQ2pDLFlBQVksS0FBaUI7UUFDekIsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQWtCLENBQUM7UUFFeEMsSUFBSSxRQUFRLEdBQUcsbUJBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ1osUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTlCLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3RCLDJFQUEyRTtZQUMzRSxrQ0FBa0M7WUFDbEMsS0FBSyxFQUFFLHNCQUFTLENBQUMsSUFBSSxFQUFFO1lBQ3ZCLElBQUksRUFBRSwrQ0FBK0M7U0FDeEQsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzs7QUFwQkwsd0JBcUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCJwcm9qZW4vbGliL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgVGFza1NoZWxsIH0gZnJvbSBcInByb2plbi9saWIvdGFzay1zaGVsbFwiO1xuaW1wb3J0IHsgSG9tZWJyZXcgfSBmcm9tIFwiLi9ob21lYnJld1wiO1xuXG4vKipcbiAqIENvbGltYSBjb21wb25lbnQgZm9yIHByb2plbiBwcm9qZWN0cy5cbiAqXG4gKiBBZGRzIENvbGltYSBzdXBwb3J0IHRvIHlvdXIgcHJvamVjdCB3aXRoIGF1dG9tYXRpYyBpbnN0YWxsYXRpb24gYW5kIHN0YXJ0dXAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xpbWEgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0KSB7XG4gICAgICAgIHN1cGVyKHNjb3BlKTtcblxuICAgICAgICBjb25zdCBwcm9qZWN0ID0gdGhpcy5wcm9qZWN0IGFzIFByb2plY3Q7XG5cbiAgICAgICAgbGV0IGhvbWVicmV3ID0gSG9tZWJyZXcub2YocHJvamVjdCk7XG4gICAgICAgIGlmICghaG9tZWJyZXcpIHtcbiAgICAgICAgICAgIGhvbWVicmV3ID0gbmV3IEhvbWVicmV3KHByb2plY3QpO1xuICAgICAgICB9XG5cbiAgICAgICAgaG9tZWJyZXcuYWRkUGFja2FnZShcImNvbGltYVwiKTtcbiAgICAgICAgaG9tZWJyZXcuYWRkUGFja2FnZShcImRvY2tlclwiKTtcblxuICAgICAgICBwcm9qZWN0LmFkZFRhc2soXCJjb2xpbWFcIiwge1xuICAgICAgICAgICAgLy8gbXVsdGlwbGUgcmVkaXJlY3RzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHByb2plbidzIGJ1aWx0LWluIGNyb3NzLXBsYXRmb3JtXG4gICAgICAgICAgICAvLyBzaGVsbCwgc28gcnVuIHRoaXMgdGhyb3VnaCBiYXNoXG4gICAgICAgICAgICBzaGVsbDogVGFza1NoZWxsLmJhc2goKSxcbiAgICAgICAgICAgIGV4ZWM6IFwiY29saW1hIHN0YXR1cyA+L2Rldi9udWxsIDI+JjEgfHwgY29saW1hIHN0YXJ0XCIsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiJdfQ==
@@ -6,7 +6,7 @@ const component_1 = require("projen/lib/component");
6
6
  const task_shell_1 = require("projen/lib/task-shell");
7
7
  const textfile_1 = require("projen/lib/textfile");
8
8
  class Homebrew extends component_1.Component {
9
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Homebrew", version: "0.3.79" };
9
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Homebrew", version: "0.3.81" };
10
10
  static of(project) {
11
11
  const isHomebrew = (c) => c instanceof Homebrew;
12
12
  return project.components.find(isHomebrew);
@@ -1,16 +1,70 @@
1
1
  import type { BuildOptions } from "@mrgrain/cdk-esbuild";
2
2
  import { Component } from "projen";
3
3
  import type { NodeProject } from "projen/lib/javascript";
4
+ /**
5
+ * Options for the LambdaFunctionConstructGenerator
6
+ */
4
7
  export interface LambdaFunctionConstructGeneratorOptions {
8
+ /**
9
+ * Source directory where Lambda Function handlers are located
10
+ *
11
+ * @default "src/handlers"
12
+ */
5
13
  readonly sourceDir?: string;
14
+ /**
15
+ * Output directory where Lambda Function constructs will be generated
16
+ *
17
+ * @default "src/constructs/lambda"
18
+ */
6
19
  readonly outputDir?: string;
20
+ /**
21
+ * File pattern to identify Lambda Function handlers
22
+ *
23
+ * @default "*.lambda.ts"
24
+ */
7
25
  readonly filePattern?: string;
26
+ /**
27
+ * esbuild options to customize the bundling process
28
+ *
29
+ * @default {}
30
+ */
8
31
  readonly esbuildOptions?: BuildOptions;
32
+ /**
33
+ * Whether to automatically add the required dependencies
34
+ *
35
+ * @default true
36
+ */
9
37
  readonly addDependencies?: boolean;
38
+ /**
39
+ * Import statement for the base construct
40
+ *
41
+ * @example "import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';"
42
+ *
43
+ * @default "import { aws_lambda } from 'aws-cdk-lib';"
44
+ */
10
45
  readonly baseConstructImport?: string;
46
+ /**
47
+ * Name of the construct class to extend
48
+ *
49
+ * @example "NodejsFunction"
50
+ *
51
+ * @default "aws_lambda.Function"
52
+ */
11
53
  readonly baseConstructClass?: string;
54
+ /**
55
+ * Package name to add as dependency for the base construct
56
+ *
57
+ * @example "aws-cdk-lib"
58
+ *
59
+ * @default "aws-cdk-lib"
60
+ */
12
61
  readonly baseConstructPackage?: string;
13
62
  }
63
+ /**
64
+ * A projen component that generates AWS CDK Lambda Function constructs and bundles their code assets using esbuild.
65
+ *
66
+ * The bundling happens during projen execution, not during CDK synth, enabling a "build once, deploy many" pattern.
67
+ */
14
68
  export declare class LambdaFunctionConstructGenerator extends Component {
15
69
  readonly sourceDir: string;
16
70
  readonly outputDir: string;
@@ -38,8 +38,13 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
38
38
  const path = __importStar(require("node:path"));
39
39
  const projen_1 = require("projen");
40
40
  const utils_1 = require("../utils");
41
+ /**
42
+ * A projen component that generates AWS CDK Lambda Function constructs and bundles their code assets using esbuild.
43
+ *
44
+ * The bundling happens during projen execution, not during CDK synth, enabling a "build once, deploy many" pattern.
45
+ */
41
46
  class LambdaFunctionConstructGenerator extends projen_1.Component {
42
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionConstructGenerator", version: "0.3.79" };
47
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LambdaFunctionConstructGenerator", version: "0.3.81" };
43
48
  sourceDir;
44
49
  outputDir;
45
50
  filePattern;
@@ -237,4 +242,4 @@ main().catch(error => {
237
242
  }
238
243
  }
239
244
  exports.LambdaFunctionConstructGenerator = LambdaFunctionConstructGenerator;
240
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWZ1bmN0aW9uLWNvbnN0cnVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9sYW1iZGEtZnVuY3Rpb24tY29uc3RydWN0LWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBRWxDLG1DQUErQztBQUUvQyxvQ0FBMkM7QUFhM0MsTUFBYSxnQ0FBaUMsU0FBUSxrQkFBUzs7SUFDM0MsU0FBUyxDQUFTO0lBQ2xCLFNBQVMsQ0FBUztJQUNsQixXQUFXLENBQVM7SUFDcEIsY0FBYyxDQUFlO0lBQzdCLG1CQUFtQixDQUFVO0lBQzdCLGtCQUFrQixDQUFVO0lBQzVCLG9CQUFvQixDQUFVO0lBQzdCLFdBQVcsQ0FBYztJQUN6QixpQkFBaUIsQ0FBUztJQUUzQyxZQUFZLE9BQW9CLEVBQUUsT0FBaUQ7UUFDL0UsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLEVBQUUsU0FBUyxJQUFJLGNBQWMsQ0FBQztRQUN0RCxJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sRUFBRSxTQUFTLElBQUksdUJBQXVCLENBQUM7UUFDL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLEVBQUUsV0FBVyxJQUFJLGFBQWEsQ0FBQztRQUN6RCxJQUFJLENBQUMsY0FBYyxHQUFHLE9BQU8sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxPQUFPLEVBQUUsbUJBQW1CLENBQUM7UUFDeEQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE9BQU8sRUFBRSxrQkFBa0IsQ0FBQztRQUN0RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxFQUFFLG9CQUFvQixDQUFD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Qzs7QUFwTkwsNEVBcU5DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IEJ1aWxkT3B0aW9ucyB9IGZyb20gXCJAbXJncmFpbi9jZGstZXNidWlsZFwiO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBTb3VyY2VDb2RlIH0gZnJvbSBcInByb2plblwiO1xuaW1wb3J0IHR5cGUgeyBOb2RlUHJvamVjdCB9IGZyb20gXCJwcm9qZW4vbGliL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IHRzY29uZmlnRGV2UGF0aCB9IGZyb20gXCIuLi91dGlsc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIExhbWJkYUZ1bmN0aW9uQ29uc3RydWN0R2VuZXJhdG9yT3B0aW9ucyB7XG4gICAgcmVhZG9ubHkgc291cmNlRGlyPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IG91dHB1dERpcj86IHN0cmluZztcbiAgICByZWFkb25seSBmaWxlUGF0dGVybj86IHN0cmluZztcbiAgICByZWFkb25seSBlc2J1aWxkT3B0aW9ucz86IEJ1aWxkT3B0aW9ucztcbiAgICByZWFkb25seSBhZGREZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAgIHJlYWRvbmx5IGJhc2VDb25zdHJ1Y3RJbXBvcnQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYmFzZUNvbnN0cnVjdENsYXNzPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGJhc2VDb25zdHJ1Y3RQYWNrYWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb25Db25zdHJ1Y3RHZW5lcmF0b3IgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2VEaXI6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0RGlyOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpbGVQYXR0ZXJuOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGVzYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnM7XG4gICAgcHVibGljIHJlYWRvbmx5IGJhc2VDb25zdHJ1Y3RJbXBvcnQ/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGJhc2VDb25zdHJ1Y3RDbGFzcz86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvbnN0cnVjdFBhY2thZ2U/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBub2RlUHJvamVjdDogTm9kZVByb2plY3Q7XG4gICAgcHJpdmF0ZSByZWFkb25seSBidW5kbGVyU2NyaXB0UGF0aDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkNvbnN0cnVjdEdlbmVyYXRvck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCk7XG4gICAgICAgIHRoaXMubm9kZVByb2plY3QgPSBwcm9qZWN0O1xuICAgICAgICB0aGlzLnNvdXJjZURpciA9IG9wdGlvbnM/LnNvdXJjZURpciA/PyBcInNyYy9oYW5kbGVyc1wiO1xuICAgICAgICB0aGlzLm91dHB1dERpciA9IG9wdGlvbnM/Lm91dHB1dERpciA/PyBcInNyYy9jb25zdHJ1Y3RzL2xhbWJkYVwiO1xuICAgICAgICB0aGlzLmZpbGVQYXR0ZXJuID0gb3B0aW9ucz8uZmlsZVBhdHRlcm4gPz8gXCIqLmxhbWJkYS50c1wiO1xuICAgICAgICB0aGlzLmVzYnVpbGRPcHRpb25zID0gb3B0aW9ucz8uZXNidWlsZE9wdGlvbnMgPz8ge307XG4gICAgICAgIHRoaXMuYmFzZUNvbnN0cnVjdEltcG9ydCA9IG9wdGlvbnM/LmJhc2VDb25zdHJ1Y3RJbXBvcnQ7XG4gICAgICAgIHRoaXMuYmFzZUNvbnN0cnVjdENsYXNzID0gb3B0aW9ucz8uYmFzZUNvbnN0cnVjdENsYXNzO1xuICAgICAgICB0aGlzLmJhc2VDb25zdHJ1Y3RQYWNrYWdlID0gb3B0aW9ucz8uYmFzZUNvbnN0cnVjdFBhY2thZ2U7XG5cbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSB0aGlzLmNyZWF0ZVVuaXF1ZUlkKHRoaXMuc291cmNlRGlyLCB0aGlzLmZpbGVQYXR0ZXJuKTtcbiAgICAgICAgdGhpcy5idW5kbGVyU2NyaXB0UGF0aCA9IHBhdGguam9pbihcIi5wcm9qZW5cIiwgYGdlbmVyYXRlLWFuZC1idW5kbGUtJHt1bmlxdWVJZH0udHNgKTtcblxuICAgICAgICBpZiAob3B0aW9ucz8uYWRkRGVwZW5kZW5jaWVzID8/IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRGVwZW5kZW5jaWVzKG9wdGlvbnM/LmJhc2VDb25zdHJ1Y3RQYWNrYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlQnVuZGxlVGFzaygpO1xuICAgICAgICB0aGlzLmFkZEJ1bmRsZVRhc2tUb1dvcmtmbG93KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGREZXBlbmRlbmNpZXMoYWRkaXRpb25hbFBhY2thZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5ub2RlUHJvamVjdC5hZGREZXBzKFwiYXdzLWNkay1saWJcIiwgXCJjb25zdHJ1Y3RzXCIpO1xuXG4gICAgICAgIGlmIChhZGRpdGlvbmFsUGFja2FnZSAmJiBhZGRpdGlvbmFsUGFja2FnZSAhPT0gXCJhd3MtY2RrLWxpYlwiICYmIGFkZGl0aW9uYWxQYWNrYWdlICE9PSBcImNvbnN0cnVjdHNcIikge1xuICAgICAgICAgICAgdGhpcy5ub2RlUHJvamVjdC5hZGREZXBzKGFkZGl0aW9uYWxQYWNrYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlVW5pcXVlSWQoc291cmNlRGlyOiBzdHJpbmcsIGZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkaXJQYXJ0ID0gc291cmNlRGlyLnJlcGxhY2UoL1xcLy9nLCBcIi1cIikucmVwbGFjZSgvW15cXHctXS9nLCBcIlwiKTtcbiAgICAgICAgY29uc3QgcGF0dGVyblBhcnQgPSBmaWxlUGF0dGVyblxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcKi9nLCBcIlwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLi9nLCBcIi1cIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXlxcdy1dL2csIFwiXCIpO1xuICAgICAgICByZXR1cm4gYCR7ZGlyUGFydH0tJHtwYXR0ZXJuUGFydH1gLnJlcGxhY2UoLy0tKy9nLCBcIi1cIikucmVwbGFjZSgvXi18LSQvZywgXCJcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCdW5kbGVUYXNrKCkge1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IHRoaXMuY3JlYXRlVW5pcXVlSWQodGhpcy5zb3VyY2VEaXIsIHRoaXMuZmlsZVBhdHRlcm4pO1xuICAgICAgICBjb25zdCB0YXNrTmFtZSA9IGBnZW5lcmF0ZS1hbmQtYnVuZGxlLSR7dW5pcXVlSWR9YDtcblxuICAgICAgICBsZXQgYmFzZUNvbnN0cnVjdEFyZ3MgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5iYXNlQ29uc3RydWN0SW1wb3J0KSB7XG4gICAgICAgICAgICBiYXNlQ29uc3RydWN0QXJncyArPSBgIC0tYmFzZS1jb25zdHJ1Y3QtaW1wb3J0ICcke3RoaXMuYmFzZUNvbnN0cnVjdEltcG9ydH0nYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYXNlQ29uc3RydWN0Q2xhc3MpIHtcbiAgICAgICAgICAgIGJhc2VDb25zdHJ1Y3RBcmdzICs9IGAgLS1iYXNlLWNvbnN0cnVjdC1jbGFzcyAnJHt0aGlzLmJhc2VDb25zdHJ1Y3RDbGFzc30nYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1bmRsZVRhc2sgPSB0aGlzLm5vZGVQcm9qZWN0LmFkZFRhc2sodGFza05hbWUsIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgR2VuZXJhdGUgTGFtYmRhIEZ1bmN0aW9uIENvbnN0cnVjdHMgZnJvbSAke3RoaXMuc291cmNlRGlyfS8ke3RoaXMuZmlsZVBhdHRlcm59IGFuZCBidW5kbGUgdGhlaXIgaGFuZGxlcnNgLFxuICAgICAgICAgICAgZXhlYzogYHRzeCAtLXRzY29uZmlnICR7dHNjb25maWdEZXZQYXRoKHRoaXMubm9kZVByb2plY3QpfSAke3RoaXMuYnVuZGxlclNjcmlwdFBhdGh9IC0tc291cmNlLWRpciAke3RoaXMuc291cmNlRGlyfSAtLW91dHB1dC1kaXIgJHt0aGlzLm91dHB1dERpcn0gLS1maWxlLXBhdHRlcm4gXCIke3RoaXMuZmlsZVBhdHRlcm59XCIgLS1lc2J1aWxkLW9wdGlvbnMgJyR7SlNPTi5zdHJpbmdpZnkodGhpcy5lc2J1aWxkT3B0aW9ucyl9JyR7YmFzZUNvbnN0cnVjdEFyZ3N9YCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVCdW5kbGVyU2NyaXB0KCk7XG5cbiAgICAgICAgcmV0dXJuIGJ1bmRsZVRhc2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCdW5kbGVyU2NyaXB0KCkge1xuICAgICAgICBjb25zdCBidW5kbGVyU2NyaXB0ID0gYC8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgKiBhcyBnbG9iIGZyb20gJ2dsb2InO1xuaW1wb3J0IHsgcGFzY2FsQ2FzZSB9IGZyb20gJ2NoYW5nZS1jYXNlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncy95YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gICAgLm9wdGlvbignc291cmNlLWRpcicsIHsgdHlwZTogJ3N0cmluZycsIGRlZmF1bHQ6ICdzcmMvaGFuZGxlcnMnLCBkZXNjcmlwdGlvbjogJ1NvdXJjZSBkaXJlY3Rvcnkgd2hlcmUgTGFtYmRhIEZ1bmN0aW9uIGhhbmRsZXJzIGFyZSBsb2NhdGVkJyB9KVxuICAgIC5vcHRpb24oJ291dHB1dC1kaXInLCB7IHR5cGU6ICdzdHJpbmcnLCBkZWZhdWx0OiAnc3JjL2NvbnN0cnVjdHMvbGFtYmRhJywgZGVzY3JpcHRpb246ICdPdXRwdXQgZGlyZWN0b3J5IHdoZXJlIExhbWJkYSBGdW5jdGlvbiBjb25zdHJ1Y3RzIHdpbGwgYmUgZ2VuZXJhdGVkJyB9KVxuICAgIC5vcHRpb24oJ2ZpbGUtcGF0dGVybicsIHsgdHlwZTogJ3N0cmluZycsIGRlZmF1bHQ6ICcqLmxhbWJkYS50cycsIGRlc2NyaXB0aW9uOiAnRmlsZSBwYXR0ZXJuIHRvIGlkZW50aWZ5IExhbWJkYSBGdW5jdGlvbiBoYW5kbGVycycgfSlcbiAgICAub3B0aW9uKCdlc2J1aWxkLW9wdGlvbnMnLCB7IHR5cGU6ICdzdHJpbmcnLCBkZWZhdWx0OiAne30nLCBkZXNjcmlwdGlvbjogJ2VzYnVpbGQgb3B0aW9ucyBhcyBKU09OIHN0cmluZycgfSlcbiAgICAub3B0aW9uKCdiYXNlLWNvbnN0cnVjdC1pbXBvcnQnLCB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0ltcG9ydCBzdGF0ZW1lbnQgZm9yIHRoZSBiYXNlIGNvbnN0cnVjdCcgfSlcbiAgICAub3B0aW9uKCdiYXNlLWNvbnN0cnVjdC1jbGFzcycsIHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgY29uc3RydWN0IGNsYXNzIHRvIGV4dGVuZCcgfSlcbiAgICAuaGVscCgpXG4gICAgLnBhcnNlKCk7XG5cbiAgY29uc3Qgc291cmNlRGlyID0gYXJndlsnc291cmNlLWRpciddO1xuICBjb25zdCBvdXRwdXREaXIgPSBhcmd2WydvdXRwdXQtZGlyJ107XG4gIGNvbnN0IGZpbGVQYXR0ZXJuID0gYXJndlsnZmlsZS1wYXR0ZXJuJ107XG4gIGNvbnN0IGVzYnVpbGRPcHRpb25zID0gSlNPTi5wYXJzZShhcmd2Wydlc2J1aWxkLW9wdGlvbnMnXSBhcyBzdHJpbmcpO1xuICBjb25zdCBiYXNlQ29uc3RydWN0SW1wb3J0ID0gYXJndlsnYmFzZS1jb25zdHJ1Y3QtaW1wb3J0J10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBiYXNlQ29uc3RydWN0Q2xhc3MgPSBhcmd2WydiYXNlLWNvbnN0cnVjdC1jbGFzcyddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG91dHB1dERpciksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnYXNzZXRzJywgJ2hhbmRsZXJzJyk7XG4gIGZzLm1rZGlyU3luYyhhc3NldHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhbmRsZXJGaWxlcyA9IGdsb2Iuc3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgc291cmNlRGlyLCBmaWxlUGF0dGVybikpO1xuXG4gIGNvbnNvbGUubG9nKFxcYEZvdW5kIFxcJHtoYW5kbGVyRmlsZXMubGVuZ3RofSBMYW1iZGEgRnVuY3Rpb24gaGFuZGxlciBmaWxlc1xcYCk7XG5cbiAgZm9yIChjb25zdCBoYW5kbGVyRmlsZSBvZiBoYW5kbGVyRmlsZXMpIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBzb3VyY2VEaXIpLCBoYW5kbGVyRmlsZSk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKHJlbGF0aXZlUGF0aCwgcGF0aC5leHRuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoJy5sYW1iZGEnLCAnJyk7XG5cbiAgICBjb25zb2xlLmxvZyhcXGBQcm9jZXNzaW5nIExhbWJkYSBGdW5jdGlvbiBoYW5kbGVyOiBcXCR7ZnVuY3Rpb25OYW1lfVxcYCk7XG5cbiAgICBjb25zdCBmdW5jdGlvbkRpciA9IHBhdGguam9pbihhc3NldHNEaXIsIGZ1bmN0aW9uTmFtZSk7XG4gICAgZnMubWtkaXJTeW5jKGZ1bmN0aW9uRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IG91dGZpbGUgPSBwYXRoLmpvaW4oZnVuY3Rpb25EaXIsICdpbmRleC5qcycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgICBlbnRyeVBvaW50czogW2hhbmRsZXJGaWxlXSxcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICAgIHRhcmdldDogJ25vZGUxOCcsXG4gICAgICAgIG91dGZpbGUsXG4gICAgICAgIC4uLmVzYnVpbGRPcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKFxcYFN1Y2Nlc3NmdWxseSBidW5kbGVkIFxcJHtmdW5jdGlvbk5hbWV9IHRvIFxcJHtvdXRmaWxlfVxcYCk7XG5cbiAgICAgIGNvbnN0IGNvbnN0cnVjdEZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG91dHB1dERpciwgXFxgXFwke2Z1bmN0aW9uTmFtZX0udHNcXGApO1xuICAgICAgY29uc3QgY29uc3RydWN0Q29kZSA9IGdlbmVyYXRlQ29uc3RydWN0Q29kZShmdW5jdGlvbk5hbWUsIHJlbGF0aXZlUGF0aCwgYmFzZUNvbnN0cnVjdEltcG9ydCwgYmFzZUNvbnN0cnVjdENsYXNzKTtcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25zdHJ1Y3RGaWxlUGF0aCwgY29uc3RydWN0Q29kZSk7XG4gICAgICBjb25zb2xlLmxvZyhcXGBHZW5lcmF0ZWQgY29uc3RydWN0IGF0IFxcJHtjb25zdHJ1Y3RGaWxlUGF0aH1cXGApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxcYEVycm9yIHByb2Nlc3NpbmcgXFwke2Z1bmN0aW9uTmFtZX06XFxgLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ29uc3RydWN0Q29kZShmdW5jdGlvbk5hbWU6IHN0cmluZywgaGFuZGxlclBhdGg6IHN0cmluZywgYmFzZUNvbnN0cnVjdEltcG9ydD86IHN0cmluZywgYmFzZUNvbnN0cnVjdENsYXNzPzogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnN0cnVjdE5hbWUgPSBcXGBcXCR7cGFzY2FsQ2FzZShmdW5jdGlvbk5hbWUpfUZ1bmN0aW9uXFxgO1xuXG4gIGNvbnN0IGltcG9ydFN0YXRlbWVudCA9IGJhc2VDb25zdHJ1Y3RJbXBvcnQgPz8gXCJcIjtcbiAgY29uc3QgYmFzZUNsYXNzTmFtZSA9IGJhc2VDb25zdHJ1Y3RDbGFzcyA/PyBcImF3c19sYW1iZGEuRnVuY3Rpb25cIjtcblxuICBjb25zdCB1c2VBd3NMYW1iZGFSdW50aW1lID0gIWJhc2VDb25zdHJ1Y3RDbGFzcyB8fCBiYXNlQ2xhc3NOYW1lLmluY2x1ZGVzKFwiRnVuY3Rpb25cIik7XG5cbiAgcmV0dXJuIFxcYC8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXFwke2ltcG9ydFN0YXRlbWVudH1cbmltcG9ydCB7IGF3c19sYW1iZGEgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKTtcblxuZXhwb3J0IGludGVyZmFjZSBcXCR7Y29uc3RydWN0TmFtZX1Qcm9wcyBleHRlbmRzIE9taXQ8XFwke2Jhc2VDbGFzc05hbWUgPT09IFwiYXdzX2xhbWJkYS5GdW5jdGlvblwiID8gXCJhd3NfbGFtYmRhLkZ1bmN0aW9uUHJvcHNcIiA6IFxcYFxcJHtiYXNlQ2xhc3NOYW1lfVByb3BzXFxgfSwgJ2NvZGUnXFwke3VzZUF3c0xhbWJkYVJ1bnRpbWUgPyBcIiB8ICdydW50aW1lJ1wiIDogXCJcIn0gfCAnaGFuZGxlcic+IHtcbiAgXFwke3VzZUF3c0xhbWJkYVJ1bnRpbWUgPyBcXGAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgcnVudGltZVxuICAgKiBAZGVmYXVsdCBub2RlanMyMi54XG4gICAqL1xuICByZWFkb25seSBydW50aW1lPzogYXdzX2xhbWJkYS5SdW50aW1lO1xcYCA6IFwiXCJ9XG59XG5cbmV4cG9ydCBjbGFzcyBcXCR7Y29uc3RydWN0TmFtZX0gZXh0ZW5kcyBcXCR7YmFzZUNsYXNzTmFtZX0ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogXFwke2NvbnN0cnVjdE5hbWV9UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBcXCR7dXNlQXdzTGFtYmRhUnVudGltZSA/IFwicnVudGltZTogcHJvcHMucnVudGltZSA/PyBhd3NfbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIyX1gsXCIgOiBcIlwifVxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogYXdzX2xhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzL2hhbmRsZXJzL1xcJHtmdW5jdGlvbk5hbWV9JykpLFxuICAgIH0pO1xuICB9XG59XG5cXGA7XG59XG5cbm1haW4oKS5jYXRjaChlcnJvciA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5gO1xuXG4gICAgICAgIGNvbnN0IHNyYyA9IG5ldyBTb3VyY2VDb2RlKHRoaXMucHJvamVjdCwgdGhpcy5idW5kbGVyU2NyaXB0UGF0aCk7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gYnVuZGxlclNjcmlwdC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICBzcmMubGluZShsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm9kZVByb2plY3QuYWRkRGV2RGVwcyhcImVzYnVpbGRcIiwgXCJnbG9iXCIsIFwieWFyZ3NcIiwgXCJAdHlwZXMvZ2xvYlwiLCBcIkB0eXBlcy95YXJnc1wiLCBcInRzeFwiLCBcImNoYW5nZS1jYXNlXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQnVuZGxlVGFza1RvV29ya2Zsb3coKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVUYXNrID0gdGhpcy5ub2RlUHJvamVjdC50YXNrcy50cnlGaW5kKFwiY29tcGlsZVwiKTtcblxuICAgICAgICBpZiAoY29tcGlsZVRhc2spIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gdGhpcy5jcmVhdGVVbmlxdWVJZCh0aGlzLnNvdXJjZURpciwgdGhpcy5maWxlUGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCB0YXNrTmFtZSA9IGBnZW5lcmF0ZS1hbmQtYnVuZGxlLSR7dW5pcXVlSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGJ1bmRsZVRhc2sgPSB0aGlzLm5vZGVQcm9qZWN0LnRhc2tzLnRyeUZpbmQodGFza05hbWUpO1xuICAgICAgICAgICAgaWYgKGJ1bmRsZVRhc2spIHtcbiAgICAgICAgICAgICAgICBjb21waWxlVGFzay5wcmVwZW5kU3Bhd24oYnVuZGxlVGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
245
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWZ1bmN0aW9uLWNvbnN0cnVjdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tcG9uZW50cy9sYW1iZGEtZnVuY3Rpb24tY29uc3RydWN0LWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQWtDO0FBRWxDLG1DQUErQztBQUUvQyxvQ0FBMkM7QUFxRTNDOzs7O0dBSUc7QUFDSCxNQUFhLGdDQUFpQyxTQUFRLGtCQUFTOztJQUMzQyxTQUFTLENBQVM7SUFDbEIsU0FBUyxDQUFTO0lBQ2xCLFdBQVcsQ0FBUztJQUNwQixjQUFjLENBQWU7SUFDN0IsbUJBQW1CLENBQVU7SUFDN0Isa0JBQWtCLENBQVU7SUFDNUIsb0JBQW9CLENBQVU7SUFDN0IsV0FBVyxDQUFjO0lBQ3pCLGlCQUFpQixDQUFTO0lBRTNDLFlBQVksT0FBb0IsRUFBRSxPQUFpRDtRQUMvRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sRUFBRSxTQUFTLElBQUksY0FBYyxDQUFDO1FBQ3RELElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxFQUFFLFNBQVMsSUFBSSx1QkFBdUIsQ0FBQztRQUMvRCxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sRUFBRSxXQUFXLElBQUksYUFBYSxDQUFDO1FBQ3pELElBQUksQ0FBQyxjQUFjLEdBQUcsT0FBTyxFQUFFLGNBQWMsSUFBSSxFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQztRQUN4RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsT0FBTyxFQUFFLGtCQUFrQixDQUFDO1FBQ3RELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxPQUFPLEVB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LENBQUM7SUFDTCxDQUFDOztBQXBOTCw0RUFxTkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgQnVpbGRPcHRpb25zIH0gZnJvbSBcIkBtcmdyYWluL2Nkay1lc2J1aWxkXCI7XG5pbXBvcnQgeyBDb21wb25lbnQsIFNvdXJjZUNvZGUgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgdHlwZSB7IE5vZGVQcm9qZWN0IH0gZnJvbSBcInByb2plbi9saWIvamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgdHNjb25maWdEZXZQYXRoIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIExhbWJkYUZ1bmN0aW9uQ29uc3RydWN0R2VuZXJhdG9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhRnVuY3Rpb25Db25zdHJ1Y3RHZW5lcmF0b3JPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBTb3VyY2UgZGlyZWN0b3J5IHdoZXJlIExhbWJkYSBGdW5jdGlvbiBoYW5kbGVycyBhcmUgbG9jYXRlZFxuICAgICAqXG4gICAgICogQGRlZmF1bHQgXCJzcmMvaGFuZGxlcnNcIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHNvdXJjZURpcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgTGFtYmRhIEZ1bmN0aW9uIGNvbnN0cnVjdHMgd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwic3JjL2NvbnN0cnVjdHMvbGFtYmRhXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBvdXRwdXREaXI/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBGaWxlIHBhdHRlcm4gdG8gaWRlbnRpZnkgTGFtYmRhIEZ1bmN0aW9uIGhhbmRsZXJzXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcIioubGFtYmRhLnRzXCJcbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlUGF0dGVybj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIGVzYnVpbGQgb3B0aW9ucyB0byBjdXN0b21pemUgdGhlIGJ1bmRsaW5nIHByb2Nlc3NcbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHt9XG4gICAgICovXG4gICAgcmVhZG9ubHkgZXNidWlsZE9wdGlvbnM/OiBCdWlsZE9wdGlvbnM7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGF1dG9tYXRpY2FsbHkgYWRkIHRoZSByZXF1aXJlZCBkZXBlbmRlbmNpZXNcbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgKi9cbiAgICByZWFkb25seSBhZGREZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogSW1wb3J0IHN0YXRlbWVudCBmb3IgdGhlIGJhc2UgY29uc3RydWN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBcImltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanMnO1wiXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcImltcG9ydCB7IGF3c19sYW1iZGEgfSBmcm9tICdhd3MtY2RrLWxpYic7XCJcbiAgICAgKi9cbiAgICByZWFkb25seSBiYXNlQ29uc3RydWN0SW1wb3J0Pzogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgY29uc3RydWN0IGNsYXNzIHRvIGV4dGVuZFxuICAgICAqXG4gICAgICogQGV4YW1wbGUgXCJOb2RlanNGdW5jdGlvblwiXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBcImF3c19sYW1iZGEuRnVuY3Rpb25cIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJhc2VDb25zdHJ1Y3RDbGFzcz86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFBhY2thZ2UgbmFtZSB0byBhZGQgYXMgZGVwZW5kZW5jeSBmb3IgdGhlIGJhc2UgY29uc3RydWN0XG4gICAgICpcbiAgICAgKiBAZXhhbXBsZSBcImF3cy1jZGstbGliXCJcbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IFwiYXdzLWNkay1saWJcIlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJhc2VDb25zdHJ1Y3RQYWNrYWdlPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcHJvamVuIGNvbXBvbmVudCB0aGF0IGdlbmVyYXRlcyBBV1MgQ0RLIExhbWJkYSBGdW5jdGlvbiBjb25zdHJ1Y3RzIGFuZCBidW5kbGVzIHRoZWlyIGNvZGUgYXNzZXRzIHVzaW5nIGVzYnVpbGQuXG4gKlxuICogVGhlIGJ1bmRsaW5nIGhhcHBlbnMgZHVyaW5nIHByb2plbiBleGVjdXRpb24sIG5vdCBkdXJpbmcgQ0RLIHN5bnRoLCBlbmFibGluZyBhIFwiYnVpbGQgb25jZSwgZGVwbG95IG1hbnlcIiBwYXR0ZXJuLlxuICovXG5leHBvcnQgY2xhc3MgTGFtYmRhRnVuY3Rpb25Db25zdHJ1Y3RHZW5lcmF0b3IgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2VEaXI6IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0cHV0RGlyOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGZpbGVQYXR0ZXJuOiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGVzYnVpbGRPcHRpb25zOiBCdWlsZE9wdGlvbnM7XG4gICAgcHVibGljIHJlYWRvbmx5IGJhc2VDb25zdHJ1Y3RJbXBvcnQ/OiBzdHJpbmc7XG4gICAgcHVibGljIHJlYWRvbmx5IGJhc2VDb25zdHJ1Y3RDbGFzcz86IHN0cmluZztcbiAgICBwdWJsaWMgcmVhZG9ubHkgYmFzZUNvbnN0cnVjdFBhY2thZ2U/OiBzdHJpbmc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBub2RlUHJvamVjdDogTm9kZVByb2plY3Q7XG4gICAgcHJpdmF0ZSByZWFkb25seSBidW5kbGVyU2NyaXB0UGF0aDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IocHJvamVjdDogTm9kZVByb2plY3QsIG9wdGlvbnM/OiBMYW1iZGFGdW5jdGlvbkNvbnN0cnVjdEdlbmVyYXRvck9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCk7XG4gICAgICAgIHRoaXMubm9kZVByb2plY3QgPSBwcm9qZWN0O1xuICAgICAgICB0aGlzLnNvdXJjZURpciA9IG9wdGlvbnM/LnNvdXJjZURpciA/PyBcInNyYy9oYW5kbGVyc1wiO1xuICAgICAgICB0aGlzLm91dHB1dERpciA9IG9wdGlvbnM/Lm91dHB1dERpciA/PyBcInNyYy9jb25zdHJ1Y3RzL2xhbWJkYVwiO1xuICAgICAgICB0aGlzLmZpbGVQYXR0ZXJuID0gb3B0aW9ucz8uZmlsZVBhdHRlcm4gPz8gXCIqLmxhbWJkYS50c1wiO1xuICAgICAgICB0aGlzLmVzYnVpbGRPcHRpb25zID0gb3B0aW9ucz8uZXNidWlsZE9wdGlvbnMgPz8ge307XG4gICAgICAgIHRoaXMuYmFzZUNvbnN0cnVjdEltcG9ydCA9IG9wdGlvbnM/LmJhc2VDb25zdHJ1Y3RJbXBvcnQ7XG4gICAgICAgIHRoaXMuYmFzZUNvbnN0cnVjdENsYXNzID0gb3B0aW9ucz8uYmFzZUNvbnN0cnVjdENsYXNzO1xuICAgICAgICB0aGlzLmJhc2VDb25zdHJ1Y3RQYWNrYWdlID0gb3B0aW9ucz8uYmFzZUNvbnN0cnVjdFBhY2thZ2U7XG5cbiAgICAgICAgY29uc3QgdW5pcXVlSWQgPSB0aGlzLmNyZWF0ZVVuaXF1ZUlkKHRoaXMuc291cmNlRGlyLCB0aGlzLmZpbGVQYXR0ZXJuKTtcbiAgICAgICAgdGhpcy5idW5kbGVyU2NyaXB0UGF0aCA9IHBhdGguam9pbihcIi5wcm9qZW5cIiwgYGdlbmVyYXRlLWFuZC1idW5kbGUtJHt1bmlxdWVJZH0udHNgKTtcblxuICAgICAgICBpZiAob3B0aW9ucz8uYWRkRGVwZW5kZW5jaWVzID8/IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRGVwZW5kZW5jaWVzKG9wdGlvbnM/LmJhc2VDb25zdHJ1Y3RQYWNrYWdlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlQnVuZGxlVGFzaygpO1xuICAgICAgICB0aGlzLmFkZEJ1bmRsZVRhc2tUb1dvcmtmbG93KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhZGREZXBlbmRlbmNpZXMoYWRkaXRpb25hbFBhY2thZ2U/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5ub2RlUHJvamVjdC5hZGREZXBzKFwiYXdzLWNkay1saWJcIiwgXCJjb25zdHJ1Y3RzXCIpO1xuXG4gICAgICAgIGlmIChhZGRpdGlvbmFsUGFja2FnZSAmJiBhZGRpdGlvbmFsUGFja2FnZSAhPT0gXCJhd3MtY2RrLWxpYlwiICYmIGFkZGl0aW9uYWxQYWNrYWdlICE9PSBcImNvbnN0cnVjdHNcIikge1xuICAgICAgICAgICAgdGhpcy5ub2RlUHJvamVjdC5hZGREZXBzKGFkZGl0aW9uYWxQYWNrYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlVW5pcXVlSWQoc291cmNlRGlyOiBzdHJpbmcsIGZpbGVQYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBkaXJQYXJ0ID0gc291cmNlRGlyLnJlcGxhY2UoL1xcLy9nLCBcIi1cIikucmVwbGFjZSgvW15cXHctXS9nLCBcIlwiKTtcbiAgICAgICAgY29uc3QgcGF0dGVyblBhcnQgPSBmaWxlUGF0dGVyblxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcKi9nLCBcIlwiKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLi9nLCBcIi1cIilcbiAgICAgICAgICAgIC5yZXBsYWNlKC9bXlxcdy1dL2csIFwiXCIpO1xuICAgICAgICByZXR1cm4gYCR7ZGlyUGFydH0tJHtwYXR0ZXJuUGFydH1gLnJlcGxhY2UoLy0tKy9nLCBcIi1cIikucmVwbGFjZSgvXi18LSQvZywgXCJcIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCdW5kbGVUYXNrKCkge1xuICAgICAgICBjb25zdCB1bmlxdWVJZCA9IHRoaXMuY3JlYXRlVW5pcXVlSWQodGhpcy5zb3VyY2VEaXIsIHRoaXMuZmlsZVBhdHRlcm4pO1xuICAgICAgICBjb25zdCB0YXNrTmFtZSA9IGBnZW5lcmF0ZS1hbmQtYnVuZGxlLSR7dW5pcXVlSWR9YDtcblxuICAgICAgICBsZXQgYmFzZUNvbnN0cnVjdEFyZ3MgPSBcIlwiO1xuICAgICAgICBpZiAodGhpcy5iYXNlQ29uc3RydWN0SW1wb3J0KSB7XG4gICAgICAgICAgICBiYXNlQ29uc3RydWN0QXJncyArPSBgIC0tYmFzZS1jb25zdHJ1Y3QtaW1wb3J0ICcke3RoaXMuYmFzZUNvbnN0cnVjdEltcG9ydH0nYDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5iYXNlQ29uc3RydWN0Q2xhc3MpIHtcbiAgICAgICAgICAgIGJhc2VDb25zdHJ1Y3RBcmdzICs9IGAgLS1iYXNlLWNvbnN0cnVjdC1jbGFzcyAnJHt0aGlzLmJhc2VDb25zdHJ1Y3RDbGFzc30nYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJ1bmRsZVRhc2sgPSB0aGlzLm5vZGVQcm9qZWN0LmFkZFRhc2sodGFza05hbWUsIHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgR2VuZXJhdGUgTGFtYmRhIEZ1bmN0aW9uIENvbnN0cnVjdHMgZnJvbSAke3RoaXMuc291cmNlRGlyfS8ke3RoaXMuZmlsZVBhdHRlcm59IGFuZCBidW5kbGUgdGhlaXIgaGFuZGxlcnNgLFxuICAgICAgICAgICAgZXhlYzogYHRzeCAtLXRzY29uZmlnICR7dHNjb25maWdEZXZQYXRoKHRoaXMubm9kZVByb2plY3QpfSAke3RoaXMuYnVuZGxlclNjcmlwdFBhdGh9IC0tc291cmNlLWRpciAke3RoaXMuc291cmNlRGlyfSAtLW91dHB1dC1kaXIgJHt0aGlzLm91dHB1dERpcn0gLS1maWxlLXBhdHRlcm4gXCIke3RoaXMuZmlsZVBhdHRlcm59XCIgLS1lc2J1aWxkLW9wdGlvbnMgJyR7SlNPTi5zdHJpbmdpZnkodGhpcy5lc2J1aWxkT3B0aW9ucyl9JyR7YmFzZUNvbnN0cnVjdEFyZ3N9YCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5jcmVhdGVCdW5kbGVyU2NyaXB0KCk7XG5cbiAgICAgICAgcmV0dXJuIGJ1bmRsZVRhc2s7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVCdW5kbGVyU2NyaXB0KCkge1xuICAgICAgICBjb25zdCBidW5kbGVyU2NyaXB0ID0gYC8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIGVzYnVpbGQgZnJvbSAnZXNidWlsZCc7XG5pbXBvcnQgKiBhcyBnbG9iIGZyb20gJ2dsb2InO1xuaW1wb3J0IHsgcGFzY2FsQ2FzZSB9IGZyb20gJ2NoYW5nZS1jYXNlJztcbmltcG9ydCB5YXJncyBmcm9tICd5YXJncy95YXJncyc7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSAneWFyZ3MvaGVscGVycyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1haW4oKSB7XG4gIGNvbnN0IGFyZ3YgPSBhd2FpdCB5YXJncyhoaWRlQmluKHByb2Nlc3MuYXJndikpXG4gICAgLm9wdGlvbignc291cmNlLWRpcicsIHsgdHlwZTogJ3N0cmluZycsIGRlZmF1bHQ6ICdzcmMvaGFuZGxlcnMnLCBkZXNjcmlwdGlvbjogJ1NvdXJjZSBkaXJlY3Rvcnkgd2hlcmUgTGFtYmRhIEZ1bmN0aW9uIGhhbmRsZXJzIGFyZSBsb2NhdGVkJyB9KVxuICAgIC5vcHRpb24oJ291dHB1dC1kaXInLCB7IHR5cGU6ICdzdHJpbmcnLCBkZWZhdWx0OiAnc3JjL2NvbnN0cnVjdHMvbGFtYmRhJywgZGVzY3JpcHRpb246ICdPdXRwdXQgZGlyZWN0b3J5IHdoZXJlIExhbWJkYSBGdW5jdGlvbiBjb25zdHJ1Y3RzIHdpbGwgYmUgZ2VuZXJhdGVkJyB9KVxuICAgIC5vcHRpb24oJ2ZpbGUtcGF0dGVybicsIHsgdHlwZTogJ3N0cmluZycsIGRlZmF1bHQ6ICcqLmxhbWJkYS50cycsIGRlc2NyaXB0aW9uOiAnRmlsZSBwYXR0ZXJuIHRvIGlkZW50aWZ5IExhbWJkYSBGdW5jdGlvbiBoYW5kbGVycycgfSlcbiAgICAub3B0aW9uKCdlc2J1aWxkLW9wdGlvbnMnLCB7IHR5cGU6ICdzdHJpbmcnLCBkZWZhdWx0OiAne30nLCBkZXNjcmlwdGlvbjogJ2VzYnVpbGQgb3B0aW9ucyBhcyBKU09OIHN0cmluZycgfSlcbiAgICAub3B0aW9uKCdiYXNlLWNvbnN0cnVjdC1pbXBvcnQnLCB7IHR5cGU6ICdzdHJpbmcnLCBkZXNjcmlwdGlvbjogJ0ltcG9ydCBzdGF0ZW1lbnQgZm9yIHRoZSBiYXNlIGNvbnN0cnVjdCcgfSlcbiAgICAub3B0aW9uKCdiYXNlLWNvbnN0cnVjdC1jbGFzcycsIHsgdHlwZTogJ3N0cmluZycsIGRlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgY29uc3RydWN0IGNsYXNzIHRvIGV4dGVuZCcgfSlcbiAgICAuaGVscCgpXG4gICAgLnBhcnNlKCk7XG5cbiAgY29uc3Qgc291cmNlRGlyID0gYXJndlsnc291cmNlLWRpciddO1xuICBjb25zdCBvdXRwdXREaXIgPSBhcmd2WydvdXRwdXQtZGlyJ107XG4gIGNvbnN0IGZpbGVQYXR0ZXJuID0gYXJndlsnZmlsZS1wYXR0ZXJuJ107XG4gIGNvbnN0IGVzYnVpbGRPcHRpb25zID0gSlNPTi5wYXJzZShhcmd2Wydlc2J1aWxkLW9wdGlvbnMnXSBhcyBzdHJpbmcpO1xuICBjb25zdCBiYXNlQ29uc3RydWN0SW1wb3J0ID0gYXJndlsnYmFzZS1jb25zdHJ1Y3QtaW1wb3J0J10gYXMgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBjb25zdCBiYXNlQ29uc3RydWN0Q2xhc3MgPSBhcmd2WydiYXNlLWNvbnN0cnVjdC1jbGFzcyddIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBmcy5ta2RpclN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG91dHB1dERpciksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGFzc2V0c0RpciA9IHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCAnYXNzZXRzJywgJ2hhbmRsZXJzJyk7XG4gIGZzLm1rZGlyU3luYyhhc3NldHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIGNvbnN0IGhhbmRsZXJGaWxlcyA9IGdsb2Iuc3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgc291cmNlRGlyLCBmaWxlUGF0dGVybikpO1xuXG4gIGNvbnNvbGUubG9nKFxcYEZvdW5kIFxcJHtoYW5kbGVyRmlsZXMubGVuZ3RofSBMYW1iZGEgRnVuY3Rpb24gaGFuZGxlciBmaWxlc1xcYCk7XG5cbiAgZm9yIChjb25zdCBoYW5kbGVyRmlsZSBvZiBoYW5kbGVyRmlsZXMpIHtcbiAgICBjb25zdCByZWxhdGl2ZVBhdGggPSBwYXRoLnJlbGF0aXZlKHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBzb3VyY2VEaXIpLCBoYW5kbGVyRmlsZSk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKHJlbGF0aXZlUGF0aCwgcGF0aC5leHRuYW1lKHJlbGF0aXZlUGF0aCkpO1xuICAgIGNvbnN0IGZ1bmN0aW9uTmFtZSA9IGZpbGVOYW1lLnJlcGxhY2UoJy5sYW1iZGEnLCAnJyk7XG5cbiAgICBjb25zb2xlLmxvZyhcXGBQcm9jZXNzaW5nIExhbWJkYSBGdW5jdGlvbiBoYW5kbGVyOiBcXCR7ZnVuY3Rpb25OYW1lfVxcYCk7XG5cbiAgICBjb25zdCBmdW5jdGlvbkRpciA9IHBhdGguam9pbihhc3NldHNEaXIsIGZ1bmN0aW9uTmFtZSk7XG4gICAgZnMubWtkaXJTeW5jKGZ1bmN0aW9uRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IG91dGZpbGUgPSBwYXRoLmpvaW4oZnVuY3Rpb25EaXIsICdpbmRleC5qcycpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGVzYnVpbGQuYnVpbGQoe1xuICAgICAgICBlbnRyeVBvaW50czogW2hhbmRsZXJGaWxlXSxcbiAgICAgICAgYnVuZGxlOiB0cnVlLFxuICAgICAgICBtaW5pZnk6IHRydWUsXG4gICAgICAgIHBsYXRmb3JtOiAnbm9kZScsXG4gICAgICAgIHRhcmdldDogJ25vZGUxOCcsXG4gICAgICAgIG91dGZpbGUsXG4gICAgICAgIC4uLmVzYnVpbGRPcHRpb25zLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnNvbGUubG9nKFxcYFN1Y2Nlc3NmdWxseSBidW5kbGVkIFxcJHtmdW5jdGlvbk5hbWV9IHRvIFxcJHtvdXRmaWxlfVxcYCk7XG5cbiAgICAgIGNvbnN0IGNvbnN0cnVjdEZpbGVQYXRoID0gcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIG91dHB1dERpciwgXFxgXFwke2Z1bmN0aW9uTmFtZX0udHNcXGApO1xuICAgICAgY29uc3QgY29uc3RydWN0Q29kZSA9IGdlbmVyYXRlQ29uc3RydWN0Q29kZShmdW5jdGlvbk5hbWUsIHJlbGF0aXZlUGF0aCwgYmFzZUNvbnN0cnVjdEltcG9ydCwgYmFzZUNvbnN0cnVjdENsYXNzKTtcblxuICAgICAgZnMud3JpdGVGaWxlU3luYyhjb25zdHJ1Y3RGaWxlUGF0aCwgY29uc3RydWN0Q29kZSk7XG4gICAgICBjb25zb2xlLmxvZyhcXGBHZW5lcmF0ZWQgY29uc3RydWN0IGF0IFxcJHtjb25zdHJ1Y3RGaWxlUGF0aH1cXGApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxcYEVycm9yIHByb2Nlc3NpbmcgXFwke2Z1bmN0aW9uTmFtZX06XFxgLCBlcnJvcik7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ29uc3RydWN0Q29kZShmdW5jdGlvbk5hbWU6IHN0cmluZywgaGFuZGxlclBhdGg6IHN0cmluZywgYmFzZUNvbnN0cnVjdEltcG9ydD86IHN0cmluZywgYmFzZUNvbnN0cnVjdENsYXNzPzogc3RyaW5nKSB7XG4gIGNvbnN0IGNvbnN0cnVjdE5hbWUgPSBcXGBcXCR7cGFzY2FsQ2FzZShmdW5jdGlvbk5hbWUpfUZ1bmN0aW9uXFxgO1xuXG4gIGNvbnN0IGltcG9ydFN0YXRlbWVudCA9IGJhc2VDb25zdHJ1Y3RJbXBvcnQgPz8gXCJcIjtcbiAgY29uc3QgYmFzZUNsYXNzTmFtZSA9IGJhc2VDb25zdHJ1Y3RDbGFzcyA/PyBcImF3c19sYW1iZGEuRnVuY3Rpb25cIjtcblxuICBjb25zdCB1c2VBd3NMYW1iZGFSdW50aW1lID0gIWJhc2VDb25zdHJ1Y3RDbGFzcyB8fCBiYXNlQ2xhc3NOYW1lLmluY2x1ZGVzKFwiRnVuY3Rpb25cIik7XG5cbiAgcmV0dXJuIFxcYC8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cblxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICd1cmwnO1xuXFwke2ltcG9ydFN0YXRlbWVudH1cbmltcG9ydCB7IGF3c19sYW1iZGEgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IF9fZGlybmFtZSA9IHBhdGguZGlybmFtZShfX2ZpbGVuYW1lKTtcblxuZXhwb3J0IGludGVyZmFjZSBcXCR7Y29uc3RydWN0TmFtZX1Qcm9wcyBleHRlbmRzIE9taXQ8XFwke2Jhc2VDbGFzc05hbWUgPT09IFwiYXdzX2xhbWJkYS5GdW5jdGlvblwiID8gXCJhd3NfbGFtYmRhLkZ1bmN0aW9uUHJvcHNcIiA6IFxcYFxcJHtiYXNlQ2xhc3NOYW1lfVByb3BzXFxgfSwgJ2NvZGUnXFwke3VzZUF3c0xhbWJkYVJ1bnRpbWUgPyBcIiB8ICdydW50aW1lJ1wiIDogXCJcIn0gfCAnaGFuZGxlcic+IHtcbiAgXFwke3VzZUF3c0xhbWJkYVJ1bnRpbWUgPyBcXGAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgcnVudGltZVxuICAgKiBAZGVmYXVsdCBub2RlanMyMi54XG4gICAqL1xuICByZWFkb25seSBydW50aW1lPzogYXdzX2xhbWJkYS5SdW50aW1lO1xcYCA6IFwiXCJ9XG59XG5cbmV4cG9ydCBjbGFzcyBcXCR7Y29uc3RydWN0TmFtZX0gZXh0ZW5kcyBcXCR7YmFzZUNsYXNzTmFtZX0ge1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogXFwke2NvbnN0cnVjdE5hbWV9UHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBcXCR7dXNlQXdzTGFtYmRhUnVudGltZSA/IFwicnVudGltZTogcHJvcHMucnVudGltZSA/PyBhd3NfbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIyX1gsXCIgOiBcIlwifVxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogYXdzX2xhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vLi4vYXNzZXRzL2hhbmRsZXJzL1xcJHtmdW5jdGlvbk5hbWV9JykpLFxuICAgIH0pO1xuICB9XG59XG5cXGA7XG59XG5cbm1haW4oKS5jYXRjaChlcnJvciA9PiB7XG4gIGNvbnNvbGUuZXJyb3IoJ0Vycm9yOicsIGVycm9yKTtcbiAgcHJvY2Vzcy5leGl0KDEpO1xufSk7XG5gO1xuXG4gICAgICAgIGNvbnN0IHNyYyA9IG5ldyBTb3VyY2VDb2RlKHRoaXMucHJvamVjdCwgdGhpcy5idW5kbGVyU2NyaXB0UGF0aCk7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gYnVuZGxlclNjcmlwdC5zcGxpdChcIlxcblwiKTtcbiAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICBzcmMubGluZShsaW5lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm9kZVByb2plY3QuYWRkRGV2RGVwcyhcImVzYnVpbGRcIiwgXCJnbG9iXCIsIFwieWFyZ3NcIiwgXCJAdHlwZXMvZ2xvYlwiLCBcIkB0eXBlcy95YXJnc1wiLCBcInRzeFwiLCBcImNoYW5nZS1jYXNlXCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQnVuZGxlVGFza1RvV29ya2Zsb3coKSB7XG4gICAgICAgIGNvbnN0IGNvbXBpbGVUYXNrID0gdGhpcy5ub2RlUHJvamVjdC50YXNrcy50cnlGaW5kKFwiY29tcGlsZVwiKTtcblxuICAgICAgICBpZiAoY29tcGlsZVRhc2spIHtcbiAgICAgICAgICAgIGNvbnN0IHVuaXF1ZUlkID0gdGhpcy5jcmVhdGVVbmlxdWVJZCh0aGlzLnNvdXJjZURpciwgdGhpcy5maWxlUGF0dGVybik7XG4gICAgICAgICAgICBjb25zdCB0YXNrTmFtZSA9IGBnZW5lcmF0ZS1hbmQtYnVuZGxlLSR7dW5pcXVlSWR9YDtcbiAgICAgICAgICAgIGNvbnN0IGJ1bmRsZVRhc2sgPSB0aGlzLm5vZGVQcm9qZWN0LnRhc2tzLnRyeUZpbmQodGFza05hbWUpO1xuICAgICAgICAgICAgaWYgKGJ1bmRsZVRhc2spIHtcbiAgICAgICAgICAgICAgICBjb21waWxlVGFzay5wcmVwZW5kU3Bhd24oYnVuZGxlVGFzayk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
@@ -1,11 +1,43 @@
1
1
  import type { IConstruct } from "constructs";
2
2
  import { Component } from "projen/lib/component";
3
+ /**
4
+ * Options for LocalStack component.
5
+ */
3
6
  export interface LocalStackOptions {
7
+ /**
8
+ * LocalStack services to enable.
9
+ * @default - all services enabled
10
+ */
4
11
  readonly services?: string[];
12
+ /**
13
+ * LocalStack gateway port.
14
+ * @default 4566
15
+ */
5
16
  readonly port?: number;
17
+ /**
18
+ * Enable LocalStack debug mode.
19
+ * @default false
20
+ */
6
21
  readonly debug?: boolean;
22
+ /**
23
+ * LocalStack Docker image tag, e.g. `"4.9"` to pin a version.
24
+ *
25
+ * When set, LocalStack starts with the `localstack/localstack:<imageTag>` image, passed to
26
+ * `localstack start` through the `IMAGE_NAME` environment variable. That's the community
27
+ * image, even if a `LOCALSTACK_AUTH_TOKEN` would otherwise select the Pro image.
28
+ *
29
+ * Must be a valid Docker tag.
30
+ *
31
+ * @default - the LocalStack CLI's default image
32
+ * @see https://docs.localstack.cloud/aws/customization/configuration-options/
33
+ */
7
34
  readonly imageTag?: string;
8
35
  }
36
+ /**
37
+ * LocalStack component for projen projects.
38
+ *
39
+ * Adds LocalStack support to your project with automatic Docker/Colima setup.
40
+ */
9
41
  export declare class LocalStack extends Component {
10
42
  constructor(scope: IConstruct, options?: LocalStackOptions);
11
43
  }
@@ -6,8 +6,13 @@ const component_1 = require("projen/lib/component");
6
6
  const javascript_1 = require("projen/lib/javascript");
7
7
  const colima_1 = require("./colima");
8
8
  const homebrew_1 = require("./homebrew");
9
+ /**
10
+ * LocalStack component for projen projects.
11
+ *
12
+ * Adds LocalStack support to your project with automatic Docker/Colima setup.
13
+ */
9
14
  class LocalStack extends component_1.Component {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LocalStack", version: "0.3.79" };
15
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.LocalStack", version: "0.3.81" };
11
16
  constructor(scope, options = {}) {
12
17
  super(scope);
13
18
  const project = javascript_1.NodeProject.of(this);
@@ -16,6 +21,10 @@ class LocalStack extends component_1.Component {
16
21
  }
17
22
  const port = options.port ?? 4566;
18
23
  const debug = options.debug ?? false;
24
+ /* The tag ends up in a shell command, so only accept valid Docker tags */
25
+ if (options.imageTag !== undefined && !/^[\w][\w.-]{0,127}$/.test(options.imageTag)) {
26
+ throw new Error(`LocalStack imageTag "${options.imageTag}" is not a valid Docker image tag`);
27
+ }
19
28
  new colima_1.Colima(project);
20
29
  let homebrew = homebrew_1.Homebrew.of(project);
21
30
  if (!homebrew) {
@@ -27,6 +36,9 @@ class LocalStack extends component_1.Component {
27
36
  if (options.services) {
28
37
  envVars.push(`SERVICES=${options.services.join(",")}`);
29
38
  }
39
+ if (options.imageTag !== undefined) {
40
+ envVars.push(`IMAGE_NAME=localstack/localstack:${options.imageTag}`);
41
+ }
30
42
  const localstackTask = project.addTask("localstack", {
31
43
  exec: `localstack status | grep -q running || ${envVars.join(" ")} localstack start -d`,
32
44
  });
@@ -41,4 +53,4 @@ class LocalStack extends component_1.Component {
41
53
  }
42
54
  }
43
55
  exports.LocalStack = LocalStack;
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2xvY2Fsc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLG9EQUFpRDtBQUNqRCxzREFBb0Q7QUFDcEQscUNBQWtDO0FBQ2xDLHlDQUFzQztBQVN0QyxNQUFhLFVBQVcsU0FBUSxxQkFBUzs7SUFDckMsWUFBWSxLQUFpQixFQUFFLFVBQTZCLEVBQUU7UUFDMUQsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsTUFBTSxPQUFPLEdBQUcsd0JBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLHdCQUFXLENBQUMsRUFBRSxDQUFDO1lBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7UUFDbEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7UUFFckMsSUFBSSxlQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFcEIsSUFBSSxRQUFRLEdBQUcsbUJBQVEsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ1osUUFBUSxHQUFHLElBQUksbUJBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBRUQsUUFBUSxDQUFDLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUVsQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUVuRCxNQUFNLE9BQU8sR0FBRyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsRUFBRSxvQkFBb0IsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDckYsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDakQsSUFBSSxFQUFFLDBDQUEwQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxzQkFBc0I7U0FDMUYsQ0FBQyxDQUFDO1FBRUgsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNiLGNBQWMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUVELE9BQU8sQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFFcEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsQ0FBQyxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNMLENBQUM7O0FBMUNMLGdDQTJDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwicHJvamVuL2xpYi9jb21wb25lbnRcIjtcbmltcG9ydCB7IE5vZGVQcm9qZWN0IH0gZnJvbSBcInByb2plbi9saWIvamF2YXNjcmlwdFwiO1xuaW1wb3J0IHsgQ29saW1hIH0gZnJvbSBcIi4vY29saW1hXCI7XG5pbXBvcnQgeyBIb21lYnJldyB9IGZyb20gXCIuL2hvbWVicmV3XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9jYWxTdGFja09wdGlvbnMge1xuICAgIHJlYWRvbmx5IHNlcnZpY2VzPzogc3RyaW5nW107XG4gICAgcmVhZG9ubHkgcG9ydD86IG51bWJlcjtcbiAgICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG4gICAgcmVhZG9ubHkgaW1hZ2VUYWc/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBMb2NhbFN0YWNrIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihzY29wZTogSUNvbnN0cnVjdCwgb3B0aW9uczogTG9jYWxTdGFja09wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihzY29wZSk7XG5cbiAgICAgICAgY29uc3QgcHJvamVjdCA9IE5vZGVQcm9qZWN0Lm9mKHRoaXMpO1xuICAgICAgICBpZiAoIShwcm9qZWN0IGluc3RhbmNlb2YgTm9kZVByb2plY3QpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2NhbFN0YWNrIGNvbXBvbmVudCByZXF1aXJlcyBhIE5vZGVQcm9qZWN0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcG9ydCA9IG9wdGlvbnMucG9ydCA/PyA0NTY2O1xuICAgICAgICBjb25zdCBkZWJ1ZyA9IG9wdGlvbnMuZGVidWcgPz8gZmFsc2U7XG5cbiAgICAgICAgbmV3IENvbGltYShwcm9qZWN0KTtcblxuICAgICAgICBsZXQgaG9tZWJyZXcgPSBIb21lYnJldy5vZihwcm9qZWN0KTtcbiAgICAgICAgaWYgKCFob21lYnJldykge1xuICAgICAgICAgICAgaG9tZWJyZXcgPSBuZXcgSG9tZWJyZXcocHJvamVjdCk7XG4gICAgICAgIH1cblxuICAgICAgICBob21lYnJldy5hZGRQYWNrYWdlKFwibG9jYWxzdGFja1wiKTtcblxuICAgICAgICBjb25zdCBjb2xpbWFUYXNrID0gcHJvamVjdC50YXNrcy50cnlGaW5kKFwiY29saW1hXCIpO1xuXG4gICAgICAgIGNvbnN0IGVudlZhcnMgPSBbYExPQ0FMU1RBQ0tfUE9SVD0ke3BvcnR9YCwgYExPQ0FMU1RBQ0tfREVCVUc9JHtkZWJ1ZyA/IFwiMVwiIDogXCIwXCJ9YF07XG4gICAgICAgIGlmIChvcHRpb25zLnNlcnZpY2VzKSB7XG4gICAgICAgICAgICBlbnZWYXJzLnB1c2goYFNFUlZJQ0VTPSR7b3B0aW9ucy5zZXJ2aWNlcy5qb2luKFwiLFwiKX1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxvY2Fsc3RhY2tUYXNrID0gcHJvamVjdC5hZGRUYXNrKFwibG9jYWxzdGFja1wiLCB7XG4gICAgICAgICAgICBleGVjOiBgbG9jYWxzdGFjayBzdGF0dXMgfCBncmVwIC1xIHJ1bm5pbmcgfHwgJHtlbnZWYXJzLmpvaW4oXCIgXCIpfSBsb2NhbHN0YWNrIHN0YXJ0IC1kYCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGNvbGltYVRhc2spIHtcbiAgICAgICAgICAgIGxvY2Fsc3RhY2tUYXNrLnByZXBlbmRTcGF3bihjb2xpbWFUYXNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb2plY3QuYWRkRGV2RGVwcyhcImF3cy1jZGstbG9jYWxcIik7XG5cbiAgICAgICAgY29uc3QgdGVzdFRhc2sgPSBwcm9qZWN0LnRhc2tzLnRyeUZpbmQoXCJ0ZXN0XCIpO1xuICAgICAgICBpZiAodGVzdFRhc2spIHtcbiAgICAgICAgICAgIHRlc3RUYXNrLnByZXBlbmRTcGF3bihsb2NhbHN0YWNrVGFzayk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21wb25lbnRzL2xvY2Fsc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLG9EQUFpRDtBQUNqRCxzREFBb0Q7QUFDcEQscUNBQWtDO0FBQ2xDLHlDQUFzQztBQXVDdEM7Ozs7R0FJRztBQUNILE1BQWEsVUFBVyxTQUFRLHFCQUFTOztJQUNyQyxZQUFZLEtBQWlCLEVBQUUsVUFBNkIsRUFBRTtRQUMxRCxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFYixNQUFNLE9BQU8sR0FBRyx3QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsQ0FBQyxPQUFPLFlBQVksd0JBQVcsQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQztRQUVyQywwRUFBMEU7UUFDMUUsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNsRixNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixPQUFPLENBQUMsUUFBUSxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFFRCxJQUFJLGVBQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVwQixJQUFJLFFBQVEsR0FBRyxtQkFBUSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDWixRQUFRLEdBQUcsSUFBSSxtQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLENBQUM7UUFFRCxRQUFRLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRWxDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sT0FBTyxHQUFHLENBQUMsbUJBQW1CLElBQUksRUFBRSxFQUFFLG9CQUFvQixLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNyRixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxvQ0FBb0MsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUVELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ2pELElBQUksRUFBRSwwQ0FBMEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsc0JBQXNCO1NBQzFGLENBQUMsQ0FBQztRQUVILElBQUksVUFBVSxFQUFFLENBQUM7WUFDYixjQUFjLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFFRCxPQUFPLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBRXBDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQy9DLElBQUksUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDTCxDQUFDOztBQWxETCxnQ0FtREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IElDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcInByb2plbi9saWIvY29tcG9uZW50XCI7XG5pbXBvcnQgeyBOb2RlUHJvamVjdCB9IGZyb20gXCJwcm9qZW4vbGliL2phdmFzY3JpcHRcIjtcbmltcG9ydCB7IENvbGltYSB9IGZyb20gXCIuL2NvbGltYVwiO1xuaW1wb3J0IHsgSG9tZWJyZXcgfSBmcm9tIFwiLi9ob21lYnJld1wiO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIExvY2FsU3RhY2sgY29tcG9uZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsU3RhY2tPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBMb2NhbFN0YWNrIHNlcnZpY2VzIHRvIGVuYWJsZS5cbiAgICAgKiBAZGVmYXVsdCAtIGFsbCBzZXJ2aWNlcyBlbmFibGVkXG4gICAgICovXG4gICAgcmVhZG9ubHkgc2VydmljZXM/OiBzdHJpbmdbXTtcblxuICAgIC8qKlxuICAgICAqIExvY2FsU3RhY2sgZ2F0ZXdheSBwb3J0LlxuICAgICAqIEBkZWZhdWx0IDQ1NjZcbiAgICAgKi9cbiAgICByZWFkb25seSBwb3J0PzogbnVtYmVyO1xuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIExvY2FsU3RhY2sgZGVidWcgbW9kZS5cbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlYnVnPzogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIExvY2FsU3RhY2sgRG9ja2VyIGltYWdlIHRhZywgZS5nLiBgXCI0LjlcImAgdG8gcGluIGEgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIFdoZW4gc2V0LCBMb2NhbFN0YWNrIHN0YXJ0cyB3aXRoIHRoZSBgbG9jYWxzdGFjay9sb2NhbHN0YWNrOjxpbWFnZVRhZz5gIGltYWdlLCBwYXNzZWQgdG9cbiAgICAgKiBgbG9jYWxzdGFjayBzdGFydGAgdGhyb3VnaCB0aGUgYElNQUdFX05BTUVgIGVudmlyb25tZW50IHZhcmlhYmxlLiBUaGF0J3MgdGhlIGNvbW11bml0eVxuICAgICAqIGltYWdlLCBldmVuIGlmIGEgYExPQ0FMU1RBQ0tfQVVUSF9UT0tFTmAgd291bGQgb3RoZXJ3aXNlIHNlbGVjdCB0aGUgUHJvIGltYWdlLlxuICAgICAqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIERvY2tlciB0YWcuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAtIHRoZSBMb2NhbFN0YWNrIENMSSdzIGRlZmF1bHQgaW1hZ2VcbiAgICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5sb2NhbHN0YWNrLmNsb3VkL2F3cy9jdXN0b21pemF0aW9uL2NvbmZpZ3VyYXRpb24tb3B0aW9ucy9cbiAgICAgKi9cbiAgICByZWFkb25seSBpbWFnZVRhZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBMb2NhbFN0YWNrIGNvbXBvbmVudCBmb3IgcHJvamVuIHByb2plY3RzLlxuICpcbiAqIEFkZHMgTG9jYWxTdGFjayBzdXBwb3J0IHRvIHlvdXIgcHJvamVjdCB3aXRoIGF1dG9tYXRpYyBEb2NrZXIvQ29saW1hIHNldHVwLlxuICovXG5leHBvcnQgY2xhc3MgTG9jYWxTdGFjayBleHRlbmRzIENvbXBvbmVudCB7XG4gICAgY29uc3RydWN0b3Ioc2NvcGU6IElDb25zdHJ1Y3QsIG9wdGlvbnM6IExvY2FsU3RhY2tPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIoc2NvcGUpO1xuXG4gICAgICAgIGNvbnN0IHByb2plY3QgPSBOb2RlUHJvamVjdC5vZih0aGlzKTtcbiAgICAgICAgaWYgKCEocHJvamVjdCBpbnN0YW5jZW9mIE5vZGVQcm9qZWN0KSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTG9jYWxTdGFjayBjb21wb25lbnQgcmVxdWlyZXMgYSBOb2RlUHJvamVjdFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvcnQgPSBvcHRpb25zLnBvcnQgPz8gNDU2NjtcbiAgICAgICAgY29uc3QgZGVidWcgPSBvcHRpb25zLmRlYnVnID8/IGZhbHNlO1xuXG4gICAgICAgIC8qIFRoZSB0YWcgZW5kcyB1cCBpbiBhIHNoZWxsIGNvbW1hbmQsIHNvIG9ubHkgYWNjZXB0IHZhbGlkIERvY2tlciB0YWdzICovXG4gICAgICAgIGlmIChvcHRpb25zLmltYWdlVGFnICE9PSB1bmRlZmluZWQgJiYgIS9eW1xcd11bXFx3Li1dezAsMTI3fSQvLnRlc3Qob3B0aW9ucy5pbWFnZVRhZykpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTG9jYWxTdGFjayBpbWFnZVRhZyBcIiR7b3B0aW9ucy5pbWFnZVRhZ31cIiBpcyBub3QgYSB2YWxpZCBEb2NrZXIgaW1hZ2UgdGFnYCk7XG4gICAgICAgIH1cblxuICAgICAgICBuZXcgQ29saW1hKHByb2plY3QpO1xuXG4gICAgICAgIGxldCBob21lYnJldyA9IEhvbWVicmV3Lm9mKHByb2plY3QpO1xuICAgICAgICBpZiAoIWhvbWVicmV3KSB7XG4gICAgICAgICAgICBob21lYnJldyA9IG5ldyBIb21lYnJldyhwcm9qZWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGhvbWVicmV3LmFkZFBhY2thZ2UoXCJsb2NhbHN0YWNrXCIpO1xuXG4gICAgICAgIGNvbnN0IGNvbGltYVRhc2sgPSBwcm9qZWN0LnRhc2tzLnRyeUZpbmQoXCJjb2xpbWFcIik7XG5cbiAgICAgICAgY29uc3QgZW52VmFycyA9IFtgTE9DQUxTVEFDS19QT1JUPSR7cG9ydH1gLCBgTE9DQUxTVEFDS19ERUJVRz0ke2RlYnVnID8gXCIxXCIgOiBcIjBcIn1gXTtcbiAgICAgICAgaWYgKG9wdGlvbnMuc2VydmljZXMpIHtcbiAgICAgICAgICAgIGVudlZhcnMucHVzaChgU0VSVklDRVM9JHtvcHRpb25zLnNlcnZpY2VzLmpvaW4oXCIsXCIpfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChvcHRpb25zLmltYWdlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVudlZhcnMucHVzaChgSU1BR0VfTkFNRT1sb2NhbHN0YWNrL2xvY2Fsc3RhY2s6JHtvcHRpb25zLmltYWdlVGFnfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbG9jYWxzdGFja1Rhc2sgPSBwcm9qZWN0LmFkZFRhc2soXCJsb2NhbHN0YWNrXCIsIHtcbiAgICAgICAgICAgIGV4ZWM6IGBsb2NhbHN0YWNrIHN0YXR1cyB8IGdyZXAgLXEgcnVubmluZyB8fCAke2VudlZhcnMuam9pbihcIiBcIil9IGxvY2Fsc3RhY2sgc3RhcnQgLWRgLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29saW1hVGFzaykge1xuICAgICAgICAgICAgbG9jYWxzdGFja1Rhc2sucHJlcGVuZFNwYXduKGNvbGltYVRhc2spO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvamVjdC5hZGREZXZEZXBzKFwiYXdzLWNkay1sb2NhbFwiKTtcblxuICAgICAgICBjb25zdCB0ZXN0VGFzayA9IHByb2plY3QudGFza3MudHJ5RmluZChcInRlc3RcIik7XG4gICAgICAgIGlmICh0ZXN0VGFzaykge1xuICAgICAgICAgICAgdGVzdFRhc2sucHJlcGVuZFNwYXduKGxvY2Fsc3RhY2tUYXNrKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
@@ -7,7 +7,7 @@ const component_1 = require("projen/lib/component");
7
7
  const textfile_1 = require("projen/lib/textfile");
8
8
  const homebrew_1 = require("./homebrew");
9
9
  class Mise extends component_1.Component {
10
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Mise", version: "0.3.79" };
10
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.Mise", version: "0.3.81" };
11
11
  static of(project) {
12
12
  const isMise = (c) => c instanceof Mise;
13
13
  return project.components.find(isMise);
@@ -34,7 +34,7 @@ const DEFAULT_CONFIG = {
34
34
  * TypeDoc component for projen projects
35
35
  */
36
36
  class TypeDoc extends component_1.Component {
37
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeDoc", version: "0.3.79" };
37
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@nikovirtala/projen-constructs.TypeDoc", version: "0.3.81" };
38
38
  static of(project) {
39
39
  const isTypeDoc = (c) => c instanceof TypeDoc;
40
40
  return project.components.find(isTypeDoc);