projen
Version:
CDK for software projects
159 lines • 22.5 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.AutoQueue = exports.MergeMethod = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const github_1 = require("./github");
const workflows = __importStar(require("./workflows-model"));
const component_1 = require("../component");
/**
* The merge method used to add the PR to the merge queue
*
* Behavior can be further configured in repository settings.
*/
var MergeMethod;
(function (MergeMethod) {
MergeMethod["SQUASH"] = "squash";
MergeMethod["MERGE"] = "merge";
MergeMethod["REBASE"] = "rebase";
})(MergeMethod || (exports.MergeMethod = MergeMethod = {}));
/**
* Automatically add pull requests to the merge queue
* PRs will be merged once they pass required checks.
*/
class AutoQueue extends component_1.Component {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.github.AutoQueue", version: "0.103.12" };
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 labels = options.labels ?? [];
const usernames = options.allowedUsernames ?? [];
const conditions = [];
if (labels.length > 0) {
conditions.push("(" +
labels
.map((l) => `contains(github.event.pull_request.labels.*.name, '${l}')`)
.join(" || ") +
")");
}
if (usernames.length > 0) {
conditions.push("(" +
usernames
.map((u) => `github.event.pull_request.user.login == '${u}'`)
.join(" || ") +
")");
}
let needsEditedEvent = false;
if (options.targetBranches) {
// Branch conditions, based off the 'opened' or 'edited' events.
//
// The current workflow will only run if the target branch is one of the intended
// ones, so we only need to check if the event type is correct.
needsEditedEvent = true;
const isOpened = `github.event.action == 'opened'`;
const isBranchChanged = `(github.event.action == 'edited' && github.event.changes.base)`;
conditions.push(`(${isOpened} || ${isBranchChanged})`);
}
const credentials = options.projenCredentials ?? workflowEngine.projenCredentials;
const mergeMethod = options.mergeMethod ?? MergeMethod.SQUASH;
// The merge method is interpolated into a shell command below. Even though the
// type system restricts this to `MergeMethod`, that guarantee does not hold for
// consumers in other jsii languages or plain JavaScript, so validate explicitly.
const validMergeMethods = Object.values(MergeMethod);
if (!validMergeMethods.includes(mergeMethod)) {
const allowed = Object.entries(MergeMethod)
.map(([name, value]) => `MergeMethod.${name} ("${value}")`)
.join(", ");
throw new Error(`Invalid mergeMethod "${mergeMethod}" in AutoQueueOptions. ` +
`Set 'mergeMethod' to one of: ${allowed}, or leave it unset to default to MergeMethod.SQUASH.`);
}
const autoQueueJob = {
name: "Set AutoQueue on PR #${{ github.event.number }}",
...workflowEngine.runsOnConfig(options),
permissions: {
pullRequests: workflows.JobPermission.WRITE,
contents: workflows.JobPermission.WRITE,
},
if: conditions.length ? conditions.join(" && ") : undefined,
environment: credentials.environment,
steps: [
...credentials.setupSteps,
{
id: "auto-queue-pr",
run: `gh pr merge --auto --${mergeMethod} "$PR_NUMBER" --repo "$GH_REPO"`,
env: {
GH_TOKEN: credentials.tokenRef,
GH_REPO: "${{ github.repository }}",
PR_NUMBER: "${{ github.event.number }}",
},
},
],
};
const workflow = workflowEngine.addWorkflow("auto-queue");
workflow.on({
// The 'pull request' event gives the workflow 'read-only' permissions on some
// pull requests (such as the ones from dependabot) when using the `GITHUB_TOKEN`
// security token. This prevents the workflow from approving these pull requests.
// Github has placed this guard so as to prevent security attacks by simply opening
// a pull request and triggering a workflow on a commit that was not vetted to make
// unintended changes to the repository.
//
// Instead use the 'pull request target' event here that gives the Github workflow
// 'read-write' permissions. This is safe because, this event, unlike the 'pull request'
// event references the BASE commit of the pull request and not the HEAD commit.
//
// We only enable auto-queue when a PR is opened, reopened or moving from Draft to Ready,
// or retargeted to a different branch. Specifically, if a user disables auto-queue we try very hard to avoid
// accidentally re-enabling it.
//
// The 'edited' trigger is only used to detect base branch changes.
pullRequestTarget: {
types: [
"opened",
"reopened",
"ready_for_review",
...(needsEditedEvent ? ["edited"] : []),
],
branches: options.targetBranches,
},
});
workflow.addJobs({ enableAutoQueue: autoQueueJob });
}
}
exports.AutoQueue = AutoQueue;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1xdWV1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9naXRodWIvYXV0by1xdWV1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EscUNBQWtDO0FBRWxDLDZEQUErQztBQUMvQyw0Q0FBeUM7QUFHekM7Ozs7R0FJRztBQUNILElBQVksV0FJWDtBQUpELFdBQVksV0FBVztJQUNyQixnQ0FBaUIsQ0FBQTtJQUNqQiw4QkFBZSxDQUFBO0lBQ2YsZ0NBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQUpXLFdBQVcsMkJBQVgsV0FBVyxRQUl0QjtBQXNFRDs7O0dBR0c7QUFDSCxNQUFhLFNBQVUsU0FBUSxxQkFBUzs7SUFDdEMsWUFBWSxLQUFpQixFQUFFLFVBQTRCLEVBQUU7UUFDM0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWIsTUFBTSxjQUFjLEdBQUcsZUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ2IsY0FDRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQ2IsNEVBQTRFLENBQzdFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixJQUFJLEVBQUUsQ0FBQztRQUVqRCxNQUFNLFVBQVUsR0FBYSxFQUFFLENBQUM7UUFDaEMsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLFVBQVUsQ0FBQyxJQUFJLENBQ2IsR0FBRztnQkFDRCxNQUFNO3FCQUNILEdBQUcsQ0FDRixDQUFDLENBQUMsRUFBRSxFQUFFLENBQ0osc0RBQXNELENBQUMsSUFBSSxDQUM5RDtx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eEMsRUFBRTtZQUNGLGtGQUFrRjtZQUNsRix3RkFBd0Y7WUFDeEYsZ0ZBQWdGO1lBQ2hGLEVBQUU7WUFDRix5RkFBeUY7WUFDekYsNkdBQTZHO1lBQzdHLCtCQUErQjtZQUMvQixFQUFFO1lBQ0YsbUVBQW1FO1lBQ25FLGlCQUFpQixFQUFFO2dCQUNqQixLQUFLLEVBQUU7b0JBQ0wsUUFBUTtvQkFDUixVQUFVO29CQUNWLGtCQUFrQjtvQkFDbEIsR0FBRyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2lCQUNqRDtnQkFDRCxRQUFRLEVBQUUsT0FBTyxDQUFDLGNBQWM7YUFDakM7U0FDRixDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQzs7QUEzSEgsOEJBNEhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBJQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IEdpdEh1YiB9IGZyb20gXCIuL2dpdGh1YlwiO1xuaW1wb3J0IHR5cGUgeyBHaXRodWJDcmVkZW50aWFscyB9IGZyb20gXCIuL2dpdGh1Yi1jcmVkZW50aWFsc1wiO1xuaW1wb3J0ICogYXMgd29ya2Zsb3dzIGZyb20gXCIuL3dvcmtmbG93cy1tb2RlbFwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4uL2NvbXBvbmVudFwiO1xuaW1wb3J0IHR5cGUgeyBSdW5zT25PcHRpb25zIH0gZnJvbSBcIi4uL3J1bm5lci1vcHRpb25zXCI7XG5cbi8qKlxuICogVGhlIG1lcmdlIG1ldGhvZCB1c2VkIHRvIGFkZCB0aGUgUFIgdG8gdGhlIG1lcmdlIHF1ZXVlXG4gKlxuICogQmVoYXZpb3IgY2FuIGJlIGZ1cnRoZXIgY29uZmlndXJlZCBpbiByZXBvc2l0b3J5IHNldHRpbmdzLlxuICovXG5leHBvcnQgZW51bSBNZXJnZU1ldGhvZCB7XG4gIFNRVUFTSCA9IFwic3F1YXNoXCIsXG4gIE1FUkdFID0gXCJtZXJnZVwiLFxuICBSRUJBU0UgPSBcInJlYmFzZVwiLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yICdBdXRvUXVldWUnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0b1F1ZXVlT3B0aW9ucyBleHRlbmRzIFJ1bnNPbk9wdGlvbnMge1xuICAvKipcbiAgICogT25seSBwdWxsIHJlcXVlc3RzIGF1dGhvcmVkIGJ5IHRoZXNlIEdpdGh1YiB1c2VybmFtZXMgd2lsbCBoYXZlIGF1dG8tcXVldWUgZW5hYmxlZC5cbiAgICogQGRlZmF1bHQgLSBwdWxsIHJlcXVlc3RzIGZyb20gYWxsIHVzZXJzIGFyZSBlbGlnaWJsZSBmb3IgYXV0by1xdWV1aW5nXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkVXNlcm5hbWVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIE9ubHkgcHVsbCByZXF1ZXN0cyB3aXRoIG9uZSBvZiB0aGlzIGxhYmVscyB3aWxsIGhhdmUgYXV0by1xdWV1ZSBlbmFibGVkLlxuICAgKiBAZGVmYXVsdCAtIGFsbCBwdWxsIHJlcXVlc3RzIGFyZSBlbGlnaWJsZSBmb3IgYXV0by1xdWV1ZWluZ1xuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWxzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIENob29zZSBhIG1ldGhvZCBmb3IgYXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgdG8gZW5hYmxlIGF1dG8tcXVldWUgb24gcHVsbCByZXF1ZXN0cy5cbiAgICpcbiAgICogVGhlIHdvcmtmbG93IGNhbm5vdCB1c2UgYSBkZWZhdWx0IGdpdGh1YiB0b2tlbi4gUXVldWluZyBhIFBSXG4gICAqIHdpdGggdGhlIGRlZmF1bHQgdG9rZW4gd2lsbCBub3QgdHJpZ2dlciBhbnkgbWVyZ2UgcXVldWUgd29ya2Zsb3dzLFxuICAgKiB3aGljaCByZXN1bHRzIGluIHRoZSBQUiBqdXN0IG5vdCBnZXR0aW5nIG1lcmdlZCBhdCBhbGwuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9wcm9qZW4uaW8vZG9jcy9pbnRlZ3JhdGlvbnMvZ2l0aHViL1xuICAgKiBAZGVmYXVsdCAtIHVzZXMgY3JlZGVudGlhbHMgZnJvbSB0aGUgR2l0SHViIGNvbXBvbmVudFxuICAgKi9cbiAgcmVhZG9ubHkgcHJvamVuQ3JlZGVudGlhbHM/OiBHaXRodWJDcmVkZW50aWFscztcblxuICAvKipcbiAgICogVGhlIG1ldGhvZCB1c2VkIHRvIGFkZCB0aGUgUFIgdG8gdGhlIG1lcmdlIHF1ZXVlXG4gICAqIEFueSBicmFuY2ggcHJvdGVjdGlvbiBydWxlcyBtdXN0IGFsbG93IHRoaXMgbWVyZ2UgbWV0aG9kLlxuICAgKiBAZGVmYXVsdCBNZXJnZU1ldGhvZC5TUVVBU0hcbiAgICovXG4gIHJlYWRvbmx5IG1lcmdlTWV0aG9kPzogTWVyZ2VNZXRob2Q7XG5cbiAgLyoqXG4gICAqIFRoZSBicmFuY2ggbmFtZXMgdGhhdCB3ZSBzaG91bGQgYXV0by1xdWV1ZSBmb3JcbiAgICpcbiAgICogVGhpcyBzZXQgb2YgYnJhbmNoZXMgc2hvdWxkIGJlIGEgc3Vic2V0IG9mIGBNZXJnZVF1ZXVlT3B0aW9ucy50YXJnZXRCcmFuY2hlc2AuXG4gICAqXG4gICAqIEJlIHN1cmUgbm90IHRvIGVuYWJsZSBgYXV0b1F1ZXVlYCBmb3IgYnJhbmNoZXMgdGhhdCBkb24ndCBoYXZlIGJyYW5jaCBydWxlc1xuICAgKiB3aXRoIG1lcmdlIHJlcXVpcmVtZW50cyBzZXQgdXAsIG90aGVyd2lzZSBuZXcgUFJzIHdpbGwgYmUgbWVyZ2VkXG4gICAqIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW5nIHdpdGhvdXQgYSBjaGFuY2UgZm9yIHJldmlldy5cbiAgICpcbiAgICogIyMgQXV0b21hdGljYWxseSBtZXJnaW5nIGEgc2V0IG9mIFN0YWNrZWQgUFJzXG4gICAqXG4gICAqIElmIHlvdSBzZXQgdGhpcyB0byBgWydtYWluJ11gIHlvdSBjYW4gYXV0b21hdGljYWxseSBtZXJnZSBhIHNldCBvZiBTdGFja2VkIFBSc1xuICAgKiBpbiB0aGUgcmlnaHQgb3JkZXIuIEl0IHdvcmtzIGxpa2UgdGhpczpcbiAgICpcbiAgICogLSBDcmVhdGUgUFIgIzEgZnJvbSBicmFuY2ggYGFgLCB0YXJnZXRpbmcgYG1haW5gLlxuICAgKiAtIENyZWF0ZSBQUiAjMiBmcm9tIGJyYW5jaCBgYmAsIHRhcmdldGluZyBicmFuY2ggYGFgLlxuICAgKiAtIENyZWF0ZSBQUiAjMyBmcm9tIGJyYW5jaCBgY2AsIHRhcmdldGluZyBicmFuY2ggYGJgLlxuICAgKlxuICAgKiBJbml0aWFsbHksIFBSICMxIHdpbGwgYmUgc2V0IHRvIGF1dG8tbWVyZ2UsIFBScyAjMiBhbmQgIzMgd2lsbCBub3QuXG4gICAqXG4gICAqIE9uY2UgUFIgIzEgcGFzc2VzIGFsbCBvZiBpdHMgcmVxdWlyZW1lbnRzIGl0IHdpbGwgbWVyZ2UuIFRoYXQgd2lsbCBkZWxldGVcbiAgICogYnJhbmNoIGBhYCBhbmQgY2hhbmdlICB0aGUgdGFyZ2V0IGJyYW5jaCBvZiBQUiAjMiBjaGFuZ2UgdG8gYG1haW5gLiBBdCB0aGF0XG4gICAqIHBvaW50LCBhdXRvLXF1ZXVlaW5nIHdpbGwgc3dpdGNoIG9uIGZvciBQUiAjMiBhbmQgaXQgZ2V0cyBtZXJnZWQsIGV0Yy5cbiAgICpcbiAgICogPiBbIUlNUE9SVEFOVF1cbiAgICogPiBUaGlzIGNvbXBvbmVudCB3aWxsIG5ldmVyIGRpc2FibGUgQXV0b01lcmdlLCBvbmx5IGVuYWJsZSBpdC4gU28gaWYgYSBQUiBpc1xuICAgKiA+IGluaXRpYWxseSB0YXJnZXRlZCBhdCBvbmUgb2YgdGhlIGJyYW5jaGVzIGluIHRoaXMgbGlzdCwgYW5kIHRoZW5cbiAgICogPiBzdWJzZXF1ZW50bHkgcmV0YXJnZXRlZCB0byBhbm90aGVyIGJyYW5jaCwgKkF1dG9NZXJnZSBpcyBub3RcbiAgICogPiBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvZmYqLlxuICAgKi9cbiAgcmVhZG9ubHkgdGFyZ2V0QnJhbmNoZXM/OiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IGFkZCBwdWxsIHJlcXVlc3RzIHRvIHRoZSBtZXJnZSBxdWV1ZVxuICogUFJzIHdpbGwgYmUgbWVyZ2VkIG9uY2UgdGhleSBwYXNzIHJlcXVpcmVkIGNoZWNrcy5cbiAqL1xuZXhwb3J0IGNsYXNzIEF1dG9RdWV1ZSBleHRlbmRzIENvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBJQ29uc3RydWN0LCBvcHRpb25zOiBBdXRvUXVldWVPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihzY29wZSk7XG5cbiAgICBjb25zdCB3b3JrZmxvd0VuZ2luZSA9IEdpdEh1Yi5vZih0aGlzLnByb2plY3QpO1xuICAgIGlmICghd29ya2Zsb3dFbmdpbmUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBhZGQgJHtcbiAgICAgICAgICBuZXcudGFyZ2V0Lm5hbWVcbiAgICAgICAgfSB0byBwcm9qZWN0IHdpdGhvdXQgR2l0SHViIGVuYWJsZWQuIFBsZWFzZSBlbmFibGUgR2l0SHViIGZvciB0aGlzIHByb2plY3QuYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgbGFiZWxzID0gb3B0aW9ucy5sYWJlbHMgPz8gW107XG4gICAgY29uc3QgdXNlcm5hbWVzID0gb3B0aW9ucy5hbGxvd2VkVXNlcm5hbWVzID8/IFtdO1xuXG4gICAgY29uc3QgY29uZGl0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBpZiAobGFiZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbmRpdGlvbnMucHVzaChcbiAgICAgICAgXCIoXCIgK1xuICAgICAgICAgIGxhYmVsc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgKGwpID0+XG4gICAgICAgICAgICAgICAgYGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJyR7bH0nKWAsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbihcIiB8fCBcIikgK1xuICAgICAgICAgIFwiKVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHVzZXJuYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25kaXRpb25zLnB1c2goXG4gICAgICAgIFwiKFwiICtcbiAgICAgICAgICB1c2VybmFtZXNcbiAgICAgICAgICAgIC5tYXAoKHUpID0+IGBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LnVzZXIubG9naW4gPT0gJyR7dX0nYClcbiAgICAgICAgICAgIC5qb2luKFwiIHx8IFwiKSArXG4gICAgICAgICAgXCIpXCIsXG4gICAgICApO1xuICAgIH1cblxuICAgIGxldCBuZWVkc0VkaXRlZEV2ZW50ID0gZmFsc2U7XG4gICAgaWYgKG9wdGlvbnMudGFyZ2V0QnJhbmNoZXMpIHtcbiAgICAgIC8vIEJyYW5jaCBjb25kaXRpb25zLCBiYXNlZCBvZmYgdGhlICdvcGVuZWQnIG9yICdlZGl0ZWQnIGV2ZW50cy5cbiAgICAgIC8vXG4gICAgICAvLyBUaGUgY3VycmVudCB3b3JrZmxvdyB3aWxsIG9ubHkgcnVuIGlmIHRoZSB0YXJnZXQgYnJhbmNoIGlzIG9uZSBvZiB0aGUgaW50ZW5kZWRcbiAgICAgIC8vIG9uZXMsIHNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiB0aGUgZXZlbnQgdHlwZSBpcyBjb3JyZWN0LlxuICAgICAgbmVlZHNFZGl0ZWRFdmVudCA9IHRydWU7XG5cbiAgICAgIGNvbnN0IGlzT3BlbmVkID0gYGdpdGh1Yi5ldmVudC5hY3Rpb24gPT0gJ29wZW5lZCdgO1xuICAgICAgY29uc3QgaXNCcmFuY2hDaGFuZ2VkID0gYChnaXRodWIuZXZlbnQuYWN0aW9uID09ICdlZGl0ZWQnICYmIGdpdGh1Yi5ldmVudC5jaGFuZ2VzLmJhc2UpYDtcblxuICAgICAgY29uZGl0aW9ucy5wdXNoKGAoJHtpc09wZW5lZH0gfHwgJHtpc0JyYW5jaENoYW5nZWR9KWApO1xuICAgIH1cblxuICAgIGNvbnN0IGNyZWRlbnRpYWxzID1cbiAgICAgIG9wdGlvbnMucHJvamVuQ3JlZGVudGlhbHMgPz8gd29ya2Zsb3dFbmdpbmUucHJvamVuQ3JlZGVudGlhbHM7XG4gICAgY29uc3QgbWVyZ2VNZXRob2QgPSBvcHRpb25zLm1lcmdlTWV0aG9kID8/IE1lcmdlTWV0aG9kLlNRVUFTSDtcblxuICAgIC8vIFRoZSBtZXJnZSBtZXRob2QgaXMgaW50ZXJwb2xhdGVkIGludG8gYSBzaGVsbCBjb21tYW5kIGJlbG93LiBFdmVuIHRob3VnaCB0aGVcbiAgICAvLyB0eXBlIHN5c3RlbSByZXN0cmljdHMgdGhpcyB0byBgTWVyZ2VNZXRob2RgLCB0aGF0IGd1YXJhbnRlZSBkb2VzIG5vdCBob2xkIGZvclxuICAgIC8vIGNvbnN1bWVycyBpbiBvdGhlciBqc2lpIGxhbmd1YWdlcyBvciBwbGFpbiBKYXZhU2NyaXB0LCBzbyB2YWxpZGF0ZSBleHBsaWNpdGx5LlxuICAgIGNvbnN0IHZhbGlkTWVyZ2VNZXRob2RzID0gT2JqZWN0LnZhbHVlcyhNZXJnZU1ldGhvZCk7XG4gICAgaWYgKCF2YWxpZE1lcmdlTWV0aG9kcy5pbmNsdWRlcyhtZXJnZU1ldGhvZCkpIHtcbiAgICAgIGNvbnN0IGFsbG93ZWQgPSBPYmplY3QuZW50cmllcyhNZXJnZU1ldGhvZClcbiAgICAgICAgLm1hcCgoW25hbWUsIHZhbHVlXSkgPT4gYE1lcmdlTWV0aG9kLiR7bmFtZX0gKFwiJHt2YWx1ZX1cIilgKVxuICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBtZXJnZU1ldGhvZCBcIiR7bWVyZ2VNZXRob2R9XCIgaW4gQXV0b1F1ZXVlT3B0aW9ucy4gYCArXG4gICAgICAgICAgYFNldCAnbWVyZ2VNZXRob2QnIHRvIG9uZSBvZjogJHthbGxvd2VkfSwgb3IgbGVhdmUgaXQgdW5zZXQgdG8gZGVmYXVsdCB0byBNZXJnZU1ldGhvZC5TUVVBU0guYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgYXV0b1F1ZXVlSm9iOiB3b3JrZmxvd3MuSm9iID0ge1xuICAgICAgbmFtZTogXCJTZXQgQXV0b1F1ZXVlIG9uIFBSICMke3sgZ2l0aHViLmV2ZW50Lm51bWJlciB9fVwiLFxuICAgICAgLi4ud29ya2Zsb3dFbmdpbmUucnVuc09uQ29uZmlnKG9wdGlvbnMpLFxuICAgICAgcGVybWlzc2lvbnM6IHtcbiAgICAgICAgcHVsbFJlcXVlc3RzOiB3b3JrZmxvd3MuSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgICAgY29udGVudHM6IHdvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgfSxcbiAgICAgIGlmOiBjb25kaXRpb25zLmxlbmd0aCA/IGNvbmRpdGlvbnMuam9pbihcIiAmJiBcIikgOiB1bmRlZmluZWQsXG4gICAgICBlbnZpcm9ubWVudDogY3JlZGVudGlhbHMuZW52aXJvbm1lbnQsXG4gICAgICBzdGVwczogW1xuICAgICAgICAuLi5jcmVkZW50aWFscy5zZXR1cFN0ZXBzLFxuICAgICAgICB7XG4gICAgICAgICAgaWQ6IFwiYXV0by1xdWV1ZS1wclwiLFxuICAgICAgICAgIHJ1bjogYGdoIHByIG1lcmdlIC0tYXV0byAtLSR7bWVyZ2VNZXRob2R9IFwiJFBSX05VTUJFUlwiIC0tcmVwbyBcIiRHSF9SRVBPXCJgLFxuICAgICAgICAgIGVudjoge1xuICAgICAgICAgICAgR0hfVE9LRU46IGNyZWRlbnRpYWxzLnRva2VuUmVmLFxuICAgICAgICAgICAgR0hfUkVQTzogXCIke3sgZ2l0aHViLnJlcG9zaXRvcnkgfX1cIixcbiAgICAgICAgICAgIFBSX05VTUJFUjogXCIke3sgZ2l0aHViLmV2ZW50Lm51bWJlciB9fVwiLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG5cbiAgICBjb25zdCB3b3JrZmxvdyA9IHdvcmtmbG93RW5naW5lLmFkZFdvcmtmbG93KFwiYXV0by1xdWV1ZVwiKTtcbiAgICB3b3JrZmxvdy5vbih7XG4gICAgICAvLyBUaGUgJ3B1bGwgcmVxdWVzdCcgZXZlbnQgZ2l2ZXMgdGhlIHdvcmtmbG93ICdyZWFkLW9ubHknIHBlcm1pc3Npb25zIG9uIHNvbWVcbiAgICAgIC8vIHB1bGwgcmVxdWVzdHMgKHN1Y2ggYXMgdGhlIG9uZXMgZnJvbSBkZXBlbmRhYm90KSB3aGVuIHVzaW5nIHRoZSBgR0lUSFVCX1RPS0VOYFxuICAgICAgLy8gc2VjdXJpdHkgdG9rZW4uIFRoaXMgcHJldmVudHMgdGhlIHdvcmtmbG93IGZyb20gYXBwcm92aW5nIHRoZXNlIHB1bGwgcmVxdWVzdHMuXG4gICAgICAvLyBHaXRodWIgaGFzIHBsYWNlZCB0aGlzIGd1YXJkIHNvIGFzIHRvIHByZXZlbnQgc2VjdXJpdHkgYXR0YWNrcyBieSBzaW1wbHkgb3BlbmluZ1xuICAgICAgLy8gYSBwdWxsIHJlcXVlc3QgYW5kIHRyaWdnZXJpbmcgYSB3b3JrZmxvdyBvbiBhIGNvbW1pdCB0aGF0IHdhcyBub3QgdmV0dGVkIHRvIG1ha2VcbiAgICAgIC8vIHVuaW50ZW5kZWQgY2hhbmdlcyB0byB0aGUgcmVwb3NpdG9yeS5cbiAgICAgIC8vXG4gICAgICAvLyBJbnN0ZWFkIHVzZSB0aGUgJ3B1bGwgcmVxdWVzdCB0YXJnZXQnIGV2ZW50IGhlcmUgdGhhdCBnaXZlcyB0aGUgR2l0aHViIHdvcmtmbG93XG4gICAgICAvLyAncmVhZC13cml0ZScgcGVybWlzc2lvbnMuIFRoaXMgaXMgc2FmZSBiZWNhdXNlLCB0aGlzIGV2ZW50LCB1bmxpa2UgdGhlICdwdWxsIHJlcXVlc3QnXG4gICAgICAvLyBldmVudCByZWZlcmVuY2VzIHRoZSBCQVNFIGNvbW1pdCBvZiB0aGUgcHVsbCByZXF1ZXN0IGFuZCBub3QgdGhlIEhFQUQgY29tbWl0LlxuICAgICAgLy9cbiAgICAgIC8vIFdlIG9ubHkgZW5hYmxlIGF1dG8tcXVldWUgd2hlbiBhIFBSIGlzIG9wZW5lZCwgcmVvcGVuZWQgb3IgbW92aW5nIGZyb20gRHJhZnQgdG8gUmVhZHksXG4gICAgICAvLyBvciByZXRhcmdldGVkIHRvIGEgZGlmZmVyZW50IGJyYW5jaC4gU3BlY2lmaWNhbGx5LCBpZiBhIHVzZXIgZGlzYWJsZXMgYXV0by1xdWV1ZSB3ZSB0cnkgdmVyeSBoYXJkIHRvIGF2b2lkXG4gICAgICAvLyBhY2NpZGVudGFsbHkgcmUtZW5hYmxpbmcgaXQuXG4gICAgICAvL1xuICAgICAgLy8gVGhlICdlZGl0ZWQnIHRyaWdnZXIgaXMgb25seSB1c2VkIHRvIGRldGVjdCBiYXNlIGJyYW5jaCBjaGFuZ2VzLlxuICAgICAgcHVsbFJlcXVlc3RUYXJnZXQ6IHtcbiAgICAgICAgdHlwZXM6IFtcbiAgICAgICAgICBcIm9wZW5lZFwiLFxuICAgICAgICAgIFwicmVvcGVuZWRcIixcbiAgICAgICAgICBcInJlYWR5X2Zvcl9yZXZpZXdcIixcbiAgICAgICAgICAuLi4obmVlZHNFZGl0ZWRFdmVudCA/IFtcImVkaXRlZFwiIGFzIGNvbnN0XSA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgICAgYnJhbmNoZXM6IG9wdGlvbnMudGFyZ2V0QnJhbmNoZXMsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIHdvcmtmbG93LmFkZEpvYnMoeyBlbmFibGVBdXRvUXVldWU6IGF1dG9RdWV1ZUpvYiB9KTtcbiAgfVxufVxuIl19