UNPKG

@coolwallet/ltc

Version:
307 lines (251 loc) 30.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.getArgument = getArgument; exports.getScriptSigningActions = getScriptSigningActions; var _core = require("@coolwallet/core"); var params = _interopRequireWildcard(require("../config/params")); var cryptoUtil = _interopRequireWildcard(require("./cryptoUtil")); var txUtil = _interopRequireWildcard(require("./transactionUtil")); var bufferUtil = _interopRequireWildcard(require("./bufferUtil")); var types = _interopRequireWildcard(require("../config/types")); 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 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); }); }; } function getArgument(_x, _x2, _x3, _x4) { return _getArgument.apply(this, arguments); } function _getArgument() { _getArgument = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(scriptType, inputs, output, change) { var _txUtil$addressToOutS, outputType, outputScript, outputHash, outputScriptType, outputHashBuf, outputAmount, haveChange, changeScriptType, changeAmount, changePath, prevouts, hashPrevouts, sequences, hashSequence, address, Maddress; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _txUtil$addressToOutS = txUtil.addressToOutScript(output.address), outputType = _txUtil$addressToOutS.scriptType, outputScript = _txUtil$addressToOutS.outScript, outputHash = _txUtil$addressToOutS.outHash; if (outputHash) { _context.next = 3; break; } throw new _core.error.SDKError(getArgument.name, "OutputHash Undefined"); case 3: if (!(outputType == types.ScriptType.P2PKH)) { _context.next = 8; break; } outputScriptType = bufferUtil.toUintBuffer(0, 1); outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex'); _context.next = 19; break; case 8: if (!(outputType == types.ScriptType.P2SH_P2WPKH)) { _context.next = 13; break; } outputScriptType = bufferUtil.toUintBuffer(1, 1); outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex'); _context.next = 19; break; case 13: if (!(outputType == types.ScriptType.P2WPKH)) { _context.next = 18; break; } outputScriptType = bufferUtil.toUintBuffer(2, 1); outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex'); _context.next = 19; break; case 18: throw new _core.error.SDKError(getArgument.name, "Unsupport ScriptType : ".concat(outputType)); case 19: outputAmount = bufferUtil.toNonReverseUintBuffer(output.value, 8); //[haveChange(1B)] [changeScriptType(1B)] [changeAmount(8B)] [changePath(21B)] if (!change) { _context.next = 33; break; } if (change.pubkeyBuf) { _context.next = 23; break; } throw new _core.error.SDKError(getArgument.name, 'Public Key not exists !!'); case 23: haveChange = bufferUtil.toUintBuffer(1, 1); changeScriptType = bufferUtil.toUintBuffer(scriptType, 1); changeAmount = bufferUtil.toNonReverseUintBuffer(change.value, 8); _context.t0 = Buffer; _context.next = 29; return _core.utils.getPath(params.COIN_TYPE, change.addressIndex); case 29: _context.t1 = _context.sent; changePath = _context.t0.from.call(_context.t0, _context.t1, 'hex'); _context.next = 37; break; case 33: haveChange = Buffer.from('00', 'hex'); changeScriptType = Buffer.from('00', 'hex'); changeAmount = bufferUtil.toUintBuffer(0, 8); //)Buffer.from('0000000000000000', 'hex'); changePath = bufferUtil.toUintBuffer(0, 21); //Buffer.from('000000000000000000000000000000000000000000', 'hex'); case 37: prevouts = inputs.map(function (input) { return Buffer.concat([Buffer.from(input.preTxHash, 'hex').reverse(), bufferUtil.toUintBuffer(input.preIndex, 4)]); }); hashPrevouts = cryptoUtil.hash256(Buffer.concat(prevouts)); sequences = inputs.map(function (input) { return Buffer.concat([input.sequence ? bufferUtil.toUintBuffer(input.sequence, 4) : Buffer.from('ffffffff', 'hex') //Buffer.from(input.sequence, 'hex').reverse(), // toUintBuffer(input.preIndex, 4) ]); }); hashSequence = cryptoUtil.hash256(Buffer.concat(sequences)); address = output.address; if (address.startsWith('M')) { Maddress = Buffer.from('01', 'hex'); } else { Maddress = Buffer.from('00', 'hex'); } return _context.abrupt("return", Buffer.concat([outputScriptType, outputAmount, outputHashBuf, haveChange, changeScriptType, changeAmount, changePath, hashPrevouts, hashSequence, Maddress]).toString('hex')); case 44: case "end": return _context.stop(); } } }, _callee); })); return _getArgument.apply(this, arguments); } ; function getScriptSigningActions(_x5, _x6, _x7, _x8, _x9, _x10, _x11, _x12, _x13) { return _getScriptSigningActions.apply(this, arguments); } function _getScriptSigningActions() { _getScriptSigningActions = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6(transport, scriptType, appId, appPrivateKey, inputs, preparedData, output, change, coinType) { var script, argument, preActions, sendScript, sendArgument, utxoArguments, actions; return regeneratorRuntime.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: script = params.TRANSFER.script + params.TRANSFER.signature; _context6.next = 3; return getArgument(scriptType, inputs, output, change); case 3: _context6.t0 = _context6.sent; argument = "00" + _context6.t0; // keylength zero preActions = []; sendScript = /*#__PURE__*/function () { var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return _core.tx.command.sendScript(transport, script); case 2: case "end": return _context2.stop(); } } }, _callee2); })); return function sendScript() { return _ref.apply(this, arguments); }; }(); preActions.push(sendScript); sendArgument = /*#__PURE__*/function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() { return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return _core.tx.command.executeScript(transport, appId, appPrivateKey, argument); case 2: case "end": return _context3.stop(); } } }, _callee3); })); return function sendArgument() { return _ref2.apply(this, arguments); }; }(); preActions.push(sendArgument); utxoArguments = preparedData.preparedInputs.map( /*#__PURE__*/function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4(preparedInput) { var SEPath, outPoint, inputScriptType, inputAmount, inputHash; return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.t0 = Buffer; _context4.t1 = "15"; _context4.next = 4; return _core.utils.getPath(params.COIN_TYPE, preparedInput.addressIndex); case 4: _context4.t2 = _context4.sent; _context4.t3 = _context4.t1.concat.call(_context4.t1, _context4.t2); SEPath = _context4.t0.from.call(_context4.t0, _context4.t3, 'hex'); outPoint = preparedInput.preOutPointBuf; // let inputScriptType; // if ((scriptType == ScriptType.P2PKH) || (scriptType == ScriptType.P2WPKH) || (scriptType == ScriptType.P2SH_P2WPKH)) { // inputScriptType = toVarUintBuffer(0); // } else {//(scriptType == ScriptType.P2WSH) // inputScriptType = toVarUintBuffer(1); // } inputScriptType = bufferUtil.toUintBuffer(0, 1); inputAmount = preparedInput.preValueBuf.reverse(); inputHash = cryptoUtil.hash160(preparedInput.pubkeyBuf); return _context4.abrupt("return", Buffer.concat([SEPath, outPoint, inputScriptType, inputAmount, inputHash]).toString('hex')); case 12: case "end": return _context4.stop(); } } }, _callee4); })); return function (_x14) { return _ref3.apply(this, arguments); }; }()); actions = utxoArguments.map(function (utxoArgument) { return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() { return regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.t0 = _core.tx.command; _context5.t1 = transport; _context5.t2 = appId; _context5.t3 = appPrivateKey; _context5.next = 6; return utxoArgument; case 6: _context5.t4 = _context5.sent; _context5.t5 = scriptType === types.ScriptType.P2PKH ? "10" : "11"; return _context5.abrupt("return", _context5.t0.executeUtxoScript.call(_context5.t0, _context5.t1, _context5.t2, _context5.t3, _context5.t4, _context5.t5)); case 9: case "end": return _context5.stop(); } } }, _callee5); })); }); return _context6.abrupt("return", { preActions: preActions, actions: actions }); case 13: case "end": return _context6.stop(); } } }, _callee6); })); return _getScriptSigningActions.apply(this, arguments); } ; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zY3JpcHRVdGlsLnRzIl0sIm5hbWVzIjpbImdldEFyZ3VtZW50Iiwic2NyaXB0VHlwZSIsImlucHV0cyIsIm91dHB1dCIsImNoYW5nZSIsInR4VXRpbCIsImFkZHJlc3NUb091dFNjcmlwdCIsImFkZHJlc3MiLCJvdXRwdXRUeXBlIiwib3V0cHV0U2NyaXB0Iiwib3V0U2NyaXB0Iiwib3V0cHV0SGFzaCIsIm91dEhhc2giLCJlcnJvciIsIlNES0Vycm9yIiwibmFtZSIsInR5cGVzIiwiU2NyaXB0VHlwZSIsIlAyUEtIIiwib3V0cHV0U2NyaXB0VHlwZSIsImJ1ZmZlclV0aWwiLCJ0b1VpbnRCdWZmZXIiLCJvdXRwdXRIYXNoQnVmIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwiUDJTSF9QMldQS0giLCJQMldQS0giLCJvdXRwdXRBbW91bnQiLCJ0b05vblJldmVyc2VVaW50QnVmZmVyIiwidmFsdWUiLCJwdWJrZXlCdWYiLCJoYXZlQ2hhbmdlIiwiY2hhbmdlU2NyaXB0VHlwZSIsImNoYW5nZUFtb3VudCIsInV0aWxzIiwiZ2V0UGF0aCIsInBhcmFtcyIsIkNPSU5fVFlQRSIsImFkZHJlc3NJbmRleCIsImNoYW5nZVBhdGgiLCJwcmV2b3V0cyIsIm1hcCIsImlucHV0IiwiY29uY2F0IiwicHJlVHhIYXNoIiwicmV2ZXJzZSIsInByZUluZGV4IiwiaGFzaFByZXZvdXRzIiwiY3J5cHRvVXRpbCIsImhhc2gyNTYiLCJzZXF1ZW5jZXMiLCJzZXF1ZW5jZSIsImhhc2hTZXF1ZW5jZSIsInN0YXJ0c1dpdGgiLCJNYWRkcmVzcyIsImdldFNjcmlwdFNpZ25pbmdBY3Rpb25zIiwidHJhbnNwb3J0IiwiYXBwSWQiLCJhcHBQcml2YXRlS2V5IiwicHJlcGFyZWREYXRhIiwiY29pblR5cGUiLCJzY3JpcHQiLCJUUkFOU0ZFUiIsInNpZ25hdHVyZSIsImFyZ3VtZW50IiwicHJlQWN0aW9ucyIsInNlbmRTY3JpcHQiLCJ0eCIsImNvbW1hbmQiLCJwdXNoIiwic2VuZEFyZ3VtZW50IiwiZXhlY3V0ZVNjcmlwdCIsInV0eG9Bcmd1bWVudHMiLCJwcmVwYXJlZElucHV0cyIsInByZXBhcmVkSW5wdXQiLCJTRVBhdGgiLCJvdXRQb2ludCIsInByZU91dFBvaW50QnVmIiwiaW5wdXRTY3JpcHRUeXBlIiwiaW5wdXRBbW91bnQiLCJwcmVWYWx1ZUJ1ZiIsImlucHV0SGFzaCIsImhhc2gxNjAiLCJhY3Rpb25zIiwidXR4b0FyZ3VtZW50IiwiZXhlY3V0ZVV0eG9TY3JpcHQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7Ozs7Ozs7OztTQUlzQkEsVzs7Ozs7eUVBQWYsaUJBQ0xDLFVBREssRUFFTEMsTUFGSyxFQUdMQyxNQUhLLEVBSUxDLE1BSks7QUFBQTs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLG9DQVVEQyxNQUFNLENBQUNDLGtCQUFQLENBQTBCSCxNQUFNLENBQUNJLE9BQWpDLENBVkMsRUFPU0MsVUFQVCx5QkFPSFAsVUFQRyxFQVFRUSxZQVJSLHlCQVFIQyxTQVJHLEVBU01DLFVBVE4seUJBU0hDLE9BVEc7O0FBQUEsZ0JBV0FELFVBWEE7QUFBQTtBQUFBO0FBQUE7O0FBQUEsa0JBWUcsSUFBSUUsWUFBTUMsUUFBVixDQUFtQmQsV0FBVyxDQUFDZSxJQUEvQix5QkFaSDs7QUFBQTtBQUFBLGtCQWlCRFAsVUFBVSxJQUFJUSxLQUFLLENBQUNDLFVBQU4sQ0FBaUJDLEtBakI5QjtBQUFBO0FBQUE7QUFBQTs7QUFrQkhDLFlBQUFBLGdCQUFnQixHQUFHQyxVQUFVLENBQUNDLFlBQVgsQ0FBd0IsQ0FBeEIsRUFBMkIsQ0FBM0IsQ0FBbkI7QUFDQUMsWUFBQUEsYUFBYSxHQUFHQyxNQUFNLENBQUNDLElBQVAsbUNBQXVDYixVQUFVLENBQUNjLFFBQVgsQ0FBb0IsS0FBcEIsQ0FBdkMsR0FBcUUsS0FBckUsQ0FBaEI7QUFuQkc7QUFBQTs7QUFBQTtBQUFBLGtCQW9CTWpCLFVBQVUs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cURXWCxhQUFhLENBQUMvQixHQUFkLENBQ2QsVUFBQzJDLFlBQUQ7QUFBQSwwRkFBa0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLHVDQUNUakIsU0FBR0MsT0FETTtBQUFBLHVDQUNvQlosU0FEcEI7QUFBQSx1Q0FDK0JDLEtBRC9CO0FBQUEsdUNBQ3NDQyxhQUR0QztBQUFBO0FBQUEsK0JBQzJEMEIsWUFEM0Q7O0FBQUE7QUFBQTtBQUFBLHVDQUMwRXBGLFVBQVUsS0FBS2UsS0FBSyxDQUFDQyxVQUFOLENBQWlCQyxLQUFqQyxHQUEwQyxJQUExQyxHQUFpRCxJQUQxSDtBQUFBLHVFQUNFb0UsaUJBREY7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsZUFBbEI7QUFBQSxhQURjLENBckRYO0FBQUEsOENBeURFO0FBQUVwQixjQUFBQSxVQUFVLEVBQVZBLFVBQUY7QUFBY2tCLGNBQUFBLE9BQU8sRUFBUEE7QUFBZCxhQXpERjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHOzs7O0FBMEROIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXJyb3IsIHV0aWxzLCB0eCB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUnO1xuaW1wb3J0ICogYXMgcGFyYW1zIGZyb20gXCIuLi9jb25maWcvcGFyYW1zXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG9VdGlsIGZyb20gXCIuL2NyeXB0b1V0aWxcIjtcbmltcG9ydCAqIGFzIHR4VXRpbCBmcm9tIFwiLi90cmFuc2FjdGlvblV0aWxcIjtcbmltcG9ydCAqIGFzIGJ1ZmZlclV0aWwgZnJvbSBcIi4vYnVmZmVyVXRpbFwiO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcblxuXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRBcmd1bWVudChcbiAgc2NyaXB0VHlwZTogdHlwZXMuU2NyaXB0VHlwZSxcbiAgaW5wdXRzOiBBcnJheTx0eXBlcy5JbnB1dD4sXG4gIG91dHB1dDogdHlwZXMuT3V0cHV0LFxuICBjaGFuZ2U/OiB0eXBlcy5DaGFuZ2UsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB7XG4gICAgc2NyaXB0VHlwZTogb3V0cHV0VHlwZSxcbiAgICBvdXRTY3JpcHQ6IG91dHB1dFNjcmlwdCxcbiAgICBvdXRIYXNoOiBvdXRwdXRIYXNoXG4gIH0gPSB0eFV0aWwuYWRkcmVzc1RvT3V0U2NyaXB0KG91dHB1dC5hZGRyZXNzKTtcbiAgaWYgKCFvdXRwdXRIYXNoKSB7XG4gICAgdGhyb3cgbmV3IGVycm9yLlNES0Vycm9yKGdldEFyZ3VtZW50Lm5hbWUsIGBPdXRwdXRIYXNoIFVuZGVmaW5lZGApO1xuICB9XG4gIGxldCBvdXRwdXRTY3JpcHRUeXBlO1xuICBsZXQgb3V0cHV0SGFzaEJ1ZjtcblxuICBpZiAob3V0cHV0VHlwZSA9PSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIKSB7XG4gICAgb3V0cHV0U2NyaXB0VHlwZSA9IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKDAsIDEpO1xuICAgIG91dHB1dEhhc2hCdWYgPSBCdWZmZXIuZnJvbShgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtvdXRwdXRIYXNoLnRvU3RyaW5nKCdoZXgnKX1gLCAnaGV4Jyk7XG4gIH0gZWxzZSBpZiAob3V0cHV0VHlwZSA9PSB0eXBlcy5TY3JpcHRUeXBlLlAyU0hfUDJXUEtIKSB7XG4gICAgb3V0cHV0U2NyaXB0VHlwZSA9IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKDEsIDEpO1xuICAgIG91dHB1dEhhc2hCdWYgPSBCdWZmZXIuZnJvbShgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJHtvdXRwdXRIYXNoLnRvU3RyaW5nKCdoZXgnKX1gLCAnaGV4Jyk7XG4gIH0gZWxzZSBpZiAob3V0cHV0VHlwZSA9PSB0eXBlcy5TY3JpcHRUeXBlLlAyV1BLSCkge1xuICAgIG91dHB1dFNjcmlwdFR5cGUgPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcigyLCAxKTtcbiAgICBvdXRwdXRIYXNoQnVmID0gQnVmZmVyLmZyb20oYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7b3V0cHV0SGFzaC50b1N0cmluZygnaGV4Jyl9YCwgJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBlcnJvci5TREtFcnJvcihnZXRBcmd1bWVudC5uYW1lLCBgVW5zdXBwb3J0IFNjcmlwdFR5cGUgOiAke291dHB1dFR5cGV9YCk7XG4gIH1cbiAgY29uc3Qgb3V0cHV0QW1vdW50ID0gYnVmZmVyVXRpbC50b05vblJldmVyc2VVaW50QnVmZmVyKG91dHB1dC52YWx1ZSwgOCk7XG4gIC8vW2hhdmVDaGFuZ2UoMUIpXSBbY2hhbmdlU2NyaXB0VHlwZSgxQildIFtjaGFuZ2VBbW91bnQoOEIpXSBbY2hhbmdlUGF0aCgyMUIpXVxuICBsZXQgaGF2ZUNoYW5nZTtcbiAgbGV0IGNoYW5nZVNjcmlwdFR5cGU7XG4gIGxldCBjaGFuZ2VBbW91bnQ7XG4gIGxldCBjaGFuZ2VQYXRoO1xuICBpZiAoY2hhbmdlKSB7XG4gICAgaWYgKCFjaGFuZ2UucHVia2V5QnVmKSB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IoZ2V0QXJndW1lbnQubmFtZSwgJ1B1YmxpYyBLZXkgbm90IGV4aXN0cyAhIScpO1xuICAgIGhhdmVDaGFuZ2UgPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcigxLCAxKTtcbiAgICBjaGFuZ2VTY3JpcHRUeXBlID0gYnVmZmVyVXRpbC50b1VpbnRCdWZmZXIoc2NyaXB0VHlwZSwgMSk7XG5cbiAgICBjaGFuZ2VBbW91bnQgPSBidWZmZXJVdGlsLnRvTm9uUmV2ZXJzZVVpbnRCdWZmZXIoY2hhbmdlLnZhbHVlLCA4KTtcbiAgICBjaGFuZ2VQYXRoID0gQnVmZmVyLmZyb20oYXdhaXQgdXRpbHMuZ2V0UGF0aChwYXJhbXMuQ09JTl9UWVBFLCBjaGFuZ2UuYWRkcmVzc0luZGV4KSwgJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIGhhdmVDaGFuZ2UgPSBCdWZmZXIuZnJvbSgnMDAnLCAnaGV4Jyk7XG4gICAgY2hhbmdlU2NyaXB0VHlwZSA9IEJ1ZmZlci5mcm9tKCcwMCcsICdoZXgnKTtcbiAgICBjaGFuZ2VBbW91bnQgPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcigwLCA4KS8vKUJ1ZmZlci5mcm9tKCcwMDAwMDAwMDAwMDAwMDAwJywgJ2hleCcpO1xuICAgIGNoYW5nZVBhdGggPSBidWZmZXJVdGlsLnRvVWludEJ1ZmZlcigwLCAyMSkvL0J1ZmZlci5mcm9tKCcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCAnaGV4Jyk7XG4gIH1cbiAgY29uc3QgcHJldm91dHMgPSBpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbQnVmZmVyLmZyb20oaW5wdXQucHJlVHhIYXNoLCAnaGV4JykucmV2ZXJzZSgpLFxuICAgICAgYnVmZmVyVXRpbC50b1VpbnRCdWZmZXIoaW5wdXQucHJlSW5kZXgsIDQpXSlcbiAgfSlcbiAgY29uc3QgaGFzaFByZXZvdXRzID0gY3J5cHRvVXRpbC5oYXNoMjU2KEJ1ZmZlci5jb25jYXQocHJldm91dHMpKTtcbiAgY29uc3Qgc2VxdWVuY2VzID0gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgKGlucHV0LnNlcXVlbmNlKSA/IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKGlucHV0LnNlcXVlbmNlLCA0KSA6IEJ1ZmZlci5mcm9tKCdmZmZmZmZmZicsICdoZXgnKSxcbiAgICAgIC8vQnVmZmVyLmZyb20oaW5wdXQuc2VxdWVuY2UsICdoZXgnKS5yZXZlcnNlKCksXG4gICAgICAvLyB0b1VpbnRCdWZmZXIoaW5wdXQucHJlSW5kZXgsIDQpXG4gICAgXSlcbiAgfSlcbiAgY29uc3QgaGFzaFNlcXVlbmNlID0gY3J5cHRvVXRpbC5oYXNoMjU2KEJ1ZmZlci5jb25jYXQoc2VxdWVuY2VzKSk7XG5cbiAgY29uc3QgYWRkcmVzcyA9IG91dHB1dC5hZGRyZXNzXG4gIGxldCBNYWRkcmVzcztcbiAgaWYgKGFkZHJlc3Muc3RhcnRzV2l0aCgnTScpKSB7XG4gICAgTWFkZHJlc3MgPSBCdWZmZXIuZnJvbSgnMDEnLCAnaGV4Jyk7XG4gIH0gZWxzZSB7XG4gICAgTWFkZHJlc3MgPSBCdWZmZXIuZnJvbSgnMDAnLCAnaGV4Jyk7XG4gIH1cblxuXG4gIHJldHVybiBCdWZmZXIuY29uY2F0KFtcbiAgICBvdXRwdXRTY3JpcHRUeXBlLFxuICAgIG91dHB1dEFtb3VudCxcbiAgICBvdXRwdXRIYXNoQnVmLFxuICAgIGhhdmVDaGFuZ2UsXG4gICAgY2hhbmdlU2NyaXB0VHlwZSxcbiAgICBjaGFuZ2VBbW91bnQsXG4gICAgY2hhbmdlUGF0aCxcbiAgICBoYXNoUHJldm91dHMsXG4gICAgaGFzaFNlcXVlbmNlLFxuICAgIE1hZGRyZXNzXG4gIF0pLnRvU3RyaW5nKCdoZXgnKTtcbn07XG5cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmlwdFNpZ25pbmdBY3Rpb25zKFxuICB0cmFuc3BvcnQ6IHR5cGVzLlRyYW5zcG9ydCxcbiAgc2NyaXB0VHlwZTogdHlwZXMuU2NyaXB0VHlwZSxcbiAgYXBwSWQ6IHN0cmluZyxcbiAgYXBwUHJpdmF0ZUtleTogc3RyaW5nLFxuICBpbnB1dHM6IEFycmF5PHR5cGVzLklucHV0PixcbiAgcHJlcGFyZWREYXRhOiB0eXBlcy5QcmVwYXJlZERhdGEsXG4gIG91dHB1dDogdHlwZXMuT3V0cHV0LFxuICBjaGFuZ2U6IHR5cGVzLkNoYW5nZSB8IHVuZGVmaW5lZCxcbiAgY29pblR5cGU6IHN0cmluZ1xuKTogUHJvbWlzZTx7XG4gIHByZUFjdGlvbnM6IEFycmF5PEZ1bmN0aW9uPixcbiAgYWN0aW9uczogQXJyYXk8RnVuY3Rpb24+XG59PiB7XG4gIGNvbnN0IHNjcmlwdCA9IHBhcmFtcy5UUkFOU0ZFUi5zY3JpcHQgKyBwYXJhbXMuVFJBTlNGRVIuc2lnbmF0dXJlO1xuICBjb25zdCBhcmd1bWVudCA9IFwiMDBcIiArIGF3YWl0IGdldEFyZ3VtZW50KHNjcmlwdFR5cGUsIGlucHV0cywgb3V0cHV0LCBjaGFuZ2UpOy8vIGtleWxlbmd0aCB6ZXJvXG5cbiAgY29uc3QgcHJlQWN0aW9ucyA9IFtdO1xuICBjb25zdCBzZW5kU2NyaXB0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHR4LmNvbW1hbmQuc2VuZFNjcmlwdCh0cmFuc3BvcnQsIHNjcmlwdCk7XG4gIH1cbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRTY3JpcHQpO1xuXG4gIGNvbnN0IHNlbmRBcmd1bWVudCA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0eC5jb21tYW5kLmV4ZWN1dGVTY3JpcHQoXG4gICAgICB0cmFuc3BvcnQsXG4gICAgICBhcHBJZCxcbiAgICAgIGFwcFByaXZhdGVLZXksXG4gICAgICBhcmd1bWVudFxuICAgICk7XG4gIH1cbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRBcmd1bWVudCk7XG5cbiAgY29uc3QgdXR4b0FyZ3VtZW50cyA9IHByZXBhcmVkRGF0YS5wcmVwYXJlZElucHV0cy5tYXAoXG4gICAgYXN5bmMgKHByZXBhcmVkSW5wdXQpID0+IHtcbiAgICAgIC8vIGNvbnN0IGFkZHJlc3NJZEhleCA9IFwiMDBcIi5jb25jYXQocHJlcGFyZWRJbnB1dC5hZGRyZXNzSW5kZXgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDYsIFwiMFwiKSk7XG4gICAgICBjb25zdCBTRVBhdGggPSBCdWZmZXIuZnJvbShgMTUke2F3YWl0IHV0aWxzLmdldFBhdGgocGFyYW1zLkNPSU5fVFlQRSwgcHJlcGFyZWRJbnB1dC5hZGRyZXNzSW5kZXgpfWAsICdoZXgnKVxuICAgICAgY29uc3Qgb3V0UG9pbnQgPSBwcmVwYXJlZElucHV0LnByZU91dFBvaW50QnVmO1xuXG4gICAgICAvLyBsZXQgaW5wdXRTY3JpcHRUeXBlO1xuICAgICAgLy8gaWYgKChzY3JpcHRUeXBlID09IFNjcmlwdFR5cGUuUDJQS0gpIHx8IChzY3JpcHRUeXBlID09IFNjcmlwdFR5cGUuUDJXUEtIKSB8fCAoc2NyaXB0VHlwZSA9PSBTY3JpcHRUeXBlLlAyU0hfUDJXUEtIKSkge1xuICAgICAgLy8gXHRpbnB1dFNjcmlwdFR5cGUgPSB0b1ZhclVpbnRCdWZmZXIoMCk7XG4gICAgICAvLyB9IGVsc2Ugey8vKHNjcmlwdFR5cGUgPT0gU2NyaXB0VHlwZS5QMldTSClcbiAgICAgIC8vIFx0aW5wdXRTY3JpcHRUeXBlID0gdG9WYXJVaW50QnVmZmVyKDEpO1xuICAgICAgLy8gfVxuXG5cbiAgICAgIGNvbnN0IGlucHV0U2NyaXB0VHlwZSA9IGJ1ZmZlclV0aWwudG9VaW50QnVmZmVyKDAsIDEpO1xuICAgICAgY29uc3QgaW5wdXRBbW91bnQgPSBwcmVwYXJlZElucHV0LnByZVZhbHVlQnVmLnJldmVyc2UoKTtcbiAgICAgIGNvbnN0IGlucHV0SGFzaCA9IGNyeXB0b1V0aWwuaGFzaDE2MChwcmVwYXJlZElucHV0LnB1YmtleUJ1Zik7XG4gICAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbU0VQYXRoLCBvdXRQb2ludCwgaW5wdXRTY3JpcHRUeXBlLCBpbnB1dEFtb3VudCwgaW5wdXRIYXNoXSkudG9TdHJpbmcoJ2hleCcpO1xuICAgIH0pO1xuXG4gIGNvbnN0IGFjdGlvbnMgPSB1dHhvQXJndW1lbnRzLm1hcChcbiAgICAodXR4b0FyZ3VtZW50KSA9PiBhc3luYyAoKSA9PiB7XG4gICAgICByZXR1cm4gdHguY29tbWFuZC5leGVjdXRlVXR4b1NjcmlwdCh0cmFuc3BvcnQsIGFwcElkLCBhcHBQcml2YXRlS2V5LCBhd2FpdCB1dHhvQXJndW1lbnQsIChzY3JpcHRUeXBlID09PSB0eXBlcy5TY3JpcHRUeXBlLlAyUEtIKSA/IFwiMTBcIiA6IFwiMTFcIik7XG4gICAgfSk7XG4gIHJldHVybiB7IHByZUFjdGlvbnMsIGFjdGlvbnMgfTtcbn07XG4iXX0=