UNPKG

@coolwallet/xrp

Version:
471 lines (368 loc) 37.9 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); } Object.defineProperty(exports, "__esModule", { value: true }); exports.signIouTransfer = exports.signTrustSet = exports.signMessage = exports.signPayment = void 0; var _core = require("@coolwallet/core"); var scriptUtil = _interopRequireWildcard(require("./utils/scriptUtil")); var txUtil = _interopRequireWildcard(require("./utils/tracsactionUtil")); var params = _interopRequireWildcard(require("./config/params")); var _type = require("@coolwallet/core/lib/transaction/type"); var _tokenType = require("./config/tokenType"); var _stringUtil = require("./utils/stringUtil"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } var signPayment = /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(signTxData, payment) { var transport, addressIndex, appId, appPrivateKey, confirmCB, authorizedCB, useNewScript, script, argument, preActions, sendScript, sendArgument, signature; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: transport = signTxData.transport, addressIndex = signTxData.addressIndex, appId = signTxData.appId, appPrivateKey = signTxData.appPrivateKey, confirmCB = signTxData.confirmCB, authorizedCB = signTxData.authorizedCB; // Use the new script when memo exists, or flags/destination tag is missing. useNewScript = Boolean(payment.Memos) || payment.Flags === undefined || payment.DestinationTag === undefined; script = params.getScript(useNewScript); _context3.next = 5; return scriptUtil.getPaymentArgument(addressIndex, payment, useNewScript); case 5: argument = _context3.sent; preActions = []; sendScript = /*#__PURE__*/function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return _core.tx.command.sendScript(transport, script); case 2: case "end": return _context.stop(); } } }, _callee); })); return function sendScript() { return _ref2.apply(this, arguments); }; }(); preActions.push(sendScript); sendArgument = /*#__PURE__*/function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: return _context2.abrupt("return", _core.tx.command.executeScript(transport, appId, appPrivateKey, argument)); case 1: case "end": return _context2.stop(); } } }, _callee2); })); return function sendArgument() { return _ref3.apply(this, arguments); }; }(); _context3.next = 12; return _core.tx.flow.getSingleSignatureFromCoolWalletV2(transport, preActions, sendArgument, _type.SignatureType.DER, confirmCB, authorizedCB); case 12: signature = _context3.sent; return _context3.abrupt("return", txUtil.generateRawTx(signature.toString('hex'), payment)); case 14: case "end": return _context3.stop(); } } }, _callee3); })); return function signPayment(_x, _x2) { return _ref.apply(this, arguments); }; }(); exports.signPayment = signPayment; var signMessage = /*#__PURE__*/function () { var _ref4 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(signMsgData) { var transport, appPrivateKey, appId, addressIndex, message, confirmCB, authorizedCB, script, argument, preActions, sendScript, sendArgument, signature; return regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: transport = signMsgData.transport, appPrivateKey = signMsgData.appPrivateKey, appId = signMsgData.appId, addressIndex = signMsgData.addressIndex, message = signMsgData.message, confirmCB = signMsgData.confirmCB, authorizedCB = signMsgData.authorizedCB; // Use the new script when memo exists, or flags/destination tag is missing. script = params.MESSAGE.script + params.MESSAGE.signature; _context6.next = 4; return scriptUtil.getMessageArgument(addressIndex, message); case 4: argument = _context6.sent; preActions = []; sendScript = /*#__PURE__*/function () { var _ref5 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() { return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return _core.tx.command.sendScript(transport, script); case 2: case "end": return _context4.stop(); } } }, _callee4); })); return function sendScript() { return _ref5.apply(this, arguments); }; }(); preActions.push(sendScript); sendArgument = /*#__PURE__*/function () { var _ref6 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() { return regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: return _context5.abrupt("return", _core.tx.command.executeScript(transport, appId, appPrivateKey, argument)); case 1: case "end": return _context5.stop(); } } }, _callee5); })); return function sendArgument() { return _ref6.apply(this, arguments); }; }(); _context6.next = 11; return _core.tx.flow.getSingleSignatureFromCoolWalletV2(transport, preActions, sendArgument, _type.SignatureType.DER, confirmCB, authorizedCB); case 11: signature = _context6.sent; return _context6.abrupt("return", signature.toString('hex').toUpperCase()); case 13: case "end": return _context6.stop(); } } }, _callee6); })); return function signMessage(_x3) { return _ref4.apply(this, arguments); }; }(); exports.signMessage = signMessage; var signTrustSet = /*#__PURE__*/function () { var _ref7 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee9(signTxData, tokenPayment) { var transport, appPrivateKey, appId, addressIndex, confirmCB, authorizedCB, token, isRLUSD, _iterator, _step, tokenInfo, _parseIouToken, code, issuer, script, argument, preActions, sendScript, sendArgument, signature; return regeneratorRuntime.wrap(function _callee9$(_context9) { while (1) { switch (_context9.prev = _context9.next) { case 0: transport = signTxData.transport, appPrivateKey = signTxData.appPrivateKey, appId = signTxData.appId, addressIndex = signTxData.addressIndex, confirmCB = signTxData.confirmCB, authorizedCB = signTxData.authorizedCB; token = tokenPayment.Token; isRLUSD = false; _iterator = _createForOfIteratorHelper(_tokenType.TOKENTYPE); _context9.prev = 4; _iterator.s(); case 6: if ((_step = _iterator.n()).done) { _context9.next = 14; break; } tokenInfo = _step.value; _parseIouToken = (0, _stringUtil.parseIouToken)(tokenInfo.contractAddress), code = _parseIouToken.code, issuer = _parseIouToken.issuer; if (!(code.toLowerCase() === token.code.toLowerCase() && tokenInfo.symbol === token.name && issuer === token.issuer)) { _context9.next = 12; break; } isRLUSD = true; return _context9.abrupt("break", 14); case 12: _context9.next = 6; break; case 14: _context9.next = 19; break; case 16: _context9.prev = 16; _context9.t0 = _context9["catch"](4); _iterator.e(_context9.t0); case 19: _context9.prev = 19; _iterator.f(); return _context9.finish(19); case 22: if (isRLUSD) { script = params.TRUST_SET_RLUSD.script + params.TRUST_SET_RLUSD.signature; } else { script = params.TRUST_SET.script + params.TRUST_SET.signature; } _context9.next = 25; return scriptUtil.getTrustSetArgument(addressIndex, tokenPayment, isRLUSD); case 25: argument = _context9.sent; preActions = []; sendScript = /*#__PURE__*/function () { var _ref8 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee7() { return regeneratorRuntime.wrap(function _callee7$(_context7) { while (1) { switch (_context7.prev = _context7.next) { case 0: _context7.next = 2; return _core.tx.command.sendScript(transport, script); case 2: case "end": return _context7.stop(); } } }, _callee7); })); return function sendScript() { return _ref8.apply(this, arguments); }; }(); preActions.push(sendScript); sendArgument = /*#__PURE__*/function () { var _ref9 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee8() { return regeneratorRuntime.wrap(function _callee8$(_context8) { while (1) { switch (_context8.prev = _context8.next) { case 0: return _context8.abrupt("return", _core.tx.command.executeScript(transport, appId, appPrivateKey, argument)); case 1: case "end": return _context8.stop(); } } }, _callee8); })); return function sendArgument() { return _ref9.apply(this, arguments); }; }(); _context9.next = 32; return _core.tx.flow.getSingleSignatureFromCoolWalletV2(transport, preActions, sendArgument, _type.SignatureType.DER, confirmCB, authorizedCB); case 32: signature = _context9.sent; return _context9.abrupt("return", txUtil.generateTrustSetRawTx(signature.toString('hex'), tokenPayment)); case 34: case "end": return _context9.stop(); } } }, _callee9, null, [[4, 16, 19, 22]]); })); return function signTrustSet(_x4, _x5) { return _ref7.apply(this, arguments); }; }(); exports.signTrustSet = signTrustSet; var signIouTransfer = /*#__PURE__*/function () { var _ref10 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee12(signTxData) { var transport, appPrivateKey, appId, iouPayment, addressIndex, confirmCB, authorizedCB, token, isRLUSD, _iterator2, _step2, tokenInfo, _parseIouToken2, code, issuer, script, argument, preActions, sendScript, sendArgument, signature; return regeneratorRuntime.wrap(function _callee12$(_context12) { while (1) { switch (_context12.prev = _context12.next) { case 0: transport = signTxData.transport, appPrivateKey = signTxData.appPrivateKey, appId = signTxData.appId, iouPayment = signTxData.iouPayment, addressIndex = signTxData.addressIndex, confirmCB = signTxData.confirmCB, authorizedCB = signTxData.authorizedCB; token = iouPayment.Token; isRLUSD = false; _iterator2 = _createForOfIteratorHelper(_tokenType.TOKENTYPE); _context12.prev = 4; _iterator2.s(); case 6: if ((_step2 = _iterator2.n()).done) { _context12.next = 14; break; } tokenInfo = _step2.value; _parseIouToken2 = (0, _stringUtil.parseIouToken)(tokenInfo.contractAddress), code = _parseIouToken2.code, issuer = _parseIouToken2.issuer; if (!(code.toLowerCase() === token.code.toLowerCase() && tokenInfo.symbol === token.name && issuer === token.issuer)) { _context12.next = 12; break; } isRLUSD = true; return _context12.abrupt("break", 14); case 12: _context12.next = 6; break; case 14: _context12.next = 19; break; case 16: _context12.prev = 16; _context12.t0 = _context12["catch"](4); _iterator2.e(_context12.t0); case 19: _context12.prev = 19; _iterator2.f(); return _context12.finish(19); case 22: script = params.getIouTransferScript(isRLUSD); _context12.next = 25; return scriptUtil.getIouTransferArgument(addressIndex, iouPayment, isRLUSD); case 25: argument = _context12.sent; preActions = []; sendScript = /*#__PURE__*/function () { var _ref11 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee10() { return regeneratorRuntime.wrap(function _callee10$(_context10) { while (1) { switch (_context10.prev = _context10.next) { case 0: _context10.next = 2; return _core.tx.command.sendScript(transport, script); case 2: case "end": return _context10.stop(); } } }, _callee10); })); return function sendScript() { return _ref11.apply(this, arguments); }; }(); preActions.push(sendScript); sendArgument = /*#__PURE__*/function () { var _ref12 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee11() { return regeneratorRuntime.wrap(function _callee11$(_context11) { while (1) { switch (_context11.prev = _context11.next) { case 0: return _context11.abrupt("return", _core.tx.command.executeScript(transport, appId, appPrivateKey, argument)); case 1: case "end": return _context11.stop(); } } }, _callee11); })); return function sendArgument() { return _ref12.apply(this, arguments); }; }(); _context12.next = 32; return _core.tx.flow.getSingleSignatureFromCoolWalletV2(transport, preActions, sendArgument, _type.SignatureType.DER, confirmCB, authorizedCB); case 32: signature = _context12.sent; return _context12.abrupt("return", txUtil.generateIouTransferRawTx(signature.toString('hex'), iouPayment)); case 34: case "end": return _context12.stop(); } } }, _callee12, null, [[4, 16, 19, 22]]); })); return function signIouTransfer(_x6) { return _ref10.apply(this, arguments); }; }(); exports.signIouTransfer = signIouTransfer; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9zaWduLnRzIl0sIm5hbWVzIjpbInNpZ25QYXltZW50Iiwic2lnblR4RGF0YSIsInBheW1lbnQiLCJ0cmFuc3BvcnQiLCJhZGRyZXNzSW5kZXgiLCJhcHBJZCIsImFwcFByaXZhdGVLZXkiLCJjb25maXJtQ0IiLCJhdXRob3JpemVkQ0IiLCJ1c2VOZXdTY3JpcHQiLCJCb29sZWFuIiwiTWVtb3MiLCJGbGFncyIsInVuZGVmaW5lZCIsIkRlc3RpbmF0aW9uVGFnIiwic2NyaXB0IiwicGFyYW1zIiwiZ2V0U2NyaXB0Iiwic2NyaXB0VXRpbCIsImdldFBheW1lbnRBcmd1bWVudCIsImFyZ3VtZW50IiwicHJlQWN0aW9ucyIsInNlbmRTY3JpcHQiLCJ0eCIsImNvbW1hbmQiLCJwdXNoIiwic2VuZEFyZ3VtZW50IiwiZXhlY3V0ZVNjcmlwdCIsImZsb3ciLCJnZXRTaW5nbGVTaWduYXR1cmVGcm9tQ29vbFdhbGxldFYyIiwiU2lnbmF0dXJlVHlwZSIsIkRFUiIsInNpZ25hdHVyZSIsInR4VXRpbCIsImdlbmVyYXRlUmF3VHgiLCJ0b1N0cmluZyIsInNpZ25NZXNzYWdlIiwic2lnbk1zZ0RhdGEiLCJtZXNzYWdlIiwiTUVTU0FHRSIsImdldE1lc3NhZ2VBcmd1bWVudCIsInRvVXBwZXJDYXNlIiwic2lnblRydXN0U2V0IiwidG9rZW5QYXltZW50IiwidG9rZW4iLCJUb2tlbiIsImlzUkxVU0QiLCJUT0tFTlRZUEUiLCJ0b2tlbkluZm8iLCJjb250cmFjdEFkZHJlc3MiLCJjb2RlIiwiaXNzdWVyIiwidG9Mb3dlckNhc2UiLCJzeW1ib2wiLCJuYW1lIiwiVFJVU1RfU0VUX1JMVVNEIiwiVFJVU1RfU0VUIiwiZ2V0VHJ1c3RTZXRBcmd1bWVudCIsImdlbmVyYXRlVHJ1c3RTZXRSYXdUeCIsInNpZ25Jb3VUcmFuc2ZlciIsImlvdVBheW1lbnQiLCJnZXRJb3VUcmFuc2ZlclNjcmlwdCIsImdldElvdVRyYW5zZmVyQXJndW1lbnQiLCJnZW5lcmF0ZUlvdVRy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M0MsRUFBMERjLFFBQTFELENBRFk7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFwQlE7O0FBQUEsOEJBb0J2Qk0sWUFwQnVCO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQUEsbUJBd0JMSCxTQUFHSyxJQUFILENBQVFDLGtDQUFSLENBQ3RCMUIsU0FEc0IsRUFFdEJrQixVQUZzQixFQUd0QkssWUFIc0IsRUFJdEJJLG9CQUFjQyxHQUpRLEVBS3RCeEIsU0FMc0IsRUFNdEJDLFlBTnNCLENBeEJLOztBQUFBO0FBd0J2QndCLFlBQUFBLFNBeEJ1QjtBQUFBLCtDQWlDdEJDLE1BQU0sQ0FBQzhCLHdCQUFQLENBQWdDL0IsU0FBUyxDQUFDRyxRQUFWLENBQW1CLEtBQW5CLENBQWhDLEVBQTJEeUIsVUFBM0QsQ0FqQ3NCOztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEdBQUg7O0FBQUEsa0JBQWZELGVBQWU7QUFBQTtBQUFBO0FBQUEsR0FBckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eCB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUnO1xuaW1wb3J0ICogYXMgc2NyaXB0VXRpbCBmcm9tICcuL3V0aWxzL3NjcmlwdFV0aWwnO1xuaW1wb3J0ICogYXMgdHhVdGlsIGZyb20gJy4vdXRpbHMvdHJhY3NhY3Rpb25VdGlsJztcbmltcG9ydCAqIGFzIHR5cGVzIGZyb20gJy4vY29uZmlnL3R5cGVzJztcbmltcG9ydCAqIGFzIHBhcmFtcyBmcm9tICcuL2NvbmZpZy9wYXJhbXMnO1xuaW1wb3J0IHsgU2lnbmF0dXJlVHlwZSB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUvbGliL3RyYW5zYWN0aW9uL3R5cGUnO1xuaW1wb3J0IHsgVE9LRU5UWVBFIH0gZnJvbSAnLi9jb25maWcvdG9rZW5UeXBlJztcbmltcG9ydCB7IHBhcnNlSW91VG9rZW4gfSBmcm9tICcuL3V0aWxzL3N0cmluZ1V0aWwnO1xuXG5leHBvcnQgY29uc3Qgc2lnblBheW1lbnQgPSBhc3luYyAoc2lnblR4RGF0YTogdHlwZXMuU2lnblR4VHlwZSwgcGF5bWVudDogdHlwZXMuUGF5bWVudCk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIGNvbnN0IHsgdHJhbnNwb3J0LCBhZGRyZXNzSW5kZXgsIGFwcElkLCBhcHBQcml2YXRlS2V5LCBjb25maXJtQ0IsIGF1dGhvcml6ZWRDQiB9ID0gc2lnblR4RGF0YTtcbiAgLy8gVXNlIHRoZSBuZXcgc2NyaXB0IHdoZW4gbWVtbyBleGlzdHMsIG9yIGZsYWdzL2Rlc3RpbmF0aW9uIHRhZyBpcyBtaXNzaW5nLlxuICBjb25zdCB1c2VOZXdTY3JpcHQgPSBCb29sZWFuKHBheW1lbnQuTWVtb3MpIHx8IHBheW1lbnQuRmxhZ3MgPT09IHVuZGVmaW5lZCB8fCBwYXltZW50LkRlc3RpbmF0aW9uVGFnID09PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHNjcmlwdCA9IHBhcmFtcy5nZXRTY3JpcHQodXNlTmV3U2NyaXB0KTtcbiAgY29uc3QgYXJndW1lbnQgPSBhd2FpdCBzY3JpcHRVdGlsLmdldFBheW1lbnRBcmd1bWVudChhZGRyZXNzSW5kZXgsIHBheW1lbnQsIHVzZU5ld1NjcmlwdCk7XG5cbiAgY29uc3QgcHJlQWN0aW9ucyA9IFtdO1xuICBjb25zdCBzZW5kU2NyaXB0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHR4LmNvbW1hbmQuc2VuZFNjcmlwdCh0cmFuc3BvcnQsIHNjcmlwdCk7XG4gIH07XG4gIHByZUFjdGlvbnMucHVzaChzZW5kU2NyaXB0KTtcblxuICBjb25zdCBzZW5kQXJndW1lbnQgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIHR4LmNvbW1hbmQuZXhlY3V0ZVNjcmlwdCh0cmFuc3BvcnQsIGFwcElkLCBhcHBQcml2YXRlS2V5LCBhcmd1bWVudCk7XG4gIH07XG5cbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdHguZmxvdy5nZXRTaW5nbGVTaWduYXR1cmVGcm9tQ29vbFdhbGxldFYyKFxuICAgIHRyYW5zcG9ydCxcbiAgICBwcmVBY3Rpb25zLFxuICAgIHNlbmRBcmd1bWVudCxcbiAgICBTaWduYXR1cmVUeXBlLkRFUixcbiAgICBjb25maXJtQ0IsXG4gICAgYXV0aG9yaXplZENCXG4gICk7XG4gIHJldHVybiB0eFV0aWwuZ2VuZXJhdGVSYXdUeChzaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLCBwYXltZW50KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduTWVzc2FnZSA9IGFzeW5jIChzaWduTXNnRGF0YTogdHlwZXMuU2lnbk1zZ1R5cGUpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IHRyYW5zcG9ydCwgYXBwUHJpdmF0ZUtleSwgYXBwSWQsIGFkZHJlc3NJbmRleCwgbWVzc2FnZSwgY29uZmlybUNCLCBhdXRob3JpemVkQ0IgfSA9IHNpZ25Nc2dEYXRhO1xuICAvLyBVc2UgdGhlIG5ldyBzY3JpcHQgd2hlbiBtZW1vIGV4aXN0cywgb3IgZmxhZ3MvZGVzdGluYXRpb24gdGFnIGlzIG1pc3NpbmcuXG5cbiAgY29uc3Qgc2NyaXB0ID0gcGFyYW1zLk1FU1NBR0Uuc2NyaXB0ICsgcGFyYW1zLk1FU1NBR0Uuc2lnbmF0dXJlO1xuICBjb25zdCBhcmd1bWVudCA9IGF3YWl0IHNjcmlwdFV0aWwuZ2V0TWVzc2FnZUFyZ3VtZW50KGFkZHJlc3NJbmRleCwgbWVzc2FnZSk7XG5cbiAgY29uc3QgcHJlQWN0aW9ucyA9IFtdO1xuICBjb25zdCBzZW5kU2NyaXB0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHR4LmNvbW1hbmQuc2VuZFNjcmlwdCh0cmFuc3BvcnQsIHNjcmlwdCk7XG4gIH07XG4gIHByZUFjdGlvbnMucHVzaChzZW5kU2NyaXB0KTtcblxuICBjb25zdCBzZW5kQXJndW1lbnQgPSBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIHR4LmNvbW1hbmQuZXhlY3V0ZVNjcmlwdCh0cmFuc3BvcnQsIGFwcElkLCBhcHBQcml2YXRlS2V5LCBhcmd1bWVudCk7XG4gIH07XG5cbiAgY29uc3Qgc2lnbmF0dXJlID0gYXdhaXQgdHguZmxvdy5nZXRTaW5nbGVTaWduYXR1cmVGcm9tQ29vbFdhbGxldFYyKFxuICAgIHRyYW5zcG9ydCxcbiAgICBwcmVBY3Rpb25zLFxuICAgIHNlbmRBcmd1bWVudCxcbiAgICBTaWduYXR1cmVUeXBlLkRFUixcbiAgICBjb25maXJtQ0IsXG4gICAgYXV0aG9yaXplZENCXG4gICk7XG5cbiAgcmV0dXJuIHNpZ25hdHVyZS50b1N0cmluZygnaGV4JykudG9VcHBlckNhc2UoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzaWduVHJ1c3RTZXQgPSBhc3luYyAoXG4gIHNpZ25UeERhdGE6IHR5cGVzLlNpZ25UcnVzdFNldFR5cGUsXG4gIHRva2VuUGF5bWVudDogdHlwZXMuVG9rZW5QYXltZW50XG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IHRyYW5zcG9ydCwgYXBwUHJpdmF0ZUtleSwgYXBwSWQsIGFkZHJlc3NJbmRleCwgY29uZmlybUNCLCBhdXRob3JpemVkQ0IgfSA9IHNpZ25UeERhdGE7XG4gIGNvbnN0IHsgVG9rZW46IHRva2VuIH0gPSB0b2tlblBheW1lbnQ7XG4gIGxldCBpc1JMVVNEID0gZmFsc2U7XG4gIGZvciAoY29uc3QgdG9rZW5JbmZvIG9mIFRPS0VOVFlQRSkge1xuICAgIGNvbnN0IHsgY29kZSwgaXNzdWVyIH0gPSBwYXJzZUlvdVRva2VuKHRva2VuSW5mby5jb250cmFjdEFkZHJlc3MpO1xuICAgIGlmIChjb2RlLnRvTG93ZXJDYXNlKCkgPT09IHRva2VuLmNvZGUudG9Mb3dlckNhc2UoKSAmJiB0b2tlbkluZm8uc3ltYm9sID09PSB0b2tlbi5uYW1lICYmIGlzc3VlciA9PT0gdG9rZW4uaXNzdWVyKSB7XG4gICAgICBpc1JMVVNEID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBsZXQgc2NyaXB0OiBzdHJpbmc7XG4gIGlmIChpc1JMVVNEKSB7XG4gICAgc2NyaXB0ID0gcGFyYW1zLlRSVVNUX1NFVF9STFVTRC5zY3JpcHQgKyBwYXJhbXMuVFJVU1RfU0VUX1JMVVNELnNpZ25hdHVyZTtcbiAgfSBlbHNlIHtcbiAgICBzY3JpcHQgPSBwYXJhbXMuVFJVU1RfU0VULnNjcmlwdCArIHBhcmFtcy5UUlVTVF9TRVQuc2lnbmF0dXJlO1xuICB9XG5cbiAgY29uc3QgYXJndW1lbnQgPSBhd2FpdCBzY3JpcHRVdGlsLmdldFRydXN0U2V0QXJndW1lbnQoYWRkcmVzc0luZGV4LCB0b2tlblBheW1lbnQsIGlzUkxVU0QpO1xuICBjb25zdCBwcmVBY3Rpb25zID0gW107XG4gIGNvbnN0IHNlbmRTY3JpcHQgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdHguY29tbWFuZC5zZW5kU2NyaXB0KHRyYW5zcG9ydCwgc2NyaXB0KTtcbiAgfTtcbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRTY3JpcHQpO1xuXG4gIGNvbnN0IHNlbmRBcmd1bWVudCA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gdHguY29tbWFuZC5leGVjdXRlU2NyaXB0KHRyYW5zcG9ydCwgYXBwSWQsIGFwcFByaXZhdGVLZXksIGFyZ3VtZW50KTtcbiAgfTtcblxuICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB0eC5mbG93LmdldFNpbmdsZVNpZ25hdHVyZUZyb21Db29sV2FsbGV0VjIoXG4gICAgdHJhbnNwb3J0LFxuICAgIHByZUFjdGlvbnMsXG4gICAgc2VuZEFyZ3VtZW50LFxuICAgIFNpZ25hdHVyZVR5cGUuREVSLFxuICAgIGNvbmZpcm1DQixcbiAgICBhdXRob3JpemVkQ0JcbiAgKTtcblxuICByZXR1cm4gdHhVdGlsLmdlbmVyYXRlVHJ1c3RTZXRSYXdUeChzaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLCB0b2tlblBheW1lbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IHNpZ25Jb3VUcmFuc2ZlciA9IGFzeW5jIChzaWduVHhEYXRhOiB0eXBlcy5TaWduSW91VHJhbnNmZXJUeXBlKTogUHJvbWlzZTxzdHJpbmc+ID0+IHtcbiAgY29uc3QgeyB0cmFuc3BvcnQsIGFwcFByaXZhdGVLZXksIGFwcElkLCBpb3VQYXltZW50LCBhZGRyZXNzSW5kZXgsIGNvbmZpcm1DQiwgYXV0aG9yaXplZENCIH0gPSBzaWduVHhEYXRhO1xuICBjb25zdCB7IFRva2VuOiB0b2tlbiB9ID0gaW91UGF5bWVudDtcbiAgbGV0IGlzUkxVU0QgPSBmYWxzZTtcbiAgZm9yIChjb25zdCB0b2tlbkluZm8gb2YgVE9LRU5UWVBFKSB7XG4gICAgY29uc3QgeyBjb2RlLCBpc3N1ZXIgfSA9IHBhcnNlSW91VG9rZW4odG9rZW5JbmZvLmNvbnRyYWN0QWRkcmVzcyk7XG4gICAgaWYgKGNvZGUudG9Mb3dlckNhc2UoKSA9PT0gdG9rZW4uY29kZS50b0xvd2VyQ2FzZSgpICYmIHRva2VuSW5mby5zeW1ib2wgPT09IHRva2VuLm5hbWUgJiYgaXNzdWVyID09PSB0b2tlbi5pc3N1ZXIpIHtcbiAgICAgIGlzUkxVU0QgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGNvbnN0IHNjcmlwdCA9IHBhcmFtcy5nZXRJb3VUcmFuc2ZlclNjcmlwdChpc1JMVVNEKTtcbiAgY29uc3QgYXJndW1lbnQgPSBhd2FpdCBzY3JpcHRVdGlsLmdldElvdVRyYW5zZmVyQXJndW1lbnQoYWRkcmVzc0luZGV4LCBpb3VQYXltZW50LCBpc1JMVVNEKTtcblxuICBjb25zdCBwcmVBY3Rpb25zID0gW107XG4gIGNvbnN0IHNlbmRTY3JpcHQgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdHguY29tbWFuZC5zZW5kU2NyaXB0KHRyYW5zcG9ydCwgc2NyaXB0KTtcbiAgfTtcbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRTY3JpcHQpO1xuXG4gIGNvbnN0IHNlbmRBcmd1bWVudCA9IGFzeW5jICgpID0+IHtcbiAgICByZXR1cm4gdHguY29tbWFuZC5leGVjdXRlU2NyaXB0KHRyYW5zcG9ydCwgYXBwSWQsIGFwcFByaXZhdGVLZXksIGFyZ3VtZW50KTtcbiAgfTtcblxuICBjb25zdCBzaWduYXR1cmUgPSBhd2FpdCB0eC5mbG93LmdldFNpbmdsZVNpZ25hdHVyZUZyb21Db29sV2FsbGV0VjIoXG4gICAgdHJhbnNwb3J0LFxuICAgIHByZUFjdGlvbnMsXG4gICAgc2VuZEFyZ3VtZW50LFxuICAgIFNpZ25hdHVyZVR5cGUuREVSLFxuICAgIGNvbmZpcm1DQixcbiAgICBhdXRob3JpemVkQ0JcbiAgKTtcblxuICByZXR1cm4gdHhVdGlsLmdlbmVyYXRlSW91VHJhbnNmZXJSYXdUeChzaWduYXR1cmUudG9TdHJpbmcoJ2hleCcpLCBpb3VQYXltZW50KTtcbn07XG4iXX0=