cdk-cost-analyzer 0.1.10 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cdk-cost-analyzer-cache/metadata.json +26 -2
- package/.kiro/specs/single-template-analysis/tasks.md +67 -54
- package/README.md +31 -1
- package/dist/analysis/SingleTemplateAnalyzer.d.ts +23 -0
- package/dist/analysis/SingleTemplateAnalyzer.js +168 -0
- package/dist/analysis/index.d.ts +1 -0
- package/dist/analysis/index.js +6 -0
- package/dist/api/index.d.ts +24 -0
- package/dist/api/index.js +56 -1
- package/dist/api/single-template-types.d.ts +83 -0
- package/dist/api/single-template-types.js +3 -0
- package/dist/cli/index.js +43 -54
- package/dist/pricing/calculators/LambdaCalculator.d.ts +2 -0
- package/dist/pricing/calculators/LambdaCalculator.js +48 -1
- package/dist/releasetag.txt +1 -1
- package/dist/reporter/SingleTemplateReporter.d.ts +31 -0
- package/dist/reporter/SingleTemplateReporter.js +186 -0
- package/dist/reporter/index.d.ts +1 -0
- package/dist/reporter/index.js +4 -2
- package/docs/SINGLE-TEMPLATE-ANALYSIS.md +372 -0
- package/examples/single-template-usage.js +208 -0
- package/package.json +1 -1
- package/test-cdk-project/README-COMPUTE.md +0 -141
- package/test-cdk-project/README.md +0 -95
- package/test-cdk-project/app-with-compute.js +0 -102
- package/test-cdk-project/app.js +0 -81
- package/test-cdk-project/cdk-compute.json +0 -3
- package/test-cdk-project/cdk.context.json +0 -7
- package/test-cdk-project/cdk.json +0 -3
- package/test-cdk-project/cdk.out/TestStack.assets.json +0 -21
- package/test-cdk-project/cdk.out/TestStack.template.json +0 -115
- package/test-cdk-project/cdk.out/cdk.out +0 -1
- package/test-cdk-project/cdk.out/manifest.json +0 -503
- package/test-cdk-project/cdk.out/tree.json +0 -1
- package/test-cdk-project/cdk.out.base/TestStack.assets.json +0 -21
- package/test-cdk-project/cdk.out.base/TestStack.template.json +0 -115
- package/test-cdk-project/cdk.out.base/cdk.out +0 -1
- package/test-cdk-project/cdk.out.base/manifest.json +0 -503
- package/test-cdk-project/cdk.out.base/tree.json +0 -1
- package/test-cdk-project/cdk.out.target/TestStack.assets.json +0 -21
- package/test-cdk-project/cdk.out.target/TestStack.template.json +0 -183
- package/test-cdk-project/cdk.out.target/cdk.out +0 -1
- package/test-cdk-project/cdk.out.target/manifest.json +0 -521
- package/test-cdk-project/cdk.out.target/tree.json +0 -1
- package/test-cdk-project/package-lock.json +0 -422
- package/test-cdk-project/package.json +0 -17
package/dist/api/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { AnalyzeOptions, CostAnalysisResult } from './types';
|
|
2
|
+
import { AnalyzeSingleTemplateOptions, SingleTemplateCostResult } from './single-template-types';
|
|
2
3
|
export * from './types';
|
|
4
|
+
export * from './single-template-types';
|
|
3
5
|
export { TemplateParseError } from '../parser/TemplateParser';
|
|
4
6
|
export { PricingAPIError, UnsupportedResourceError } from '../pricing/types';
|
|
5
7
|
export * from '../integrations';
|
|
@@ -9,3 +11,25 @@ export * from '../synthesis';
|
|
|
9
11
|
export * from '../threshold';
|
|
10
12
|
export * from '../pipeline';
|
|
11
13
|
export declare function analyzeCosts(options: AnalyzeOptions): Promise<CostAnalysisResult>;
|
|
14
|
+
/**
|
|
15
|
+
* Analyze a single CloudFormation template for estimated monthly costs
|
|
16
|
+
*
|
|
17
|
+
* @param options - Configuration options including template content, region, format, and analysis config
|
|
18
|
+
* @returns Promise resolving to detailed cost analysis result
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const result = await analyzeSingleTemplate({
|
|
23
|
+
* template: fs.readFileSync('template.json', 'utf-8'),
|
|
24
|
+
* region: 'us-east-1',
|
|
25
|
+
* format: 'text',
|
|
26
|
+
* config: {
|
|
27
|
+
* usageAssumptions: {
|
|
28
|
+
* lambda: { invocationsPerMonth: 1000000 }
|
|
29
|
+
* }
|
|
30
|
+
* }
|
|
31
|
+
* });
|
|
32
|
+
* console.log(result.summary);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function analyzeSingleTemplate(options: AnalyzeSingleTemplateOptions): Promise<SingleTemplateCostResult>;
|
package/dist/api/index.js
CHANGED
|
@@ -16,11 +16,15 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
exports.UnsupportedResourceError = exports.PricingAPIError = exports.TemplateParseError = void 0;
|
|
18
18
|
exports.analyzeCosts = analyzeCosts;
|
|
19
|
+
exports.analyzeSingleTemplate = analyzeSingleTemplate;
|
|
19
20
|
const DiffEngine_1 = require("../diff/DiffEngine");
|
|
20
21
|
const TemplateParser_1 = require("../parser/TemplateParser");
|
|
21
22
|
const PricingService_1 = require("../pricing/PricingService");
|
|
22
23
|
const Reporter_1 = require("../reporter/Reporter");
|
|
24
|
+
const SingleTemplateReporter_1 = require("../reporter/SingleTemplateReporter");
|
|
25
|
+
const SingleTemplateAnalyzer_1 = require("../analysis/SingleTemplateAnalyzer");
|
|
23
26
|
__exportStar(require("./types"), exports);
|
|
27
|
+
__exportStar(require("./single-template-types"), exports);
|
|
24
28
|
var TemplateParser_2 = require("../parser/TemplateParser");
|
|
25
29
|
Object.defineProperty(exports, "TemplateParseError", { enumerable: true, get: function () { return TemplateParser_2.TemplateParseError; } });
|
|
26
30
|
var types_1 = require("../pricing/types");
|
|
@@ -62,4 +66,55 @@ async function analyzeCosts(options) {
|
|
|
62
66
|
pricingService.destroy();
|
|
63
67
|
}
|
|
64
68
|
}
|
|
65
|
-
|
|
69
|
+
/**
|
|
70
|
+
* Analyze a single CloudFormation template for estimated monthly costs
|
|
71
|
+
*
|
|
72
|
+
* @param options - Configuration options including template content, region, format, and analysis config
|
|
73
|
+
* @returns Promise resolving to detailed cost analysis result
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const result = await analyzeSingleTemplate({
|
|
78
|
+
* template: fs.readFileSync('template.json', 'utf-8'),
|
|
79
|
+
* region: 'us-east-1',
|
|
80
|
+
* format: 'text',
|
|
81
|
+
* config: {
|
|
82
|
+
* usageAssumptions: {
|
|
83
|
+
* lambda: { invocationsPerMonth: 1000000 }
|
|
84
|
+
* }
|
|
85
|
+
* }
|
|
86
|
+
* });
|
|
87
|
+
* console.log(result.summary);
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
async function analyzeSingleTemplate(options) {
|
|
91
|
+
const region = options.region || 'eu-central-1';
|
|
92
|
+
const format = options.format || 'text';
|
|
93
|
+
if (!options.template) {
|
|
94
|
+
throw new Error('Template content is required');
|
|
95
|
+
}
|
|
96
|
+
const analyzer = new SingleTemplateAnalyzer_1.SingleTemplateAnalyzer();
|
|
97
|
+
const reporter = new SingleTemplateReporter_1.SingleTemplateReporter();
|
|
98
|
+
try {
|
|
99
|
+
// Analyze the template
|
|
100
|
+
const result = await analyzer.analyzeCosts(options.template, region, options.config);
|
|
101
|
+
// Generate formatted summary using the reporter
|
|
102
|
+
const summary = reporter.generateReport(result, format);
|
|
103
|
+
return {
|
|
104
|
+
...result,
|
|
105
|
+
summary,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
// Handle AWS credentials errors
|
|
110
|
+
if (error instanceof Error && error.message.includes('Could not load credentials')) {
|
|
111
|
+
throw new Error('AWS credentials not configured. Please set AWS credentials using one of:\n' +
|
|
112
|
+
' - AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY environment variables\n' +
|
|
113
|
+
' - AWS_PROFILE environment variable\n' +
|
|
114
|
+
' - AWS credentials file (~/.aws/credentials)\n' +
|
|
115
|
+
' - For CI/CD, configure AWS credentials in your pipeline');
|
|
116
|
+
}
|
|
117
|
+
throw error;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYXBpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JBLG9DQW1DQztBQXVCRCxzREFxQ0M7QUFqSEQsbURBQWdEO0FBQ2hELDZEQUEwRDtBQUMxRCw4REFBMkQ7QUFDM0QsbURBQWdEO0FBQ2hELCtFQUE0RTtBQUM1RSwrRUFBNEU7QUFFNUUsMENBQXdCO0FBQ3hCLDBEQUF3QztBQUN4QywyREFBOEQ7QUFBckQsb0hBQUEsa0JBQWtCLE9BQUE7QUFDM0IsMENBQTZFO0FBQXBFLHdHQUFBLGVBQWUsT0FBQTtBQUFFLGlIQUFBLHdCQUF3QixPQUFBO0FBQ2xELGtEQUFnQztBQUNoQyxvREFBa0M7QUFDbEMsNENBQTBCO0FBQzFCLCtDQUE2QjtBQUM3QiwrQ0FBNkI7QUFDN0IsOENBQTRCO0FBRXJCLEtBQUssVUFBVSxZQUFZLENBQUMsT0FBdUI7SUFDeEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUM7SUFFeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLCtCQUFjLEVBQUUsQ0FBQztJQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLHVCQUFVLEVBQUUsQ0FBQztJQUNwQyxNQUFNLGNBQWMsR0FBRyxJQUFJLCtCQUFjLEVBQUUsQ0FBQztJQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLG1CQUFRLEVBQUUsQ0FBQztJQUVoQyxJQUFJLENBQUM7UUFDSCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMzRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFFakUsTUFBTSxTQUFTLEdBQUcsTUFBTSxjQUFjLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUVsRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQ2hDLFFBQVEsRUFBRSxTQUFTLENBQUMsUUFBUTtZQUM1QixjQUFjLEVBQUUsU0FBUyxDQUFDLFVBQVU7WUFDcEMsZ0JBQWdCLEVBQUUsU0FBUyxDQUFDLFlBQVk7WUFDeEMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLGFBQWE7WUFDMUMsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO1lBQVMsQ0FBQztRQUNULG9EQUFvRDtRQUNwRCxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSSxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLE9BQXFDO0lBRXJDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO0lBRXhDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxJQUFJLCtDQUFzQixFQUFFLENBQUM7SUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSwrQ0FBc0IsRUFBRSxDQUFDO0lBRTlDLElBQUksQ0FBQztRQUNILHVCQUF1QjtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJGLGdEQUFnRDtRQUNoRCxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUV4RCxPQUFPO1lBQ0wsR0FBRyxNQUFNO1lBQ1QsT0FBTztTQUNSLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxJQUFJLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsRUFBRSxDQUFDO1lBQ25GLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEVBQTRFO2dCQUM1RSx5RUFBeUU7Z0JBQ3pFLHdDQUF3QztnQkFDeEMsaURBQWlEO2dCQUNqRCwyREFBMkQsQ0FDNUQsQ0FBQztRQUNKLENBQUM7UUFDRCxNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5hbHl6ZU9wdGlvbnMsIENvc3RBbmFseXNpc1Jlc3VsdCB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgQW5hbHl6ZVNpbmdsZVRlbXBsYXRlT3B0aW9ucywgU2luZ2xlVGVtcGxhdGVDb3N0UmVzdWx0IH0gZnJvbSAnLi9zaW5nbGUtdGVtcGxhdGUtdHlwZXMnO1xuaW1wb3J0IHsgRGlmZkVuZ2luZSB9IGZyb20gJy4uL2RpZmYvRGlmZkVuZ2luZSc7XG5pbXBvcnQgeyBUZW1wbGF0ZVBhcnNlciB9IGZyb20gJy4uL3BhcnNlci9UZW1wbGF0ZVBhcnNlcic7XG5pbXBvcnQgeyBQcmljaW5nU2VydmljZSB9IGZyb20gJy4uL3ByaWNpbmcvUHJpY2luZ1NlcnZpY2UnO1xuaW1wb3J0IHsgUmVwb3J0ZXIgfSBmcm9tICcuLi9yZXBvcnRlci9SZXBvcnRlcic7XG5pbXBvcnQgeyBTaW5nbGVUZW1wbGF0ZVJlcG9ydGVyIH0gZnJvbSAnLi4vcmVwb3J0ZXIvU2luZ2xlVGVtcGxhdGVSZXBvcnRlcic7XG5pbXBvcnQgeyBTaW5nbGVUZW1wbGF0ZUFuYWx5emVyIH0gZnJvbSAnLi4vYW5hbHlzaXMvU2luZ2xlVGVtcGxhdGVBbmFseXplcic7XG5cbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9zaW5nbGUtdGVtcGxhdGUtdHlwZXMnO1xuZXhwb3J0IHsgVGVtcGxhdGVQYXJzZUVycm9yIH0gZnJvbSAnLi4vcGFyc2VyL1RlbXBsYXRlUGFyc2VyJztcbmV4cG9ydCB7IFByaWNpbmdBUElFcnJvciwgVW5zdXBwb3J0ZWRSZXNvdXJjZUVycm9yIH0gZnJvbSAnLi4vcHJpY2luZy90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuLi9pbnRlZ3JhdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi4vcmVwb3J0ZXIvdHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi4vY29uZmlnJztcbmV4cG9ydCAqIGZyb20gJy4uL3N5bnRoZXNpcyc7XG5leHBvcnQgKiBmcm9tICcuLi90aHJlc2hvbGQnO1xuZXhwb3J0ICogZnJvbSAnLi4vcGlwZWxpbmUnO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZUNvc3RzKG9wdGlvbnM6IEFuYWx5emVPcHRpb25zKTogUHJvbWlzZTxDb3N0QW5hbHlzaXNSZXN1bHQ+IHtcbiAgY29uc3QgcmVnaW9uID0gb3B0aW9ucy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMSc7XG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICd0ZXh0JztcblxuICBpZiAoIW9wdGlvbnMuYmFzZVRlbXBsYXRlIHx8ICFvcHRpb25zLnRhcmdldFRlbXBsYXRlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdCb3RoIGJhc2VUZW1wbGF0ZSBhbmQgdGFyZ2V0VGVtcGxhdGUgYXJlIHJlcXVpcmVkJyk7XG4gIH1cblxuICBjb25zdCBwYXJzZXIgPSBuZXcgVGVtcGxhdGVQYXJzZXIoKTtcbiAgY29uc3QgZGlmZkVuZ2luZSA9IG5ldyBEaWZmRW5naW5lKCk7XG4gIGNvbnN0IHByaWNpbmdTZXJ2aWNlID0gbmV3IFByaWNpbmdTZXJ2aWNlKCk7XG4gIGNvbnN0IHJlcG9ydGVyID0gbmV3IFJlcG9ydGVyKCk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBiYXNlVGVtcGxhdGVPYmogPSBwYXJzZXIucGFyc2Uob3B0aW9ucy5iYXNlVGVtcGxhdGUpO1xuICAgIGNvbnN0IHRhcmdldFRlbXBsYXRlT2JqID0gcGFyc2VyLnBhcnNlKG9wdGlvbnMudGFyZ2V0VGVtcGxhdGUpO1xuXG4gICAgY29uc3QgZGlmZiA9IGRpZmZFbmdpbmUuZGlmZihiYXNlVGVtcGxhdGVPYmosIHRhcmdldFRlbXBsYXRlT2JqKTtcblxuICAgIGNvbnN0IGNvc3REZWx0YSA9IGF3YWl0IHByaWNpbmdTZXJ2aWNlLmdldENvc3REZWx0YShkaWZmLCByZWdpb24pO1xuXG4gICAgY29uc3Qgc3VtbWFyeSA9IHJlcG9ydGVyLmdlbmVyYXRlUmVwb3J0KGNvc3REZWx0YSwgZm9ybWF0KTtcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbERlbHRhOiBjb3N0RGVsdGEudG90YWxEZWx0YSxcbiAgICAgIGN1cnJlbmN5OiBjb3N0RGVsdGEuY3VycmVuY3ksXG4gICAgICBhZGRlZFJlc291cmNlczogY29zdERlbHRhLmFkZGVkQ29zdHMsXG4gICAgICByZW1vdmVkUmVzb3VyY2VzOiBjb3N0RGVsdGEucmVtb3ZlZENvc3RzLFxuICAgICAgbW9kaWZpZWRSZXNvdXJjZXM6IGNvc3REZWx0YS5tb2RpZmllZENvc3RzLFxuICAgICAgc3VtbWFyeSxcbiAgICB9O1xuICB9IGZpbmFsbHkge1xuICAgIC8vIENsZWFuIHVwIHJlc291cmNlcyB0byBwcmV2ZW50IGhhbmdpbmcgY29ubmVjdGlvbnNcbiAgICBwcmljaW5nU2VydmljZS5kZXN0cm95KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbmFseXplIGEgc2luZ2xlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvciBlc3RpbWF0ZWQgbW9udGhseSBjb3N0c1xuICogXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBpbmNsdWRpbmcgdGVtcGxhdGUgY29udGVudCwgcmVnaW9uLCBmb3JtYXQsIGFuZCBhbmFseXNpcyBjb25maWdcbiAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGRldGFpbGVkIGNvc3QgYW5hbHlzaXMgcmVzdWx0XG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplU2luZ2xlVGVtcGxhdGUoe1xuICogICB0ZW1wbGF0ZTogZnMucmVhZEZpbGVTeW5jKCd0ZW1wbGF0ZS5qc29uJywgJ3V0Zi04JyksXG4gKiAgIHJlZ2lvbjogJ3VzLWVhc3QtMScsXG4gKiAgIGZvcm1hdDogJ3RleHQnLFxuICogICBjb25maWc6IHtcbiAqICAgICB1c2FnZUFzc3VtcHRpb25zOiB7XG4gKiAgICAgICBsYW1iZGE6IHsgaW52b2NhdGlvbnNQZXJNb250aDogMTAwMDAwMCB9XG4gKiAgICAgfVxuICogICB9XG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAqIGBgYFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gYW5hbHl6ZVNpbmdsZVRlbXBsYXRlKFxuICBvcHRpb25zOiBBbmFseXplU2luZ2xlVGVtcGxhdGVPcHRpb25zLFxuKTogUHJvbWlzZTxTaW5nbGVUZW1wbGF0ZUNvc3RSZXN1bHQ+IHtcbiAgY29uc3QgcmVnaW9uID0gb3B0aW9ucy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMSc7XG4gIGNvbnN0IGZvcm1hdCA9IG9wdGlvbnMuZm9ybWF0IHx8ICd0ZXh0JztcblxuICBpZiAoIW9wdGlvbnMudGVtcGxhdGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RlbXBsYXRlIGNvbnRlbnQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGNvbnN0IGFuYWx5emVyID0gbmV3IFNpbmdsZVRlbXBsYXRlQW5hbHl6ZXIoKTtcbiAgY29uc3QgcmVwb3J0ZXIgPSBuZXcgU2luZ2xlVGVtcGxhdGVSZXBvcnRlcigpO1xuXG4gIHRyeSB7XG4gICAgLy8gQW5hbHl6ZSB0aGUgdGVtcGxhdGVcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplci5hbmFseXplQ29zdHMob3B0aW9ucy50ZW1wbGF0ZSwgcmVnaW9uLCBvcHRpb25zLmNvbmZpZyk7XG5cbiAgICAvLyBHZW5lcmF0ZSBmb3JtYXR0ZWQgc3VtbWFyeSB1c2luZyB0aGUgcmVwb3J0ZXJcbiAgICBjb25zdCBzdW1tYXJ5ID0gcmVwb3J0ZXIuZ2VuZXJhdGVSZXBvcnQocmVzdWx0LCBmb3JtYXQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnJlc3VsdCxcbiAgICAgIHN1bW1hcnksXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBIYW5kbGUgQVdTIGNyZWRlbnRpYWxzIGVycm9yc1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0NvdWxkIG5vdCBsb2FkIGNyZWRlbnRpYWxzJykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0FXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZC4gUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOlxcbicgK1xuICAgICAgICAnICAtIEFXU19BQ0NFU1NfS0VZX0lEIGFuZCBBV1NfU0VDUkVUX0FDQ0VTU19LRVkgZW52aXJvbm1lbnQgdmFyaWFibGVzXFxuJyArXG4gICAgICAgICcgIC0gQVdTX1BST0ZJTEUgZW52aXJvbm1lbnQgdmFyaWFibGVcXG4nICtcbiAgICAgICAgJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKVxcbicgK1xuICAgICAgICAnICAtIEZvciBDSS9DRCwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiB5b3VyIHBpcGVsaW5lJyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbiJdfQ==
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { ResourceCost } from '../pricing/types';
|
|
2
|
+
import { UsageAssumptionsConfig, CacheConfig } from '../config/types';
|
|
3
|
+
/**
|
|
4
|
+
* Configuration options for single template analysis
|
|
5
|
+
*/
|
|
6
|
+
export interface AnalysisConfig {
|
|
7
|
+
usageAssumptions?: UsageAssumptionsConfig;
|
|
8
|
+
excludedResourceTypes?: string[];
|
|
9
|
+
cacheConfig?: CacheConfig;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Metadata about the analysis
|
|
13
|
+
*/
|
|
14
|
+
export interface AnalysisMetadata {
|
|
15
|
+
templateHash: string;
|
|
16
|
+
region: string;
|
|
17
|
+
analyzedAt: Date;
|
|
18
|
+
resourceCount: number;
|
|
19
|
+
supportedResourceCount: number;
|
|
20
|
+
unsupportedResourceCount: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Cost information grouped by resource type
|
|
24
|
+
*/
|
|
25
|
+
export interface ResourceTypeCost {
|
|
26
|
+
resourceType: string;
|
|
27
|
+
count: number;
|
|
28
|
+
totalCost: number;
|
|
29
|
+
resources: ResourceCost[];
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Cost information grouped by confidence level
|
|
33
|
+
*/
|
|
34
|
+
export interface ConfidenceLevelCost {
|
|
35
|
+
confidence: 'high' | 'medium' | 'low' | 'unknown';
|
|
36
|
+
count: number;
|
|
37
|
+
totalCost: number;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Detailed cost breakdown for a template
|
|
41
|
+
*/
|
|
42
|
+
export interface CostBreakdown {
|
|
43
|
+
byResourceType: ResourceTypeCost[];
|
|
44
|
+
byConfidenceLevel: ConfidenceLevelCost[];
|
|
45
|
+
assumptions: string[];
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Enhanced resource cost with additional metadata
|
|
49
|
+
*/
|
|
50
|
+
export interface EnhancedResourceCost extends ResourceCost {
|
|
51
|
+
properties?: Record<string, any>;
|
|
52
|
+
region: string;
|
|
53
|
+
calculatedAt: Date;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Result of single template cost analysis
|
|
57
|
+
*/
|
|
58
|
+
export interface SingleTemplateCostResult {
|
|
59
|
+
totalMonthlyCost: number;
|
|
60
|
+
currency: string;
|
|
61
|
+
resourceCosts: EnhancedResourceCost[];
|
|
62
|
+
costBreakdown: CostBreakdown;
|
|
63
|
+
summary: string;
|
|
64
|
+
metadata: AnalysisMetadata;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Options for analyzing a single template
|
|
68
|
+
*/
|
|
69
|
+
export interface AnalyzeSingleTemplateOptions {
|
|
70
|
+
template: string;
|
|
71
|
+
region?: string;
|
|
72
|
+
format?: 'text' | 'json' | 'markdown';
|
|
73
|
+
config?: AnalysisConfig;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Options for generating single template reports
|
|
77
|
+
*/
|
|
78
|
+
export interface SingleTemplateReportOptions {
|
|
79
|
+
showBreakdown?: boolean;
|
|
80
|
+
showAssumptions?: boolean;
|
|
81
|
+
groupByType?: boolean;
|
|
82
|
+
sortBy?: 'cost' | 'name' | 'type';
|
|
83
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXRlbXBsYXRlLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwaS9zaW5nbGUtdGVtcGxhdGUtdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlQ29zdCB9IGZyb20gJy4uL3ByaWNpbmcvdHlwZXMnO1xuaW1wb3J0IHsgVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZywgQ2FjaGVDb25maWcgfSBmcm9tICcuLi9jb25maWcvdHlwZXMnO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3Igc2luZ2xlIHRlbXBsYXRlIGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHlzaXNDb25maWcge1xuICB1c2FnZUFzc3VtcHRpb25zPzogVXNhZ2VBc3N1bXB0aW9uc0NvbmZpZztcbiAgZXhjbHVkZWRSZXNvdXJjZVR5cGVzPzogc3RyaW5nW107XG4gIGNhY2hlQ29uZmlnPzogQ2FjaGVDb25maWc7XG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIGFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHlzaXNNZXRhZGF0YSB7XG4gIHRlbXBsYXRlSGFzaDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgYW5hbHl6ZWRBdDogRGF0ZTtcbiAgcmVzb3VyY2VDb3VudDogbnVtYmVyO1xuICBzdXBwb3J0ZWRSZXNvdXJjZUNvdW50OiBudW1iZXI7XG4gIHVuc3VwcG9ydGVkUmVzb3VyY2VDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvc3QgaW5mb3JtYXRpb24gZ3JvdXBlZCBieSByZXNvdXJjZSB0eXBlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VUeXBlQ29zdCB7XG4gIHJlc291cmNlVHlwZTogc3RyaW5nO1xuICBjb3VudDogbnVtYmVyO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbiAgcmVzb3VyY2VzOiBSZXNvdXJjZUNvc3RbXTtcbn1cblxuLyoqXG4gKiBDb3N0IGluZm9ybWF0aW9uIGdyb3VwZWQgYnkgY29uZmlkZW5jZSBsZXZlbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZGVuY2VMZXZlbENvc3Qge1xuICBjb25maWRlbmNlOiAnaGlnaCcgfCAnbWVkaXVtJyB8ICdsb3cnIHwgJ3Vua25vd24nO1xuICBjb3VudDogbnVtYmVyO1xuICB0b3RhbENvc3Q6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEZXRhaWxlZCBjb3N0IGJyZWFrZG93biBmb3IgYSB0ZW1wbGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvc3RCcmVha2Rvd24ge1xuICBieVJlc291cmNlVHlwZTogUmVzb3VyY2VUeXBlQ29zdFtdO1xuICBieUNvbmZpZGVuY2VMZXZlbDogQ29uZmlkZW5jZUxldmVsQ29zdFtdO1xuICBhc3N1bXB0aW9uczogc3RyaW5nW107XG59XG5cbi8qKlxuICogRW5oYW5jZWQgcmVzb3VyY2UgY29zdCB3aXRoIGFkZGl0aW9uYWwgbWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFJlc291cmNlQ29zdCBleHRlbmRzIFJlc291cmNlQ29zdCB7XG4gIHByb3BlcnRpZXM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICByZWdpb246IHN0cmluZztcbiAgY2FsY3VsYXRlZEF0OiBEYXRlO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzaW5nbGUgdGVtcGxhdGUgY29zdCBhbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpbmdsZVRlbXBsYXRlQ29zdFJlc3VsdCB7XG4gIHRvdGFsTW9udGhseUNvc3Q6IG51bWJlcjtcbiAgY3VycmVuY3k6IHN0cmluZztcbiAgcmVzb3VyY2VDb3N0czogRW5oYW5jZWRSZXNvdXJjZUNvc3RbXTtcbiAgY29zdEJyZWFrZG93bjogQ29zdEJyZWFrZG93bjtcbiAgc3VtbWFyeTogc3RyaW5nO1xuICBtZXRhZGF0YTogQW5hbHlzaXNNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhbmFseXppbmcgYSBzaW5nbGUgdGVtcGxhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXplU2luZ2xlVGVtcGxhdGVPcHRpb25zIHtcbiAgdGVtcGxhdGU6IHN0cmluZztcbiAgcmVnaW9uPzogc3RyaW5nO1xuICBmb3JtYXQ/OiAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nO1xuICBjb25maWc/OiBBbmFseXNpc0NvbmZpZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBnZW5lcmF0aW5nIHNpbmdsZSB0ZW1wbGF0ZSByZXBvcnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlVGVtcGxhdGVSZXBvcnRPcHRpb25zIHtcbiAgc2hvd0JyZWFrZG93bj86IGJvb2xlYW47XG4gIHNob3dBc3N1bXB0aW9ucz86IGJvb2xlYW47XG4gIGdyb3VwQnlUeXBlPzogYm9vbGVhbjtcbiAgc29ydEJ5PzogJ2Nvc3QnIHwgJ25hbWUnIHwgJ3R5cGUnO1xufVxuIl19
|
package/dist/cli/index.js
CHANGED
|
@@ -45,6 +45,48 @@ program
|
|
|
45
45
|
.name('cdk-cost-analyzer')
|
|
46
46
|
.description('Analyze AWS CDK infrastructure changes and provide cost impact summaries')
|
|
47
47
|
.version('1.0.0');
|
|
48
|
+
// New analyze command for single template analysis
|
|
49
|
+
program
|
|
50
|
+
.command('analyze <template>')
|
|
51
|
+
.description('Analyze a single CloudFormation template for estimated costs')
|
|
52
|
+
.option('--region <region>', 'AWS region for pricing', 'eu-central-1')
|
|
53
|
+
.option('--format <format>', 'Output format: text|json|markdown', 'text')
|
|
54
|
+
.option('--config <path>', 'Path to configuration file')
|
|
55
|
+
.option('--debug', 'Enable verbose debug logging for pricing API calls')
|
|
56
|
+
.action(async (templatePath, options) => {
|
|
57
|
+
try {
|
|
58
|
+
// Enable debug logging if flag is set
|
|
59
|
+
if (options.debug) {
|
|
60
|
+
Logger_1.Logger.setDebugEnabled(true);
|
|
61
|
+
Logger_1.Logger.debug('Debug logging enabled');
|
|
62
|
+
}
|
|
63
|
+
// Check if template file exists
|
|
64
|
+
if (!fs.existsSync(templatePath)) {
|
|
65
|
+
console.error(`Error: Template file not found: ${templatePath}`);
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
// Read the template
|
|
69
|
+
const template = fs.readFileSync(templatePath, 'utf-8');
|
|
70
|
+
// Analyze the template
|
|
71
|
+
const result = await (0, api_1.analyzeSingleTemplate)({
|
|
72
|
+
template,
|
|
73
|
+
region: options.region,
|
|
74
|
+
format: options.format,
|
|
75
|
+
});
|
|
76
|
+
// Output the results (summary already contains formatted output)
|
|
77
|
+
console.log(result.summary);
|
|
78
|
+
process.exit(0);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error instanceof Error) {
|
|
82
|
+
console.error(`Error: ${error.message}`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
console.error(`Error: ${String(error)}`);
|
|
86
|
+
}
|
|
87
|
+
process.exit(1);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
48
90
|
// Original command for direct template comparison
|
|
49
91
|
program
|
|
50
92
|
.command('compare')
|
|
@@ -224,58 +266,5 @@ program
|
|
|
224
266
|
process.exit(1);
|
|
225
267
|
}
|
|
226
268
|
});
|
|
227
|
-
// Default to compare command for backward compatibility
|
|
228
|
-
program
|
|
229
|
-
.argument('[base]', 'Path to base CloudFormation template')
|
|
230
|
-
.argument('[target]', 'Path to target CloudFormation template')
|
|
231
|
-
.option('--region <region>', 'AWS region', 'eu-central-1')
|
|
232
|
-
.option('--format <format>', 'Output format: text|json|markdown', 'text')
|
|
233
|
-
.option('--config <path>', 'Path to configuration file')
|
|
234
|
-
.option('--debug', 'Enable verbose debug logging for pricing API calls')
|
|
235
|
-
.action(async (basePath, targetPath, options) => {
|
|
236
|
-
if (!basePath || !targetPath) {
|
|
237
|
-
program.help();
|
|
238
|
-
return;
|
|
239
|
-
}
|
|
240
|
-
try {
|
|
241
|
-
// Enable debug logging if flag is set
|
|
242
|
-
if (options?.debug) {
|
|
243
|
-
Logger_1.Logger.setDebugEnabled(true);
|
|
244
|
-
Logger_1.Logger.debug('Debug logging enabled');
|
|
245
|
-
}
|
|
246
|
-
if (!fs.existsSync(basePath)) {
|
|
247
|
-
console.error(`Error: Base template file not found: ${basePath}`);
|
|
248
|
-
process.exit(1);
|
|
249
|
-
}
|
|
250
|
-
if (!fs.existsSync(targetPath)) {
|
|
251
|
-
console.error(`Error: Target template file not found: ${targetPath}`);
|
|
252
|
-
process.exit(1);
|
|
253
|
-
}
|
|
254
|
-
const baseTemplate = fs.readFileSync(basePath, 'utf-8');
|
|
255
|
-
const targetTemplate = fs.readFileSync(targetPath, 'utf-8');
|
|
256
|
-
const result = await (0, api_1.analyzeCosts)({
|
|
257
|
-
baseTemplate,
|
|
258
|
-
targetTemplate,
|
|
259
|
-
region: options?.region || 'eu-central-1',
|
|
260
|
-
format: options?.format || 'text',
|
|
261
|
-
});
|
|
262
|
-
if (options?.format === 'json') {
|
|
263
|
-
console.log(JSON.stringify(result, null, 2));
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
console.log(result.summary);
|
|
267
|
-
}
|
|
268
|
-
process.exit(0);
|
|
269
|
-
}
|
|
270
|
-
catch (error) {
|
|
271
|
-
if (error instanceof Error) {
|
|
272
|
-
console.error(`Error: ${error.message}`);
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
console.error(`Error: ${String(error)}`);
|
|
276
|
-
}
|
|
277
|
-
process.exit(1);
|
|
278
|
-
}
|
|
279
|
-
});
|
|
280
269
|
program.parse();
|
|
281
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6Qix5Q0FBb0M7QUFDcEMsZ0NBQXNDO0FBQ3RDLHlFQUFzRTtBQUN0RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsbUJBQW1CLENBQUM7S0FDekIsV0FBVyxDQUFDLDBFQUEwRSxDQUFDO0tBQ3ZGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVwQixrREFBa0Q7QUFDbEQsT0FBTztLQUNKLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDbEIsV0FBVyxDQUFDLHNDQUFzQyxDQUFDO0tBQ25ELFFBQVEsQ0FBQyxRQUFRLEVBQUUsc0NBQXNDLENBQUM7S0FDMUQsUUFBUSxDQUFDLFVBQVUsRUFBRSx3Q0FBd0MsQ0FBQztLQUM5RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQztLQUN6RCxNQUFNLENBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsQ0FBQztLQUN2RCxNQUFNLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO0tBQ3ZFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQixFQUFFLE9BQTZFLEVBQUUsRUFBRTtJQUNwSSxJQUFJLENBQUM7UUFDSCxzQ0FBc0M7UUFDdEMsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDbEIsZUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixlQUFNLENBQUMsS0FBSyxDQUFDLHVCQUF1QixDQUFDLENBQUM7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QUFNLEdBQUcsTUFBTSxJQUFBLGtCQUFZLEVBQUM7WUFDaEMsWUFBWTtZQUNaLGNBQWM7WUFDZCxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sSUFBSSxjQUFjO1lBQ3pDLE1BQU0sRUFBRyxPQUFPLEVBQUUsTUFBdUMsSUFBSSxNQUFNO1NBQ3BFLENBQUMsQ0FBQztRQUVILElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsS0FBSyxDQUFDLFVBQVUsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQixDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFTCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgYW5hbHl6ZUNvc3RzIH0gZnJvbSAnLi4vYXBpJztcbmltcG9ydCB7IEdpdExhYkludGVncmF0aW9uIH0gZnJvbSAnLi4vaW50ZWdyYXRpb25zL0dpdExhYkludGVncmF0aW9uJztcbmltcG9ydCB7IFBpcGVsaW5lT3JjaGVzdHJhdG9yIH0gZnJvbSAnLi4vcGlwZWxpbmUvUGlwZWxpbmVPcmNoZXN0cmF0b3InO1xuaW1wb3J0IHsgTG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvTG9nZ2VyJztcblxuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kKCk7XG5cbnByb2dyYW1cbiAgLm5hbWUoJ2Nkay1jb3N0LWFuYWx5emVyJylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIEFXUyBDREsgaW5mcmFzdHJ1Y3R1cmUgY2hhbmdlcyBhbmQgcHJvdmlkZSBjb3N0IGltcGFjdCBzdW1tYXJpZXMnKVxuICAudmVyc2lvbignMS4wLjAnKTtcblxuLy8gT3JpZ2luYWwgY29tbWFuZCBmb3IgZGlyZWN0IHRlbXBsYXRlIGNvbXBhcmlzb25cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NvbXBhcmUnKVxuICAuZGVzY3JpcHRpb24oJ0NvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcycpXG4gIC5hcmd1bWVudCgnPGJhc2U+JywgJ1BhdGggdG8gYmFzZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5hcmd1bWVudCgnPHRhcmdldD4nLCAnUGF0aCB0byB0YXJnZXQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKGJhc2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYXNlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEJhc2UgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUYXJnZXQgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlVGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoYmFzZVBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgdGFyZ2V0VGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVDb3N0cyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBOZXcgcGlwZWxpbmUgY29tbWFuZCBmb3IgQ0kvQ0QgaW50ZWdyYXRpb24gd2l0aCBzeW50aGVzaXNcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3BpcGVsaW5lJylcbiAgLmRlc2NyaXB0aW9uKCdSdW4gY29zdCBhbmFseXNpcyBpbiBDSS9DRCBwaXBlbGluZSB3aXRoIGF1dG9tYXRpYyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWJhc2UgPHBhdGg+JywgJ1BhdGggdG8gYmFzZSB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXRhcmdldCA8cGF0aD4nLCAnUGF0aCB0byB0YXJnZXQgdGVtcGxhdGUgKGlmIG5vdCB1c2luZyBzeW50aGVzaXMpJylcbiAgLm9wdGlvbignLS1zeW50aCcsICdFbmFibGUgYXV0b21hdGljIENESyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWNkay1hcHAtcGF0aCA8cGF0aD4nLCAnUGF0aCB0byBDREsgYXBwbGljYXRpb24gZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50IDxlbnY+JywgJ0Vudmlyb25tZW50IG5hbWUgZm9yIHRocmVzaG9sZCBzZWxlY3Rpb24nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tcG9zdC10by1naXRsYWInLCAnUG9zdCByZXN1bHRzIHRvIEdpdExhYiBtZXJnZSByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICBzeW50aD86IGJvb2xlYW47XG4gICAgY2RrQXBwUGF0aD86IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgcG9zdFRvR2l0bGFiPzogYm9vbGVhbjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIEFXUyBjcmVkZW50aWFsc1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5BV1NfQUNDRVNTX0tFWV9JRCAmJiAhcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTX0FDQ0VTU19LRVlfSUQgYW5kIEFXU19TRUNSRVRfQUNDRVNTX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19QUk9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9yIEdpdExhYiBDSSwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiBDSS9DRCB2YXJpYWJsZXM6Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgU2V0dGluZ3MgPiBDSS9DRCA+IFZhcmlhYmxlcycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIEFkZDogQVdTX0FDQ0VTU19LRVlfSUQsIEFXU19TRUNSRVRfQUNDRVNTX0tFWSwgQVdTX1JFR0lPTicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IG5ldyBQaXBlbGluZU9yY2hlc3RyYXRvcigpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmNoZXN0cmF0b3IucnVuUGlwZWxpbmVBbmFseXNpcyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZTogb3B0aW9ucy5iYXNlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZTogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgIHN5bnRoZXNpemU6IG9wdGlvbnMuc3ludGgsXG4gICAgICAgIGNka0FwcFBhdGg6IG9wdGlvbnMuY2RrQXBwUGF0aCxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgY29uZmlnUGF0aDogb3B0aW9ucy5jb25maWcsXG4gICAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpc3BsYXkgcmVzdWx0c1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuY29zdEFuYWx5c2lzLnN1bW1hcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSB0aHJlc2hvbGQgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsICE9PSAnbm9uZScpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUkVTSE9MRCBTVEFUVVMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgICAgIHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmZvckVhY2goKHJlYywgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7cmVjfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSBjb25maWcgc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCB8fCByZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDT05GSUdVUkFUSU9OJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC5jb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaHJlc2hvbGRzOiB3YXJuaW5nPSQke3Jlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMud2FybmluZyB8fCAnbm9uZSd9LCBlcnJvcj0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVycm9yIHx8ICdub25lJ31gKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFbnZpcm9ubWVudDogJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeGNsdWRlZCByZXNvdXJjZXM6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdExhYiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGxhYikge1xuICAgICAgICBjb25zdCBnaXRsYWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTiB8fCBwcm9jZXNzLmVudi5DSV9KT0JfVE9LRU47XG4gICAgICAgIGNvbnN0IHByb2plY3RJZCA9IHByb2Nlc3MuZW52LkNJX1BST0pFQ1RfSUQ7XG4gICAgICAgIGNvbnN0IG1lcmdlUmVxdWVzdElpZCA9IHByb2Nlc3MuZW52LkNJX01FUkdFX1JFUVVFU1RfSUlEO1xuICAgICAgICBjb25zdCBnaXRsYWJVcmwgPSBwcm9jZXNzLmVudi5DSV9TRVJWRVJfVVJMO1xuXG4gICAgICAgIGlmICghZ2l0bGFiVG9rZW4gfHwgIXByb2plY3RJZCB8fCAhbWVyZ2VSZXF1ZXN0SWlkIHx8ICFnaXRsYWJVcmwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBHaXRMYWIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBmb3VuZC4gU2tpcHBpbmcgR2l0TGFiIHBvc3QuJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVxdWlyZWQ6IENJX0pPQl9UT0tFTiwgQ0lfUFJPSkVDVF9JRCwgQ0lfTUVSR0VfUkVRVUVTVF9JSUQsIENJX1NFUlZFUl9VUkwnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0bGFiID0gbmV3IEdpdExhYkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgdG9rZW46IGdpdGxhYlRva2VuLFxuICAgICAgICAgICAgICBhcGlVcmw6IGdpdGxhYlVybCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZ2l0bGFiLnBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG1lcmdlUmVxdWVzdElpZCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRMYWIgbWVyZ2UgcmVxdWVzdCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRMYWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiB0aHJlc2hvbGRcbiAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsID09PSAnZXJyb3InICYmICFyZXN1bHQudGhyZXNob2xkU3RhdHVzLnBhc3NlZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQaXBlbGluZSBmYWlsZWQ6IENvc3QgdGhyZXNob2xkIGV4Y2VlZGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBEZWZhdWx0IHRvIGNvbXBhcmUgY29tbWFuZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxucHJvZ3JhbVxuICAuYXJndW1lbnQoJ1tiYXNlXScsICdQYXRoIHRvIGJhc2UgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAuYXJndW1lbnQoJ1t0YXJnZXRdJywgJ1BhdGggdG8gdGFyZ2V0IENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlJylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZScpXG4gIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIHZlcmJvc2UgZGVidWcgbG9nZ2luZyBmb3IgcHJpY2luZyBBUEkgY2FsbHMnKVxuICAuYWN0aW9uKGFzeW5jIChiYXNlUGF0aD86IHN0cmluZywgdGFyZ2V0UGF0aD86IHN0cmluZywgb3B0aW9ucz86IHsgcmVnaW9uOiBzdHJpbmc7IGZvcm1hdDogc3RyaW5nOyBjb25maWc/OiBzdHJpbmc7IGRlYnVnPzogYm9vbGVhbiB9KSA9PiB7XG4gICAgaWYgKCFiYXNlUGF0aCB8fCAhdGFyZ2V0UGF0aCkge1xuICAgICAgcHJvZ3JhbS5oZWxwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIC8vIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nIGlmIGZsYWcgaXMgc2V0XG4gICAgICBpZiAob3B0aW9ucz8uZGVidWcpIHtcbiAgICAgICAgTG9nZ2VyLnNldERlYnVnRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdEZWJ1ZyBsb2dnaW5nIGVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKGJhc2VQYXRoKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogQmFzZSB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHtiYXNlUGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWZzLmV4aXN0c1N5bmModGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IFRhcmdldCB0ZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHt0YXJnZXRQYXRofWApO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJhc2VUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyhiYXNlUGF0aCwgJ3V0Zi04Jyk7XG4gICAgICBjb25zdCB0YXJnZXRUZW1wbGF0ZSA9IGZzLnJlYWRGaWxlU3luYyh0YXJnZXRQYXRoLCAndXRmLTgnKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYW5hbHl6ZUNvc3RzKHtcbiAgICAgICAgYmFzZVRlbXBsYXRlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zPy5yZWdpb24gfHwgJ2V1LWNlbnRyYWwtMScsXG4gICAgICAgIGZvcm1hdDogKG9wdGlvbnM/LmZvcm1hdCBhcyAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nKSB8fCAndGV4dCcsXG4gICAgICB9KTtcblxuICAgICAgaWYgKG9wdGlvbnM/LmZvcm1hdCA9PT0gJ2pzb24nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnN1bW1hcnkpO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgfVxuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cbiAgfSk7XG5cbnByb2dyYW0ucGFyc2UoKTtcbiJdfQ==
|
|
270
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLHVDQUF5QjtBQUN6Qix5Q0FBb0M7QUFDcEMsZ0NBQTZEO0FBQzdELHlFQUFzRTtBQUN0RSwyRUFBd0U7QUFDeEUsNENBQXlDO0FBRXpDLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQU8sRUFBRSxDQUFDO0FBRTlCLE9BQU87S0FDSixJQUFJLENBQUMsbUJBQW1CLENBQUM7S0FDekIsV0FBVyxDQUFDLDBFQUEwRSxDQUFDO0tBQ3ZGLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVwQixtREFBbUQ7QUFDbkQsT0FBTztLQUNKLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQztLQUM3QixXQUFXLENBQUMsOERBQThELENBQUM7S0FDM0UsTUFBTSxDQUFDLG1CQUFtQixFQUFFLHdCQUF3QixFQUFFLGNBQWMsQ0FBQztLQUNyRSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxDQUFDO0tBQ3hFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSw0QkFBNEIsQ0FBQztLQUN2RCxNQUFNLENBQUMsU0FBUyxFQUFFLG9EQUFvRCxDQUFDO0tBQ3ZFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBb0IsRUFBRSxPQUE2RSxFQUFFLEVBQUU7SUFDcEgsSUFBSSxDQUFDO1FBQ0gsc0NBQXNDO1FBQ3RDLElBQUksT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2xCLGVBQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0IsZUFBTSxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFFRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUNq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QUFLLENBQUMsVUFBVSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsVUFBVSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLENBQUM7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVMLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIiMhL3Vzci9iaW4vZW52IG5vZGVcblxuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgQ29tbWFuZCB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBhbmFseXplQ29zdHMsIGFuYWx5emVTaW5nbGVUZW1wbGF0ZSB9IGZyb20gJy4uL2FwaSc7XG5pbXBvcnQgeyBHaXRMYWJJbnRlZ3JhdGlvbiB9IGZyb20gJy4uL2ludGVncmF0aW9ucy9HaXRMYWJJbnRlZ3JhdGlvbic7XG5pbXBvcnQgeyBQaXBlbGluZU9yY2hlc3RyYXRvciB9IGZyb20gJy4uL3BpcGVsaW5lL1BpcGVsaW5lT3JjaGVzdHJhdG9yJztcbmltcG9ydCB7IExvZ2dlciB9IGZyb20gJy4uL3V0aWxzL0xvZ2dlcic7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG4gIC5uYW1lKCdjZGstY29zdC1hbmFseXplcicpXG4gIC5kZXNjcmlwdGlvbignQW5hbHl6ZSBBV1MgQ0RLIGluZnJhc3RydWN0dXJlIGNoYW5nZXMgYW5kIHByb3ZpZGUgY29zdCBpbXBhY3Qgc3VtbWFyaWVzJylcbiAgLnZlcnNpb24oJzEuMC4wJyk7XG5cbi8vIE5ldyBhbmFseXplIGNvbW1hbmQgZm9yIHNpbmdsZSB0ZW1wbGF0ZSBhbmFseXNpc1xucHJvZ3JhbVxuICAuY29tbWFuZCgnYW5hbHl6ZSA8dGVtcGxhdGU+JylcbiAgLmRlc2NyaXB0aW9uKCdBbmFseXplIGEgc2luZ2xlIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlIGZvciBlc3RpbWF0ZWQgY29zdHMnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uIGZvciBwcmljaW5nJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKHRlbXBsYXRlUGF0aDogc3RyaW5nLCBvcHRpb25zOiB7IHJlZ2lvbjogc3RyaW5nOyBmb3JtYXQ6IHN0cmluZzsgY29uZmlnPzogc3RyaW5nOyBkZWJ1Zz86IGJvb2xlYW4gfSkgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBFbmFibGUgZGVidWcgbG9nZ2luZyBpZiBmbGFnIGlzIHNldFxuICAgICAgaWYgKG9wdGlvbnMuZGVidWcpIHtcbiAgICAgICAgTG9nZ2VyLnNldERlYnVnRW5hYmxlZCh0cnVlKTtcbiAgICAgICAgTG9nZ2VyLmRlYnVnKCdEZWJ1ZyBsb2dnaW5nIGVuYWJsZWQnKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGVtcGxhdGUgZmlsZSBleGlzdHNcbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyh0ZW1wbGF0ZVBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUZW1wbGF0ZSBmaWxlIG5vdCBmb3VuZDogJHt0ZW1wbGF0ZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVhZCB0aGUgdGVtcGxhdGVcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHRlbXBsYXRlUGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIC8vIEFuYWx5emUgdGhlIHRlbXBsYXRlXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhbmFseXplU2luZ2xlVGVtcGxhdGUoe1xuICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgZm9ybWF0OiBvcHRpb25zLmZvcm1hdCBhcyAndGV4dCcgfCAnanNvbicgfCAnbWFya2Rvd24nLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIE91dHB1dCB0aGUgcmVzdWx0cyAoc3VtbWFyeSBhbHJlYWR5IGNvbnRhaW5zIGZvcm1hdHRlZCBvdXRwdXQpXG4gICAgICBjb25zb2xlLmxvZyhyZXN1bHQuc3VtbWFyeSk7XG5cbiAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiAke1N0cmluZyhlcnJvcil9YCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuICB9KTtcblxuLy8gT3JpZ2luYWwgY29tbWFuZCBmb3IgZGlyZWN0IHRlbXBsYXRlIGNvbXBhcmlzb25cbnByb2dyYW1cbiAgLmNvbW1hbmQoJ2NvbXBhcmUnKVxuICAuZGVzY3JpcHRpb24oJ0NvbXBhcmUgdHdvIENsb3VkRm9ybWF0aW9uIHRlbXBsYXRlcycpXG4gIC5hcmd1bWVudCgnPGJhc2U+JywgJ1BhdGggdG8gYmFzZSBDbG91ZEZvcm1hdGlvbiB0ZW1wbGF0ZScpXG4gIC5hcmd1bWVudCgnPHRhcmdldD4nLCAnUGF0aCB0byB0YXJnZXQgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGUnKVxuICAub3B0aW9uKCctLXJlZ2lvbiA8cmVnaW9uPicsICdBV1MgcmVnaW9uJywgJ2V1LWNlbnRyYWwtMScpXG4gIC5vcHRpb24oJy0tZm9ybWF0IDxmb3JtYXQ+JywgJ091dHB1dCBmb3JtYXQ6IHRleHR8anNvbnxtYXJrZG93bicsICd0ZXh0JylcbiAgLm9wdGlvbignLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gY29uZmlndXJhdGlvbiBmaWxlJylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKGJhc2VQYXRoOiBzdHJpbmcsIHRhcmdldFBhdGg6IHN0cmluZywgb3B0aW9uczogeyByZWdpb246IHN0cmluZzsgZm9ybWF0OiBzdHJpbmc7IGNvbmZpZz86IHN0cmluZzsgZGVidWc/OiBib29sZWFuIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZnMuZXhpc3RzU3luYyhiYXNlUGF0aCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6IEJhc2UgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7YmFzZVBhdGh9YCk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFmcy5leGlzdHNTeW5jKHRhcmdldFBhdGgpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yOiBUYXJnZXQgdGVtcGxhdGUgZmlsZSBub3QgZm91bmQ6ICR7dGFyZ2V0UGF0aH1gKTtcbiAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBiYXNlVGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoYmFzZVBhdGgsICd1dGYtOCcpO1xuICAgICAgY29uc3QgdGFyZ2V0VGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmModGFyZ2V0UGF0aCwgJ3V0Zi04Jyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFuYWx5emVDb3N0cyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZSxcbiAgICAgICAgdGFyZ2V0VGVtcGxhdGUsXG4gICAgICAgIHJlZ2lvbjogb3B0aW9ucy5yZWdpb24sXG4gICAgICAgIGZvcm1hdDogb3B0aW9ucy5mb3JtYXQgYXMgJ3RleHQnIHwgJ2pzb24nIHwgJ21hcmtkb3duJyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgPT09ICdqc29uJykge1xuICAgICAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXN1bHQsIG51bGwsIDIpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3VsdC5zdW1tYXJ5KTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG4vLyBOZXcgcGlwZWxpbmUgY29tbWFuZCBmb3IgQ0kvQ0QgaW50ZWdyYXRpb24gd2l0aCBzeW50aGVzaXNcbnByb2dyYW1cbiAgLmNvbW1hbmQoJ3BpcGVsaW5lJylcbiAgLmRlc2NyaXB0aW9uKCdSdW4gY29zdCBhbmFseXNpcyBpbiBDSS9DRCBwaXBlbGluZSB3aXRoIGF1dG9tYXRpYyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWJhc2UgPHBhdGg+JywgJ1BhdGggdG8gYmFzZSB0ZW1wbGF0ZSAoaWYgbm90IHVzaW5nIHN5bnRoZXNpcyknKVxuICAub3B0aW9uKCctLXRhcmdldCA8cGF0aD4nLCAnUGF0aCB0byB0YXJnZXQgdGVtcGxhdGUgKGlmIG5vdCB1c2luZyBzeW50aGVzaXMpJylcbiAgLm9wdGlvbignLS1zeW50aCcsICdFbmFibGUgYXV0b21hdGljIENESyBzeW50aGVzaXMnKVxuICAub3B0aW9uKCctLWNkay1hcHAtcGF0aCA8cGF0aD4nLCAnUGF0aCB0byBDREsgYXBwbGljYXRpb24gZGlyZWN0b3J5JylcbiAgLm9wdGlvbignLS1yZWdpb24gPHJlZ2lvbj4nLCAnQVdTIHJlZ2lvbicsICdldS1jZW50cmFsLTEnKVxuICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byBjb25maWd1cmF0aW9uIGZpbGUnKVxuICAub3B0aW9uKCctLWVudmlyb25tZW50IDxlbnY+JywgJ0Vudmlyb25tZW50IG5hbWUgZm9yIHRocmVzaG9sZCBzZWxlY3Rpb24nKVxuICAub3B0aW9uKCctLWZvcm1hdCA8Zm9ybWF0PicsICdPdXRwdXQgZm9ybWF0OiB0ZXh0fGpzb258bWFya2Rvd24nLCAndGV4dCcpXG4gIC5vcHRpb24oJy0tcG9zdC10by1naXRsYWInLCAnUG9zdCByZXN1bHRzIHRvIEdpdExhYiBtZXJnZSByZXF1ZXN0JylcbiAgLm9wdGlvbignLS1kZWJ1ZycsICdFbmFibGUgdmVyYm9zZSBkZWJ1ZyBsb2dnaW5nIGZvciBwcmljaW5nIEFQSSBjYWxscycpXG4gIC5hY3Rpb24oYXN5bmMgKG9wdGlvbnM6IHtcbiAgICBiYXNlPzogc3RyaW5nO1xuICAgIHRhcmdldD86IHN0cmluZztcbiAgICBzeW50aD86IGJvb2xlYW47XG4gICAgY2RrQXBwUGF0aD86IHN0cmluZztcbiAgICByZWdpb246IHN0cmluZztcbiAgICBjb25maWc/OiBzdHJpbmc7XG4gICAgZW52aXJvbm1lbnQ/OiBzdHJpbmc7XG4gICAgZm9ybWF0OiBzdHJpbmc7XG4gICAgcG9zdFRvR2l0bGFiPzogYm9vbGVhbjtcbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gIH0pID0+IHtcbiAgICB0cnkge1xuICAgICAgLy8gRW5hYmxlIGRlYnVnIGxvZ2dpbmcgaWYgZmxhZyBpcyBzZXRcbiAgICAgIGlmIChvcHRpb25zLmRlYnVnKSB7XG4gICAgICAgIExvZ2dlci5zZXREZWJ1Z0VuYWJsZWQodHJ1ZSk7XG4gICAgICAgIExvZ2dlci5kZWJ1ZygnRGVidWcgbG9nZ2luZyBlbmFibGVkJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIEFXUyBjcmVkZW50aWFsc1xuICAgICAgaWYgKCFwcm9jZXNzLmVudi5BV1NfQUNDRVNTX0tFWV9JRCAmJiAhcHJvY2Vzcy5lbnYuQVdTX1BST0ZJTEUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3I6IEFXUyBjcmVkZW50aWFscyBub3QgY29uZmlndXJlZCcpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignUGxlYXNlIHNldCBBV1MgY3JlZGVudGlhbHMgdXNpbmcgb25lIG9mOicpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIC0gQVdTX0FDQ0VTU19LRVlfSUQgYW5kIEFXU19TRUNSRVRfQUNDRVNTX0tFWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignICAtIEFXU19QUk9GSUxFIGVudmlyb25tZW50IHZhcmlhYmxlJyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgLSBBV1MgY3JlZGVudGlhbHMgZmlsZSAofi8uYXdzL2NyZWRlbnRpYWxzKScpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcnKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignRm9yIEdpdExhYiBDSSwgY29uZmlndXJlIEFXUyBjcmVkZW50aWFscyBpbiBDSS9DRCB2YXJpYWJsZXM6Jyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyAgU2V0dGluZ3MgPiBDSS9DRCA+IFZhcmlhYmxlcycpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCcgIEFkZDogQVdTX0FDQ0VTU19LRVlfSUQsIEFXU19TRUNSRVRfQUNDRVNTX0tFWSwgQVdTX1JFR0lPTicpO1xuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9yY2hlc3RyYXRvciA9IG5ldyBQaXBlbGluZU9yY2hlc3RyYXRvcigpO1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBvcmNoZXN0cmF0b3IucnVuUGlwZWxpbmVBbmFseXNpcyh7XG4gICAgICAgIGJhc2VUZW1wbGF0ZTogb3B0aW9ucy5iYXNlLFxuICAgICAgICB0YXJnZXRUZW1wbGF0ZTogb3B0aW9ucy50YXJnZXQsXG4gICAgICAgIHN5bnRoZXNpemU6IG9wdGlvbnMuc3ludGgsXG4gICAgICAgIGNka0FwcFBhdGg6IG9wdGlvbnMuY2RrQXBwUGF0aCxcbiAgICAgICAgcmVnaW9uOiBvcHRpb25zLnJlZ2lvbixcbiAgICAgICAgY29uZmlnUGF0aDogb3B0aW9ucy5jb25maWcsXG4gICAgICAgIGVudmlyb25tZW50OiBvcHRpb25zLmVudmlyb25tZW50LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIERpc3BsYXkgcmVzdWx0c1xuICAgICAgaWYgKG9wdGlvbnMuZm9ybWF0ID09PSAnanNvbicpIHtcbiAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQuY29zdEFuYWx5c2lzLnN1bW1hcnkpO1xuICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgLy8gRGlzcGxheSB0aHJlc2hvbGQgc3RhdHVzXG4gICAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsICE9PSAnbm9uZScpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUkVTSE9MRCBTVEFUVVMnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnPScucmVwZWF0KDgwKSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5tZXNzYWdlKTtcbiAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG5cbiAgICAgICAgICBpZiAocmVzdWx0LnRocmVzaG9sZFN0YXR1cy5yZWNvbW1lbmRhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY29tbWVuZGF0aW9uczonKTtcbiAgICAgICAgICAgIHJlc3VsdC50aHJlc2hvbGRTdGF0dXMucmVjb21tZW5kYXRpb25zLmZvckVhY2goKHJlYywgaSkgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgJHtpICsgMX0uICR7cmVjfWApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGlzcGxheSBjb25maWcgc3VtbWFyeVxuICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aCB8fCByZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdDT05GSUdVUkFUSU9OJyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJz0nLnJlcGVhdCg4MCkpO1xuICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC5jb25maWdQYXRoKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgQ29uZmlnIGZpbGU6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuY29uZmlnUGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBUaHJlc2hvbGRzOiB3YXJuaW5nPSQke3Jlc3VsdC5jb25maWdVc2VkLnRocmVzaG9sZHMud2FybmluZyB8fCAnbm9uZSd9LCBlcnJvcj0kJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVycm9yIHx8ICdub25lJ31gKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFbnZpcm9ubWVudDogJHtyZXN1bHQuY29uZmlnVXNlZC50aHJlc2hvbGRzLmVudmlyb25tZW50fWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBFeGNsdWRlZCByZXNvdXJjZXM6ICR7cmVzdWx0LmNvbmZpZ1VzZWQuZXhjbHVkZWRSZXNvdXJjZVR5cGVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQb3N0IHRvIEdpdExhYiBpZiByZXF1ZXN0ZWRcbiAgICAgIGlmIChvcHRpb25zLnBvc3RUb0dpdGxhYikge1xuICAgICAgICBjb25zdCBnaXRsYWJUb2tlbiA9IHByb2Nlc3MuZW52LkdJVExBQl9UT0tFTiB8fCBwcm9jZXNzLmVudi5DSV9KT0JfVE9LRU47XG4gICAgICAgIGNvbnN0IHByb2plY3RJZCA9IHByb2Nlc3MuZW52LkNJX1BST0pFQ1RfSUQ7XG4gICAgICAgIGNvbnN0IG1lcmdlUmVxdWVzdElpZCA9IHByb2Nlc3MuZW52LkNJX01FUkdFX1JFUVVFU1RfSUlEO1xuICAgICAgICBjb25zdCBnaXRsYWJVcmwgPSBwcm9jZXNzLmVudi5DSV9TRVJWRVJfVVJMO1xuXG4gICAgICAgIGlmICghZ2l0bGFiVG9rZW4gfHwgIXByb2plY3RJZCB8fCAhbWVyZ2VSZXF1ZXN0SWlkIHx8ICFnaXRsYWJVcmwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXYXJuaW5nOiBHaXRMYWIgZW52aXJvbm1lbnQgdmFyaWFibGVzIG5vdCBmb3VuZC4gU2tpcHBpbmcgR2l0TGFiIHBvc3QuJyk7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignUmVxdWlyZWQ6IENJX0pPQl9UT0tFTiwgQ0lfUFJPSkVDVF9JRCwgQ0lfTUVSR0VfUkVRVUVTVF9JSUQsIENJX1NFUlZFUl9VUkwnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZ2l0bGFiID0gbmV3IEdpdExhYkludGVncmF0aW9uKHtcbiAgICAgICAgICAgICAgdG9rZW46IGdpdGxhYlRva2VuLFxuICAgICAgICAgICAgICBhcGlVcmw6IGdpdGxhYlVybCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXdhaXQgZ2l0bGFiLnBvc3RNZXJnZVJlcXVlc3RDb21tZW50KFxuICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgIG1lcmdlUmVxdWVzdElpZCxcbiAgICAgICAgICAgICAgcmVzdWx0LmNvc3RBbmFseXNpcy5zdW1tYXJ5LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXN1bHRzIHBvc3RlZCB0byBHaXRMYWIgbWVyZ2UgcmVxdWVzdCcpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBXYXJuaW5nOiBGYWlsZWQgdG8gcG9zdCB0byBHaXRMYWI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeGl0IHdpdGggYXBwcm9wcmlhdGUgY29kZSBiYXNlZCBvbiB0aHJlc2hvbGRcbiAgICAgIGlmIChyZXN1bHQudGhyZXNob2xkU3RhdHVzLmxldmVsID09PSAnZXJyb3InICYmICFyZXN1bHQudGhyZXNob2xkU3RhdHVzLnBhc3NlZCkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdQaXBlbGluZSBmYWlsZWQ6IENvc3QgdGhyZXNob2xkIGV4Y2VlZGVkJyk7XG4gICAgICAgIHByb2Nlc3MuZXhpdCgyKTtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3I6ICR7U3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIH1cbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG4gIH0pO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXX0=
|
|
@@ -6,6 +6,8 @@ export declare class LambdaCalculator implements ResourceCostCalculator {
|
|
|
6
6
|
private readonly DEFAULT_INVOCATIONS;
|
|
7
7
|
private readonly DEFAULT_DURATION_MS;
|
|
8
8
|
private readonly DEFAULT_MEMORY_MB;
|
|
9
|
+
private readonly FALLBACK_REQUEST_PRICE;
|
|
10
|
+
private readonly FALLBACK_COMPUTE_PRICE;
|
|
9
11
|
constructor(customInvocationsPerMonth?: number | undefined, customAverageDurationMs?: number | undefined);
|
|
10
12
|
supports(resourceType: string): boolean;
|
|
11
13
|
calculateCost(resource: ResourceWithId, region: string, pricingClient: PricingClient): Promise<MonthlyCost>;
|
|
@@ -8,6 +8,10 @@ class LambdaCalculator {
|
|
|
8
8
|
DEFAULT_INVOCATIONS = 1000000;
|
|
9
9
|
DEFAULT_DURATION_MS = 1000;
|
|
10
10
|
DEFAULT_MEMORY_MB = 128;
|
|
11
|
+
// Fallback pricing rates (AWS Lambda us-east-1 pricing as of 2024)
|
|
12
|
+
// Used when API pricing is unavailable but user provided usage assumptions
|
|
13
|
+
FALLBACK_REQUEST_PRICE = 0.20; // Per 1M requests
|
|
14
|
+
FALLBACK_COMPUTE_PRICE = 0.0000166667; // Per GB-second
|
|
11
15
|
constructor(customInvocationsPerMonth, customAverageDurationMs) {
|
|
12
16
|
this.customInvocationsPerMonth = customInvocationsPerMonth;
|
|
13
17
|
this.customAverageDurationMs = customAverageDurationMs;
|
|
@@ -46,6 +50,29 @@ class LambdaCalculator {
|
|
|
46
50
|
assumptions.push('Using custom duration assumption from configuration');
|
|
47
51
|
}
|
|
48
52
|
if (requestPrice === null || computePrice === null) {
|
|
53
|
+
// If user provided custom usage assumptions, use fallback pricing
|
|
54
|
+
// Otherwise return 0 (pricing not available)
|
|
55
|
+
const hasCustomAssumptions = this.customInvocationsPerMonth !== undefined ||
|
|
56
|
+
this.customAverageDurationMs !== undefined;
|
|
57
|
+
if (hasCustomAssumptions) {
|
|
58
|
+
// Use fallback pricing to provide estimate
|
|
59
|
+
const effectiveRequestPrice = requestPrice ?? this.FALLBACK_REQUEST_PRICE;
|
|
60
|
+
const effectiveComputePrice = computePrice ?? this.FALLBACK_COMPUTE_PRICE;
|
|
61
|
+
const requestCost = (invocations / 1000000) * effectiveRequestPrice;
|
|
62
|
+
const gbSeconds = (memorySize / 1024) * (durationMs / 1000) * invocations;
|
|
63
|
+
const computeCost = gbSeconds * effectiveComputePrice;
|
|
64
|
+
const totalCost = requestCost + computeCost;
|
|
65
|
+
return {
|
|
66
|
+
amount: totalCost,
|
|
67
|
+
currency: 'USD',
|
|
68
|
+
confidence: 'low',
|
|
69
|
+
assumptions: [
|
|
70
|
+
requestPrice === null ? 'Using fallback request pricing (API unavailable)' : '',
|
|
71
|
+
computePrice === null ? 'Using fallback compute pricing (API unavailable)' : '',
|
|
72
|
+
...assumptions,
|
|
73
|
+
].filter(a => a !== ''),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
49
76
|
return {
|
|
50
77
|
amount: 0,
|
|
51
78
|
currency: 'USD',
|
|
@@ -80,6 +107,26 @@ class LambdaCalculator {
|
|
|
80
107
|
if (this.customAverageDurationMs !== undefined) {
|
|
81
108
|
assumptions.push('Using custom duration assumption from configuration');
|
|
82
109
|
}
|
|
110
|
+
// If user provided custom usage assumptions, use fallback pricing
|
|
111
|
+
// Otherwise return 0 (pricing API failed)
|
|
112
|
+
const hasCustomAssumptions = this.customInvocationsPerMonth !== undefined ||
|
|
113
|
+
this.customAverageDurationMs !== undefined;
|
|
114
|
+
if (hasCustomAssumptions) {
|
|
115
|
+
// Use fallback pricing to provide estimate even when API fails
|
|
116
|
+
const requestCost = (invocations / 1000000) * this.FALLBACK_REQUEST_PRICE;
|
|
117
|
+
const gbSeconds = (memorySize / 1024) * (durationMs / 1000) * invocations;
|
|
118
|
+
const computeCost = gbSeconds * this.FALLBACK_COMPUTE_PRICE;
|
|
119
|
+
const totalCost = requestCost + computeCost;
|
|
120
|
+
return {
|
|
121
|
+
amount: totalCost,
|
|
122
|
+
currency: 'USD',
|
|
123
|
+
confidence: 'low',
|
|
124
|
+
assumptions: [
|
|
125
|
+
'Using fallback pricing (API error)',
|
|
126
|
+
...assumptions.slice(1), // Skip the "Failed to fetch" message, already covered
|
|
127
|
+
],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
83
130
|
return {
|
|
84
131
|
amount: 0,
|
|
85
132
|
currency: 'USD',
|
|
@@ -90,4 +137,4 @@ class LambdaCalculator {
|
|
|
90
137
|
}
|
|
91
138
|
}
|
|
92
139
|
exports.LambdaCalculator = LambdaCalculator;
|
|
93
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGFtYmRhQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQWtEO0FBRWxELE1BQWEsZ0JBQWdCO0lBTVI7SUFDQTtJQU5GLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztJQUM5QixtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDM0IsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBRXpDLFlBQ21CLHlCQUFrQyxFQUNsQyx1QkFBZ0M7UUFEaEMsOEJBQXlCLEdBQXpCLHlCQUF5QixDQUFTO1FBQ2xDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBUztJQUNoRCxDQUFDO0lBRUosUUFBUSxDQUFDLFlBQW9CO1FBQzNCLE9BQU8sWUFBWSxLQUFLLHVCQUF1QixDQUFDO0lBQ2xELENBQUM7SUFFRCxLQUFLLENBQUMsYUFBYSxDQUNqQixRQUF3QixFQUN4QixNQUFjLEVBQ2QsYUFBNEI7UUFFNUIsTUFBTSxVQUFVLEdBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFxQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztRQUN4RixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMseUJBQXlCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQy9FLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUM7UUFFNUUsSUFBSSxDQUFDO1lBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxhQUFhLENBQUMsUUFBUSxDQUFDO2dCQUNoRCxXQUFXLEVBQUUsV0FBVztnQkFDeEIsTUFBTSxFQUFFLElBQUEsOEJBQWUsRUFBQyxNQUFNLENBQUM7Z0JBQy9CLE9BQU8sRUFBRTtvQkFDUCxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFO2lCQUNqRDthQUNGLENBQUMsQ0FBQztZQUVILE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsQ0FBQztnQkFDaEQsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLE1BQU0sRUFBRSxJQUFBLDhCQUFlLEVBQUMsTUFBTSxDQUFDO2dCQUMvQixPQUFPLEVBQUU7b0JBQ1AsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRTtpQkFDakQ7YUFDRixDQUFDLENBQUM7WUFFSCxNQUFNLFdBQVcsR0FBRztnQkFDbEIsV0FBVyxXQUFXLENBQUMsY0FBYyxFQUFFLHdCQUF3QjtnQkFDL0QsV0FBVyxVQUFVLDJCQUEyQjtnQkFDaEQsV0FBVyxVQUFVLHNCQUFzQjthQUM1QyxDQUFDO1lBRUYsSUFBSSxJQUFJLENBQUMseUJBQXlCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pELFdBQVcsQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQztZQUNsRixDQUFDO1lBQ0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQy9DLFdBQVcsQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQztZQUMxRSxDQUFDO1lBRUQsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsT0FBTztvQkFDTCxNQUFNLEVBQUUsQ0FBQztvQkFDVCxRQUFRLEVBQUUsS0FBSztvQkFDZixVQUFVLEVBQUUsU0FBUztvQkFDckIsV0FBVyxFQUFFO3dCQUNYLG1EQUFtRCxNQUFNLEVBQUU7d0JBQzNELEdBQUcsV0FBVztxQkFDZjtpQkFDRixDQUFDO1lBQ0osQ0FBQztZQUVELE1BQU0sV0FBVyxHQUFHLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxHQUFHLFlBQVksQ0FBQztZQUUzRCxNQUFNLFNBQVMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDMUUsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLFlBQVksQ0FBQztZQUU3QyxNQUFNLFNBQVMsR0FBRyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBRTVDLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFVBQVUsRUFBRSxRQUFRO2dCQUNwQixXQUFXO2FBQ1osQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxXQUFXLEdBQUc7Z0JBQ2xCLDRCQUE0QixLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BGLGdCQUFnQixXQUFXLENBQUMsY0FBYyxFQUFFLHdCQUF3QjtnQkFDcEUsZ0JBQWdCLFVBQVUsMkJBQTJCO2dCQUNyRCxnQkFBZ0IsVUFBVSxzQkFBc0I7YUFDakQsQ0FBQztZQUVGLElBQUksSUFBSSxDQUFDLHlCQUF5QixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNqRCxXQUFXLENBQUMsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUM7WUFDbEYsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLHVCQUF1QixLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMvQyxXQUFXLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDMUUsQ0FBQztZQUVELE9BQU87Z0JBQ0wsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsVUFBVSxFQUFFLFNBQVM7Z0JBQ3JCLFdBQVc7YUFDWixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQXJHRCw0Q0FxR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBSZXNvdXJjZVdpdGhJZCB9IGZyb20gJy4uLy4uL2RpZmYvdHlwZXMnO1xuaW1wb3J0IHsgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciwgTW9udGhseUNvc3QsIFByaWNpbmdDbGllbnQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBub3JtYWxpemVSZWdpb24gfSBmcm9tICcuLi9SZWdpb25NYXBwZXInO1xuXG5leHBvcnQgY2xhc3MgTGFtYmRhQ2FsY3VsYXRvciBpbXBsZW1lbnRzIFJlc291cmNlQ29zdENhbGN1bGF0b3Ige1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfSU5WT0NBVElPTlMgPSAxMDAwMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfRFVSQVRJT05fTVMgPSAxMDAwO1xuICBwcml2YXRlIHJlYWRvbmx5IERFRkFVTFRfTUVNT1JZX01CID0gMTI4O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tSW52b2NhdGlvbnNQZXJNb250aD86IG51bWJlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zPzogbnVtYmVyLFxuICApIHt9XG5cbiAgc3VwcG9ydHMocmVzb3VyY2VUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcmVzb3VyY2VUeXBlID09PSAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJztcbiAgfVxuXG4gIGFzeW5jIGNhbGN1bGF0ZUNvc3QoXG4gICAgcmVzb3VyY2U6IFJlc291cmNlV2l0aElkLFxuICAgIHJlZ2lvbjogc3RyaW5nLFxuICAgIHByaWNpbmdDbGllbnQ6IFByaWNpbmdDbGllbnQsXG4gICk6IFByb21pc2U8TW9udGhseUNvc3Q+IHtcbiAgICBjb25zdCBtZW1vcnlTaXplID0gKHJlc291cmNlLnByb3BlcnRpZXMuTWVtb3J5U2l6ZSBhcyBudW1iZXIpIHx8IHRoaXMuREVGQVVMVF9NRU1PUllfTUI7XG4gICAgY29uc3QgaW52b2NhdGlvbnMgPSB0aGlzLmN1c3RvbUludm9jYXRpb25zUGVyTW9udGggPz8gdGhpcy5ERUZBVUxUX0lOVk9DQVRJT05TO1xuICAgIGNvbnN0IGR1cmF0aW9uTXMgPSB0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zID8/IHRoaXMuREVGQVVMVF9EVVJBVElPTl9NUztcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXF1ZXN0UHJpY2UgPSBhd2FpdCBwcmljaW5nQ2xpZW50LmdldFByaWNlKHtcbiAgICAgICAgc2VydmljZUNvZGU6ICdBV1NMYW1iZGEnLFxuICAgICAgICByZWdpb246IG5vcm1hbGl6ZVJlZ2lvbihyZWdpb24pLFxuICAgICAgICBmaWx0ZXJzOiBbXG4gICAgICAgICAgeyBmaWVsZDogJ2dyb3VwJywgdmFsdWU6ICdBV1MtTGFtYmRhLVJlcXVlc3RzJyB9LFxuICAgICAgICBdLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGNvbXB1dGVQcmljZSA9IGF3YWl0IHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgICBzZXJ2aWNlQ29kZTogJ0FXU0xhbWJkYScsXG4gICAgICAgIHJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnZ3JvdXAnLCB2YWx1ZTogJ0FXUy1MYW1iZGEtRHVyYXRpb24nIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXG4gICAgICAgIGBBc3N1bWVzICR7aW52b2NhdGlvbnMudG9Mb2NhbGVTdHJpbmcoKX0gaW52b2NhdGlvbnMgcGVyIG1vbnRoYCxcbiAgICAgICAgYEFzc3VtZXMgJHtkdXJhdGlvbk1zfW1zIGF2ZXJhZ2UgZXhlY3V0aW9uIHRpbWVgLFxuICAgICAgICBgQXNzdW1lcyAke21lbW9yeVNpemV9TUIgbWVtb3J5IGFsbG9jYXRpb25gLFxuICAgICAgXTtcblxuICAgICAgaWYgKHRoaXMuY3VzdG9tSW52b2NhdGlvbnNQZXJNb250aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBpbnZvY2F0aW9uIGNvdW50IGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jdXN0b21BdmVyYWdlRHVyYXRpb25NcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc3VtcHRpb25zLnB1c2goJ1VzaW5nIGN1c3RvbSBkdXJhdGlvbiBhc3N1bXB0aW9uIGZyb20gY29uZmlndXJhdGlvbicpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVxdWVzdFByaWNlID09PSBudWxsIHx8IGNvbXB1dGVQcmljZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgICBgUHJpY2luZyBkYXRhIG5vdCBhdmFpbGFibGUgZm9yIExhbWJkYSBpbiByZWdpb24gJHtyZWdpb259YCxcbiAgICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RDb3N0ID0gKGludm9jYXRpb25zIC8gMTAwMDAwMCkgKiByZXF1ZXN0UHJpY2U7XG5cbiAgICAgIGNvbnN0IGdiU2Vjb25kcyA9IChtZW1vcnlTaXplIC8gMTAyNCkgKiAoZHVyYXRpb25NcyAvIDEwMDApICogaW52b2NhdGlvbnM7XG4gICAgICBjb25zdCBjb21wdXRlQ29zdCA9IGdiU2Vjb25kcyAqIGNvbXB1dGVQcmljZTtcblxuICAgICAgY29uc3QgdG90YWxDb3N0ID0gcmVxdWVzdENvc3QgKyBjb21wdXRlQ29zdDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiB0b3RhbENvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ21lZGl1bScsXG4gICAgICAgIGFzc3VtcHRpb25zLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXG4gICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggcHJpY2luZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgYFdvdWxkIGFzc3VtZSAke2ludm9jYXRpb25zLnRvTG9jYWxlU3RyaW5nKCl9IGludm9jYXRpb25zIHBlciBtb250aGAsXG4gICAgICAgIGBXb3VsZCBhc3N1bWUgJHtkdXJhdGlvbk1zfW1zIGF2ZXJhZ2UgZXhlY3V0aW9uIHRpbWVgLFxuICAgICAgICBgV291bGQgYXNzdW1lICR7bWVtb3J5U2l6ZX1NQiBtZW1vcnkgYWxsb2NhdGlvbmAsXG4gICAgICBdO1xuXG4gICAgICBpZiAodGhpcy5jdXN0b21JbnZvY2F0aW9uc1Blck1vbnRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGludm9jYXRpb24gY291bnQgYXNzdW1wdGlvbiBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGR1cmF0aW9uIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgY3VycmVuY3k6ICdVU0QnLFxuICAgICAgICBjb25maWRlbmNlOiAndW5rbm93bicsXG4gICAgICAgIGFzc3VtcHRpb25zLFxuICAgICAgfTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGFtYmRhQ2FsY3VsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9wcmljaW5nL2NhbGN1bGF0b3JzL0xhbWJkYUNhbGN1bGF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0RBQWtEO0FBRWxELE1BQWEsZ0JBQWdCO0lBV1I7SUFDQTtJQVhGLG1CQUFtQixHQUFHLE9BQU8sQ0FBQztJQUM5QixtQkFBbUIsR0FBRyxJQUFJLENBQUM7SUFDM0IsaUJBQWlCLEdBQUcsR0FBRyxDQUFDO0lBRXpDLG1FQUFtRTtJQUNuRSwyRUFBMkU7SUFDMUQsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLENBQUMsa0JBQWtCO0lBQ2pELHNCQUFzQixHQUFHLFlBQVksQ0FBQyxDQUFDLGdCQUFnQjtJQUV4RSxZQUNtQix5QkFBa0MsRUFDbEMsdUJBQWdDO1FBRGhDLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBUztRQUNsQyw0QkFBdUIsR0FBdkIsdUJBQXVCLENBQVM7SUFDaEQsQ0FBQztJQUVKLFFBQVEsQ0FBQyxZQUFvQjtRQUMzQixPQUFPLFlBQVksS0FBSyx1QkFBdUIsQ0FBQztJQUNsRCxDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FDakIsUUFBd0IsRUFDeEIsTUFBYyxFQUNkLGFBQTRCO1FBRTVCLE1BQU0sVUFBVSxHQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsVUFBcUIsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDeEYsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUMvRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBRTVFLElBQUksQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLE1BQU0sYUFBYSxDQUFDLFFBQVEsQ0FBQztnQkFDaEQsV0FBVyxFQUFFLFdBQVc7Z0JBQ3hCLE1B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QUFJLENBQUMsc0JBQXNCLENBQUM7Z0JBQzFFLE1BQU0sU0FBUyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQztnQkFDMUUsTUFBTSxXQUFXLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztnQkFDNUQsTUFBTSxTQUFTLEdBQUcsV0FBVyxHQUFHLFdBQVcsQ0FBQztnQkFFNUMsT0FBTztvQkFDTCxNQUFNLEVBQUUsU0FBUztvQkFDakIsUUFBUSxFQUFFLEtBQUs7b0JBQ2YsVUFBVSxFQUFFLEtBQUs7b0JBQ2pCLFdBQVcsRUFBRTt3QkFDWCxvQ0FBb0M7d0JBQ3BDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxzREFBc0Q7cUJBQ2hGO2lCQUNGLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTztnQkFDTCxNQUFNLEVBQUUsQ0FBQztnQkFDVCxRQUFRLEVBQUUsS0FBSztnQkFDZixVQUFVLEVBQUUsU0FBUztnQkFDckIsV0FBVzthQUNaLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNUpELDRDQTRKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlc291cmNlV2l0aElkIH0gZnJvbSAnLi4vLi4vZGlmZi90eXBlcyc7XG5pbXBvcnQgeyBSZXNvdXJjZUNvc3RDYWxjdWxhdG9yLCBNb250aGx5Q29zdCwgUHJpY2luZ0NsaWVudCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IG5vcm1hbGl6ZVJlZ2lvbiB9IGZyb20gJy4uL1JlZ2lvbk1hcHBlcic7XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFDYWxjdWxhdG9yIGltcGxlbWVudHMgUmVzb3VyY2VDb3N0Q2FsY3VsYXRvciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9JTlZPQ0FUSU9OUyA9IDEwMDAwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9EVVJBVElPTl9NUyA9IDEwMDA7XG4gIHByaXZhdGUgcmVhZG9ubHkgREVGQVVMVF9NRU1PUllfTUIgPSAxMjg7XG4gIFxuICAvLyBGYWxsYmFjayBwcmljaW5nIHJhdGVzIChBV1MgTGFtYmRhIHVzLWVhc3QtMSBwcmljaW5nIGFzIG9mIDIwMjQpXG4gIC8vIFVzZWQgd2hlbiBBUEkgcHJpY2luZyBpcyB1bmF2YWlsYWJsZSBidXQgdXNlciBwcm92aWRlZCB1c2FnZSBhc3N1bXB0aW9uc1xuICBwcml2YXRlIHJlYWRvbmx5IEZBTExCQUNLX1JFUVVFU1RfUFJJQ0UgPSAwLjIwOyAvLyBQZXIgMU0gcmVxdWVzdHNcbiAgcHJpdmF0ZSByZWFkb25seSBGQUxMQkFDS19DT01QVVRFX1BSSUNFID0gMC4wMDAwMTY2NjY3OyAvLyBQZXIgR0Itc2Vjb25kXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBjdXN0b21JbnZvY2F0aW9uc1Blck1vbnRoPzogbnVtYmVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VzdG9tQXZlcmFnZUR1cmF0aW9uTXM/OiBudW1iZXIsXG4gICkge31cblxuICBzdXBwb3J0cyhyZXNvdXJjZVR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiByZXNvdXJjZVR5cGUgPT09ICdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nO1xuICB9XG5cbiAgYXN5bmMgY2FsY3VsYXRlQ29zdChcbiAgICByZXNvdXJjZTogUmVzb3VyY2VXaXRoSWQsXG4gICAgcmVnaW9uOiBzdHJpbmcsXG4gICAgcHJpY2luZ0NsaWVudDogUHJpY2luZ0NsaWVudCxcbiAgKTogUHJvbWlzZTxNb250aGx5Q29zdD4ge1xuICAgIGNvbnN0IG1lbW9yeVNpemUgPSAocmVzb3VyY2UucHJvcGVydGllcy5NZW1vcnlTaXplIGFzIG51bWJlcikgfHwgdGhpcy5ERUZBVUxUX01FTU9SWV9NQjtcbiAgICBjb25zdCBpbnZvY2F0aW9ucyA9IHRoaXMuY3VzdG9tSW52b2NhdGlvbnNQZXJNb250aCA/PyB0aGlzLkRFRkFVTFRfSU5WT0NBVElPTlM7XG4gICAgY29uc3QgZHVyYXRpb25NcyA9IHRoaXMuY3VzdG9tQXZlcmFnZUR1cmF0aW9uTXMgPz8gdGhpcy5ERUZBVUxUX0RVUkFUSU9OX01TO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RQcmljZSA9IGF3YWl0IHByaWNpbmdDbGllbnQuZ2V0UHJpY2Uoe1xuICAgICAgICBzZXJ2aWNlQ29kZTogJ0FXU0xhbWJkYScsXG4gICAgICAgIHJlZ2lvbjogbm9ybWFsaXplUmVnaW9uKHJlZ2lvbiksXG4gICAgICAgIGZpbHRlcnM6IFtcbiAgICAgICAgICB7IGZpZWxkOiAnZ3JvdXAnLCB2YWx1ZTogJ0FXUy1MYW1iZGEtUmVxdWVzdHMnIH0sXG4gICAgICAgIF0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29tcHV0ZVByaWNlID0gYXdhaXQgcHJpY2luZ0NsaWVudC5nZXRQcmljZSh7XG4gICAgICAgIHNlcnZpY2VDb2RlOiAnQVdTTGFtYmRhJyxcbiAgICAgICAgcmVnaW9uOiBub3JtYWxpemVSZWdpb24ocmVnaW9uKSxcbiAgICAgICAgZmlsdGVyczogW1xuICAgICAgICAgIHsgZmllbGQ6ICdncm91cCcsIHZhbHVlOiAnQVdTLUxhbWJkYS1EdXJhdGlvbicgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhc3N1bXB0aW9ucyA9IFtcbiAgICAgICAgYEFzc3VtZXMgJHtpbnZvY2F0aW9ucy50b0xvY2FsZVN0cmluZygpfSBpbnZvY2F0aW9ucyBwZXIgbW9udGhgLFxuICAgICAgICBgQXNzdW1lcyAke2R1cmF0aW9uTXN9bXMgYXZlcmFnZSBleGVjdXRpb24gdGltZWAsXG4gICAgICAgIGBBc3N1bWVzICR7bWVtb3J5U2l6ZX1NQiBtZW1vcnkgYWxsb2NhdGlvbmAsXG4gICAgICBdO1xuXG4gICAgICBpZiAodGhpcy5jdXN0b21JbnZvY2F0aW9uc1Blck1vbnRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGludm9jYXRpb24gY291bnQgYXNzdW1wdGlvbiBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGR1cmF0aW9uIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXF1ZXN0UHJpY2UgPT09IG51bGwgfHwgY29tcHV0ZVByaWNlID09PSBudWxsKSB7XG4gICAgICAgIC8vIElmIHVzZXIgcHJvdmlkZWQgY3VzdG9tIHVzYWdlIGFzc3VtcHRpb25zLCB1c2UgZmFsbGJhY2sgcHJpY2luZ1xuICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuIDAgKHByaWNpbmcgbm90IGF2YWlsYWJsZSlcbiAgICAgICAgY29uc3QgaGFzQ3VzdG9tQXNzdW1wdGlvbnMgPSB0aGlzLmN1c3RvbUludm9jYXRpb25zUGVyTW9udGggIT09IHVuZGVmaW5lZCB8fCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQ7XG4gICAgICAgIFxuICAgICAgICBpZiAoaGFzQ3VzdG9tQXNzdW1wdGlvbnMpIHtcbiAgICAgICAgICAvLyBVc2UgZmFsbGJhY2sgcHJpY2luZyB0byBwcm92aWRlIGVzdGltYXRlXG4gICAgICAgICAgY29uc3QgZWZmZWN0aXZlUmVxdWVzdFByaWNlID0gcmVxdWVzdFByaWNlID8/IHRoaXMuRkFMTEJBQ0tfUkVRVUVTVF9QUklDRTtcbiAgICAgICAgICBjb25zdCBlZmZlY3RpdmVDb21wdXRlUHJpY2UgPSBjb21wdXRlUHJpY2UgPz8gdGhpcy5GQUxMQkFDS19DT01QVVRFX1BSSUNFO1xuICAgICAgICAgIFxuICAgICAgICAgIGNvbnN0IHJlcXVlc3RDb3N0ID0gKGludm9jYXRpb25zIC8gMTAwMDAwMCkgKiBlZmZlY3RpdmVSZXF1ZXN0UHJpY2U7XG4gICAgICAgICAgY29uc3QgZ2JTZWNvbmRzID0gKG1lbW9yeVNpemUgLyAxMDI0KSAqIChkdXJhdGlvbk1zIC8gMTAwMCkgKiBpbnZvY2F0aW9ucztcbiAgICAgICAgICBjb25zdCBjb21wdXRlQ29zdCA9IGdiU2Vjb25kcyAqIGVmZmVjdGl2ZUNvbXB1dGVQcmljZTtcbiAgICAgICAgICBjb25zdCB0b3RhbENvc3QgPSByZXF1ZXN0Q29zdCArIGNvbXB1dGVDb3N0O1xuICAgICAgICAgIFxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhbW91bnQ6IHRvdGFsQ29zdCxcbiAgICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICAgIGNvbmZpZGVuY2U6ICdsb3cnLFxuICAgICAgICAgICAgYXNzdW1wdGlvbnM6IFtcbiAgICAgICAgICAgICAgcmVxdWVzdFByaWNlID09PSBudWxsID8gJ1VzaW5nIGZhbGxiYWNrIHJlcXVlc3QgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScgOiAnJyxcbiAgICAgICAgICAgICAgY29tcHV0ZVByaWNlID09PSBudWxsID8gJ1VzaW5nIGZhbGxiYWNrIGNvbXB1dGUgcHJpY2luZyAoQVBJIHVuYXZhaWxhYmxlKScgOiAnJyxcbiAgICAgICAgICAgICAgLi4uYXNzdW1wdGlvbnMsXG4gICAgICAgICAgICBdLmZpbHRlcihhID0+IGEgIT09ICcnKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogMCxcbiAgICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgICAgY29uZmlkZW5jZTogJ3Vua25vd24nLFxuICAgICAgICAgIGFzc3VtcHRpb25zOiBbXG4gICAgICAgICAgICBgUHJpY2luZyBkYXRhIG5vdCBhdmFpbGFibGUgZm9yIExhbWJkYSBpbiByZWdpb24gJHtyZWdpb259YCxcbiAgICAgICAgICAgIC4uLmFzc3VtcHRpb25zLFxuICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlcXVlc3RDb3N0ID0gKGludm9jYXRpb25zIC8gMTAwMDAwMCkgKiByZXF1ZXN0UHJpY2U7XG5cbiAgICAgIGNvbnN0IGdiU2Vjb25kcyA9IChtZW1vcnlTaXplIC8gMTAyNCkgKiAoZHVyYXRpb25NcyAvIDEwMDApICogaW52b2NhdGlvbnM7XG4gICAgICBjb25zdCBjb21wdXRlQ29zdCA9IGdiU2Vjb25kcyAqIGNvbXB1dGVQcmljZTtcblxuICAgICAgY29uc3QgdG90YWxDb3N0ID0gcmVxdWVzdENvc3QgKyBjb21wdXRlQ29zdDtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiB0b3RhbENvc3QsXG4gICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgY29uZmlkZW5jZTogJ21lZGl1bScsXG4gICAgICAgIGFzc3VtcHRpb25zLFxuICAgICAgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3QgYXNzdW1wdGlvbnMgPSBbXG4gICAgICAgIGBGYWlsZWQgdG8gZmV0Y2ggcHJpY2luZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCxcbiAgICAgICAgYFdvdWxkIGFzc3VtZSAke2ludm9jYXRpb25zLnRvTG9jYWxlU3RyaW5nKCl9IGludm9jYXRpb25zIHBlciBtb250aGAsXG4gICAgICAgIGBXb3VsZCBhc3N1bWUgJHtkdXJhdGlvbk1zfW1zIGF2ZXJhZ2UgZXhlY3V0aW9uIHRpbWVgLFxuICAgICAgICBgV291bGQgYXNzdW1lICR7bWVtb3J5U2l6ZX1NQiBtZW1vcnkgYWxsb2NhdGlvbmAsXG4gICAgICBdO1xuXG4gICAgICBpZiAodGhpcy5jdXN0b21JbnZvY2F0aW9uc1Blck1vbnRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGludm9jYXRpb24gY291bnQgYXNzdW1wdGlvbiBmcm9tIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzdW1wdGlvbnMucHVzaCgnVXNpbmcgY3VzdG9tIGR1cmF0aW9uIGFzc3VtcHRpb24gZnJvbSBjb25maWd1cmF0aW9uJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHVzZXIgcHJvdmlkZWQgY3VzdG9tIHVzYWdlIGFzc3VtcHRpb25zLCB1c2UgZmFsbGJhY2sgcHJpY2luZ1xuICAgICAgLy8gT3RoZXJ3aXNlIHJldHVybiAwIChwcmljaW5nIEFQSSBmYWlsZWQpXG4gICAgICBjb25zdCBoYXNDdXN0b21Bc3N1bXB0aW9ucyA9IHRoaXMuY3VzdG9tSW52b2NhdGlvbnNQZXJNb250aCAhPT0gdW5kZWZpbmVkIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1c3RvbUF2ZXJhZ2VEdXJhdGlvbk1zICE9PSB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIGlmIChoYXNDdXN0b21Bc3N1bXB0aW9ucykge1xuICAgICAgICAvLyBVc2UgZmFsbGJhY2sgcHJpY2luZyB0byBwcm92aWRlIGVzdGltYXRlIGV2ZW4gd2hlbiBBUEkgZmFpbHNcbiAgICAgICAgY29uc3QgcmVxdWVzdENvc3QgPSAoaW52b2NhdGlvbnMgLyAxMDAwMDAwKSAqIHRoaXMuRkFMTEJBQ0tfUkVRVUVTVF9QUklDRTtcbiAgICAgICAgY29uc3QgZ2JTZWNvbmRzID0gKG1lbW9yeVNpemUgLyAxMDI0KSAqIChkdXJhdGlvbk1zIC8gMTAwMCkgKiBpbnZvY2F0aW9ucztcbiAgICAgICAgY29uc3QgY29tcHV0ZUNvc3QgPSBnYlNlY29uZHMgKiB0aGlzLkZBTExCQUNLX0NPTVBVVEVfUFJJQ0U7XG4gICAgICAgIGNvbnN0IHRvdGFsQ29zdCA9IHJlcXVlc3RDb3N0ICsgY29tcHV0ZUNvc3Q7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGFtb3VudDogdG90YWxDb3N0LFxuICAgICAgICAgIGN1cnJlbmN5OiAnVVNEJyxcbiAgICAgICAgICBjb25maWRlbmNlOiAnbG93JyxcbiAgICAgICAgICBhc3N1bXB0aW9uczogW1xuICAgICAgICAgICAgJ1VzaW5nIGZhbGxiYWNrIHByaWNpbmcgKEFQSSBlcnJvciknLFxuICAgICAgICAgICAgLi4uYXNzdW1wdGlvbnMuc2xpY2UoMSksIC8vIFNraXAgdGhlIFwiRmFpbGVkIHRvIGZldGNoXCIgbWVzc2FnZSwgYWxyZWFkeSBjb3ZlcmVkXG4gICAgICAgICAgXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW1vdW50OiAwLFxuICAgICAgICBjdXJyZW5jeTogJ1VTRCcsXG4gICAgICAgIGNvbmZpZGVuY2U6ICd1bmtub3duJyxcbiAgICAgICAgYXNzdW1wdGlvbnMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxufVxuIl19
|
package/dist/releasetag.txt
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
v0.1.
|
|
1
|
+
v0.1.11
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SingleTemplateCostResult, SingleTemplateReportOptions } from '../api/single-template-types';
|
|
2
|
+
/**
|
|
3
|
+
* Reporter for generating formatted output for single template cost analysis
|
|
4
|
+
*/
|
|
5
|
+
export declare class SingleTemplateReporter {
|
|
6
|
+
/**
|
|
7
|
+
* Generate a formatted report from single template analysis result
|
|
8
|
+
*
|
|
9
|
+
* @param result - The analysis result
|
|
10
|
+
* @param format - Output format (text, json, or markdown)
|
|
11
|
+
* @param options - Optional formatting preferences
|
|
12
|
+
* @returns Formatted report string
|
|
13
|
+
*/
|
|
14
|
+
generateReport(result: SingleTemplateCostResult, format: 'text' | 'json' | 'markdown', options?: SingleTemplateReportOptions): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate JSON format report
|
|
17
|
+
*/
|
|
18
|
+
private generateJsonReport;
|
|
19
|
+
/**
|
|
20
|
+
* Generate text format report
|
|
21
|
+
*/
|
|
22
|
+
private generateTextReport;
|
|
23
|
+
/**
|
|
24
|
+
* Generate markdown format report
|
|
25
|
+
*/
|
|
26
|
+
private generateMarkdownReport;
|
|
27
|
+
/**
|
|
28
|
+
* Sort resources based on specified criteria
|
|
29
|
+
*/
|
|
30
|
+
private sortResources;
|
|
31
|
+
}
|