projen
Version:
CDK for software projects
142 lines • 16.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isObjectContainingFieldExactly = exports.Circleci = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const component_1 = require("../component");
const util_1 = require("../util");
const yaml_1 = require("../yaml");
/**
* Circleci Class to manage `.circleci/config.yml`.
* Check projen's docs for more information.
*
* @see https://circleci.com/docs/2.0/configuration-reference/
*/
class Circleci extends component_1.Component {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.circleci.Circleci", version: "0.103.12" };
/**
* The yaml file for the Circleci pipeline
* */
file;
/**
* internal copy of options to share options between functions
* @private
*/
options;
/**
* internal map of orbs
* @private
*/
orbs;
/**
* internal list of workflows
* @private
*/
workflows;
/**
* internal list of jobs
* @private
*/
jobs;
constructor(project, options = {}) {
super(project);
this.options = options;
this.orbs = options.orbs ?? {};
this.workflows = options.workflows ?? [];
this.jobs = options.jobs ?? [];
this.file = new yaml_1.YamlFile(project, ".circleci/config.yml", {
obj: () => this.renderCircleCi(),
});
}
/**
* function to prepare the rendering of the yaml file.
* Objects with dynamic keys like workflows and jobs required the field `identifier` to be set.
* Those object will be reduced by `identifier` field before rendering
* @private
*/
renderCircleCi() {
// render dynamic keys for workflow
const workflowRecords = {};
for (const workflow of this.workflows) {
const { identifier, ...reduced } = workflow;
reduced.jobs = this.renderJobs(workflow.jobs);
workflowRecords[identifier] = this.snakeCase(reduced);
}
// render dynamic keys for jobs
const jobRecords = {};
for (const job of this.jobs) {
const { identifier, ...reduced } = job;
jobRecords[identifier] = this.snakeCase(reduced);
}
return {
version: this.options.version || 2.1,
setup: this.options.setup,
orbs: this.orbs,
jobs: Object.keys(jobRecords).length > 0 ? jobRecords : undefined,
workflows: workflowRecords,
};
}
/**
* add new workflow to existing pipeline
* @param workflow
*/
addWorkflow(workflow) {
this.workflows = [...this.workflows, workflow];
}
/**
* reduce objects with `identifier` field for WorkflowJobs.
* A workflow job can contain `orbParameter` which are passed to orbs.
* This map is directly added as `Record<string,any>` to job.
* So we gonna add those after the default field of WorkflowJob.
* @see https://circleci.com/developer/orbs/orb/circleci/node#usage-install_nodejs
* @param jobs
*/
renderJobs = (jobs = []) => {
let result = [];
for (const job of jobs ?? []) {
const { identifier, orbParameters, ...reduced } = job;
if ((0, exports.isObjectContainingFieldExactly)(job, "identifier")) {
result = [...result, identifier];
}
else {
result = [
...result,
{ [identifier]: { ...reduced, ...orbParameters } },
];
}
}
return result;
};
/**
* Add a Circleci Orb to pipeline. Will throw error if the orb already exists
* @param name
* @param orb
*/
addOrb(name, orb) {
if (this.orbs[name] !== undefined) {
throw new Error(`Circleci Config already contains an orb named ${name}.`);
}
this.orbs[name] = orb;
}
/**
* Snake case for listed keys. There are too many exceptions needed to do it recursive without a whitelist.
* This list needs to be updated once we add field with snake case like `aws_auth`.
* @param input
*/
snakeCase = (input) => {
const snakeCaseKeyWords = [
"awsAuth",
"workingDirectory",
"resourceClass",
"dockerLayerCaching",
"noOutputTimeout",
"circleciIpRanges",
];
return (0, util_1.snakeCaseKeys)(input, true, snakeCaseKeyWords);
};
}
exports.Circleci = Circleci;
const isObjectContainingFieldExactly = (obj, field) => {
return Object.keys(obj).length == 1 && Object.keys(obj).includes(field);
};
exports.isObjectContainingFieldExactly = isObjectContainingFieldExactly;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2lyY2xlY2kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2lyY2xlY2kvY2lyY2xlY2kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUNBLDRDQUF5QztBQUV6QyxrQ0FBd0M7QUFDeEMsa0NBQW1DO0FBZ0VuQzs7Ozs7R0FLRztBQUNILE1BQWEsUUFBUyxTQUFRLHFCQUFTOztJQUNyQzs7U0FFSztJQUNXLElBQUksQ0FBVztJQUMvQjs7O09BR0c7SUFDSyxPQUFPLENBQWdCO0lBQy9COzs7T0FHRztJQUNjLElBQUksQ0FBeUI7SUFDOUM7OztPQUdHO0lBQ0ssU0FBUyxDQUFhO0lBQzlCOzs7T0FHRztJQUNjLElBQUksQ0FBUTtJQUU3QixZQUFZLE9BQWdCLEVBQUUsVUFBeUIsRUFBRTtRQUN2RCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksZUFBUSxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRTtZQUN4RCxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxjQUFjO1FBQ3BCLG1DQUFtQztRQUNuQyxNQUFNLGVBQWUsR0FBd0IsRUFBRSxDQUFDO1FBQ2hELEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FB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QUcsQ0FDNUMsR0FBUSxFQUNSLEtBQWEsRUFDSixFQUFFO0lBQ1gsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUUsQ0FBQyxDQUFDO0FBTFcsUUFBQSw4QkFBOEIsa0NBS3pDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBXb3JrZmxvd0pvYiwgV29ya2Zsb3csIEpvYiB9IGZyb20gXCIuL21vZGVsXCI7XG5pbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tIFwiLi4vY29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi4vcHJvamVjdFwiO1xuaW1wb3J0IHsgc25ha2VDYXNlS2V5cyB9IGZyb20gXCIuLi91dGlsXCI7XG5pbXBvcnQgeyBZYW1sRmlsZSB9IGZyb20gXCIuLi95YW1sXCI7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY2xhc3Mge0BsaW5rIENpcmNsZWNpfVxuICpcbiAqIEBzZWUgaHR0cHM6Ly9jaXJjbGVjaS5jb20vZG9jcy8yLjAvY29uZmlndXJhdGlvbi1yZWZlcmVuY2UvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2lyY2xlQ2lQcm9wcyB7XG4gIC8qKlxuICAgKiBDb250YWlucyBhIG1hcCBvZiBDaXJjbENpIE9yYnNcbiAgICogYGBganNvblxuICAgKiBvcmJzOiB7XG4gICAqICBub2RlOiBcImNpcmNsZWNpL25vZGVANS4wLjFcIlxuICAgKiAgc2xhY2s6IFwiY2lyY2xlY2kvc2xhY2tANC44LjNcIlxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcmVhZG9ubHkgb3Jicz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIC8qKlxuICAgKiBwaXBlbGluZSB2ZXJzaW9uXG4gICAqXG4gICAqIEBkZWZhdWx0IDIuMVxuICAgKiBAc2VlIGh0dHBzOi8vY2lyY2xlY2kuY29tL2RvY3MvMi4wL2NvbmZpZ3VyYXRpb24tcmVmZXJlbmNlLyN2ZXJzaW9uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uPzogbnVtYmVyO1xuICAvKipcbiAgICogTGlzdCBvZiBXb3JrZmxvd3Mgb2YgcGlwZWxpbmUsIGUuZy5cbiAgICogYGBganNvblxuICAgKiB3b3JrZmxvd3M6IHtcbiAgICogICB7XG4gICAqICAgICBpZGVudGlmaWVyOiBcImJ1aWxkXCIsXG4gICAqICAgICAgIGpvYnM6IFt7XG4gICAqICAgICAgICAgIGlkZW50aWZpZXI6IFwibm9kZS9pbnN0YWxsXCIsXG4gICAqICAgICAgICAgIGNvbnRleHQ6IFtcIm5wbVwiXSxcbiAgICogICAgICAgfV1cbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9jaXJjbGVjaS5jb20vZG9jcy8yLjAvY29uZmlndXJhdGlvbi1yZWZlcmVuY2UvI3dvcmtmbG93c1xuICAgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dzPzogV29ya2Zsb3dbXTtcbiAgLyoqXG4gICAqIExpc3Qgb2YgSm9icyB0byBjcmVhdGUgdW5pcXVlIHN0ZXBzIHBlciBwaXBlbGluZSwgZS5nLlxuICAgKiBgYGBqc29uXG4gICAqIGpvYnM6IFt7XG4gICAqICBpZGVudGlmaWVyOiBcImNvbXBpbGVcIixcbiAgICogIGRvY2tlcjogeyBpbWFnZTogXCJnb2xhbmc6YWxwaW5lXCIgfVxuICAgKiAgc3RlcHM6IFtcImNoZWNrb3V0XCIsIHJ1bjoge2NvbW1hbmQ6IFwiZ28gYnVpbGQgLlwifV1cbiAgICogfV1cbiAgICogYGBgXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9jaXJjbGVjaS5jb20vZG9jcy8yLjAvY29uZmlndXJhdGlvbi1yZWZlcmVuY2UvI2pvYnNcbiAgICovXG4gIHJlYWRvbmx5IGpvYnM/OiBKb2JbXTtcbiAgLyoqXG4gICAqIFRoZSBzZXR1cCBmaWVsZCBlbmFibGVzIHlvdSB0byBjb25kaXRpb25hbGx5IHRyaWdnZXIgY29uZmlndXJhdGlvbnMgZnJvbSBvdXRzaWRlXG4gICAqIHRoZSBwcmltYXJ5IC5jaXJjbGVjaSBwYXJlbnQgZGlyZWN0b3J5LCB1cGRhdGUgcGlwZWxpbmUgcGFyYW1ldGVycywgb3IgZ2VuZXJhdGUgY3VzdG9taXplZCBjb25maWd1cmF0aW9ucy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2NpcmNsZWNpLmNvbS9kb2NzLzIuMC9jb25maWd1cmF0aW9uLXJlZmVyZW5jZS8jc2V0dXBcbiAgICovXG4gIHJlYWRvbmx5IHNldHVwPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBDaXJjbGVjaSBDbGFzcyB0byBtYW5hZ2UgYC5jaXJjbGVjaS9jb25maWcueW1sYC5cbiAqIENoZWNrIHByb2plbidzIGRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogQHNlZSBodHRwczovL2NpcmNsZWNpLmNvbS9kb2NzLzIuMC9jb25maWd1cmF0aW9uLXJlZmVyZW5jZS9cbiAqL1xuZXhwb3J0IGNsYXNzIENpcmNsZWNpIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIFRoZSB5YW1sIGZpbGUgZm9yIHRoZSBDaXJjbGVjaSBwaXBlbGluZVxuICAgKiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZmlsZTogWWFtbEZpbGU7XG4gIC8qKlxuICAgKiBpbnRlcm5hbCBjb3B5IG9mIG9wdGlvbnMgdG8gc2hhcmUgb3B0aW9ucyBiZXR3ZWVuIGZ1bmN0aW9uc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBvcHRpb25zOiBDaXJjbGVDaVByb3BzO1xuICAvKipcbiAgICogaW50ZXJuYWwgbWFwIG9mIG9yYnNcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb3JiczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIGludGVybmFsIGxpc3Qgb2Ygd29ya2Zsb3dzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIHdvcmtmbG93czogV29ya2Zsb3dbXTtcbiAgLyoqXG4gICAqIGludGVybmFsIGxpc3Qgb2Ygam9ic1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBqb2JzOiBKb2JbXTtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBvcHRpb25zOiBDaXJjbGVDaVByb3BzID0ge30pIHtcbiAgICBzdXBlcihwcm9qZWN0KTtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMub3JicyA9IG9wdGlvbnMub3JicyA/PyB7fTtcbiAgICB0aGlzLndvcmtmbG93cyA9IG9wdGlvbnMud29ya2Zsb3dzID8/IFtdO1xuICAgIHRoaXMuam9icyA9IG9wdGlvbnMuam9icyA/PyBbXTtcbiAgICB0aGlzLmZpbGUgPSBuZXcgWWFtbEZpbGUocHJvamVjdCwgXCIuY2lyY2xlY2kvY29uZmlnLnltbFwiLCB7XG4gICAgICBvYmo6ICgpID0+IHRoaXMucmVuZGVyQ2lyY2xlQ2koKSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBmdW5jdGlvbiB0byBwcmVwYXJlIHRoZSByZW5kZXJpbmcgb2YgdGhlIHlhbWwgZmlsZS5cbiAgICogT2JqZWN0cyB3aXRoIGR5bmFtaWMga2V5cyBsaWtlIHdvcmtmbG93cyBhbmQgam9icyByZXF1aXJlZCB0aGUgZmllbGQgYGlkZW50aWZpZXJgIHRvIGJlIHNldC5cbiAgICogVGhvc2Ugb2JqZWN0IHdpbGwgYmUgcmVkdWNlZCBieSBgaWRlbnRpZmllcmAgZmllbGQgYmVmb3JlIHJlbmRlcmluZ1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJDaXJjbGVDaSgpIHtcbiAgICAvLyByZW5kZXIgZHluYW1pYyBrZXlzIGZvciB3b3JrZmxvd1xuICAgIGNvbnN0IHdvcmtmbG93UmVjb3JkczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3Qgd29ya2Zsb3cgb2YgdGhpcy53b3JrZmxvd3MpIHtcbiAgICAgIGNvbnN0IHsgaWRlbnRpZmllciwgLi4ucmVkdWNlZCB9ID0gd29ya2Zsb3c7XG4gICAgICByZWR1Y2VkLmpvYnMgPSB0aGlzLnJlbmRlckpvYnMod29ya2Zsb3cuam9icyk7XG4gICAgICB3b3JrZmxvd1JlY29yZHNbaWRlbnRpZmllcl0gPSB0aGlzLnNuYWtlQ2FzZShyZWR1Y2VkKTtcbiAgICB9XG5cbiAgICAvLyByZW5kZXIgZHluYW1pYyBrZXlzIGZvciBqb2JzXG4gICAgY29uc3Qgam9iUmVjb3JkczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIGZvciAoY29uc3Qgam9iIG9mIHRoaXMuam9icykge1xuICAgICAgY29uc3QgeyBpZGVudGlmaWVyLCAuLi5yZWR1Y2VkIH0gPSBqb2I7XG4gICAgICBqb2JSZWNvcmRzW2lkZW50aWZpZXJdID0gdGhpcy5zbmFrZUNhc2UocmVkdWNlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcnNpb246IHRoaXMub3B0aW9ucy52ZXJzaW9uIHx8IDIuMSxcbiAgICAgIHNldHVwOiB0aGlzLm9wdGlvbnMuc2V0dXAsXG4gICAgICBvcmJzOiB0aGlzLm9yYnMsXG4gICAgICBqb2JzOiBPYmplY3Qua2V5cyhqb2JSZWNvcmRzKS5sZW5ndGggPiAwID8gam9iUmVjb3JkcyA6IHVuZGVmaW5lZCxcbiAgICAgIHdvcmtmbG93czogd29ya2Zsb3dSZWNvcmRzLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogYWRkIG5ldyB3b3JrZmxvdyB0byBleGlzdGluZyBwaXBlbGluZVxuICAgKiBAcGFyYW0gd29ya2Zsb3dcbiAgICovXG4gIHB1YmxpYyBhZGRXb3JrZmxvdyh3b3JrZmxvdzogV29ya2Zsb3cpIHtcbiAgICB0aGlzLndvcmtmbG93cyA9IFsuLi50aGlzLndvcmtmbG93cywgd29ya2Zsb3ddO1xuICB9XG5cbiAgLyoqXG4gICAqIHJlZHVjZSBvYmplY3RzIHdpdGggYGlkZW50aWZpZXJgIGZpZWxkIGZvciBXb3JrZmxvd0pvYnMuXG4gICAqIEEgd29ya2Zsb3cgam9iIGNhbiBjb250YWluIGBvcmJQYXJhbWV0ZXJgIHdoaWNoIGFyZSBwYXNzZWQgdG8gb3Jicy5cbiAgICogVGhpcyBtYXAgaXMgZGlyZWN0bHkgYWRkZWQgYXMgYFJlY29yZDxzdHJpbmcsYW55PmAgdG8gam9iLlxuICAgKiBTbyB3ZSBnb25uYSBhZGQgdGhvc2UgYWZ0ZXIgdGhlIGRlZmF1bHQgZmllbGQgb2YgV29ya2Zsb3dKb2IuXG4gICAqIEBzZWUgaHR0cHM6Ly9jaXJjbGVjaS5jb20vZGV2ZWxvcGVyL29yYnMvb3JiL2NpcmNsZWNpL25vZGUjdXNhZ2UtaW5zdGFsbF9ub2RlanNcbiAgICogQHBhcmFtIGpvYnNcbiAgICovXG4gIHByaXZhdGUgcmVuZGVySm9icyA9IChqb2JzOiBXb3JrZmxvd0pvYltdID0gW10pOiBhbnkgPT4ge1xuICAgIGxldCByZXN1bHQ6IGFueSA9IFtdO1xuICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMgPz8gW10pIHtcbiAgICAgIGNvbnN0IHsgaWRlbnRpZmllciwgb3JiUGFyYW1ldGVycywgLi4ucmVkdWNlZCB9ID0gam9iO1xuICAgICAgaWYgKGlzT2JqZWN0Q29udGFpbmluZ0ZpZWxkRXhhY3RseShqb2IsIFwiaWRlbnRpZmllclwiKSkge1xuICAgICAgICByZXN1bHQgPSBbLi4ucmVzdWx0LCBpZGVudGlmaWVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdCA9IFtcbiAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgeyBbaWRlbnRpZmllcl06IHsgLi4ucmVkdWNlZCwgLi4ub3JiUGFyYW1ldGVycyB9IH0sXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIEFkZCBhIENpcmNsZWNpIE9yYiB0byBwaXBlbGluZS4gV2lsbCB0aHJvdyBlcnJvciBpZiB0aGUgb3JiIGFscmVhZHkgZXhpc3RzXG4gICAqIEBwYXJhbSBuYW1lXG4gICAqIEBwYXJhbSBvcmJcbiAgICovXG4gIHB1YmxpYyBhZGRPcmIobmFtZTogc3RyaW5nLCBvcmI6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm9yYnNbbmFtZV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaXJjbGVjaSBDb25maWcgYWxyZWFkeSBjb250YWlucyBhbiBvcmIgbmFtZWQgJHtuYW1lfS5gKTtcbiAgICB9XG4gICAgdGhpcy5vcmJzW25hbWVdID0gb3JiO1xuICB9XG5cbiAgLyoqXG4gICAqIFNuYWtlIGNhc2UgZm9yIGxpc3RlZCBrZXlzLiBUaGVyZSBhcmUgdG9vIG1hbnkgZXhjZXB0aW9ucyBuZWVkZWQgdG8gZG8gaXQgcmVjdXJzaXZlIHdpdGhvdXQgYSB3aGl0ZWxpc3QuXG4gICAqIFRoaXMgbGlzdCBuZWVkcyB0byBiZSB1cGRhdGVkIG9uY2Ugd2UgYWRkIGZpZWxkIHdpdGggc25ha2UgY2FzZSBsaWtlIGBhd3NfYXV0aGAuXG4gICAqIEBwYXJhbSBpbnB1dFxuICAgKi9cbiAgcHJpdmF0ZSBzbmFrZUNhc2UgPSAoaW5wdXQ6IGFueSk6IGFueSA9PiB7XG4gICAgY29uc3Qgc25ha2VDYXNlS2V5V29yZHMgPSBbXG4gICAgICBcImF3c0F1dGhcIixcbiAgICAgIFwid29ya2luZ0RpcmVjdG9yeVwiLFxuICAgICAgXCJyZXNvdXJjZUNsYXNzXCIsXG4gICAgICBcImRvY2tlckxheWVyQ2FjaGluZ1wiLFxuICAgICAgXCJub091dHB1dFRpbWVvdXRcIixcbiAgICAgIFwiY2lyY2xlY2lJcFJhbmdlc1wiLFxuICAgIF07XG4gICAgcmV0dXJuIHNuYWtlQ2FzZUtleXMoaW5wdXQsIHRydWUsIHNuYWtlQ2FzZUtleVdvcmRzKTtcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzT2JqZWN0Q29udGFpbmluZ0ZpZWxkRXhhY3RseSA9IChcbiAgb2JqOiBhbnksXG4gIGZpZWxkOiBzdHJpbmcsXG4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09IDEgJiYgT2JqZWN0LmtleXMob2JqKS5pbmNsdWRlcyhmaWVsZCk7XG59O1xuIl19