open-next-cdk
Version:
Deploy a NextJS app using OpenNext packaging to serverless AWS using CDK
129 lines • 22.1 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.listDirectory = exports.NextJsAssetsDeployment = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const os = require("os");
const path = require("path");
const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
const constructs_1 = require("constructs");
const fs = require("fs-extra");
const micromatch = require("micromatch");
const constants_1 = require("./constants");
const NextjsBuild_1 = require("./NextjsBuild");
const NextjsS3EnvRewriter_1 = require("./NextjsS3EnvRewriter");
/**
* Uploads NextJS-built static and public files to S3.
*
* Will rewrite CloudFormation references with their resolved values after uploading.
*/
class NextJsAssetsDeployment extends constructs_1.Construct {
constructor(scope, id, props) {
super(scope, id);
this.props = props;
this.bucket = props.bucket;
this.staticTempDir = this.prepareArchiveDirectory();
this.deployments = this.uploadS3Assets(this.staticTempDir);
// do rewrites of unresolved CDK tokens in static files
if (this.props.environment && !this.props.isPlaceholder) {
this.rewriter = new NextjsS3EnvRewriter_1.NextjsS3EnvRewriter(this, 'NextjsS3EnvRewriter', {
...props,
s3Bucket: this.bucket,
s3keys: this._getStaticFilesForRewrite(),
replacementConfig: {
env: NextjsS3EnvRewriter_1.getS3ReplaceValues(this.props.environment, true),
},
debug: false,
cloudfrontDistributionId: this.props.distribution?.distributionId,
});
// wait for s3 assets to be uploaded first before running
this.rewriter.node.addDependency(...this.deployments);
}
}
// arrange directory structure for S3 asset deployments
// should contain _next/static and ./ for public files
prepareArchiveDirectory() {
const archiveDir = this.props.tempBuildDir
? path.resolve(path.join(this.props.tempBuildDir, 'static'))
: fs.mkdtempSync(path.join(os.tmpdir(), 'static-'));
fs.mkdirpSync(archiveDir);
// theoretically we could move the files instead of copy for speed...
// path to public folder; root static assets
const staticDir = this.props.nextBuild.nextStaticDir;
if (!this.props.isPlaceholder && fs.existsSync(staticDir)) {
// copy public+static files to root
fs.copySync(this.props.nextBuild.nextStaticDir, archiveDir, {
recursive: true,
dereference: true,
preserveTimestamps: true,
});
}
return archiveDir;
}
uploadS3Assets(archiveDir) {
// zip up bucket contents and upload to bucket
const archiveZipFilePath = NextjsBuild_1.createArchive({
directory: archiveDir,
zipFileName: 'assets.zip',
zipOutDir: path.join(this.staticTempDir, 'assets'),
compressionLevel: this.props.compressionLevel,
quiet: this.props.quiet,
});
if (!archiveZipFilePath)
return [];
const maxAge = this.props.cachePolicies?.staticMaxAgeDefault?.toSeconds() ?? constants_1.DEFAULT_STATIC_MAX_AGE;
const staleWhileRevalidate = this.props.cachePolicies?.staticStaleWhileRevalidateDefault?.toSeconds() ?? constants_1.DEFAULT_STATIC_STALE_WHILE_REVALIDATE;
const cacheControl = aws_s3_deployment_1.CacheControl.fromString(`public,max-age=${maxAge},stale-while-revalidate=${staleWhileRevalidate},immutable`);
const deployment = new aws_s3_deployment_1.BucketDeployment(this, 'NextStaticAssetsS3Deployment', {
destinationBucket: this.bucket,
cacheControl: [cacheControl],
sources: [aws_s3_deployment_1.Source.asset(archiveZipFilePath)],
distribution: this.props.distribution,
prune: this.props.prune,
useEfs: this.props.useEfs,
vpc: this.props.vpc,
memoryLimit: this.props.memoryLimit,
ephemeralStorageSize: this.props.ephemeralStorageSize,
});
return [deployment];
}
_getStaticFilesForRewrite() {
const staticDir = this.staticTempDir;
const s3keys = [];
if (!fs.existsSync(staticDir)) {
return [];
}
listDirectory(staticDir).forEach((file) => {
const relativePath = path.relative(staticDir, file);
// skip bogus system files
if (relativePath.endsWith('.DS_Store'))
return;
// is this file a glob match?
if (!micromatch.isMatch(relativePath, NextjsS3EnvRewriter_1.replaceTokenGlobs, { dot: true })) {
return;
}
s3keys.push(relativePath);
});
return s3keys;
}
}
exports.NextJsAssetsDeployment = NextJsAssetsDeployment;
_a = JSII_RTTI_SYMBOL_1;
NextJsAssetsDeployment[_a] = { fqn: "open-next-cdk.NextJsAssetsDeployment", version: "0.0.10" };
function listDirectory(dir) {
const fileList = [];
const publicFiles = fs.readdirSync(dir);
for (const filename of publicFiles) {
const filepath = path.join(dir, filename);
const stat = fs.statSync(filepath);
if (stat.isDirectory()) {
fileList.push(...listDirectory(filepath));
}
else {
fileList.push(filepath);
}
}
return fileList;
}
exports.listDirectory = listDirectory;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmV4dGpzQXNzZXRzRGVwbG95bWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9OZXh0anNBc3NldHNEZXBsb3ltZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUs3QixxRUFBdUY7QUFDdkYsMkNBQXVDO0FBQ3ZDLCtCQUErQjtBQUMvQix5Q0FBeUM7QUFDekMsMkNBQTRGO0FBRTVGLCtDQUEyRDtBQUMzRCwrREFBbUc7QUFrSG5HOzs7O0dBSUc7QUFDSCxNQUFhLHNCQUF1QixTQUFRLHNCQUFTO0lBZ0JuRCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQWtDO1FBQzFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUUzRCx1REFBdUQ7UUFDdkQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFO1lBQ3ZELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSx5Q0FBbUIsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7Z0JBQ25FLEdBQUcsS0FBSztnQkFDUixRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMseUJBQXlCLEVBQUU7Z0JBQ3hDLGlCQUFpQixFQUFFO29CQUNqQixHQUFHLEVBQUUsd0NBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVB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LE1BQU0sUUFBUSxJQUFJLFdBQVcsRUFBRTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxFQUFFO1lBQ3RCLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUMzQzthQUFNO1lBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN6QjtLQUNGO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQWRELHNDQWNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IER1cmF0aW9uLCBTaXplIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2xvdWRmcm9udCBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udCc7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQnVja2V0RGVwbG95bWVudCwgQ2FjaGVDb250cm9sLCBTb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIG1pY3JvbWF0Y2ggZnJvbSAnbWljcm9tYXRjaCc7XG5pbXBvcnQgeyBERUZBVUxUX1NUQVRJQ19NQVhfQUdFLCBERUZBVUxUX1NUQVRJQ19TVEFMRV9XSElMRV9SRVZBTElEQVRFIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSAnLi9OZXh0anNCYXNlJztcbmltcG9ydCB7IGNyZWF0ZUFyY2hpdmUsIE5leHRqc0J1aWxkIH0gZnJvbSAnLi9OZXh0anNCdWlsZCc7XG5pbXBvcnQgeyBnZXRTM1JlcGxhY2VWYWx1ZXMsIE5leHRqc1MzRW52UmV3cml0ZXIsIHJlcGxhY2VUb2tlbkdsb2JzIH0gZnJvbSAnLi9OZXh0anNTM0VudlJld3JpdGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNBc3NldHNDYWNoZVBvbGljeVByb3BzIHtcbiAgLyoqXG4gICAqIENhY2hlLWNvbnRyb2wgbWF4LWFnZSBkZWZhdWx0IGZvciBTMyBzdGF0aWMgYXNzZXRzLlxuICAgKiBEZWZhdWx0OiAzMCBkYXlzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljTWF4QWdlRGVmYXVsdD86IER1cmF0aW9uO1xuICAvKipcbiAgICogQ2FjaGUtY29udHJvbCBzdGFsZS13aGlsZS1yZXZhbGlkYXRlIGRlZmF1bHQgZm9yIFMzIHN0YXRpYyBhc3NldHMuXG4gICAqIERlZmF1bHQ6IDEgZGF5LlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljU3RhbGVXaGlsZVJldmFsaWRhdGVEZWZhdWx0PzogRHVyYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzIGV4dGVuZHMgTmV4dGpzQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBgTmV4dGpzQnVpbGRgIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgYnVpbHQgTmV4dGpzIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dEJ1aWxkOiBOZXh0anNCdWlsZDtcblxuICAvKipcbiAgICogUHJvcGVydGllcyBmb3IgdGhlIFMzIGJ1Y2tldCBjb250YWluaW5nIHRoZSBOZXh0SlMgYXNzZXRzLlxuICAgKi9cbiAgcmVhZG9ubHkgYnVja2V0OiBzMy5JQnVja2V0O1xuXG4gIC8qKlxuICAgKiBEaXN0cmlidXRpb24gdG8gaW52YWxpZGF0ZSB3aGVuIGFzc2V0cyBjaGFuZ2UuXG4gICAqL1xuICByZWFkb25seSBkaXN0cmlidXRpb24/OiBjbG91ZGZyb250LklEaXN0cmlidXRpb247XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlIHRoZSBkZWZhdWx0IFMzIGNhY2hlIHBvbGljaWVzIGNyZWF0ZWQgaW50ZXJuYWxseS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlUG9saWNpZXM/OiBOZXh0anNBc3NldHNDYWNoZVBvbGljeVByb3BzO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gdHJ1ZSB0byBkZWxldGUgb2xkIGFzc2V0cyAoZGVmYXVsdHMgdG8gZmFsc2UpLlxuICAgKiBSZWNvbW1lbmRlZCB0byBvbmx5IHNldCB0byB0cnVlIGlmIHlvdSBkb24ndCBuZWVkIHRoZSBhYmlsaXR5IHRvIHJvbGwgYmFjayBkZXBsb3ltZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IHBydW5lPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW4gY2FzZSBvZiB1c2VFZnMsIHZwYyBpcyByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogSVZwYztcblxuICAvKipcbiAgICogSW4gY2FzZSBvZiB1c2VFZnMsIHZwYyBpcyByZXF1aXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgdXNlRWZzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogbWVtb3J5TGltaXQgZm9yIGxhbWJkYSBmdW5jdGlvbiB3aGljaCBiZWVuIHJ1biBieSBCdWNrZXREZXBsb3ltZW50XG4gICAqL1xuICByZWFkb25seSBtZW1vcnlMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogZXBoZW1lcmFsU3RvcmFnZVNpemUgZm9yIGxhbWJkYSBmdW5jdGlvbiB3aGljaCBiZWVuIHJ1biBieSBCdWNrZXREZXBsb3ltZW50XG4gICAqL1xuICByZWFkb25seSBlcGhlbWVyYWxTdG9yYWdlU2l6ZT86IFNpemU7XG59XG5cbi8qKlxuICogRWZmZWN0aXZlbHkgYSBQYXJ0aWFsPE5leHRqc0Fzc2V0c0NhY2hlUG9saWN5UHJvcHM+IHRvIHNhdGlzZnkgSlNJSVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wc0RlZmF1bHRzIGV4dGVuZHMgTmV4dGpzQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBgTmV4dGpzQnVpbGRgIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgYnVpbHQgTmV4dGpzIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV4dEJ1aWxkPzogTmV4dGpzQnVpbGQ7XG5cbiAgLyoqXG4gICAqIFByb3BlcnRpZXMgZm9yIHRoZSBTMyBidWNrZXQgY29udGFpbmluZyB0aGUgTmV4dEpTIGFzc2V0cy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1Y2tldD86IHMzLklCdWNrZXQ7XG5cbiAgLyoqXG4gICAqIERpc3RyaWJ1dGlvbiB0byBpbnZhbGlkYXRlIHdoZW4gYXNzZXRzIGNoYW5nZS5cbiAgICovXG4gIHJlYWRvbmx5IGRpc3RyaWJ1dGlvbj86IGNsb3VkZnJvbnQuSURpc3RyaWJ1dGlvbjtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIGRlZmF1bHQgUzMgY2FjaGUgcG9saWNpZXMgY3JlYXRlZCBpbnRlcm5hbGx5LlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVQb2xpY2llcz86IE5leHRqc0Fzc2V0c0NhY2hlUG9saWN5UHJvcHM7XG5cbiAgLyoqXG4gICAqIFNldCB0byB0cnVlIHRvIGRlbGV0ZSBvbGQgYXNzZXRzIChkZWZhdWx0cyB0byBmYWxzZSkuXG4gICAqIFJlY29tbWVuZGVkIHRvIG9ubHkgc2V0IHRvIHRydWUgaWYgeW91IGRvbid0IG5lZWQgdGhlIGFiaWxpdHkgdG8gcm9sbCBiYWNrIGRlcGxveW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJ1bmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbiBjYXNlIG9mIHVzZUVmcywgdnBjIGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjO1xuXG4gIC8qKlxuICAgKiBJbiBjYXNlIG9mIHVzZUVmcywgdnBjIGlzIHJlcXVpcmVkXG4gICAqL1xuICByZWFkb25seSB1c2VFZnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBtZW1vcnlMaW1pdCBmb3IgbGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGJlZW4gcnVuIGJ5IEJ1Y2tldERlcGxveW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeUxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBlcGhlbWVyYWxTdG9yYWdlU2l6ZSBmb3IgbGFtYmRhIGZ1bmN0aW9uIHdoaWNoIGJlZW4gcnVuIGJ5IEJ1Y2tldERlcGxveW1lbnRcbiAgICovXG4gIHJlYWRvbmx5IGVwaGVtZXJhbFN0b3JhZ2VTaXplPzogU2l6ZTtcbn1cblxuLyoqXG4gKiBVcGxvYWRzIE5leHRKUy1idWlsdCBzdGF0aWMgYW5kIHB1YmxpYyBmaWxlcyB0byBTMy5cbiAqXG4gKiBXaWxsIHJld3JpdGUgQ2xvdWRGb3JtYXRpb24gcmVmZXJlbmNlcyB3aXRoIHRoZWlyIHJlc29sdmVkIHZhbHVlcyBhZnRlciB1cGxvYWRpbmcuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0SnNBc3NldHNEZXBsb3ltZW50IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIEJ1Y2tldCBjb250YWluaW5nIGFzc2V0cy5cbiAgICovXG4gIGJ1Y2tldDogczMuSUJ1Y2tldDtcblxuICAvKipcbiAgICogQXNzZXQgZGVwbG95bWVudHMgdG8gUzMuXG4gICAqL1xuICBwdWJsaWMgZGVwbG95bWVudHM6IEJ1Y2tldERlcGxveW1lbnRbXTtcbiAgcHVibGljIHJld3JpdGVyPzogTmV4dGpzUzNFbnZSZXdyaXRlcjtcblxuICBwdWJsaWMgc3RhdGljVGVtcERpcjogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCBwcm9wczogTmV4dGpzQXNzZXRzRGVwbG95bWVudFByb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuXG4gICAgdGhpcy5idWNrZXQgPSBwcm9wcy5idWNrZXQ7XG4gICAgdGhpcy5zdGF0aWNUZW1wRGlyID0gdGhpcy5wcmVwYXJlQXJjaGl2ZURpcmVjdG9yeSgpO1xuICAgIHRoaXMuZGVwbG95bWVudHMgPSB0aGlzLnVwbG9hZFMzQXNzZXRzKHRoaXMuc3RhdGljVGVtcERpcik7XG5cbiAgICAvLyBkbyByZXdyaXRlcyBvZiB1bnJlc29sdmVkIENESyB0b2tlbnMgaW4gc3RhdGljIGZpbGVzXG4gICAgaWYgKHRoaXMucHJvcHMuZW52aXJvbm1lbnQgJiYgIXRoaXMucHJvcHMuaXNQbGFjZWhvbGRlcikge1xuICAgICAgdGhpcy5yZXdyaXRlciA9IG5ldyBOZXh0anNTM0VudlJld3JpdGVyKHRoaXMsICdOZXh0anNTM0VudlJld3JpdGVyJywge1xuICAgICAgICAuLi5wcm9wcyxcbiAgICAgICAgczNCdWNrZXQ6IHRoaXMuYnVja2V0LFxuICAgICAgICBzM2tleXM6IHRoaXMuX2dldFN0YXRpY0ZpbGVzRm9yUmV3cml0ZSgpLFxuICAgICAgICByZXBsYWNlbWVudENvbmZpZzoge1xuICAgICAgICAgIGVudjogZ2V0UzNSZXBsYWNlVmFsdWVzKHRoaXMucHJvcHMuZW52aXJvbm1lbnQsIHRydWUpLFxuICAgICAgICB9LFxuICAgICAgICBkZWJ1ZzogZmFsc2UsXG4gICAgICAgIGNsb3VkZnJvbnREaXN0cmlidXRpb25JZDogdGhpcy5wcm9wcy5kaXN0cmlidXRpb24/LmRpc3RyaWJ1dGlvbklkLFxuICAgICAgfSk7XG4gICAgICAvLyB3YWl0IGZvciBzMyBhc3NldHMgdG8gYmUgdXBsb2FkZWQgZmlyc3QgYmVmb3JlIHJ1bm5pbmdcbiAgICAgIHRoaXMucmV3cml0ZXIubm9kZS5hZGREZXBlbmRlbmN5KC4uLnRoaXMuZGVwbG95bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFycmFuZ2UgZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgUzMgYXNzZXQgZGVwbG95bWVudHNcbiAgLy8gc2hvdWxkIGNvbnRhaW4gX25leHQvc3RhdGljIGFuZCAuLyBmb3IgcHVibGljIGZpbGVzXG4gIHByb3RlY3RlZCBwcmVwYXJlQXJjaGl2ZURpcmVjdG9yeSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IGFyY2hpdmVEaXIgPSB0aGlzLnByb3BzLnRlbXBCdWlsZERpclxuICAgICAgPyBwYXRoLnJlc29sdmUocGF0aC5qb2luKHRoaXMucHJvcHMudGVtcEJ1aWxkRGlyLCAnc3RhdGljJykpXG4gICAgICA6IGZzLm1rZHRlbXBTeW5jKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ3N0YXRpYy0nKSk7XG4gICAgZnMubWtkaXJwU3luYyhhcmNoaXZlRGlyKTtcblxuICAgIC8vIHRoZW9yZXRpY2FsbHkgd2UgY291bGQgbW92ZSB0aGUgZmlsZXMgaW5zdGVhZCBvZiBjb3B5IGZvciBzcGVlZC4uLlxuXG4gICAgLy8gcGF0aCB0byBwdWJsaWMgZm9sZGVyOyByb290IHN0YXRpYyBhc3NldHNcbiAgICBjb25zdCBzdGF0aWNEaXIgPSB0aGlzLnByb3BzLm5leHRCdWlsZC5uZXh0U3RhdGljRGlyO1xuXG4gICAgaWYgKCF0aGlzLnByb3BzLmlzUGxhY2Vob2xkZXIgJiYgZnMuZXhpc3RzU3luYyhzdGF0aWNEaXIpKSB7XG4gICAgICAvLyBjb3B5IHB1YmxpYytzdGF0aWMgZmlsZXMgdG8gcm9vdFxuICAgICAgZnMuY29weVN5bmModGhpcy5wcm9wcy5uZXh0QnVpbGQubmV4dFN0YXRpY0RpciwgYXJjaGl2ZURpciwge1xuICAgICAgICByZWN1cnNpdmU6IHRydWUsXG4gICAgICAgIGRlcmVmZXJlbmNlOiB0cnVlLFxuICAgICAgICBwcmVzZXJ2ZVRpbWVzdGFtcHM6IHRydWUsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJjaGl2ZURpcjtcbiAgfVxuXG4gIHByaXZhdGUgdXBsb2FkUzNBc3NldHMoYXJjaGl2ZURpcjogc3RyaW5nKSB7XG4gICAgLy8gemlwIHVwIGJ1Y2tldCBjb250ZW50cyBhbmQgdXBsb2FkIHRvIGJ1Y2tldFxuICAgIGNvbnN0IGFyY2hpdmVaaXBGaWxlUGF0aCA9IGNyZWF0ZUFyY2hpdmUoe1xuICAgICAgZGlyZWN0b3J5OiBhcmNoaXZlRGlyLFxuICAgICAgemlwRmlsZU5hbWU6ICdhc3NldHMuemlwJyxcbiAgICAgIHppcE91dERpcjogcGF0aC5qb2luKHRoaXMuc3RhdGljVGVtcERpciwgJ2Fzc2V0cycpLFxuICAgICAgY29tcHJlc3Npb25MZXZlbDogdGhpcy5wcm9wcy5jb21wcmVzc2lvbkxldmVsLFxuICAgICAgcXVpZXQ6IHRoaXMucHJvcHMucXVpZXQsXG4gICAgfSk7XG4gICAgaWYgKCFhcmNoaXZlWmlwRmlsZVBhdGgpIHJldHVybiBbXTtcblxuICAgIGNvbnN0IG1heEFnZSA9IHRoaXMucHJvcHMuY2FjaGVQb2xpY2llcz8uc3RhdGljTWF4QWdlRGVmYXVsdD8udG9TZWNvbmRzKCkgPz8gREVGQVVMVF9TVEFUSUNfTUFYX0FHRTtcbiAgICBjb25zdCBzdGFsZVdoaWxlUmV2YWxpZGF0ZSA9XG4gICAgICB0aGlzLnByb3BzLmNhY2hlUG9saWNpZXM/LnN0YXRpY1N0YWxlV2hpbGVSZXZhbGlkYXRlRGVmYXVsdD8udG9TZWNvbmRzKCkgPz8gREVGQVVMVF9TVEFUSUNfU1RBTEVfV0hJTEVfUkVWQUxJREFURTtcbiAgICBjb25zdCBjYWNoZUNvbnRyb2wgPSBDYWNoZUNvbnRyb2wuZnJvbVN0cmluZyhcbiAgICAgIGBwdWJsaWMsbWF4LWFnZT0ke21heEFnZX0sc3RhbGUtd2hpbGUtcmV2YWxpZGF0ZT0ke3N0YWxlV2hpbGVSZXZhbGlkYXRlfSxpbW11dGFibGVgXG4gICAgKTtcbiAgICBjb25zdCBkZXBsb3ltZW50ID0gbmV3IEJ1Y2tldERlcGxveW1lbnQodGhpcywgJ05leHRTdGF0aWNBc3NldHNTM0RlcGxveW1lbnQnLCB7XG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICBjYWNoZUNvbnRyb2w6IFtjYWNoZUNvbnRyb2xdLFxuICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChhcmNoaXZlWmlwRmlsZVBhdGgpXSxcbiAgICAgIGRpc3RyaWJ1dGlvbjogdGhpcy5wcm9wcy5kaXN0cmlidXRpb24sXG4gICAgICBwcnVuZTogdGhpcy5wcm9wcy5wcnVuZSxcbiAgICAgIHVzZUVmczogdGhpcy5wcm9wcy51c2VFZnMsXG4gICAgICB2cGM6IHRoaXMucHJvcHMudnBjLFxuICAgICAgbWVtb3J5TGltaXQ6IHRoaXMucHJvcHMubWVtb3J5TGltaXQsXG4gICAgICBlcGhlbWVyYWxTdG9yYWdlU2l6ZTogdGhpcy5wcm9wcy5lcGhlbWVyYWxTdG9yYWdlU2l6ZSxcbiAgICB9KTtcblxuICAgIHJldHVybiBbZGVwbG95bWVudF07XG4gIH1cblxuICBwcml2YXRlIF9nZXRTdGF0aWNGaWxlc0ZvclJld3JpdGUoKSB7XG4gICAgY29uc3Qgc3RhdGljRGlyID0gdGhpcy5zdGF0aWNUZW1wRGlyO1xuICAgIGNvbnN0IHMza2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoc3RhdGljRGlyKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICBsaXN0RGlyZWN0b3J5KHN0YXRpY0RpcikuZm9yRWFjaCgoZmlsZSkgPT4ge1xuICAgICAgY29uc3QgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShzdGF0aWNEaXIsIGZpbGUpO1xuXG4gICAgICAvLyBza2lwIGJvZ3VzIHN5c3RlbSBmaWxlc1xuICAgICAgaWYgKHJlbGF0aXZlUGF0aC5lbmRzV2l0aCgnLkRTX1N0b3JlJykpIHJldHVybjtcblxuICAgICAgLy8gaXMgdGhpcyBmaWxlIGEgZ2xvYiBtYXRjaD9cbiAgICAgIGlmICghbWljcm9tYXRjaC5pc01hdGNoKHJlbGF0aXZlUGF0aCwgcmVwbGFjZVRva2VuR2xvYnMsIHsgZG90OiB0cnVlIH0pKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHMza2V5cy5wdXNoKHJlbGF0aXZlUGF0aCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHMza2V5cztcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbGlzdERpcmVjdG9yeShkaXI6IHN0cmluZykge1xuICBjb25zdCBmaWxlTGlzdDogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcHVibGljRmlsZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIpO1xuICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIHB1YmxpY0ZpbGVzKSB7XG4gICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4oZGlyLCBmaWxlbmFtZSk7XG4gICAgY29uc3Qgc3RhdCA9IGZzLnN0YXRTeW5jKGZpbGVwYXRoKTtcbiAgICBpZiAoc3RhdC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICBmaWxlTGlzdC5wdXNoKC4uLmxpc3REaXJlY3RvcnkoZmlsZXBhdGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsZUxpc3QucHVzaChmaWxlcGF0aCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGVMaXN0O1xufVxuIl19