@coolwallet/xrp
Version:
Coolwallet Ripple App
471 lines (368 loc) • 37.9 kB
JavaScript
;
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=