cdktg
Version:
Agile Threat Modeling as Code
247 lines • 31.6 kB
JavaScript
"use strict";
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataFormat = exports.Encryption = exports.Machine = exports.Technology = exports.Size = exports.TechnicalAssetType = exports.TechnicalAsset = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const communication_1 = require("./communication");
const model_1 = require("./model");
const resource_1 = require("./resource");
const scope_1 = require("./scope");
class TechnicalAsset extends resource_1.Resource {
constructor(scope, id, props) {
super(scope, id, props);
this.type = props.type;
this.usage = props.usage;
this.humanUse = props.humanUse;
this.internet = props.internet;
this.scope = props.scope ?? scope_1.Scope.inScope();
this.size = props.size;
this.technology = props.technology;
this.tags = props.tags;
this.machine = props.machine;
this.encryption = props.encryption;
this.owner = props.owner;
this.ciaTriad = props.ciaTriad;
this.multiTenant = props.multiTenant;
this.redundant = props.redundant;
this.customDevelopedParts = props.customDevelopedParts ?? false;
this.dataFormatsAccepted = props.dataFormatsAccepted;
this.dataAssetsProcessed = new Set();
this.dataAssetsStored = new Set();
this.communications = new Array();
if (this.tags && this.tags.length > 0) {
model_1.Model.of(this).addTags(...this.tags);
}
if (props.trustBoundary) {
this.trustBoundary = props.trustBoundary;
this.trustBoundary.addTechnicalAssets(this);
}
}
processes(...assets) {
assets.forEach((a) => {
this.dataAssetsProcessed.add(a);
});
}
stores(...assets) {
assets.forEach((a) => {
this.dataAssetsStored.add(a);
});
}
isWebApplication() {
return [
Technology.WEB_SERVER,
Technology.WEB_APPLICATION,
Technology.APPLICATION_SERVER,
Technology.ERP,
Technology.CMS,
Technology.IDENTITIY_PROVIDER,
Technology.REPORT_ENGINE,
].includes(this.technology);
}
isWebService() {
return [Technology.WEB_SERVICE_REST, Technology.WEB_SERVICE_SOAP].includes(this.technology);
}
isTrafficForwarding() {
return [
Technology.LOAD_BALANCER,
Technology.REVERSE_PROXY,
Technology.WAF,
].includes(this.technology);
}
isInScope() {
return this.scope === scope_1.Scope.inScope();
}
get highestIntegrity() {
let { integrity: highest } = this.ciaTriad;
this.dataAssetsProcessed.forEach((a) => {
if (a.ciaTriad.hasHigherIntegrity(highest)) {
highest = a.ciaTriad.integrity;
}
});
this.dataAssetsStored.forEach((a) => {
if (a.ciaTriad.hasHigherIntegrity(highest)) {
highest = a.ciaTriad.integrity;
}
});
return highest;
}
get highestAvailability() {
let { availability: highest } = this.ciaTriad;
this.dataAssetsProcessed.forEach((a) => {
if (a.ciaTriad.hasHigherAvailabilty(highest)) {
highest = a.ciaTriad.availability;
}
});
this.dataAssetsStored.forEach((a) => {
if (a.ciaTriad.hasHigherAvailabilty(highest)) {
highest = a.ciaTriad.availability;
}
});
return highest;
}
communicatesWith(id, target, options) {
const communication = new communication_1.Communication(this, id, {
source: this,
target: target,
...options,
});
this.communications.push(communication);
return communication;
}
/**
* @internal
*/
get _trustBoundary() {
return this.trustBoundary;
}
/**
* @internal
*/
_toThreagile() {
const threagile = {
[this.title]: {
id: this.id,
description: this.description ?? null,
type: this.type,
usage: this.usage,
used_as_client_by_human: this.humanUse,
...this.scope?._toThreagile(),
size: this.size,
technology: this.technology,
tags: Array.from(new Set(this.tags)),
internet: this.internet,
machine: this.machine,
encryption: this.encryption,
owner: this.owner,
...this.ciaTriad._toThreagile(),
multi_tenant: this.multiTenant,
redundant: this.redundant,
custom_developed_parts: this.customDevelopedParts,
data_assets_processed: Array.from(this.dataAssetsProcessed).map((a) => a.id),
data_assets_stored: Array.from(this.dataAssetsStored).map((a) => a.id),
data_formats_accepted: this.dataFormatsAccepted,
},
};
threagile[this.title].communication_links = this.communications.reduce((prev, current) => Object.assign(prev, current._toThreagile()), {});
return threagile;
}
}
exports.TechnicalAsset = TechnicalAsset;
_a = JSII_RTTI_SYMBOL_1;
TechnicalAsset[_a] = { fqn: "cdktg.TechnicalAsset", version: "0.0.40" };
var TechnicalAssetType;
(function (TechnicalAssetType) {
TechnicalAssetType["EXTERNAL_ENTITY"] = "external-entity";
TechnicalAssetType["PROCESS"] = "process";
TechnicalAssetType["DATASTORE"] = "datastore";
})(TechnicalAssetType = exports.TechnicalAssetType || (exports.TechnicalAssetType = {}));
var Size;
(function (Size) {
Size["SYSTEM"] = "system";
Size["SERVICE"] = "service";
Size["APPLICATION"] = "application";
Size["COMPONENT"] = "component";
})(Size = exports.Size || (exports.Size = {}));
var Technology;
(function (Technology) {
Technology["UNKNOWN"] = "unknown-technology";
Technology["CLIENT_SYSTEM"] = "client-system";
Technology["BROWSER"] = "browser";
Technology["DESKTOP"] = "desktop";
Technology["MOBILE_APP"] = "mobile-app";
Technology["DEVOPS_CLIENT"] = "devops-client";
Technology["WEB_SERVER"] = "web-server";
Technology["WEB_APPLICATION"] = "web-application";
Technology["APPLICATION_SERVER"] = "application-server";
Technology["DATABASE"] = "database";
Technology["FILE_SERVER"] = "file-server";
Technology["LOCAL_FILE_SERVER"] = "local-file-system";
Technology["ERP"] = "erp";
Technology["CMS"] = "cms";
Technology["WEB_SERVICE_REST"] = "web-service-rest";
Technology["WEB_SERVICE_SOAP"] = "web-service-soap";
Technology["EJB"] = "ejb";
Technology["SEARCH_INDEX"] = "search-index";
Technology["SEARCH_ENGINE"] = "search-engine";
Technology["SERVICE_REGISTRY"] = "service-registry";
Technology["REVERSE_PROXY"] = "reverse-proxy";
Technology["LOAD_BALANCER"] = "load-balancer";
Technology["BUILD_PIPELINE"] = "build-pipeline";
Technology["SOURCECODE_REPOSITORY"] = "sourcecode-repository";
Technology["ARTIFACT_REGISTRY"] = "artifact-registry";
Technology["CODE_INSPECTION_PLATFORM"] = "code-inspection-platform";
Technology["MONITORING"] = "monitoring";
Technology["LDAP_SERVER"] = "ldap-server";
Technology["CONTAINER_PLATFORM"] = "container-platform";
Technology["BATCH_PROCESSING"] = "batch-processing";
Technology["EVENT_LISTENER"] = "event-listener";
Technology["IDENTITIY_PROVIDER"] = "identity-provider";
Technology["IDENTITY_STORE_LDAP"] = "identity-store-ldap";
Technology["IDENTITY_STORE_DATABASE"] = "identity-store-database";
Technology["TOOL"] = "tool";
Technology["CLI"] = "cli";
Technology["TASK"] = "task";
Technology["FUNCTION"] = "function";
Technology["GATEWAY"] = "gateway";
Technology["IOT_DEVICE"] = "iot-device";
Technology["MESSAGE_QUEUE"] = "message-queue";
Technology["STREAM_PROCESSING"] = "stream-processing";
Technology["SERVICE_MESH"] = "service-mesh";
Technology["DATA_LAKE"] = "data-lake";
Technology["REPORT_ENGINE"] = "report-engine";
Technology["AI"] = "ai";
Technology["MAIL_SERVER"] = "mail-server";
Technology["VAULT"] = "vault";
Technology["HASM"] = "hsm";
Technology["WAF"] = "waf";
Technology["IDS"] = "ids";
Technology["IPS"] = "ips";
Technology["SCHEDULER"] = "scheduler";
Technology["MAINFRAME"] = "mainframe";
Technology["BLOCK_STORAGE"] = "block-storage";
Technology["LIBRARY"] = "library";
})(Technology = exports.Technology || (exports.Technology = {}));
var Machine;
(function (Machine) {
Machine["PHYSICAL"] = "physical";
Machine["VIRTUAL"] = "virtual";
Machine["CONTAINER"] = "container";
Machine["SERVERLESS"] = "serverless";
})(Machine = exports.Machine || (exports.Machine = {}));
var Encryption;
(function (Encryption) {
Encryption["NONE"] = "none";
Encryption["TRANSPARENT"] = "transparent";
Encryption["SYMMETRIC_SHARED_KEY"] = "data-with-symmetric-shared-key";
Encryption["ASYMMETRIC_SHARED_KEY"] = "data-with-asymmetric-shared-key";
Encryption["ENDUSER_INDIVIDUAL_KEY"] = "data-with-enduser-individual-key";
})(Encryption = exports.Encryption || (exports.Encryption = {}));
var DataFormat;
(function (DataFormat) {
DataFormat["JSON"] = "json";
DataFormat["XML"] = "xml";
DataFormat["SERIALIZATION"] = "serialization";
DataFormat["FILE"] = "file";
DataFormat["CSV"] = "csv";
})(DataFormat = exports.DataFormat || (exports.DataFormat = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVjaG5pY2FsLWFzc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3RlY2huaWNhbC1hc3NldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUdBLG1EQUFzRTtBQUV0RSxtQ0FBZ0M7QUFDaEMseUNBQXFEO0FBQ3JELG1DQUFnQztBQXlCaEMsTUFBYSxjQUFlLFNBQVEsbUJBQVE7SUF3QjFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxhQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzdCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FB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QUxELFdBQVksT0FBTztJQUNqQixnQ0FBcUIsQ0FBQTtJQUNyQiw4QkFBbUIsQ0FBQTtJQUNuQixrQ0FBdUIsQ0FBQTtJQUN2QixvQ0FBeUIsQ0FBQTtBQUMzQixDQUFDLEVBTFcsT0FBTyxHQUFQLGVBQU8sS0FBUCxlQUFPLFFBS2xCO0FBRUQsSUFBWSxVQU1YO0FBTkQsV0FBWSxVQUFVO0lBQ3BCLDJCQUFhLENBQUE7SUFDYix5Q0FBMkIsQ0FBQTtJQUMzQixxRUFBdUQsQ0FBQTtJQUN2RCx1RUFBeUQsQ0FBQTtJQUN6RCx5RUFBMkQsQ0FBQTtBQUM3RCxDQUFDLEVBTlcsVUFBVSxHQUFWLGtCQUFVLEtBQVYsa0JBQVUsUUFNckI7QUFFRCxJQUFZLFVBTVg7QUFORCxXQUFZLFVBQVU7SUFDcEIsMkJBQWEsQ0FBQTtJQUNiLHlCQUFXLENBQUE7SUFDWCw2Q0FBK0IsQ0FBQTtJQUMvQiwyQkFBYSxDQUFBO0lBQ2IseUJBQVcsQ0FBQTtBQUNiLENBQUMsRUFOVyxVQUFVLEdBQVYsa0JBQVUsS0FBVixrQkFBVSxRQU1yQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5cbmltcG9ydCB7IEludGVncml0eSwgQXZhaWxhYmlsaXR5LCBDSUFUcmlhZCB9IGZyb20gXCIuL2NpYS10cmlhZFwiO1xuaW1wb3J0IHsgQ29tbXVuaWNhdGlvbiwgQ29tbXVuaWNhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9jb21tdW5pY2F0aW9uXCI7XG5pbXBvcnQgeyBEYXRhQXNzZXQgfSBmcm9tIFwiLi9kYXRhLWFzc2V0XCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL21vZGVsXCI7XG5pbXBvcnQgeyBSZXNvdXJjZSwgUmVzb3VyY2VQcm9wcyB9IGZyb20gXCIuL3Jlc291cmNlXCI7XG5pbXBvcnQgeyBTY29wZSB9IGZyb20gXCIuL3Njb3BlXCI7XG5pbXBvcnQgKiBhcyBzcGVjIGZyb20gXCIuL3NwZWMvdGhyZWF0Z2lsZS5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IFRydXN0Qm91bmRhcnkgfSBmcm9tIFwiLi90cnVzdC1ib3VuZGFyeVwiO1xuaW1wb3J0IHsgVXNhZ2UgfSBmcm9tIFwiLi91c2FnZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlY2huaWNhbEFzc2V0UHJvcHMgZXh0ZW5kcyBSZXNvdXJjZVByb3BzIHtcbiAgcmVhZG9ubHkgdHlwZTogVGVjaG5pY2FsQXNzZXRUeXBlO1xuICByZWFkb25seSB1c2FnZTogVXNhZ2U7XG4gIHJlYWRvbmx5IGh1bWFuVXNlOiBib29sZWFuO1xuICByZWFkb25seSBzY29wZT86IFNjb3BlO1xuICByZWFkb25seSBzaXplOiBTaXplO1xuICByZWFkb25seSB0ZWNobm9sb2d5OiBUZWNobm9sb2d5O1xuICByZWFkb25seSB0YWdzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IGludGVybmV0OiBib29sZWFuO1xuICByZWFkb25seSBtYWNoaW5lOiBNYWNoaW5lO1xuICByZWFkb25seSBlbmNyeXB0aW9uOiBFbmNyeXB0aW9uO1xuICByZWFkb25seSBvd25lcj86IHN0cmluZztcbiAgcmVhZG9ubHkgY2lhVHJpYWQ6IENJQVRyaWFkO1xuICByZWFkb25seSBtdWx0aVRlbmFudDogYm9vbGVhbjtcbiAgcmVhZG9ubHkgcmVkdW5kYW50OiBib29sZWFuO1xuICByZWFkb25seSB0cnVzdEJvdW5kYXJ5PzogVHJ1c3RCb3VuZGFyeTtcbiAgcmVhZG9ubHkgY3VzdG9tRGV2ZWxvcGVkUGFydHM/OiBib29sZWFuO1xuICByZWFkb25seSBkYXRhRm9ybWF0c0FjY2VwdGVkPzogRGF0YUZvcm1hdFtdO1xufVxuXG5leHBvcnQgY2xhc3MgVGVjaG5pY2FsQXNzZXQgZXh0ZW5kcyBSZXNvdXJjZSB7XG4gIHB1YmxpYyByZWFkb25seSB0eXBlOiBUZWNobmljYWxBc3NldFR5cGU7XG4gIHB1YmxpYyByZWFkb25seSB1c2FnZTogVXNhZ2U7XG4gIHB1YmxpYyByZWFkb25seSBpbnRlcm5ldDogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGh1bWFuVXNlOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgc2NvcGU/OiBTY29wZTtcbiAgcHVibGljIHJlYWRvbmx5IHNpemU6IFNpemU7XG4gIHB1YmxpYyByZWFkb25seSB0ZWNobm9sb2d5OiBUZWNobm9sb2d5O1xuICBwdWJsaWMgcmVhZG9ubHkgdGFncz86IHN0cmluZ1tdO1xuICBwdWJsaWMgcmVhZG9ubHkgbWFjaGluZTogTWFjaGluZTtcbiAgcHVibGljIHJlYWRvbmx5IGVuY3J5cHRpb246IEVuY3J5cHRpb247XG4gIHB1YmxpYyByZWFkb25seSBvd25lcj86IHN0cmluZztcbiAgcHVibGljIHJlYWRvbmx5IGNpYVRyaWFkOiBDSUFUcmlhZDtcbiAgcHVibGljIHJlYWRvbmx5IG11bHRpVGVuYW50OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgcmVkdW5kYW50OiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgY3VzdG9tRGV2ZWxvcGVkUGFydHM6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBkYXRhRm9ybWF0c0FjY2VwdGVkPzogRGF0YUZvcm1hdFtdO1xuXG4gIHByb3RlY3RlZCB0cnVzdEJvdW5kYXJ5PzogVHJ1c3RCb3VuZGFyeTtcblxuICBwcml2YXRlIGRhdGFBc3NldHNQcm9jZXNzZWQ6IFNldDxEYXRhQXNzZXQ+O1xuICBwcml2YXRlIGRhdGFBc3NldHNTdG9yZWQ6IFNldDxEYXRhQXNzZXQ+O1xuICBwcml2YXRlIGNvbW11bmljYXRpb25zOiBDb21tdW5pY2F0aW9uW107XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFRlY2huaWNhbEFzc2V0UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMudHlwZSA9IHByb3BzLnR5cGU7XG4gICAgdGhpcy51c2FnZSA9IHByb3BzLnVzYWdlO1xuICAgIHRoaXMuaHVtYW5Vc2UgPSBwcm9wcy5odW1hblVzZTtcbiAgICB0aGlzLmludGVybmV0ID0gcHJvcHMuaW50ZXJuZXQ7XG4gICAgdGhpcy5zY29wZSA9IHByb3BzLnNjb3BlID8/IFNjb3BlLmluU2NvcGUoKTtcbiAgICB0aGlzLnNpemUgPSBwcm9wcy5zaXplO1xuICAgIHRoaXMudGVjaG5vbG9neSA9IHByb3BzLnRlY2hub2xvZ3k7XG4gICAgdGhpcy50YWdzID0gcHJvcHMudGFncztcbiAgICB0aGlzLm1hY2hpbmUgPSBwcm9wcy5tYWNoaW5lO1xuICAgIHRoaXMuZW5jcnlwdGlvbiA9IHByb3BzLmVuY3J5cHRpb247XG4gICAgdGhpcy5vd25lciA9IHByb3BzLm93bmVyO1xuICAgIHRoaXMuY2lhVHJpYWQgPSBwcm9wcy5jaWFUcmlhZDtcbiAgICB0aGlzLm11bHRpVGVuYW50ID0gcHJvcHMubXVsdGlUZW5hbnQ7XG4gICAgdGhpcy5yZWR1bmRhbnQgPSBwcm9wcy5yZWR1bmRhbnQ7XG4gICAgdGhpcy5jdXN0b21EZXZlbG9wZWRQYXJ0cyA9IHByb3BzLmN1c3RvbURldmVsb3BlZFBhcnRzID8/IGZhbHNlO1xuICAgIHRoaXMuZGF0YUZvcm1hdHNBY2NlcHRlZCA9IHByb3BzLmRhdGFGb3JtYXRzQWNjZXB0ZWQ7XG5cbiAgICB0aGlzLmRhdGFBc3NldHNQcm9jZXNzZWQgPSBuZXcgU2V0PERhdGFBc3NldD4oKTtcbiAgICB0aGlzLmRhdGFBc3NldHNTdG9yZWQgPSBuZXcgU2V0PERhdGFBc3NldD4oKTtcblxuICAgIHRoaXMuY29tbXVuaWNhdGlvbnMgPSBuZXcgQXJyYXk8Q29tbXVuaWNhdGlvbj4oKTtcblxuICAgIGlmICh0aGlzLnRhZ3MgJiYgdGhpcy50YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgIE1vZGVsLm9mKHRoaXMpLmFkZFRhZ3MoLi4udGhpcy50YWdzKTtcbiAgICB9XG5cbiAgICBpZiAocHJvcHMudHJ1c3RCb3VuZGFyeSkge1xuICAgICAgdGhpcy50cnVzdEJvdW5kYXJ5ID0gcHJvcHMudHJ1c3RCb3VuZGFyeTtcbiAgICAgIHRoaXMudHJ1c3RCb3VuZGFyeS5hZGRUZWNobmljYWxBc3NldHModGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHByb2Nlc3NlcyguLi5hc3NldHM6IERhdGFBc3NldFtdKSB7XG4gICAgYXNzZXRzLmZvckVhY2goKGEpID0+IHtcbiAgICAgIHRoaXMuZGF0YUFzc2V0c1Byb2Nlc3NlZC5hZGQoYSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3RvcmVzKC4uLmFzc2V0czogRGF0YUFzc2V0W10pIHtcbiAgICBhc3NldHMuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgdGhpcy5kYXRhQXNzZXRzU3RvcmVkLmFkZChhKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBpc1dlYkFwcGxpY2F0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBbXG4gICAgICBUZWNobm9sb2d5LldFQl9TRVJWRVIsXG4gICAgICBUZWNobm9sb2d5LldFQl9BUFBMSUNBVElPTixcbiAgICAgIFRlY2hub2xvZ3kuQVBQTElDQVRJT05fU0VSVkVSLFxuICAgICAgVGVjaG5vbG9neS5FUlAsXG4gICAgICBUZWNobm9sb2d5LkNNUyxcbiAgICAgIFRlY2hub2xvZ3kuSURFTlRJVElZX1BST1ZJREVSLFxuICAgICAgVGVjaG5vbG9neS5SRVBPUlRfRU5HSU5FLFxuICAgIF0uaW5jbHVkZXModGhpcy50ZWNobm9sb2d5KTtcbiAgfVxuXG4gIHB1YmxpYyBpc1dlYlNlcnZpY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFtUZWNobm9sb2d5LldFQl9TRVJWSUNFX1JFU1QsIFRlY2hub2xvZ3kuV0VCX1NFUlZJQ0VfU09BUF0uaW5jbHVkZXMoXG4gICAgICB0aGlzLnRlY2hub2xvZ3lcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGlzVHJhZmZpY0ZvcndhcmRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFRlY2hub2xvZ3kuTE9BRF9CQUxBTkNFUixcbiAgICAgIFRlY2hub2xvZ3kuUkVWRVJTRV9QUk9YWSxcbiAgICAgIFRlY2hub2xvZ3kuV0FGLFxuICAgIF0uaW5jbHVkZXModGhpcy50ZWNobm9sb2d5KTtcbiAgfVxuXG4gIHB1YmxpYyBpc0luU2NvcGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2NvcGUgPT09IFNjb3BlLmluU2NvcGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlnaGVzdEludGVncml0eSgpOiBJbnRlZ3JpdHkge1xuICAgIGxldCB7IGludGVncml0eTogaGlnaGVzdCB9ID0gdGhpcy5jaWFUcmlhZDtcblxuICAgIHRoaXMuZGF0YUFzc2V0c1Byb2Nlc3NlZC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBpZiAoYS5jaWFUcmlhZC5oYXNIaWdoZXJJbnRlZ3JpdHkoaGlnaGVzdCkpIHtcbiAgICAgICAgaGlnaGVzdCA9IGEuY2lhVHJpYWQuaW50ZWdyaXR5O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5kYXRhQXNzZXRzU3RvcmVkLmZvckVhY2goKGEpID0+IHtcbiAgICAgIGlmIChhLmNpYVRyaWFkLmhhc0hpZ2hlckludGVncml0eShoaWdoZXN0KSkge1xuICAgICAgICBoaWdoZXN0ID0gYS5jaWFUcmlhZC5pbnRlZ3JpdHk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGlnaGVzdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGlnaGVzdEF2YWlsYWJpbGl0eSgpOiBBdmFpbGFiaWxpdHkge1xuICAgIGxldCB7IGF2YWlsYWJpbGl0eTogaGlnaGVzdCB9ID0gdGhpcy5jaWFUcmlhZDtcblxuICAgIHRoaXMuZGF0YUFzc2V0c1Byb2Nlc3NlZC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBpZiAoYS5jaWFUcmlhZC5oYXNIaWdoZXJBdmFpbGFiaWx0eShoaWdoZXN0KSkge1xuICAgICAgICBoaWdoZXN0ID0gYS5jaWFUcmlhZC5hdmFpbGFiaWxpdHk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFBc3NldHNTdG9yZWQuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgaWYgKGEuY2lhVHJpYWQuaGFzSGlnaGVyQXZhaWxhYmlsdHkoaGlnaGVzdCkpIHtcbiAgICAgICAgaGlnaGVzdCA9IGEuY2lhVHJpYWQuYXZhaWxhYmlsaXR5O1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhpZ2hlc3Q7XG4gIH1cblxuICBwdWJsaWMgY29tbXVuaWNhdGVzV2l0aChcbiAgICBpZDogc3RyaW5nLFxuICAgIHRhcmdldDogVGVjaG5pY2FsQXNzZXQsXG4gICAgb3B0aW9uczogQ29tbXVuaWNhdGlvbk9wdGlvbnNcbiAgKTogQ29tbXVuaWNhdGlvbiB7XG4gICAgY29uc3QgY29tbXVuaWNhdGlvbiA9IG5ldyBDb21tdW5pY2F0aW9uKHRoaXMsIGlkLCB7XG4gICAgICBzb3VyY2U6IHRoaXMsXG4gICAgICB0YXJnZXQ6IHRhcmdldCxcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbW11bmljYXRpb25zLnB1c2goY29tbXVuaWNhdGlvbik7XG5cbiAgICByZXR1cm4gY29tbXVuaWNhdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgX3RydXN0Qm91bmRhcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJ1c3RCb3VuZGFyeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfdG9UaHJlYWdpbGUoKTogc3BlYy5UaHJlYWdpbGVbXCJ0ZWNobmljYWxfYXNzZXRzXCJdIHtcbiAgICBjb25zdCB0aHJlYWdpbGU6IGFueSA9IHtcbiAgICAgIFt0aGlzLnRpdGxlXToge1xuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24gPz8gbnVsbCxcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICB1c2FnZTogdGhpcy51c2FnZSxcbiAgICAgICAgdXNlZF9hc19jbGllbnRfYnlfaHVtYW46IHRoaXMuaHVtYW5Vc2UsXG4gICAgICAgIC4uLnRoaXMuc2NvcGU/Ll90b1RocmVhZ2lsZSgpLFxuICAgICAgICBzaXplOiB0aGlzLnNpemUsXG4gICAgICAgIHRlY2hub2xvZ3k6IHRoaXMudGVjaG5vbG9neSxcbiAgICAgICAgdGFnczogQXJyYXkuZnJvbShuZXcgU2V0KHRoaXMudGFncykpLFxuICAgICAgICBpbnRlcm5ldDogdGhpcy5pbnRlcm5ldCxcbiAgICAgICAgbWFjaGluZTogdGhpcy5tYWNoaW5lLFxuICAgICAgICBlbmNyeXB0aW9uOiB0aGlzLmVuY3J5cHRpb24sXG4gICAgICAgIG93bmVyOiB0aGlzLm93bmVyLFxuICAgICAgICAuLi50aGlzLmNpYVRyaWFkLl90b1RocmVhZ2lsZSgpLFxuICAgICAgICBtdWx0aV90ZW5hbnQ6IHRoaXMubXVsdGlUZW5hbnQsXG4gICAgICAgIHJlZHVuZGFudDogdGhpcy5yZWR1bmRhbnQsXG4gICAgICAgIGN1c3RvbV9kZXZlbG9wZWRfcGFydHM6IHRoaXMuY3VzdG9tRGV2ZWxvcGVkUGFydHMsXG4gICAgICAgIGRhdGFfYXNzZXRzX3Byb2Nlc3NlZDogQXJyYXkuZnJvbSh0aGlzLmRhdGFBc3NldHNQcm9jZXNzZWQpLm1hcChcbiAgICAgICAgICAoYSkgPT4gYS5pZFxuICAgICAgICApLFxuICAgICAgICBkYXRhX2Fzc2V0c19zdG9yZWQ6IEFycmF5LmZyb20odGhpcy5kYXRhQXNzZXRzU3RvcmVkKS5tYXAoKGEpID0+IGEuaWQpLFxuICAgICAgICBkYXRhX2Zvcm1hdHNfYWNjZXB0ZWQ6IHRoaXMuZGF0YUZvcm1hdHNBY2NlcHRlZCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHRocmVhZ2lsZVt0aGlzLnRpdGxlXS5jb21tdW5pY2F0aW9uX2xpbmtzID0gdGhpcy5jb21tdW5pY2F0aW9ucy5yZWR1Y2UoXG4gICAgICAocHJldiwgY3VycmVudCkgPT4gT2JqZWN0LmFzc2lnbihwcmV2LCBjdXJyZW50Ll90b1RocmVhZ2lsZSgpKSxcbiAgICAgIHt9XG4gICAgKTtcblxuICAgIHJldHVybiB0aHJlYWdpbGU7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gVGVjaG5pY2FsQXNzZXRUeXBlIHtcbiAgRVhURVJOQUxfRU5USVRZID0gXCJleHRlcm5hbC1lbnRpdHlcIixcbiAgUFJPQ0VTUyA9IFwicHJvY2Vzc1wiLFxuICBEQVRBU1RPUkUgPSBcImRhdGFzdG9yZVwiLFxufVxuXG5leHBvcnQgZW51bSBTaXplIHtcbiAgU1lTVEVNID0gXCJzeXN0ZW1cIixcbiAgU0VSVklDRSA9IFwic2VydmljZVwiLFxuICBBUFBMSUNBVElPTiA9IFwiYXBwbGljYXRpb25cIixcbiAgQ09NUE9ORU5UID0gXCJjb21wb25lbnRcIixcbn1cblxuZXhwb3J0IGVudW0gVGVjaG5vbG9neSB7XG4gIFVOS05PV04gPSBcInVua25vd24tdGVjaG5vbG9neVwiLFxuICBDTElFTlRfU1lTVEVNID0gXCJjbGllbnQtc3lzdGVtXCIsXG4gIEJST1dTRVIgPSBcImJyb3dzZXJcIixcbiAgREVTS1RPUCA9IFwiZGVza3RvcFwiLFxuICBNT0JJTEVfQVBQID0gXCJtb2JpbGUtYXBwXCIsXG4gIERFVk9QU19DTElFTlQgPSBcImRldm9wcy1jbGllbnRcIixcbiAgV0VCX1NFUlZFUiA9IFwid2ViLXNlcnZlclwiLFxuICBXRUJfQVBQTElDQVRJT04gPSBcIndlYi1hcHBsaWNhdGlvblwiLFxuICBBUFBMSUNBVElPTl9TRVJWRVIgPSBcImFwcGxpY2F0aW9uLXNlcnZlclwiLFxuICBEQVRBQkFTRSA9IFwiZGF0YWJhc2VcIixcbiAgRklMRV9TRVJWRVIgPSBcImZpbGUtc2VydmVyXCIsXG4gIExPQ0FMX0ZJTEVfU0VSVkVSID0gXCJsb2NhbC1maWxlLXN5c3RlbVwiLFxuICBFUlAgPSBcImVycFwiLFxuICBDTVMgPSBcImNtc1wiLFxuICBXRUJfU0VSVklDRV9SRVNUID0gXCJ3ZWItc2VydmljZS1yZXN0XCIsXG4gIFdFQl9TRVJWSUNFX1NPQVAgPSBcIndlYi1zZXJ2aWNlLXNvYXBcIixcbiAgRUpCID0gXCJlamJcIixcbiAgU0VBUkNIX0lOREVYID0gXCJzZWFyY2gtaW5kZXhcIixcbiAgU0VBUkNIX0VOR0lORSA9IFwic2VhcmNoLWVuZ2luZVwiLFxuICBTRVJWSUNFX1JFR0lTVFJZID0gXCJzZXJ2aWNlLXJlZ2lzdHJ5XCIsXG4gIFJFVkVSU0VfUFJPWFkgPSBcInJldmVyc2UtcHJveHlcIixcbiAgTE9BRF9CQUxBTkNFUiA9IFwibG9hZC1iYWxhbmNlclwiLFxuICBCVUlMRF9QSVBFTElORSA9IFwiYnVpbGQtcGlwZWxpbmVcIixcbiAgU09VUkNFQ09ERV9SRVBPU0lUT1JZID0gXCJzb3VyY2Vjb2RlLXJlcG9zaXRvcnlcIixcbiAgQVJUSUZBQ1RfUkVHSVNUUlkgPSBcImFydGlmYWN0LXJlZ2lzdHJ5XCIsXG4gIENPREVfSU5TUEVDVElPTl9QTEFURk9STSA9IFwiY29kZS1pbnNwZWN0aW9uLXBsYXRmb3JtXCIsXG4gIE1PTklUT1JJTkcgPSBcIm1vbml0b3JpbmdcIixcbiAgTERBUF9TRVJWRVIgPSBcImxkYXAtc2VydmVyXCIsXG4gIENPTlRBSU5FUl9QTEFURk9STSA9IFwiY29udGFpbmVyLXBsYXRmb3JtXCIsXG4gIEJBVENIX1BST0NFU1NJTkcgPSBcImJhdGNoLXByb2Nlc3NpbmdcIixcbiAgRVZFTlRfTElTVEVORVIgPSBcImV2ZW50LWxpc3RlbmVyXCIsXG4gIElERU5USVRJWV9QUk9WSURFUiA9IFwiaWRlbnRpdHktcHJvdmlkZXJcIixcbiAgSURFTlRJVFlfU1RPUkVfTERBUCA9IFwiaWRlbnRpdHktc3RvcmUtbGRhcFwiLFxuICBJREVOVElUWV9TVE9SRV9EQVRBQkFTRSA9IFwiaWRlbnRpdHktc3RvcmUtZGF0YWJhc2VcIixcbiAgVE9PTCA9IFwidG9vbFwiLFxuICBDTEkgPSBcImNsaVwiLFxuICBUQVNLID0gXCJ0YXNrXCIsXG4gIEZVTkNUSU9OID0gXCJmdW5jdGlvblwiLFxuICBHQVRFV0FZID0gXCJnYXRld2F5XCIsXG4gIElPVF9ERVZJQ0UgPSBcImlvdC1kZXZpY2VcIixcbiAgTUVTU0FHRV9RVUVVRSA9IFwibWVzc2FnZS1xdWV1ZVwiLFxuICBTVFJFQU1fUFJPQ0VTU0lORyA9IFwic3RyZWFtLXByb2Nlc3NpbmdcIixcbiAgU0VSVklDRV9NRVNIID0gXCJzZXJ2aWNlLW1lc2hcIixcbiAgREFUQV9MQUtFID0gXCJkYXRhLWxha2VcIixcbiAgUkVQT1JUX0VOR0lORSA9IFwicmVwb3J0LWVuZ2luZVwiLFxuICBBSSA9IFwiYWlcIixcbiAgTUFJTF9TRVJWRVIgPSBcIm1haWwtc2VydmVyXCIsXG4gIFZBVUxUID0gXCJ2YXVsdFwiLFxuICBIQVNNID0gXCJoc21cIixcbiAgV0FGID0gXCJ3YWZcIixcbiAgSURTID0gXCJpZHNcIixcbiAgSVBTID0gXCJpcHNcIixcbiAgU0NIRURVTEVSID0gXCJzY2hlZHVsZXJcIixcbiAgTUFJTkZSQU1FID0gXCJtYWluZnJhbWVcIixcbiAgQkxPQ0tfU1RPUkFHRSA9IFwiYmxvY2stc3RvcmFnZVwiLFxuICBMSUJSQVJZID0gXCJsaWJyYXJ5XCIsXG59XG5cbmV4cG9ydCBlbnVtIE1hY2hpbmUge1xuICBQSFlTSUNBTCA9IFwicGh5c2ljYWxcIixcbiAgVklSVFVBTCA9IFwidmlydHVhbFwiLFxuICBDT05UQUlORVIgPSBcImNvbnRhaW5lclwiLFxuICBTRVJWRVJMRVNTID0gXCJzZXJ2ZXJsZXNzXCIsXG59XG5cbmV4cG9ydCBlbnVtIEVuY3J5cHRpb24ge1xuICBOT05FID0gXCJub25lXCIsXG4gIFRSQU5TUEFSRU5UID0gXCJ0cmFuc3BhcmVudFwiLFxuICBTWU1NRVRSSUNfU0hBUkVEX0tFWSA9IFwiZGF0YS13aXRoLXN5bW1ldHJpYy1zaGFyZWQta2V5XCIsXG4gIEFTWU1NRVRSSUNfU0hBUkVEX0tFWSA9IFwiZGF0YS13aXRoLWFzeW1tZXRyaWMtc2hhcmVkLWtleVwiLFxuICBFTkRVU0VSX0lORElWSURVQUxfS0VZID0gXCJkYXRhLXdpdGgtZW5kdXNlci1pbmRpdmlkdWFsLWtleVwiLFxufVxuXG5leHBvcnQgZW51bSBEYXRhRm9ybWF0IHtcbiAgSlNPTiA9IFwianNvblwiLFxuICBYTUwgPSBcInhtbFwiLFxuICBTRVJJQUxJWkFUSU9OID0gXCJzZXJpYWxpemF0aW9uXCIsXG4gIEZJTEUgPSBcImZpbGVcIixcbiAgQ1NWID0gXCJjc3ZcIixcbn1cbiJdfQ==