@grnsft/if 1.0.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/.dockerignore +10 -0
  2. package/CONTAINER.md +148 -0
  3. package/Dockerfile +73 -0
  4. package/HELM_CHART.md +96 -0
  5. package/README.md +56 -0
  6. package/bin/docker-entrypoint.sh +15 -0
  7. package/build/common/types/manifest.d.ts +1 -0
  8. package/build/common/types/manifest.js +1 -1
  9. package/build/common/util/debug-logger.js +4 -18
  10. package/build/common/util/storage.d.ts +9 -0
  11. package/build/common/util/storage.js +24 -0
  12. package/build/if-api/config/config.d.ts +9 -0
  13. package/build/if-api/config/config.js +58 -0
  14. package/build/if-api/config/index.d.ts +2 -0
  15. package/build/if-api/config/index.js +8 -0
  16. package/build/if-api/config/strings.d.ts +16 -0
  17. package/build/if-api/config/strings.js +20 -0
  18. package/build/if-api/index.d.ts +2 -0
  19. package/build/if-api/index.js +268 -0
  20. package/build/if-api/types/process-args.d.ts +18 -0
  21. package/build/if-api/types/process-args.js +3 -0
  22. package/build/if-api/util/args.d.ts +5 -0
  23. package/build/if-api/util/args.js +42 -0
  24. package/build/if-metadata-check/config/config.d.ts +5 -0
  25. package/build/if-metadata-check/config/config.js +26 -0
  26. package/build/if-metadata-check/config/strings.d.ts +5 -0
  27. package/build/if-metadata-check/config/strings.js +9 -0
  28. package/build/if-metadata-check/index.d.ts +2 -0
  29. package/build/if-metadata-check/index.js +30 -0
  30. package/build/if-metadata-check/types/plugin.d.ts +7 -0
  31. package/build/if-metadata-check/types/plugin.js +3 -0
  32. package/build/if-metadata-check/types/process-args.d.ts +5 -0
  33. package/build/if-metadata-check/types/process-args.js +3 -0
  34. package/build/if-metadata-check/util/args.d.ts +57 -0
  35. package/build/if-metadata-check/util/args.js +29 -0
  36. package/build/if-metadata-check/util/metadata-checker.d.ts +44 -0
  37. package/build/if-metadata-check/util/metadata-checker.js +99 -0
  38. package/build/if-run/index.js +1 -1
  39. package/build/if-run/lib/aggregate.d.ts +2 -2
  40. package/build/if-run/lib/aggregate.js +5 -19
  41. package/build/if-run/lib/compute.d.ts +1 -1
  42. package/build/if-run/lib/compute.js +10 -9
  43. package/build/if-run/lib/environment.d.ts +5 -1
  44. package/build/if-run/lib/environment.js +21 -16
  45. package/build/if-run/lib/initialize.d.ts +12 -0
  46. package/build/if-run/lib/initialize.js +37 -3
  47. package/build/if-run/lib/regroup.d.ts +3 -2
  48. package/build/if-run/lib/regroup.js +13 -9
  49. package/build/if-run/types/compute.d.ts +1 -1
  50. package/build/if-run/types/compute.js +1 -1
  51. package/helm-chart/.helmignore +23 -0
  52. package/helm-chart/Chart.yaml +24 -0
  53. package/helm-chart/templates/NOTES.txt +22 -0
  54. package/helm-chart/templates/_helpers.tpl +62 -0
  55. package/helm-chart/templates/additionalPlugins.yaml +13 -0
  56. package/helm-chart/templates/deployment.yaml +144 -0
  57. package/helm-chart/templates/disabledPlugins.yaml +11 -0
  58. package/helm-chart/templates/env-configmap.yaml +10 -0
  59. package/helm-chart/templates/env-secret.yaml +10 -0
  60. package/helm-chart/templates/hpa.yaml +32 -0
  61. package/helm-chart/templates/ingress.yaml +43 -0
  62. package/helm-chart/templates/npmrc.yaml +11 -0
  63. package/helm-chart/templates/service.yaml +24 -0
  64. package/helm-chart/templates/serviceaccount.yaml +13 -0
  65. package/helm-chart/templates/tests/test-connection.yaml +15 -0
  66. package/helm-chart/values.yaml +175 -0
  67. package/manifests/examples/bugs/aggregation-error-wrong-metric.yml +173 -0
  68. package/manifests/examples/bugs/input-error-missing-duration.yml +25 -0
  69. package/manifests/examples/bugs/mock-observations-failure-duration-is-zero.yml +33 -0
  70. package/manifests/examples/bugs/pipeline-error-naming-mismatch.yml +32 -0
  71. package/manifests/examples/bugs/pipeline-error-uninitialized-plugin.yml +33 -0
  72. package/manifests/examples/bugs/pipeline-ordering-error.yml +91 -0
  73. package/manifests/examples/builtins/divide/success-denominator-equal-zero.yml +36 -0
  74. package/manifests/examples/builtins/mock-observations/failure-invalid-config-cpu-range.yml +0 -1
  75. package/manifests/examples/builtins/mock-observations/failure-invalid-memory-utilization-range.yml +0 -1
  76. package/manifests/examples/builtins/mock-observations/failure-missing-timestamp-from-param.yml +0 -1
  77. package/manifests/examples/builtins/mock-observations/success.yml +0 -1
  78. package/manifests/examples/builtins/sci/failure-invalid-config-value.yml +0 -1
  79. package/manifests/examples/builtins/sci/failure-missing-input-param.yml +0 -1
  80. package/manifests/examples/builtins/sci/success.yml +0 -1
  81. package/manifests/examples/builtins/sci-embodied/failure-invalid-default-emission-value.yml +22 -0
  82. package/manifests/examples/builtins/time-sync/failure-missing-config.yml +0 -2
  83. package/manifests/examples/builtins/time-sync/success.yml +0 -2
  84. package/manifests/examples/features/aggregate-failure-invalid-metrics.yml +50 -0
  85. package/manifests/examples/features/aggregate-failure-missing-metric-in-inputs.yml +50 -0
  86. package/manifests/examples/features/aggregate-horizontal.yml +58 -0
  87. package/manifests/examples/features/aggregate-vertical.yml +58 -0
  88. package/manifests/examples/features/aggregate.yml +58 -0
  89. package/manifests/examples/pipelines/cloud-metadata-divide.yml +36 -0
  90. package/manifests/examples/pipelines/pipeline-with-mocks.yml +0 -1
  91. package/manifests/examples/pipelines/scenario-5.yml +0 -1
  92. package/manifests/outputs/bugs/mock-observations-failure-duration-is-zero.yaml +0 -1
  93. package/manifests/outputs/builtins/mock-observations/failure-invalid-config-cpu-range.yaml +0 -1
  94. package/manifests/outputs/builtins/mock-observations/failure-invalid-memory-utilization-range.yaml +0 -1
  95. package/manifests/outputs/builtins/mock-observations/failure-missing-timestamp-from-param.yaml +0 -1
  96. package/manifests/outputs/builtins/sci/failure-invalid-config-value.yaml +0 -1
  97. package/manifests/outputs/builtins/sci/failure-missing-input-param.yaml +0 -1
  98. package/manifests/outputs/builtins/time-sync/failure-missing-config.yaml +0 -2
  99. package/manifests/outputs/features/regroup/success.yaml +72 -0
  100. package/manifests/outputs/pipelines/pipeline-with-aggregate.yaml +1291 -0
  101. package/manifests/outputs/pipelines/scenario-3.yaml +126 -0
  102. package/openapi.yaml +424 -0
  103. package/package.json +8 -3
  104. package/with-plugins/Dockerfile +59 -0
  105. package/manifests/outputs/builtins/interpolation/interpolation.yaml +0 -81
  106. package/manifests/outputs/features/failure-invalid-regroup.yaml +0 -87
  107. package/manifests/outputs/features/failure-missing-cloud-instance-type.yaml +0 -86
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STRINGS = void 0;
4
+ /**
5
+ * Strings for if-api.
6
+ */
7
+ exports.STRINGS = {
8
+ SERVER_STARTED: (addr) => `Server started on ${addr}`,
9
+ SERVER_START_FAILED: (err) => `Failed to start server: ${err}`,
10
+ PROCESSING_REQUEST: 'Processing request',
11
+ INTERNAL_SERVER_ERROR: 'Internal Server Error',
12
+ INVALID_JSON: 'Invalid JSON format',
13
+ INVALID_YAML: 'Invalid YAML format',
14
+ MISSING_MANIFEST: 'Missing manifest in request body',
15
+ UNSUPPORTED_CONTENT_TYPE: 'Unsupported content type. Supported types are: application/json, application/yaml',
16
+ DISCLAIMER_MESSAGE: 'Impact Framework API - Green Software Foundation',
17
+ INVALID_DISABLED_PLUGINS: (line) => `Invalid DisabledPlugins settings:${line}`,
18
+ INVALID_PORT_NUMBER: (port) => `Invalid port number \`${port}\`. The port number should be a number between 0 and 65535.`,
19
+ };
20
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZi1hcGkvY29uZmlnL3N0cmluZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7O0dBRUc7QUFDVSxRQUFBLE9BQU8sR0FBRztJQUNyQixjQUFjLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLHFCQUFxQixJQUFJLEVBQUU7SUFDN0QsbUJBQW1CLEVBQUUsQ0FBQyxHQUFVLEVBQUUsRUFBRSxDQUFDLDJCQUEyQixHQUFHLEVBQUU7SUFDckUsa0JBQWtCLEVBQUUsb0JBQW9CO0lBQ3hDLHFCQUFxQixFQUFFLHVCQUF1QjtJQUM5QyxZQUFZLEVBQUUscUJBQXFCO0lBQ25DLFlBQVksRUFBRSxxQkFBcUI7SUFDbkMsZ0JBQWdCLEVBQUUsa0NBQWtDO0lBQ3BELHdCQUF3QixFQUN0QixtRkFBbUY7SUFDckYsa0JBQWtCLEVBQUUsa0RBQWtEO0lBQ3RFLHdCQUF3QixFQUFFLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FDekMsb0NBQW9DLElBQUksRUFBRTtJQUM1QyxtQkFBbUIsRUFBRSxDQUFDLElBQVksRUFBRSxFQUFFLENBQ3BDLHlCQUF5QixJQUFJLDZEQUE2RDtDQUNwRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdHJpbmdzIGZvciBpZi1hcGkuXG4gKi9cbmV4cG9ydCBjb25zdCBTVFJJTkdTID0ge1xuICBTRVJWRVJfU1RBUlRFRDogKGFkZHI6IHN0cmluZykgPT4gYFNlcnZlciBzdGFydGVkIG9uICR7YWRkcn1gLFxuICBTRVJWRVJfU1RBUlRfRkFJTEVEOiAoZXJyOiBFcnJvcikgPT4gYEZhaWxlZCB0byBzdGFydCBzZXJ2ZXI6ICR7ZXJyfWAsXG4gIFBST0NFU1NJTkdfUkVRVUVTVDogJ1Byb2Nlc3NpbmcgcmVxdWVzdCcsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUjogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gIElOVkFMSURfSlNPTjogJ0ludmFsaWQgSlNPTiBmb3JtYXQnLFxuICBJTlZBTElEX1lBTUw6ICdJbnZhbGlkIFlBTUwgZm9ybWF0JyxcbiAgTUlTU0lOR19NQU5JRkVTVDogJ01pc3NpbmcgbWFuaWZlc3QgaW4gcmVxdWVzdCBib2R5JyxcbiAgVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFOlxuICAgICdVbnN1cHBvcnRlZCBjb250ZW50IHR5cGUuIFN1cHBvcnRlZCB0eXBlcyBhcmU6IGFwcGxpY2F0aW9uL2pzb24sIGFwcGxpY2F0aW9uL3lhbWwnLFxuICBESVNDTEFJTUVSX01FU1NBR0U6ICdJbXBhY3QgRnJhbWV3b3JrIEFQSSAtIEdyZWVuIFNvZnR3YXJlIEZvdW5kYXRpb24nLFxuICBJTlZBTElEX0RJU0FCTEVEX1BMVUdJTlM6IChsaW5lOiBzdHJpbmcpID0+XG4gICAgYEludmFsaWQgRGlzYWJsZWRQbHVnaW5zIHNldHRpbmdzOiR7bGluZX1gLFxuICBJTlZBTElEX1BPUlRfTlVNQkVSOiAocG9ydDogc3RyaW5nKSA9PlxuICAgIGBJbnZhbGlkIHBvcnQgbnVtYmVyIFxcYCR7cG9ydH1cXGAuIFRoZSBwb3J0IG51bWJlciBzaG91bGQgYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCA2NTUzNS5gLFxufSBhcyBjb25zdDtcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,268 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const promises_1 = require("fs/promises");
8
+ const express_1 = __importDefault(require("express"));
9
+ const js_yaml_1 = require("js-yaml");
10
+ const utils_1 = require("@grnsft/if-core/utils");
11
+ const debug_logger_1 = require("../common/util/debug-logger");
12
+ const logger_1 = require("../common/util/logger");
13
+ const storage_1 = require("../common/util/storage");
14
+ const validations_1 = require("../common/util/validations");
15
+ const aggregate_1 = require("../if-run/lib/aggregate");
16
+ const environment_1 = require("../if-run/lib/environment");
17
+ const initialize_1 = require("../if-run/lib/initialize");
18
+ const compute_1 = require("../if-run/lib/compute");
19
+ const explain_1 = require("../if-run/lib/explain");
20
+ const config_1 = require("./config");
21
+ const args_1 = require("./util/args");
22
+ const { DISCLAIMER_MESSAGE, INTERNAL_SERVER_ERROR, INVALID_DISABLED_PLUGINS, INVALID_JSON, INVALID_YAML, MISSING_MANIFEST, PROCESSING_REQUEST, SERVER_STARTED, SERVER_START_FAILED, UNSUPPORTED_CONTENT_TYPE, } = config_1.STRINGS;
23
+ const CT_YAML = 'application/yaml';
24
+ const CT_JSON = 'application/json';
25
+ const CT_VALID = [CT_YAML, CT_JSON];
26
+ const ERROR_LIST = Object.values(utils_1.ERRORS);
27
+ /**
28
+ * Determine response type.
29
+ */
30
+ const determineResponseType = (req) => {
31
+ const acceptHeader = req.get('Accept');
32
+ if (acceptHeader && acceptHeader !== '*/*') {
33
+ // Determine based on request Accept header
34
+ const responseType = req.accepts(CT_VALID);
35
+ if (responseType) {
36
+ return responseType;
37
+ }
38
+ }
39
+ // Determine based on request Content-Type
40
+ return req.get('Content-Type');
41
+ };
42
+ /**
43
+ * Send the response in the appropriate format.
44
+ */
45
+ const sendResponse = (req, res, manifest, status) => {
46
+ const responseType = determineResponseType(req);
47
+ if (responseType === CT_YAML) {
48
+ const yamlData = (0, js_yaml_1.dump)(manifest, { noRefs: true });
49
+ res.set('Content-Type', responseType);
50
+ res.status(status).send(yamlData);
51
+ }
52
+ else {
53
+ res.set('Content-Type', responseType);
54
+ res.status(status).json(manifest);
55
+ }
56
+ };
57
+ /**
58
+ * Parse disabled plugins file
59
+ * @param filename Filename that contains plugin names to be disabled
60
+ * @returns Set of disabledPlugins
61
+ */
62
+ const parseDisabledPlugins = async (filename) => {
63
+ // If no filename is specified, disable builtin:Shell, builtin:CSVImport, builtin:CSVLookup by default.
64
+ if (!filename) {
65
+ return new Set([
66
+ 'builtin:Shell',
67
+ 'builtin:CSVImport',
68
+ 'builtin:CSVLookup',
69
+ ]);
70
+ }
71
+ const disabledPlugins = new Set();
72
+ const file = await (0, promises_1.open)(filename);
73
+ try {
74
+ for await (const line of file.readLines()) {
75
+ const words = line.split(/ *: */);
76
+ switch (words.length) {
77
+ case 1:
78
+ disabledPlugins.add(`builtin:${words[0]}`);
79
+ break;
80
+ case 2:
81
+ disabledPlugins.add(`${words[0]}:${words[1]}`);
82
+ break;
83
+ default:
84
+ throw new Error(INVALID_DISABLED_PLUGINS(line));
85
+ }
86
+ }
87
+ }
88
+ finally {
89
+ await file.close();
90
+ }
91
+ return disabledPlugins;
92
+ };
93
+ const formatAddr = (addr) => {
94
+ if (typeof addr === 'string') {
95
+ return addr;
96
+ }
97
+ else if (addr === null) {
98
+ return 'unknown';
99
+ }
100
+ else if (addr.family === 'IPv6') {
101
+ return `[${addr.address}]:${addr.port}`;
102
+ }
103
+ else {
104
+ return `${addr.address}:${addr.port}`;
105
+ }
106
+ };
107
+ /**
108
+ * Start the API server.
109
+ */
110
+ const startServer = async () => {
111
+ const options = (0, args_1.parseIfApiProcessArgs)();
112
+ debug_logger_1.debugLogger.overrideConsoleMethods(options.debug);
113
+ logger_1.logger.info(DISCLAIMER_MESSAGE);
114
+ (0, initialize_1.setExternalPluginWarning)(!options.disableExternalPluginWarning);
115
+ const disabledPlugins = await parseDisabledPlugins(options.disabledPlugins);
116
+ (0, initialize_1.setDisabledPlugins)(disabledPlugins);
117
+ // Get execution information (command, environment).
118
+ const execution = await (0, environment_1.getExecution)();
119
+ const app = (0, express_1.default)();
120
+ // Middleware for JSON requests
121
+ app.use(express_1.default.json({ type: CT_JSON }));
122
+ // Custom middleware for YAML requests
123
+ app.use(express_1.default.text({ type: CT_YAML }), (req, res, next) => {
124
+ if (req.is(CT_YAML)) {
125
+ try {
126
+ req.body = (0, js_yaml_1.load)(req.body);
127
+ }
128
+ catch (err) {
129
+ res.status(400).json({
130
+ error: INVALID_YAML,
131
+ detail: err.message,
132
+ });
133
+ return;
134
+ }
135
+ }
136
+ next();
137
+ });
138
+ // Add request context storage
139
+ app.use((_req, _res, next) => (0, storage_1.executeWithContext)(next));
140
+ // Health check endpoint
141
+ app.get('/health', (_req, res) => {
142
+ res.status(200).send('OK');
143
+ });
144
+ // Process manifest endpoint
145
+ app.post('/v1/run', async (req, res) => {
146
+ logger_1.logger.info(PROCESSING_REQUEST);
147
+ // Check if request body exists
148
+ if (!req.body) {
149
+ res.status(400).json({ error: MISSING_MANIFEST });
150
+ return;
151
+ }
152
+ // Check request Content-Type
153
+ if (!req.is(CT_VALID)) {
154
+ res.status(415).json({ error: UNSUPPORTED_CONTENT_TYPE });
155
+ return;
156
+ }
157
+ // Create manifest with execution information
158
+ const envManifest = {
159
+ ...req.body,
160
+ execution: {
161
+ command: execution.command,
162
+ environment: {
163
+ ...execution.environment,
164
+ 'date-time': `${new Date().toISOString()} (UTC)`,
165
+ },
166
+ status: execution.status,
167
+ },
168
+ };
169
+ try {
170
+ const { tree, ...context } = (0, validations_1.validateManifest)(envManifest);
171
+ const pluginStorage = await (0, initialize_1.initialize)(context);
172
+ const computedTree = await (0, compute_1.compute)(tree, {
173
+ context,
174
+ pluginStorage,
175
+ observe: req.query.observe === 'true',
176
+ regroup: req.query.regroup === 'true',
177
+ compute: req.query.compute === 'true',
178
+ append: false,
179
+ });
180
+ const aggregatedTree = (0, aggregate_1.aggregate)(computedTree, context.aggregation);
181
+ envManifest.explainer && (context.explain = (0, explain_1.explain)());
182
+ // Prepare response data
183
+ const responseData = { tree: aggregatedTree, ...context };
184
+ // Return response in the determined format
185
+ sendResponse(req, res, responseData, 200);
186
+ }
187
+ catch (err) {
188
+ // If it's one of the errors in ERRORS, terminate with status code 400
189
+ if (ERROR_LIST.some(val => err instanceof val)) {
190
+ /** Execution block exists because manifest is already processed. Set's status to `fail`. */
191
+ envManifest.execution.status = 'fail';
192
+ envManifest.execution.error = err.toString();
193
+ // Return response in the determined format
194
+ sendResponse(req, res, envManifest, 400);
195
+ return;
196
+ }
197
+ // Set Content-Type to application/json
198
+ res.set('Content-Type', CT_JSON);
199
+ // For all other cases, terminate with status code 500
200
+ if (err instanceof Error) {
201
+ res.status(500).json({
202
+ error: INTERNAL_SERVER_ERROR,
203
+ detail: err.message,
204
+ });
205
+ return;
206
+ }
207
+ res.status(500).json({ error: INTERNAL_SERVER_ERROR });
208
+ }
209
+ });
210
+ // Set up custom error handler
211
+ app.use(
212
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
213
+ (err, _req, res, _next) => {
214
+ // Set Content-Type to application/json
215
+ res.set('Content-Type', CT_JSON);
216
+ // If SyntaxError (JSON parse error), terminate with status code 400
217
+ if (err.status === 400 && err instanceof SyntaxError && 'body' in err) {
218
+ res.status(400).json({
219
+ error: INVALID_JSON,
220
+ detail: err.message,
221
+ });
222
+ }
223
+ else if (err instanceof Error) {
224
+ if ('status' in err) {
225
+ res.status(err.status).json({
226
+ error: err.message,
227
+ });
228
+ }
229
+ else {
230
+ res.status(500).json({
231
+ error: INTERNAL_SERVER_ERROR,
232
+ detail: err.message,
233
+ });
234
+ }
235
+ }
236
+ else {
237
+ res.status(500).json({
238
+ error: INTERNAL_SERVER_ERROR,
239
+ });
240
+ }
241
+ });
242
+ // Start the server
243
+ const { port, host } = options;
244
+ const server = app.listen(port, host, (err) => {
245
+ if (err) {
246
+ logger_1.logger.error(SERVER_START_FAILED(err));
247
+ // eslint-disable-next-line no-process-exit
248
+ process.exit(2);
249
+ }
250
+ logger_1.logger.info(SERVER_STARTED(formatAddr(server.address())));
251
+ });
252
+ // Handle Signal
253
+ const handler = (err) => {
254
+ logger_1.logger.debug(`${err} signal received: closing HTTP server`);
255
+ server.close(() => {
256
+ logger_1.logger.debug('HTTP server closed');
257
+ });
258
+ };
259
+ process.once('SIGTERM', handler);
260
+ process.once('SIGINT', handler);
261
+ };
262
+ // Start the server
263
+ startServer().catch(err => {
264
+ logger_1.logger.error(SERVER_START_FAILED(err));
265
+ // eslint-disable-next-line no-process-exit
266
+ process.exit(2);
267
+ });
268
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWYtYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDBDQUFpQztBQUdqQyxzREFBOEI7QUFFOUIscUNBQW1DO0FBQ25DLGlEQUE2QztBQUc3Qyw4REFBd0Q7QUFDeEQsa0RBQTZDO0FBQzdDLG9EQUEwRDtBQUMxRCw0REFBNEQ7QUFFNUQsdURBQWtEO0FBQ2xELDJEQUF1RDtBQUN2RCx5REFJa0M7QUFDbEMsbURBQThDO0FBQzlDLG1EQUE4QztBQUU5QyxxQ0FBaUM7QUFDakMsc0NBQWtEO0FBRWxELE1BQU0sRUFDSixrQkFBa0IsRUFDbEIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixZQUFZLEVBQ1osWUFBWSxFQUNaLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLG1CQUFtQixFQUNuQix3QkFBd0IsR0FDekIsR0FBRyxnQkFBTyxDQUFDO0FBRVosTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUM7QUFDbkMsTUFBTSxPQUFPLEdBQUcsa0JBQWtCLENBQUM7QUFDbkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFcEMsTUFBTSxVQUFVLEdBQWdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsY0FBTSxDQUFDLENBQUM7QUFFdEU7O0dBRUc7QUFDSCxNQUFNLHFCQUFxQixHQUFHLENBQUMsR0FBb0IsRUFBRSxFQUFFO0lBQ3JELE1BQU0sWUFBWSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxZQUFZLElBQUksWUFBWSxLQUFLLEtBQUssRUFBRTtRQUMxQywyQ0FBMkM7UUFDM0MsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxJQUFJLFlBQVksRUFBRTtZQUNoQixPQUFPLFlBQVksQ0FBQztT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QWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDO0lBRUgsZ0JBQWdCO0lBQ2hCLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBbUIsRUFBRSxFQUFFO1FBQ3RDLGVBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLHVDQUF1QyxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDaEIsZUFBTSxDQUFDLEtBQUssQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0lBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYsbUJBQW1CO0FBQ25CLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRTtJQUN4QixlQUFNLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdkMsMkNBQTJDO0lBQzNDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5pbXBvcnQge29wZW59IGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB0eXBlIHtBZGRyZXNzSW5mb30gZnJvbSAnbmV0JztcblxuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7TmV4dEZ1bmN0aW9uLCBSZXF1ZXN0LCBSZXNwb25zZX0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge2R1bXAsIGxvYWR9IGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHtFUlJPUlN9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS91dGlscyc7XG5cbmltcG9ydCB0eXBlIHtNYW5pZmVzdH0gZnJvbSAnLi4vY29tbW9uL3R5cGVzL21hbmlmZXN0JztcbmltcG9ydCB7ZGVidWdMb2dnZXJ9IGZyb20gJy4uL2NvbW1vbi91dGlsL2RlYnVnLWxvZ2dlcic7XG5pbXBvcnQge2xvZ2dlcn0gZnJvbSAnLi4vY29tbW9uL3V0aWwvbG9nZ2VyJztcbmltcG9ydCB7ZXhlY3V0ZVdpdGhDb250ZXh0fSBmcm9tICcuLi9jb21tb24vdXRpbC9zdG9yYWdlJztcbmltcG9ydCB7dmFsaWRhdGVNYW5pZmVzdH0gZnJvbSAnLi4vY29tbW9uL3V0aWwvdmFsaWRhdGlvbnMnO1xuXG5pbXBvcnQge2FnZ3JlZ2F0ZX0gZnJvbSAnLi4vaWYtcnVuL2xpYi9hZ2dyZWdhdGUnO1xuaW1wb3J0IHtnZXRFeGVjdXRpb259IGZyb20gJy4uL2lmLXJ1bi9saWIvZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtcbiAgaW5pdGlhbGl6ZSxcbiAgc2V0RXh0ZXJuYWxQbHVnaW5XYXJuaW5nLFxuICBzZXREaXNhYmxlZFBsdWdpbnMsXG59IGZyb20gJy4uL2lmLXJ1bi9saWIvaW5pdGlhbGl6ZSc7XG5pbXBvcnQge2NvbXB1dGV9IGZyb20gJy4uL2lmLXJ1bi9saWIvY29tcHV0ZSc7XG5pbXBvcnQge2V4cGxhaW59IGZyb20gJy4uL2lmLXJ1bi9saWIvZXhwbGFpbic7XG5cbmltcG9ydCB7U1RSSU5HU30gZnJvbSAnLi9jb25maWcnO1xuaW1wb3J0IHtwYXJzZUlmQXBpUHJvY2Vzc0FyZ3N9IGZyb20gJy4vdXRpbC9hcmdzJztcblxuY29uc3Qge1xuICBESVNDTEFJTUVSX01FU1NBR0UsXG4gIElOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgSU5WQUxJRF9ESVNBQkxFRF9QTFVHSU5TLFxuICBJTlZBTElEX0pTT04sXG4gIElOVkFMSURfWUFNTCxcbiAgTUlTU0lOR19NQU5JRkVTVCxcbiAgUFJPQ0VTU0lOR19SRVFVRVNULFxuICBTRVJWRVJfU1RBUlRFRCxcbiAgU0VSVkVSX1NUQVJUX0ZBSUxFRCxcbiAgVU5TVVBQT1JURURfQ09OVEVOVF9UWVBFLFxufSA9IFNUUklOR1M7XG5cbmNvbnN0IENUX1lBTUwgPSAnYXBwbGljYXRpb24veWFtbCc7XG5jb25zdCBDVF9KU09OID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuY29uc3QgQ1RfVkFMSUQgPSBbQ1RfWUFNTCwgQ1RfSlNPTl07XG5cbmNvbnN0IEVSUk9SX0xJU1Q6IHJlYWRvbmx5IEVycm9yQ29uc3RydWN0b3JbXSA9IE9iamVjdC52YWx1ZXMoRVJST1JTKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgcmVzcG9uc2UgdHlwZS5cbiAqL1xuY29uc3QgZGV0ZXJtaW5lUmVzcG9uc2VUeXBlID0gKHJlcTogZXhwcmVzcy5SZXF1ZXN0KSA9PiB7XG4gIGNvbnN0IGFjY2VwdEhlYWRlciA9IHJlcS5nZXQoJ0FjY2VwdCcpO1xuICBpZiAoYWNjZXB0SGVhZGVyICYmIGFjY2VwdEhlYWRlciAhPT0gJyovKicpIHtcbiAgICAvLyBEZXRlcm1pbmUgYmFzZWQgb24gcmVxdWVzdCBBY2NlcHQgaGVhZGVyXG4gICAgY29uc3QgcmVzcG9uc2VUeXBlID0gcmVxLmFjY2VwdHMoQ1RfVkFMSUQpO1xuICAgIGlmIChyZXNwb25zZVR5cGUpIHtcbiAgICAgIHJldHVybiByZXNwb25zZVR5cGU7XG4gICAgfVxuICB9XG5cbiAgLy8gRGV0ZXJtaW5lIGJhc2VkIG9uIHJlcXVlc3QgQ29udGVudC1UeXBlXG4gIHJldHVybiByZXEuZ2V0KCdDb250ZW50LVR5cGUnKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcmVzcG9uc2UgaW4gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdC5cbiAqL1xuY29uc3Qgc2VuZFJlc3BvbnNlID0gKFxuICByZXE6IFJlcXVlc3QsXG4gIHJlczogUmVzcG9uc2UsXG4gIG1hbmlmZXN0OiBNYW5pZmVzdCxcbiAgc3RhdHVzOiBudW1iZXJcbikgPT4ge1xuICBjb25zdCByZXNwb25zZVR5cGUgPSBkZXRlcm1pbmVSZXNwb25zZVR5cGUocmVxKTtcbiAgaWYgKHJlc3BvbnNlVHlwZSA9PT0gQ1RfWUFNTCkge1xuICAgIGNvbnN0IHlhbWxEYXRhID0gZHVtcChtYW5pZmVzdCwge25vUmVmczogdHJ1ZX0pO1xuICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIHJlc3BvbnNlVHlwZSk7XG4gICAgcmVzLnN0YXR1cyhzdGF0dXMpLnNlbmQoeWFtbERhdGEpO1xuICB9IGVsc2Uge1xuICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIHJlc3BvbnNlVHlwZSk7XG4gICAgcmVzLnN0YXR1cyhzdGF0dXMpLmpzb24obWFuaWZlc3QpO1xuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlIGRpc2FibGVkIHBsdWdpbnMgZmlsZVxuICogQHBhcmFtIGZpbGVuYW1lIEZpbGVuYW1lIHRoYXQgY29udGFpbnMgcGx1Z2luIG5hbWVzIHRvIGJlIGRpc2FibGVkXG4gKiBAcmV0dXJucyBTZXQgb2YgZGlzYWJsZWRQbHVnaW5zXG4gKi9cbmNvbnN0IHBhcnNlRGlzYWJsZWRQbHVnaW5zID0gYXN5bmMgKGZpbGVuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+IHtcbiAgLy8gSWYgbm8gZmlsZW5hbWUgaXMgc3BlY2lmaWVkLCBkaXNhYmxlIGJ1aWx0aW46U2hlbGwsIGJ1aWx0aW46Q1NWSW1wb3J0LCBidWlsdGluOkNTVkxvb2t1cCBieSBkZWZhdWx0LlxuICBpZiAoIWZpbGVuYW1lKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQ8c3RyaW5nPihbXG4gICAgICAnYnVpbHRpbjpTaGVsbCcsXG4gICAgICAnYnVpbHRpbjpDU1ZJbXBvcnQnLFxuICAgICAgJ2J1aWx0aW46Q1NWTG9va3VwJyxcbiAgICBdKTtcbiAgfVxuXG4gIGNvbnN0IGRpc2FibGVkUGx1Z2lucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBmaWxlID0gYXdhaXQgb3BlbihmaWxlbmFtZSk7XG4gIHRyeSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCBsaW5lIG9mIGZpbGUucmVhZExpbmVzKCkpIHtcbiAgICAgIGNvbnN0IHdvcmRzID0gbGluZS5zcGxpdCgvICo6ICovKTtcbiAgICAgIHN3aXRjaCAod29yZHMubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBkaXNhYmxlZFBsdWdpbnMuYWRkKGBidWlsdGluOiR7d29yZHNbMF19YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBkaXNhYmxlZFBsdWdpbnMuYWRkKGAke3dvcmRzWzBdfToke3dvcmRzWzFdfWApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX0RJU0FCTEVEX1BMVUdJTlMobGluZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmaWxlLmNsb3NlKCk7XG4gIH1cbiAgcmV0dXJuIGRpc2FibGVkUGx1Z2lucztcbn07XG5cbmNvbnN0IGZvcm1hdEFkZHIgPSAoYWRkcjogc3RyaW5nIHwgQWRkcmVzc0luZm8gfCBudWxsKTogc3RyaW5nID0+IHtcbiAgaWYgKHR5cGVvZiBhZGRyID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBhZGRyO1xuICB9IGVsc2UgaWYgKGFkZHIgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ3Vua25vd24nO1xuICB9IGVsc2UgaWYgKGFkZHIuZmFtaWx5ID09PSAnSVB2NicpIHtcbiAgICByZXR1cm4gYFske2FkZHIuYWRkcmVzc31dOiR7YWRkci5wb3J0fWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke2FkZHIuYWRkcmVzc306JHthZGRyLnBvcnR9YDtcbiAgfVxufTtcblxuLyoqXG4gKiBTdGFydCB0aGUgQVBJIHNlcnZlci5cbiAqL1xuY29uc3Qgc3RhcnRTZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUlmQXBpUHJvY2Vzc0FyZ3MoKTtcblxuICBkZWJ1Z0xvZ2dlci5vdmVycmlkZUNvbnNvbGVNZXRob2RzKG9wdGlvbnMuZGVidWcpO1xuXG4gIGxvZ2dlci5pbmZvKERJU0NMQUlNRVJfTUVTU0FHRSk7XG5cbiAgc2V0RXh0ZXJuYWxQbHVnaW5XYXJuaW5nKCFvcHRpb25zLmRpc2FibGVFeHRlcm5hbFBsdWdpbldhcm5pbmcpO1xuXG4gIGNvbnN0IGRpc2FibGVkUGx1Z2lucyA9IGF3YWl0IHBhcnNlRGlzYWJsZWRQbHVnaW5zKG9wdGlvbnMuZGlzYWJsZWRQbHVnaW5zKTtcbiAgc2V0RGlzYWJsZWRQbHVnaW5zKGRpc2FibGVkUGx1Z2lucyk7XG5cbiAgLy8gR2V0IGV4ZWN1dGlvbiBpbmZvcm1hdGlvbiAoY29tbWFuZCwgZW52aXJvbm1lbnQpLlxuICBjb25zdCBleGVjdXRpb24gPSBhd2FpdCBnZXRFeGVjdXRpb24oKTtcblxuICBjb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbiAgLy8gTWlkZGxld2FyZSBmb3IgSlNPTiByZXF1ZXN0c1xuICBhcHAudXNlKGV4cHJlc3MuanNvbih7dHlwZTogQ1RfSlNPTn0pKTtcblxuICAvLyBDdXN0b20gbWlkZGxld2FyZSBmb3IgWUFNTCByZXF1ZXN0c1xuICBhcHAudXNlKFxuICAgIGV4cHJlc3MudGV4dCh7dHlwZTogQ1RfWUFNTH0pLFxuICAgIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UsIG5leHQ6IE5leHRGdW5jdGlvbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHJlcS5pcyhDVF9ZQU1MKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJlcS5ib2R5ID0gbG9hZChyZXEuYm9keSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgICAgZXJyb3I6IElOVkFMSURfWUFNTCxcbiAgICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBuZXh0KCk7XG4gICAgfVxuICApO1xuXG4gIC8vIEFkZCByZXF1ZXN0IGNvbnRleHQgc3RvcmFnZVxuICBhcHAudXNlKChfcmVxOiBSZXF1ZXN0LCBfcmVzOiBSZXNwb25zZSwgbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PlxuICAgIGV4ZWN1dGVXaXRoQ29udGV4dChuZXh0KVxuICApO1xuXG4gIC8vIEhlYWx0aCBjaGVjayBlbmRwb2ludFxuICBhcHAuZ2V0KCcvaGVhbHRoJywgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiB2b2lkID0+IHtcbiAgICByZXMuc3RhdHVzKDIwMCkuc2VuZCgnT0snKTtcbiAgfSk7XG5cbiAgLy8gUHJvY2VzcyBtYW5pZmVzdCBlbmRwb2ludFxuICBhcHAucG9zdCgnL3YxL3J1bicsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICBsb2dnZXIuaW5mbyhQUk9DRVNTSU5HX1JFUVVFU1QpO1xuXG4gICAgLy8gQ2hlY2sgaWYgcmVxdWVzdCBib2R5IGV4aXN0c1xuICAgIGlmICghcmVxLmJvZHkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtlcnJvcjogTUlTU0lOR19NQU5JRkVTVH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHJlcXVlc3QgQ29udGVudC1UeXBlXG4gICAgaWYgKCFyZXEuaXMoQ1RfVkFMSUQpKSB7XG4gICAgICByZXMuc3RhdHVzKDQxNSkuanNvbih7ZXJyb3I6IFVOU1VQUE9SVEVEX0NPTlRFTlRfVFlQRX0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBtYW5pZmVzdCB3aXRoIGV4ZWN1dGlvbiBpbmZvcm1hdGlvblxuICAgIGNvbnN0IGVudk1hbmlmZXN0OiBNYW5pZmVzdCA9IHtcbiAgICAgIC4uLnJlcS5ib2R5LFxuICAgICAgZXhlY3V0aW9uOiB7XG4gICAgICAgIGNvbW1hbmQ6IGV4ZWN1dGlvbi5jb21tYW5kLFxuICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgIC4uLmV4ZWN1dGlvbi5lbnZpcm9ubWVudCxcbiAgICAgICAgICAnZGF0ZS10aW1lJzogYCR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfSAoVVRDKWAsXG4gICAgICAgIH0sXG4gICAgICAgIHN0YXR1czogZXhlY3V0aW9uLnN0YXR1cyxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dHJlZSwgLi4uY29udGV4dH0gPSB2YWxpZGF0ZU1hbmlmZXN0KGVudk1hbmlmZXN0KTtcblxuICAgICAgY29uc3QgcGx1Z2luU3RvcmFnZSA9IGF3YWl0IGluaXRpYWxpemUoY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IGNvbXB1dGVkVHJlZSA9IGF3YWl0IGNvbXB1dGUodHJlZSwge1xuICAgICAgICBjb250ZXh0LFxuICAgICAgICBwbHVnaW5TdG9yYWdlLFxuICAgICAgICBvYnNlcnZlOiByZXEucXVlcnkub2JzZXJ2ZSA9PT0gJ3RydWUnLFxuICAgICAgICByZWdyb3VwOiByZXEucXVlcnkucmVncm91cCA9PT0gJ3RydWUnLFxuICAgICAgICBjb21wdXRlOiByZXEucXVlcnkuY29tcHV0ZSA9PT0gJ3RydWUnLFxuICAgICAgICBhcHBlbmQ6IGZhbHNlLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGFnZ3JlZ2F0ZWRUcmVlID0gYWdncmVnYXRlKGNvbXB1dGVkVHJlZSwgY29udGV4dC5hZ2dyZWdhdGlvbik7XG5cbiAgICAgIGVudk1hbmlmZXN0LmV4cGxhaW5lciAmJiAoY29udGV4dC5leHBsYWluID0gZXhwbGFpbigpKTtcblxuICAgICAgLy8gUHJlcGFyZSByZXNwb25zZSBkYXRhXG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSB7dHJlZTogYWdncmVnYXRlZFRyZWUsIC4uLmNvbnRleHR9O1xuXG4gICAgICAvLyBSZXR1cm4gcmVzcG9uc2UgaW4gdGhlIGRldGVybWluZWQgZm9ybWF0XG4gICAgICBzZW5kUmVzcG9uc2UocmVxLCByZXMsIHJlc3BvbnNlRGF0YSwgMjAwKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIElmIGl0J3Mgb25lIG9mIHRoZSBlcnJvcnMgaW4gRVJST1JTLCB0ZXJtaW5hdGUgd2l0aCBzdGF0dXMgY29kZSA0MDBcbiAgICAgIGlmIChFUlJPUl9MSVNULnNvbWUodmFsID0+IGVyciBpbnN0YW5jZW9mIHZhbCkpIHtcbiAgICAgICAgLyoqIEV4ZWN1dGlvbiBibG9jayBleGlzdHMgYmVjYXVzZSBtYW5pZmVzdCBpcyBhbHJlYWR5IHByb2Nlc3NlZC4gU2V0J3Mgc3RhdHVzIHRvIGBmYWlsYC4gKi9cbiAgICAgICAgZW52TWFuaWZlc3QuZXhlY3V0aW9uIS5zdGF0dXMgPSAnZmFpbCc7XG4gICAgICAgIGVudk1hbmlmZXN0LmV4ZWN1dGlvbiEuZXJyb3IgPSAoZXJyIGFzIEVycm9yKS50b1N0cmluZygpO1xuXG4gICAgICAgIC8vIFJldHVybiByZXNwb25zZSBpbiB0aGUgZGV0ZXJtaW5lZCBmb3JtYXRcbiAgICAgICAgc2VuZFJlc3BvbnNlKHJlcSwgcmVzLCBlbnZNYW5pZmVzdCwgNDAwKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgQ29udGVudC1UeXBlIHRvIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIENUX0pTT04pO1xuICAgICAgLy8gRm9yIGFsbCBvdGhlciBjYXNlcywgdGVybWluYXRlIHdpdGggc3RhdHVzIGNvZGUgNTAwXG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgICAgIGVycm9yOiBJTlRFUk5BTF9TRVJWRVJfRVJST1IsXG4gICAgICAgICAgZGV0YWlsOiBlcnIubWVzc2FnZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogSU5URVJOQUxfU0VSVkVSX0VSUk9SfSk7XG4gICAgfVxuICB9KTtcblxuICAvLyBTZXQgdXAgY3VzdG9tIGVycm9yIGhhbmRsZXJcbiAgYXBwLnVzZShcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgKGVycjogYW55LCBfcmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlLCBfbmV4dDogTmV4dEZ1bmN0aW9uKTogdm9pZCA9PiB7XG4gICAgICAvLyBTZXQgQ29udGVudC1UeXBlIHRvIGFwcGxpY2F0aW9uL2pzb25cbiAgICAgIHJlcy5zZXQoJ0NvbnRlbnQtVHlwZScsIENUX0pTT04pO1xuXG4gICAgICAvLyBJZiBTeW50YXhFcnJvciAoSlNPTiBwYXJzZSBlcnJvciksIHRlcm1pbmF0ZSB3aXRoIHN0YXR1cyBjb2RlIDQwMFxuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IDQwMCAmJiBlcnIgaW5zdGFuY2VvZiBTeW50YXhFcnJvciAmJiAnYm9keScgaW4gZXJyKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogSU5WQUxJRF9KU09OLFxuICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBpZiAoJ3N0YXR1cycgaW4gZXJyKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyhlcnIuc3RhdHVzIGFzIG51bWJlcikuanNvbih7XG4gICAgICAgICAgICBlcnJvcjogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgICAgICAgZXJyb3I6IElOVEVSTkFMX1NFUlZFUl9FUlJPUixcbiAgICAgICAgICAgIGRldGFpbDogZXJyLm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogSU5URVJOQUxfU0VSVkVSX0VSUk9SLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG5cbiAgLy8gU3RhcnQgdGhlIHNlcnZlclxuICBjb25zdCB7cG9ydCwgaG9zdH0gPSBvcHRpb25zO1xuICBjb25zdCBzZXJ2ZXIgPSBhcHAubGlzdGVuKHBvcnQsIGhvc3QsIChlcnI/OiBFcnJvcikgPT4ge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihTRVJWRVJfU1RBUlRfRkFJTEVEKGVycikpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb2Nlc3MtZXhpdFxuICAgICAgcHJvY2Vzcy5leGl0KDIpO1xuICAgIH1cbiAgICBsb2dnZXIuaW5mbyhTRVJWRVJfU1RBUlRFRChmb3JtYXRBZGRyKHNlcnZlci5hZGRyZXNzKCkpKSk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZSBTaWduYWxcbiAgY29uc3QgaGFuZGxlciA9IChlcnI6IE5vZGVKUy5TaWduYWxzKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGAke2Vycn0gc2lnbmFsIHJlY2VpdmVkOiBjbG9zaW5nIEhUVFAgc2VydmVyYCk7XG4gICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnSFRUUCBzZXJ2ZXIgY2xvc2VkJyk7XG4gICAgfSk7XG4gIH07XG4gIHByb2Nlc3Mub25jZSgnU0lHVEVSTScsIGhhbmRsZXIpO1xuICBwcm9jZXNzLm9uY2UoJ1NJR0lOVCcsIGhhbmRsZXIpO1xufTtcblxuLy8gU3RhcnQgdGhlIHNlcnZlclxuc3RhcnRTZXJ2ZXIoKS5jYXRjaChlcnIgPT4ge1xuICBsb2dnZXIuZXJyb3IoU0VSVkVSX1NUQVJUX0ZBSUxFRChlcnIpKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb2Nlc3MtZXhpdFxuICBwcm9jZXNzLmV4aXQoMik7XG59KTtcbiJdfQ==
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Interface for if-api process arguments.
3
+ */
4
+ export interface IfApiArgs {
5
+ debug: boolean;
6
+ disableExternalPluginWarning: boolean;
7
+ disabledPlugins?: string;
8
+ port: string;
9
+ host: string;
10
+ help?: boolean;
11
+ }
12
+ export interface IfApiOptions {
13
+ debug: boolean;
14
+ disableExternalPluginWarning: boolean;
15
+ disabledPlugins: string | undefined;
16
+ port: number;
17
+ host: string;
18
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1hcmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLWFwaS90eXBlcy9wcm9jZXNzLWFyZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSW50ZXJmYWNlIGZvciBpZi1hcGkgcHJvY2VzcyBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWZBcGlBcmdzIHtcbiAgZGVidWc6IGJvb2xlYW47XG4gIGRpc2FibGVFeHRlcm5hbFBsdWdpbldhcm5pbmc6IGJvb2xlYW47XG4gIGRpc2FibGVkUGx1Z2lucz86IHN0cmluZztcbiAgcG9ydDogc3RyaW5nO1xuICBob3N0OiBzdHJpbmc7XG4gIGhlbHA/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElmQXBpT3B0aW9ucyB7XG4gIGRlYnVnOiBib29sZWFuO1xuICBkaXNhYmxlRXh0ZXJuYWxQbHVnaW5XYXJuaW5nOiBib29sZWFuO1xuICBkaXNhYmxlZFBsdWdpbnM6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcG9ydDogbnVtYmVyO1xuICBob3N0OiBzdHJpbmc7XG59XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import type { IfApiOptions } from '../types/process-args';
2
+ /**
3
+ * Parse command line arguments for `if-api`.
4
+ */
5
+ export declare const parseIfApiProcessArgs: () => IfApiOptions;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseIfApiProcessArgs = void 0;
4
+ const ts_command_line_args_1 = require("ts-command-line-args");
5
+ const config_1 = require("../config");
6
+ const { ARGS, HELP } = config_1.CONFIG;
7
+ const { INVALID_PORT_NUMBER } = config_1.STRINGS;
8
+ /**
9
+ * Validates `if-api` process arguments.
10
+ */
11
+ const validateAndParseProcessArgs = () => {
12
+ try {
13
+ return (0, ts_command_line_args_1.parse)(ARGS, HELP);
14
+ }
15
+ catch (error) {
16
+ if (error instanceof Error) {
17
+ console.log(error.message);
18
+ console.log('Here are the supported flags for the `if-api` command:');
19
+ (0, ts_command_line_args_1.parse)(ARGS, { ...HELP, argv: ['--help'], processExitCode: 1 });
20
+ }
21
+ throw error;
22
+ }
23
+ };
24
+ /**
25
+ * Parse command line arguments for `if-api`.
26
+ */
27
+ const parseIfApiProcessArgs = () => {
28
+ const options = validateAndParseProcessArgs();
29
+ const port = parseInt(options.port, 10);
30
+ if (Number.isNaN(port) || port < 0 || port > 65535) {
31
+ throw new Error(INVALID_PORT_NUMBER(options.port));
32
+ }
33
+ return {
34
+ debug: options.debug,
35
+ disableExternalPluginWarning: options.disableExternalPluginWarning,
36
+ disabledPlugins: options.disabledPlugins,
37
+ port,
38
+ host: options.host,
39
+ };
40
+ };
41
+ exports.parseIfApiProcessArgs = parseIfApiProcessArgs;
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZi1hcGkvdXRpbC9hcmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtEQUEyQztBQUUzQyxzQ0FBMEM7QUFHMUMsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsR0FBRyxlQUFNLENBQUM7QUFDNUIsTUFBTSxFQUFDLG1CQUFtQixFQUFDLEdBQUcsZ0JBQU8sQ0FBQztBQUV0Qzs7R0FFRztBQUNILE1BQU0sMkJBQTJCLEdBQUcsR0FBYyxFQUFFO0lBQ2xELElBQUk7UUFDRixPQUFPLElBQUEsNEJBQUssRUFBWSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDckM7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLElBQUksS0FBSyxZQUFZLEtBQUssRUFBRTtZQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7WUFDdEUsSUFBQSw0QkFBSyxFQUFZLElBQUksRUFBRSxFQUFDLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGVBQWUsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsTUFBTSxLQUFLLENBQUM7S0FDYjtBQUNILENBQUMsQ0FBQztBQUVGOztHQUVHO0FBQ0ksTUFBTSxxQkFBcUIsR0FBRyxHQUFpQixFQUFFO0lBQ3RELE1BQU0sT0FBTyxHQUFHLDJCQUEyQixFQUFFLENBQUM7SUFDOUMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDeEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRTtRQUNsRCxNQUFNLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ3BEO0lBRUQsT0FBTztRQUNMLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQiw0QkFBNEIsRUFBRSxPQUFPLENBQUMsNEJBQTRCO1FBQ2xFLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtRQUN4QyxJQUFJO1FBQ0osSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO0tBQ25CLENBQUM7QUFDSixDQUFDLENBQUM7QUFkVyxRQUFBLHFCQUFxQix5QkFjaEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge3BhcnNlfSBmcm9tICd0cy1jb21tYW5kLWxpbmUtYXJncyc7XG5cbmltcG9ydCB7Q09ORklHLCBTVFJJTkdTfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHR5cGUge0lmQXBpQXJncywgSWZBcGlPcHRpb25zfSBmcm9tICcuLi90eXBlcy9wcm9jZXNzLWFyZ3MnO1xuXG5jb25zdCB7QVJHUywgSEVMUH0gPSBDT05GSUc7XG5jb25zdCB7SU5WQUxJRF9QT1JUX05VTUJFUn0gPSBTVFJJTkdTO1xuXG4vKipcbiAqIFZhbGlkYXRlcyBgaWYtYXBpYCBwcm9jZXNzIGFyZ3VtZW50cy5cbiAqL1xuY29uc3QgdmFsaWRhdGVBbmRQYXJzZVByb2Nlc3NBcmdzID0gKCk6IElmQXBpQXJncyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlPElmQXBpQXJncz4oQVJHUywgSEVMUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yLm1lc3NhZ2UpO1xuICAgICAgY29uc29sZS5sb2coJ0hlcmUgYXJlIHRoZSBzdXBwb3J0ZWQgZmxhZ3MgZm9yIHRoZSBgaWYtYXBpYCBjb21tYW5kOicpO1xuICAgICAgcGFyc2U8SWZBcGlBcmdzPihBUkdTLCB7Li4uSEVMUCwgYXJndjogWyctLWhlbHAnXSwgcHJvY2Vzc0V4aXRDb2RlOiAxfSk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIFBhcnNlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgZm9yIGBpZi1hcGlgLlxuICovXG5leHBvcnQgY29uc3QgcGFyc2VJZkFwaVByb2Nlc3NBcmdzID0gKCk6IElmQXBpT3B0aW9ucyA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB2YWxpZGF0ZUFuZFBhcnNlUHJvY2Vzc0FyZ3MoKTtcbiAgY29uc3QgcG9ydCA9IHBhcnNlSW50KG9wdGlvbnMucG9ydCwgMTApO1xuICBpZiAoTnVtYmVyLmlzTmFOKHBvcnQpIHx8IHBvcnQgPCAwIHx8IHBvcnQgPiA2NTUzNSkge1xuICAgIHRocm93IG5ldyBFcnJvcihJTlZBTElEX1BPUlRfTlVNQkVSKG9wdGlvbnMucG9ydCkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICBkaXNhYmxlRXh0ZXJuYWxQbHVnaW5XYXJuaW5nOiBvcHRpb25zLmRpc2FibGVFeHRlcm5hbFBsdWdpbldhcm5pbmcsXG4gICAgZGlzYWJsZWRQbHVnaW5zOiBvcHRpb25zLmRpc2FibGVkUGx1Z2lucyxcbiAgICBwb3J0LFxuICAgIGhvc3Q6IG9wdGlvbnMuaG9zdCxcbiAgfTtcbn07XG4iXX0=
@@ -0,0 +1,5 @@
1
+ import { ArgumentConfig } from 'ts-command-line-args';
2
+ import { IFCheckMetadataArgs } from '../types/process-args';
3
+ export declare const CONFIG: {
4
+ ARGS: ArgumentConfig<IFCheckMetadataArgs>;
5
+ };
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CONFIG = void 0;
4
+ exports.CONFIG = {
5
+ ARGS: {
6
+ manifest: {
7
+ type: String,
8
+ alias: 'm',
9
+ description: 'Path of the manifest file',
10
+ },
11
+ parameters: {
12
+ type: String,
13
+ alias: 'p',
14
+ description: 'List of parameters to check',
15
+ multiple: true,
16
+ defaultValue: [],
17
+ },
18
+ help: {
19
+ type: Boolean,
20
+ alias: 'h',
21
+ description: 'Prints out the help instruction',
22
+ optional: true,
23
+ },
24
+ },
25
+ };
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLW1ldGFkYXRhLWNoZWNrL2NvbmZpZy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR2EsUUFBQSxNQUFNLEdBQUc7SUFDcEIsSUFBSSxFQUFFO1FBQ0osUUFBUSxFQUFFO1lBQ1IsSUFBSSxFQUFFLE1BQU07WUFDWixLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSwyQkFBMkI7U0FDekM7UUFDRCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsTUFBTTtZQUNaLEtBQUssRUFBRSxHQUFHO1lBQ1YsV0FBVyxFQUFFLDZCQUE2QjtZQUMxQyxRQUFRLEVBQUUsSUFBSTtZQUNkLFlBQVksRUFBRSxFQUFFO1NBQ2pCO1FBQ0QsSUFBSSxFQUFFO1lBQ0osSUFBSSxFQUFFLE9BQU87WUFDYixLQUFLLEVBQUUsR0FBRztZQUNWLFdBQVcsRUFBRSxpQ0FBaUM7WUFDOUMsUUFBUSxFQUFFLElBQUk7U0FDZjtLQUNxQztDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcmd1bWVudENvbmZpZ30gZnJvbSAndHMtY29tbWFuZC1saW5lLWFyZ3MnO1xuaW1wb3J0IHtJRkNoZWNrTWV0YWRhdGFBcmdzfSBmcm9tICcuLi90eXBlcy9wcm9jZXNzLWFyZ3MnO1xuXG5leHBvcnQgY29uc3QgQ09ORklHID0ge1xuICBBUkdTOiB7XG4gICAgbWFuaWZlc3Q6IHtcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICAgIGFsaWFzOiAnbScsXG4gICAgICBkZXNjcmlwdGlvbjogJ1BhdGggb2YgdGhlIG1hbmlmZXN0IGZpbGUnLFxuICAgIH0sXG4gICAgcGFyYW1ldGVyczoge1xuICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgYWxpYXM6ICdwJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTGlzdCBvZiBwYXJhbWV0ZXJzIHRvIGNoZWNrJyxcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgZGVmYXVsdFZhbHVlOiBbXSxcbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICBhbGlhczogJ2gnLFxuICAgICAgZGVzY3JpcHRpb246ICdQcmludHMgb3V0IHRoZSBoZWxwIGluc3RydWN0aW9uJyxcbiAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgIH0sXG4gIH0gYXMgQXJndW1lbnRDb25maWc8SUZDaGVja01ldGFkYXRhQXJncz4sXG59O1xuIl19
@@ -0,0 +1,5 @@
1
+ export declare const STRINGS: {
2
+ PARAMETERS_MISSING_METADATA: string;
3
+ ALL_PARAMETERS_HAVE_METADATA: string;
4
+ PERCENTAGE_COVERAGE: string;
5
+ };
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STRINGS = void 0;
4
+ exports.STRINGS = {
5
+ PARAMETERS_MISSING_METADATA: 'The following parameters are missing metadata: ',
6
+ ALL_PARAMETERS_HAVE_METADATA: 'All parameters have associated metadata.',
7
+ PERCENTAGE_COVERAGE: 'Metadata coverage percentage: ',
8
+ };
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZi1tZXRhZGF0YS1jaGVjay9jb25maWcvc3RyaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLE9BQU8sR0FBRztJQUNyQiwyQkFBMkIsRUFDekIsaURBQWlEO0lBQ25ELDRCQUE0QixFQUFFLDBDQUEwQztJQUN4RSxtQkFBbUIsRUFBRSxnQ0FBZ0M7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBTVFJJTkdTID0ge1xuICBQQVJBTUVURVJTX01JU1NJTkdfTUVUQURBVEE6XG4gICAgJ1RoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyBhcmUgbWlzc2luZyBtZXRhZGF0YTogJyxcbiAgQUxMX1BBUkFNRVRFUlNfSEFWRV9NRVRBREFUQTogJ0FsbCBwYXJhbWV0ZXJzIGhhdmUgYXNzb2NpYXRlZCBtZXRhZGF0YS4nLFxuICBQRVJDRU5UQUdFX0NPVkVSQUdFOiAnTWV0YWRhdGEgY292ZXJhZ2UgcGVyY2VudGFnZTogJyxcbn07XG4iXX0=
@@ -0,0 +1,2 @@
1
+ #!/user/bin/env node
2
+ export {};
@@ -0,0 +1,30 @@
1
+ #!/user/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const args_1 = require("./util/args");
5
+ const metadata_checker_1 = require("./util/metadata-checker");
6
+ const debug_logger_1 = require("../common/util/debug-logger");
7
+ const logger_1 = require("../common/util/logger");
8
+ const strings_1 = require("./config/strings");
9
+ const { PERCENTAGE_COVERAGE, ALL_PARAMETERS_HAVE_METADATA, PARAMETERS_MISSING_METADATA, } = strings_1.STRINGS;
10
+ const IfCheckMetadata = async () => {
11
+ debug_logger_1.debugLogger.overrideConsoleMethods(false);
12
+ const { parameters, ...manifestData } = await (0, args_1.parseIFCheckMetadataArgs)();
13
+ const parameterSet = (0, metadata_checker_1.getParameters)(Object.values(manifestData.initialize.plugins), parameters);
14
+ const parameterWithMetadataSet = (0, metadata_checker_1.getParametersWithMetadata)(Object.values(manifestData.initialize.plugins));
15
+ const { percentage, missingParameters } = (0, metadata_checker_1.calculateMetadataCoverage)(parameterSet, parameterWithMetadataSet);
16
+ console.log(`${PERCENTAGE_COVERAGE} ${percentage.toFixed(2)}%`);
17
+ if (missingParameters.length > 0) {
18
+ console.log(PARAMETERS_MISSING_METADATA);
19
+ missingParameters.forEach(parameter => console.log(` - ${parameter}`));
20
+ }
21
+ else {
22
+ console.log(ALL_PARAMETERS_HAVE_METADATA);
23
+ }
24
+ };
25
+ IfCheckMetadata().catch(error => {
26
+ if (error instanceof Error)
27
+ logger_1.logger.error(`${error.message}`);
28
+ throw error;
29
+ });
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaWYtbWV0YWRhdGEtY2hlY2svaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0Esc0NBQXFEO0FBQ3JELDhEQUlpQztBQUNqQyw4REFBd0Q7QUFDeEQsa0RBQTZDO0FBQzdDLDhDQUF5QztBQUV6QyxNQUFNLEVBQ0osbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QiwyQkFBMkIsR0FDNUIsR0FBRyxpQkFBTyxDQUFDO0FBRVosTUFBTSxlQUFlLEdBQUcsS0FBSyxJQUFJLEVBQUU7SUFDakMsMEJBQVcsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLEVBQUMsVUFBVSxFQUFFLEdBQUcsWUFBWSxFQUFDLEdBQUcsTUFBTSxJQUFBLCtCQUF3QixHQUFFLENBQUM7SUFFdkUsTUFBTSxZQUFZLEdBQUcsSUFBQSxnQ0FBYSxFQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFlLEVBQzVELFVBQVUsQ0FDWCxDQUFDO0lBQ0YsTUFBTSx3QkFBd0IsR0FBRyxJQUFBLDRDQUF5QixFQUN4RCxNQUFNLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFlLENBQzdELENBQUM7SUFDRixNQUFNLEVBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFDLEdBQUcsSUFBQSw0Q0FBeUIsRUFDL0QsWUFBWSxFQUNaLHdCQUF3QixDQUN6QixDQUFDO0lBQ0YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLG1CQUFtQixJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hFLElBQUksaUJBQWlCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDekMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN6RTtTQUFNO1FBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQyxDQUFDO0FBRUYsZUFBZSxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO0lBQzlCLElBQUksS0FBSyxZQUFZLEtBQUs7UUFBRSxlQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDN0QsTUFBTSxLQUFLLENBQUM7QUFDZCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3VzZXIvYmluL2VudiBub2RlXG5cbmltcG9ydCB7SUZQbHVnaW59IGZyb20gJy4vdHlwZXMvcGx1Z2luJztcbmltcG9ydCB7cGFyc2VJRkNoZWNrTWV0YWRhdGFBcmdzfSBmcm9tICcuL3V0aWwvYXJncyc7XG5pbXBvcnQge1xuICBnZXRQYXJhbWV0ZXJzLFxuICBnZXRQYXJhbWV0ZXJzV2l0aE1ldGFkYXRhLFxuICBjYWxjdWxhdGVNZXRhZGF0YUNvdmVyYWdlLFxufSBmcm9tICcuL3V0aWwvbWV0YWRhdGEtY2hlY2tlcic7XG5pbXBvcnQge2RlYnVnTG9nZ2VyfSBmcm9tICcuLi9jb21tb24vdXRpbC9kZWJ1Zy1sb2dnZXInO1xuaW1wb3J0IHtsb2dnZXJ9IGZyb20gJy4uL2NvbW1vbi91dGlsL2xvZ2dlcic7XG5pbXBvcnQge1NUUklOR1N9IGZyb20gJy4vY29uZmlnL3N0cmluZ3MnO1xuXG5jb25zdCB7XG4gIFBFUkNFTlRBR0VfQ09WRVJBR0UsXG4gIEFMTF9QQVJBTUVURVJTX0hBVkVfTUVUQURBVEEsXG4gIFBBUkFNRVRFUlNfTUlTU0lOR19NRVRBREFUQSxcbn0gPSBTVFJJTkdTO1xuXG5jb25zdCBJZkNoZWNrTWV0YWRhdGEgPSBhc3luYyAoKSA9PiB7XG4gIGRlYnVnTG9nZ2VyLm92ZXJyaWRlQ29uc29sZU1ldGhvZHMoZmFsc2UpO1xuICBjb25zdCB7cGFyYW1ldGVycywgLi4ubWFuaWZlc3REYXRhfSA9IGF3YWl0IHBhcnNlSUZDaGVja01ldGFkYXRhQXJncygpO1xuXG4gIGNvbnN0IHBhcmFtZXRlclNldCA9IGdldFBhcmFtZXRlcnMoXG4gICAgT2JqZWN0LnZhbHVlcyhtYW5pZmVzdERhdGEuaW5pdGlhbGl6ZS5wbHVnaW5zKSBhcyBJRlBsdWdpbltdLFxuICAgIHBhcmFtZXRlcnNcbiAgKTtcbiAgY29uc3QgcGFyYW1ldGVyV2l0aE1ldGFkYXRhU2V0ID0gZ2V0UGFyYW1ldGVyc1dpdGhNZXRhZGF0YShcbiAgICBPYmplY3QudmFsdWVzKG1hbmlmZXN0RGF0YS5pbml0aWFsaXplLnBsdWdpbnMpIGFzIElGUGx1Z2luW11cbiAgKTtcbiAgY29uc3Qge3BlcmNlbnRhZ2UsIG1pc3NpbmdQYXJhbWV0ZXJzfSA9IGNhbGN1bGF0ZU1ldGFkYXRhQ292ZXJhZ2UoXG4gICAgcGFyYW1ldGVyU2V0LFxuICAgIHBhcmFtZXRlcldpdGhNZXRhZGF0YVNldFxuICApO1xuICBjb25zb2xlLmxvZyhgJHtQRVJDRU5UQUdFX0NPVkVSQUdFfSAke3BlcmNlbnRhZ2UudG9GaXhlZCgyKX0lYCk7XG4gIGlmIChtaXNzaW5nUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgY29uc29sZS5sb2coUEFSQU1FVEVSU19NSVNTSU5HX01FVEFEQVRBKTtcbiAgICBtaXNzaW5nUGFyYW1ldGVycy5mb3JFYWNoKHBhcmFtZXRlciA9PiBjb25zb2xlLmxvZyhgICAtICR7cGFyYW1ldGVyfWApKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zb2xlLmxvZyhBTExfUEFSQU1FVEVSU19IQVZFX01FVEFEQVRBKTtcbiAgfVxufTtcblxuSWZDaGVja01ldGFkYXRhKCkuY2F0Y2goZXJyb3IgPT4ge1xuICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikgbG9nZ2VyLmVycm9yKGAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gIHRocm93IGVycm9yO1xufSk7XG4iXX0=
@@ -0,0 +1,7 @@
1
+ import { PluginParametersMetadata } from '@grnsft/if-core/types';
2
+ export interface IFPlugin {
3
+ path: string;
4
+ method: string;
5
+ config?: Record<string, any>;
6
+ 'parameter-metadata'?: PluginParametersMetadata;
7
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLW1ldGFkYXRhLWNoZWNrL3R5cGVzL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtQbHVnaW5QYXJhbWV0ZXJzTWV0YWRhdGF9IGZyb20gJ0Bncm5zZnQvaWYtY29yZS90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUZQbHVnaW4ge1xuICBwYXRoOiBzdHJpbmc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICBjb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAncGFyYW1ldGVyLW1ldGFkYXRhJz86IFBsdWdpblBhcmFtZXRlcnNNZXRhZGF0YTtcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export interface IFCheckMetadataArgs {
2
+ manifest: string;
3
+ parameters: string[];
4
+ help?: boolean;
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvY2Vzcy1hcmdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2lmLW1ldGFkYXRhLWNoZWNrL3R5cGVzL3Byb2Nlc3MtYXJncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBJRkNoZWNrTWV0YWRhdGFBcmdzIHtcbiAgbWFuaWZlc3Q6IHN0cmluZztcbiAgcGFyYW1ldGVyczogc3RyaW5nW107XG4gIGhlbHA/OiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,57 @@
1
+ export declare const parseIFCheckMetadataArgs: () => Promise<{
2
+ parameters: string[];
3
+ name: string;
4
+ initialize: {
5
+ plugins: Record<string, {
6
+ path: string;
7
+ method: string;
8
+ mapping?: Record<string, string> | undefined;
9
+ config?: Record<string, any> | undefined;
10
+ 'parameter-metadata'?: {
11
+ inputs?: Record<string, {
12
+ unit: string;
13
+ description: string;
14
+ 'aggregation-method': {
15
+ time: "sum" | "avg" | "none" | "copy";
16
+ component: "sum" | "avg" | "none" | "copy";
17
+ };
18
+ }> | null | undefined;
19
+ outputs?: Record<string, {
20
+ unit: string;
21
+ description: string;
22
+ 'aggregation-method': {
23
+ time: "sum" | "avg" | "none" | "copy";
24
+ component: "sum" | "avg" | "none" | "copy";
25
+ };
26
+ }> | null | undefined;
27
+ } | undefined;
28
+ } | undefined>;
29
+ };
30
+ tree: Record<string, any>;
31
+ description?: string | null | undefined;
32
+ tags?: {
33
+ kind?: string | null | undefined;
34
+ complexity?: string | null | undefined;
35
+ category?: string | null | undefined;
36
+ } | null | undefined;
37
+ explainer?: boolean | undefined;
38
+ explain?: Record<string, any> | undefined;
39
+ aggregation?: {
40
+ type: "horizontal" | "time" | "vertical" | "component" | "both";
41
+ metrics: string[];
42
+ 'skip-components'?: string[] | undefined;
43
+ } | null | undefined;
44
+ execution?: {
45
+ status: string;
46
+ command?: string | undefined;
47
+ environment?: {
48
+ 'if-version': string;
49
+ os: string;
50
+ 'os-version': string;
51
+ 'node-version': string;
52
+ 'date-time': string;
53
+ dependencies: string[];
54
+ } | undefined;
55
+ error?: string | undefined;
56
+ } | undefined;
57
+ }>;
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseIFCheckMetadataArgs = void 0;
4
+ const ts_command_line_args_1 = require("ts-command-line-args");
5
+ const config_1 = require("../config/config");
6
+ const helpers_1 = require("../../common/util/helpers");
7
+ const load_1 = require("../../common/lib/load");
8
+ const validations_1 = require("../../common/util/validations");
9
+ const { ARGS } = config_1.CONFIG;
10
+ const validateAndParseIFCheckMetadataArgs = () => {
11
+ try {
12
+ return (0, ts_command_line_args_1.parse)(ARGS);
13
+ }
14
+ catch (error) {
15
+ if (error instanceof Error) {
16
+ console.log(error.message);
17
+ (0, helpers_1.runHelpCommand)('if-check-metadata');
18
+ }
19
+ throw error;
20
+ }
21
+ };
22
+ const parseIFCheckMetadataArgs = async () => {
23
+ const { manifest, parameters } = validateAndParseIFCheckMetadataArgs();
24
+ const { rawManifest } = await (0, load_1.load)(manifest);
25
+ const validatedManifest = (0, validations_1.validateManifest)(rawManifest);
26
+ return { ...validatedManifest, parameters };
27
+ };
28
+ exports.parseIFCheckMetadataArgs = parseIFCheckMetadataArgs;
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pZi1tZXRhZGF0YS1jaGVjay91dGlsL2FyZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsK0RBQTJDO0FBQzNDLDZDQUF3QztBQUN4Qyx1REFBeUQ7QUFDekQsZ0RBQTJDO0FBQzNDLCtEQUErRDtBQUUvRCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRXRCLE1BQU0sbUNBQW1DLEdBQUcsR0FBd0IsRUFBRTtJQUNwRSxJQUFJO1FBQ0YsT0FBTyxJQUFBLDRCQUFLLEVBQXNCLElBQUksQ0FBQyxDQUFDO0tBQ3pDO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUU7WUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDM0IsSUFBQSx3QkFBYyxFQUFDLG1CQUFtQixDQUFDLENBQUM7U0FDckM7UUFDRCxNQUFNLEtBQUssQ0FBQztLQUNiO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSx3QkFBd0IsR0FBRyxLQUFLLElBQUksRUFBRTtJQUNqRCxNQUFNLEVBQUMsUUFBUSxFQUFFLFVBQVUsRUFBQyxHQUFHLG1DQUFtQyxFQUFFLENBQUM7SUFDckUsTUFBTSxFQUFDLFdBQVcsRUFBQyxHQUFHLE1BQU0sSUFBQSxXQUFJLEVBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0MsTUFBTSxpQkFBaUIsR0FBRyxJQUFBLDhCQUFnQixFQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ3hELE9BQU8sRUFBQyxHQUFHLGlCQUFpQixFQUFFLFVBQVUsRUFBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQztBQUxXLFFBQUEsd0JBQXdCLDRCQUtuQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SUZDaGVja01ldGFkYXRhQXJnc30gZnJvbSAnLi4vdHlwZXMvcHJvY2Vzcy1hcmdzJztcbmltcG9ydCB7cGFyc2V9IGZyb20gJ3RzLWNvbW1hbmQtbGluZS1hcmdzJztcbmltcG9ydCB7Q09ORklHfSBmcm9tICcuLi9jb25maWcvY29uZmlnJztcbmltcG9ydCB7cnVuSGVscENvbW1hbmR9IGZyb20gJy4uLy4uL2NvbW1vbi91dGlsL2hlbHBlcnMnO1xuaW1wb3J0IHtsb2FkfSBmcm9tICcuLi8uLi9jb21tb24vbGliL2xvYWQnO1xuaW1wb3J0IHt2YWxpZGF0ZU1hbmlmZXN0fSBmcm9tICcuLi8uLi9jb21tb24vdXRpbC92YWxpZGF0aW9ucyc7XG5cbmNvbnN0IHtBUkdTfSA9IENPTkZJRztcblxuY29uc3QgdmFsaWRhdGVBbmRQYXJzZUlGQ2hlY2tNZXRhZGF0YUFyZ3MgPSAoKTogSUZDaGVja01ldGFkYXRhQXJncyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhcnNlPElGQ2hlY2tNZXRhZGF0YUFyZ3M+KEFSR1MpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBjb25zb2xlLmxvZyhlcnJvci5tZXNzYWdlKTtcbiAgICAgIHJ1bkhlbHBDb21tYW5kKCdpZi1jaGVjay1tZXRhZGF0YScpO1xuICAgIH1cbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHBhcnNlSUZDaGVja01ldGFkYXRhQXJncyA9IGFzeW5jICgpID0+IHtcbiAgY29uc3Qge21hbmlmZXN0LCBwYXJhbWV0ZXJzfSA9IHZhbGlkYXRlQW5kUGFyc2VJRkNoZWNrTWV0YWRhdGFBcmdzKCk7XG4gIGNvbnN0IHtyYXdNYW5pZmVzdH0gPSBhd2FpdCBsb2FkKG1hbmlmZXN0KTtcbiAgY29uc3QgdmFsaWRhdGVkTWFuaWZlc3QgPSB2YWxpZGF0ZU1hbmlmZXN0KHJhd01hbmlmZXN0KTtcbiAgcmV0dXJuIHsuLi52YWxpZGF0ZWRNYW5pZmVzdCwgcGFyYW1ldGVyc307XG59O1xuIl19