@aws/pdk
Version:
All documentation is located at: https://aws.github.io/aws-pdk
195 lines • 29.4 kB
JavaScript
;
var _a, _b;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CdkGraph = exports.CdkGraphContext = exports.CdkGraphArtifacts = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
/*! Copyright [Amazon.com](http://amazon.com/), Inc. or its affiliates. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0 */
const path = require("path");
const monorepo_1 = require("../monorepo");
const aws_cdk_lib_1 = require("aws-cdk-lib");
const chalk = require("chalk"); // eslint-disable-line @typescript-eslint/no-require-imports
const constructs_1 = require("constructs");
const fs = require("fs-extra");
const cdk_internals_1 = require("./cdk-internals");
const config_1 = require("./config");
const core_1 = require("./core");
const GRAPH_ARTIFACT_ID = "GRAPH";
/** CdkGraph core artifacts */
var CdkGraphArtifacts;
(function (CdkGraphArtifacts) {
CdkGraphArtifacts["GRAPH_METADATA"] = "graph-metadata.json";
CdkGraphArtifacts["GRAPH"] = "graph.json";
})(CdkGraphArtifacts || (exports.CdkGraphArtifacts = CdkGraphArtifacts = {}));
/** CdkGraph context */
class CdkGraphContext {
constructor(store, outdir) {
this.store = store;
this.outdir = outdir;
/** @internal */
this._artifacts = {};
}
/**
* Get CdkGraph artifact by id
* @throws Error is artifact does not exist
*/
getArtifact(id) {
const artifact = this._artifacts[id];
if (artifact) {
return artifact;
}
throw new Error(`Graph artifact ${id} does not exist`);
}
/** Get CdkGraph core `graph.json` artifact */
get graphJson() {
return this.getArtifact(GRAPH_ARTIFACT_ID);
}
/** Indicates if context has an artifact with *filename* defined */
hasArtifactFile(filename) {
return !!Object.values(this._artifacts).find((artifact) => artifact.filename === filename);
}
/** Get record of all graph artifacts keyed by artifact id */
get artifacts() {
return this._artifacts;
}
/**
* Logs an artifact entry. In general this should not be called directly, as `writeArtifact` should be utilized
* to perform writing and logging artifacts. However some plugins utilize other tools that generate the artifacts,
* in which case the plugin would call this method to log the entry.
* @param source The source of the artifact, such as the name of plugin
* @param id Unique id of the artifact
* @param filepath Full path where the artifact is stored
* @param description Description of the artifact
* @returns
* @throws Error is artifact id or filename already exists
*/
logArtifact(source, id, filepath, description) {
if (id in this._artifacts) {
throw new Error(`Graph artifact ${id} already defined`);
}
if (this.hasArtifactFile(filepath)) {
throw new Error(`Graph artifact "${filepath}" already defined`);
}
const filename = path.relative(this.outdir, filepath);
if (!(source instanceof CdkGraph)) {
if (Object.keys(CdkGraphArtifacts).includes(id)) {
throw new Error(`Graph artifact id ${id} is reserved`);
}
if (Object.values(CdkGraphArtifacts).includes(filename)) {
throw new Error(`Graph artifact file ${filename} is reserved`);
}
}
const artifact = {
id,
filepath,
description,
filename,
source: source instanceof CdkGraph
? `${CdkGraph.ID}`
: `plugin:${source.id}@${source.version}`,
};
this._artifacts[id] = artifact;
console.info(chalk.cyanBright(`[CdkGraph] Artifact ${id} written to \x1B]8;;file://${artifact.filepath}\x1B\\${artifact.filename}\x1B]8;;\x1B\\ (${artifact.source})`));
return artifact;
}
/**
* Writes artifact data to outdir and logs the entry.
* @param source The source of the artifact, such as the name of plugin
* @param id Unique id of the artifact
* @param filename Relative name of the file
* @param description Description of the artifact
* @returns
*/
writeArtifact(source, id, filename, data, description) {
const filepath = path.join(this.outdir, filename);
const artifact = this.logArtifact(source, id, filepath, description);
fs.ensureDirSync(path.dirname(filepath));
fs.writeFileSync(filepath, data, { encoding: "utf-8" });
return artifact;
}
}
exports.CdkGraphContext = CdkGraphContext;
_a = JSII_RTTI_SYMBOL_1;
CdkGraphContext[_a] = { fqn: "@aws/pdk.cdk_graph.CdkGraphContext", version: "0.26.14" };
/**
* CdkGraph construct is the cdk-graph framework controller that is responsible for
* computing the graph, storing serialized graph, and instrumenting plugins per the
* plugin contract.
*/
class CdkGraph extends constructs_1.Construct {
/**
* Get the context for the graph instance.
*
* This will be `undefined` before construct synthesis has initiated.
*/
get graphContext() {
return this._context;
}
constructor(root, props = {}) {
super(root, CdkGraph.ID);
this.root = root;
(0, monorepo_1.addMetric)(root, "cdk-graph");
this.config = (0, config_1.resolveConfig)();
this.plugins = props.plugins || [];
// TODO: verify plugin deps via semver
// bind all plugins to this instance of the graph
this.plugins.forEach((plugin) => {
(0, monorepo_1.addMetric)(root, `cdk-graph-plugin-${plugin.id}`);
plugin.bind(this);
});
// Apply Aspect for each plugin that supports "inspect" phase
this.plugins.forEach((plugin) => {
if (plugin.inspect) {
aws_cdk_lib_1.Aspects.of(this.root).add({
visit: plugin.inspect,
});
}
});
(0, cdk_internals_1.addCustomSynthesis)(this, {
onSynthesize: (session) => {
this._synthesize(session);
},
});
}
/** @internal */
_synthesize(session) {
const store = (0, core_1.computeGraph)(this.root);
const outdir = (0, config_1.resolveOutdir)(session.outdir, this.config.outdir);
const context = new CdkGraphContext(store, outdir);
context.writeArtifact(this, GRAPH_ARTIFACT_ID, CdkGraphArtifacts.GRAPH, JSON.stringify(context.store.serialize(), null, 2), "Serialized graph");
this.plugins.forEach((plugin) => {
plugin.synthesize && plugin.synthesize(context);
});
fs.writeFileSync(path.join(outdir, CdkGraphArtifacts.GRAPH_METADATA), JSON.stringify({
version: CdkGraph.VERSION,
artifacts: context.artifacts,
}, null, 2), { encoding: "utf-8" });
// store context for reporting
this._context = context;
}
/**
* Asynchronous report generation. This operation enables running expensive and non-synchronous
* report generation by plugins post synthesis.
*
* If a given plugin requires performing asynchronous operations or is general expensive, it should
* utilize `report` rather than `synthesize`.
*/
async report() {
if (this._context == null) {
// TODO: support deserializing pdk-graph to generate store/context
console.warn(chalk.yellowBright("[CdkGraph] In the near future, reports will be runnable outside of cdk synth"));
throw new Error("CdkGraph report called outside of cdk synth process");
}
for (const plugin of this.plugins) {
plugin.report && (await plugin.report(this._context));
}
}
}
exports.CdkGraph = CdkGraph;
_b = JSII_RTTI_SYMBOL_1;
CdkGraph[_b] = { fqn: "@aws/pdk.cdk_graph.CdkGraph", version: "0.26.14" };
/** Fixed CdkGraph construct id */
CdkGraph.ID = core_1.GRAPH_ID;
/** Current CdkGraph semantic version */
CdkGraph.VERSION = "0.0.0"; // TODO: make dynamic from package
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLWdyYXBoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2RrLWdyYXBoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7c0NBQ3NDO0FBQ3RDLDZCQUE2QjtBQUM3Qiw0Q0FBMEM7QUFDMUMsNkNBQXlEO0FBQ3pELCtCQUFnQyxDQUFDLDREQUE0RDtBQUM3RiwyQ0FBbUQ7QUFDbkQsK0JBQStCO0FBQy9CLG1EQUFxRDtBQUNyRCxxQ0FBd0U7QUFDeEUsaUNBQWdFO0FBRWhFLE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDO0FBRWxDLDhCQUE4QjtBQUM5QixJQUFZLGlCQUdYO0FBSEQsV0FBWSxpQkFBaUI7SUFDM0IsMkRBQXNDLENBQUE7SUFDdEMseUNBQW9CLENBQUE7QUFDdEIsQ0FBQyxFQUhXLGlCQUFpQixpQ0FBakIsaUJBQWlCLFFBRzVCO0FBc0JELHVCQUF1QjtBQUN2QixNQUFhLGVBQWU7SUFJMUIsWUFDa0IsS0FBa0IsRUFDbEIsTUFBYztRQURkLFVBQUssR0FBTCxLQUFLLENBQWE7UUFDbEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUxoQyxnQkFBZ0I7UUFDUCxlQUFVLEdBQXlCLEVBQUUsQ0FBQztJQUs1QyxDQUFDO0lBRUo7OztPQUdHO0lBQ0gsV0FBVyxDQUFDLEVBQVU7UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ2IsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsOENBQThDO0lBQzlDLElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxtRUFBbUU7SUFDbkUsZUFBZSxDQUFDLFFBQWdCO1FBQzlC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QVEsR0FBRyxPQUFPLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLEtBQUssQ0FBQyxNQUFNO1FBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUMxQixrRUFBa0U7WUFDbEUsT0FBTyxDQUFDLElBQUksQ0FDVixLQUFLLENBQUMsWUFBWSxDQUNoQiw4RUFBOEUsQ0FDL0UsQ0FDRixDQUFDO1lBQ0YsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7UUFDRCxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7SUFDSCxDQUFDOztBQS9HSCw0QkFnSEM7OztBQS9HQyxrQ0FBa0M7QUFDbEIsV0FBRSxHQUFHLGVBQVEsQ0FBQztBQUM5Qix3Q0FBd0M7QUFDeEIsZ0JBQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxrQ0FBa0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKiEgQ29weXJpZ2h0IFtBbWF6b24uY29tXShodHRwOi8vYW1hem9uLmNvbS8pLCBJbmMuIG9yIGl0cyBhZmZpbGlhdGVzLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFwYWNoZS0yLjAgKi9cbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGFkZE1ldHJpYyB9IGZyb20gXCJAYXdzL21vbm9yZXBvXCI7XG5pbXBvcnQgeyBBc3BlY3RzLCBJU3ludGhlc2lzU2Vzc2lvbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IGNoYWxrID0gcmVxdWlyZShcImNoYWxrXCIpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmltcG9ydCB7IENvbnN0cnVjdCwgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnMtZXh0cmFcIjtcbmltcG9ydCB7IGFkZEN1c3RvbVN5bnRoZXNpcyB9IGZyb20gXCIuL2Nkay1pbnRlcm5hbHNcIjtcbmltcG9ydCB7IENka0dyYXBoQ29uZmlnLCByZXNvbHZlQ29uZmlnLCByZXNvbHZlT3V0ZGlyIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBjb21wdXRlR3JhcGgsIEdyYXBoLCBWZXJzaW9uLCBHUkFQSF9JRCB9IGZyb20gXCIuL2NvcmVcIjtcblxuY29uc3QgR1JBUEhfQVJUSUZBQ1RfSUQgPSBcIkdSQVBIXCI7XG5cbi8qKiBDZGtHcmFwaCBjb3JlIGFydGlmYWN0cyAqL1xuZXhwb3J0IGVudW0gQ2RrR3JhcGhBcnRpZmFjdHMge1xuICBHUkFQSF9NRVRBREFUQSA9IFwiZ3JhcGgtbWV0YWRhdGEuanNvblwiLFxuICBHUkFQSCA9IFwiZ3JhcGguanNvblwiLFxufVxuXG4vKipcbiAqIENka0dyYXBoIGFydGlmYWN0IGRlZmluaXRpb25cbiAqIEBzdHJ1Y3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZGtHcmFwaEFydGlmYWN0IHtcbiAgLyoqIFRoZSB1bmlxdWUgdHlwZSBvZiB0aGUgYXJ0aWZhY3QgKi9cbiAgcmVhZG9ubHkgaWQ6IHN0cmluZztcbiAgLyoqIEZpbGVuYW1lIG9mIHRoZSBhcnRpZmFjdCAqL1xuICByZWFkb25seSBmaWxlbmFtZTogc3RyaW5nO1xuICAvKiogRnVsbCBwYXRoIHdoZXJlIGFydGlmYWN0IGlzIHN0b3JlZCAqL1xuICByZWFkb25seSBmaWxlcGF0aDogc3RyaW5nO1xuICAvKiogRGVzY3JpcHRpb24gb2YgYXJ0aWZhY3QgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc291cmNlIG9mIHRoZSBhcnRpZmFjdCAoc3VjaCBhcyBwbHVnaW4sIG9yIGNvcmUgc3lzdGVtLCBldGMpICovXG4gIHJlYWRvbmx5IHNvdXJjZTogc3RyaW5nO1xufVxuXG4vKiogRGljdGlvbmFyeSBvZiBncmFwaCBhcnRpZmFjdHMgYnkgaWQgKi9cbmV4cG9ydCB0eXBlIENka0dyYXBoQXJ0aWZhY3REaWN0ID0geyBbaWQ6IHN0cmluZ106IENka0dyYXBoQXJ0aWZhY3QgfTtcblxuLyoqIENka0dyYXBoIGNvbnRleHQgKi9cbmV4cG9ydCBjbGFzcyBDZGtHcmFwaENvbnRleHQge1xuICAvKiogQGludGVybmFsICovXG4gIHJlYWRvbmx5IF9hcnRpZmFjdHM6IENka0dyYXBoQXJ0aWZhY3REaWN0ID0ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IHN0b3JlOiBHcmFwaC5TdG9yZSxcbiAgICBwdWJsaWMgcmVhZG9ubHkgb3V0ZGlyOiBzdHJpbmdcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBHZXQgQ2RrR3JhcGggYXJ0aWZhY3QgYnkgaWRcbiAgICogQHRocm93cyBFcnJvciBpcyBhcnRpZmFjdCBkb2VzIG5vdCBleGlzdFxuICAgKi9cbiAgZ2V0QXJ0aWZhY3QoaWQ6IHN0cmluZyk6IENka0dyYXBoQXJ0aWZhY3Qge1xuICAgIGNvbnN0IGFydGlmYWN0ID0gdGhpcy5fYXJ0aWZhY3RzW2lkXTtcbiAgICBpZiAoYXJ0aWZhY3QpIHtcbiAgICAgIHJldHVybiBhcnRpZmFjdDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBHcmFwaCBhcnRpZmFjdCAke2lkfSBkb2VzIG5vdCBleGlzdGApO1xuICB9XG5cbiAgLyoqIEdldCBDZGtHcmFwaCBjb3JlIGBncmFwaC5qc29uYCBhcnRpZmFjdCAqL1xuICBnZXQgZ3JhcGhKc29uKCk6IENka0dyYXBoQXJ0aWZhY3Qge1xuICAgIHJldHVybiB0aGlzLmdldEFydGlmYWN0KEdSQVBIX0FSVElGQUNUX0lEKTtcbiAgfVxuXG4gIC8qKiBJbmRpY2F0ZXMgaWYgY29udGV4dCBoYXMgYW4gYXJ0aWZhY3Qgd2l0aCAqZmlsZW5hbWUqIGRlZmluZWQgKi9cbiAgaGFzQXJ0aWZhY3RGaWxlKGZpbGVuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFPYmplY3QudmFsdWVzKHRoaXMuX2FydGlmYWN0cykuZmluZChcbiAgICAgIChhcnRpZmFjdCkgPT4gYXJ0aWZhY3QuZmlsZW5hbWUgPT09IGZpbGVuYW1lXG4gICAgKTtcbiAgfVxuXG4gIC8qKiBHZXQgcmVjb3JkIG9mIGFsbCBncmFwaCBhcnRpZmFjdHMga2V5ZWQgYnkgYXJ0aWZhY3QgaWQgKi9cbiAgZ2V0IGFydGlmYWN0cygpOiBDZGtHcmFwaEFydGlmYWN0RGljdCB7XG4gICAgcmV0dXJuIHRoaXMuX2FydGlmYWN0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dzIGFuIGFydGlmYWN0IGVudHJ5LiBJbiBnZW5lcmFsIHRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHksIGFzIGB3cml0ZUFydGlmYWN0YCBzaG91bGQgYmUgdXRpbGl6ZWRcbiAgICogdG8gcGVyZm9ybSB3cml0aW5nIGFuZCBsb2dnaW5nIGFydGlmYWN0cy4gSG93ZXZlciBzb21lIHBsdWdpbnMgdXRpbGl6ZSBvdGhlciB0b29scyB0aGF0IGdlbmVyYXRlIHRoZSBhcnRpZmFjdHMsXG4gICAqIGluIHdoaWNoIGNhc2UgdGhlIHBsdWdpbiB3b3VsZCBjYWxsIHRoaXMgbWV0aG9kIHRvIGxvZyB0aGUgZW50cnkuXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgYXJ0aWZhY3QsIHN1Y2ggYXMgdGhlIG5hbWUgb2YgcGx1Z2luXG4gICAqIEBwYXJhbSBpZCBVbmlxdWUgaWQgb2YgdGhlIGFydGlmYWN0XG4gICAqIEBwYXJhbSBmaWxlcGF0aCBGdWxsIHBhdGggd2hlcmUgdGhlIGFydGlmYWN0IGlzIHN0b3JlZFxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gRGVzY3JpcHRpb24gb2YgdGhlIGFydGlmYWN0XG4gICAqIEByZXR1cm5zXG4gICAqIEB0aHJvd3MgRXJyb3IgaXMgYXJ0aWZhY3QgaWQgb3IgZmlsZW5hbWUgYWxyZWFkeSBleGlzdHNcbiAgICovXG4gIGxvZ0FydGlmYWN0KFxuICAgIHNvdXJjZTogQ2RrR3JhcGggfCBJQ2RrR3JhcGhQbHVnaW4sXG4gICAgaWQ6IHN0cmluZyxcbiAgICBmaWxlcGF0aDogc3RyaW5nLFxuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gICk6IENka0dyYXBoQXJ0aWZhY3Qge1xuICAgIGlmIChpZCBpbiB0aGlzLl9hcnRpZmFjdHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR3JhcGggYXJ0aWZhY3QgJHtpZH0gYWxyZWFkeSBkZWZpbmVkYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmhhc0FydGlmYWN0RmlsZShmaWxlcGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgR3JhcGggYXJ0aWZhY3QgXCIke2ZpbGVwYXRofVwiIGFscmVhZHkgZGVmaW5lZGApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbGVuYW1lID0gcGF0aC5yZWxhdGl2ZSh0aGlzLm91dGRpciwgZmlsZXBhdGgpO1xuXG4gICAgaWYgKCEoc291cmNlIGluc3RhbmNlb2YgQ2RrR3JhcGgpKSB7XG4gICAgICBpZiAoT2JqZWN0LmtleXMoQ2RrR3JhcGhBcnRpZmFjdHMpLmluY2x1ZGVzKGlkKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdyYXBoIGFydGlmYWN0IGlkICR7aWR9IGlzIHJlc2VydmVkYCk7XG4gICAgICB9XG4gICAgICBpZiAoT2JqZWN0LnZhbHVlcyhDZGtHcmFwaEFydGlmYWN0cykuaW5jbHVkZXMoZmlsZW5hbWUgYXMgYW55KSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEdyYXBoIGFydGlmYWN0IGZpbGUgJHtmaWxlbmFtZX0gaXMgcmVzZXJ2ZWRgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhcnRpZmFjdDogQ2RrR3JhcGhBcnRpZmFjdCA9IHtcbiAgICAgIGlkLFxuICAgICAgZmlsZXBhdGgsXG4gICAgICBkZXNjcmlwdGlvbixcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgc291cmNlOlxuICAgICAgICBzb3VyY2UgaW5zdGFuY2VvZiBDZGtHcmFwaFxuICAgICAgICAgID8gYCR7Q2RrR3JhcGguSUR9YFxuICAgICAgICAgIDogYHBsdWdpbjoke3NvdXJjZS5pZH1AJHtzb3VyY2UudmVyc2lvbn1gLFxuICAgIH07XG5cbiAgICB0aGlzLl9hcnRpZmFjdHNbaWRdID0gYXJ0aWZhY3Q7XG5cbiAgICBjb25zb2xlLmluZm8oXG4gICAgICBjaGFsay5jeWFuQnJpZ2h0KFxuICAgICAgICBgW0Nka0dyYXBoXSBBcnRpZmFjdCAke2lkfSB3cml0dGVuIHRvIFxceDFCXTg7O2ZpbGU6Ly8ke2FydGlmYWN0LmZpbGVwYXRofVxceDFCXFxcXCR7YXJ0aWZhY3QuZmlsZW5hbWV9XFx4MUJdODs7XFx4MUJcXFxcICgke2FydGlmYWN0LnNvdXJjZX0pYFxuICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gYXJ0aWZhY3Q7XG4gIH1cblxuICAvKipcbiAgICogV3JpdGVzIGFydGlmYWN0IGRhdGEgdG8gb3V0ZGlyIGFuZCBsb2dzIHRoZSBlbnRyeS5cbiAgICogQHBhcmFtIHNvdXJjZSBUaGUgc291cmNlIG9mIHRoZSBhcnRpZmFjdCwgc3VjaCBhcyB0aGUgbmFtZSBvZiBwbHVnaW5cbiAgICogQHBhcmFtIGlkIFVuaXF1ZSBpZCBvZiB0aGUgYXJ0aWZhY3RcbiAgICogQHBhcmFtIGZpbGVuYW1lIFJlbGF0aXZlIG5hbWUgb2YgdGhlIGZpbGVcbiAgICogQHBhcmFtIGRlc2NyaXB0aW9uIERlc2NyaXB0aW9uIG9mIHRoZSBhcnRpZmFjdFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgd3JpdGVBcnRpZmFjdChcbiAgICBzb3VyY2U6IENka0dyYXBoIHwgSUNka0dyYXBoUGx1Z2luLFxuICAgIGlkOiBzdHJpbmcsXG4gICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICBkYXRhOiBzdHJpbmcsXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmdcbiAgKTogQ2RrR3JhcGhBcnRpZmFjdCB7XG4gICAgY29uc3QgZmlsZXBhdGggPSBwYXRoLmpvaW4odGhpcy5vdXRkaXIsIGZpbGVuYW1lKTtcbiAgICBjb25zdCBhcnRpZmFjdCA9IHRoaXMubG9nQXJ0aWZhY3Qoc291cmNlLCBpZCwgZmlsZXBhdGgsIGRlc2NyaXB0aW9uKTtcblxuICAgIGZzLmVuc3VyZURpclN5bmMocGF0aC5kaXJuYW1lKGZpbGVwYXRoKSk7XG5cbiAgICBmcy53cml0ZUZpbGVTeW5jKGZpbGVwYXRoLCBkYXRhLCB7IGVuY29kaW5nOiBcInV0Zi04XCIgfSk7XG5cbiAgICByZXR1cm4gYXJ0aWZhY3Q7XG4gIH1cbn1cblxuLyoqIENhbGxiYWNrIHNpZ25hdHVyZSBmb3IgZ3JhcGggYFBsdWdpbi5iaW5kYCBvcGVyYXRpb24gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUdyYXBoUGx1Z2luQmluZENhbGxiYWNrIHtcbiAgKGdyYXBoOiBDZGtHcmFwaCk6IHZvaWQ7XG59XG5cbi8qKiBDYWxsYmFjayBzaWduYXR1cmUgZm9yIGdyYXBoIGBQbHVnaW4uaW5zcGVjdGAgb3BlcmF0aW9uICovXG5leHBvcnQgaW50ZXJmYWNlIElHcmFwaFZpc2l0b3JDYWxsYmFjayB7XG4gIChjb25zdHJ1Y3Q6IElDb25zdHJ1Y3QpOiB2b2lkO1xufVxuXG4vKiogQ2FsbGJhY2sgc2lnbmF0dXJlIGZvciBncmFwaCBgUGx1Z2luLnN5bnRoZXNpemVgIG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR3JhcGhTeW50aGVzaXplQ2FsbGJhY2sge1xuICAoY29udGV4dDogQ2RrR3JhcGhDb250ZXh0KTogdm9pZDtcbn1cblxuLyoqIENhbGxiYWNrIHNpZ25hdHVyZSBmb3IgZ3JhcGggYFBsdWdpbi5yZXBvcnRgIG9wZXJhdGlvbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJR3JhcGhSZXBvcnRDYWxsYmFjayB7XG4gIChjb250ZXh0OiBDZGtHcmFwaENvbnRleHQpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKiogQ2RrR3JhcGggKipQbHVnaW4qKiBpbnRlcmZhY2UgKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUNka0dyYXBoUGx1Z2luIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBsdWdpbiAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuICAvKiogUGx1Z2luIHZlcnNpb24gKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogVmVyc2lvbjtcbiAgLyoqIExpc3Qgb2YgcGx1Z2lucyB0aGlzIHBsdWdpbiBkZXBlbmRzIG9uLCBpbmNsdWRpbmcgb3B0aW9uYWwgc2VtdmVyIHZlcnNpb24gKGVnOiBbXCJmb29cIiwgXCJiYXJAMS4yXCJdKSAqL1xuICByZWFkb25seSBkZXBlbmRlbmNpZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQmluZHMgdGhlIHBsdWdpbiB0byB0aGUgQ2RrR3JhcGggaW5zdGFuY2UuIEVuYWJsZXMgcGx1Z2lucyB0byByZWNlaXZlIGJhc2UgY29uZmlncy5cbiAgICovXG4gIGJpbmQ6IElHcmFwaFBsdWdpbkJpbmRDYWxsYmFjaztcblxuICAvKipcbiAgICogTm9kZSB2aXNpdG9yIGNhbGxiYWNrIGZvciBjb25zdHJ1Y3QgdHJlZSB0cmF2ZXJzYWwuIFRoaXMgZm9sbG93cyBJQXNwZWN0LnZpc2l0IHBhdHRlcm4sIGJ1dCB0aGUgb3JkZXJcbiAgICogb2YgdmlzaXRvciB0cmF2ZXJzYWwgaW4gbWFuYWdlZCBieSB0aGUgQ2RrR3JhcGguXG4gICAqL1xuICBpbnNwZWN0PzogSUdyYXBoVmlzaXRvckNhbGxiYWNrO1xuICAvKipcbiAgICogQ2FsbGVkIGR1cmluZyBDREsgc3ludGhlc2l6ZSB0byBnZW5lcmF0ZSBzeW5jaHJvbm91cyBhcnRpZmFjdHMgYmFzZWQgb24gdGhlIGluLW1lbW9yeSBncmFwaCBwYXNzZWRcbiAgICogdG8gdGhlIHBsdWdpbi4gVGhpcyBpcyBjYWxsZWQgaW4gZmlmbyBvcmRlciBvZiBwbHVnaW5zLlxuICAgKi9cbiAgc3ludGhlc2l6ZT86IElHcmFwaFN5bnRoZXNpemVDYWxsYmFjaztcbiAgLyoqXG4gICAqIEdlbmVyYXRlIGFzeW5jaHJvbm91cyByZXBvcnRzIGJhc2VkIG9uIHRoZSBncmFwaC4gVGhpcyBpcyBub3QgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiBzeW50aGVzaXppbmcgQ0RLLlxuICAgKiBEZXZlbG9wZXIgbXVzdCBleHBsaWNpdGx5IGFkZCBgYXdhaXQgZ3JhcGhJbnN0YW5jZS5yZXBvcnQoKWAgdG8gdGhlIENESyBiaW4gb3IgaW52b2tlIHRoaXMgb3V0c2lkZVxuICAgKiBvZiB0aGUgQ0RLIHN5bnRoLiBJbiBlaXRoZXIgY2FzZSwgdGhlIHBsdWdpbiByZWNlaXZlcyB0aGUgaW4tbWVtb3J5IGdyYXBoIGludGVyZmFjZSB3aGVuIGludm9rZWQsIGFzIHRoZVxuICAgKiBDZGtHcmFwaCB3aWxsIGRlc2VyaWFsaXplIHRoZSBncmFwaCBwcmlvciB0byBpbnZva2luZyB0aGUgcGx1Z2luIHJlcG9ydC5cbiAgICovXG4gIHJlcG9ydD86IElHcmFwaFJlcG9ydENhbGxiYWNrO1xufVxuXG4vKipcbiAqICB7QGxpbmsgQ2RrR3JhcGh9IHByb3BzXG4gKiBAc3RydWN0XG4gKiAqL1xuZXhwb3J0IGludGVyZmFjZSBJQ2RrR3JhcGhQcm9wcyB7XG4gIC8qKiBMaXN0IG9mIHBsdWdpbnMgdG8gZXh0ZW5kcyB0aGUgZ3JhcGguIFBsdWdpbnMgYXJlIGludm9rZWQgYXQgZWFjaCBwaGFzZXMgaW4gZmlmbyBvcmRlci4gKi9cbiAgcmVhZG9ubHkgcGx1Z2lucz86IElDZGtHcmFwaFBsdWdpbltdO1xufVxuXG4vKipcbiAqIENka0dyYXBoIGNvbnN0cnVjdCBpcyB0aGUgY2RrLWdyYXBoIGZyYW1ld29yayBjb250cm9sbGVyIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yXG4gKiBjb21wdXRpbmcgdGhlIGdyYXBoLCBzdG9yaW5nIHNlcmlhbGl6ZWQgZ3JhcGgsIGFuZCBpbnN0cnVtZW50aW5nIHBsdWdpbnMgcGVyIHRoZVxuICogcGx1Z2luIGNvbnRyYWN0LlxuICovXG5leHBvcnQgY2xhc3MgQ2RrR3JhcGggZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKiogRml4ZWQgQ2RrR3JhcGggY29uc3RydWN0IGlkICovXG4gIHN0YXRpYyByZWFkb25seSBJRCA9IEdSQVBIX0lEO1xuICAvKiogQ3VycmVudCBDZGtHcmFwaCBzZW1hbnRpYyB2ZXJzaW9uICovXG4gIHN0YXRpYyByZWFkb25seSBWRVJTSU9OID0gXCIwLjAuMFwiOyAvLyBUT0RPOiBtYWtlIGR5bmFtaWMgZnJvbSBwYWNrYWdlXG5cbiAgLyoqIExpc3Qgb2YgcGx1Z2lucyByZWdpc3RlcmVkIHdpdGggdGhpcyBpbnN0YW5jZSAqL1xuICByZWFkb25seSBwbHVnaW5zOiBJQ2RrR3JhcGhQbHVnaW5bXTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2NvbnRleHQ/OiBDZGtHcmFwaENvbnRleHQ7XG5cbiAgLyoqIENvbmZpZyAqL1xuICByZWFkb25seSBjb25maWc6IENka0dyYXBoQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbnRleHQgZm9yIHRoZSBncmFwaCBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhpcyB3aWxsIGJlIGB1bmRlZmluZWRgIGJlZm9yZSBjb25zdHJ1Y3Qgc3ludGhlc2lzIGhhcyBpbml0aWF0ZWQuXG4gICAqL1xuICBnZXQgZ3JhcGhDb250ZXh0KCk6IENka0dyYXBoQ29udGV4dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnRleHQ7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgcm9vdDogQ29uc3RydWN0LCBwcm9wczogSUNka0dyYXBoUHJvcHMgPSB7fSkge1xuICAgIHN1cGVyKHJvb3QsIENka0dyYXBoLklEKTtcblxuICAgIGFkZE1ldHJpYyhyb290LCBcImNkay1ncmFwaFwiKTtcblxuICAgIHRoaXMuY29uZmlnID0gcmVzb2x2ZUNvbmZpZygpO1xuXG4gICAgdGhpcy5wbHVnaW5zID0gcHJvcHMucGx1Z2lucyB8fCBbXTtcbiAgICAvLyBUT0RPOiB2ZXJpZnkgcGx1Z2luIGRlcHMgdmlhIHNlbXZlclxuXG4gICAgLy8gYmluZCBhbGwgcGx1Z2lucyB0byB0aGlzIGluc3RhbmNlIG9mIHRoZSBncmFwaFxuICAgIHRoaXMucGx1Z2lucy5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgIGFkZE1ldHJpYyhyb290LCBgY2RrLWdyYXBoLXBsdWdpbi0ke3BsdWdpbi5pZH1gIGFzIGFueSk7XG4gICAgICBwbHVnaW4uYmluZCh0aGlzKTtcbiAgICB9KTtcblxuICAgIC8vIEFwcGx5IEFzcGVjdCBmb3IgZWFjaCBwbHVnaW4gdGhhdCBzdXBwb3J0cyBcImluc3BlY3RcIiBwaGFzZVxuICAgIHRoaXMucGx1Z2lucy5mb3JFYWNoKChwbHVnaW4pID0+IHtcbiAgICAgIGlmIChwbHVnaW4uaW5zcGVjdCkge1xuICAgICAgICBBc3BlY3RzLm9mKHRoaXMucm9vdCkuYWRkKHtcbiAgICAgICAgICB2aXNpdDogcGx1Z2luLmluc3BlY3QsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgYWRkQ3VzdG9tU3ludGhlc2lzKHRoaXMsIHtcbiAgICAgIG9uU3ludGhlc2l6ZTogKHNlc3Npb24pID0+IHtcbiAgICAgICAgdGhpcy5fc3ludGhlc2l6ZShzZXNzaW9uKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByb3RlY3RlZCBfc3ludGhlc2l6ZShzZXNzaW9uOiBJU3ludGhlc2lzU2Vzc2lvbik6IHZvaWQge1xuICAgIGNvbnN0IHN0b3JlID0gY29tcHV0ZUdyYXBoKHRoaXMucm9vdCk7XG4gICAgY29uc3Qgb3V0ZGlyID0gcmVzb2x2ZU91dGRpcihzZXNzaW9uLm91dGRpciwgdGhpcy5jb25maWcub3V0ZGlyKTtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IENka0dyYXBoQ29udGV4dChzdG9yZSwgb3V0ZGlyKTtcblxuICAgIGNvbnRleHQud3JpdGVBcnRpZmFjdChcbiAgICAgIHRoaXMsXG4gICAgICBHUkFQSF9BUlRJRkFDVF9JRCxcbiAgICAgIENka0dyYXBoQXJ0aWZhY3RzLkdSQVBILFxuICAgICAgSlNPTi5zdHJpbmdpZnkoY29udGV4dC5zdG9yZS5zZXJpYWxpemUoKSwgbnVsbCwgMiksXG4gICAgICBcIlNlcmlhbGl6ZWQgZ3JhcGhcIlxuICAgICk7XG5cbiAgICB0aGlzLnBsdWdpbnMuZm9yRWFjaCgocGx1Z2luKSA9PiB7XG4gICAgICBwbHVnaW4uc3ludGhlc2l6ZSAmJiBwbHVnaW4uc3ludGhlc2l6ZShjb250ZXh0KTtcbiAgICB9KTtcblxuICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICBwYXRoLmpvaW4ob3V0ZGlyLCBDZGtHcmFwaEFydGlmYWN0cy5HUkFQSF9NRVRBREFUQSksXG4gICAgICBKU09OLnN0cmluZ2lmeShcbiAgICAgICAge1xuICAgICAgICAgIHZlcnNpb246IENka0dyYXBoLlZFUlNJT04sXG4gICAgICAgICAgYXJ0aWZhY3RzOiBjb250ZXh0LmFydGlmYWN0cyxcbiAgICAgICAgfSxcbiAgICAgICAgbnVsbCxcbiAgICAgICAgMlxuICAgICAgKSxcbiAgICAgIHsgZW5jb2Rpbmc6IFwidXRmLThcIiB9XG4gICAgKTtcblxuICAgIC8vIHN0b3JlIGNvbnRleHQgZm9yIHJlcG9ydGluZ1xuICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFzeW5jaHJvbm91cyByZXBvcnQgZ2VuZXJhdGlvbi4gVGhpcyBvcGVyYXRpb24gZW5hYmxlcyBydW5uaW5nIGV4cGVuc2l2ZSBhbmQgbm9uLXN5bmNocm9ub3VzXG4gICAqIHJlcG9ydCBnZW5lcmF0aW9uIGJ5IHBsdWdpbnMgcG9zdCBzeW50aGVzaXMuXG4gICAqXG4gICAqIElmIGEgZ2l2ZW4gcGx1Z2luIHJlcXVpcmVzIHBlcmZvcm1pbmcgYXN5bmNocm9ub3VzIG9wZXJhdGlvbnMgb3IgaXMgZ2VuZXJhbCBleHBlbnNpdmUsIGl0IHNob3VsZFxuICAgKiB1dGlsaXplIGByZXBvcnRgIHJhdGhlciB0aGFuIGBzeW50aGVzaXplYC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyByZXBvcnQoKSB7XG4gICAgaWYgKHRoaXMuX2NvbnRleHQgPT0gbnVsbCkge1xuICAgICAgLy8gVE9ETzogc3VwcG9ydCBkZXNlcmlhbGl6aW5nIHBkay1ncmFwaCB0byBnZW5lcmF0ZSBzdG9yZS9jb250ZXh0XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGNoYWxrLnllbGxvd0JyaWdodChcbiAgICAgICAgICBcIltDZGtHcmFwaF0gSW4gdGhlIG5lYXIgZnV0dXJlLCByZXBvcnRzIHdpbGwgYmUgcnVubmFibGUgb3V0c2lkZSBvZiBjZGsgc3ludGhcIlxuICAgICAgICApXG4gICAgICApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2RrR3JhcGggcmVwb3J0IGNhbGxlZCBvdXRzaWRlIG9mIGNkayBzeW50aCBwcm9jZXNzXCIpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiB0aGlzLnBsdWdpbnMpIHtcbiAgICAgIHBsdWdpbi5yZXBvcnQgJiYgKGF3YWl0IHBsdWdpbi5yZXBvcnQodGhpcy5fY29udGV4dCkpO1xuICAgIH1cbiAgfVxufVxuIl19