UNPKG

projen

Version:

CDK for software projects

106 lines • 18.3 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.PullRequestBackport = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const auto_approve_1 = require("./auto-approve"); const github_1 = require("./github"); const workflows_1 = require("./workflows"); const component_1 = require("../component"); const json_1 = require("../json"); const release_1 = require("../release"); class PullRequestBackport extends component_1.Component { constructor(scope, options = {}) { super(scope); const workflowEngine = github_1.GitHub.of(this.project); if (!workflowEngine) { throw new Error(`Cannot add ${new.target.name} to project without GitHub enabled. Please enable GitHub for this project.`); } const branches = options.branches ?? release_1.Release.of(this.project)?.branches ?? []; if (branches.length === 0) { this.project.logger.warn("PullRequestBackport could not find any target branches. Backports will not be available. Please add release branches or configure `branches` manually."); } const targetPrLabelsRaw = options.backportPRLabels ?? ["backport"]; const targetPrLabels = [...targetPrLabelsRaw]; const shouldAutoApprove = options.autoApproveBackport ?? true; if (shouldAutoApprove) { const autoApprove = this.project.components.find((c) => c instanceof auto_approve_1.AutoApprove); if (autoApprove?.label) { targetPrLabels.push(autoApprove.label); } } const backportBranchNamePrefix = options.backportBranchNamePrefix ?? "backport/"; const labelPrefix = options.labelPrefix ?? "backport-to-"; // Configuration this.file = new json_1.JsonFile(this, ".backportrc.json", { obj: { commitConflicts: options.createWithConflicts ?? true, targetPRLabels: targetPrLabels, backportBranchName: `${backportBranchNamePrefix}{{targetBranch}}-{{refValues}}`, prTitle: "{{sourcePullRequest.title}} (backport #{{sourcePullRequest.number}})", targetBranchChoices: branches, }, // File needs to be available to the GitHub Workflow committed: true, }); this.project.addPackageIgnore(this.file.path); // Workflow this.workflow = new workflows_1.GithubWorkflow(workflowEngine, options.workflowName ?? "backport"); this.workflow.on({ pullRequestTarget: { types: ["labeled", "unlabeled", "closed"], }, }); // condition to detect if the PR is a backport PR // we prefer to match the PR using labels, but will fallback to matching the branch name prefix const branchCondition = `startsWith(github.head_ref, '${backportBranchNamePrefix}')`; const labelConditions = targetPrLabelsRaw.map((label) => `contains(github.event.pull_request.labels.*.name, '${label}')`); const isBackportPr = labelConditions.length ? `(${labelConditions.join(" && ")})` : `${branchCondition})`; const checkStep = "check_labels"; const checkOutput = "matched"; const labelPrefixEscaped = labelPrefix.replace(/"/g, '\\"'); const credentials = workflowEngine.projenCredentials; this.workflow.addJob("backport", { name: "Backport PR", runsOn: ["ubuntu-latest"], permissions: {}, // Only ever run this job if the PR is merged and not a backport PR itself if: `github.event.pull_request.merged == true && !${isBackportPr}`, environment: credentials.environment, steps: [ ...credentials.setupSteps, // We need a custom step to check if the PR has any of the labels that indicate that the PR should be backported. // This is not currently possible with GH Actions expression by itself, so we use a bash script. { id: checkStep, name: "Check for backport labels", shell: "bash", run: [ "labels='${{ toJSON(github.event.pull_request.labels.*.name) }}'", `matched=$(echo $labels | jq '.|map(select(startswith("${labelPrefixEscaped}"))) | length')`, `echo "${checkOutput}=$matched"`, `echo "${checkOutput}=$matched" >> $GITHUB_OUTPUT`, ].join("\n"), }, { name: "Backport Action", uses: "sqren/backport-github-action@v9.5.1", // only run this step if we have found matching labels in the previous step // this is to prevent workflow failures because the action fails when pre-conditions are not met // and causes any PR to be marked with a red X, leading to error blindness. if: `fromJSON(steps.${checkStep}.outputs.${checkOutput}) > 0`, with: { github_token: credentials.tokenRef, auto_backport_label_prefix: labelPrefix, }, }, ], }); } } exports.PullRequestBackport = PullRequestBackport; _a = JSII_RTTI_SYMBOL_1; PullRequestBackport[_a] = { fqn: "projen.github.PullRequestBackport", version: "0.99.16" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVsbC1yZXF1ZXN0LWJhY2twb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2dpdGh1Yi9wdWxsLXJlcXVlc3QtYmFja3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFDQSxpREFBNkM7QUFDN0MscUNBQWtDO0FBQ2xDLDJDQUE2QztBQUM3Qyw0Q0FBeUM7QUFDekMsa0NBQW1DO0FBQ25DLHdDQUFxQztBQTBEckMsTUFBYSxtQkFBb0IsU0FBUSxxQkFBUztJQUloRCxZQUNFLEtBQWlCLEVBQ2pCLFVBQXNDLEVBQUU7UUFFeEMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsTUFBTSxjQUFjLEdBQUcsZUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FDRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQ2IsNEVBQTRFLENBQzdFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQ1osT0FBTyxDQUFDLFFBQVEsSUFBSSxpQkFBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBYyxDQUFDLEVBQUUsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUN0RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0Qix3SkFBd0osQ0FDekosQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDO1FBRTlDLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixJQUFJLElBQUksQ0FBQztRQUM5RCxJ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QkFBaUI7d0JBQzVGLFNBQVMsV0FBVyxZQUFZO3dCQUNoQyxTQUFTLFdBQVcsOEJBQThCO3FCQUNuRCxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7aUJBQ2I7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLGlCQUFpQjtvQkFDdkIsSUFBSSxFQUFFLHFDQUFxQztvQkFDM0MsMkVBQTJFO29CQUMzRSxnR0FBZ0c7b0JBQ2hHLDJFQUEyRTtvQkFDM0UsRUFBRSxFQUFFLGtCQUFrQixTQUFTLFlBQVksV0FBVyxPQUFPO29CQUM3RCxJQUFJLEVBQUU7d0JBQ0osWUFBWSxFQUFFLFdBQVcsQ0FBQyxRQUFRO3dCQUNsQywwQkFBMEIsRUFBRSxXQUFXO3FCQUN4QztpQkFDRjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUExSEgsa0RBMkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBBdXRvQXBwcm92ZSB9IGZyb20gXCIuL2F1dG8tYXBwcm92ZVwiO1xuaW1wb3J0IHsgR2l0SHViIH0gZnJvbSBcIi4vZ2l0aHViXCI7XG5pbXBvcnQgeyBHaXRodWJXb3JrZmxvdyB9IGZyb20gXCIuL3dvcmtmbG93c1wiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHsgSnNvbkZpbGUgfSBmcm9tIFwiLi4vanNvblwiO1xuaW1wb3J0IHsgUmVsZWFzZSB9IGZyb20gXCIuLi9yZWxlYXNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsbFJlcXVlc3RCYWNrcG9ydE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImJhY2twb3J0XCJcbiAgICovXG4gIHJlYWRvbmx5IHdvcmtmbG93TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2hvdWxkIHRoaXMgY3JlYXRlZCBCYWNrcG9ydCBQUnMgd2l0aCBjb25mbGljdHMuXG4gICAqXG4gICAqIENvbmZsaWN0cyB3aWxsIGhhdmUgdG8gYmUgcmVzb2x2ZWQgbWFudWFsbHksIGJ1dCBhIFBSIGlzIGFsd2F5cyBjcmVhdGVkLlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBwcmV2ZW50IHRoZSBiYWNrcG9ydCBQUiBmcm9tIGJlaW5nIGNyZWF0ZWQgaWYgdGhlcmUgYXJlIGNvbmZsaWN0cy5cbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgY3JlYXRlV2l0aENvbmZsaWN0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBsYWJlbHMgYWRkZWQgdG8gdGhlIGNyZWF0ZWQgYmFja3BvcnQgUFIuXG4gICAqXG4gICAqIEBkZWZhdWx0IFtcImJhY2twb3J0XCJdXG4gICAqL1xuICByZWFkb25seSBiYWNrcG9ydFBSTGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggdXNlZCB0byBuYW1lIGJhY2twb3J0IGJyYW5jaGVzLlxuICAgKlxuICAgKiBNYWtlIHN1cmUgdG8gaW5jbHVkZSBhIHNlcGFyYXRvciBhdCB0aGUgZW5kIGxpa2UgYC9gIG9yIGBfYC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJiYWNrcG9ydC9cIlxuICAgKi9cbiAgcmVhZG9ubHkgYmFja3BvcnRCcmFuY2hOYW1lUHJlZml4Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRvbWF0aWNhbGx5IGFwcHJvdmUgYmFja3BvcnQgUFJzIGlmIHRoZSAnYXV0byBhcHByb3ZlJyB3b3JrZmxvdyBpcyBhdmFpbGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGF1dG9BcHByb3ZlQmFja3BvcnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGJyYW5jaGVzIHRoYXQgY2FuIGJlIGEgdGFyZ2V0IGZvciBiYWNrcG9ydHNcbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGxvdyBiYWNrcG9ydHMgdG8gYWxsIHJlbGVhc2UgYnJhbmNoZXNcbiAgICovXG4gIHJlYWRvbmx5IGJyYW5jaGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggdXNlZCB0byBkZXRlY3QgUFJzIHRoYXQgc2hvdWxkIGJlIGJhY2twb3J0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IFwiYmFja3BvcnQtdG8tXCJcbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsUHJlZml4Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUHVsbFJlcXVlc3RCYWNrcG9ydCBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyByZWFkb25seSBmaWxlOiBKc29uRmlsZTtcbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93OiBHaXRodWJXb3JrZmxvdztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IElDb25zdHJ1Y3QsXG4gICAgb3B0aW9uczogUHVsbFJlcXVlc3RCYWNrcG9ydE9wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUpO1xuXG4gICAgY29uc3Qgd29ya2Zsb3dFbmdpbmUgPSBHaXRIdWIub2YodGhpcy5wcm9qZWN0KTtcbiAgICBpZiAoIXdvcmtmbG93RW5naW5lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgYWRkICR7XG4gICAgICAgICAgbmV3LnRhcmdldC5uYW1lXG4gICAgICAgIH0gdG8gcHJvamVjdCB3aXRob3V0IEdpdEh1YiBlbmFibGVkLiBQbGVhc2UgZW5hYmxlIEdpdEh1YiBmb3IgdGhpcyBwcm9qZWN0LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGJyYW5jaGVzID1cbiAgICAgIG9wdGlvbnMuYnJhbmNoZXMgPz8gUmVsZWFzZS5vZih0aGlzLnByb2plY3QgYXMgYW55KT8uYnJhbmNoZXMgPz8gW107XG4gICAgaWYgKGJyYW5jaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wcm9qZWN0LmxvZ2dlci53YXJuKFxuICAgICAgICBcIlB1bGxSZXF1ZXN0QmFja3BvcnQgY291bGQgbm90IGZpbmQgYW55IHRhcmdldCBicmFuY2hlcy4gQmFja3BvcnRzIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4gUGxlYXNlIGFkZCByZWxlYXNlIGJyYW5jaGVzIG9yIGNvbmZpZ3VyZSBgYnJhbmNoZXNgIG1hbnVhbGx5LlwiLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRQckxhYmVsc1JhdyA9IG9wdGlvbnMuYmFja3BvcnRQUkxhYmVscyA/PyBbXCJiYWNrcG9ydFwiXTtcbiAgICBjb25zdCB0YXJnZXRQckxhYmVscyA9IFsuLi50YXJnZXRQckxhYmVsc1Jhd107XG5cbiAgICBjb25zdCBzaG91bGRBdXRvQXBwcm92ZSA9IG9wdGlvbnMuYXV0b0FwcHJvdmVCYWNrcG9ydCA/PyB0cnVlO1xuICAgIGlmIChzaG91bGRBdXRvQXBwcm92ZSkge1xuICAgICAgY29uc3QgYXV0b0FwcHJvdmUgPSB0aGlzLnByb2plY3QuY29tcG9uZW50cy5maW5kKFxuICAgICAgICAoYyk6IGMgaXMgQXV0b0FwcHJvdmUgPT4gYyBpbnN0YW5jZW9mIEF1dG9BcHByb3ZlLFxuICAgICAgKTtcbiAgICAgIGlmIChhdXRvQXBwcm92ZT8ubGFiZWwpIHtcbiAgICAgICAgdGFyZ2V0UHJMYWJlbHMucHVzaChhdXRvQXBwcm92ZS5sYWJlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgYmFja3BvcnRCcmFuY2hOYW1lUHJlZml4ID1cbiAgICAgIG9wdGlvbnMuYmFja3BvcnRCcmFuY2hOYW1lUHJlZml4ID8/IFwiYmFja3BvcnQvXCI7XG4gICAgY29uc3QgbGFiZWxQcmVmaXggPSBvcHRpb25zLmxhYmVsUHJlZml4ID8/IFwiYmFja3BvcnQtdG8tXCI7XG5cbiAgICAvLyBDb25maWd1cmF0aW9uXG4gICAgdGhpcy5maWxlID0gbmV3IEpzb25GaWxlKHRoaXMsIFwiLmJhY2twb3J0cmMuanNvblwiLCB7XG4gICAgICBvYmo6IHtcbiAgICAgICAgY29tbWl0Q29uZmxpY3RzOiBvcHRpb25zLmNyZWF0ZVdpdGhDb25mbGljdHMgPz8gdHJ1ZSxcbiAgICAgICAgdGFyZ2V0UFJMYWJlbHM6IHRhcmdldFByTGFiZWxzLFxuICAgICAgICBiYWNrcG9ydEJyYW5jaE5hbWU6IGAke2JhY2twb3J0QnJhbmNoTmFtZVByZWZpeH17e3RhcmdldEJyYW5jaH19LXt7cmVmVmFsdWVzfX1gLFxuICAgICAgICBwclRpdGxlOlxuICAgICAgICAgIFwie3tzb3VyY2VQdWxsUmVxdWVzdC50aXRsZX19IChiYWNrcG9ydCAje3tzb3VyY2VQdWxsUmVxdWVzdC5udW1iZXJ9fSlcIixcbiAgICAgICAgdGFyZ2V0QnJhbmNoQ2hvaWNlczogYnJhbmNoZXMsXG4gICAgICB9LFxuICAgICAgLy8gRmlsZSBuZWVkcyB0byBiZSBhdmFpbGFibGUgdG8gdGhlIEdpdEh1YiBXb3JrZmxvd1xuICAgICAgY29tbWl0dGVkOiB0cnVlLFxuICAgIH0pO1xuICAgIHRoaXMucHJvamVjdC5hZGRQYWNrYWdlSWdub3JlKHRoaXMuZmlsZS5wYXRoKTtcblxuICAgIC8vIFdvcmtmbG93XG4gICAgdGhpcy53b3JrZmxvdyA9IG5ldyBHaXRodWJXb3JrZmxvdyhcbiAgICAgIHdvcmtmbG93RW5naW5lLFxuICAgICAgb3B0aW9ucy53b3JrZmxvd05hbWUgPz8gXCJiYWNrcG9ydFwiLFxuICAgICk7XG4gICAgdGhpcy53b3JrZmxvdy5vbih7XG4gICAgICBwdWxsUmVxdWVzdFRhcmdldDoge1xuICAgICAgICB0eXBlczogW1wibGFiZWxlZFwiLCBcInVubGFiZWxlZFwiLCBcImNsb3NlZFwiXSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBjb25kaXRpb24gdG8gZGV0ZWN0IGlmIHRoZSBQUiBpcyBhIGJhY2twb3J0IFBSXG4gICAgLy8gd2UgcHJlZmVyIHRvIG1hdGNoIHRoZSBQUiB1c2luZyBsYWJlbHMsIGJ1dCB3aWxsIGZhbGxiYWNrIHRvIG1hdGNoaW5nIHRoZSBicmFuY2ggbmFtZSBwcmVmaXhcbiAgICBjb25zdCBicmFuY2hDb25kaXRpb24gPSBgc3RhcnRzV2l0aChnaXRodWIuaGVhZF9yZWYsICcke2JhY2twb3J0QnJhbmNoTmFtZVByZWZpeH0nKWA7XG4gICAgY29uc3QgbGFiZWxDb25kaXRpb25zOiBzdHJpbmdbXSA9IHRhcmdldFByTGFiZWxzUmF3Lm1hcChcbiAgICAgIChsYWJlbCkgPT5cbiAgICAgICAgYGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJyR7bGFiZWx9JylgLFxuICAgICk7XG4gICAgY29uc3QgaXNCYWNrcG9ydFByID0gbGFiZWxDb25kaXRpb25zLmxlbmd0aFxuICAgICAgPyBgKCR7bGFiZWxDb25kaXRpb25zLmpvaW4oXCIgJiYgXCIpfSlgXG4gICAgICA6IGAke2JyYW5jaENvbmRpdGlvbn0pYDtcblxuICAgIGNvbnN0IGNoZWNrU3RlcCA9IFwiY2hlY2tfbGFiZWxzXCI7XG4gICAgY29uc3QgY2hlY2tPdXRwdXQgPSBcIm1hdGNoZWRcIjtcbiAgICBjb25zdCBsYWJlbFByZWZpeEVzY2FwZWQgPSBsYWJlbFByZWZpeC5yZXBsYWNlKC9cIi9nLCAnXFxcXFwiJyk7XG4gICAgY29uc3QgY3JlZGVudGlhbHMgPSB3b3JrZmxvd0VuZ2luZS5wcm9qZW5DcmVkZW50aWFscztcblxuICAgIHRoaXMud29ya2Zsb3cuYWRkSm9iKFwiYmFja3BvcnRcIiwge1xuICAgICAgbmFtZTogXCJCYWNrcG9ydCBQUlwiLFxuICAgICAgcnVuc09uOiBbXCJ1YnVudHUtbGF0ZXN0XCJdLFxuICAgICAgcGVybWlzc2lvbnM6IHt9LFxuICAgICAgLy8gT25seSBldmVyIHJ1biB0aGlzIGpvYiBpZiB0aGUgUFIgaXMgbWVyZ2VkIGFuZCBub3QgYSBiYWNrcG9ydCBQUiBpdHNlbGZcbiAgICAgIGlmOiBgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5tZXJnZWQgPT0gdHJ1ZSAmJiAhJHtpc0JhY2twb3J0UHJ9YCxcbiAgICAgIGVudmlyb25tZW50OiBjcmVkZW50aWFscy5lbnZpcm9ubWVudCxcbiAgICAgIHN0ZXBzOiBbXG4gICAgICAgIC4uLmNyZWRlbnRpYWxzLnNldHVwU3RlcHMsXG4gICAgICAgIC8vIFdlIG5lZWQgYSBjdXN0b20gc3RlcCB0byBjaGVjayBpZiB0aGUgUFIgaGFzIGFueSBvZiB0aGUgbGFiZWxzIHRoYXQgaW5kaWNhdGUgdGhhdCB0aGUgUFIgc2hvdWxkIGJlIGJhY2twb3J0ZWQuXG4gICAgICAgIC8vIFRoaXMgaXMgbm90IGN1cnJlbnRseSBwb3NzaWJsZSB3aXRoIEdIIEFjdGlvbnMgZXhwcmVzc2lvbiBieSBpdHNlbGYsIHNvIHdlIHVzZSBhIGJhc2ggc2NyaXB0LlxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IGNoZWNrU3RlcCxcbiAgICAgICAgICBuYW1lOiBcIkNoZWNrIGZvciBiYWNrcG9ydCBsYWJlbHNcIixcbiAgICAgICAgICBzaGVsbDogXCJiYXNoXCIsXG4gICAgICAgICAgcnVuOiBbXG4gICAgICAgICAgICBcImxhYmVscz0nJHt7IHRvSlNPTihnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmxhYmVscy4qLm5hbWUpIH19J1wiLFxuICAgICAgICAgICAgYG1hdGNoZWQ9JChlY2hvICRsYWJlbHMgfCBqcSAnLnxtYXAoc2VsZWN0KHN0YXJ0c3dpdGgoXCIke2xhYmVsUHJlZml4RXNjYXBlZH1cIikpKSB8IGxlbmd0aCcpYCxcbiAgICAgICAgICAgIGBlY2hvIFwiJHtjaGVja091dHB1dH09JG1hdGNoZWRcImAsXG4gICAgICAgICAgICBgZWNobyBcIiR7Y2hlY2tPdXRwdXR9PSRtYXRjaGVkXCIgPj4gJEdJVEhVQl9PVVRQVVRgLFxuICAgICAgICAgIF0uam9pbihcIlxcblwiKSxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6IFwiQmFja3BvcnQgQWN0aW9uXCIsXG4gICAgICAgICAgdXNlczogXCJzcXJlbi9iYWNrcG9ydC1naXRodWItYWN0aW9uQHY5LjUuMVwiLFxuICAgICAgICAgIC8vIG9ubHkgcnVuIHRoaXMgc3RlcCBpZiB3ZSBoYXZlIGZvdW5kIG1hdGNoaW5nIGxhYmVscyBpbiB0aGUgcHJldmlvdXMgc3RlcFxuICAgICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCB3b3JrZmxvdyBmYWlsdXJlcyBiZWNhdXNlIHRoZSBhY3Rpb24gZmFpbHMgd2hlbiBwcmUtY29uZGl0aW9ucyBhcmUgbm90IG1ldFxuICAgICAgICAgIC8vIGFuZCBjYXVzZXMgYW55IFBSIHRvIGJlIG1hcmtlZCB3aXRoIGEgcmVkIFgsIGxlYWRpbmcgdG8gZXJyb3IgYmxpbmRuZXNzLlxuICAgICAgICAgIGlmOiBgZnJvbUpTT04oc3RlcHMuJHtjaGVja1N0ZXB9Lm91dHB1dHMuJHtjaGVja091dHB1dH0pID4gMGAsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgZ2l0aHViX3Rva2VuOiBjcmVkZW50aWFscy50b2tlblJlZixcbiAgICAgICAgICAgIGF1dG9fYmFja3BvcnRfbGFiZWxfcHJlZml4OiBsYWJlbFByZWZpeCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuIl19