UNPKG

@decaf-ts/fabric-weaver

Version:
172 lines 24 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PeerMiddleware = void 0; const express_1 = __importDefault(require("express")); const peer_middleware_1 = require("../constants/peer-middleware.cjs"); const logging_1 = require("@decaf-ts/logging"); // import { info, mkdir, rm } from "@aeon/fabric-integration"; // import * as express from "express"; // import * as fs from "fs"; // import * as path from "path"; // import { Express } from "express"; // import { execSync } from "child_process"; // import { peerBootConfig } from "../utils/types"; // import { copyAndOverrideYaml } from "../utils/genesis"; // import * as bodyParser from "body-parser"; // import { MiddlewareRoutes } from "../../shared"; class PeerMiddleware { constructor(port) { //Change later mock security this.accessKeys = []; // Mock security, replace with actual access keys this.app = (0, express_1.default)(); this.port = port || peer_middleware_1.DEFAULT_PORT; this.log = logging_1.Logging.for(PeerMiddleware); this.log.setConfig({ level: logging_1.LogLevel.debug, }); // this.app.use(bodyParser.json({ limit: '50mb' })); // Adjust the size as needed // this.app.use(bodyParser.urlencoded({ limit: '50mb', extended: true })); // Middleware to parse JSON this.app.use(express_1.default.json()); // Route Setup this.routes(); } routes() { const methodNames = Object.getOwnPropertyNames(Object.getPrototypeOf(this)).filter((name) => name !== "constructor" && typeof this[name] === "function" && name !== "routes" && name !== "listen"); for (const methodName of methodNames) { try { this[methodName](); } catch (error) { this.log.error(`Error calling method ${methodName}: ${error}`); } } } addAccessKey() { this.log.info("Adding access key endpoint registered"); const addKey = (req, res) => { this.log.info("Received request to add access key"); const body = req.body; this.log.debug(`Received access key: ${body.accessKey}`); if (!body.accessKey) { return res.status(400).send({ error: "Missing access key" }); } if (this.accessKeys.includes(body.accessKey)) { return res.status(409).send({ error: "Access key already exists" }); } this.accessKeys.push(body.accessKey); this.log.debug(`Access keys: ${this.accessKeys.join(", ")}`); res .status(201) .contentType("application/json") .send({ message: "Access key added successfully" }); }; this.app.post(`${peer_middleware_1.MiddlewareRoutes.ACCESS_KEY}`, addKey); } hello() { this.app.get("/", (req, res) => { res.send("Hello, world!"); }); } healthcheck() { this.log.info("Healthcheck endpoint registered"); const healthcheck = (req, res) => { res.status(200).contentType("application/json").send({ message: "OK" }); }; this.app.get(`${peer_middleware_1.MiddlewareRoutes.HEALTZ}`, healthcheck); } // private handleOrganizationEnroll(req: express.Request, res: express.Response): void{ // const orgDetails = req.body // try { // mkdir('./temp/'); // const replacements = { // ORG_NAME: orgDetails.name, // ORG_MSPID: orgDetails.id, // ORG_MSPDIR: "/aeon/temp/ca/peers/peer-0/client/msp" // } // copyAndOverrideYaml('./configs/orgtx.yaml', './temp/configtx.yaml', replacements) // fs.writeFileSync('./temp/mspdir.tar.gz', Buffer.from(orgDetails.mspdir)); // execSync('tar -xvf ./temp/mspdir.tar.gz -C ./temp'); // execSync(`peer channel fetch config ./temp/config_block.pb \ // --channelID '${this.config.channel.name}' \ // --orderer '${this.config.channel.ordererEndpoint}' \ // --tls \ // --cafile '${this.config.tls.tls}'`); // execSync(`configtxlator proto_decode --input ./temp/config_block.pb \ // --type common.Block \ // --output ./temp/config_block.json`); // execSync(`jq .data.data[0].payload.data.config ./temp/config_block.json > ./temp/config.json`); // execSync(`cd temp && configtxgen -printOrg ${orgDetails.name} > ./org.json`) ; // execSync( `jq -s '.[0] * {"channel_group":{"groups":{"Application":{"groups": {"${orgDetails.name}":.[1]}}}}}' \ // ./temp/config.json \ // ./temp/org.json > ./temp/modified_config.json`); // execSync(`configtxlator proto_encode \ // --input ./temp/config.json \ // --type common.Config \ // --output ./temp/config.pb`); // execSync( `configtxlator proto_encode \ // --input ./temp/modified_config.json \ // --type common.Config \ // --output ./temp/modified_config.pb`); // execSync(`configtxlator compute_update \ // --channel_id aeon-main \ // --original ./temp/config.pb \ // --updated ./temp/modified_config.pb \ // --output ./temp/org_update.pb`); // execSync(`configtxlator proto_decode \ // --input ./temp/org_update.pb \ // --type common.ConfigUpdate \ // --output ./temp/org_update.json`); // execSync(`echo '{"payload":{"header":{"channel_header":{"channel_id":"'${this.config.channel.name}'", "type":2}},"data":{"config_update":'$(cat ./temp/org_update.json)'}}}' \ // | jq . > ./temp/org_update_in_envelope.json`); // execSync( `configtxlator proto_encode \ // --input ./temp/org_update_in_envelope.json \ // --type common.Envelope \ // --output ./temp/org_update_in_envelope.pb`); // execSync(`cd temp && peer channel signconfigtx \ // -f ./org_update_in_envelope.pb`); // execSync(`peer channel update \ // -f ./temp/org_update_in_envelope.pb \ // -c ${this.config.channel.name} \ // -o ${this.config.channel.ordererEndpoint} \ // --tls \ // --cafile ${this.config.tls.tls}`); // res.status(200).send({success:true}) // } catch(e:unknown) { // res.status(500).send(e) // } finally { // rm("./temp"); // } // } // private handleOrganizationPeerAnchor(req: express.Request, res: express.Response): void{ // const body = req.body // try { // mkdir('./temp/'); // fs.writeFileSync(path.join(process.cwd(), "temp/anchor_update_in_envelope.pb"), Buffer.from(body.block)) // execSync(`peer channel update \ // -f /aeon/temp/anchor_update_in_envelope.pb \ // --channelID ${this.config.channel.name} \ // --orderer ${this.config.channel.ordererEndpoint} \ // --tls \ // --cafile ${this.config.channel.ordererCaFile}`); // res.status(200).send({success:true}) // } catch (e: unknown) { // res.status(500).send(e) // } finally { // rm("./temp"); // } // } listen() { this.app.listen(this.port, () => { this.log.info(`Peer Middleware running on port: ${this.port}`); }); } } exports.PeerMiddleware = PeerMiddleware; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGVlck1pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9taWRkbGV3YXJlcy9QZWVyTWlkZGxld2FyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFDQSxzREFBOEI7QUFDOUIsa0VBQThFO0FBQzlFLCtDQUE4RDtBQUM5RCw4REFBOEQ7QUFDOUQsc0NBQXNDO0FBQ3RDLDRCQUE0QjtBQUM1QixnQ0FBZ0M7QUFDaEMscUNBQXFDO0FBQ3JDLDRDQUE0QztBQUM1QyxtREFBbUQ7QUFDbkQsMERBQTBEO0FBQzFELDZDQUE2QztBQUM3QyxtREFBbUQ7QUFFbkQsTUFBYSxjQUFjO0lBUXpCLFlBQVksSUFBWTtRQUh4Qiw0QkFBNEI7UUFDcEIsZUFBVSxHQUFhLEVBQUUsQ0FBQyxDQUFDLGlEQUFpRDtRQUdsRixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUEsaUJBQU8sR0FBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLDhCQUFZLENBQUM7UUFDakMsSUFBSSxDQUFDLEdBQUcsR0FBRyxpQkFBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQztZQUNqQixLQUFLLEVBQUUsa0JBQVEsQ0FBQyxLQUFLO1NBQ3RCLENBQUMsQ0FBQztRQUVILG9GQUFvRjtRQUNwRiwwRUFBMEU7UUFFMUUsMkJBQTJCO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUU3QixjQUFjO1FBQ2QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxNQUFNO1FBQ1osTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUM1QyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUM1QixDQUFDLE1BQU0sQ0FDTixD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NEI7SUFFNUIsbUhBQW1IO0lBRW5ILDBDQUEwQztJQUMxQywyREFBMkQ7SUFDM0Qsd0RBQXdEO0lBQ3hELGlFQUFpRTtJQUNqRSxzQkFBc0I7SUFDdEIsK0RBQStEO0lBRS9ELCtDQUErQztJQUMvQyw2QkFBNkI7SUFDN0Isa0NBQWtDO0lBQ2xDLGtCQUFrQjtJQUNsQix3QkFBd0I7SUFDeEIsUUFBUTtJQUNSLElBQUk7SUFFSixNQUFNO1FBQ0osSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0NBQW9DLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBMU1ELHdDQTBNQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV4cHJlc3MsIFJlc3BvbnNlLCBSZXF1ZXN0IH0gZnJvbSBcImV4cHJlc3NcIjtcbmltcG9ydCBleHByZXNzIGZyb20gXCJleHByZXNzXCI7XG5pbXBvcnQgeyBERUZBVUxUX1BPUlQsIE1pZGRsZXdhcmVSb3V0ZXMgfSBmcm9tIFwiLi4vY29uc3RhbnRzL3BlZXItbWlkZGxld2FyZVwiO1xuaW1wb3J0IHsgTG9nZ2VyLCBMb2dnaW5nLCBMb2dMZXZlbCB9IGZyb20gXCJAZGVjYWYtdHMvbG9nZ2luZ1wiO1xuLy8gaW1wb3J0IHsgaW5mbywgbWtkaXIsIHJtIH0gZnJvbSBcIkBhZW9uL2ZhYnJpYy1pbnRlZ3JhdGlvblwiO1xuLy8gaW1wb3J0ICogYXMgZXhwcmVzcyBmcm9tIFwiZXhwcmVzc1wiO1xuLy8gaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG4vLyBpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG4vLyBpbXBvcnQgeyBFeHByZXNzIH0gZnJvbSBcImV4cHJlc3NcIjtcbi8vIGltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbi8vIGltcG9ydCB7IHBlZXJCb290Q29uZmlnIH0gZnJvbSBcIi4uL3V0aWxzL3R5cGVzXCI7XG4vLyBpbXBvcnQgeyBjb3B5QW5kT3ZlcnJpZGVZYW1sIH0gZnJvbSBcIi4uL3V0aWxzL2dlbmVzaXNcIjtcbi8vIGltcG9ydCAqIGFzIGJvZHlQYXJzZXIgZnJvbSBcImJvZHktcGFyc2VyXCI7XG4vLyBpbXBvcnQgeyBNaWRkbGV3YXJlUm91dGVzIH0gZnJvbSBcIi4uLy4uL3NoYXJlZFwiO1xuXG5leHBvcnQgY2xhc3MgUGVlck1pZGRsZXdhcmUge1xuICBwcml2YXRlIHJlYWRvbmx5IGFwcDogRXhwcmVzcztcbiAgcHJpdmF0ZSByZWFkb25seSBwb3J0OiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbG9nOiBMb2dnZXI7XG5cbiAgLy9DaGFuZ2UgbGF0ZXIgbW9jayBzZWN1cml0eVxuICBwcml2YXRlIGFjY2Vzc0tleXM6IHN0cmluZ1tdID0gW107IC8vIE1vY2sgc2VjdXJpdHksIHJlcGxhY2Ugd2l0aCBhY3R1YWwgYWNjZXNzIGtleXNcblxuICBjb25zdHJ1Y3Rvcihwb3J0OiBudW1iZXIpIHtcbiAgICB0aGlzLmFwcCA9IGV4cHJlc3MoKTtcbiAgICB0aGlzLnBvcnQgPSBwb3J0IHx8IERFRkFVTFRfUE9SVDtcbiAgICB0aGlzLmxvZyA9IExvZ2dpbmcuZm9yKFBlZXJNaWRkbGV3YXJlKTtcblxuICAgIHRoaXMubG9nLnNldENvbmZpZyh7XG4gICAgICBsZXZlbDogTG9nTGV2ZWwuZGVidWcsXG4gICAgfSk7XG5cbiAgICAvLyAgICB0aGlzLmFwcC51c2UoYm9keVBhcnNlci5qc29uKHsgbGltaXQ6ICc1MG1iJyB9KSk7IC8vIEFkanVzdCB0aGUgc2l6ZSBhcyBuZWVkZWRcbiAgICAvLyB0aGlzLmFwcC51c2UoYm9keVBhcnNlci51cmxlbmNvZGVkKHsgbGltaXQ6ICc1MG1iJywgZXh0ZW5kZWQ6IHRydWUgfSkpO1xuXG4gICAgLy8gTWlkZGxld2FyZSB0byBwYXJzZSBKU09OXG4gICAgdGhpcy5hcHAudXNlKGV4cHJlc3MuanNvbigpKTtcblxuICAgIC8vIFJvdXRlIFNldHVwXG4gICAgdGhpcy5yb3V0ZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgcm91dGVzKCk6IHZvaWQge1xuICAgIGNvbnN0IG1ldGhvZE5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoXG4gICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcylcbiAgICApLmZpbHRlcihcbiAgICAgIChuYW1lKSA9PlxuICAgICAgICBuYW1lICE9PSBcImNvbnN0cnVjdG9yXCIgJiZcbiAgICAgICAgdHlwZW9mIHRoaXNbbmFtZSBhcyBrZXlvZiBQZWVyTWlkZGxld2FyZV0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICBuYW1lICE9PSBcInJvdXRlc1wiICYmXG4gICAgICAgIG5hbWUgIT09IFwibGlzdGVuXCJcbiAgICApO1xuXG4gICAgZm9yIChjb25zdCBtZXRob2ROYW1lIG9mIG1ldGhvZE5hbWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzW21ldGhvZE5hbWUgYXMga2V5b2YgUGVlck1pZGRsZXdhcmVdKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihgRXJyb3IgY2FsbGluZyBtZXRob2QgJHttZXRob2ROYW1lfTogJHtlcnJvcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZEFjY2Vzc0tleSgpOiB2b2lkIHtcbiAgICB0aGlzLmxvZy5pbmZvKFwiQWRkaW5nIGFjY2VzcyBrZXkgZW5kcG9pbnQgcmVnaXN0ZXJlZFwiKTtcblxuICAgIGNvbnN0IGFkZEtleSA9IChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMubG9nLmluZm8oXCJSZWNlaXZlZCByZXF1ZXN0IHRvIGFkZCBhY2Nlc3Mga2V5XCIpO1xuXG4gICAgICBjb25zdCBib2R5ID0gcmVxLmJvZHk7XG5cbiAgICAgIHRoaXMubG9nLmRlYnVnKGBSZWNlaXZlZCBhY2Nlc3Mga2V5OiAke2JvZHkuYWNjZXNzS2V5fWApO1xuXG4gICAgICBpZiAoIWJvZHkuYWNjZXNzS2V5KSB7XG4gICAgICAgIHJldHVybiByZXMuc3RhdHVzKDQwMCkuc2VuZCh7IGVycm9yOiBcIk1pc3NpbmcgYWNjZXNzIGtleVwiIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWNjZXNzS2V5cy5pbmNsdWRlcyhib2R5LmFjY2Vzc0tleSkpIHtcbiAgICAgICAgcmV0dXJuIHJlcy5zdGF0dXMoNDA5KS5zZW5kKHsgZXJyb3I6IFwiQWNjZXNzIGtleSBhbHJlYWR5IGV4aXN0c1wiIH0pO1xuICAgICAgfVxuICAgICAgdGhpcy5hY2Nlc3NLZXlzLnB1c2goYm9keS5hY2Nlc3NLZXkpO1xuXG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgQWNjZXNzIGtleXM6ICR7dGhpcy5hY2Nlc3NLZXlzLmpvaW4oXCIsIFwiKX1gKTtcbiAgICAgIHJlc1xuICAgICAgICAuc3RhdHVzKDIwMSlcbiAgICAgICAgLmNvbnRlbnRUeXBlKFwiYXBwbGljYXRpb24vanNvblwiKVxuICAgICAgICAuc2VuZCh7IG1lc3NhZ2U6IFwiQWNjZXNzIGtleSBhZGRlZCBzdWNjZXNzZnVsbHlcIiB9KTtcbiAgICB9O1xuXG4gICAgdGhpcy5hcHAucG9zdChgJHtNaWRkbGV3YXJlUm91dGVzLkFDQ0VTU19LRVl9YCwgYWRkS2V5KTtcbiAgfVxuXG4gIHByaXZhdGUgaGVsbG8oKTogdm9pZCB7XG4gICAgdGhpcy5hcHAuZ2V0KFwiL1wiLCAocmVxLCByZXMpID0+IHtcbiAgICAgIHJlcy5zZW5kKFwiSGVsbG8sIHdvcmxkIVwiKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaGVhbHRoY2hlY2soKTogdm9pZCB7XG4gICAgdGhpcy5sb2cuaW5mbyhcIkhlYWx0aGNoZWNrIGVuZHBvaW50IHJlZ2lzdGVyZWRcIik7XG4gICAgY29uc3QgaGVhbHRoY2hlY2sgPSAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgICByZXMuc3RhdHVzKDIwMCkuY29udGVudFR5cGUoXCJhcHBsaWNhdGlvbi9qc29uXCIpLnNlbmQoeyBtZXNzYWdlOiBcIk9LXCIgfSk7XG4gICAgfTtcblxuICAgIHRoaXMuYXBwLmdldChgJHtNaWRkbGV3YXJlUm91dGVzLkhFQUxUWn1gLCBoZWFsdGhjaGVjayk7XG4gIH1cblxuICAvLyBwcml2YXRlIGhhbmRsZU9yZ2FuaXphdGlvbkVucm9sbChyZXE6IGV4cHJlc3MuUmVxdWVzdCwgcmVzOiBleHByZXNzLlJlc3BvbnNlKTogdm9pZHtcbiAgLy8gICAgIGNvbnN0IG9yZ0RldGFpbHMgPSByZXEuYm9keVxuXG4gIC8vICAgICB0cnkge1xuICAvLyAgICAgICAgIG1rZGlyKCcuL3RlbXAvJyk7XG5cbiAgLy8gICAgICAgICBjb25zdCByZXBsYWNlbWVudHMgPSB7XG4gIC8vICAgICAgICAgICAgIE9SR19OQU1FOiBvcmdEZXRhaWxzLm5hbWUsXG4gIC8vICAgICAgICAgICAgIE9SR19NU1BJRDogb3JnRGV0YWlscy5pZCxcbiAgLy8gICAgICAgICAgICAgT1JHX01TUERJUjogXCIvYWVvbi90ZW1wL2NhL3BlZXJzL3BlZXItMC9jbGllbnQvbXNwXCJcbiAgLy8gICAgICAgICB9XG5cbiAgLy8gICAgICAgICBjb3B5QW5kT3ZlcnJpZGVZYW1sKCcuL2NvbmZpZ3Mvb3JndHgueWFtbCcsICcuL3RlbXAvY29uZmlndHgueWFtbCcsIHJlcGxhY2VtZW50cylcblxuICAvLyAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoJy4vdGVtcC9tc3BkaXIudGFyLmd6JywgQnVmZmVyLmZyb20ob3JnRGV0YWlscy5tc3BkaXIpKTtcblxuICAvLyAgICAgICAgIGV4ZWNTeW5jKCd0YXIgLXh2ZiAuL3RlbXAvbXNwZGlyLnRhci5neiAtQyAuL3RlbXAnKTtcblxuICAvLyAgICAgICAgIGV4ZWNTeW5jKGBwZWVyIGNoYW5uZWwgZmV0Y2ggY29uZmlnIC4vdGVtcC9jb25maWdfYmxvY2sucGIgXFxcbiAgLy8gICAgICAgICAgICAgLS1jaGFubmVsSUQgJyR7dGhpcy5jb25maWcuY2hhbm5lbC5uYW1lfScgXFxcbiAgLy8gICAgICAgICAgICAgLS1vcmRlcmVyICcke3RoaXMuY29uZmlnLmNoYW5uZWwub3JkZXJlckVuZHBvaW50fScgXFxcbiAgLy8gICAgICAgICAgICAgLS10bHMgXFxcbiAgLy8gICAgICAgICAgICAgLS1jYWZpbGUgJyR7dGhpcy5jb25maWcudGxzLnRsc30nYCk7XG5cbiAgLy8gICAgICAgICBleGVjU3luYyhgY29uZmlndHhsYXRvciBwcm90b19kZWNvZGUgLS1pbnB1dCAuL3RlbXAvY29uZmlnX2Jsb2NrLnBiIFxcXG4gIC8vICAgICAgICAgICAgIC0tdHlwZSBjb21tb24uQmxvY2sgXFxcbiAgLy8gICAgICAgICAgICAgLS1vdXRwdXQgLi90ZW1wL2NvbmZpZ19ibG9jay5qc29uYCk7XG5cbiAgLy8gICAgICAgICBleGVjU3luYyhganEgLmRhdGEuZGF0YVswXS5wYXlsb2FkLmRhdGEuY29uZmlnIC4vdGVtcC9jb25maWdfYmxvY2suanNvbiA+IC4vdGVtcC9jb25maWcuanNvbmApO1xuXG4gIC8vICAgICAgICAgZXhlY1N5bmMoYGNkIHRlbXAgJiYgY29uZmlndHhnZW4gLXByaW50T3JnICR7b3JnRGV0YWlscy5uYW1lfSA+IC4vb3JnLmpzb25gKSA7XG5cbiAgLy8gICAgICAgICBleGVjU3luYyggYGpxIC1zICcuWzBdICoge1wiY2hhbm5lbF9ncm91cFwiOntcImdyb3Vwc1wiOntcIkFwcGxpY2F0aW9uXCI6e1wiZ3JvdXBzXCI6IHtcIiR7b3JnRGV0YWlscy5uYW1lfVwiOi5bMV19fX19fScgXFxcbiAgLy8gICAgICAgICAgICAgLi90ZW1wL2NvbmZpZy5qc29uIFxcXG4gIC8vICAgICAgICAgICAgIC4vdGVtcC9vcmcuanNvbiA+IC4vdGVtcC9tb2RpZmllZF9jb25maWcuanNvbmApO1xuXG4gIC8vICAgICAgICAgZXhlY1N5bmMoYGNvbmZpZ3R4bGF0b3IgcHJvdG9fZW5jb2RlIFxcXG4gIC8vICAgICAgICAgICAgIC0taW5wdXQgLi90ZW1wL2NvbmZpZy5qc29uIFxcXG4gIC8vICAgICAgICAgICAgIC0tdHlwZSBjb21tb24uQ29uZmlnIFxcXG4gIC8vICAgICAgICAgICAgIC0tb3V0cHV0IC4vdGVtcC9jb25maWcucGJgKTtcblxuICAvLyAgICAgICAgIGV4ZWNTeW5jKCBgY29uZmlndHhsYXRvciBwcm90b19lbmNvZGUgXFxcbiAgLy8gICAgICAgICAgICAgLS1pbnB1dCAuL3RlbXAvbW9kaWZpZWRfY29uZmlnLmpzb24gXFxcbiAgLy8gICAgICAgICAgICAgLS10eXBlIGNvbW1vbi5Db25maWcgXFxcbiAgLy8gICAgICAgICAgICAgLS1vdXRwdXQgLi90ZW1wL21vZGlmaWVkX2NvbmZpZy5wYmApO1xuXG4gIC8vICAgICAgICAgZXhlY1N5bmMoYGNvbmZpZ3R4bGF0b3IgY29tcHV0ZV91cGRhdGUgXFxcbiAgLy8gICAgICAgICAgICAgLS1jaGFubmVsX2lkIGFlb24tbWFpbiBcXFxuICAvLyAgICAgICAgICAgICAtLW9yaWdpbmFsIC4vdGVtcC9jb25maWcucGIgXFxcbiAgLy8gICAgICAgICAgICAgLS11cGRhdGVkIC4vdGVtcC9tb2RpZmllZF9jb25maWcucGIgXFxcbiAgLy8gICAgICAgICAgICAgLS1vdXRwdXQgLi90ZW1wL29yZ191cGRhdGUucGJgKTtcblxuICAvLyAgICAgICAgIGV4ZWNTeW5jKGBjb25maWd0eGxhdG9yIHByb3RvX2RlY29kZSBcXFxuICAvLyAgICAgICAgICAgICAtLWlucHV0IC4vdGVtcC9vcmdfdXBkYXRlLnBiIFxcXG4gIC8vICAgICAgICAgICAgIC0tdHlwZSBjb21tb24uQ29uZmlnVXBkYXRlIFxcXG4gIC8vICAgICAgICAgICAgIC0tb3V0cHV0IC4vdGVtcC9vcmdfdXBkYXRlLmpzb25gKTtcblxuICAvLyAgICAgICAgIGV4ZWNTeW5jKGBlY2hvICd7XCJwYXlsb2FkXCI6e1wiaGVhZGVyXCI6e1wiY2hhbm5lbF9oZWFkZXJcIjp7XCJjaGFubmVsX2lkXCI6XCInJHt0aGlzLmNvbmZpZy5jaGFubmVsLm5hbWV9J1wiLCBcInR5cGVcIjoyfX0sXCJkYXRhXCI6e1wiY29uZmlnX3VwZGF0ZVwiOickKGNhdCAuL3RlbXAvb3JnX3VwZGF0ZS5qc29uKSd9fX0nIFxcXG4gIC8vICAgICAgICAgICAgIHwganEgLiA+IC4vdGVtcC9vcmdfdXBkYXRlX2luX2VudmVsb3BlLmpzb25gKTtcblxuICAvLyAgICAgICAgIGV4ZWNTeW5jKCBgY29uZmlndHhsYXRvciBwcm90b19lbmNvZGUgXFxcbiAgLy8gICAgICAgICAgICAgLS1pbnB1dCAuL3RlbXAvb3JnX3VwZGF0ZV9pbl9lbnZlbG9wZS5qc29uIFxcXG4gIC8vICAgICAgICAgICAgIC0tdHlwZSBjb21tb24uRW52ZWxvcGUgXFxcbiAgLy8gICAgICAgICAgICAgLS1vdXRwdXQgLi90ZW1wL29yZ191cGRhdGVfaW5fZW52ZWxvcGUucGJgKTtcblxuICAvLyAgICAgICAgIGV4ZWNTeW5jKGBjZCB0ZW1wICYmIHBlZXIgY2hhbm5lbCBzaWduY29uZmlndHggXFxcbiAgLy8gICAgICAgICAgICAgLWYgLi9vcmdfdXBkYXRlX2luX2VudmVsb3BlLnBiYCk7XG5cbiAgLy8gICAgICAgICBleGVjU3luYyhgcGVlciBjaGFubmVsIHVwZGF0ZSBcXFxuICAvLyAgICAgICAgICAgICAtZiAuL3RlbXAvb3JnX3VwZGF0ZV9pbl9lbnZlbG9wZS5wYiBcXFxuICAvLyAgICAgICAgICAgICAtYyAke3RoaXMuY29uZmlnLmNoYW5uZWwubmFtZX0gXFxcbiAgLy8gICAgICAgICAgICAgLW8gJHt0aGlzLmNvbmZpZy5jaGFubmVsLm9yZGVyZXJFbmRwb2ludH0gXFxcbiAgLy8gICAgICAgICAgICAgLS10bHMgXFxcbiAgLy8gICAgICAgICAgICAgLS1jYWZpbGUgJHt0aGlzLmNvbmZpZy50bHMudGxzfWApO1xuXG4gIC8vICAgICAgICAgcmVzLnN0YXR1cygyMDApLnNlbmQoe3N1Y2Nlc3M6dHJ1ZX0pXG5cbiAgLy8gICAgIH0gY2F0Y2goZTp1bmtub3duKSB7XG4gIC8vICAgICAgICAgcmVzLnN0YXR1cyg1MDApLnNlbmQoZSlcbiAgLy8gICAgIH0gZmluYWxseSB7XG4gIC8vICAgICAgICAgcm0oXCIuL3RlbXBcIik7XG4gIC8vICAgICB9XG4gIC8vIH1cblxuICAvLyBwcml2YXRlIGhhbmRsZU9yZ2FuaXphdGlvblBlZXJBbmNob3IocmVxOiBleHByZXNzLlJlcXVlc3QsIHJlczogZXhwcmVzcy5SZXNwb25zZSk6IHZvaWR7XG4gIC8vICAgICBjb25zdCBib2R5ID0gcmVxLmJvZHlcblxuICAvLyAgICAgdHJ5IHtcbiAgLy8gICAgICAgICBta2RpcignLi90ZW1wLycpO1xuXG4gIC8vICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJ0ZW1wL2FuY2hvcl91cGRhdGVfaW5fZW52ZWxvcGUucGJcIiksIEJ1ZmZlci5mcm9tKGJvZHkuYmxvY2spKVxuXG4gIC8vICAgICAgICAgZXhlY1N5bmMoYHBlZXIgY2hhbm5lbCB1cGRhdGUgXFxcbiAgLy8gICAgICAgICAgICAgLWYgL2Flb24vdGVtcC9hbmNob3JfdXBkYXRlX2luX2VudmVsb3BlLnBiIFxcXG4gIC8vICAgICAgICAgICAgIC0tY2hhbm5lbElEICR7dGhpcy5jb25maWcuY2hhbm5lbC5uYW1lfSBcXFxuICAvLyAgICAgICAgICAgICAtLW9yZGVyZXIgJHt0aGlzLmNvbmZpZy5jaGFubmVsLm9yZGVyZXJFbmRwb2ludH0gXFxcbiAgLy8gICAgICAgICAgICAgLS10bHMgXFxcbiAgLy8gICAgICAgICAgICAgLS1jYWZpbGUgJHt0aGlzLmNvbmZpZy5jaGFubmVsLm9yZGVyZXJDYUZpbGV9YCk7XG5cbiAgLy8gICAgICAgICByZXMuc3RhdHVzKDIwMCkuc2VuZCh7c3VjY2Vzczp0cnVlfSlcbiAgLy8gICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgLy8gICAgICAgICByZXMuc3RhdHVzKDUwMCkuc2VuZChlKVxuICAvLyAgICAgfSBmaW5hbGx5IHtcbiAgLy8gICAgICAgICBybShcIi4vdGVtcFwiKTtcbiAgLy8gICAgIH1cbiAgLy8gfVxuXG4gIGxpc3RlbigpOiB2b2lkIHtcbiAgICB0aGlzLmFwcC5saXN0ZW4odGhpcy5wb3J0LCAoKSA9PiB7XG4gICAgICB0aGlzLmxvZy5pbmZvKGBQZWVyIE1pZGRsZXdhcmUgcnVubmluZyBvbiBwb3J0OiAke3RoaXMucG9ydH1gKTtcbiAgICB9KTtcbiAgfVxufVxuIl19