UNPKG

@coolwallet/zen

Version:
242 lines (201 loc) 31 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.getScriptSigningActions = getScriptSigningActions; var _core = require("@coolwallet/core"); var params = _interopRequireWildcard(require("../config/params")); var bufferUtil = _interopRequireWildcard(require("./bufferUtil")); var types = _interopRequireWildcard(require("../config/types")); var txUtil = _interopRequireWildcard(require("./transactionUtil")); var cryptoUtil = _interopRequireWildcard(require("./cryptoUtil")); 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(scriptType, inputs, output, change) { var _txUtil$addressToOutS = txUtil.addressToOutScript(output.address), outputType = _txUtil$addressToOutS.scriptType, outputHash = _txUtil$addressToOutS.outHash; if (!outputHash) { throw new _core.error.SDKError(getArgument.name, "OutputHash Undefined"); } var outputScriptType; var outputHashBuf; //[outputScriptType(1B)] [outputAmount(8B)] [outputHash(12+20B)] [outputBlockHash(32B)] [outputBlockHeight(3B)] if (outputType == types.ScriptType.P2PKH) { outputScriptType = bufferUtil.toVarUintBuffer(0); outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex'); } else if (outputType == types.ScriptType.P2SH) { outputScriptType = bufferUtil.toVarUintBuffer(1); outputHashBuf = Buffer.from("000000000000000000000000".concat(outputHash.toString('hex')), 'hex'); } else { throw new _core.error.SDKError(getArgument.name, "Unsupport ScriptType : ".concat(outputType)); } var outputAmount = bufferUtil.toUintBuffer(output.value, 8); var outputBlockHash = bufferUtil.hexStringToUintBuffer(output.blockHash, 32).reverse(); var outputBlockHeight = bufferUtil.toReverseUintBuffer(output.blockHeight, 3); //[haveChange(1B)] [changeScriptType(1B)] [changeAmount(8B)] [changePath(21B)] [changeBlockHash(32B)] [changeBlockHeight(3B)] var haveChange; var changeScriptType; var changeAmount; var changePath; var changeBlockHash; var changeBlockHeight; if (change) { if (!change.pubkeyBuf) throw new _core.error.SDKError(getArgument.name, 'Public Key not exists !!'); haveChange = bufferUtil.toVarUintBuffer(1); changeScriptType = bufferUtil.toVarUintBuffer(scriptType); changeAmount = bufferUtil.toUintBuffer(change.value, 8); var addressIdxHex = '00'.concat(change.addressIndex.toString(16).padStart(6, '0')); changePath = Buffer.from("328000002C".concat(params.COIN_TYPE, "8000000000000000").concat(addressIdxHex), 'hex'); changeBlockHash = bufferUtil.hexStringToUintBuffer(change.blockHash, 32).reverse(); changeBlockHeight = bufferUtil.toReverseUintBuffer(change.blockHeight, 3); } else { haveChange = Buffer.from('00', 'hex'); changeScriptType = Buffer.from('00', 'hex'); changeAmount = Buffer.from('0000000000000000', 'hex'); changePath = Buffer.from('000000000000000000000000000000000000000000', 'hex'); changeBlockHash = Buffer.from('0000000000000000000000000000000000000000000000000000000000000000', 'hex'); changeBlockHeight = Buffer.from('000000', 'hex'); } //[hashPrevouts(32B] [hashSequence(32B)] var prevouts = inputs.map(function (input) { return Buffer.concat([Buffer.from(input.preTxHash, 'hex').reverse(), bufferUtil.toReverseUintBuffer(input.preIndex, 4)]); }); var hashPrevouts = cryptoUtil.doubleSha256(Buffer.concat(prevouts)); var sequences = inputs.map(function (input) { return Buffer.concat([input.sequence ? bufferUtil.toReverseUintBuffer(input.sequence, 4) : Buffer.from('ffffffff', 'hex'), bufferUtil.toReverseUintBuffer(input.preIndex, 4)]); }); var hashSequence = cryptoUtil.doubleSha256(Buffer.concat(sequences)); return Buffer.concat([outputScriptType, outputAmount, outputHashBuf, outputBlockHash, outputBlockHeight, haveChange, changeScriptType, changeAmount, changePath, changeBlockHash, changeBlockHeight, hashPrevouts, hashSequence]).toString('hex'); } function getScriptSigningActions(_x, _x2, _x3, _x4, _x5, _x6, _x7, _x8) { return _getScriptSigningActions.apply(this, arguments); } function _getScriptSigningActions() { _getScriptSigningActions = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5(transport, scriptType, appId, appPrivateKey, inputs, preparedData, output, change) { var script, argument, preActions, sendScript, sendArgument, utxoArguments, actions; return regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: script = params.TRANSFER.script + params.TRANSFER.signature; argument = '00' + getArgument(scriptType, inputs, output, change); // keylength zero preActions = []; sendScript = /*#__PURE__*/function () { var _ref = _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 _ref.apply(this, arguments); }; }(); preActions.push(sendScript); sendArgument = /*#__PURE__*/function () { var _ref2 = _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.executeScript(transport, appId, appPrivateKey, argument); case 2: case "end": return _context2.stop(); } } }, _callee2); })); return function sendArgument() { return _ref2.apply(this, arguments); }; }(); preActions.push(sendArgument); utxoArguments = preparedData.preparedInputs.map( /*#__PURE__*/function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(preparedInput) { var SEPath, outPoint, inputScriptType, inputAmount, inputHash, inputBlockHash, inputBlockHeight; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.t0 = Buffer; _context3.t1 = Buffer.from('15', 'hex'); _context3.t2 = Buffer; _context3.next = 5; return _core.utils.getPath(params.COIN_TYPE, preparedInput.addressIndex); case 5: _context3.t3 = _context3.sent; _context3.t4 = _context3.t2.from.call(_context3.t2, _context3.t3, 'hex'); _context3.t5 = [_context3.t1, _context3.t4]; SEPath = _context3.t0.concat.call(_context3.t0, _context3.t5); console.debug('SEPath: ' + SEPath.toString('hex')); //[outPoint(32+4B)] [inputScriptType(1B)] [inputAmount(8B)] [inputHash(20B)] [inputBlockHash(32B)] [inputBlockHeight(3B)] outPoint = preparedInput.preOutPointBuf; if (scriptType == types.ScriptType.P2PKH) { inputScriptType = bufferUtil.toVarUintBuffer(0); } else { //(scriptType == ScriptType.P2SH) inputScriptType = bufferUtil.toVarUintBuffer(1); } inputAmount = Buffer.from('0000000000000000', 'hex'); inputHash = cryptoUtil.hash160(preparedInput.pubkeyBuf); inputBlockHash = preparedInput.blockHashBuf.reverse(); inputBlockHeight = preparedInput.blockHeightBuf.reverse(); return _context3.abrupt("return", Buffer.concat([SEPath, outPoint, inputScriptType, inputAmount, inputHash, inputBlockHash, inputBlockHeight]).toString('hex')); case 17: case "end": return _context3.stop(); } } }, _callee3); })); return function (_x9) { return _ref3.apply(this, arguments); }; }()); actions = utxoArguments.map(function (utxoArgument) { return /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() { return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.t0 = _core.tx.command; _context4.t1 = transport; _context4.t2 = appId; _context4.t3 = appPrivateKey; _context4.next = 6; return utxoArgument; case 6: _context4.t4 = _context4.sent; return _context4.abrupt("return", _context4.t0.executeUtxoScript.call(_context4.t0, _context4.t1, _context4.t2, _context4.t3, _context4.t4, '13')); case 8: case "end": return _context4.stop(); } } }, _callee4); })); }); return _context5.abrupt("return", { preActions: preActions, actions: actions }); case 10: case "end": return _context5.stop(); } } }, _callee5); })); return _getScriptSigningActions.apply(this, arguments); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zY3JpcHRVdGlsLnRzIl0sIm5hbWVzIjpbImdldEFyZ3VtZW50Iiwic2NyaXB0VHlwZSIsImlucHV0cyIsIm91dHB1dCIsImNoYW5nZSIsInR4VXRpbCIsImFkZHJlc3NUb091dFNjcmlwdCIsImFkZHJlc3MiLCJvdXRwdXRUeXBlIiwib3V0cHV0SGFzaCIsIm91dEhhc2giLCJlcnJvciIsIlNES0Vycm9yIiwibmFtZSIsIm91dHB1dFNjcmlwdFR5cGUiLCJvdXRwdXRIYXNoQnVmIiwidHlwZXMiLCJTY3JpcHRUeXBlIiwiUDJQS0giLCJidWZmZXJVdGlsIiwidG9WYXJVaW50QnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsInRvU3RyaW5nIiwiUDJTSCIsIm91dHB1dEFtb3VudCIsInRvVWludEJ1ZmZlciIsInZhbHVlIiwib3V0cHV0QmxvY2tIYXNoIiwiaGV4U3RyaW5nVG9VaW50QnVmZmVyIiwiYmxvY2tIYXNoIiwicmV2ZXJzZSIsIm91dHB1dEJsb2NrSGVpZ2h0IiwidG9SZXZlcnNlVWludEJ1ZmZlciIsImJsb2NrSGVpZ2h0IiwiaGF2ZUNoYW5nZSIsImNoYW5nZVNjcmlwdFR5cGUiLCJjaGFuZ2VBbW91bnQiLCJjaGFuZ2VQYXRoIiwiY2hhbmdlQmxvY2tIYXNoIiwiY2hhbmdlQmxvY2tIZWlnaHQiLCJwdWJrZXlCdWYiLCJhZGRyZXNzSWR4SGV4IiwiY29uY2F0IiwiYWRkcmVzc0luZGV4IiwicGFkU3RhcnQiLCJwYXJhbXMiLCJDT0lOX1RZUEUiLCJwcmV2b3V0cyIsIm1hcCIsImlucHV0IiwicHJlVHhIYXNoIiwicHJlSW5kZXgiLCJoYXNoUHJldm91dHMiLCJjcnlwdG9VdGlsIiwiZG91YmxlU2hhMjU2Iiwic2VxdWVuY2VzIiwic2VxdWVuY2UiLCJoYXNoU2VxdWVuY2UiLCJnZXRTY3JpcHRTaWduaW5nQWN0aW9ucyIsInRyYW5zcG9ydCIsImFwcElkIiwiYXBwUHJpdmF0ZUtleSIsInByZXBhcmVkRGF0YSIsInNjcmlwdCIsIlRSQU5TRkVSIiwic2lnbmF0dXJlIiwiYXJndW1lbnQiLCJwcmVBY3Rpb25zIiwic2VuZFNjcmlwdCIsInR4IiwiY29tbWFuZCIsInB1c2giLCJzZW5kQXJndW1lbnQiLCJleGVjdXRlU2NyaXB0IiwidXR4b0FyZ3VtZW50cyIsInByZXBhcmVkSW5wdXRzIiwicHJlcGFyZWRJbnB1dCIsInV0aWxzIiwiZ2V0UGF0aCIsIlNFUGF0aCIsImNvbnNvbGUiLCJkZWJ1ZyIsIm91dFBvaW50IiwicHJlT3V0UG9pbnRCdWYiLCJpbnB1dFNjcmlwdFR5cGUiLCJpbnB1dEFtb3VudCIsImlucHV0SGFzaCIsImhhc2gxNjAiLCJpbnB1dEJsb2NrSGFzaCIsImJsb2NrSGFzaEJ1ZiIsImlucHV0QmxvY2tIZWlnaHQiLCJibG9ja0hlaWdodEJ1ZiIsImFjdGlvbnMiLCJ1dHhvQXJndW1lbnQiLCJleGVjdXRlVXR4b1NjcmlwdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7QUFFQSxTQUFTQSxXQUFULENBQ0VDLFVBREYsRUFFRUMsTUFGRixFQUdFQyxNQUhGLEVBSUVDLE1BSkYsRUFLVTtBQUNSLDhCQUF3REMsTUFBTSxDQUFDQyxrQkFBUCxDQUEwQkgsTUFBTSxDQUFDSSxPQUFqQyxDQUF4RDtBQUFBLE1BQW9CQyxVQUFwQix5QkFBUVAsVUFBUjtBQUFBLE1BQXlDUSxVQUF6Qyx5QkFBZ0NDLE9BQWhDOztBQUNBLE1BQUksQ0FBQ0QsVUFBTCxFQUFpQjtBQUNmLFVBQU0sSUFBSUUsWUFBTUMsUUFBVixDQUFtQlosV0FBVyxDQUFDYSxJQUEvQix5QkFBTjtBQUNEOztBQUNELE1BQUlDLGdCQUFKO0FBQ0EsTUFBSUMsYUFBSixDQU5RLENBT1I7O0FBQ0EsTUFBSVAsVUFBVSxJQUFJUSxLQUFLLENBQUNDLFVBQU4sQ0FBaUJDLEtBQW5DLEVBQTBDO0FBQ3hDSixJQUFBQSxnQkFBZ0IsR0FBR0ssVUFBVSxDQUFDQyxlQUFYLENBQTJC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QSxlQUFsQjtBQUFBLGFBQWxCLENBekRYO0FBQUEsOENBNERFO0FBQUUzQixjQUFBQSxVQUFVLEVBQVZBLFVBQUY7QUFBY3lCLGNBQUFBLE9BQU8sRUFBUEE7QUFBZCxhQTVERjs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxHIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXJyb3IsIHR4LCB1dGlscyB9IGZyb20gJ0Bjb29sd2FsbGV0L2NvcmUnO1xuaW1wb3J0ICogYXMgcGFyYW1zIGZyb20gJy4uL2NvbmZpZy9wYXJhbXMnO1xuaW1wb3J0ICogYXMgYnVmZmVyVXRpbCBmcm9tICcuL2J1ZmZlclV0aWwnO1xuaW1wb3J0ICogYXMgdHlwZXMgZnJvbSAnLi4vY29uZmlnL3R5cGVzJztcbmltcG9ydCAqIGFzIHR4VXRpbCBmcm9tICcuL3RyYW5zYWN0aW9uVXRpbCc7XG5pbXBvcnQgKiBhcyBjcnlwdG9VdGlsIGZyb20gJy4vY3J5cHRvVXRpbCc7XG5cbmZ1bmN0aW9uIGdldEFyZ3VtZW50KFxuICBzY3JpcHRUeXBlOiB0eXBlcy5TY3JpcHRUeXBlLFxuICBpbnB1dHM6IEFycmF5PHR5cGVzLklucHV0PixcbiAgb3V0cHV0OiB0eXBlcy5PdXRwdXQsXG4gIGNoYW5nZT86IHR5cGVzLkNoYW5nZVxuKTogc3RyaW5nIHtcbiAgY29uc3QgeyBzY3JpcHRUeXBlOiBvdXRwdXRUeXBlLCBvdXRIYXNoOiBvdXRwdXRIYXNoIH0gPSB0eFV0aWwuYWRkcmVzc1RvT3V0U2NyaXB0KG91dHB1dC5hZGRyZXNzKTtcbiAgaWYgKCFvdXRwdXRIYXNoKSB7XG4gICAgdGhyb3cgbmV3IGVycm9yLlNES0Vycm9yKGdldEFyZ3VtZW50Lm5hbWUsIGBPdXRwdXRIYXNoIFVuZGVmaW5lZGApO1xuICB9XG4gIGxldCBvdXRwdXRTY3JpcHRUeXBlO1xuICBsZXQgb3V0cHV0SGFzaEJ1ZjtcbiAgLy9bb3V0cHV0U2NyaXB0VHlwZSgxQildIFtvdXRwdXRBbW91bnQoOEIpXSBbb3V0cHV0SGFzaCgxMisyMEIpXSBbb3V0cHV0QmxvY2tIYXNoKDMyQildIFtvdXRwdXRCbG9ja0hlaWdodCgzQildXG4gIGlmIChvdXRwdXRUeXBlID09IHR5cGVzLlNjcmlwdFR5cGUuUDJQS0gpIHtcbiAgICBvdXRwdXRTY3JpcHRUeXBlID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoMCk7XG4gICAgb3V0cHV0SGFzaEJ1ZiA9IEJ1ZmZlci5mcm9tKGAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAke291dHB1dEhhc2gudG9TdHJpbmcoJ2hleCcpfWAsICdoZXgnKTtcbiAgfSBlbHNlIGlmIChvdXRwdXRUeXBlID09IHR5cGVzLlNjcmlwdFR5cGUuUDJTSCkge1xuICAgIG91dHB1dFNjcmlwdFR5cGUgPSBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcigxKTtcbiAgICBvdXRwdXRIYXNoQnVmID0gQnVmZmVyLmZyb20oYDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCR7b3V0cHV0SGFzaC50b1N0cmluZygnaGV4Jyl9YCwgJ2hleCcpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBlcnJvci5TREtFcnJvcihnZXRBcmd1bWVudC5uYW1lLCBgVW5zdXBwb3J0IFNjcmlwdFR5cGUgOiAke291dHB1dFR5cGV9YCk7XG4gIH1cbiAgY29uc3Qgb3V0cHV0QW1vdW50ID0gYnVmZmVyVXRpbC50b1VpbnRCdWZmZXIob3V0cHV0LnZhbHVlLCA4KTtcbiAgY29uc3Qgb3V0cHV0QmxvY2tIYXNoID0gYnVmZmVyVXRpbC5oZXhTdHJpbmdUb1VpbnRCdWZmZXIob3V0cHV0LmJsb2NrSGFzaCwgMzIpLnJldmVyc2UoKTtcbiAgY29uc3Qgb3V0cHV0QmxvY2tIZWlnaHQgPSBidWZmZXJVdGlsLnRvUmV2ZXJzZVVpbnRCdWZmZXIob3V0cHV0LmJsb2NrSGVpZ2h0LCAzKTtcbiAgLy9baGF2ZUNoYW5nZSgxQildIFtjaGFuZ2VTY3JpcHRUeXBlKDFCKV0gW2NoYW5nZUFtb3VudCg4QildIFtjaGFuZ2VQYXRoKDIxQildIFtjaGFuZ2VCbG9ja0hhc2goMzJCKV0gW2NoYW5nZUJsb2NrSGVpZ2h0KDNCKV1cbiAgbGV0IGhhdmVDaGFuZ2U7XG4gIGxldCBjaGFuZ2VTY3JpcHRUeXBlO1xuICBsZXQgY2hhbmdlQW1vdW50O1xuICBsZXQgY2hhbmdlUGF0aDtcbiAgbGV0IGNoYW5nZUJsb2NrSGFzaDtcbiAgbGV0IGNoYW5nZUJsb2NrSGVpZ2h0O1xuICBpZiAoY2hhbmdlKSB7XG4gICAgaWYgKCFjaGFuZ2UucHVia2V5QnVmKSB0aHJvdyBuZXcgZXJyb3IuU0RLRXJyb3IoZ2V0QXJndW1lbnQubmFtZSwgJ1B1YmxpYyBLZXkgbm90IGV4aXN0cyAhIScpO1xuICAgIGhhdmVDaGFuZ2UgPSBidWZmZXJVdGlsLnRvVmFyVWludEJ1ZmZlcigxKTtcbiAgICBjaGFuZ2VTY3JpcHRUeXBlID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoc2NyaXB0VHlwZSk7XG4gICAgY2hhbmdlQW1vdW50ID0gYnVmZmVyVXRpbC50b1VpbnRCdWZmZXIoY2hhbmdlLnZhbHVlLCA4KTtcbiAgICBjb25zdCBhZGRyZXNzSWR4SGV4ID0gJzAwJy5jb25jYXQoY2hhbmdlLmFkZHJlc3NJbmRleC50b1N0cmluZygxNikucGFkU3RhcnQoNiwgJzAnKSk7XG4gICAgY2hhbmdlUGF0aCA9IEJ1ZmZlci5mcm9tKGAzMjgwMDAwMDJDJHtwYXJhbXMuQ09JTl9UWVBFfTgwMDAwMDAwMDAwMDAwMDAke2FkZHJlc3NJZHhIZXh9YCwgJ2hleCcpO1xuICAgIGNoYW5nZUJsb2NrSGFzaCA9IGJ1ZmZlclV0aWwuaGV4U3RyaW5nVG9VaW50QnVmZmVyKGNoYW5nZS5ibG9ja0hhc2gsIDMyKS5yZXZlcnNlKCk7XG4gICAgY2hhbmdlQmxvY2tIZWlnaHQgPSBidWZmZXJVdGlsLnRvUmV2ZXJzZVVpbnRCdWZmZXIoY2hhbmdlLmJsb2NrSGVpZ2h0LCAzKTtcbiAgfSBlbHNlIHtcbiAgICBoYXZlQ2hhbmdlID0gQnVmZmVyLmZyb20oJzAwJywgJ2hleCcpO1xuICAgIGNoYW5nZVNjcmlwdFR5cGUgPSBCdWZmZXIuZnJvbSgnMDAnLCAnaGV4Jyk7XG4gICAgY2hhbmdlQW1vdW50ID0gQnVmZmVyLmZyb20oJzAwMDAwMDAwMDAwMDAwMDAnLCAnaGV4Jyk7XG4gICAgY2hhbmdlUGF0aCA9IEJ1ZmZlci5mcm9tKCcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCAnaGV4Jyk7XG4gICAgY2hhbmdlQmxvY2tIYXNoID0gQnVmZmVyLmZyb20oJzAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCAnaGV4Jyk7XG4gICAgY2hhbmdlQmxvY2tIZWlnaHQgPSBCdWZmZXIuZnJvbSgnMDAwMDAwJywgJ2hleCcpO1xuICB9XG5cbiAgLy9baGFzaFByZXZvdXRzKDMyQl0gW2hhc2hTZXF1ZW5jZSgzMkIpXVxuICBjb25zdCBwcmV2b3V0cyA9IGlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgQnVmZmVyLmZyb20oaW5wdXQucHJlVHhIYXNoLCAnaGV4JykucmV2ZXJzZSgpLFxuICAgICAgYnVmZmVyVXRpbC50b1JldmVyc2VVaW50QnVmZmVyKGlucHV0LnByZUluZGV4LCA0KSxcbiAgICBdKTtcbiAgfSk7XG4gIGNvbnN0IGhhc2hQcmV2b3V0cyA9IGNyeXB0b1V0aWwuZG91YmxlU2hhMjU2KEJ1ZmZlci5jb25jYXQocHJldm91dHMpKTtcbiAgY29uc3Qgc2VxdWVuY2VzID0gaW5wdXRzLm1hcCgoaW5wdXQpID0+IHtcbiAgICByZXR1cm4gQnVmZmVyLmNvbmNhdChbXG4gICAgICBpbnB1dC5zZXF1ZW5jZSA/IGJ1ZmZlclV0aWwudG9SZXZlcnNlVWludEJ1ZmZlcihpbnB1dC5zZXF1ZW5jZSwgNCkgOiBCdWZmZXIuZnJvbSgnZmZmZmZmZmYnLCAnaGV4JyksXG4gICAgICBidWZmZXJVdGlsLnRvUmV2ZXJzZVVpbnRCdWZmZXIoaW5wdXQucHJlSW5kZXgsIDQpLFxuICAgIF0pO1xuICB9KTtcbiAgY29uc3QgaGFzaFNlcXVlbmNlID0gY3J5cHRvVXRpbC5kb3VibGVTaGEyNTYoQnVmZmVyLmNvbmNhdChzZXF1ZW5jZXMpKTtcblxuICByZXR1cm4gQnVmZmVyLmNvbmNhdChbXG4gICAgb3V0cHV0U2NyaXB0VHlwZSxcbiAgICBvdXRwdXRBbW91bnQsXG4gICAgb3V0cHV0SGFzaEJ1ZixcbiAgICBvdXRwdXRCbG9ja0hhc2gsXG4gICAgb3V0cHV0QmxvY2tIZWlnaHQsXG4gICAgaGF2ZUNoYW5nZSxcbiAgICBjaGFuZ2VTY3JpcHRUeXBlLFxuICAgIGNoYW5nZUFtb3VudCxcbiAgICBjaGFuZ2VQYXRoLFxuICAgIGNoYW5nZUJsb2NrSGFzaCxcbiAgICBjaGFuZ2VCbG9ja0hlaWdodCxcbiAgICBoYXNoUHJldm91dHMsXG4gICAgaGFzaFNlcXVlbmNlLFxuICBdKS50b1N0cmluZygnaGV4Jyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTY3JpcHRTaWduaW5nQWN0aW9ucyhcbiAgdHJhbnNwb3J0OiB0eXBlcy5UcmFuc3BvcnQsXG4gIHNjcmlwdFR5cGU6IHR5cGVzLlNjcmlwdFR5cGUsXG4gIGFwcElkOiBzdHJpbmcsXG4gIGFwcFByaXZhdGVLZXk6IHN0cmluZyxcbiAgaW5wdXRzOiBBcnJheTx0eXBlcy5JbnB1dD4sXG4gIHByZXBhcmVkRGF0YTogdHlwZXMuUHJlcGFyZWREYXRhLFxuICBvdXRwdXQ6IHR5cGVzLk91dHB1dCxcbiAgY2hhbmdlOiB0eXBlcy5DaGFuZ2UgfCB1bmRlZmluZWRcbik6IFByb21pc2U8eyBwcmVBY3Rpb25zOiBBcnJheTxGdW5jdGlvbj47IGFjdGlvbnM6IEFycmF5PEZ1bmN0aW9uPiB9PiB7XG4gIGNvbnN0IHNjcmlwdCA9IHBhcmFtcy5UUkFOU0ZFUi5zY3JpcHQgKyBwYXJhbXMuVFJBTlNGRVIuc2lnbmF0dXJlO1xuICBjb25zdCBhcmd1bWVudCA9ICcwMCcgKyBnZXRBcmd1bWVudChzY3JpcHRUeXBlLCBpbnB1dHMsIG91dHB1dCwgY2hhbmdlKTsgLy8ga2V5bGVuZ3RoIHplcm9cblxuICBjb25zdCBwcmVBY3Rpb25zID0gW107XG4gIGNvbnN0IHNlbmRTY3JpcHQgPSBhc3luYyAoKSA9PiB7XG4gICAgYXdhaXQgdHguY29tbWFuZC5zZW5kU2NyaXB0KHRyYW5zcG9ydCwgc2NyaXB0KTtcbiAgfTtcbiAgcHJlQWN0aW9ucy5wdXNoKHNlbmRTY3JpcHQpO1xuXG4gIGNvbnN0IHNlbmRBcmd1bWVudCA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCB0eC5jb21tYW5kLmV4ZWN1dGVTY3JpcHQodHJhbnNwb3J0LCBhcHBJZCwgYXBwUHJpdmF0ZUtleSwgYXJndW1lbnQpO1xuICB9O1xuICBwcmVBY3Rpb25zLnB1c2goc2VuZEFyZ3VtZW50KTtcblxuICBjb25zdCB1dHhvQXJndW1lbnRzID0gcHJlcGFyZWREYXRhLnByZXBhcmVkSW5wdXRzLm1hcChhc3luYyAocHJlcGFyZWRJbnB1dCkgPT4ge1xuICAgIC8vIGNvbnN0IGFkZHJlc3NJZEhleCA9IFwiMDBcIi5jb25jYXQocHJlcGFyZWRJbnB1dC5hZGRyZXNzSW5kZXgudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDYsIFwiMFwiKSk7XG5cbiAgICBjb25zdCBTRVBhdGggPSBCdWZmZXIuY29uY2F0KFtcbiAgICAgIEJ1ZmZlci5mcm9tKCcxNScsICdoZXgnKSxcbiAgICAgIEJ1ZmZlci5mcm9tKGF3YWl0IHV0aWxzLmdldFBhdGgocGFyYW1zLkNPSU5fVFlQRSwgcHJlcGFyZWRJbnB1dC5hZGRyZXNzSW5kZXgpLCAnaGV4JyksXG4gICAgXSk7XG4gICAgY29uc29sZS5kZWJ1ZygnU0VQYXRoOiAnICsgU0VQYXRoLnRvU3RyaW5nKCdoZXgnKSk7XG5cbiAgICAvL1tvdXRQb2ludCgzMis0QildIFtpbnB1dFNjcmlwdFR5cGUoMUIpXSBbaW5wdXRBbW91bnQoOEIpXSBbaW5wdXRIYXNoKDIwQildIFtpbnB1dEJsb2NrSGFzaCgzMkIpXSBbaW5wdXRCbG9ja0hlaWdodCgzQildXG4gICAgY29uc3Qgb3V0UG9pbnQgPSBwcmVwYXJlZElucHV0LnByZU91dFBvaW50QnVmO1xuICAgIGxldCBpbnB1dFNjcmlwdFR5cGU7XG4gICAgaWYgKHNjcmlwdFR5cGUgPT0gdHlwZXMuU2NyaXB0VHlwZS5QMlBLSCkge1xuICAgICAgaW5wdXRTY3JpcHRUeXBlID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vKHNjcmlwdFR5cGUgPT0gU2NyaXB0VHlwZS5QMlNIKVxuICAgICAgaW5wdXRTY3JpcHRUeXBlID0gYnVmZmVyVXRpbC50b1ZhclVpbnRCdWZmZXIoMSk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0QW1vdW50ID0gQnVmZmVyLmZyb20oJzAwMDAwMDAwMDAwMDAwMDAnLCAnaGV4Jyk7XG4gICAgY29uc3QgaW5wdXRIYXNoID0gY3J5cHRvVXRpbC5oYXNoMTYwKHByZXBhcmVkSW5wdXQucHVia2V5QnVmKTtcbiAgICBjb25zdCBpbnB1dEJsb2NrSGFzaCA9IHByZXBhcmVkSW5wdXQuYmxvY2tIYXNoQnVmLnJldmVyc2UoKTtcbiAgICBjb25zdCBpbnB1dEJsb2NrSGVpZ2h0ID0gcHJlcGFyZWRJbnB1dC5ibG9ja0hlaWdodEJ1Zi5yZXZlcnNlKCk7XG4gICAgcmV0dXJuIEJ1ZmZlci5jb25jYXQoW1xuICAgICAgU0VQYXRoLFxuICAgICAgb3V0UG9pbnQsXG4gICAgICBpbnB1dFNjcmlwdFR5cGUsXG4gICAgICBpbnB1dEFtb3VudCxcbiAgICAgIGlucHV0SGFzaCxcbiAgICAgIGlucHV0QmxvY2tIYXNoLFxuICAgICAgaW5wdXRCbG9ja0hlaWdodCxcbiAgICBdKS50b1N0cmluZygnaGV4Jyk7XG4gIH0pO1xuXG4gIGNvbnN0IGFjdGlvbnMgPSB1dHhvQXJndW1lbnRzLm1hcCgodXR4b0FyZ3VtZW50KSA9PiBhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIHR4LmNvbW1hbmQuZXhlY3V0ZVV0eG9TY3JpcHQodHJhbnNwb3J0LCBhcHBJZCwgYXBwUHJpdmF0ZUtleSwgYXdhaXQgdXR4b0FyZ3VtZW50LCAnMTMnKTtcbiAgfSk7XG4gIHJldHVybiB7IHByZUFjdGlvbnMsIGFjdGlvbnMgfTtcbn1cbiJdfQ==