UNPKG

cdk-nextjs

Version:

Deploy Next.js apps on AWS with CDK

108 lines 19.2 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.NextjsAssetsDeployment = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const posix_1 = require("path/posix"); const aws_cdk_lib_1 = require("aws-cdk-lib"); const aws_lambda_1 = require("aws-cdk-lib/aws-lambda"); const constructs_1 = require("constructs"); const constants_1 = require("./constants"); const get_architecture_1 = require("./utils/get-architecture"); /** * Deploys static assets to S3 and cache assets to EFS in Lambda Custom Resource. */ class NextjsAssetsDeployment extends constructs_1.Construct { constructor(scope, id, props) { super(scope, id); this.props = props; this.dockerImageFunction = this.createFunction(); this.customResource = this.createCustomResource(); } createFunction() { const fn = new aws_lambda_1.DockerImageFunction(this, "Fn", { architecture: (0, get_architecture_1.getLambdaArchitecture)(), code: this.props.dockerImageCode, memorySize: 2048, filesystem: aws_lambda_1.FileSystem.fromEfsAccessPoint(this.props.accessPoint, constants_1.MOUNT_PATH), vpc: this.props.vpc, timeout: aws_cdk_lib_1.Duration.minutes(5), ...this.props.overrides?.dockerImageFunctionProps, }); if (this.props.debug !== false) { fn.addEnvironment("DEBUG", "1"); } if (this.props.staticAssetsBucket) { this.props.staticAssetsBucket.grantReadWrite(fn); } return fn; } createCustomResource() { const root = "/app"; const actions = []; if (this.props.staticAssetsBucket?.bucketName) { // Prepare the destination key prefix with basePath when available const staticKeyPrefix = this.props.basePath ? `${this.props.basePath.replace(/^\//, "")}/_next/static` : "_next/static"; actions.push( // static files { type: "fs-to-s3", sourcePath: (0, posix_1.join)(root, constants_1.STATIC_PATH), destinationBucketName: this.props.staticAssetsBucket.bucketName, destinationKeyPrefix: staticKeyPrefix, }, // public directory to s3 for CloudFront -> S3 { type: "fs-to-s3", sourcePath: (0, posix_1.join)(root, constants_1.PUBLIC_PATH), destinationBucketName: this.props.staticAssetsBucket.bucketName, }); } actions.push( // full route cache - https://nextjs.org/docs/app/building-your-application/caching#full-route-cache { type: "fs-to-fs", sourcePath: (0, posix_1.join)(root, ".next", "standalone", this.props.relativePathToPackage || "", constants_1.FULL_ROUTE_CACHE_PATH), destinationPath: (0, posix_1.join)(constants_1.MOUNT_PATH, this.props.buildId, constants_1.FULL_ROUTE_CACHE_PATH), // only files with these extensions are needed in EFS FileSystem cache // since these files are the only ones updated by Next.js during runtime. // other files like .js and .nft.json files are static per deployment includeExtensions: ["body", "html", "rsc", "meta"], }, // after `next build` data cache https://nextjs.org/docs/app/building-your-application/caching#data-cache // exists at top level .next/cache so we need to copy into relativePathToPackage // normalized path { type: "fs-to-fs", sourcePath: (0, posix_1.join)(root, constants_1.DATA_CACHE_PATH), destinationPath: (0, posix_1.join)(constants_1.MOUNT_PATH, this.props.buildId, constants_1.DATA_CACHE_PATH), }, // public directory to EFS for needed optimizing images in public directory // we don't load these into compute to save on image size { type: "fs-to-fs", sourcePath: (0, posix_1.join)(root, constants_1.PUBLIC_PATH), destinationPath: (0, posix_1.join)(constants_1.MOUNT_PATH, this.props.buildId, constants_1.PUBLIC_PATH), }); const properties = { actions, buildId: this.props.buildId, // ensures this CR runs each time new builder image buildImageDigest: this.props.buildImageDigest, imageCachePath: (0, posix_1.join)(constants_1.MOUNT_PATH, this.props.buildId, constants_1.IMAGE_CACHE_PATH), nextjsType: this.props.nextjsType, }; return new aws_cdk_lib_1.CustomResource(this, "CustomResource", { properties, resourceType: "Custom::NextjsAssetsDeployment", serviceToken: this.dockerImageFunction.functionArn, ...this.props.overrides?.customResourceProps, }); } } exports.NextjsAssetsDeployment = NextjsAssetsDeployment; _a = JSII_RTTI_SYMBOL_1; NextjsAssetsDeployment[_a] = { fqn: "cdk-nextjs.NextjsAssetsDeployment", version: "0.4.10" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWFzc2V0cy1kZXBsb3ltZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL25leHRqcy1hc3NldHMtZGVwbG95bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLHNDQUFrQztBQUNsQyw2Q0FBdUQ7QUFHdkQsdURBSWdDO0FBRWhDLDJDQUF1QztBQUN2QywyQ0FRcUI7QUFLckIsK0RBQWlFO0FBNEVqRTs7R0FFRztBQUNILE1BQWEsc0JBQXVCLFNBQVEsc0JBQVM7SUFNbkQsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBa0M7UUFFbEMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDcEQsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxFQUFFLEdBQUcsSUFBSSxnQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFO1lBQzdDLFlBQVksRUFBRSxJQUFBLHdDQUFxQixHQUFFO1lBQ3JDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWU7WUFDaEMsVUFBVSxFQUFFLElBQUk7WUFDaEIsVUFBVSxFQUFFLHVCQUFVLENBQUMsa0JBQWtCLENBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUN0QixzQkFBVSxDQUNYO1lBQ0QsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRztZQUNuQixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsd0JBQXdCO1NBQ2xELENBQUMsQ0FBQztRQUNILElBQUks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Z0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7WUFDN0MsY0FBYyxFQUFFLElBQUEsWUFBSSxFQUFDLHNCQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsNEJBQWdCLENBQUM7WUFDdEUsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVTtTQUNsQyxDQUFDO1FBQ0YsT0FBTyxJQUFJLDRCQUFjLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQ2hELFVBQVU7WUFDVixZQUFZLEVBQUUsZ0NBQWdDO1lBQzlDLFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVztZQUNsRCxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLG1CQUFtQjtTQUM3QyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQXBISCx3REFxSEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBqb2luIH0gZnJvbSBcInBhdGgvcG9zaXhcIjtcbmltcG9ydCB7IEN1c3RvbVJlc291cmNlLCBEdXJhdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSVZwYyB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWMyXCI7XG5pbXBvcnQgeyBBY2Nlc3NQb2ludCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWZzXCI7XG5pbXBvcnQge1xuICBEb2NrZXJJbWFnZUNvZGUsXG4gIERvY2tlckltYWdlRnVuY3Rpb24sXG4gIEZpbGVTeXN0ZW0sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgREFUQV9DQUNIRV9QQVRILFxuICBGVUxMX1JPVVRFX0NBQ0hFX1BBVEgsXG4gIElNQUdFX0NBQ0hFX1BBVEgsXG4gIE1PVU5UX1BBVEgsXG4gIE5leHRqc1R5cGUsXG4gIFBVQkxJQ19QQVRILFxuICBTVEFUSUNfUEFUSCxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBPcHRpb25hbEN1c3RvbVJlc291cmNlUHJvcHMgfSBmcm9tIFwiLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbEN1c3RvbVJlc291cmNlUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsRG9ja2VySW1hZ2VGdW5jdGlvblByb3BzIH0gZnJvbSBcIi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxEb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0J1aWxkIH0gZnJvbSBcIi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4vcm9vdC1jb25zdHJ1Y3RzL25leHRqcy1iYXNlLWNvbnN0cnVjdFwiO1xuaW1wb3J0IHsgZ2V0TGFtYmRhQXJjaGl0ZWN0dXJlIH0gZnJvbSBcIi4vdXRpbHMvZ2V0LWFyY2hpdGVjdHVyZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Fzc2V0RGVwbG95bWVudE92ZXJyaWRlcyB7XG4gIC8qKlxuICAgKiBQcm9wcyB0aGF0IGRlZmluZSB0aGUgY3VzdG9tIHJlc291cmNlXG4gICAqL1xuICByZWFkb25seSBjdXN0b21SZXNvdXJjZVByb3BzPzogT3B0aW9uYWxDdXN0b21SZXNvdXJjZVByb3BzO1xuICAvLyBOT1RFOiB3ZSBkb24ndCBvZmZlciBvdmVycmlkaW5nIGBjdXN0b21SZXNvdXJjZVByb3BlcnRpZXNgIHNpbmNlIGpzaWkgZG9lc24ndCBzdXBwb3J0IHVuaW9uIHR5cGVzXG4gIC8vIHJlYWRvbmx5IGN1c3RvbVJlc291cmNlUHJvcGVydGllcz86IE9wdGlvbmFsU3RhdGljQXNzZXRzQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzXG4gIHJlYWRvbmx5IGRvY2tlckltYWdlRnVuY3Rpb25Qcm9wcz86IE9wdGlvbmFsRG9ja2VySW1hZ2VGdW5jdGlvblByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Fzc2V0c0RlcGxveW1lbnRQcm9wcyB7XG4gIHJlYWRvbmx5IGFjY2Vzc1BvaW50OiBBY2Nlc3NQb2ludDtcbiAgLyoqXG4gICAqIFByZWZpeCB0byB0aGUgVVJJIHBhdGggdGhlIGFwcCB3aWxsIGJlIHNlcnZlZCBhdC5cbiAgICogQGV4YW1wbGUgXCIvbXktYmFzZS1wYXRoXCJcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICByZWFkb25seSBidWlsZElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCdWlsZC5idWlsZEltYWdlRGlnZXN0fVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRJbWFnZURpZ2VzdDogc3RyaW5nO1xuICAvKipcbiAgICogSWYgdHJ1ZSwgbG9ncyBkZXRhaWxzIGluIGN1c3RvbSByZXNvdXJjZSBsYW1iZGFcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBkb2NrZXJJbWFnZUNvZGU6IERvY2tlckltYWdlQ29kZTsgLy8gVE9ETzogcmVtb3ZlIGFuZCBidWlsZCBmcm9tIGNvbW1vbiBidWlsZGVyIGJhc2U/XG4gIHJlYWRvbmx5IG5leHRqc1R5cGU6IE5leHRqc1R5cGU7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Fzc2V0RGVwbG95bWVudE92ZXJyaWRlcztcbiAgLyoqXG4gICAqIEBzZWUge0BsaW5rIE5leHRqc0Jhc2VQcm9wcy5yZWxhdGl2ZVBhdGhUb1BhY2thZ2V9XG4gICAqL1xuICByZWFkb25seSByZWxhdGl2ZVBhdGhUb1BhY2thZ2U/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSZXF1aXJlZCBmb3IgYE5leHRqc1R5cGUuR2xvYmFsRnVuY3Rpb25zYCBhbmQgYE5leHRqc1R5cGUuR2xvYmFsQ29udGFpbmVyc2BcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldD86IEJ1Y2tldDtcbiAgcmVhZG9ubHkgdnBjOiBJVnBjO1xufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZzVG9TM0FjdGlvbiB7XG4gIHR5cGU6IFwiZnMtdG8tczNcIjtcbiAgZGVzdGluYXRpb25CdWNrZXROYW1lOiBzdHJpbmc7XG4gIGRlc3RpbmF0aW9uS2V5UHJlZml4Pzogc3RyaW5nO1xuICBzb3VyY2VQYXRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZzVG9Gc0FjdGlvbiB7XG4gIHR5cGU6IFwiZnMtdG8tZnNcIjtcbiAgc291cmNlUGF0aDogc3RyaW5nO1xuICBkZXN0aW5hdGlvblBhdGg6IHN0cmluZztcbiAgaW5jbHVkZUV4dGVuc2lvbnM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0aWNBc3NldHNDdXN0b21SZXNvdXJjZVByb3BlcnRpZXMge1xuICBhY3Rpb25zOiAoRnNUb1MzQWN0aW9uIHwgRnNUb0ZzQWN0aW9uKVtdO1xuICBidWlsZElkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAc2VlIHtAbGluayBOZXh0anNCdWlsZC5idWlsZEltYWdlRGlnZXN0fVxuICAgKi9cbiAgYnVpbGRJbWFnZURpZ2VzdDogc3RyaW5nO1xuICBpbWFnZUNhY2hlUGF0aDogc3RyaW5nO1xuICBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xufVxuXG4vKipcbiAqIERlcGxveXMgc3RhdGljIGFzc2V0cyB0byBTMyBhbmQgY2FjaGUgYXNzZXRzIHRvIEVGUyBpbiBMYW1iZGEgQ3VzdG9tIFJlc291cmNlLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQXNzZXRzRGVwbG95bWVudCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGN1c3RvbVJlc291cmNlOiBDdXN0b21SZXNvdXJjZTtcbiAgZG9ja2VySW1hZ2VGdW5jdGlvbjogRG9ja2VySW1hZ2VGdW5jdGlvbjtcblxuICBwcml2YXRlIHByb3BzOiBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHM7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBOZXh0anNBc3NldHNEZXBsb3ltZW50UHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZG9ja2VySW1hZ2VGdW5jdGlvbiA9IHRoaXMuY3JlYXRlRnVuY3Rpb24oKTtcbiAgICB0aGlzLmN1c3RvbVJlc291cmNlID0gdGhpcy5jcmVhdGVDdXN0b21SZXNvdXJjZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVGdW5jdGlvbigpIHtcbiAgICBjb25zdCBmbiA9IG5ldyBEb2NrZXJJbWFnZUZ1bmN0aW9uKHRoaXMsIFwiRm5cIiwge1xuICAgICAgYXJjaGl0ZWN0dXJlOiBnZXRMYW1iZGFBcmNoaXRlY3R1cmUoKSxcbiAgICAgIGNvZGU6IHRoaXMucHJvcHMuZG9ja2VySW1hZ2VDb2RlLFxuICAgICAgbWVtb3J5U2l6ZTogMjA0OCxcbiAgICAgIGZpbGVzeXN0ZW06IEZpbGVTeXN0ZW0uZnJvbUVmc0FjY2Vzc1BvaW50KFxuICAgICAgICB0aGlzLnByb3BzLmFjY2Vzc1BvaW50LFxuICAgICAgICBNT1VOVF9QQVRILFxuICAgICAgKSxcbiAgICAgIHZwYzogdGhpcy5wcm9wcy52cGMsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmRvY2tlckltYWdlRnVuY3Rpb25Qcm9wcyxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5wcm9wcy5kZWJ1ZyAhPT0gZmFsc2UpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KFwiREVCVUdcIiwgXCIxXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQpIHtcbiAgICAgIHRoaXMucHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZFdyaXRlKGZuKTtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDdXN0b21SZXNvdXJjZSgpIHtcbiAgICBjb25zdCByb290ID0gXCIvYXBwXCI7XG4gICAgY29uc3QgYWN0aW9uczogU3RhdGljQXNzZXRzQ3VzdG9tUmVzb3VyY2VQcm9wZXJ0aWVzW1wiYWN0aW9uc1wiXSA9IFtdO1xuICAgIGlmICh0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldD8uYnVja2V0TmFtZSkge1xuICAgICAgLy8gUHJlcGFyZSB0aGUgZGVzdGluYXRpb24ga2V5IHByZWZpeCB3aXRoIGJhc2VQYXRoIHdoZW4gYXZhaWxhYmxlXG4gICAgICBjb25zdCBzdGF0aWNLZXlQcmVmaXggPSB0aGlzLnByb3BzLmJhc2VQYXRoXG4gICAgICAgID8gYCR7dGhpcy5wcm9wcy5iYXNlUGF0aC5yZXBsYWNlKC9eXFwvLywgXCJcIil9L19uZXh0L3N0YXRpY2BcbiAgICAgICAgOiBcIl9uZXh0L3N0YXRpY1wiO1xuXG4gICAgICBhY3Rpb25zLnB1c2goXG4gICAgICAgIC8vIHN0YXRpYyBmaWxlc1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJmcy10by1zM1wiLFxuICAgICAgICAgIHNvdXJjZVBhdGg6IGpvaW4ocm9vdCwgU1RBVElDX1BBVEgpLFxuICAgICAgICAgIGRlc3RpbmF0aW9uQnVja2V0TmFtZTogdGhpcy5wcm9wcy5zdGF0aWNBc3NldHNCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgICAgICBkZXN0aW5hdGlvbktleVByZWZpeDogc3RhdGljS2V5UHJlZml4LFxuICAgICAgICB9LFxuICAgICAgICAvLyBwdWJsaWMgZGlyZWN0b3J5IHRvIHMzIGZvciBDbG91ZEZyb250IC0+IFMzXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiBcImZzLXRvLXMzXCIsXG4gICAgICAgICAgc291cmNlUGF0aDogam9pbihyb290LCBQVUJMSUNfUEFUSCksXG4gICAgICAgICAgZGVzdGluYXRpb25CdWNrZXROYW1lOiB0aGlzLnByb3BzLnN0YXRpY0Fzc2V0c0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gICAgYWN0aW9ucy5wdXNoKFxuICAgICAgLy8gZnVsbCByb3V0ZSBjYWNoZSAtIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9idWlsZGluZy15b3VyLWFwcGxpY2F0aW9uL2NhY2hpbmcjZnVsbC1yb3V0ZS1jYWNoZVxuICAgICAge1xuICAgICAgICB0eXBlOiBcImZzLXRvLWZzXCIsXG4gICAgICAgIHNvdXJjZVBhdGg6IGpvaW4oXG4gICAgICAgICAgcm9vdCxcbiAgICAgICAgICBcIi5uZXh0XCIsXG4gICAgICAgICAgXCJzdGFuZGFsb25lXCIsXG4gICAgICAgICAgdGhpcy5wcm9wcy5yZWxhdGl2ZVBhdGhUb1BhY2thZ2UgfHwgXCJcIixcbiAgICAgICAgICBGVUxMX1JPVVRFX0NBQ0hFX1BBVEgsXG4gICAgICAgICksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbihcbiAgICAgICAgICBNT1VOVF9QQVRILFxuICAgICAgICAgIHRoaXMucHJvcHMuYnVpbGRJZCxcbiAgICAgICAgICBGVUxMX1JPVVRFX0NBQ0hFX1BBVEgsXG4gICAgICAgICksXG4gICAgICAgIC8vIG9ubHkgZmlsZXMgd2l0aCB0aGVzZSBleHRlbnNpb25zIGFyZSBuZWVkZWQgaW4gRUZTIEZpbGVTeXN0ZW0gY2FjaGVcbiAgICAgICAgLy8gc2luY2UgdGhlc2UgZmlsZXMgYXJlIHRoZSBvbmx5IG9uZXMgdXBkYXRlZCBieSBOZXh0LmpzIGR1cmluZyBydW50aW1lLlxuICAgICAgICAvLyBvdGhlciBmaWxlcyBsaWtlIC5qcyBhbmQgLm5mdC5qc29uIGZpbGVzIGFyZSBzdGF0aWMgcGVyIGRlcGxveW1lbnRcbiAgICAgICAgaW5jbHVkZUV4dGVuc2lvbnM6IFtcImJvZHlcIiwgXCJodG1sXCIsIFwicnNjXCIsIFwibWV0YVwiXSxcbiAgICAgIH0sXG4gICAgICAvLyBhZnRlciBgbmV4dCBidWlsZGAgZGF0YSBjYWNoZSBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYnVpbGRpbmcteW91ci1hcHBsaWNhdGlvbi9jYWNoaW5nI2RhdGEtY2FjaGVcbiAgICAgIC8vIGV4aXN0cyBhdCB0b3AgbGV2ZWwgLm5leHQvY2FjaGUgc28gd2UgbmVlZCB0byBjb3B5IGludG8gcmVsYXRpdmVQYXRoVG9QYWNrYWdlXG4gICAgICAvLyBub3JtYWxpemVkIHBhdGhcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJmcy10by1mc1wiLFxuICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIERBVEFfQ0FDSEVfUEFUSCksXG4gICAgICAgIGRlc3RpbmF0aW9uUGF0aDogam9pbihNT1VOVF9QQVRILCB0aGlzLnByb3BzLmJ1aWxkSWQsIERBVEFfQ0FDSEVfUEFUSCksXG4gICAgICB9LFxuICAgICAgLy8gcHVibGljIGRpcmVjdG9yeSB0byBFRlMgZm9yIG5lZWRlZCBvcHRpbWl6aW5nIGltYWdlcyBpbiBwdWJsaWMgZGlyZWN0b3J5XG4gICAgICAvLyB3ZSBkb24ndCBsb2FkIHRoZXNlIGludG8gY29tcHV0ZSB0byBzYXZlIG9uIGltYWdlIHNpemVcbiAgICAgIHtcbiAgICAgICAgdHlwZTogXCJmcy10by1mc1wiLFxuICAgICAgICBzb3VyY2VQYXRoOiBqb2luKHJvb3QsIFBVQkxJQ19QQVRIKSxcbiAgICAgICAgZGVzdGluYXRpb25QYXRoOiBqb2luKE1PVU5UX1BBVEgsIHRoaXMucHJvcHMuYnVpbGRJZCwgUFVCTElDX1BBVEgpLFxuICAgICAgfSxcbiAgICAgIC8vIGltYWdlcyBhcmUgb3B0aW1pemVkIGF0IHJ1bnRpbWUgc28gbm90aGluZyB0byBkZXBsb3lcbiAgICApO1xuICAgIGNvbnN0IHByb3BlcnRpZXM6IFN0YXRpY0Fzc2V0c0N1c3RvbVJlc291cmNlUHJvcGVydGllcyA9IHtcbiAgICAgIGFjdGlvbnMsXG4gICAgICBidWlsZElkOiB0aGlzLnByb3BzLmJ1aWxkSWQsXG4gICAgICAvLyBlbnN1cmVzIHRoaXMgQ1IgcnVucyBlYWNoIHRpbWUgbmV3IGJ1aWxkZXIgaW1hZ2VcbiAgICAgIGJ1aWxkSW1hZ2VEaWdlc3Q6IHRoaXMucHJvcHMuYnVpbGRJbWFnZURpZ2VzdCxcbiAgICAgIGltYWdlQ2FjaGVQYXRoOiBqb2luKE1PVU5UX1BBVEgsIHRoaXMucHJvcHMuYnVpbGRJZCwgSU1BR0VfQ0FDSEVfUEFUSCksXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLnByb3BzLm5leHRqc1R5cGUsXG4gICAgfTtcbiAgICByZXR1cm4gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIFwiQ3VzdG9tUmVzb3VyY2VcIiwge1xuICAgICAgcHJvcGVydGllcyxcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206Ok5leHRqc0Fzc2V0c0RlcGxveW1lbnRcIixcbiAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5kb2NrZXJJbWFnZUZ1bmN0aW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmN1c3RvbVJlc291cmNlUHJvcHMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==