projen
Version:
CDK for software projects
145 lines • 22.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.WorkflowActions = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const actions_const_1 = require("./actions.const");
const constants_1 = require("./constants");
const util_1 = require("./private/util");
const workflow_steps_1 = require("./workflow-steps");
const path_1 = require("../util/path");
const REPO = (0, util_1.context)("github.repository");
const RUN_ID = (0, util_1.context)("github.run_id");
const SERVER_URL = (0, util_1.context)("github.server_url");
const RUN_URL = `${SERVER_URL}/${REPO}/actions/runs/${RUN_ID}`;
const GIT_PATCH_FILE_DEFAULT = "repo.patch";
const RUNNER_TEMP = "${{ runner.temp }}";
/**
* A set of utility functions for creating GitHub actions in workflows.
*/
class WorkflowActions {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.WorkflowActions", version: "0.103.12" };
/**
* Creates a .patch file from the current git diff and uploads it as an
* artifact. Use `checkoutWithPatch` to download and apply in another job.
*
* If a patch was uploaded, the action can optionally fail the job.
*
* @param options Options
* @returns Job steps
*/
static uploadGitPatch(options) {
const MUTATIONS_FOUND = `steps.${options.stepId}.outputs.${options.outputName}`;
const GIT_PATCH_FILE = options.patchFile ?? GIT_PATCH_FILE_DEFAULT;
const steps = [
{
id: options.stepId,
name: options.stepName ?? "Find mutations",
shell: "bash",
run: [
"git add .",
`git diff --staged --patch --exit-code > ${GIT_PATCH_FILE} || echo "${options.outputName}=true" >> $GITHUB_OUTPUT`,
].join("\n"),
// always run from root of repository
// overrides default working directory which is set by some workflows using this function
workingDirectory: "./",
},
workflow_steps_1.WorkflowSteps.uploadArtifact({
if: MUTATIONS_FOUND,
name: "Upload patch",
with: {
name: GIT_PATCH_FILE,
path: GIT_PATCH_FILE,
includeHiddenFiles: (0, path_1.isHiddenPath)(GIT_PATCH_FILE) ? true : undefined,
},
}),
];
if (options.mutationError) {
steps.push({
name: "Fail build on mutation",
if: MUTATIONS_FOUND,
run: [
`echo "::error::${options.mutationError}"`,
`cat ${GIT_PATCH_FILE}`,
"exit 1",
].join("\n"),
});
}
return steps;
}
/**
* Checks out a repository and applies a git patch that was created using
* `uploadGitPatch`.
*
* @param options Options
* @returns Job steps
*/
static checkoutWithPatch(options = {}) {
const { patchFile, ...restOfOptions } = options;
const GIT_PATCH_FILE = options.patchFile ?? GIT_PATCH_FILE_DEFAULT;
return [
workflow_steps_1.WorkflowSteps.checkout({ with: restOfOptions }),
{
name: "Download patch",
uses: actions_const_1.GitHubActions.ACTIONS_DOWNLOAD_ARTIFACT,
with: { name: GIT_PATCH_FILE, path: RUNNER_TEMP },
},
{
name: "Apply patch",
run: `[ -s ${RUNNER_TEMP}/${GIT_PATCH_FILE} ] && git apply ${RUNNER_TEMP}/${GIT_PATCH_FILE} || echo "Empty patch. Skipping."`,
},
];
}
/**
* A step that creates a pull request based on the current repo state.
*
* @param options Options
* @returns Job steps
*/
static createPullRequest(options) {
const workflowName = options.workflowName;
const branchName = options.branchName ?? `github-actions/${workflowName}`;
const stepId = options.stepId ?? "create-pr";
const stepName = options.stepName ?? "Create Pull Request";
const gitIdentity = options.gitIdentity ?? constants_1.DEFAULT_GITHUB_ACTIONS_USER;
const committer = `${gitIdentity.name} <${gitIdentity.email}>`;
const pullRequestDescription = options.pullRequestDescription
.trimEnd()
.endsWith(".")
? options.pullRequestDescription.trimEnd()
: `${options.pullRequestDescription.trimEnd()}.`;
const title = options.pullRequestTitle;
const description = [
`${pullRequestDescription} See details in [workflow run].`,
"",
`[Workflow Run]: ${RUN_URL}`,
"",
"------",
"",
`*Automatically created by projen via the "${workflowName}" workflow*`,
].join("\n");
return [
{
name: stepName,
id: stepId,
uses: actions_const_1.GitHubActions.PETER_EVANS_CREATE_PULL_REQUEST,
with: {
token: options.credentials?.tokenRef,
"commit-message": `${title}\n\n${description}`,
branch: branchName,
base: options.baseBranch,
title: title,
labels: options.labels?.join(",") || undefined,
assignees: options.assignees?.join(",") || undefined,
body: description,
author: committer,
committer: committer,
signoff: options.signoff ?? true,
"add-paths": options.addPaths?.join("\n") || undefined,
"delete-branch": options.deleteBranch ?? undefined,
},
},
];
}
}
exports.WorkflowActions = WorkflowActions;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctYWN0aW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9naXRodWIvd29ya2Zsb3ctYWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQ0EsbURBQWdEO0FBQ2hELDJDQUEwRDtBQUMxRCx5Q0FBeUM7QUFFekMscURBQWlEO0FBRWpELHVDQUE0QztBQUU1QyxNQUFNLElBQUksR0FBRyxJQUFBLGNBQU8sRUFBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQzFDLE1BQU0sTUFBTSxHQUFHLElBQUEsY0FBTyxFQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUEsY0FBTyxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDaEQsTUFBTSxPQUFPLEdBQUcsR0FBRyxVQUFVLElBQUksSUFBSSxpQkFBaUIsTUFBTSxFQUFFLENBQUM7QUFDL0QsTUFBTSxzQkFBc0IsR0FBRyxZQUFZLENBQUM7QUFDNUMsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUM7QUFFekM7O0dBRUc7QUFDSCxNQUFhLGVBQWU7O0lBQzFCOzs7Ozs7OztPQVFHO0lBQ0ksTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUE4QjtRQUN6RCxNQUFNLGVBQWUsR0FBRyxTQUFTLE9BQU8sQ0FBQyxNQUFNLFlBQVksT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hGLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxTQUFTLElBQUksc0JBQXNCLENBQUM7UUFFbkUsTUFBTSxLQUFLLEdBQWM7WUFDdkI7Z0JBQ0UsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNO2dCQUNsQixJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsSUFBSSxnQkFBZ0I7Z0JBQzFDLEtBQUssRUFBRSxNQUFNO2dCQUNiLEdBQUcsRUFBRTtvQkFDSCxXQUFXO29CQUNYLDJDQUEyQyxjQUFjLGFBQWEsT0FBTyxDQUFDLFVBQVUsMEJBQTBCO2lCQUNuSCxDQUFDLElBQUks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Q0FBNkMsWUFBWSxhQUFhO1NBQ3ZFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRWIsT0FBTztZQUNMO2dCQUNFLElBQUksRUFBRSxRQUFRO2dCQUNkLEVBQUUsRUFBRSxNQUFNO2dCQUNWLElBQUksRUFBRSw2QkFBYSxDQUFDLCtCQUErQjtnQkFDbkQsSUFBSSxFQUFFO29CQUNKLEtBQUssRUFBRSxPQUFPLENBQUMsV0FBVyxFQUFFLFFBQVE7b0JBQ3BDLGdCQUFnQixFQUFFLEdBQUcsS0FBSyxPQUFPLFdBQVcsRUFBRTtvQkFDOUMsTUFBTSxFQUFFLFVBQVU7b0JBQ2xCLElBQUksRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDeEIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLFNBQVM7b0JBQzlDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxTQUFTO29CQUNwRCxJQUFJLEVBQUUsV0FBVztvQkFDakIsTUFBTSxFQUFFLFNBQVM7b0JBQ2pCLFNBQVMsRUFBRSxTQUFTO29CQUNwQixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJO29CQUNoQyxXQUFXLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksU0FBUztvQkFDdEQsZUFBZSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksU0FBUztpQkFDbkQ7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDOztBQXJJSCwwQ0FzSUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEdpdElkZW50aXR5LCBHaXRodWJDcmVkZW50aWFscyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBHaXRIdWJBY3Rpb25zIH0gZnJvbSBcIi4vYWN0aW9ucy5jb25zdFwiO1xuaW1wb3J0IHsgREVGQVVMVF9HSVRIVUJfQUNUSU9OU19VU0VSIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjb250ZXh0IH0gZnJvbSBcIi4vcHJpdmF0ZS91dGlsXCI7XG5pbXBvcnQgdHlwZSB7IENoZWNrb3V0V2l0aCB9IGZyb20gXCIuL3dvcmtmbG93LXN0ZXBzXCI7XG5pbXBvcnQgeyBXb3JrZmxvd1N0ZXBzIH0gZnJvbSBcIi4vd29ya2Zsb3ctc3RlcHNcIjtcbmltcG9ydCB0eXBlIHsgSm9iU3RlcCB9IGZyb20gXCIuL3dvcmtmbG93cy1tb2RlbFwiO1xuaW1wb3J0IHsgaXNIaWRkZW5QYXRoIH0gZnJvbSBcIi4uL3V0aWwvcGF0aFwiO1xuXG5jb25zdCBSRVBPID0gY29udGV4dChcImdpdGh1Yi5yZXBvc2l0b3J5XCIpO1xuY29uc3QgUlVOX0lEID0gY29udGV4dChcImdpdGh1Yi5ydW5faWRcIik7XG5jb25zdCBTRVJWRVJfVVJMID0gY29udGV4dChcImdpdGh1Yi5zZXJ2ZXJfdXJsXCIpO1xuY29uc3QgUlVOX1VSTCA9IGAke1NFUlZFUl9VUkx9LyR7UkVQT30vYWN0aW9ucy9ydW5zLyR7UlVOX0lEfWA7XG5jb25zdCBHSVRfUEFUQ0hfRklMRV9ERUZBVUxUID0gXCJyZXBvLnBhdGNoXCI7XG5jb25zdCBSVU5ORVJfVEVNUCA9IFwiJHt7IHJ1bm5lci50ZW1wIH19XCI7XG5cbi8qKlxuICogQSBzZXQgb2YgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGNyZWF0aW5nIEdpdEh1YiBhY3Rpb25zIGluIHdvcmtmbG93cy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtmbG93QWN0aW9ucyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgLnBhdGNoIGZpbGUgZnJvbSB0aGUgY3VycmVudCBnaXQgZGlmZiBhbmQgdXBsb2FkcyBpdCBhcyBhblxuICAgKiBhcnRpZmFjdC4gVXNlIGBjaGVja291dFdpdGhQYXRjaGAgdG8gZG93bmxvYWQgYW5kIGFwcGx5IGluIGFub3RoZXIgam9iLlxuICAgKlxuICAgKiBJZiBhIHBhdGNoIHdhcyB1cGxvYWRlZCwgdGhlIGFjdGlvbiBjYW4gb3B0aW9uYWxseSBmYWlsIHRoZSBqb2IuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnNcbiAgICogQHJldHVybnMgSm9iIHN0ZXBzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwbG9hZEdpdFBhdGNoKG9wdGlvbnM6IFVwbG9hZEdpdFBhdGNoT3B0aW9ucyk6IEpvYlN0ZXBbXSB7XG4gICAgY29uc3QgTVVUQVRJT05TX0ZPVU5EID0gYHN0ZXBzLiR7b3B0aW9ucy5zdGVwSWR9Lm91dHB1dHMuJHtvcHRpb25zLm91dHB1dE5hbWV9YDtcbiAgICBjb25zdCBHSVRfUEFUQ0hfRklMRSA9IG9wdGlvbnMucGF0Y2hGaWxlID8/IEdJVF9QQVRDSF9GSUxFX0RFRkFVTFQ7XG5cbiAgICBjb25zdCBzdGVwczogSm9iU3RlcFtdID0gW1xuICAgICAge1xuICAgICAgICBpZDogb3B0aW9ucy5zdGVwSWQsXG4gICAgICAgIG5hbWU6IG9wdGlvbnMuc3RlcE5hbWUgPz8gXCJGaW5kIG11dGF0aW9uc1wiLFxuICAgICAgICBzaGVsbDogXCJiYXNoXCIsXG4gICAgICAgIHJ1bjogW1xuICAgICAgICAgIFwiZ2l0IGFkZCAuXCIsXG4gICAgICAgICAgYGdpdCBkaWZmIC0tc3RhZ2VkIC0tcGF0Y2ggLS1leGl0LWNvZGUgPiAke0dJVF9QQVRDSF9GSUxFfSB8fCBlY2hvIFwiJHtvcHRpb25zLm91dHB1dE5hbWV9PXRydWVcIiA+PiAkR0lUSFVCX09VVFBVVGAsXG4gICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgLy8gYWx3YXlzIHJ1biBmcm9tIHJvb3Qgb2YgcmVwb3NpdG9yeVxuICAgICAgICAvLyBvdmVycmlkZXMgZGVmYXVsdCB3b3JraW5nIGRpcmVjdG9yeSB3aGljaCBpcyBzZXQgYnkgc29tZSB3b3JrZmxvd3MgdXNpbmcgdGhpcyBmdW5jdGlvblxuICAgICAgICB3b3JraW5nRGlyZWN0b3J5OiBcIi4vXCIsXG4gICAgICB9LFxuICAgICAgV29ya2Zsb3dTdGVwcy51cGxvYWRBcnRpZmFjdCh7XG4gICAgICAgIGlmOiBNVVRBVElPTlNfRk9VTkQsXG4gICAgICAgIG5hbWU6IFwiVXBsb2FkIHBhdGNoXCIsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICBuYW1lOiBHSVRfUEFUQ0hfRklMRSxcbiAgICAgICAgICBwYXRoOiBHSVRfUEFUQ0hfRklMRSxcbiAgICAgICAgICBpbmNsdWRlSGlkZGVuRmlsZXM6IGlzSGlkZGVuUGF0aChHSVRfUEFUQ0hfRklMRSkgPyB0cnVlIDogdW5kZWZpbmVkLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgXTtcblxuICAgIGlmIChvcHRpb25zLm11dGF0aW9uRXJyb3IpIHtcbiAgICAgIHN0ZXBzLnB1c2goe1xuICAgICAgICBuYW1lOiBcIkZhaWwgYnVpbGQgb24gbXV0YXRpb25cIixcbiAgICAgICAgaWY6IE1VVEFUSU9OU19GT1VORCxcbiAgICAgICAgcnVuOiBbXG4gICAgICAgICAgYGVjaG8gXCI6OmVycm9yOjoke29wdGlvbnMubXV0YXRpb25FcnJvcn1cImAsXG4gICAgICAgICAgYGNhdCAke0dJVF9QQVRDSF9GSUxFfWAsXG4gICAgICAgICAgXCJleGl0IDFcIixcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0ZXBzO1xuICB9XG4gIC8qKlxuICAgKiBDaGVja3Mgb3V0IGEgcmVwb3NpdG9yeSBhbmQgYXBwbGllcyBhIGdpdCBwYXRjaCB0aGF0IHdhcyBjcmVhdGVkIHVzaW5nXG4gICAqIGB1cGxvYWRHaXRQYXRjaGAuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnNcbiAgICogQHJldHVybnMgSm9iIHN0ZXBzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGNoZWNrb3V0V2l0aFBhdGNoKFxuICAgIG9wdGlvbnM6IENoZWNrb3V0V2l0aFBhdGNoT3B0aW9ucyA9IHt9LFxuICApOiBKb2JTdGVwW10ge1xuICAgIGNvbnN0IHsgcGF0Y2hGaWxlLCAuLi5yZXN0T2ZPcHRpb25zIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IEdJVF9QQVRDSF9GSUxFID0gb3B0aW9ucy5wYXRjaEZpbGUgPz8gR0lUX1BBVENIX0ZJTEVfREVGQVVMVDtcblxuICAgIHJldHVybiBbXG4gICAgICBXb3JrZmxvd1N0ZXBzLmNoZWNrb3V0KHsgd2l0aDogcmVzdE9mT3B0aW9ucyB9KSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogXCJEb3dubG9hZCBwYXRjaFwiLFxuICAgICAgICB1c2VzOiBHaXRIdWJBY3Rpb25zLkFDVElPTlNfRE9XTkxPQURfQVJUSUZBQ1QsXG4gICAgICAgIHdpdGg6IHsgbmFtZTogR0lUX1BBVENIX0ZJTEUsIHBhdGg6IFJVTk5FUl9URU1QIH0sXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiBcIkFwcGx5IHBhdGNoXCIsXG4gICAgICAgIHJ1bjogYFsgLXMgJHtSVU5ORVJfVEVNUH0vJHtHSVRfUEFUQ0hfRklMRX0gXSAmJiBnaXQgYXBwbHkgJHtSVU5ORVJfVEVNUH0vJHtHSVRfUEFUQ0hfRklMRX0gfHwgZWNobyBcIkVtcHR5IHBhdGNoLiBTa2lwcGluZy5cImAsXG4gICAgICB9LFxuICAgIF07XG4gIH1cblxuICAvKipcbiAgICogQSBzdGVwIHRoYXQgY3JlYXRlcyBhIHB1bGwgcmVxdWVzdCBiYXNlZCBvbiB0aGUgY3VycmVudCByZXBvIHN0YXRlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zXG4gICAqIEByZXR1cm5zIEpvYiBzdGVwc1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjcmVhdGVQdWxsUmVxdWVzdChcbiAgICBvcHRpb25zOiBDcmVhdGVQdWxsUmVxdWVzdE9wdGlvbnMsXG4gICk6IEpvYlN0ZXBbXSB7XG4gICAgY29uc3Qgd29ya2Zsb3dOYW1lID0gb3B0aW9ucy53b3JrZmxvd05hbWU7XG4gICAgY29uc3QgYnJhbmNoTmFtZSA9IG9wdGlvbnMuYnJhbmNoTmFtZSA/PyBgZ2l0aHViLWFjdGlvbnMvJHt3b3JrZmxvd05hbWV9YDtcbiAgICBjb25zdCBzdGVwSWQgPSBvcHRpb25zLnN0ZXBJZCA/PyBcImNyZWF0ZS1wclwiO1xuICAgIGNvbnN0IHN0ZXBOYW1lID0gb3B0aW9ucy5zdGVwTmFtZSA/PyBcIkNyZWF0ZSBQdWxsIFJlcXVlc3RcIjtcbiAgICBjb25zdCBnaXRJZGVudGl0eSA9IG9wdGlvbnMuZ2l0SWRlbnRpdHkgPz8gREVGQVVMVF9HSVRIVUJfQUNUSU9OU19VU0VSO1xuICAgIGNvbnN0IGNvbW1pdHRlciA9IGAke2dpdElkZW50aXR5Lm5hbWV9IDwke2dpdElkZW50aXR5LmVtYWlsfT5gO1xuICAgIGNvbnN0IHB1bGxSZXF1ZXN0RGVzY3JpcHRpb24gPSBvcHRpb25zLnB1bGxSZXF1ZXN0RGVzY3JpcHRpb25cbiAgICAgIC50cmltRW5kKClcbiAgICAgIC5lbmRzV2l0aChcIi5cIilcbiAgICAgID8gb3B0aW9ucy5wdWxsUmVxdWVzdERlc2NyaXB0aW9uLnRyaW1FbmQoKVxuICAgICAgOiBgJHtvcHRpb25zLnB1bGxSZXF1ZXN0RGVzY3JpcHRpb24udHJpbUVuZCgpfS5gO1xuXG4gICAgY29uc3QgdGl0bGUgPSBvcHRpb25zLnB1bGxSZXF1ZXN0VGl0bGU7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBbXG4gICAgICBgJHtwdWxsUmVxdWVzdERlc2NyaXB0aW9ufSBTZWUgZGV0YWlscyBpbiBbd29ya2Zsb3cgcnVuXS5gLFxuICAgICAgXCJcIixcbiAgICAgIGBbV29ya2Zsb3cgUnVuXTogJHtSVU5fVVJMfWAsXG4gICAgICBcIlwiLFxuICAgICAgXCItLS0tLS1cIixcbiAgICAgIFwiXCIsXG4gICAgICBgKkF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSBwcm9qZW4gdmlhIHRoZSBcIiR7d29ya2Zsb3dOYW1lfVwiIHdvcmtmbG93KmAsXG4gICAgXS5qb2luKFwiXFxuXCIpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogc3RlcE5hbWUsXG4gICAgICAgIGlkOiBzdGVwSWQsXG4gICAgICAgIHVzZXM6IEdpdEh1YkFjdGlvbnMuUEVURVJfRVZBTlNfQ1JFQVRFX1BVTExfUkVRVUVTVCxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgIHRva2VuOiBvcHRpb25zLmNyZWRlbnRpYWxzPy50b2tlblJlZixcbiAgICAgICAgICBcImNvbW1pdC1tZXNzYWdlXCI6IGAke3RpdGxlfVxcblxcbiR7ZGVzY3JpcHRpb259YCxcbiAgICAgICAgICBicmFuY2g6IGJyYW5jaE5hbWUsXG4gICAgICAgICAgYmFzZTogb3B0aW9ucy5iYXNlQnJhbmNoLFxuICAgICAgICAgIHRpdGxlOiB0aXRsZSxcbiAgICAgICAgICBsYWJlbHM6IG9wdGlvbnMubGFiZWxzPy5qb2luKFwiLFwiKSB8fCB1bmRlZmluZWQsXG4gICAgICAgICAgYXNzaWduZWVzOiBvcHRpb25zLmFzc2lnbmVlcz8uam9pbihcIixcIikgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIGJvZHk6IGRlc2NyaXB0aW9uLFxuICAgICAgICAgIGF1dGhvcjogY29tbWl0dGVyLFxuICAgICAgICAgIGNvbW1pdHRlcjogY29tbWl0dGVyLFxuICAgICAgICAgIHNpZ25vZmY6IG9wdGlvbnMuc2lnbm9mZiA/PyB0cnVlLFxuICAgICAgICAgIFwiYWRkLXBhdGhzXCI6IG9wdGlvbnMuYWRkUGF0aHM/LmpvaW4oXCJcXG5cIikgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIFwiZGVsZXRlLWJyYW5jaFwiOiBvcHRpb25zLmRlbGV0ZUJyYW5jaCA/PyB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIF07XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBgY2hlY2tvdXRXaXRoUGF0Y2hgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENoZWNrb3V0V2l0aFBhdGNoT3B0aW9ucyBleHRlbmRzIENoZWNrb3V0V2l0aCB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgYXJ0aWZhY3QgdGhlIHBhdGNoIGlzIHN0b3JlZCBhcy5cbiAgICogQGRlZmF1bHQgXCIucmVwby5wYXRjaFwiXG4gICAqL1xuICByZWFkb25seSBwYXRjaEZpbGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYHVwbG9hZEdpdFBhdGNoYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRHaXRQYXRjaE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHN0ZXAgSUQgd2hpY2ggcHJvZHVjZXMgdGhlIG91dHB1dCB3aGljaCBpbmRpY2F0ZXMgaWYgYSBwYXRjaCB3YXMgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHN0ZXBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RlcC5cbiAgICogQGRlZmF1bHQgXCJGaW5kIG11dGF0aW9uc1wiXG4gICAqL1xuICByZWFkb25seSBzdGVwTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGFydGlmYWN0IHRoZSBwYXRjaCBpcyBzdG9yZWQgYXMuXG4gICAqIEBkZWZhdWx0IFwiLnJlcG8ucGF0Y2hcIlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0Y2hGaWxlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgb3V0cHV0IHRvIGVtaXQuIEl0IHdpbGwgYmUgc2V0IHRvIGB0cnVlYCBpZiB0aGVyZSB3YXMgYSBkaWZmLlxuICAgKi9cbiAgcmVhZG9ubHkgb3V0cHV0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGYWlsIGlmIGEgbXV0YXRpb24gd2FzIGZvdW5kIGFuZCBwcmludCB0aGlzIGVycm9yIG1lc3NhZ2UuXG4gICAqIEBkZWZhdWx0IC0gZG8gbm90IGZhaWwgdXBvbiBtdXRhdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbXV0YXRpb25FcnJvcj86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVQdWxsUmVxdWVzdE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHN0ZXAgSUQgd2hpY2ggcHJvZHVjZXMgdGhlIG91dHB1dCB3aGljaCBpbmRpY2F0ZXMgaWYgYSBwYXRjaCB3YXMgY3JlYXRlZC5cbiAgICogQGRlZmF1bHQgXCJjcmVhdGVfcHJcIlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcElkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgc3RlcCBkaXNwbGF5ZWQgb24gR2l0SHViLlxuICAgKiBAZGVmYXVsdCBcIkNyZWF0ZSBQdWxsIFJlcXVlc3RcIlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBqb2IgY3JlZGVudGlhbHMgdXNlZCB0byBjcmVhdGUgdGhlIHB1bGwgcmVxdWVzdC5cbiAgICpcbiAgICogUHJvdmlkZWQgY3JlZGVudGlhbHMgbXVzdCBoYXZlIHBlcm1pc3Npb25zIHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdCBvbiB0aGUgcmVwb3NpdG9yeS5cbiAgICovXG4gIHJlYWRvbmx5IGNyZWRlbnRpYWxzPzogR2l0aHViQ3JlZGVudGlhbHM7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSB3b3JrZmxvdyB0aGF0IHdpbGwgY3JlYXRlIHRoZSBQUlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIHRpdGxlIHVzZWQgdG8gY3JlYXRlIHRoZSBwdWxsIHJlcXVlc3QuXG4gICAqXG4gICAqIElmIFBSIHRpdGxlcyBhcmUgdmFsaWRhdGVkIGluIHRoaXMgcmVwbywgdGhlIHRpdGxlIHNob3VsZCBjb21wbHkgd2l0aCB0aGUgcmVzcGVjdGl2ZSBydWxlcy5cbiAgICovXG4gIHJlYWRvbmx5IHB1bGxSZXF1ZXN0VGl0bGU6IHN0cmluZztcblxuICAvKipcbiAgICogRGVzY3JpcHRpb24gYWRkZWQgdG8gdGhlIHB1bGwgcmVxdWVzdC5cbiAgICpcbiAgICogUHJvdmlkZW5jZSBpbmZvcm1hdGlvbiBhcmUgYXV0b21hdGljYWxseSBhZGRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHB1bGxSZXF1ZXN0RGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogU2V0cyB0aGUgcHVsbCByZXF1ZXN0IGJhc2UgYnJhbmNoLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBicmFuY2ggY2hlY2tlZCBvdXQgaW4gdGhlIHdvcmtmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZUJyYW5jaD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHB1bGwgcmVxdWVzdCBicmFuY2ggbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGdpdGh1Yi1hY3Rpb25zLyR7b3B0aW9ucy53b3JrZmxvd05hbWV9YFxuICAgKi9cbiAgcmVhZG9ubHkgYnJhbmNoTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aHMgdG8gYWRkIHRvIHRoZSBjb21taXQsIG1hcHBpbmcgdG8gdGhlIGFjdGlvbidzIGBhZGQtcGF0aHNgIGlucHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFsbCBwYXRoc1xuICAgKi9cbiAgcmVhZG9ubHkgYWRkUGF0aHM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkZWxldGUgdGhlIHB1bGwgcmVxdWVzdCBicmFuY2ggd2hlbiB0aGUgcHVsbCByZXF1ZXN0IGlzIGNsb3NlZCxcbiAgICogbWFwcGluZyB0byB0aGUgYWN0aW9uJ3MgYGRlbGV0ZS1icmFuY2hgIGlucHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgZGVsZXRlQnJhbmNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGdpdCBpZGVudGl0eSB1c2VkIHRvIGNyZWF0ZSB0aGUgY29tbWl0LlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgR2l0SHViIEFjdGlvbnMgdXNlclxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0SWRlbnRpdHk/OiBHaXRJZGVudGl0eTtcblxuICAvKipcbiAgICogQWRkIFNpZ25lZC1vZmYtYnkgbGluZSBieSB0aGUgY29tbWl0dGVyIGF0IHRoZSBlbmQgb2YgdGhlIGNvbW1pdCBsb2cgbWVzc2FnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgc2lnbm9mZj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIExhYmVscyB0byBhcHBseSBvbiB0aGUgUFIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbGFiZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEFzc2lnbmVlcyB0byBhZGQgb24gdGhlIFBSLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFzc2lnbmVlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXNzaWduZWVzPzogc3RyaW5nW107XG59XG4iXX0=