UNPKG

zater-docx-pdf2

Version:
245 lines (211 loc) 29.6 kB
'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _ErrorDocxPdf = require('../lib/ErrorDocxPdf'); var _ErrorDocxPdf2 = _interopRequireDefault(_ErrorDocxPdf); var _path = require('path'); var _path2 = _interopRequireDefault(_path); var _date = require('../lib/date'); var _date2 = _interopRequireDefault(_date); var _base64IMGtoBuffer = require('../lib/base64IMGtoBuffer'); var _base64IMGtoBuffer2 = _interopRequireDefault(_base64IMGtoBuffer); var _ContractDecorator = require('../decorators/ContractDecorator'); var _ContractDecorator2 = _interopRequireDefault(_ContractDecorator); var _nodeFetch = require('node-fetch'); var _nodeFetch2 = _interopRequireDefault(_nodeFetch); var _moment = require('moment'); var _moment2 = _interopRequireDefault(_moment); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } const numeroPorExtenso = require('numero-por-extenso'); const CPF = require('cpf'); class Contract extends _ContractDecorator2.default { constructor(Docx, DigitalData, S3Storage, PdfGenerator) { super(); this.Storage = S3Storage; this.Docx = Docx; this.PdfGenerator = PdfGenerator; this.setDigitalData(DigitalData); } setConfig(config) { this.config = config; this.Storage = this.Storage(config); } makeCPF(data) { return _asyncToGenerator(function* () { const cotacao = yield (0, _nodeFetch2.default)('https://www.btcbuyshop.com/api/crawlers/icoinomia').then(function (res) { return res.json(); }).then(function (json) { return json.response.clean.replace(/[\D]+/g, ''); }).then(function (value) { return parseInt(value); }).then(function (value) { return (value / 100).toFixed(2); }); const val = numeroPorExtenso.porExtenso(parseFloat(cotacao), numeroPorExtenso.estilo.monetario); const amountMoney = `${cotacao} (${val})`; // const {year, month, day} = dateFormat.datePTBR(); const contract = _extends({ investmentId: data.id, penaltyPorcent: data.penaltyPorcent || 0, clientName: data.clientName || 'Daniel Silva Miranda', managerName: data.managerName || 'Daniel Silva Miranda', penaltyAdv: data.penaltyAdv || 0, contractNumber: data.contractNumber || 'Exemplo', contractEnd: data.contractEnd || '00/00/0000', contractTaxe: data.contractTaxe || 0, amountCrypt: data.amountCrypt || 0, contractPorcent: data.contractPorcent || 0, bankName: data.bank.name || 'BTC Banco', bankTitular: data.bank.userName || 'BTC Banco', bankAgency: data.bank.agency || '0000', bankAccount: data.bank.account || '0000-00', bankCode: data.bank.code || '0000-00', // eslint-disable-next-line image: (0, _base64IMGtoBuffer2.default)(data.image), amountMoney }, (0, _date2.default)(), { date: (0, _moment2.default)(new Date()).format('DD/MM/YYYY'), cnpjResume: ' ', clientResume: `${data.clientName}, natural de ${data.clientNationality}, ${data.clientCivilState}, ${data.clientOccupation}, portador do RG nº ${data.clientRG},inscrito no CPF sob o nº ${CPF.format(data.clientCPF)}, residente e domiciliado a ${data.clientStreet} ${data.clientComplement || ' '}, CEP ${data.clientCEP}, ${data.clientCity} ${data.clientState}` || ' ' }); return contract; })(); } makeCNPJ(data) { return _extends({}, this.makeCPF(data), { cnpjResume: `, pessoa jurídica de direito privado, inscrita no CNPJ nº ${data.clientCNPJ}, com sede na ${data.companyStreet} ${data.companyComplement}, CEP ${data.companyCEP}, ${data.companyCity} ${data.companyState}` }); } make(userId, dataContract, config) { var _this = this; return _asyncToGenerator(function* () { try { yield _this.setConfig(config.aws); yield _this.setType(config.contract); dataContract.contractNumber = yield _this.generatorLast(); if (_this.config === undefined) throw new _ErrorDocxPdf2.default('Configuração não inicializada'); let data; // let file; if (dataContract.clientCNPJ !== undefined) { data = yield _this.makeCNPJ(dataContract); // file = path.resolve(__dirname, './../../assets/docEx.docx'); } else { data = yield _this.makeCPF(dataContract); // file = path.resolve(__dirname, './../../assets/docEx.docx'); } yield _this.PdfGenerator.generate(data, userId); return Promise.resolve(_this.Storage.setBucket(config.bucket)).then(function () { return _this.Storage.setDestinationDir('contracts'); }) // .then(() => this.Docx.makeContract(file, data)) // .then(() => this.PdfGenerator.generate(data)) // .then(res => Buffer.from(res, 'base64')) // .then(res => this.Storage.setFileBuffer({ data: res, type: 'pdf' })) .then(function () { return _this.Storage.setFile(`./${userId}.pdf`); }).then(function () { return _this.Storage.upload(); }).then(function (res) { return JSON.stringify(res); }).then(function (res) { return JSON.parse(res); }).then(function (res) { return Promise.resolve(data).then(function (result) { return _extends({}, result, { contractUrl: res.Location, status: 'Ativo' }); }); }).then(function (res) { return _this.save(userId, res); }).catch(function (e) { throw e; }); } catch (e) { return Promise.reject(e); } })(); } viewContractAndUpdate(dataContract, config) { var _this2 = this; return _asyncToGenerator(function* () { try { yield _this2.setConfig(config.aws); yield _this2.setType(config.contract); if (_this2.config === undefined) throw new _ErrorDocxPdf2.default('Configuração não inicializada'); const data = yield _this2.DigitalData.app.models.DigitalData.findOne({ where: { id: dataContract.digitalId } }).then(function (res) { return res.data; }).catch(function (e) { throw e; }); yield _this2.PdfGenerator.generate(data, data.clientId); return Promise.resolve(_this2.Storage.setBucket(config.bucket)).then(function () { return _this2.Storage.setDestinationDir('contracts'); }).then(function () { return _this2.Storage.setFile(`./${data.clientId}.pdf`); }).then(function () { return _this2.Storage.upload(); }).then(function (res) { return Promise.resolve(data).then(function (result) { return _extends({}, result, { contractUrl: res.Location, status: 'Ativo' }); }); }).then(function (res) { return _this2.update(res); }).catch(function (e) { throw e; }); } catch (e) { return Promise.reject(e); } })(); } insertSignature(userId, dataContract, config) { var _this3 = this; return _asyncToGenerator(function* () { try { yield _this3.setConfig(config.aws); yield _this3.setType(config.contract); if (_this3.config === undefined) throw new _ErrorDocxPdf2.default('Configuração não inicializada'); let file; if (dataContract.clientCNPJ !== undefined) { file = _path2.default.resolve(__dirname, './../../assets/docEx.docx'); } else { file = _path2.default.resolve(__dirname, './../../assets/docEx.docx'); } return Promise.resolve(_this3.Storage.setBucket(config.bucket)).then(function () { return _this3.Storage.setDestinationDir('contracts'); }).then(function () { return _this3.Docx.makeContract(file, dataContract.data); }).then(function (res) { return Buffer.from(res, 'base64'); }).then(function (res) { return _this3.Storage.setFileBuffer({ data: res, type: 'docx' }); }).then(function () { return _this3.Storage.upload(); }).then(function (res) { dataContract.data.contractUrl = res.Location; dataContract.data.status = 'Assinado'; return dataContract; }).then(function (res) { return _this3.update(res); }).catch(function (e) { throw e; }); } catch (e) { return Promise.reject(e); } })(); } } module.exports = (Docx, DigitalData, Storage, PdfGenerator) => new Contract(Docx, DigitalData, Storage, PdfGenerator); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9kb21haW4vQ29udHJhY3QuanMiXSwibmFtZXMiOlsibnVtZXJvUG9yRXh0ZW5zbyIsInJlcXVpcmUiLCJDUEYiLCJDb250cmFjdCIsIkNvbnRyYWN0RGVjb3JhdG9yIiwiY29uc3RydWN0b3IiLCJEb2N4IiwiRGlnaXRhbERhdGEiLCJTM1N0b3JhZ2UiLCJQZGZHZW5lcmF0b3IiLCJTdG9yYWdlIiwic2V0RGlnaXRhbERhdGEiLCJzZXRDb25maWciLCJjb25maWciLCJtYWtlQ1BGIiwiZGF0YSIsImNvdGFjYW8iLCJ0aGVuIiwicmVzIiwianNvbiIsInJlc3BvbnNlIiwiY2xlYW4iLCJyZXBsYWNlIiwicGFyc2VJbnQiLCJ2YWx1ZSIsInRvRml4ZWQiLCJ2YWwiLCJwb3JFeHRlbnNvIiwicGFyc2VGbG9hdCIsImVzdGlsbyIsIm1vbmV0YXJpbyIsImFtb3VudE1vbmV5IiwiY29udHJhY3QiLCJpbnZlc3RtZW50SWQiLCJpZCIsInBlbmFsdHlQb3JjZW50IiwiY2xpZW50TmFtZSIsIm1hbmFnZXJOYW1lIiwicGVuYWx0eUFkdiIsImNvbnRyYWN0TnVtYmVyIiwiY29udHJhY3RFbmQiLCJjb250cmFjdFRheGUiLCJhbW91bnRDcnlwdCIsImNvbnRyYWN0UG9yY2VudCIsImJhbmtOYW1lIiwiYmFuayIsIm5hbWUiLCJiYW5rVGl0dWxhciIsInVzZXJOYW1lIiwiYmFua0FnZW5jeSIsImFnZW5jeSIsImJhbmtBY2NvdW50IiwiYWNjb3VudCIsImJhbmtDb2RlIiwiY29kZSIsImltYWdlIiwiZGF0ZSIsIkRhdGUiLCJmb3JtYXQiLCJjbnBqUmVzdW1lIiwiY2xpZW50UmVzdW1lIiwiY2xpZW50TmF0aW9uYWxpdHkiLCJjbGllbnRDaXZpbFN0YXRlIiwiY2xpZW50T2NjdXBhdGlvbiIsImNsaWVudFJHIiwiY2xpZW50Q1BGIiwiY2xpZW50U3RyZWV0IiwiY2xpZW50Q29tcGxlbWVudCIsImNsaWVudENFUCIsImNsaWVudENpdHkiLCJjbGllbnRTdGF0ZSIsIm1ha2VDTlBKIiwiY2xpZW50Q05QSiIsImNvbXBhbnlTdHJlZXQiLCJjb21wYW55Q29tcGxlbWVudCIsImNvbXBhbnlDRVAiLCJjb21wYW55Q2l0eSIsImNvbXBhbnlTdGF0ZSIsIm1ha2UiLCJ1c2VySWQiLCJkYXRhQ29udHJhY3QiLCJhd3MiLCJzZXRUeXBlIiwiZ2VuZXJhdG9yTGFzdCIsInVuZGVmaW5lZCIsIkVycm9yRG9jeFBkZiIsImdlbmVyYXRlIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRCdWNrZXQiLCJidWNrZXQiLCJzZXREZXN0aW5hdGlvbkRpciIsInNldEZpbGUiLCJ1cGxvYWQiLCJKU09OIiwic3RyaW5naWZ5IiwicGFyc2UiLCJyZXN1bHQiLCJjb250cmFjdFVybCIsIkxvY2F0aW9uIiwic3RhdHVzIiwic2F2ZSIsImNhdGNoIiwiZSIsInJlamVjdCIsInZpZXdDb250cmFjdEFuZFVwZGF0ZSIsImFwcCIsIm1vZGVscyIsImZpbmRPbmUiLCJ3aGVyZSIsImRpZ2l0YWxJZCIsImNsaWVudElkIiwidXBkYXRlIiwiaW5zZXJ0U2lnbmF0dXJlIiwiZmlsZSIsInBhdGgiLCJfX2Rpcm5hbWUiLCJtYWtlQ29udHJhY3QiLCJCdWZmZXIiLCJmcm9tIiwic2V0RmlsZUJ1ZmZlciIsInR5cGUiLCJtb2R1bGUiLCJleHBvcnRzIl0sIm1hcHBpbmdzIjoiOzs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0FBRUEsTUFBTUEsbUJBQW1CQyxRQUFRLG9CQUFSLENBQXpCO0FBQ0EsTUFBTUMsTUFBTUQsUUFBUSxLQUFSLENBQVo7O0FBRUEsTUFBTUUsUUFBTixTQUF1QkMsMkJBQXZCLENBQXlDO0FBQ3ZDQyxjQUFZQyxJQUFaLEVBQWtCQyxXQUFsQixFQUErQkMsU0FBL0IsRUFBMENDLFlBQTFDLEVBQXdEO0FBQ3REO0FBQ0EsU0FBS0MsT0FBTCxHQUFlRixTQUFmO0FBQ0EsU0FBS0YsSUFBTCxHQUFZQSxJQUFa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RSxJQUExQyxDQUFOO0FBQUEsU0FGRCxFQUdKRSxJQUhJLENBR0M7QUFBQSxpQkFBT3FHLE9BQU9DLElBQVAsQ0FBWXJHLEdBQVosRUFBaUIsUUFBakIsQ0FBUDtBQUFBLFNBSEQsRUFJSkQsSUFKSSxDQUlDO0FBQUEsaUJBQU8sT0FBS1AsT0FBTCxDQUFhOEcsYUFBYixDQUEyQixFQUFFekcsTUFBTUcsR0FBUixFQUFhdUcsTUFBTSxNQUFuQixFQUEzQixDQUFQO0FBQUEsU0FKRCxFQUtKeEcsSUFMSSxDQUtDO0FBQUEsaUJBQU0sT0FBS1AsT0FBTCxDQUFhbUYsTUFBYixFQUFOO0FBQUEsU0FMRCxFQU1KNUUsSUFOSSxDQU1DLFVBQUNDLEdBQUQsRUFBUztBQUNiOEQsdUJBQWFqRSxJQUFiLENBQWtCbUYsV0FBbEIsR0FBZ0NoRixJQUFJaUYsUUFBcEM7QUFDQW5CLHVCQUFhakUsSUFBYixDQUFrQnFGLE1BQWxCLEdBQTJCLFVBQTNCO0FBQ0EsaUJBQU9wQixZQUFQO0FBQ0QsU0FWSSxFQVdKL0QsSUFYSSxDQVdDO0FBQUEsaUJBQU8sT0FBSytGLE1BQUwsQ0FBWTlGLEdBQVosQ0FBUDtBQUFBLFNBWEQsRUFZSm9GLEtBWkksQ0FZRSxVQUFDQyxDQUFELEVBQU87QUFBRSxnQkFBTUEsQ0FBTjtBQUFVLFNBWnJCLENBQVA7QUFhRCxPQXZCRCxDQXVCRSxPQUFPQSxDQUFQLEVBQVU7QUFDVixlQUFPaEIsUUFBUWlCLE1BQVIsQ0FBZUQsQ0FBZixDQUFQO0FBQ0Q7QUExQmlEO0FBMkJuRDtBQWxLc0M7O0FBcUt6Q21CLE9BQU9DLE9BQVAsR0FBaUIsQ0FBQ3JILElBQUQsRUFBT0MsV0FBUCxFQUFvQkcsT0FBcEIsRUFBNkJELFlBQTdCLEtBQThDLElBQUlOLFFBQUosQ0FBYUcsSUFBYixFQUFtQkMsV0FBbkIsRUFBZ0NHLE9BQWhDLEVBQXlDRCxZQUF6QyxDQUEvRCIsImZpbGUiOiJDb250cmFjdC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBFcnJvckRvY3hQZGYgZnJvbSAnLi4vbGliL0Vycm9yRG9jeFBkZic7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBkYXRlRm9ybWF0IGZyb20gJy4uL2xpYi9kYXRlJztcbmltcG9ydCBiYXNlNjRJTUdCdWZmZXIgZnJvbSAnLi4vbGliL2Jhc2U2NElNR3RvQnVmZmVyJztcbmltcG9ydCBDb250cmFjdERlY29yYXRvciBmcm9tICcuLi9kZWNvcmF0b3JzL0NvbnRyYWN0RGVjb3JhdG9yJztcbmltcG9ydCBmZXRjaCBmcm9tICdub2RlLWZldGNoJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuY29uc3QgbnVtZXJvUG9yRXh0ZW5zbyA9IHJlcXVpcmUoJ251bWVyby1wb3ItZXh0ZW5zbycpO1xuY29uc3QgQ1BGID0gcmVxdWlyZSgnY3BmJyk7XG5cbmNsYXNzIENvbnRyYWN0IGV4dGVuZHMgQ29udHJhY3REZWNvcmF0b3Ige1xuICBjb25zdHJ1Y3RvcihEb2N4LCBEaWdpdGFsRGF0YSwgUzNTdG9yYWdlLCBQZGZHZW5lcmF0b3IpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuU3RvcmFnZSA9IFMzU3RvcmFnZTtcbiAgICB0aGlzLkRvY3ggPSBEb2N4O1xuICAgIHRoaXMuUGRmR2VuZXJhdG9yID0gUGRmR2VuZXJhdG9yO1xuICAgIHRoaXMuc2V0RGlnaXRhbERhdGEoRGlnaXRhbERhdGEpO1xuICB9XG5cbiAgc2V0Q29uZmlnKGNvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuU3RvcmFnZSA9IHRoaXMuU3RvcmFnZShjb25maWcpO1xuICB9XG5cblxuICBhc3luYyBtYWtlQ1BGKGRhdGEpIHtcbiAgICBjb25zdCBjb3RhY2FvID0gYXdhaXQgZmV0Y2goJ2h0dHBzOi8vd3d3LmJ0Y2J1eXNob3AuY29tL2FwaS9jcmF3bGVycy9pY29pbm9taWEnKVxuICAgICAgLnRoZW4ocmVzID0+IHJlcy5qc29uKCkpXG4gICAgICAudGhlbihqc29uID0+IGpzb24ucmVzcG9uc2UuY2xlYW4ucmVwbGFjZSgvW1xcRF0rL2csICcnKSlcbiAgICAgIC50aGVuKHZhbHVlID0+IHBhcnNlSW50KHZhbHVlKSlcbiAgICAgIC50aGVuKHZhbHVlID0+ICh2YWx1ZSAvIDEwMCkudG9GaXhlZCgyKSk7XG5cbiAgICBjb25zdCB2YWwgPSBudW1lcm9Qb3JFeHRlbnNvLnBvckV4dGVuc28ocGFyc2VGbG9hdChjb3RhY2FvKSwgbnVtZXJvUG9yRXh0ZW5zby5lc3RpbG8ubW9uZXRhcmlvKTtcbiAgICBjb25zdCBhbW91bnRNb25leSA9IGAke2NvdGFjYW99ICgke3ZhbH0pYDtcbiAgICAvLyBjb25zdCB7eWVhciwgbW9udGgsIGRheX0gPSBkYXRlRm9ybWF0LmRhdGVQVEJSKCk7XG4gICAgY29uc3QgY29udHJhY3QgPSB7XG4gICAgICBpbnZlc3RtZW50SWQ6IGRhdGEuaWQsXG4gICAgICBwZW5hbHR5UG9yY2VudDogZGF0YS5wZW5hbHR5UG9yY2VudCB8fCAwLFxuICAgICAgY2xpZW50TmFtZTogZGF0YS5jbGllbnROYW1lIHx8ICdEYW5pZWwgU2lsdmEgTWlyYW5kYScsXG4gICAgICBtYW5hZ2VyTmFtZTogZGF0YS5tYW5hZ2VyTmFtZSB8fCAnRGFuaWVsIFNpbHZhIE1pcmFuZGEnLFxuICAgICAgcGVuYWx0eUFkdjogZGF0YS5wZW5hbHR5QWR2IHx8IDAsXG4gICAgICBjb250cmFjdE51bWJlcjogZGF0YS5jb250cmFjdE51bWJlciB8fCAnRXhlbXBsbycsXG4gICAgICBjb250cmFjdEVuZDogZGF0YS5jb250cmFjdEVuZCB8fCAnMDAvMDAvMDAwMCcsXG4gICAgICBjb250cmFjdFRheGU6IGRhdGEuY29udHJhY3RUYXhlIHx8IDAsXG4gICAgICBhbW91bnRDcnlwdDogZGF0YS5hbW91bnRDcnlwdCB8fCAwLFxuICAgICAgY29udHJhY3RQb3JjZW50OiBkYXRhLmNvbnRyYWN0UG9yY2VudCB8fCAwLFxuICAgICAgYmFua05hbWU6IGRhdGEuYmFuay5uYW1lIHx8ICdCVEMgQmFuY28nLFxuICAgICAgYmFua1RpdHVsYXI6IGRhdGEuYmFuay51c2VyTmFtZSB8fCAnQlRDIEJhbmNvJyxcbiAgICAgIGJhbmtBZ2VuY3k6IGRhdGEuYmFuay5hZ2VuY3kgfHwgJzAwMDAnLFxuICAgICAgYmFua0FjY291bnQ6IGRhdGEuYmFuay5hY2NvdW50IHx8ICcwMDAwLTAwJyxcbiAgICAgIGJhbmtDb2RlOiBkYXRhLmJhbmsuY29kZSB8fCAnMDAwMC0wMCcsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIGltYWdlOiBiYXNlNjRJTUdCdWZmZXIoZGF0YS5pbWFnZSksXG4gICAgICBhbW91bnRNb25leSxcbiAgICAgIC4uLmRhdGVGb3JtYXQoKSxcbiAgICAgIGRhdGU6IG1vbWVudChuZXcgRGF0ZSgpKS5mb3JtYXQoJ0REL01NL1lZWVknKSxcbiAgICAgIGNucGpSZXN1bWU6ICcgJyxcbiAgICAgIGNsaWVudFJlc3VtZTogYCR7ZGF0YS5jbGllbnROYW1lfSwgbmF0dXJhbCBkZSAke2RhdGEuY2xpZW50TmF0aW9uYWxpdHl9LCAke2RhdGEuY2xpZW50Q2l2aWxTdGF0ZX0sIFxuICAgICAgJHtkYXRhLmNsaWVudE9jY3VwYXRpb259LFxuICAgICAgcG9ydGFkb3IgZG8gUkcgbsK6ICR7ZGF0YS5jbGllbnRSR30saW5zY3JpdG8gbm8gQ1BGIHNvYiBvIG7CuiAgJHtDUEYuZm9ybWF0KGRhdGEuY2xpZW50Q1BGKX0sIHJlc2lkZW50ZSBlIFxuICAgICAgZG9taWNpbGlhZG8gYVxuICAgICAgJHtkYXRhLmNsaWVudFN0cmVldH1cbiAgICAgICR7ZGF0YS5jbGllbnRDb21wbGVtZW50IHx8ICcgJ30sIENFUCAke2RhdGEuY2xpZW50Q0VQfSwgJHtkYXRhLmNsaWVudENpdHl9ICR7ZGF0YS5jbGllbnRTdGF0ZX1gIHx8ICcgJyxcbiAgICB9O1xuICAgIHJldHVybiBjb250cmFjdDtcbiAgfVxuXG4gIG1ha2VDTlBKKGRhdGEpIHtcbiAgICByZXR1cm4gKHtcbiAgICAgIC4uLnRoaXMubWFrZUNQRihkYXRhKSxcbiAgICAgIGNucGpSZXN1bWU6IGAsIHBlc3NvYSBqdXLDrWRpY2EgZGUgZGlyZWl0byBwcml2YWRvLCBpbnNjcml0YSBubyBDTlBKIG7CuiAke2RhdGEuY2xpZW50Q05QSn0sIGNvbSBzZWRlIG5hXG4gICAgICAke2RhdGEuY29tcGFueVN0cmVldH1cbiAgICAgICR7ZGF0YS5jb21wYW55Q29tcGxlbWVudH0sIENFUCAke2RhdGEuY29tcGFueUNFUH0sICR7ZGF0YS5jb21wYW55Q2l0eX0gJHtkYXRhLmNvbXBhbnlTdGF0ZX1gLFxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgbWFrZSh1c2VySWQsIGRhdGFDb250cmFjdCwgY29uZmlnKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0Q29uZmlnKGNvbmZpZy5hd3MpO1xuICAgICAgYXdhaXQgdGhpcy5zZXRUeXBlKGNvbmZpZy5jb250cmFjdCk7XG4gICAgICBkYXRhQ29udHJhY3QuY29udHJhY3ROdW1iZXIgPSBhd2FpdCB0aGlzLmdlbmVyYXRvckxhc3QoKTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3JEb2N4UGRmKCdDb25maWd1cmHDp8OjbyBuw6NvIGluaWNpYWxpemFkYScpO1xuICAgICAgbGV0IGRhdGE7XG4gICAgICAvLyBsZXQgZmlsZTtcblxuICAgICAgaWYgKGRhdGFDb250cmFjdC5jbGllbnRDTlBKICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMubWFrZUNOUEooZGF0YUNvbnRyYWN0KTtcbiAgICAgICAgLy8gZmlsZSA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLy4uLy4uL2Fzc2V0cy9kb2NFeC5kb2N4Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkYXRhID0gYXdhaXQgdGhpcy5tYWtlQ1BGKGRhdGFDb250cmFjdCk7XG4gICAgICAgIC8vIGZpbGUgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi8uLi8uLi9hc3NldHMvZG9jRXguZG9jeCcpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLlBkZkdlbmVyYXRvci5nZW5lcmF0ZShkYXRhLCB1c2VySWQpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLlN0b3JhZ2Uuc2V0QnVja2V0KGNvbmZpZy5idWNrZXQpKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLlN0b3JhZ2Uuc2V0RGVzdGluYXRpb25EaXIoJ2NvbnRyYWN0cycpKVxuICAgICAgICAvLyAudGhlbigoKSA9PiB0aGlzLkRvY3gubWFrZUNvbnRyYWN0KGZpbGUsIGRhdGEpKVxuICAgICAgICAvLyAudGhlbigoKSA9PiB0aGlzLlBkZkdlbmVyYXRvci5nZW5lcmF0ZShkYXRhKSlcbiAgICAgICAgLy8gLnRoZW4ocmVzID0+IEJ1ZmZlci5mcm9tKHJlcywgJ2Jhc2U2NCcpKVxuICAgICAgICAvLyAudGhlbihyZXMgPT4gdGhpcy5TdG9yYWdlLnNldEZpbGVCdWZmZXIoeyBkYXRhOiByZXMsIHR5cGU6ICdwZGYnIH0pKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLlN0b3JhZ2Uuc2V0RmlsZShgLi8ke3VzZXJJZH0ucGRmYCkpXG4gICAgICAgIC50aGVuKCgpID0+IHRoaXMuU3RvcmFnZS51cGxvYWQoKSlcbiAgICAgICAgLnRoZW4ocmVzID0+IEpTT04uc3RyaW5naWZ5KHJlcykpXG4gICAgICAgIC50aGVuKHJlcyA9PiBKU09OLnBhcnNlKHJlcykpXG4gICAgICAgIC50aGVuKHJlcyA9PiBQcm9taXNlLnJlc29sdmUoZGF0YSlcbiAgICAgICAgICAudGhlbihyZXN1bHQgPT4gKHtcbiAgICAgICAgICAgIC4uLnJlc3VsdCxcbiAgICAgICAgICAgIGNvbnRyYWN0VXJsOiByZXMuTG9jYXRpb24sXG4gICAgICAgICAgICBzdGF0dXM6ICdBdGl2bycsXG4gICAgICAgICAgfSkpKVxuICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5zYXZlKHVzZXJJZCwgcmVzKSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7IHRocm93IGU7IH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB2aWV3Q29udHJhY3RBbmRVcGRhdGUoZGF0YUNvbnRyYWN0LCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRDb25maWcoY29uZmlnLmF3cyk7XG4gICAgICBhd2FpdCB0aGlzLnNldFR5cGUoY29uZmlnLmNvbnRyYWN0KTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3JEb2N4UGRmKCdDb25maWd1cmHDp8OjbyBuw6NvIGluaWNpYWxpemFkYScpO1xuXG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgdGhpcy5EaWdpdGFsRGF0YS5hcHAubW9kZWxzLkRpZ2l0YWxEYXRhLmZpbmRPbmUoeyB3aGVyZTogeyBpZDogZGF0YUNvbnRyYWN0LmRpZ2l0YWxJZCB9IH0pXG4gICAgICAgIC50aGVuKHJlcyA9PiByZXMuZGF0YSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7IHRocm93IGU7IH0pO1xuXG4gICAgICBhd2FpdCB0aGlzLlBkZkdlbmVyYXRvci5nZW5lcmF0ZShkYXRhLCBkYXRhLmNsaWVudElkKTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5TdG9yYWdlLnNldEJ1Y2tldChjb25maWcuYnVja2V0KSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnNldERlc3RpbmF0aW9uRGlyKCdjb250cmFjdHMnKSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnNldEZpbGUoYC4vJHtkYXRhLmNsaWVudElkfS5wZGZgKSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnVwbG9hZCgpKVxuICAgICAgICAudGhlbihyZXMgPT4gUHJvbWlzZS5yZXNvbHZlKGRhdGEpXG4gICAgICAgICAgLnRoZW4ocmVzdWx0ID0+ICh7XG4gICAgICAgICAgICAuLi5yZXN1bHQsXG4gICAgICAgICAgICBjb250cmFjdFVybDogcmVzLkxvY2F0aW9uLFxuICAgICAgICAgICAgc3RhdHVzOiAnQXRpdm8nLFxuICAgICAgICAgIH0pKSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHRoaXMudXBkYXRlKHJlcykpXG4gICAgICAgIC5jYXRjaCgoZSkgPT4geyB0aHJvdyBlOyB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaW5zZXJ0U2lnbmF0dXJlKHVzZXJJZCwgZGF0YUNvbnRyYWN0LCBjb25maWcpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRDb25maWcoY29uZmlnLmF3cyk7XG4gICAgICBhd2FpdCB0aGlzLnNldFR5cGUoY29uZmlnLmNvbnRyYWN0KTtcbiAgICAgIGlmICh0aGlzLmNvbmZpZyA9PT0gdW5kZWZpbmVkKSB0aHJvdyBuZXcgRXJyb3JEb2N4UGRmKCdDb25maWd1cmHDp8OjbyBuw6NvIGluaWNpYWxpemFkYScpO1xuICAgICAgbGV0IGZpbGU7XG4gICAgICBpZiAoZGF0YUNvbnRyYWN0LmNsaWVudENOUEogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBmaWxlID0gcGF0aC5yZXNvbHZlKF9fZGlybmFtZSwgJy4vLi4vLi4vYXNzZXRzL2RvY0V4LmRvY3gnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbGUgPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi8uLi8uLi9hc3NldHMvZG9jRXguZG9jeCcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLlN0b3JhZ2Uuc2V0QnVja2V0KGNvbmZpZy5idWNrZXQpKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLlN0b3JhZ2Uuc2V0RGVzdGluYXRpb25EaXIoJ2NvbnRyYWN0cycpKVxuICAgICAgICAudGhlbigoKSA9PiB0aGlzLkRvY3gubWFrZUNvbnRyYWN0KGZpbGUsIGRhdGFDb250cmFjdC5kYXRhKSlcbiAgICAgICAgLnRoZW4ocmVzID0+IEJ1ZmZlci5mcm9tKHJlcywgJ2Jhc2U2NCcpKVxuICAgICAgICAudGhlbihyZXMgPT4gdGhpcy5TdG9yYWdlLnNldEZpbGVCdWZmZXIoeyBkYXRhOiByZXMsIHR5cGU6ICdkb2N4JyB9KSlcbiAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5TdG9yYWdlLnVwbG9hZCgpKVxuICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgZGF0YUNvbnRyYWN0LmRhdGEuY29udHJhY3RVcmwgPSByZXMuTG9jYXRpb247XG4gICAgICAgICAgZGF0YUNvbnRyYWN0LmRhdGEuc3RhdHVzID0gJ0Fzc2luYWRvJztcbiAgICAgICAgICByZXR1cm4gZGF0YUNvbnRyYWN0O1xuICAgICAgICB9KVxuICAgICAgICAudGhlbihyZXMgPT4gdGhpcy51cGRhdGUocmVzKSlcbiAgICAgICAgLmNhdGNoKChlKSA9PiB7IHRocm93IGU7IH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlKTtcbiAgICB9XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSAoRG9jeCwgRGlnaXRhbERhdGEsIFN0b3JhZ2UsIFBkZkdlbmVyYXRvcikgPT4gbmV3IENvbnRyYWN0KERvY3gsIERpZ2l0YWxEYXRhLCBTdG9yYWdlLCBQZGZHZW5lcmF0b3IpO1xuIl19