Overview
ETH Balance
0.019640230851433499 ETH
Eth Value
$68.32 (@ $3,478.51/ETH)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 45 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Make ETH Swap | 13263281 | 1192 days ago | IN | 0.05 ETH | 0.03387303 | ||||
Make ETH Swap | 13263259 | 1192 days ago | IN | 0.05 ETH | 0.00683803 | ||||
Make ETH Swap | 13262148 | 1192 days ago | IN | 0.24 ETH | 0.01837076 | ||||
Make ETH Swap | 13259128 | 1192 days ago | IN | 0.06 ETH | 0.01783723 | ||||
Make ETH Swap | 13258424 | 1192 days ago | IN | 0.12 ETH | 0.0315841 | ||||
Make ETH Swap | 13257575 | 1193 days ago | IN | 0.08 ETH | 0.03019365 | ||||
Make ETH Swap | 13257424 | 1193 days ago | IN | 0.07 ETH | 0.01866491 | ||||
Make ETH Swap | 13257201 | 1193 days ago | IN | 0.3 ETH | 0.00281058 | ||||
Make ETH Swap | 13257192 | 1193 days ago | IN | 0.3 ETH | 0.00258624 | ||||
Make ETH Swap | 13257148 | 1193 days ago | IN | 0.9 ETH | 0.0331024 | ||||
Make ETH Swap | 13247237 | 1194 days ago | IN | 0.07772 ETH | 0.01136677 | ||||
Make ETH Swap | 13239882 | 1195 days ago | IN | 0.28 ETH | 0.03040802 | ||||
Make ETH Swap | 13238022 | 1196 days ago | IN | 0.02 ETH | 0.01952001 | ||||
Make ETH Swap | 13231932 | 1197 days ago | IN | 0.5 ETH | 0.04045675 | ||||
Make ETH Swap | 13227592 | 1197 days ago | IN | 0.14 ETH | 0.01142857 | ||||
Make ETH Swap | 13220725 | 1198 days ago | IN | 0.021 ETH | 0.0150608 | ||||
Make ETH Swap | 13219395 | 1198 days ago | IN | 0.11 ETH | 0.01552535 | ||||
Make ETH Swap | 13208309 | 1200 days ago | IN | 0.085 ETH | 0.01653121 | ||||
Make ETH Swap | 13207219 | 1200 days ago | IN | 0.025 ETH | 0.01635707 | ||||
Make ETH Swap | 13205435 | 1201 days ago | IN | 0.03 ETH | 0.01515679 | ||||
Make Token Swap | 13205335 | 1201 days ago | IN | 0 ETH | 0.01494702 | ||||
Make ETH Swap | 13202714 | 1201 days ago | IN | 0.072 ETH | 0.01722026 | ||||
Make ETH Swap | 13199228 | 1202 days ago | IN | 0.02 ETH | 0.01344461 | ||||
Make Token Swap ... | 13199074 | 1202 days ago | IN | 0 ETH | 0.03427212 | ||||
Make ETH Swap | 13199026 | 1202 days ago | IN | 0.05 ETH | 0.03852611 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
13263281 | 1192 days ago | 0.0001125 ETH | ||||
13263281 | 1192 days ago | 0.024875 ETH | ||||
13263281 | 1192 days ago | 0.024875 ETH | ||||
13263259 | 1192 days ago | 0.024875 ETH | ||||
13262148 | 1192 days ago | 0.00054 ETH | ||||
13262148 | 1192 days ago | 0.0597 ETH | ||||
13262148 | 1192 days ago | 0.1791 ETH | ||||
13259128 | 1192 days ago | 0.000135 ETH | ||||
13259128 | 1192 days ago | 0.014925 ETH | ||||
13259128 | 1192 days ago | 0.044775 ETH | ||||
13258424 | 1192 days ago | 0.00027 ETH | ||||
13258424 | 1192 days ago | 0.02985 ETH | ||||
13258424 | 1192 days ago | 0.08955 ETH | ||||
13257575 | 1193 days ago | 0.0398 ETH | ||||
13257575 | 1193 days ago | 0.0398 ETH | ||||
13257424 | 1193 days ago | 0.0000945 ETH | ||||
13257424 | 1193 days ago | 0.06979 ETH | ||||
13257201 | 1193 days ago | 0.2991 ETH | ||||
13257192 | 1193 days ago | 0.2991 ETH | ||||
13257148 | 1193 days ago | 0.001215 ETH | ||||
13257148 | 1193 days ago | 0.8973 ETH | ||||
13247237 | 1194 days ago | 0.00010492 ETH | ||||
13247237 | 1194 days ago | 0.07748684 ETH | ||||
13239882 | 1195 days ago | 0.000378 ETH | ||||
13239882 | 1195 days ago | 0.27916 ETH |
Loading...
Loading
Contract Name:
Multiswap
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.7; import "./interfaces/IUniswapV2Router02.sol"; import "./libraries/SafeMath.sol"; import "./libraries/SafeERC20.sol"; contract Multiswap { using SafeMath for uint256; using SafeERC20 for IERC20; // Ownership change pending address private pendingOwner; // WETH Address address private immutable WETH; // Uniswap Router for swaps IUniswapV2Router02 private immutable uniswapRouter; // Referral data mapping (address => bool) private referrers; mapping (address => uint256) private referralFees; // Data struct struct ContractData { uint160 owner; uint16 swapFeeBase; uint16 swapFeeToken; uint16 referralFee; uint16 maxFee; } ContractData private data; // Modifier for only owner functions modifier onlyOwner { require(msg.sender == address(data.owner), "Not allowed"); _; } /** * @dev Constructor sets values for Uniswap, WETH, and fee data * * These values are the immutable state values for Uniswap and WETH. * */ constructor() { uniswapRouter = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); WETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); data.owner = uint160(msg.sender); // add extra two digits to percent for accuracy (30 = 0.3) data.swapFeeBase = uint16(30); // 0.3% data.swapFeeToken = uint16(20); // 0.2% per token data.referralFee = uint16(4500); // 45% for referrals data.maxFee = uint16(150); // 1.5% max fee // Add standard referrers referrers[address(this)] = true; referrers[address(0x1190074795DAD0E61b61270De48e108427f8f817)] = true; } /** * @dev Enables receiving ETH with no function call */ receive() external payable {} fallback() external payable {} /** * @dev Checks and returns expected output fom ETH swap. */ function checkOutputsETH( address[] memory _tokens, uint256[] memory _percent, uint256[] memory _slippage, uint256 _total ) external view returns (address[] memory, uint256[] memory, uint256) { require(_tokens.length == _percent.length, 'Multiswap: mismatch input data'); uint256 _totalPercent = 0; (uint256 valueToSend, uint256 feeAmount) = applyFeeETH(_total, _tokens.length); uint256[] memory _outputAmount = new uint256[](_tokens.length); for (uint256 i = 0; i < _tokens.length; i++) { _totalPercent += _percent[i]; (_outputAmount[i],) = calcOutputEth( _tokens[i], valueToSend.mul(_percent[i]).div(100), _slippage[i] ); } require(_totalPercent == 100, 'Multiswap: portfolio not 100%'); return (_tokens, _outputAmount, feeAmount); } /** * @dev Checks and returns expected output from token swap. */ function checkOutputsToken( address[] memory _tokens, uint256[] memory _percent, uint256[] memory _slippage, address _base, uint256 _total ) external view returns (address[] memory, uint256[] memory) { require(_tokens.length == _percent.length, 'Multiswap: mismatch input data'); uint256 _totalPercent = 0; uint256[] memory _outputAmount = new uint256[](_tokens.length); address[] memory path = new address[](3); path[0] = _base; path[1] = WETH; for (uint256 i = 0; i < _tokens.length; i++) { _totalPercent += _percent[i]; path[2] = _tokens[i]; uint256[] memory expected = uniswapRouter.getAmountsOut(_total.mul(_percent[i]).div(100), path); uint256 adjusted = expected[2].sub(expected[2].mul(_slippage[i]).div(1000)); _outputAmount[i] = adjusted; } require(_totalPercent == 100, 'Multiswap: portolio not 100%'); return (_tokens, _outputAmount); } /** * @dev Checks and returns ETH value of token amount. */ function checkTokenValueETH(address _token, uint256 _amount, uint256 _slippage) public view returns (uint256) { address[] memory path = new address[](2); path[0] = _token; path[1] = WETH; uint256[] memory expected = uniswapRouter.getAmountsOut(_amount, path); uint256 adjusted = expected[1].sub(expected[1].mul(_slippage).div(1000)); return adjusted; } /** * @dev Checks and returns ETH value of portfolio. */ function checkAllValue(address[] memory _tokens, uint256[] memory _amounts, uint256[] memory _slippage) external view returns (uint256) { uint256 totalValue; for (uint i = 0; i < _tokens.length; i++) { totalValue += checkTokenValueETH(_tokens[i], _amounts[i], _slippage[i]); } return totalValue; } /** * @dev Internal function to calculate the output from one ETH swap. */ function calcOutputEth(address _token, uint256 _value, uint256 _slippage) internal view returns (uint256, address[] memory) { address[] memory path = new address[](2); path[0] = WETH; path[1] = _token; uint256[] memory expected = uniswapRouter.getAmountsOut(_value, path); uint256 adjusted = expected[1].sub(expected[1].mul(_slippage).div(1000)); return (adjusted, path); } /** * @dev Internal function to calculate the output from one token swap. */ function calcOutputToken(address[] memory _path, uint256 _value) internal view returns (uint256[] memory expected) { expected = uniswapRouter.getAmountsOut(_value, _path); return expected; } /** * @dev Execute ETH swap for each token in portfolio. */ function makeETHSwap(address[] memory _tokens, uint256[] memory _percent, uint256[] memory _expected, address _referrer) external payable returns (uint256[] memory) { require(address(0) != _referrer, 'Multiswap: referrer cannot be zero addresss'); require(_tokens.length == _percent.length && _percent.length == _expected.length, 'Multiswap: Input data mismatch'); (uint256 valueToSend, uint256 feeAmount) = applyFeeETH(msg.value, _tokens.length); uint256 totalPercent; uint256[] memory outputs = new uint256[](_tokens.length); address[] memory path = new address[](2); path[0] = WETH; for (uint256 i = 0; i < _tokens.length; i++) { totalPercent += _percent[i]; require(totalPercent <= 100, 'Multiswap: Exceeded 100%'); path[1] = _tokens[i]; uint256 swapVal = valueToSend.mul(_percent[i]).div(100); uint256[] memory out = uniswapRouter.swapExactETHForTokens{value: swapVal}( _expected[i], path, msg.sender, block.timestamp + 1200 ); outputs[i] = out[1]; } require(totalPercent == 100, 'Multiswap: Percent not 100'); if (_referrer != address(this)) { uint256 referralFee = takeReferralFee(feeAmount, _referrer); (bool sent, ) = _referrer.call{value: referralFee}(""); require(sent, 'Multiswap: Failed to send referral fee'); } return outputs; } /** * @dev Execute token swap for each token in portfolio. */ function makeTokenSwap( address[] memory _tokens, uint256[] memory _percent, uint256[] memory _expected, address _referrer, address _base, uint256 _total) external returns (uint256[] memory) { require(address(0) != _referrer, 'Multiswap: referrer cannot be zero addresss'); require(_tokens.length == _percent.length && _percent.length == _expected.length, 'Multiswap: Input data mismatch'); IERC20 token = IERC20(_base); uint256 totalPercent = 0; uint256[] memory outputs = new uint256[](_tokens.length); token.safeTransferFrom(msg.sender, address(this), _total); require(token.approve(address(uniswapRouter), _total), 'Multiswap: Uniswap approval failed'); address[] memory path = new address[](3); path[0] = _base; path[1] = WETH; for (uint256 i = 0; i < _tokens.length; i++) { totalPercent += _percent[i]; require(totalPercent <= 100, 'Multiswap: Exceeded 100'); path[2] = _tokens[i]; uint256 swapVal = _total.mul(_percent[i]).div(100); uint256[] memory out = uniswapRouter.swapExactTokensForTokens( swapVal, _expected[i], path, msg.sender, block.timestamp + 1200 ); outputs[i] = out[1]; } require(totalPercent == 100, 'Multiswap: Percent not 100'); return outputs; } /** * @dev Swap tokens for ETH */ function makeTokenSwapForETH( address[] memory _tokens, uint256[] memory _amounts, uint256[] memory _expected, address _referrer ) external payable returns (uint256) { require(address(0) != _referrer, 'Multiswap: referrer cannot be zero addresss'); require(_tokens.length == _amounts.length && _expected.length == _expected.length, 'Multiswap: Input data mismatch'); address[] memory path = new address[](2); path[1] = WETH; uint256 preBalance = address(this).balance; for (uint i = 0; i < _tokens.length; i++) { path[0] = _tokens[i]; IERC20 token = IERC20(_tokens[i]); require(token.transferFrom(msg.sender, address(this), _amounts[i]), 'Multiswap: Transfer failed'); uint256 transferAmount = _amounts[i]; if (transferAmount > token.balanceOf(address(this))) transferAmount = token.balanceOf(address(this)); require(token.approve(address(uniswapRouter), transferAmount), 'Multiswap: Approval failure'); uniswapRouter.swapExactTokensForETH(transferAmount, _expected[i], path, address(this), block.timestamp + 1200); } (uint256 valueToSend, uint256 feeAmount) = applyFeeETH(address(this).balance.sub(preBalance), _tokens.length); if (_referrer != address(this)) { uint256 referralFee = takeReferralFee(feeAmount, _referrer); (bool sent, ) = _referrer.call{value: referralFee}(""); require(sent, 'Multiswap: Failed to send referral fee'); } (bool delivered, ) = msg.sender.call{value: valueToSend}(""); require(delivered, 'Multiswap: Failed to send swap output'); return valueToSend; } /** * @dev Apply fee to total value amount for ETH swap. */ function applyFeeETH(uint256 _amount, uint256 _numberOfTokens) private view returns (uint256 valueToSend, uint256 feeAmount) { uint256 feePercent = _numberOfTokens.mul(data.swapFeeToken); feePercent -= data.swapFeeToken; feePercent += data.swapFeeBase; if (feePercent > data.maxFee) { feePercent = data.maxFee; } feeAmount = _amount.mul(feePercent).div(10000); valueToSend = _amount.sub(feeAmount); return (valueToSend, feeAmount); } /** * @dev Take referral fee and distribute */ function takeReferralFee(uint256 _fee, address _referrer) internal returns (uint256) { require(referrers[_referrer], 'Multiswap: Not signed up as referrer'); uint256 referralFee = _fee.mul(data.referralFee).div(10000); referralFees[_referrer] = referralFees[_referrer].add(referralFee); return referralFee; } /** * @dev Owner only function to update contract fees. */ function updateFee( uint16 _newFeeBase, uint16 _newFeeToken, uint16 _newFeeReferral, uint16 _newMaxFee ) external onlyOwner returns (bool) { data.swapFeeBase = _newFeeBase; data.swapFeeToken = _newFeeToken; data.referralFee = _newFeeReferral; data.maxFee = _newMaxFee; return true; } /** * @dev Returns current app fees. */ function getCurrentFee() external view returns ( uint16, uint16, uint16, uint16 ) { return (data.swapFeeBase, data.swapFeeToken, data.referralFee, data.maxFee); } /** * @dev Owner only function to change contract owner. */ function transferOwnership(address _newOwner) external onlyOwner returns (bool) { require(address(0) != _newOwner, "Multiswap: newOwner set to the zero address"); pendingOwner = _newOwner; return true; } /** * @dev Function to claim ownership as pending owner. */ function claimOwnership() external { require(msg.sender == pendingOwner, 'Multiswap: not pending owner'); data.owner = uint160(pendingOwner); pendingOwner = address(0); } /** * @dev Owner only function to renounce ownership. */ function renounceOwnership() external onlyOwner { pendingOwner = address(0); data.owner = uint160(0); } /** * @dev Owner only function to change contract owner. */ function addReferrer(address _referrer) external onlyOwner returns (bool) { referrers[_referrer] = true; return true; } /** * @dev Owner only function to change contract owner. */ function removeReferrer(address _referrer) external onlyOwner returns (bool) { referrers[_referrer] = false; return true; } /** * @dev Return owner address */ function getOwner() external view returns (address) { return address(data.owner); } /** * @dev Function to see referral balancees */ function getReferralFees(address _referrer) external view returns (uint256) { return referralFees[_referrer]; } /** * @dev Owner only function to retreive ETH fees */ function retrieveEthFees() external onlyOwner { (bool sent, ) = address(data.owner).call{value: address(this).balance}(""); require(sent, 'Multiswap: Transfer failed'); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
// SPDX-License-Identifier: Unlicensed pragma solidity >=0.6.2; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../interfaces/IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"addReferrer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_slippage","type":"uint256[]"}],"name":"checkAllValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_percent","type":"uint256[]"},{"internalType":"uint256[]","name":"_slippage","type":"uint256[]"},{"internalType":"uint256","name":"_total","type":"uint256"}],"name":"checkOutputsETH","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_percent","type":"uint256[]"},{"internalType":"uint256[]","name":"_slippage","type":"uint256[]"},{"internalType":"address","name":"_base","type":"address"},{"internalType":"uint256","name":"_total","type":"uint256"}],"name":"checkOutputsToken","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_slippage","type":"uint256"}],"name":"checkTokenValueETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"getReferralFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_percent","type":"uint256[]"},{"internalType":"uint256[]","name":"_expected","type":"uint256[]"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"makeETHSwap","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_percent","type":"uint256[]"},{"internalType":"uint256[]","name":"_expected","type":"uint256[]"},{"internalType":"address","name":"_referrer","type":"address"},{"internalType":"address","name":"_base","type":"address"},{"internalType":"uint256","name":"_total","type":"uint256"}],"name":"makeTokenSwap","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_tokens","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_expected","type":"uint256[]"},{"internalType":"address","name":"_referrer","type":"address"}],"name":"makeTokenSwapForETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_referrer","type":"address"}],"name":"removeReferrer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieveEthFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newFeeBase","type":"uint16"},{"internalType":"uint16","name":"_newFeeToken","type":"uint16"},{"internalType":"uint16","name":"_newFeeReferral","type":"uint16"},{"internalType":"uint16","name":"_newMaxFee","type":"uint16"}],"name":"updateFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561001057600080fd5b50737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b8152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505033600360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550601e600360000160146101000a81548161ffff021916908361ffff1602179055506014600360000160166101000a81548161ffff021916908361ffff160217905550611194600360000160186101000a81548161ffff021916908361ffff16021790555060966003600001601a6101000a81548161ffff021916908361ffff16021790555060018060003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001806000731190074795dad0e61b61270de48e108427f8f81773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060805160601c60a05160601c614f046102b1600039600081816108e401528181610d32015281816113230152818161162601528181611dff01528181611ecf0152818161264f0152612c8a0152600081816107d601528181610cc10152818161149001528181611ab8015281816124b90152612bca0152614f046000f3fe6080604052600436106101025760003560e01c8063893d20e811610095578063c6526a8a11610064578063c6526a8a14610366578063f2fde38b14610396578063f70d9362146103d3578063f997e62a14610401578063fefa9bb11461043157610109565b8063893d20e8146102aa57806389f90d7f146102d55780638bdb86d21461031257806391a3cd871461034f57610109565b8063636565ff116100d1578063636565ff146101dc5780636d02b2ad14610219578063715018a6146102565780637a00e2e31461026d57610109565b80631d5cfebf1461010b57806321118d571461014a57806321ad78b3146101875780634e71e0c8146101c557610109565b3661010957005b005b34801561011757600080fd5b50610132600480360381019061012d9190613967565b61046e565b604051610141939291906140df565b60405180910390f35b34801561015657600080fd5b50610171600480360381019061016c91906135d5565b610658565b60405161017e9190614488565b60405180910390f35b34801561019357600080fd5b506101ae60048036038101906101a99190613898565b6106a1565b6040516101bc9291906140a8565b60405180910390f35b3480156101d157600080fd5b506101da610aec565b005b3480156101e857600080fd5b5061020360048036038101906101fe9190613602565b610c21565b6040516102109190614488565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190613a98565b610e62565b60405161024d9190614146565b60405180910390f35b34801561026257600080fd5b5061026b610f83565b005b34801561027957600080fd5b50610294600480360381019061028f91906135d5565b61109e565b6040516102a19190614146565b60405180910390f35b3480156102b657600080fd5b506102bf611194565b6040516102cc919061402d565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f791906137b7565b6111c1565b6040516103099190614124565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190613655565b6117aa565b6040516103469190614488565b60405180910390f35b34801561035b57600080fd5b5061036461183e565b005b610380600480360381019061037b91906136fc565b6119a5565b60405161038d9190614488565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b891906135d5565b612193565b6040516103ca9190614146565b60405180910390f35b3480156103df57600080fd5b506103e86122e1565b6040516103f89493929190614443565b60405180910390f35b61041b600480360381019061041691906136fc565b612345565b6040516104289190614124565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906135d5565b6128c1565b6040516104659190614146565b60405180910390f35b606080600085518751146104b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906143a3565b60405180910390fd5b600080806104c6878b516129b6565b9150915060008a5167ffffffffffffffff8111156104e7576104e661493f565b5b6040519080825280602002602001820160405280156105155781602001602082028036833780820191505090505b50905060005b8b518110156105fd578a818151811061053757610536614910565b5b60200260200101518561054a919061469a565b94506105ca8c828151811061056257610561614910565b5b60200260200101516105aa606461059c8f868151811061058557610584614910565b5b602002602001015189612ab190919063ffffffff16565b612b2c90919063ffffffff16565b8c84815181106105bd576105bc614910565b5b6020026020010151612b76565b508282815181106105de576105dd614910565b5b60200260200101818152505080806105f590614869565b91505061051b565b5060648414610641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063890614303565b60405180910390fd5b8a8183965096509650505050509450945094915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60608085518751146106e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106df906143a3565b60405180910390fd5b600080885167ffffffffffffffff8111156107065761070561493f565b5b6040519080825280602002602001820160405280156107345781602001602082028036833780820191505090505b5090506000600367ffffffffffffffff8111156107545761075361493f565b5b6040519080825280602002602001820160405280156107825781602001602082028036833780820191505090505b509050868160008151811061079a57610799614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061080957610808614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060005b8a51811015610a955789818151811061086257610861614910565b5b602002602001015184610875919061469a565b93508a818151811061088a57610889614910565b5b6020026020010151826002815181106108a6576108a5614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f61095e60646109508f878151811061093957610938614910565b5b60200260200101518d612ab190919063ffffffff16565b612b2c90919063ffffffff16565b856040518363ffffffff1660e01b815260040161097c9291906144a3565b60006040518083038186803b15801561099457600080fd5b505afa1580156109a8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109d19190613a22565b90506000610a5e610a346103e8610a268e87815181106109f4576109f3614910565b5b602002602001015186600281518110610a1057610a0f614910565b5b6020026020010151612ab190919063ffffffff16565b612b2c90919063ffffffff16565b83600281518110610a4857610a47614910565b5b6020026020010151612dbe90919063ffffffff16565b905080858481518110610a7457610a73614910565b5b60200260200101818152505050508080610a8d90614869565b915050610846565b5060648314610ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad090614283565b60405180910390fd5b8982945094505050509550959350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7190614243565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600267ffffffffffffffff811115610c3f57610c3e61493f565b5b604051908082528060200260200182016040528015610c6d5781602001602082028036833780820191505090505b5090508481600081518110610c8557610c84614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610cf457610cf3614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f86846040518363ffffffff1660e01b8152600401610d8b9291906144a3565b60006040518083038186803b158015610da357600080fd5b505afa158015610db7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610de09190613a22565b90506000610e53610e296103e8610e1b8886600181518110610e0557610e04614910565b5b6020026020010151612ab190919063ffffffff16565b612b2c90919063ffffffff16565b83600181518110610e3d57610e3c614910565b5b6020026020010151612dbe90919063ffffffff16565b90508093505050509392505050565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906142a3565b60405180910390fd5b84600360000160146101000a81548161ffff021916908361ffff16021790555083600360000160166101000a81548161ffff021916908361ffff16021790555082600360000160186101000a81548161ffff021916908361ffff160217905550816003600001601a6101000a81548161ffff021916908361ffff16021790555060019050949350505050565b600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d906142a3565b60405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a906142a3565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60608373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a906142e3565b60405180910390fd5b85518751148015611245575084518651145b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b906142c3565b60405180910390fd5b6000839050600080895167ffffffffffffffff8111156112a7576112a661493f565b5b6040519080825280602002602001820160405280156112d55781602001602082028036833780820191505090505b5090506113053330878673ffffffffffffffffffffffffffffffffffffffff16612e08909392919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000876040518363ffffffff1660e01b815260040161136092919061407f565b602060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b29190613a6b565b6113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e8906143e3565b60405180910390fd5b6000600367ffffffffffffffff81111561140e5761140d61493f565b5b60405190808252806020026020018201604052801561143c5781602001602082028036833780820191505090505b509050868160008151811061145457611453614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816001815181106114c3576114c2614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060005b8b51811015611755578a818151811061151c5761151b614910565b5b60200260200101518461152f919061469a565b93506064841115611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90614323565b60405180910390fd5b8b818151811061158857611587614910565b5b6020026020010151826002815181106115a4576115a3614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061162060646116128e85815181106115fb576115fa614910565b5b60200260200101518b612ab190919063ffffffff16565b612b2c90919063ffffffff16565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166338ed1739838e868151811061167457611673614910565b5b602002602001015187336104b04261168c919061469a565b6040518663ffffffff1660e01b81526004016116ac95949392919061451f565b600060405180830381600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117039190613a22565b90508060018151811061171957611718614910565b5b602002602001015185848151811061173457611733614910565b5b6020026020010181815250505050808061174d90614869565b915050611500565b5060648314611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090614183565b60405180910390fd5b819450505050509695505050505050565b60008060005b8551811015611832576118128682815181106117cf576117ce614910565b5b60200260200101518683815181106117ea576117e9614910565b5b602002602001015186848151811061180557611804614910565b5b6020026020010151610c21565b8261181d919061469a565b9150808061182a90614869565b9150506117b0565b50809150509392505050565b600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c8906142a3565b60405180910390fd5b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161191c90614018565b60006040518083038185875af1925050503d8060008114611959576040519150601f19603f3d011682016040523d82523d6000602084013e61195e565b606091505b50509050806119a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611999906141a3565b60405180910390fd5b50565b60008173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e906142e3565b60405180910390fd5b83518551148015611a29575082518351145b611a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5f906142c3565b60405180910390fd5b6000600267ffffffffffffffff811115611a8557611a8461493f565b5b604051908082528060200260200182016040528015611ab35781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000081600181518110611aeb57611aea614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600047905060005b8751811015611fc257878181518110611b4957611b48614910565b5b602002602001015183600081518110611b6557611b64614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000888281518110611bb457611bb3614910565b5b602002602001015190508073ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b8681518110611bef57611bee614910565b5b60200260200101516040518463ffffffff1660e01b8152600401611c1593929190614048565b602060405180830381600087803b158015611c2f57600080fd5b505af1158015611c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c679190613a6b565b611ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9d906141a3565b60405180910390fd5b6000888381518110611cbb57611cba614910565b5b602002602001015190508173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cfe919061402d565b60206040518083038186803b158015611d1657600080fd5b505afa158015611d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4e9190613aff565b811115611de1578173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d8e919061402d565b60206040518083038186803b158015611da657600080fd5b505afa158015611dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dde9190613aff565b90505b8173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000000000000000000000000000000000000000000000836040518363ffffffff1660e01b8152600401611e3c92919061407f565b602060405180830381600087803b158015611e5657600080fd5b505af1158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190613a6b565b611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490614423565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318cbafe5828a8681518110611f1d57611f1c614910565b5b602002602001015188306104b042611f35919061469a565b6040518663ffffffff1660e01b8152600401611f5595949392919061451f565b600060405180830381600087803b158015611f6f57600080fd5b505af1158015611f83573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611fac9190613a22565b5050508080611fba90614869565b915050611b2d565b50600080611fe3611fdc8447612dbe90919063ffffffff16565b8a516129b6565b915091503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146120d75760006120268288612e91565b905060008773ffffffffffffffffffffffffffffffffffffffff168260405161204e90614018565b60006040518083038185875af1925050503d806000811461208b576040519150601f19603f3d011682016040523d82523d6000602084013e612090565b606091505b50509050806120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb90614343565b60405180910390fd5b50505b60003373ffffffffffffffffffffffffffffffffffffffff16836040516120fd90614018565b60006040518083038185875af1925050503d806000811461213a576040519150601f19603f3d011682016040523d82523d6000602084013e61213f565b606091505b5050905080612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a906141c3565b60405180910390fd5b8295505050505050949350505050565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f906142a3565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f90614203565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b600080600080600360000160149054906101000a900461ffff16600360000160169054906101000a900461ffff16600360000160189054906101000a900461ffff166003600001601a9054906101000a900461ffff16935093509350935090919293565b60608173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614156123b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ae906142e3565b60405180910390fd5b835185511480156123c9575082518451145b612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff906142c3565b60405180910390fd5b6000806124163488516129b6565b91509150600080885167ffffffffffffffff8111156124385761243761493f565b5b6040519080825280602002602001820160405280156124665781602001602082028036833780820191505090505b5090506000600267ffffffffffffffff8111156124865761248561493f565b5b6040519080825280602002602001820160405280156124b45781602001602082028036833780820191505090505b5090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106124ec576124eb614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060005b8a5181101561277d5789818151811061254557612544614910565b5b602002602001015184612558919061469a565b9350606484111561259e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259590614403565b60405180910390fd5b8a81815181106125b1576125b0614910565b5b6020026020010151826001815181106125cd576125cc614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000612649606461263b8d858151811061262457612623614910565b5b60200260200101518a612ab190919063ffffffff16565b612b2c90919063ffffffff16565b905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637ff36ab5838d868151811061269d5761269c614910565b5b602002602001015187336104b0426126b5919061469a565b6040518663ffffffff1660e01b81526004016126d494939291906144d3565b6000604051808303818588803b1580156126ed57600080fd5b505af1158015612701573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f8201168201806040525081019061272b9190613a22565b90508060018151811061274157612740614910565b5b602002602001015185848151811061275c5761275b614910565b5b6020026020010181815250505050808061277590614869565b915050612529565b50606483146127c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b890614183565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146128b15760006128008589612e91565b905060008873ffffffffffffffffffffffffffffffffffffffff168260405161282890614018565b60006040518083038185875af1925050503d8060008114612865576040519150601f19603f3d011682016040523d82523d6000602084013e61286a565b606091505b50509050806128ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a590614343565b60405180910390fd5b50505b8195505050505050949350505050565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294d906142a3565b60405180910390fd5b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060006129e5600360000160169054906101000a900461ffff1661ffff1685612ab190919063ffffffff16565b9050600360000160169054906101000a900461ffff1661ffff1681612a0a919061477b565b9050600360000160149054906101000a900461ffff1661ffff1681612a2f919061469a565b90506003600001601a9054906101000a900461ffff1661ffff16811115612a6b576003600001601a9054906101000a900461ffff1661ffff1690505b612a92612710612a848388612ab190919063ffffffff16565b612b2c90919063ffffffff16565b9150612aa78286612dbe90919063ffffffff16565b9250509250929050565b600080831415612ac45760009050612b26565b60008284612ad29190614721565b9050828482612ae191906146f0565b14612b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1890614263565b60405180910390fd5b809150505b92915050565b6000612b6e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613000565b905092915050565b600060606000600267ffffffffffffffff811115612b9757612b9661493f565b5b604051908082528060200260200182016040528015612bc55781602001602082028036833780820191505090505b5090507f000000000000000000000000000000000000000000000000000000000000000081600081518110612bfd57612bfc614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508581600181518110612c4c57612c4b614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d06ca61f87846040518363ffffffff1660e01b8152600401612ce39291906144a3565b60006040518083038186803b158015612cfb57600080fd5b505afa158015612d0f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612d389190613a22565b90506000612dab612d816103e8612d738986600181518110612d5d57612d5c614910565b5b6020026020010151612ab190919063ffffffff16565b612b2c90919063ffffffff16565b83600181518110612d9557612d94614910565b5b6020026020010151612dbe90919063ffffffff16565b9050808394509450505050935093915050565b6000612e0083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613063565b905092915050565b612e8b846323b872dd60e01b858585604051602401612e2993929190614048565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130c7565b50505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1690614383565b60405180910390fd5b6000612f5f612710612f51600360000160189054906101000a900461ffff1661ffff1687612ab190919063ffffffff16565b612b2c90919063ffffffff16565b9050612fb381600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461318e90919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508091505092915050565b60008083118290613047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303e9190614161565b60405180910390fd5b506000838561305691906146f0565b9050809150509392505050565b60008383111582906130ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a29190614161565b60405180910390fd5b50600083856130ba919061477b565b9050809150509392505050565b6000613129826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131ec9092919063ffffffff16565b905060008151111561318957808060200190518101906131499190613a6b565b613188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317f906143c3565b60405180910390fd5b5b505050565b600080828461319d919061469a565b9050838110156131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d9906141e3565b60405180910390fd5b8091505092915050565b60606131fb8484600085613204565b90509392505050565b606082471015613249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324090614223565b60405180910390fd5b61325285613318565b613291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328890614363565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132ba9190614001565b60006040518083038185875af1925050503d80600081146132f7576040519150601f19603f3d011682016040523d82523d6000602084013e6132fc565b606091505b509150915061330c82828661332b565b92505050949350505050565b600080823b905060008111915050919050565b6060831561333b5782905061338b565b60008351111561334e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133829190614161565b60405180910390fd5b9392505050565b60006133a56133a08461459e565b614579565b905080838252602082019050828560208602820111156133c8576133c7614973565b5b60005b858110156133f857816133de88826134e2565b8452602084019350602083019250506001810190506133cb565b5050509392505050565b6000613415613410846145ca565b614579565b9050808382526020820190508285602086028201111561343857613437614973565b5b60005b85811015613468578161344e88826135ab565b84526020840193506020830192505060018101905061343b565b5050509392505050565b6000613485613480846145ca565b614579565b905080838252602082019050828560208602820111156134a8576134a7614973565b5b60005b858110156134d857816134be88826135c0565b8452602084019350602083019250506001810190506134ab565b5050509392505050565b6000813590506134f181614e72565b92915050565b600082601f83011261350c5761350b61496e565b5b813561351c848260208601613392565b91505092915050565b600082601f83011261353a5761353961496e565b5b813561354a848260208601613402565b91505092915050565b600082601f8301126135685761356761496e565b5b8151613578848260208601613472565b91505092915050565b60008151905061359081614e89565b92915050565b6000813590506135a581614ea0565b92915050565b6000813590506135ba81614eb7565b92915050565b6000815190506135cf81614eb7565b92915050565b6000602082840312156135eb576135ea61497d565b5b60006135f9848285016134e2565b91505092915050565b60008060006060848603121561361b5761361a61497d565b5b6000613629868287016134e2565b935050602061363a868287016135ab565b925050604061364b868287016135ab565b9150509250925092565b60008060006060848603121561366e5761366d61497d565b5b600084013567ffffffffffffffff81111561368c5761368b614978565b5b613698868287016134f7565b935050602084013567ffffffffffffffff8111156136b9576136b8614978565b5b6136c586828701613525565b925050604084013567ffffffffffffffff8111156136e6576136e5614978565b5b6136f286828701613525565b9150509250925092565b600080600080608085870312156137165761371561497d565b5b600085013567ffffffffffffffff81111561373457613733614978565b5b613740878288016134f7565b945050602085013567ffffffffffffffff81111561376157613760614978565b5b61376d87828801613525565b935050604085013567ffffffffffffffff81111561378e5761378d614978565b5b61379a87828801613525565b92505060606137ab878288016134e2565b91505092959194509250565b60008060008060008060c087890312156137d4576137d361497d565b5b600087013567ffffffffffffffff8111156137f2576137f1614978565b5b6137fe89828a016134f7565b965050602087013567ffffffffffffffff81111561381f5761381e614978565b5b61382b89828a01613525565b955050604087013567ffffffffffffffff81111561384c5761384b614978565b5b61385889828a01613525565b945050606061386989828a016134e2565b935050608061387a89828a016134e2565b92505060a061388b89828a016135ab565b9150509295509295509295565b600080600080600060a086880312156138b4576138b361497d565b5b600086013567ffffffffffffffff8111156138d2576138d1614978565b5b6138de888289016134f7565b955050602086013567ffffffffffffffff8111156138ff576138fe614978565b5b61390b88828901613525565b945050604086013567ffffffffffffffff81111561392c5761392b614978565b5b61393888828901613525565b9350506060613949888289016134e2565b925050608061395a888289016135ab565b9150509295509295909350565b600080600080608085870312156139815761398061497d565b5b600085013567ffffffffffffffff81111561399f5761399e614978565b5b6139ab878288016134f7565b945050602085013567ffffffffffffffff8111156139cc576139cb614978565b5b6139d887828801613525565b935050604085013567ffffffffffffffff8111156139f9576139f8614978565b5b613a0587828801613525565b9250506060613a16878288016135ab565b91505092959194509250565b600060208284031215613a3857613a3761497d565b5b600082015167ffffffffffffffff811115613a5657613a55614978565b5b613a6284828501613553565b91505092915050565b600060208284031215613a8157613a8061497d565b5b6000613a8f84828501613581565b91505092915050565b60008060008060808587031215613ab257613ab161497d565b5b6000613ac087828801613596565b9450506020613ad187828801613596565b9350506040613ae287828801613596565b9250506060613af387828801613596565b91505092959194509250565b600060208284031215613b1557613b1461497d565b5b6000613b23848285016135c0565b91505092915050565b6000613b388383613b5c565b60208301905092915050565b6000613b508383613fe3565b60208301905092915050565b613b65816147af565b82525050565b613b74816147af565b82525050565b6000613b8582614616565b613b8f818561465c565b9350613b9a836145f6565b8060005b83811015613bcb578151613bb28882613b2c565b9750613bbd83614642565b925050600181019050613b9e565b5085935050505092915050565b6000613be382614621565b613bed818561466d565b9350613bf883614606565b8060005b83811015613c29578151613c108882613b44565b9750613c1b8361464f565b925050600181019050613bfc565b5085935050505092915050565b613c3f816147c1565b82525050565b6000613c508261462c565b613c5a818561467e565b9350613c6a818560208601614805565b80840191505092915050565b6000613c8182614637565b613c8b8185614689565b9350613c9b818560208601614805565b613ca481614982565b840191505092915050565b6000613cbc601a83614689565b9150613cc782614993565b602082019050919050565b6000613cdf601a83614689565b9150613cea826149bc565b602082019050919050565b6000613d02602583614689565b9150613d0d826149e5565b604082019050919050565b6000613d25601b83614689565b9150613d3082614a34565b602082019050919050565b6000613d48602b83614689565b9150613d5382614a5d565b604082019050919050565b6000613d6b602683614689565b9150613d7682614aac565b604082019050919050565b6000613d8e601c83614689565b9150613d9982614afb565b602082019050919050565b6000613db1602183614689565b9150613dbc82614b24565b604082019050919050565b6000613dd4601c83614689565b9150613ddf82614b73565b602082019050919050565b6000613df7600b83614689565b9150613e0282614b9c565b602082019050919050565b6000613e1a601e83614689565b9150613e2582614bc5565b602082019050919050565b6000613e3d602b83614689565b9150613e4882614bee565b604082019050919050565b6000613e60601d83614689565b9150613e6b82614c3d565b602082019050919050565b6000613e83601783614689565b9150613e8e82614c66565b602082019050919050565b6000613ea6602683614689565b9150613eb182614c8f565b604082019050919050565b6000613ec960008361467e565b9150613ed482614cde565b600082019050919050565b6000613eec601d83614689565b9150613ef782614ce1565b602082019050919050565b6000613f0f602483614689565b9150613f1a82614d0a565b604082019050919050565b6000613f32601e83614689565b9150613f3d82614d59565b602082019050919050565b6000613f55602a83614689565b9150613f6082614d82565b604082019050919050565b6000613f78602283614689565b9150613f8382614dd1565b604082019050919050565b6000613f9b601883614689565b9150613fa682614e20565b602082019050919050565b6000613fbe601b83614689565b9150613fc982614e49565b602082019050919050565b613fdd816147cd565b82525050565b613fec816147fb565b82525050565b613ffb816147fb565b82525050565b600061400d8284613c45565b915081905092915050565b600061402382613ebc565b9150819050919050565b60006020820190506140426000830184613b6b565b92915050565b600060608201905061405d6000830186613b6b565b61406a6020830185613b6b565b6140776040830184613ff2565b949350505050565b60006040820190506140946000830185613b6b565b6140a16020830184613ff2565b9392505050565b600060408201905081810360008301526140c28185613b7a565b905081810360208301526140d68184613bd8565b90509392505050565b600060608201905081810360008301526140f98186613b7a565b9050818103602083015261410d8185613bd8565b905061411c6040830184613ff2565b949350505050565b6000602082019050818103600083015261413e8184613bd8565b905092915050565b600060208201905061415b6000830184613c36565b92915050565b6000602082019050818103600083015261417b8184613c76565b905092915050565b6000602082019050818103600083015261419c81613caf565b9050919050565b600060208201905081810360008301526141bc81613cd2565b9050919050565b600060208201905081810360008301526141dc81613cf5565b9050919050565b600060208201905081810360008301526141fc81613d18565b9050919050565b6000602082019050818103600083015261421c81613d3b565b9050919050565b6000602082019050818103600083015261423c81613d5e565b9050919050565b6000602082019050818103600083015261425c81613d81565b9050919050565b6000602082019050818103600083015261427c81613da4565b9050919050565b6000602082019050818103600083015261429c81613dc7565b9050919050565b600060208201905081810360008301526142bc81613dea565b9050919050565b600060208201905081810360008301526142dc81613e0d565b9050919050565b600060208201905081810360008301526142fc81613e30565b9050919050565b6000602082019050818103600083015261431c81613e53565b9050919050565b6000602082019050818103600083015261433c81613e76565b9050919050565b6000602082019050818103600083015261435c81613e99565b9050919050565b6000602082019050818103600083015261437c81613edf565b9050919050565b6000602082019050818103600083015261439c81613f02565b9050919050565b600060208201905081810360008301526143bc81613f25565b9050919050565b600060208201905081810360008301526143dc81613f48565b9050919050565b600060208201905081810360008301526143fc81613f6b565b9050919050565b6000602082019050818103600083015261441c81613f8e565b9050919050565b6000602082019050818103600083015261443c81613fb1565b9050919050565b60006080820190506144586000830187613fd4565b6144656020830186613fd4565b6144726040830185613fd4565b61447f6060830184613fd4565b95945050505050565b600060208201905061449d6000830184613ff2565b92915050565b60006040820190506144b86000830185613ff2565b81810360208301526144ca8184613b7a565b90509392505050565b60006080820190506144e86000830187613ff2565b81810360208301526144fa8186613b7a565b90506145096040830185613b6b565b6145166060830184613ff2565b95945050505050565b600060a0820190506145346000830188613ff2565b6145416020830187613ff2565b81810360408301526145538186613b7a565b90506145626060830185613b6b565b61456f6080830184613ff2565b9695505050505050565b6000614583614594565b905061458f8282614838565b919050565b6000604051905090565b600067ffffffffffffffff8211156145b9576145b861493f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156145e5576145e461493f565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006146a5826147fb565b91506146b0836147fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146e5576146e46148b2565b5b828201905092915050565b60006146fb826147fb565b9150614706836147fb565b925082614716576147156148e1565b5b828204905092915050565b600061472c826147fb565b9150614737836147fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147705761476f6148b2565b5b828202905092915050565b6000614786826147fb565b9150614791836147fb565b9250828210156147a4576147a36148b2565b5b828203905092915050565b60006147ba826147db565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015614823578082015181840152602081019050614808565b83811115614832576000848401525b50505050565b61484182614982565b810181811067ffffffffffffffff821117156148605761485f61493f565b5b80604052505050565b6000614874826147fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148a7576148a66148b2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d756c7469737761703a2050657263656e74206e6f7420313030000000000000600082015250565b7f4d756c7469737761703a205472616e73666572206661696c6564000000000000600082015250565b7f4d756c7469737761703a204661696c656420746f2073656e642073776170206f60008201527f7574707574000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f4d756c7469737761703a206e65774f776e65722073657420746f20746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a206e6f742070656e64696e67206f776e657200000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a20706f72746f6c696f206e6f74203130302500000000600082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f4d756c7469737761703a20496e7075742064617461206d69736d617463680000600082015250565b7f4d756c7469737761703a2072656665727265722063616e6e6f74206265207a6560008201527f726f206164647265737373000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a20706f7274666f6c696f206e6f742031303025000000600082015250565b7f4d756c7469737761703a20457863656564656420313030000000000000000000600082015250565b7f4d756c7469737761703a204661696c656420746f2073656e642072656665727260008201527f616c206665650000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4d756c7469737761703a204e6f74207369676e6564207570206173207265666560008201527f7272657200000000000000000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a206d69736d6174636820696e70757420646174610000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a20556e697377617020617070726f76616c206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a20457863656564656420313030250000000000000000600082015250565b7f4d756c7469737761703a20417070726f76616c206661696c7572650000000000600082015250565b614e7b816147af565b8114614e8657600080fd5b50565b614e92816147c1565b8114614e9d57600080fd5b50565b614ea9816147cd565b8114614eb457600080fd5b50565b614ec0816147fb565b8114614ecb57600080fd5b5056fea2646970667358221220bea169c6b5239498ae43fcdfffafd321e573edcb6c9d18322b6e9fbd7c3af4d764736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101025760003560e01c8063893d20e811610095578063c6526a8a11610064578063c6526a8a14610366578063f2fde38b14610396578063f70d9362146103d3578063f997e62a14610401578063fefa9bb11461043157610109565b8063893d20e8146102aa57806389f90d7f146102d55780638bdb86d21461031257806391a3cd871461034f57610109565b8063636565ff116100d1578063636565ff146101dc5780636d02b2ad14610219578063715018a6146102565780637a00e2e31461026d57610109565b80631d5cfebf1461010b57806321118d571461014a57806321ad78b3146101875780634e71e0c8146101c557610109565b3661010957005b005b34801561011757600080fd5b50610132600480360381019061012d9190613967565b61046e565b604051610141939291906140df565b60405180910390f35b34801561015657600080fd5b50610171600480360381019061016c91906135d5565b610658565b60405161017e9190614488565b60405180910390f35b34801561019357600080fd5b506101ae60048036038101906101a99190613898565b6106a1565b6040516101bc9291906140a8565b60405180910390f35b3480156101d157600080fd5b506101da610aec565b005b3480156101e857600080fd5b5061020360048036038101906101fe9190613602565b610c21565b6040516102109190614488565b60405180910390f35b34801561022557600080fd5b50610240600480360381019061023b9190613a98565b610e62565b60405161024d9190614146565b60405180910390f35b34801561026257600080fd5b5061026b610f83565b005b34801561027957600080fd5b50610294600480360381019061028f91906135d5565b61109e565b6040516102a19190614146565b60405180910390f35b3480156102b657600080fd5b506102bf611194565b6040516102cc919061402d565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f791906137b7565b6111c1565b6040516103099190614124565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190613655565b6117aa565b6040516103469190614488565b60405180910390f35b34801561035b57600080fd5b5061036461183e565b005b610380600480360381019061037b91906136fc565b6119a5565b60405161038d9190614488565b60405180910390f35b3480156103a257600080fd5b506103bd60048036038101906103b891906135d5565b612193565b6040516103ca9190614146565b60405180910390f35b3480156103df57600080fd5b506103e86122e1565b6040516103f89493929190614443565b60405180910390f35b61041b600480360381019061041691906136fc565b612345565b6040516104289190614124565b60405180910390f35b34801561043d57600080fd5b50610458600480360381019061045391906135d5565b6128c1565b6040516104659190614146565b60405180910390f35b606080600085518751146104b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104ae906143a3565b60405180910390fd5b600080806104c6878b516129b6565b9150915060008a5167ffffffffffffffff8111156104e7576104e661493f565b5b6040519080825280602002602001820160405280156105155781602001602082028036833780820191505090505b50905060005b8b518110156105fd578a818151811061053757610536614910565b5b60200260200101518561054a919061469a565b94506105ca8c828151811061056257610561614910565b5b60200260200101516105aa606461059c8f868151811061058557610584614910565b5b602002602001015189612ab190919063ffffffff16565b612b2c90919063ffffffff16565b8c84815181106105bd576105bc614910565b5b6020026020010151612b76565b508282815181106105de576105dd614910565b5b60200260200101818152505080806105f590614869565b91505061051b565b5060648414610641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063890614303565b60405180910390fd5b8a8183965096509650505050509450945094915050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60608085518751146106e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106df906143a3565b60405180910390fd5b600080885167ffffffffffffffff8111156107065761070561493f565b5b6040519080825280602002602001820160405280156107345781602001602082028036833780820191505090505b5090506000600367ffffffffffffffff8111156107545761075361493f565b5b6040519080825280602002602001820160405280156107825781602001602082028036833780820191505090505b509050868160008151811061079a57610799614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28160018151811061080957610808614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060005b8a51811015610a955789818151811061086257610861614910565b5b602002602001015184610875919061469a565b93508a818151811061088a57610889614910565b5b6020026020010151826002815181106108a6576108a5614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f61095e60646109508f878151811061093957610938614910565b5b60200260200101518d612ab190919063ffffffff16565b612b2c90919063ffffffff16565b856040518363ffffffff1660e01b815260040161097c9291906144a3565b60006040518083038186803b15801561099457600080fd5b505afa1580156109a8573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906109d19190613a22565b90506000610a5e610a346103e8610a268e87815181106109f4576109f3614910565b5b602002602001015186600281518110610a1057610a0f614910565b5b6020026020010151612ab190919063ffffffff16565b612b2c90919063ffffffff16565b83600281518110610a4857610a47614910565b5b6020026020010151612dbe90919063ffffffff16565b905080858481518110610a7457610a73614910565b5b60200260200101818152505050508080610a8d90614869565b915050610846565b5060648314610ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad090614283565b60405180910390fd5b8982945094505050509550959350505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7190614243565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600267ffffffffffffffff811115610c3f57610c3e61493f565b5b604051908082528060200260200182016040528015610c6d5781602001602082028036833780820191505090505b5090508481600081518110610c8557610c84614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110610cf457610cf3614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f86846040518363ffffffff1660e01b8152600401610d8b9291906144a3565b60006040518083038186803b158015610da357600080fd5b505afa158015610db7573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190610de09190613a22565b90506000610e53610e296103e8610e1b8886600181518110610e0557610e04614910565b5b6020026020010151612ab190919063ffffffff16565b612b2c90919063ffffffff16565b83600181518110610e3d57610e3c614910565b5b6020026020010151612dbe90919063ffffffff16565b90508093505050509392505050565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee906142a3565b60405180910390fd5b84600360000160146101000a81548161ffff021916908361ffff16021790555083600360000160166101000a81548161ffff021916908361ffff16021790555082600360000160186101000a81548161ffff021916908361ffff160217905550816003600001601a6101000a81548161ffff021916908361ffff16021790555060019050949350505050565b600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100d906142a3565b60405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600360000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a906142a3565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60608373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122a906142e3565b60405180910390fd5b85518751148015611245575084518651145b611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b906142c3565b60405180910390fd5b6000839050600080895167ffffffffffffffff8111156112a7576112a661493f565b5b6040519080825280602002602001820160405280156112d55781602001602082028036833780820191505090505b5090506113053330878673ffffffffffffffffffffffffffffffffffffffff16612e08909392919063ffffffff16565b8273ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d876040518363ffffffff1660e01b815260040161136092919061407f565b602060405180830381600087803b15801561137a57600080fd5b505af115801561138e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113b29190613a6b565b6113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e8906143e3565b60405180910390fd5b6000600367ffffffffffffffff81111561140e5761140d61493f565b5b60405190808252806020026020018201604052801561143c5781602001602082028036833780820191505090505b509050868160008151811061145457611453614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106114c3576114c2614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060005b8b51811015611755578a818151811061151c5761151b614910565b5b60200260200101518461152f919061469a565b93506064841115611575576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156c90614323565b60405180910390fd5b8b818151811061158857611587614910565b5b6020026020010151826002815181106115a4576115a3614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600061162060646116128e85815181106115fb576115fa614910565b5b60200260200101518b612ab190919063ffffffff16565b612b2c90919063ffffffff16565b905060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff166338ed1739838e868151811061167457611673614910565b5b602002602001015187336104b04261168c919061469a565b6040518663ffffffff1660e01b81526004016116ac95949392919061451f565b600060405180830381600087803b1580156116c657600080fd5b505af11580156116da573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906117039190613a22565b90508060018151811061171957611718614910565b5b602002602001015185848151811061173457611733614910565b5b6020026020010181815250505050808061174d90614869565b915050611500565b5060648314611799576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179090614183565b60405180910390fd5b819450505050509695505050505050565b60008060005b8551811015611832576118128682815181106117cf576117ce614910565b5b60200260200101518683815181106117ea576117e9614910565b5b602002602001015186848151811061180557611804614910565b5b6020026020010151610c21565b8261181d919061469a565b9150808061182a90614869565b9150506117b0565b50809150509392505050565b600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c8906142a3565b60405180910390fd5b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff164760405161191c90614018565b60006040518083038185875af1925050503d8060008114611959576040519150601f19603f3d011682016040523d82523d6000602084013e61195e565b606091505b50509050806119a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611999906141a3565b60405180910390fd5b50565b60008173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415611a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0e906142e3565b60405180910390fd5b83518551148015611a29575082518351145b611a68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5f906142c3565b60405180910390fd5b6000600267ffffffffffffffff811115611a8557611a8461493f565b5b604051908082528060200260200182016040528015611ab35781602001602082028036833780820191505090505b5090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611aeb57611aea614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600047905060005b8751811015611fc257878181518110611b4957611b48614910565b5b602002602001015183600081518110611b6557611b64614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000888281518110611bb457611bb3614910565b5b602002602001015190508073ffffffffffffffffffffffffffffffffffffffff166323b872dd33308b8681518110611bef57611bee614910565b5b60200260200101516040518463ffffffff1660e01b8152600401611c1593929190614048565b602060405180830381600087803b158015611c2f57600080fd5b505af1158015611c43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c679190613a6b565b611ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9d906141a3565b60405180910390fd5b6000888381518110611cbb57611cba614910565b5b602002602001015190508173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611cfe919061402d565b60206040518083038186803b158015611d1657600080fd5b505afa158015611d2a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4e9190613aff565b811115611de1578173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611d8e919061402d565b60206040518083038186803b158015611da657600080fd5b505afa158015611dba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dde9190613aff565b90505b8173ffffffffffffffffffffffffffffffffffffffff1663095ea7b37f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d836040518363ffffffff1660e01b8152600401611e3c92919061407f565b602060405180830381600087803b158015611e5657600080fd5b505af1158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190613a6b565b611ecd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ec490614423565b60405180910390fd5b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff166318cbafe5828a8681518110611f1d57611f1c614910565b5b602002602001015188306104b042611f35919061469a565b6040518663ffffffff1660e01b8152600401611f5595949392919061451f565b600060405180830381600087803b158015611f6f57600080fd5b505af1158015611f83573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611fac9190613a22565b5050508080611fba90614869565b915050611b2d565b50600080611fe3611fdc8447612dbe90919063ffffffff16565b8a516129b6565b915091503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16146120d75760006120268288612e91565b905060008773ffffffffffffffffffffffffffffffffffffffff168260405161204e90614018565b60006040518083038185875af1925050503d806000811461208b576040519150601f19603f3d011682016040523d82523d6000602084013e612090565b606091505b50509050806120d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120cb90614343565b60405180910390fd5b50505b60003373ffffffffffffffffffffffffffffffffffffffff16836040516120fd90614018565b60006040518083038185875af1925050503d806000811461213a576040519150601f19603f3d011682016040523d82523d6000602084013e61213f565b606091505b5050905080612183576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217a906141c3565b60405180910390fd5b8295505050505050949350505050565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612228576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221f906142a3565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff161415612298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228f90614203565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b600080600080600360000160149054906101000a900461ffff16600360000160169054906101000a900461ffff16600360000160189054906101000a900461ffff166003600001601a9054906101000a900461ffff16935093509350935090919293565b60608173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614156123b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ae906142e3565b60405180910390fd5b835185511480156123c9575082518451145b612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff906142c3565b60405180910390fd5b6000806124163488516129b6565b91509150600080885167ffffffffffffffff8111156124385761243761493f565b5b6040519080825280602002602001820160405280156124665781602001602082028036833780820191505090505b5090506000600267ffffffffffffffff8111156124865761248561493f565b5b6040519080825280602002602001820160405280156124b45781602001602082028036833780820191505090505b5090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816000815181106124ec576124eb614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060005b8a5181101561277d5789818151811061254557612544614910565b5b602002602001015184612558919061469a565b9350606484111561259e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259590614403565b60405180910390fd5b8a81815181106125b1576125b0614910565b5b6020026020010151826001815181106125cd576125cc614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000612649606461263b8d858151811061262457612623614910565b5b60200260200101518a612ab190919063ffffffff16565b612b2c90919063ffffffff16565b905060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff16637ff36ab5838d868151811061269d5761269c614910565b5b602002602001015187336104b0426126b5919061469a565b6040518663ffffffff1660e01b81526004016126d494939291906144d3565b6000604051808303818588803b1580156126ed57600080fd5b505af1158015612701573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f8201168201806040525081019061272b9190613a22565b90508060018151811061274157612740614910565b5b602002602001015185848151811061275c5761275b614910565b5b6020026020010181815250505050808061277590614869565b915050612529565b50606483146127c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b890614183565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146128b15760006128008589612e91565b905060008873ffffffffffffffffffffffffffffffffffffffff168260405161282890614018565b60006040518083038185875af1925050503d8060008114612865576040519150601f19603f3d011682016040523d82523d6000602084013e61286a565b606091505b50509050806128ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a590614343565b60405180910390fd5b50505b8195505050505050949350505050565b6000600360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294d906142a3565b60405180910390fd5b60018060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555060019050919050565b60008060006129e5600360000160169054906101000a900461ffff1661ffff1685612ab190919063ffffffff16565b9050600360000160169054906101000a900461ffff1661ffff1681612a0a919061477b565b9050600360000160149054906101000a900461ffff1661ffff1681612a2f919061469a565b90506003600001601a9054906101000a900461ffff1661ffff16811115612a6b576003600001601a9054906101000a900461ffff1661ffff1690505b612a92612710612a848388612ab190919063ffffffff16565b612b2c90919063ffffffff16565b9150612aa78286612dbe90919063ffffffff16565b9250509250929050565b600080831415612ac45760009050612b26565b60008284612ad29190614721565b9050828482612ae191906146f0565b14612b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1890614263565b60405180910390fd5b809150505b92915050565b6000612b6e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613000565b905092915050565b600060606000600267ffffffffffffffff811115612b9757612b9661493f565b5b604051908082528060200260200182016040528015612bc55781602001602082028036833780820191505090505b5090507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600081518110612bfd57612bfc614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508581600181518110612c4c57612c4b614910565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060007f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663d06ca61f87846040518363ffffffff1660e01b8152600401612ce39291906144a3565b60006040518083038186803b158015612cfb57600080fd5b505afa158015612d0f573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190612d389190613a22565b90506000612dab612d816103e8612d738986600181518110612d5d57612d5c614910565b5b6020026020010151612ab190919063ffffffff16565b612b2c90919063ffffffff16565b83600181518110612d9557612d94614910565b5b6020026020010151612dbe90919063ffffffff16565b9050808394509450505050935093915050565b6000612e0083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613063565b905092915050565b612e8b846323b872dd60e01b858585604051602401612e2993929190614048565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506130c7565b50505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1690614383565b60405180910390fd5b6000612f5f612710612f51600360000160189054906101000a900461ffff1661ffff1687612ab190919063ffffffff16565b612b2c90919063ffffffff16565b9050612fb381600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461318e90919063ffffffff16565b600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508091505092915050565b60008083118290613047576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161303e9190614161565b60405180910390fd5b506000838561305691906146f0565b9050809150509392505050565b60008383111582906130ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a29190614161565b60405180910390fd5b50600083856130ba919061477b565b9050809150509392505050565b6000613129826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166131ec9092919063ffffffff16565b905060008151111561318957808060200190518101906131499190613a6b565b613188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161317f906143c3565b60405180910390fd5b5b505050565b600080828461319d919061469a565b9050838110156131e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d9906141e3565b60405180910390fd5b8091505092915050565b60606131fb8484600085613204565b90509392505050565b606082471015613249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161324090614223565b60405180910390fd5b61325285613318565b613291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161328890614363565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132ba9190614001565b60006040518083038185875af1925050503d80600081146132f7576040519150601f19603f3d011682016040523d82523d6000602084013e6132fc565b606091505b509150915061330c82828661332b565b92505050949350505050565b600080823b905060008111915050919050565b6060831561333b5782905061338b565b60008351111561334e5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133829190614161565b60405180910390fd5b9392505050565b60006133a56133a08461459e565b614579565b905080838252602082019050828560208602820111156133c8576133c7614973565b5b60005b858110156133f857816133de88826134e2565b8452602084019350602083019250506001810190506133cb565b5050509392505050565b6000613415613410846145ca565b614579565b9050808382526020820190508285602086028201111561343857613437614973565b5b60005b85811015613468578161344e88826135ab565b84526020840193506020830192505060018101905061343b565b5050509392505050565b6000613485613480846145ca565b614579565b905080838252602082019050828560208602820111156134a8576134a7614973565b5b60005b858110156134d857816134be88826135c0565b8452602084019350602083019250506001810190506134ab565b5050509392505050565b6000813590506134f181614e72565b92915050565b600082601f83011261350c5761350b61496e565b5b813561351c848260208601613392565b91505092915050565b600082601f83011261353a5761353961496e565b5b813561354a848260208601613402565b91505092915050565b600082601f8301126135685761356761496e565b5b8151613578848260208601613472565b91505092915050565b60008151905061359081614e89565b92915050565b6000813590506135a581614ea0565b92915050565b6000813590506135ba81614eb7565b92915050565b6000815190506135cf81614eb7565b92915050565b6000602082840312156135eb576135ea61497d565b5b60006135f9848285016134e2565b91505092915050565b60008060006060848603121561361b5761361a61497d565b5b6000613629868287016134e2565b935050602061363a868287016135ab565b925050604061364b868287016135ab565b9150509250925092565b60008060006060848603121561366e5761366d61497d565b5b600084013567ffffffffffffffff81111561368c5761368b614978565b5b613698868287016134f7565b935050602084013567ffffffffffffffff8111156136b9576136b8614978565b5b6136c586828701613525565b925050604084013567ffffffffffffffff8111156136e6576136e5614978565b5b6136f286828701613525565b9150509250925092565b600080600080608085870312156137165761371561497d565b5b600085013567ffffffffffffffff81111561373457613733614978565b5b613740878288016134f7565b945050602085013567ffffffffffffffff81111561376157613760614978565b5b61376d87828801613525565b935050604085013567ffffffffffffffff81111561378e5761378d614978565b5b61379a87828801613525565b92505060606137ab878288016134e2565b91505092959194509250565b60008060008060008060c087890312156137d4576137d361497d565b5b600087013567ffffffffffffffff8111156137f2576137f1614978565b5b6137fe89828a016134f7565b965050602087013567ffffffffffffffff81111561381f5761381e614978565b5b61382b89828a01613525565b955050604087013567ffffffffffffffff81111561384c5761384b614978565b5b61385889828a01613525565b945050606061386989828a016134e2565b935050608061387a89828a016134e2565b92505060a061388b89828a016135ab565b9150509295509295509295565b600080600080600060a086880312156138b4576138b361497d565b5b600086013567ffffffffffffffff8111156138d2576138d1614978565b5b6138de888289016134f7565b955050602086013567ffffffffffffffff8111156138ff576138fe614978565b5b61390b88828901613525565b945050604086013567ffffffffffffffff81111561392c5761392b614978565b5b61393888828901613525565b9350506060613949888289016134e2565b925050608061395a888289016135ab565b9150509295509295909350565b600080600080608085870312156139815761398061497d565b5b600085013567ffffffffffffffff81111561399f5761399e614978565b5b6139ab878288016134f7565b945050602085013567ffffffffffffffff8111156139cc576139cb614978565b5b6139d887828801613525565b935050604085013567ffffffffffffffff8111156139f9576139f8614978565b5b613a0587828801613525565b9250506060613a16878288016135ab565b91505092959194509250565b600060208284031215613a3857613a3761497d565b5b600082015167ffffffffffffffff811115613a5657613a55614978565b5b613a6284828501613553565b91505092915050565b600060208284031215613a8157613a8061497d565b5b6000613a8f84828501613581565b91505092915050565b60008060008060808587031215613ab257613ab161497d565b5b6000613ac087828801613596565b9450506020613ad187828801613596565b9350506040613ae287828801613596565b9250506060613af387828801613596565b91505092959194509250565b600060208284031215613b1557613b1461497d565b5b6000613b23848285016135c0565b91505092915050565b6000613b388383613b5c565b60208301905092915050565b6000613b508383613fe3565b60208301905092915050565b613b65816147af565b82525050565b613b74816147af565b82525050565b6000613b8582614616565b613b8f818561465c565b9350613b9a836145f6565b8060005b83811015613bcb578151613bb28882613b2c565b9750613bbd83614642565b925050600181019050613b9e565b5085935050505092915050565b6000613be382614621565b613bed818561466d565b9350613bf883614606565b8060005b83811015613c29578151613c108882613b44565b9750613c1b8361464f565b925050600181019050613bfc565b5085935050505092915050565b613c3f816147c1565b82525050565b6000613c508261462c565b613c5a818561467e565b9350613c6a818560208601614805565b80840191505092915050565b6000613c8182614637565b613c8b8185614689565b9350613c9b818560208601614805565b613ca481614982565b840191505092915050565b6000613cbc601a83614689565b9150613cc782614993565b602082019050919050565b6000613cdf601a83614689565b9150613cea826149bc565b602082019050919050565b6000613d02602583614689565b9150613d0d826149e5565b604082019050919050565b6000613d25601b83614689565b9150613d3082614a34565b602082019050919050565b6000613d48602b83614689565b9150613d5382614a5d565b604082019050919050565b6000613d6b602683614689565b9150613d7682614aac565b604082019050919050565b6000613d8e601c83614689565b9150613d9982614afb565b602082019050919050565b6000613db1602183614689565b9150613dbc82614b24565b604082019050919050565b6000613dd4601c83614689565b9150613ddf82614b73565b602082019050919050565b6000613df7600b83614689565b9150613e0282614b9c565b602082019050919050565b6000613e1a601e83614689565b9150613e2582614bc5565b602082019050919050565b6000613e3d602b83614689565b9150613e4882614bee565b604082019050919050565b6000613e60601d83614689565b9150613e6b82614c3d565b602082019050919050565b6000613e83601783614689565b9150613e8e82614c66565b602082019050919050565b6000613ea6602683614689565b9150613eb182614c8f565b604082019050919050565b6000613ec960008361467e565b9150613ed482614cde565b600082019050919050565b6000613eec601d83614689565b9150613ef782614ce1565b602082019050919050565b6000613f0f602483614689565b9150613f1a82614d0a565b604082019050919050565b6000613f32601e83614689565b9150613f3d82614d59565b602082019050919050565b6000613f55602a83614689565b9150613f6082614d82565b604082019050919050565b6000613f78602283614689565b9150613f8382614dd1565b604082019050919050565b6000613f9b601883614689565b9150613fa682614e20565b602082019050919050565b6000613fbe601b83614689565b9150613fc982614e49565b602082019050919050565b613fdd816147cd565b82525050565b613fec816147fb565b82525050565b613ffb816147fb565b82525050565b600061400d8284613c45565b915081905092915050565b600061402382613ebc565b9150819050919050565b60006020820190506140426000830184613b6b565b92915050565b600060608201905061405d6000830186613b6b565b61406a6020830185613b6b565b6140776040830184613ff2565b949350505050565b60006040820190506140946000830185613b6b565b6140a16020830184613ff2565b9392505050565b600060408201905081810360008301526140c28185613b7a565b905081810360208301526140d68184613bd8565b90509392505050565b600060608201905081810360008301526140f98186613b7a565b9050818103602083015261410d8185613bd8565b905061411c6040830184613ff2565b949350505050565b6000602082019050818103600083015261413e8184613bd8565b905092915050565b600060208201905061415b6000830184613c36565b92915050565b6000602082019050818103600083015261417b8184613c76565b905092915050565b6000602082019050818103600083015261419c81613caf565b9050919050565b600060208201905081810360008301526141bc81613cd2565b9050919050565b600060208201905081810360008301526141dc81613cf5565b9050919050565b600060208201905081810360008301526141fc81613d18565b9050919050565b6000602082019050818103600083015261421c81613d3b565b9050919050565b6000602082019050818103600083015261423c81613d5e565b9050919050565b6000602082019050818103600083015261425c81613d81565b9050919050565b6000602082019050818103600083015261427c81613da4565b9050919050565b6000602082019050818103600083015261429c81613dc7565b9050919050565b600060208201905081810360008301526142bc81613dea565b9050919050565b600060208201905081810360008301526142dc81613e0d565b9050919050565b600060208201905081810360008301526142fc81613e30565b9050919050565b6000602082019050818103600083015261431c81613e53565b9050919050565b6000602082019050818103600083015261433c81613e76565b9050919050565b6000602082019050818103600083015261435c81613e99565b9050919050565b6000602082019050818103600083015261437c81613edf565b9050919050565b6000602082019050818103600083015261439c81613f02565b9050919050565b600060208201905081810360008301526143bc81613f25565b9050919050565b600060208201905081810360008301526143dc81613f48565b9050919050565b600060208201905081810360008301526143fc81613f6b565b9050919050565b6000602082019050818103600083015261441c81613f8e565b9050919050565b6000602082019050818103600083015261443c81613fb1565b9050919050565b60006080820190506144586000830187613fd4565b6144656020830186613fd4565b6144726040830185613fd4565b61447f6060830184613fd4565b95945050505050565b600060208201905061449d6000830184613ff2565b92915050565b60006040820190506144b86000830185613ff2565b81810360208301526144ca8184613b7a565b90509392505050565b60006080820190506144e86000830187613ff2565b81810360208301526144fa8186613b7a565b90506145096040830185613b6b565b6145166060830184613ff2565b95945050505050565b600060a0820190506145346000830188613ff2565b6145416020830187613ff2565b81810360408301526145538186613b7a565b90506145626060830185613b6b565b61456f6080830184613ff2565b9695505050505050565b6000614583614594565b905061458f8282614838565b919050565b6000604051905090565b600067ffffffffffffffff8211156145b9576145b861493f565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156145e5576145e461493f565b5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006146a5826147fb565b91506146b0836147fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146e5576146e46148b2565b5b828201905092915050565b60006146fb826147fb565b9150614706836147fb565b925082614716576147156148e1565b5b828204905092915050565b600061472c826147fb565b9150614737836147fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147705761476f6148b2565b5b828202905092915050565b6000614786826147fb565b9150614791836147fb565b9250828210156147a4576147a36148b2565b5b828203905092915050565b60006147ba826147db565b9050919050565b60008115159050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015614823578082015181840152602081019050614808565b83811115614832576000848401525b50505050565b61484182614982565b810181811067ffffffffffffffff821117156148605761485f61493f565b5b80604052505050565b6000614874826147fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148a7576148a66148b2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d756c7469737761703a2050657263656e74206e6f7420313030000000000000600082015250565b7f4d756c7469737761703a205472616e73666572206661696c6564000000000000600082015250565b7f4d756c7469737761703a204661696c656420746f2073656e642073776170206f60008201527f7574707574000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f4d756c7469737761703a206e65774f776e65722073657420746f20746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a206e6f742070656e64696e67206f776e657200000000600082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a20706f72746f6c696f206e6f74203130302500000000600082015250565b7f4e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f4d756c7469737761703a20496e7075742064617461206d69736d617463680000600082015250565b7f4d756c7469737761703a2072656665727265722063616e6e6f74206265207a6560008201527f726f206164647265737373000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a20706f7274666f6c696f206e6f742031303025000000600082015250565b7f4d756c7469737761703a20457863656564656420313030000000000000000000600082015250565b7f4d756c7469737761703a204661696c656420746f2073656e642072656665727260008201527f616c206665650000000000000000000000000000000000000000000000000000602082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f4d756c7469737761703a204e6f74207369676e6564207570206173207265666560008201527f7272657200000000000000000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a206d69736d6174636820696e70757420646174610000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a20556e697377617020617070726f76616c206661696c60008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d756c7469737761703a20457863656564656420313030250000000000000000600082015250565b7f4d756c7469737761703a20417070726f76616c206661696c7572650000000000600082015250565b614e7b816147af565b8114614e8657600080fd5b50565b614e92816147c1565b8114614e9d57600080fd5b50565b614ea9816147cd565b8114614eb457600080fd5b50565b614ec0816147fb565b8114614ecb57600080fd5b5056fea2646970667358221220bea169c6b5239498ae43fcdfffafd321e573edcb6c9d18322b6e9fbd7c3af4d764736f6c63430008070033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,478.51 | 0.0196 | $68.32 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.