UNPKG

kwikid-forms

Version:

KwikID's JSON Configuration based Forms Renderer and Builder

295 lines 54.6 kB
import { __awaiter, __decorate } from "tslib"; /* eslint-disable no-unused-vars */ /* eslint-disable @typescript-eslint/no-unused-vars */ import { Action, checkObjectKeyExists, checkObjectPathExists, Condition, logMethod, Rule, setValueToObjectPath, Source } from "kwikid-toolkit"; import { EApiRequestUrlType } from "../definitions/form-view.apis.definition"; export class Apis { constructor(object, takeAction) { this._object = object; this._takeAction = takeAction; this._request = this._object.API_CONFIG.request; this._response = this._object.API_CONFIG.response; } get object() { return this._object; } set object(value) { this._object = value; } setUrl() { return __awaiter(this, void 0, void 0, function* () { if (checkObjectKeyExists(this._request.url, "type") && this._request.url.type === EApiRequestUrlType.CALCULATED) { const source = new Source(this._object); const url = yield source.getValueFromSource(this._request.url.props.value.source); this._request.url = setValueToObjectPath(this._request.url, "value", url); } else if (typeof this._request.url === "string") { this._request.url = setValueToObjectPath({}, "value", this._request.url); } return this._object.API_CONFIG; }); } setRequestBody() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; return __awaiter(this, void 0, void 0, function* () { if (checkObjectKeyExists(this._request, "body")) { if (checkObjectKeyExists(this._request.body, "params")) { const { params } = this._request.body; let paramIndex = 0; for (const param of params) { const { sources } = param; let sourceIndex = 0; for (const source of sources) { const sources = new Source(this._object); const value = sources.getValueFromSource(source); // Set the Value of current source. this._object.API_CONFIG = setValueToObjectPath(this._object.API_CONFIG, `request.body.params[${paramIndex}].sources[${sourceIndex}].value`, value); const { validation } = source; const triggers = (_a = validation === null || validation === void 0 ? void 0 : validation.triggers) !== null && _a !== void 0 ? _a : []; const rules = (_b = validation === null || validation === void 0 ? void 0 : validation.rules) !== null && _b !== void 0 ? _b : []; const actions = (_d = (_c = validation) === null || _c === void 0 ? void 0 : _c.actions) !== null && _d !== void 0 ? _d : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionEvaluation = new Condition(action.condition, rulesMapping).evaluate(); if (conditionEvaluation) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } sourceIndex += 1; } paramIndex += 1; } return this._object.API_CONFIG; } if (checkObjectKeyExists(this._request.body, "rules") && checkObjectKeyExists(this._request.body, "actions")) { const triggers = (_f = (_e = this._request.body) === null || _e === void 0 ? void 0 : _e.triggers) !== null && _f !== void 0 ? _f : []; const rules = (_h = (_g = this._request.body) === null || _g === void 0 ? void 0 : _g.rules) !== null && _h !== void 0 ? _h : []; const actions = (_k = (_j = this._request.body) === null || _j === void 0 ? void 0 : _j.actions) !== null && _k !== void 0 ? _k : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionEvaluation = new Condition(action.condition, rulesMapping).evaluate(); if (conditionEvaluation) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } return this._object.API_CONFIG; } return this._object.API_CONFIG; } return this._object.API_CONFIG; }); } validateRequestBody() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; return __awaiter(this, void 0, void 0, function* () { if (checkObjectKeyExists(this._request, "body")) { if (checkObjectKeyExists(this._request.body, "validation")) { const { body } = this._request; const { validation } = body; const triggers = (_a = validation === null || validation === void 0 ? void 0 : validation.triggers) !== null && _a !== void 0 ? _a : []; const rules = (_b = validation === null || validation === void 0 ? void 0 : validation.rules) !== null && _b !== void 0 ? _b : []; const actions = (_d = (_c = validation) === null || _c === void 0 ? void 0 : _c.actions) !== null && _d !== void 0 ? _d : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate(); if (conditionSuccess) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } return this._object.API_CONFIG; } if (checkObjectPathExists(this._request.body, "rules") && checkObjectPathExists(this._request.body, "actions")) { const triggers = (_f = (_e = this._request.body) === null || _e === void 0 ? void 0 : _e.triggers) !== null && _f !== void 0 ? _f : []; const rules = (_h = (_g = this._request.body) === null || _g === void 0 ? void 0 : _g.rules) !== null && _h !== void 0 ? _h : []; const actions = (_k = (_j = this._request.body) === null || _j === void 0 ? void 0 : _j.actions) !== null && _k !== void 0 ? _k : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate(); if (conditionSuccess) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } return this._object.API_CONFIG; } this._object = setValueToObjectPath(this._object, "API_CONFIG.request.body.is_valid", true); return this._object.API_CONFIG; } this._object = setValueToObjectPath(this._object, "API_CONFIG.request.body.is_valid", true); return this._object.API_CONFIG; }); } setRequestHeaders() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; return __awaiter(this, void 0, void 0, function* () { if (checkObjectKeyExists(this._request, "headers")) { if (checkObjectKeyExists(this._request.headers, "params")) { const { params } = this._request.headers; let paramIndex = 0; for (const param of params) { const { sources } = param; let sourceIndex = 0; for (const source of sources) { const sources = new Source(this._object); const value = sources.getValueFromSource(source); // Set the Value of current source. this._object.API_CONFIG = setValueToObjectPath(this._object.API_CONFIG, `request.headers.params[${paramIndex}].sources[${sourceIndex}].value`, value); const { validation } = source; const triggers = (_a = validation === null || validation === void 0 ? void 0 : validation.triggers) !== null && _a !== void 0 ? _a : []; const rules = (_b = validation === null || validation === void 0 ? void 0 : validation.rules) !== null && _b !== void 0 ? _b : []; const actions = (_d = (_c = validation) === null || _c === void 0 ? void 0 : _c.actions) !== null && _d !== void 0 ? _d : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionEvaluation = new Condition(action.condition, rulesMapping).evaluate(); if (conditionEvaluation) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } sourceIndex += 1; } paramIndex += 1; } return this._object.API_CONFIG; } if (checkObjectKeyExists(this._request.headers, "rules") && checkObjectKeyExists(this._request.headers, "actions")) { const triggers = (_f = (_e = this._request.headers) === null || _e === void 0 ? void 0 : _e.triggers) !== null && _f !== void 0 ? _f : []; const rules = (_h = (_g = this._request.headers) === null || _g === void 0 ? void 0 : _g.rules) !== null && _h !== void 0 ? _h : []; const actions = (_k = (_j = this._request.headers) === null || _j === void 0 ? void 0 : _j.actions) !== null && _k !== void 0 ? _k : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionEvaluation = new Condition(action.condition, rulesMapping).evaluate(); if (conditionEvaluation) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } return this._object.API_CONFIG; } return this._object.API_CONFIG; } return this._object.API_CONFIG; }); } validateRequestHeaders() { var _a, _b, _c, _d, _e, _f, _g, _h; return __awaiter(this, void 0, void 0, function* () { const { headers } = this._request; if (checkObjectKeyExists(this._request, "headers")) { if (checkObjectKeyExists(this._request.headers, "validation")) { const { validation } = headers; const triggers = (_a = validation === null || validation === void 0 ? void 0 : validation.triggers) !== null && _a !== void 0 ? _a : []; const rules = (_b = validation === null || validation === void 0 ? void 0 : validation.rules) !== null && _b !== void 0 ? _b : []; const actions = (_d = (_c = validation) === null || _c === void 0 ? void 0 : _c.actions) !== null && _d !== void 0 ? _d : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate(); if (conditionSuccess) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } return this._object.API_CONFIG; } if (checkObjectPathExists(this._request.headers, "rules") && checkObjectPathExists(this._request.headers, "actions")) { const triggers = (_e = headers === null || headers === void 0 ? void 0 : headers.triggers) !== null && _e !== void 0 ? _e : []; const rules = (_f = headers === null || headers === void 0 ? void 0 : headers.rules) !== null && _f !== void 0 ? _f : []; const actions = (_h = (_g = headers) === null || _g === void 0 ? void 0 : _g.actions) !== null && _h !== void 0 ? _h : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate(); if (conditionSuccess) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } return this._object.API_CONFIG; } this._object = setValueToObjectPath(this._object, "API_CONFIG.request.headers.is_valid", true); return this._object.API_CONFIG; } this._object = setValueToObjectPath(this._object, "API_CONFIG.request.headers.is_valid", true); return this._object.API_CONFIG; }); } validateResponse() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; return __awaiter(this, void 0, void 0, function* () { if (checkObjectKeyExists(this._response, "validation")) { const { validation } = this._response; const triggers = (_a = validation === null || validation === void 0 ? void 0 : validation.triggers) !== null && _a !== void 0 ? _a : []; const rules = (_b = validation === null || validation === void 0 ? void 0 : validation.rules) !== null && _b !== void 0 ? _b : []; const actions = (_d = (_c = validation) === null || _c === void 0 ? void 0 : _c.actions) !== null && _d !== void 0 ? _d : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate(); if (conditionSuccess) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } } else if (checkObjectKeyExists(this._response, "rules") && checkObjectKeyExists(this._response, "actions")) { const triggers = (_f = (_e = this._response) === null || _e === void 0 ? void 0 : _e.triggers) !== null && _f !== void 0 ? _f : []; const rules = (_h = (_g = this._response) === null || _g === void 0 ? void 0 : _g.rules) !== null && _h !== void 0 ? _h : []; const actions = (_k = (_j = this._response) === null || _j === void 0 ? void 0 : _j.actions) !== null && _k !== void 0 ? _k : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate(); if (conditionSuccess) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } } return this._object.API_CONFIG; }); } callNextApi(validation) { var _a, _b, _c, _d; return __awaiter(this, void 0, void 0, function* () { const triggers = (_a = validation === null || validation === void 0 ? void 0 : validation.triggers) !== null && _a !== void 0 ? _a : []; const rules = (_b = validation === null || validation === void 0 ? void 0 : validation.rules) !== null && _b !== void 0 ? _b : []; const actions = (_d = (_c = validation) === null || _c === void 0 ? void 0 : _c.actions) !== null && _d !== void 0 ? _d : []; const rulesMapping = new Rule(rules, this._object).mapping(); for (const action of actions) { const conditionSuccess = new Condition(action.condition, rulesMapping).evaluate(); if (conditionSuccess) { const actions = new Action(action, rulesMapping, this._object, this._takeAction); yield actions.execute(); } } }); } } __decorate([ logMethod ], Apis.prototype, "setUrl", null); __decorate([ logMethod ], Apis.prototype, "setRequestBody", null); __decorate([ logMethod ], Apis.prototype, "validateRequestBody", null); __decorate([ logMethod ], Apis.prototype, "setRequestHeaders", null); __decorate([ logMethod ], Apis.prototype, "validateRequestHeaders", null); __decorate([ logMethod ], Apis.prototype, "validateResponse", null); __decorate([ logMethod ], Apis.prototype, "callNextApi", null); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS12aWV3LmFwaXMuaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva3dpa2lkLWZvcm1zL3NyYy9saWIvcmVuZGVyZXIvZm9ybS12aWV3L2hlbHBlcnMvZm9ybS12aWV3LmFwaXMuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxtQ0FBbUM7QUFDbkMsc0RBQXNEO0FBQ3RELE9BQU8sRUFDTCxNQUFNLEVBQ04sb0JBQW9CLEVBQ3BCLHFCQUFxQixFQUNyQixTQUFTLEVBQ1QsU0FBUyxFQUNULElBQUksRUFDSixvQkFBb0IsRUFDcEIsTUFBTSxFQUlQLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUNMLGtCQUFrQixFQUduQixNQUFNLDBDQUEwQyxDQUFDO0FBSWxELE1BQU0sT0FBTyxJQUFJO0lBaUJmLFlBQVksTUFBVyxFQUFFLFVBQWU7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7UUFDdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDaEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7SUFDcEQsQ0FBQztJQXBCRCxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksTUFBTSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDdkIsQ0FBQztJQWlCSyxNQUFNOztZQUNWLElBQ0Usb0JBQW9CLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDO2dCQUMvQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJ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QUFVLGFBQVYsVUFBVSx1QkFBVixVQUFVLENBQUUsS0FBSyxtQ0FBSSxFQUFFLENBQUM7WUFDcEQsTUFBTSxPQUFPLEdBQW1CLE1BQUEsTUFBQyxVQUFrQiwwQ0FBRSxPQUFPLG1DQUFJLEVBQUUsQ0FBQztZQUVuRSxNQUFNLFlBQVksR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRTdELEtBQUssTUFBTSxNQUFNLElBQUksT0FBTyxFQUFFO2dCQUM1QixNQUFNLGdCQUFnQixHQUFHLElBQUksU0FBUyxDQUNwQyxNQUFNLENBQUMsU0FBUyxFQUNoQixZQUFZLENBQ2IsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFFYixJQUFJLGdCQUFnQixFQUFFO29CQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLE1BQU0sQ0FDeEIsTUFBTSxFQUNOLFlBQVksRUFDWixJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxXQUFXLENBQ2pCLENBQUM7b0JBRUYsTUFBTSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7aUJBQ3pCO2FBQ0Y7O0tBQ0Y7Q0FDRjtBQTliQztJQURDLFNBQVM7a0NBZ0JUO0FBR0Q7SUFEQyxTQUFTOzBDQTBGVDtBQUdEO0lBREMsU0FBUzsrQ0FnRlQ7QUFHRDtJQURDLFNBQVM7NkNBeUZUO0FBR0Q7SUFEQyxTQUFTO2tEQTZFVDtBQUdEO0lBREMsU0FBUzs0Q0F5RFQ7QUFHRDtJQURDLFNBQVM7dUNBeUJUIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBjaGVja09iamVjdEtleUV4aXN0cyxcbiAgY2hlY2tPYmplY3RQYXRoRXhpc3RzLFxuICBDb25kaXRpb24sXG4gIGxvZ01ldGhvZCxcbiAgUnVsZSxcbiAgc2V0VmFsdWVUb09iamVjdFBhdGgsXG4gIFNvdXJjZSxcbiAgVEFjdGlvbixcbiAgVEVuZ2luZSxcbiAgVFJ1bGVcbn0gZnJvbSBcImt3aWtpZC10b29sa2l0XCI7XG5pbXBvcnQge1xuICBFQXBpUmVxdWVzdFVybFR5cGUsXG4gIFRBcGlSZXF1ZXN0LFxuICBUQXBpUmVzcG9uc2Vcbn0gZnJvbSBcIi4uL2RlZmluaXRpb25zL2Zvcm0tdmlldy5hcGlzLmRlZmluaXRpb25cIjtcbmltcG9ydCB7IFRGaWVsZEFwaUNhbGwgfSBmcm9tIFwiLi4vZGVmaW5pdGlvbnMvZm9ybS12aWV3LmZpZWxkcy5kZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBUVHJpZ2dlciB9IGZyb20gXCIuLi9kZWZpbml0aW9ucy9mb3JtLXZpZXcudHJpZ2dlcnMuZGVmaW5pdGlvblwiO1xuXG5leHBvcnQgY2xhc3MgQXBpcyB7XG4gIHByaXZhdGUgX29iamVjdDogYW55O1xuXG4gIGdldCBvYmplY3QoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0O1xuICB9XG5cbiAgc2V0IG9iamVjdCh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fb2JqZWN0ID0gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF90YWtlQWN0aW9uOiBhbnk7XG5cbiAgcHJpdmF0ZSBfcmVxdWVzdDogVEFwaVJlcXVlc3Q7XG5cbiAgcHJpdmF0ZSBfcmVzcG9uc2U6IFRBcGlSZXNwb25zZTtcblxuICBjb25zdHJ1Y3RvcihvYmplY3Q6IGFueSwgdGFrZUFjdGlvbjogYW55KSB7XG4gICAgdGhpcy5fb2JqZWN0ID0gb2JqZWN0O1xuICAgIHRoaXMuX3Rha2VBY3Rpb24gPSB0YWtlQWN0aW9uO1xuXG4gICAgdGhpcy5fcmVxdWVzdCA9IHRoaXMuX29iamVjdC5BUElfQ09ORklHLnJlcXVlc3Q7XG4gICAgdGhpcy5fcmVzcG9uc2UgPSB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRy5yZXNwb25zZTtcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0VXJsKCk6IFByb21pc2U8VEZpZWxkQXBpQ2FsbD4ge1xuICAgIGlmIChcbiAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuX3JlcXVlc3QudXJsLCBcInR5cGVcIikgJiZcbiAgICAgIHRoaXMuX3JlcXVlc3QudXJsLnR5cGUgPT09IEVBcGlSZXF1ZXN0VXJsVHlwZS5DQUxDVUxBVEVEXG4gICAgKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBuZXcgU291cmNlKHRoaXMuX29iamVjdCk7XG4gICAgICBjb25zdCB1cmwgPSBhd2FpdCBzb3VyY2UuZ2V0VmFsdWVGcm9tU291cmNlKFxuICAgICAgICB0aGlzLl9yZXF1ZXN0LnVybC5wcm9wcy52YWx1ZS5zb3VyY2VcbiAgICAgICk7XG4gICAgICB0aGlzLl9yZXF1ZXN0LnVybCA9IHNldFZhbHVlVG9PYmplY3RQYXRoKHRoaXMuX3JlcXVlc3QudXJsLCBcInZhbHVlXCIsIHVybCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fcmVxdWVzdC51cmwgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIHRoaXMuX3JlcXVlc3QudXJsID0gc2V0VmFsdWVUb09iamVjdFBhdGgoe30sIFwidmFsdWVcIiwgdGhpcy5fcmVxdWVzdC51cmwpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRztcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0UmVxdWVzdEJvZHkoKTogUHJvbWlzZTxURmllbGRBcGlDYWxsPiB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuX3JlcXVlc3QsIFwiYm9keVwiKSkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuX3JlcXVlc3QuYm9keSwgXCJwYXJhbXNcIikpIHtcbiAgICAgICAgY29uc3QgeyBwYXJhbXMgfSA9IHRoaXMuX3JlcXVlc3QuYm9keTtcblxuICAgICAgICBsZXQgcGFyYW1JbmRleCA9IDA7XG4gICAgICAgIGZvciAoY29uc3QgcGFyYW0gb2YgcGFyYW1zKSB7XG4gICAgICAgICAgY29uc3QgeyBzb3VyY2VzIH0gPSBwYXJhbTtcblxuICAgICAgICAgIGxldCBzb3VyY2VJbmRleCA9IDA7XG4gICAgICAgICAgZm9yIChjb25zdCBzb3VyY2Ugb2Ygc291cmNlcykge1xuICAgICAgICAgICAgY29uc3Qgc291cmNlcyA9IG5ldyBTb3VyY2UodGhpcy5fb2JqZWN0KTtcblxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBzb3VyY2VzLmdldFZhbHVlRnJvbVNvdXJjZShzb3VyY2UpO1xuICAgICAgICAgICAgLy8gU2V0IHRoZSBWYWx1ZSBvZiBjdXJyZW50IHNvdXJjZS5cbiAgICAgICAgICAgIHRoaXMuX29iamVjdC5BUElfQ09ORklHID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICAgICAgICAgIHRoaXMuX29iamVjdC5BUElfQ09ORklHLFxuICAgICAgICAgICAgICBgcmVxdWVzdC5ib2R5LnBhcmFtc1ske3BhcmFtSW5kZXh9XS5zb3VyY2VzWyR7c291cmNlSW5kZXh9XS52YWx1ZWAsXG4gICAgICAgICAgICAgIHZhbHVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCB7IHZhbGlkYXRpb24gfSA9IHNvdXJjZSBhcyBhbnk7XG5cbiAgICAgICAgICAgIGNvbnN0IHRyaWdnZXJzOiBBcnJheTxUVHJpZ2dlcj4gPSB2YWxpZGF0aW9uPy50cmlnZ2VycyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxUUnVsZT4gPSB2YWxpZGF0aW9uPy5ydWxlcyA/PyBbXTtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnM6IEFycmF5PFRBY3Rpb24+ID0gKHZhbGlkYXRpb24gYXMgYW55KT8uYWN0aW9ucyA/PyBbXTtcblxuICAgICAgICAgICAgY29uc3QgcnVsZXNNYXBwaW5nID0gbmV3IFJ1bGUocnVsZXMsIHRoaXMuX29iamVjdCkubWFwcGluZygpO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkV2YWx1YXRpb24gPSBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgICAgICAgIGFjdGlvbi5jb25kaXRpb24sXG4gICAgICAgICAgICAgICAgcnVsZXNNYXBwaW5nXG4gICAgICAgICAgICAgICkuZXZhbHVhdGUoKTtcblxuICAgICAgICAgICAgICBpZiAoY29uZGl0aW9uRXZhbHVhdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBuZXcgQWN0aW9uKFxuICAgICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgcnVsZXNNYXBwaW5nLFxuICAgICAgICAgICAgICAgICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICAgICAgdGhpcy5fdGFrZUFjdGlvblxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzb3VyY2VJbmRleCArPSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBhcmFtSW5kZXggKz0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRztcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5fcmVxdWVzdC5ib2R5LCBcInJ1bGVzXCIpICYmXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuX3JlcXVlc3QuYm9keSwgXCJhY3Rpb25zXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlcnM6IEFycmF5PFRUcmlnZ2VyPiA9IHRoaXMuX3JlcXVlc3QuYm9keT8udHJpZ2dlcnMgPz8gW107XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxUUnVsZT4gPSB0aGlzLl9yZXF1ZXN0LmJvZHk/LnJ1bGVzID8/IFtdO1xuICAgICAgICBjb25zdCBhY3Rpb25zOiBBcnJheTxUQWN0aW9uPiA9XG4gICAgICAgICAgKHRoaXMuX3JlcXVlc3QuYm9keSBhcyBhbnkpPy5hY3Rpb25zID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9IG5ldyBSdWxlKHJ1bGVzLCB0aGlzLl9vYmplY3QpLm1hcHBpbmcoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uZGl0aW9uRXZhbHVhdGlvbiA9IG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgICBhY3Rpb24uY29uZGl0aW9uLFxuICAgICAgICAgICAgcnVsZXNNYXBwaW5nXG4gICAgICAgICAgKS5ldmFsdWF0ZSgpO1xuXG4gICAgICAgICAgaWYgKGNvbmRpdGlvbkV2YWx1YXRpb24pIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBuZXcgQWN0aW9uKFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIHJ1bGVzTWFwcGluZyxcbiAgICAgICAgICAgICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICB0aGlzLl90YWtlQWN0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0LkFQSV9DT05GSUc7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fb2JqZWN0LkFQSV9DT05GSUc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRztcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgdmFsaWRhdGVSZXF1ZXN0Qm9keSgpOiBQcm9taXNlPFRGaWVsZEFwaUNhbGw+IHtcbiAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5fcmVxdWVzdCwgXCJib2R5XCIpKSB7XG4gICAgICBpZiAoY2hlY2tPYmplY3RLZXlFeGlzdHModGhpcy5fcmVxdWVzdC5ib2R5LCBcInZhbGlkYXRpb25cIikpIHtcbiAgICAgICAgY29uc3QgeyBib2R5IH0gPSB0aGlzLl9yZXF1ZXN0O1xuXG4gICAgICAgIGNvbnN0IHsgdmFsaWRhdGlvbiB9ID0gYm9keTtcblxuICAgICAgICBjb25zdCB0cmlnZ2VyczogQXJyYXk8VFRyaWdnZXI+ID0gdmFsaWRhdGlvbj8udHJpZ2dlcnMgPz8gW107XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxUUnVsZT4gPSB2YWxpZGF0aW9uPy5ydWxlcyA/PyBbXTtcbiAgICAgICAgY29uc3QgYWN0aW9uczogQXJyYXk8VEFjdGlvbj4gPSAodmFsaWRhdGlvbiBhcyBhbnkpPy5hY3Rpb25zID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9IG5ldyBSdWxlKHJ1bGVzLCB0aGlzLl9vYmplY3QpLm1hcHBpbmcoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uZGl0aW9uU3VjY2VzcyA9IG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgICBhY3Rpb24uY29uZGl0aW9uLFxuICAgICAgICAgICAgcnVsZXNNYXBwaW5nXG4gICAgICAgICAgKS5ldmFsdWF0ZSgpO1xuXG4gICAgICAgICAgaWYgKGNvbmRpdGlvblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBuZXcgQWN0aW9uKFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIHJ1bGVzTWFwcGluZyxcbiAgICAgICAgICAgICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICB0aGlzLl90YWtlQWN0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0LkFQSV9DT05GSUc7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0UGF0aEV4aXN0cyh0aGlzLl9yZXF1ZXN0LmJvZHksIFwicnVsZXNcIikgJiZcbiAgICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKHRoaXMuX3JlcXVlc3QuYm9keSwgXCJhY3Rpb25zXCIpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlcnM6IEFycmF5PFRUcmlnZ2VyPiA9IHRoaXMuX3JlcXVlc3QuYm9keT8udHJpZ2dlcnMgPz8gW107XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxUUnVsZT4gPSB0aGlzLl9yZXF1ZXN0LmJvZHk/LnJ1bGVzID8/IFtdO1xuICAgICAgICBjb25zdCBhY3Rpb25zOiBBcnJheTxUQWN0aW9uPiA9XG4gICAgICAgICAgKHRoaXMuX3JlcXVlc3QuYm9keSBhcyBhbnkpPy5hY3Rpb25zID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9IG5ldyBSdWxlKHJ1bGVzLCB0aGlzLl9vYmplY3QpLm1hcHBpbmcoKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGFjdGlvbiBvZiBhY3Rpb25zKSB7XG4gICAgICAgICAgY29uc3QgY29uZGl0aW9uU3VjY2VzcyA9IG5ldyBDb25kaXRpb24oXG4gICAgICAgICAgICBhY3Rpb24uY29uZGl0aW9uLFxuICAgICAgICAgICAgcnVsZXNNYXBwaW5nXG4gICAgICAgICAgKS5ldmFsdWF0ZSgpO1xuXG4gICAgICAgICAgaWYgKGNvbmRpdGlvblN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnMgPSBuZXcgQWN0aW9uKFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIHJ1bGVzTWFwcGluZyxcbiAgICAgICAgICAgICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICAgICAgICB0aGlzLl90YWtlQWN0aW9uXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBhd2FpdCBhY3Rpb25zLmV4ZWN1dGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0LkFQSV9DT05GSUc7XG4gICAgICB9XG4gICAgICB0aGlzLl9vYmplY3QgPSBzZXRWYWx1ZVRvT2JqZWN0UGF0aChcbiAgICAgICAgdGhpcy5fb2JqZWN0LFxuICAgICAgICBcIkFQSV9DT05GSUcucmVxdWVzdC5ib2R5LmlzX3ZhbGlkXCIsXG4gICAgICAgIHRydWVcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRztcbiAgICB9XG4gICAgdGhpcy5fb2JqZWN0ID0gc2V0VmFsdWVUb09iamVjdFBhdGgoXG4gICAgICB0aGlzLl9vYmplY3QsXG4gICAgICBcIkFQSV9DT05GSUcucmVxdWVzdC5ib2R5LmlzX3ZhbGlkXCIsXG4gICAgICB0cnVlXG4gICAgKTtcblxuICAgIHJldHVybiB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRztcbiAgfVxuXG4gIEBsb2dNZXRob2RcbiAgYXN5bmMgc2V0UmVxdWVzdEhlYWRlcnMoKTogUHJvbWlzZTxURmllbGRBcGlDYWxsPiB7XG4gICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuX3JlcXVlc3QsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgaWYgKGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuX3JlcXVlc3QuaGVhZGVycywgXCJwYXJhbXNcIikpIHtcbiAgICAgICAgY29uc3QgeyBwYXJhbXMgfSA9IHRoaXMuX3JlcXVlc3QuaGVhZGVycztcbiAgICAgICAgbGV0IHBhcmFtSW5kZXggPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IHBhcmFtIG9mIHBhcmFtcykge1xuICAgICAgICAgIGNvbnN0IHsgc291cmNlcyB9ID0gcGFyYW07XG5cbiAgICAgICAgICBsZXQgc291cmNlSW5kZXggPSAwO1xuICAgICAgICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHNvdXJjZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZXMgPSBuZXcgU291cmNlKHRoaXMuX29iamVjdCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc291cmNlcy5nZXRWYWx1ZUZyb21Tb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgIC8vIFNldCB0aGUgVmFsdWUgb2YgY3VycmVudCBzb3VyY2UuXG4gICAgICAgICAgICB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRyA9IHNldFZhbHVlVG9PYmplY3RQYXRoKFxuICAgICAgICAgICAgICB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRyxcbiAgICAgICAgICAgICAgYHJlcXVlc3QuaGVhZGVycy5wYXJhbXNbJHtwYXJhbUluZGV4fV0uc291cmNlc1ske3NvdXJjZUluZGV4fV0udmFsdWVgLFxuICAgICAgICAgICAgICB2YWx1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgeyB2YWxpZGF0aW9uIH0gPSBzb3VyY2UgYXMgYW55O1xuXG4gICAgICAgICAgICBjb25zdCB0cmlnZ2VyczogQXJyYXk8VFRyaWdnZXI+ID0gdmFsaWRhdGlvbj8udHJpZ2dlcnMgPz8gW107XG4gICAgICAgICAgICBjb25zdCBydWxlczogQXJyYXk8VFJ1bGU+ID0gdmFsaWRhdGlvbj8ucnVsZXMgPz8gW107XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zOiBBcnJheTxUQWN0aW9uPiA9ICh2YWxpZGF0aW9uIGFzIGFueSk/LmFjdGlvbnMgPz8gW107XG5cbiAgICAgICAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9IG5ldyBSdWxlKHJ1bGVzLCB0aGlzLl9vYmplY3QpLm1hcHBpbmcoKTtcblxuICAgICAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25FdmFsdWF0aW9uID0gbmV3IENvbmRpdGlvbihcbiAgICAgICAgICAgICAgICBhY3Rpb24uY29uZGl0aW9uLFxuICAgICAgICAgICAgICAgIHJ1bGVzTWFwcGluZ1xuICAgICAgICAgICAgICApLmV2YWx1YXRlKCk7XG5cbiAgICAgICAgICAgICAgaWYgKGNvbmRpdGlvbkV2YWx1YXRpb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICAgICAgICAgIGFjdGlvbixcbiAgICAgICAgICAgICAgICAgIHJ1bGVzTWFwcGluZyxcbiAgICAgICAgICAgICAgICAgIHRoaXMuX29iamVjdCxcbiAgICAgICAgICAgICAgICAgIHRoaXMuX3Rha2VBY3Rpb25cbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgYXdhaXQgYWN0aW9ucy5leGVjdXRlKCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc291cmNlSW5kZXggKz0gMTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBwYXJhbUluZGV4ICs9IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0LkFQSV9DT05GSUc7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGNoZWNrT2JqZWN0S2V5RXhpc3RzKHRoaXMuX3JlcXVlc3QuaGVhZGVycywgXCJydWxlc1wiKSAmJlxuICAgICAgICBjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLl9yZXF1ZXN0LmhlYWRlcnMsIFwiYWN0aW9uc1wiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJzOiBBcnJheTxUVHJpZ2dlcj4gPSB0aGlzLl9yZXF1ZXN0LmhlYWRlcnM/LnRyaWdnZXJzID8/IFtdO1xuICAgICAgICBjb25zdCBydWxlczogQXJyYXk8VFJ1bGU+ID0gdGhpcy5fcmVxdWVzdC5oZWFkZXJzPy5ydWxlcyA/PyBbXTtcbiAgICAgICAgY29uc3QgYWN0aW9uczogQXJyYXk8VEFjdGlvbj4gPVxuICAgICAgICAgICh0aGlzLl9yZXF1ZXN0LmhlYWRlcnMgYXMgYW55KT8uYWN0aW9ucyA/PyBbXTtcblxuICAgICAgICBjb25zdCBydWxlc01hcHBpbmcgPSBuZXcgUnVsZShydWxlcywgdGhpcy5fb2JqZWN0KS5tYXBwaW5nKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbmRpdGlvbkV2YWx1YXRpb24gPSBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgICAgYWN0aW9uLmNvbmRpdGlvbixcbiAgICAgICAgICAgIHJ1bGVzTWFwcGluZ1xuICAgICAgICAgICkuZXZhbHVhdGUoKTtcblxuICAgICAgICAgIGlmIChjb25kaXRpb25FdmFsdWF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBydWxlc01hcHBpbmcsXG4gICAgICAgICAgICAgIHRoaXMuX29iamVjdCxcbiAgICAgICAgICAgICAgdGhpcy5fdGFrZUFjdGlvblxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYXdhaXQgYWN0aW9ucy5leGVjdXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX29iamVjdC5BUElfQ09ORklHO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX29iamVjdC5BUElfQ09ORklHO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb2JqZWN0LkFQSV9DT05GSUc7XG4gIH1cblxuICBAbG9nTWV0aG9kXG4gIGFzeW5jIHZhbGlkYXRlUmVxdWVzdEhlYWRlcnMoKTogUHJvbWlzZTxURmllbGRBcGlDYWxsPiB7XG4gICAgY29uc3QgeyBoZWFkZXJzIH0gPSB0aGlzLl9yZXF1ZXN0O1xuICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLl9yZXF1ZXN0LCBcImhlYWRlcnNcIikpIHtcbiAgICAgIGlmIChjaGVja09iamVjdEtleUV4aXN0cyh0aGlzLl9yZXF1ZXN0LmhlYWRlcnMsIFwidmFsaWRhdGlvblwiKSkge1xuICAgICAgICBjb25zdCB7IHZhbGlkYXRpb24gfSA9IGhlYWRlcnM7XG5cbiAgICAgICAgY29uc3QgdHJpZ2dlcnM6IEFycmF5PFRUcmlnZ2VyPiA9IHZhbGlkYXRpb24/LnRyaWdnZXJzID8/IFtdO1xuICAgICAgICBjb25zdCBydWxlczogQXJyYXk8VFJ1bGU+ID0gdmFsaWRhdGlvbj8ucnVsZXMgPz8gW107XG4gICAgICAgIGNvbnN0IGFjdGlvbnM6IEFycmF5PFRBY3Rpb24+ID0gKHZhbGlkYXRpb24gYXMgYW55KT8uYWN0aW9ucyA/PyBbXTtcblxuICAgICAgICBjb25zdCBydWxlc01hcHBpbmcgPSBuZXcgUnVsZShydWxlcywgdGhpcy5fb2JqZWN0KS5tYXBwaW5nKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBhY3Rpb24gb2YgYWN0aW9ucykge1xuICAgICAgICAgIGNvbnN0IGNvbmRpdGlvblN1Y2Nlc3MgPSBuZXcgQ29uZGl0aW9uKFxuICAgICAgICAgICAgYWN0aW9uLmNvbmRpdGlvbixcbiAgICAgICAgICAgIHJ1bGVzTWFwcGluZ1xuICAgICAgICAgICkuZXZhbHVhdGUoKTtcblxuICAgICAgICAgIGlmIChjb25kaXRpb25TdWNjZXNzKSB7XG4gICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gbmV3IEFjdGlvbihcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBydWxlc01hcHBpbmcsXG4gICAgICAgICAgICAgIHRoaXMuX29iamVjdCxcbiAgICAgICAgICAgICAgdGhpcy5fdGFrZUFjdGlvblxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgYXdhaXQgYWN0aW9ucy5leGVjdXRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9vYmplY3QuQVBJX0NPTkZJRztcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgY2hlY2tPYmplY3RQYXRoRXhpc3RzKHRoaXMuX3JlcXVlc3QuaGVhZGVycywgXCJydWxlc1wiKSAmJlxuICAgICAgICBjaGVja09iamVjdFBhdGhFeGlzdHModGhpcy5fcmVxdWVzdC5oZWFkZXJzLCBcImFjdGlvbnNcIilcbiAgICAgICkge1xuICAgICAgICBjb25zdCB0cmlnZ2VyczogQXJyYXk8VFRyaWdnZXI+ID0gaGVhZGVycz8udHJpZ2dlcnMgPz8gW107XG4gICAgICAgIGNvbnN0IHJ1bGVzOiBBcnJheTxUUnVsZT4gPSBoZWFkZXJzPy5ydWxlcyA/PyBbXTtcbiAgICAgICAgY29uc3QgYWN0aW9uczogQXJyYXk8VEFjdGlvbj4gPSAoaGVhZGVycyBhcyBhbnkpPy5hY3Rpb25zID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVzTWFwcGluZyA9I