Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- RatMilk
- Optimization enabled
- false
- Compiler version
- v0.8.4+commit.c7e474f2
- EVM Version
- default
- Verified at
- 2022-04-11T01:21:07.836696Z
Constructor Arguments
[
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "tokensSwapped",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "ethReceived",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "tokensIntoLiqudity",
"type": "uint256"
}
],
"name": "SwapAndLiquify",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "SwapAndLiquifyEnabledUpdated",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address[]",
"name": "path",
"type": "address[]"
}
],
"name": "SwapETHForTokens",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"indexed": false,
"internalType": "address[]",
"name": "path",
"type": "address[]"
}
],
"name": "SwapTokensForETH",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "addMarketPair",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newRouterAddress",
"type": "address"
}
],
"name": "changeRouterVersion",
"outputs": [
{
"internalType": "address",
"name": "newPairAddress",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "newValue",
"type": "bool"
}
],
"name": "enableDisableWalletLimit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newLiquidityTax",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newteamTax",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newtreasuryTax",
"type": "uint256"
}
],
"name": "setBuyTaxes",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newLiquidityShare",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newteamShare",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newtreasuryShare",
"type": "uint256"
}
],
"name": "setDistributionSettings",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bool",
"name": "newValue",
"type": "bool"
}
],
"name": "setIsExcludedFromFees",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "holder",
"type": "address"
},
{
"internalType": "bool",
"name": "exempt",
"type": "bool"
}
],
"name": "setIsTxLimitExcept",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "holder",
"type": "address"
},
{
"internalType": "bool",
"name": "exempt",
"type": "bool"
}
],
"name": "setIsWalletLimitExcept",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "maxTxAmount",
"type": "uint256"
}
],
"name": "setMaxTxAmount",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newLimit",
"type": "uint256"
}
],
"name": "setNumTokensBeforeSwap",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newLiquidityTax",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newteamTax",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "newtreasuryTax",
"type": "uint256"
}
],
"name": "setSellTaxes",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "newValue",
"type": "bool"
}
],
"name": "setSwapAndLiquifyByLimitOnly",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_enabled",
"type": "bool"
}
],
"name": "setSwapAndLiquifyEnabled",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newAddress",
"type": "address"
}
],
"name": "setteamWalletAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newAddress",
"type": "address"
}
],
"name": "settreasuryWalletAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "newLimit",
"type": "uint256"
}
],
"name": "setWalletLimit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
},
{
"inputs": [],
"name": "waiveOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "_liquidityShares",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_maxTxAmount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_taxTotal",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_teamShares",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_totalDistributionShares",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_treasuryShares",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "_walletMax",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "checkWalletLimit",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "deadAddress",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getCirculatingSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isExcludedFromFees",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isMarketPair",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isTxLimitExcept",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "isWalletLimitExcept",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "swapAndLiquifyByLimitOnly",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "swapAndLiquifyEnabled",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "uniswapPair",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "uniswapV2Router",
"outputs": [
{
"internalType": "contract IUniswapV2Router02",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
}
]
Contract source code
/* Website : https://ratmilk.finance/ Telegram Group : https://t.me/ratmilkPortal Total Supply : 100,000,000 RATM Max wallet : 2,000,000 RATM */ // SPDX-License-Identifier: Unlicensed pragma solidity ^0.8.4; abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return payable(msg.sender); } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } library SafeMath { function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by 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; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } library Address { function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } 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"); } 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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } contract Ownable is Context { address private _owner; address private _previousOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function waiveOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } 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); } 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; } contract RatMilk is Context, IERC20, Ownable { using SafeMath for uint256; using Address for address; string private _name = "RatMilk"; string private _symbol = "RATM"; uint8 private _decimals = 9; address payable private teamWalletAddress = payable(0xd1E4FF0287f4097F39Bc1d5774E439DD37B38C75); address payable private treasuryWalletAddress = payable(0xd1E4FF0287f4097F39Bc1d5774E439DD37B38C75); address public immutable deadAddress = 0x000000000000000000000000000000000000dEaD; mapping (address => uint256) _balances; mapping (address => mapping (address => uint256)) private _allowances; mapping (address => bool) public isExcludedFromFees; mapping (address => bool) public isWalletLimitExcept; mapping (address => bool) public isTxLimitExcept; mapping (address => bool) public isMarketPair; uint256 private _buyLiquidityFees = 1; uint256 private _buyteamFees = 7; uint256 private _buytreasuryFees = 7; uint256 private _sellLiquidityFees = 1; uint256 private _sellteamFees = 7; uint256 private _selltreasuryFees = 7; uint256 public _liquidityShares = 2; uint256 public _teamShares = 10; uint256 public _treasuryShares = 10; uint256 private _totalTaxIfBuying = 15; uint256 private _totalTaxIfSelling = 15; uint256 public _taxTotal = 8; uint256 public _totalDistributionShares = 22; uint256 private _totalSupply = 100* 10**5 * 10**9; uint256 public _maxTxAmount = 100 * 10**5 * 10**9; uint256 public _walletMax = 2 * 10**5 * 10**9; uint256 private minimumTokensBeforeSwap = 250 * 10**9; IUniswapV2Router02 public uniswapV2Router; address public uniswapPair; bool inSwapAndLiquify; bool public swapAndLiquifyEnabled = true; bool public swapAndLiquifyByLimitOnly = false; bool public checkWalletLimit = true; event SwapAndLiquifyEnabledUpdated(bool enabled); event SwapAndLiquify( uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity ); event SwapETHForTokens( uint256 amountIn, address[] path ); event SwapTokensForETH( uint256 amountIn, address[] path ); modifier lockTheSwap { inSwapAndLiquify = true; _; inSwapAndLiquify = false; } constructor () { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x9D2E30C2FB648BeE307EDBaFDb461b09DF79516C); uniswapPair = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); uniswapV2Router = _uniswapV2Router; _allowances[address(this)][address(uniswapV2Router)] = _totalSupply; isExcludedFromFees[owner()] = true; isExcludedFromFees[address(this)] = true; _totalTaxIfBuying = _buyLiquidityFees.add(_buyteamFees).add(_buytreasuryFees); _totalTaxIfSelling = _sellLiquidityFees.add(_sellteamFees).add(_selltreasuryFees); _totalDistributionShares = _liquidityShares.add(_teamShares).add(_treasuryShares); isWalletLimitExcept[owner()] = true; isWalletLimitExcept[address(uniswapPair)] = true; isWalletLimitExcept[address(this)] = true; isTxLimitExcept[owner()] = true; isTxLimitExcept[address(this)] = true; isMarketPair[address(uniswapPair)] = true; _balances[_msgSender()] = _totalSupply; emit Transfer(address(0), _msgSender(), _totalSupply); } function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns (uint8) { return _decimals; } function totalSupply() public view override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function allowance(address owner, address spender) public view override returns (uint256) { return _allowances[owner][spender]; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function _approve(address owner, address spender, uint256 amount) private { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function addMarketPair(address account) public onlyOwner { isMarketPair[account] = true; } function setIsTxLimitExcept(address holder, bool exempt) external onlyOwner { isTxLimitExcept[holder] = exempt; } function setIsExcludedFromFees(address account, bool newValue) public onlyOwner { isExcludedFromFees[account] = newValue; } function setBuyTaxes(uint256 newLiquidityTax, uint256 newteamTax, uint256 newtreasuryTax) external onlyOwner() { _buyLiquidityFees = newLiquidityTax; _buyteamFees = newteamTax; _buytreasuryFees = newtreasuryTax; _totalTaxIfBuying = _buyLiquidityFees.add(_buyteamFees).add(_buytreasuryFees); } function setSellTaxes(uint256 newLiquidityTax, uint256 newteamTax, uint256 newtreasuryTax) external onlyOwner() { _sellLiquidityFees = newLiquidityTax; _sellteamFees = newteamTax; _selltreasuryFees = newtreasuryTax; _totalTaxIfSelling = _sellLiquidityFees.add(_sellteamFees).add(_selltreasuryFees); } function setDistributionSettings(uint256 newLiquidityShare, uint256 newteamShare, uint256 newtreasuryShare) external onlyOwner() { _liquidityShares = newLiquidityShare; _teamShares = newteamShare; _treasuryShares = newtreasuryShare; _totalDistributionShares = _liquidityShares.add(_teamShares).add(_treasuryShares); } function setMaxTxAmount(uint256 maxTxAmount) external onlyOwner() { require(maxTxAmount <= (100 * 10**5 * 10**9), "Max wallet should be less or euqal to 4% totalSupply"); _maxTxAmount = maxTxAmount; } function enableDisableWalletLimit(bool newValue) external onlyOwner { checkWalletLimit = newValue; } function setIsWalletLimitExcept(address holder, bool exempt) external onlyOwner { isWalletLimitExcept[holder] = exempt; } function setWalletLimit(uint256 newLimit) external onlyOwner { _walletMax = newLimit; } function setNumTokensBeforeSwap(uint256 newLimit) external onlyOwner() { minimumTokensBeforeSwap = newLimit; } function setteamWalletAddress(address newAddress) external onlyOwner() { teamWalletAddress = payable(newAddress); } function settreasuryWalletAddress(address newAddress) external onlyOwner() { treasuryWalletAddress = payable(newAddress); } function setSwapAndLiquifyEnabled(bool _enabled) public onlyOwner { swapAndLiquifyEnabled = _enabled; emit SwapAndLiquifyEnabledUpdated(_enabled); } function setSwapAndLiquifyByLimitOnly(bool newValue) public onlyOwner { swapAndLiquifyByLimitOnly = newValue; } function getCirculatingSupply() public view returns (uint256) { return _totalSupply.sub(balanceOf(deadAddress)); } function transferToAddressETH(address payable recipient, uint256 amount) private { recipient.transfer(amount); } function changeRouterVersion(address newRouterAddress) public onlyOwner returns(address newPairAddress) { IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(newRouterAddress); newPairAddress = IUniswapV2Factory(_uniswapV2Router.factory()).getPair(address(this), _uniswapV2Router.WETH()); if(newPairAddress == address(0)) //Create If Doesnt exist { newPairAddress = IUniswapV2Factory(_uniswapV2Router.factory()) .createPair(address(this), _uniswapV2Router.WETH()); } uniswapPair = newPairAddress; //Set new pair address uniswapV2Router = _uniswapV2Router; //Set new router address isWalletLimitExcept[address(uniswapPair)] = true; isMarketPair[address(uniswapPair)] = true; } //to recieve ETH from uniswapV2Router when swaping receive() external payable {} function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } function _transfer(address sender, address recipient, uint256 amount) private returns (bool) { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); if(inSwapAndLiquify) { return _basicTransfer(sender, recipient, amount); } else { if(!isTxLimitExcept[sender] && !isTxLimitExcept[recipient]) { require(amount <= _maxTxAmount, "Transfer amount exceeds the maxTxAmount."); } uint256 contractTokenBalance = balanceOf(address(this)); bool overMinimumTokenBalance = contractTokenBalance >= minimumTokensBeforeSwap; if (overMinimumTokenBalance && !inSwapAndLiquify && !isMarketPair[sender] && swapAndLiquifyEnabled) { if(swapAndLiquifyByLimitOnly) contractTokenBalance = minimumTokensBeforeSwap; swapAndLiquify(contractTokenBalance); } _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); uint256 finalAmount = (isExcludedFromFees[sender] || isExcludedFromFees[recipient]) ? amount : takeFee(sender, recipient, amount); if(checkWalletLimit && !isWalletLimitExcept[recipient]) require(balanceOf(recipient).add(finalAmount) <= _walletMax); _balances[recipient] = _balances[recipient].add(finalAmount); emit Transfer(sender, recipient, finalAmount); return true; } } function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) { _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); return true; } function swapAndLiquify(uint256 tAmount) private lockTheSwap { uint256 tokensForLP = tAmount.mul(_liquidityShares).div(_totalDistributionShares).div(2); uint256 tokensForSwap = tAmount.sub(tokensForLP); swapTokensForEth(tokensForSwap); uint256 amountReceived = address(this).balance; uint256 totalETHFee = _totalDistributionShares.sub(_liquidityShares.div(2)); uint256 amountETHLiquidity = amountReceived.mul(_liquidityShares).div(totalETHFee).div(2); uint256 amountETHtreasury = amountReceived.mul(_treasuryShares).div(totalETHFee); uint256 amountETHteam = amountReceived.sub(amountETHLiquidity).sub(amountETHtreasury); if(amountETHteam > 0) transferToAddressETH(teamWalletAddress, amountETHteam); if(amountETHtreasury > 0) transferToAddressETH(treasuryWalletAddress, amountETHtreasury); if(amountETHLiquidity > 0 && tokensForLP > 0) addLiquidity(tokensForLP, amountETHLiquidity); } function swapTokensForEth(uint256 tokenAmount) private { // generate the uniswap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); _approve(address(this), address(uniswapV2Router), tokenAmount); // make the swap uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), // The contract block.timestamp ); emit SwapTokensForETH(tokenAmount, path); } function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(uniswapV2Router), tokenAmount); // add the liquidity uniswapV2Router.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable owner(), block.timestamp ); } function takeFee(address sender, address recipient, uint256 amount) internal returns (uint256) { uint256 feeAmount = 0; if(isMarketPair[sender]) { feeAmount = amount.mul(_totalTaxIfBuying).div(100); } else if(isMarketPair[recipient]) { feeAmount = amount.mul(_totalTaxIfSelling).div(100); } if(feeAmount > 0) { _balances[address(this)] = _balances[address(this)].add(feeAmount); emit Transfer(sender, address(this), feeAmount); } return amount.sub(feeAmount); } }
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SwapAndLiquify","inputs":[{"type":"uint256","name":"tokensSwapped","internalType":"uint256","indexed":false},{"type":"uint256","name":"ethReceived","internalType":"uint256","indexed":false},{"type":"uint256","name":"tokensIntoLiqudity","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SwapAndLiquifyEnabledUpdated","inputs":[{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"SwapETHForTokens","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256","indexed":false},{"type":"address[]","name":"path","internalType":"address[]","indexed":false}],"anonymous":false},{"type":"event","name":"SwapTokensForETH","inputs":[{"type":"uint256","name":"amountIn","internalType":"uint256","indexed":false},{"type":"address[]","name":"path","internalType":"address[]","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_liquidityShares","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_taxTotal","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_teamShares","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_totalDistributionShares","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_treasuryShares","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_walletMax","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addMarketPair","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"newPairAddress","internalType":"address"}],"name":"changeRouterVersion","inputs":[{"type":"address","name":"newRouterAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"checkWalletLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"deadAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"decreaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"subtractedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableDisableWalletLimit","inputs":[{"type":"bool","name":"newValue","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"increaseAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"addedValue","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromFees","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isMarketPair","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isTxLimitExcept","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isWalletLimitExcept","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBuyTaxes","inputs":[{"type":"uint256","name":"newLiquidityTax","internalType":"uint256"},{"type":"uint256","name":"newteamTax","internalType":"uint256"},{"type":"uint256","name":"newtreasuryTax","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributionSettings","inputs":[{"type":"uint256","name":"newLiquidityShare","internalType":"uint256"},{"type":"uint256","name":"newteamShare","internalType":"uint256"},{"type":"uint256","name":"newtreasuryShare","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsExcludedFromFees","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"bool","name":"newValue","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExcept","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsWalletLimitExcept","inputs":[{"type":"address","name":"holder","internalType":"address"},{"type":"bool","name":"exempt","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxTxAmount","inputs":[{"type":"uint256","name":"maxTxAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setNumTokensBeforeSwap","inputs":[{"type":"uint256","name":"newLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSellTaxes","inputs":[{"type":"uint256","name":"newLiquidityTax","internalType":"uint256"},{"type":"uint256","name":"newteamTax","internalType":"uint256"},{"type":"uint256","name":"newtreasuryTax","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAndLiquifyByLimitOnly","inputs":[{"type":"bool","name":"newValue","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapAndLiquifyEnabled","inputs":[{"type":"bool","name":"_enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWalletLimit","inputs":[{"type":"uint256","name":"newLimit","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setteamWalletAddress","inputs":[{"type":"address","name":"newAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"settreasuryWalletAddress","inputs":[{"type":"address","name":"newAddress","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapAndLiquifyByLimitOnly","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapAndLiquifyEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"uniswapPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapV2Router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"waiveOwnership","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x6080604052600436106102975760003560e01c8063914eb66a1161015a578063bb47cc0c116100c1578063dd62ed3e1161007a578063dd62ed3e14610a4b578063e207a92b14610a88578063ec28438a14610ab1578063f1d5f51714610ada578063f2fde38b14610b03578063f872858a14610b2c5761029e565b8063bb47cc0c1461093b578063c2d4640e14610966578063c49b9a801461098f578063c816841b146109b8578063d6efa6c0146109e3578063da00097d14610a205761029e565b8063a5d69d1f11610113578063a5d69d1f1461082f578063a661df9114610858578063a9059cbb14610881578063adf18693146108be578063b1a8abdb146108e7578063b6d2e516146109125761029e565b8063914eb66a14610731578063915ebb0b1461074857806395d89b41146107715780639e3fa3231461079c578063a08e671f146107c7578063a457c2d7146107f25761029e565b806339509351116101fe57806370a08231116101b757806370a082311461061f5780637d1db4a51461065c578063807c2d9c1461068757806389e4e243146106b25780638da5cb5b146106dd578063906d6235146107085761029e565b806339509351146104d75780633b97084a146105145780633ecad2711461053d5780634a74bb021461057a5780634fbee193146105a55780635881f3ef146105e25761029e565b80631870517a116102505780631870517a146103c757806323b872dd146103f05780632563ae831461042d57806327c8f835146104565780632b112e4914610481578063313ce567146104ac5761029e565b8063044466d1146102a357806306fdde03146102e0578063087332141461030b578063095ea7b3146103345780631694505e1461037157806318160ddd1461039c5761029e565b3661029e57005b600080fd5b3480156102af57600080fd5b506102ca60048036038101906102c59190613b38565b610b57565b6040516102d79190614098565b60405180910390f35b3480156102ec57600080fd5b506102f5610b77565b60405161030291906140ce565b60405180910390f35b34801561031757600080fd5b50610332600480360381019061032d9190613cdf565b610c09565b005b34801561034057600080fd5b5061035b60048036038101906103569190613c51565b610ce9565b6040516103689190614098565b60405180910390f35b34801561037d57600080fd5b50610386610d07565b60405161039391906140b3565b60405180910390f35b3480156103a857600080fd5b506103b1610d2d565b6040516103be9190614230565b60405180910390f35b3480156103d357600080fd5b506103ee60048036038101906103e99190613cdf565b610d37565b005b3480156103fc57600080fd5b5061041760048036038101906104129190613bc6565b610e17565b6040516104249190614098565b60405180910390f35b34801561043957600080fd5b50610454600480360381019061044f9190613c8d565b610ef1565b005b34801561046257600080fd5b5061046b610fa3565b6040516104789190613ff3565b60405180910390f35b34801561048d57600080fd5b50610496610fc7565b6040516104a39190614230565b60405180910390f35b3480156104b857600080fd5b506104c161100b565b6040516104ce91906142d5565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190613c51565b611022565b60405161050b9190614098565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190613cb6565b6110d5565b005b34801561054957600080fd5b50610564600480360381019061055f9190613b38565b611174565b6040516105719190614098565b60405180910390f35b34801561058657600080fd5b5061058f611194565b60405161059c9190614098565b60405180910390f35b3480156105b157600080fd5b506105cc60048036038101906105c79190613b38565b6111a7565b6040516105d99190614098565b60405180910390f35b3480156105ee57600080fd5b5061060960048036038101906106049190613b38565b6111c7565b6040516106169190613ff3565b60405180910390f35b34801561062b57600080fd5b5061064660048036038101906106419190613b38565b611725565b6040516106539190614230565b60405180910390f35b34801561066857600080fd5b5061067161176e565b60405161067e9190614230565b60405180910390f35b34801561069357600080fd5b5061069c611774565b6040516106a99190614230565b60405180910390f35b3480156106be57600080fd5b506106c761177a565b6040516106d49190614230565b60405180910390f35b3480156106e957600080fd5b506106f2611780565b6040516106ff9190613ff3565b60405180910390f35b34801561071457600080fd5b5061072f600480360381019061072a9190613c15565b6117a9565b005b34801561073d57600080fd5b50610746611899565b005b34801561075457600080fd5b5061076f600480360381019061076a9190613b38565b6119ec565b005b34801561077d57600080fd5b50610786611ac5565b60405161079391906140ce565b60405180910390f35b3480156107a857600080fd5b506107b1611b57565b6040516107be9190614230565b60405180910390f35b3480156107d357600080fd5b506107dc611b5d565b6040516107e99190614230565b60405180910390f35b3480156107fe57600080fd5b5061081960048036038101906108149190613c51565b611b63565b6040516108269190614098565b60405180910390f35b34801561083b57600080fd5b5061085660048036038101906108519190613c8d565b611c30565b005b34801561086457600080fd5b5061087f600480360381019061087a9190613b38565b611ce2565b005b34801561088d57600080fd5b506108a860048036038101906108a39190613c51565b611dbb565b6040516108b59190614098565b60405180910390f35b3480156108ca57600080fd5b506108e560048036038101906108e09190613c15565b611dda565b005b3480156108f357600080fd5b506108fc611eca565b6040516109099190614230565b60405180910390f35b34801561091e57600080fd5b5061093960048036038101906109349190613c15565b611ed0565b005b34801561094757600080fd5b50610950611fc0565b60405161095d9190614230565b60405180910390f35b34801561097257600080fd5b5061098d60048036038101906109889190613cdf565b611fc6565b005b34801561099b57600080fd5b506109b660048036038101906109b19190613c8d565b6120a6565b005b3480156109c457600080fd5b506109cd61218f565b6040516109da9190613ff3565b60405180910390f35b3480156109ef57600080fd5b50610a0a6004803603810190610a059190613b38565b6121b5565b604051610a179190614098565b60405180910390f35b348015610a2c57600080fd5b50610a356121d5565b604051610a429190614098565b60405180910390f35b348015610a5757600080fd5b50610a726004803603810190610a6d9190613b8a565b6121e8565b604051610a7f9190614230565b60405180910390f35b348015610a9457600080fd5b50610aaf6004803603810190610aaa9190613b38565b61226f565b005b348015610abd57600080fd5b50610ad86004803603810190610ad39190613cb6565b61235f565b005b348015610ae657600080fd5b50610b016004803603810190610afc9190613cb6565b612448565b005b348015610b0f57600080fd5b50610b2a6004803603810190610b259190613b38565b6124e7565b005b348015610b3857600080fd5b50610b416126a9565b604051610b4e9190614098565b60405180910390f35b600a6020528060005260406000206000915054906101000a900460ff1681565b606060028054610b8690614518565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb290614518565b8015610bff5780601f10610bd457610100808354040283529160200191610bff565b820191906000526020600020905b815481529060010190602001808311610be257829003601f168201915b5050505050905090565b610c1161271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c95906141d0565b60405180910390fd5b82600f819055508160108190555080601181905550610cde601154610cd0601054600f546126bc90919063ffffffff16565b6126bc90919063ffffffff16565b601681905550505050565b6000610cfd610cf661271a565b8484612722565b6001905092915050565b601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601954905090565b610d3f61271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc3906141d0565b60405180910390fd5b82600c8190555081600d8190555080600e81905550610e0c600e54610dfe600d54600c546126bc90919063ffffffff16565b6126bc90919063ffffffff16565b601581905550505050565b6000610e248484846128ed565b50610ee684610e3161271a565b610ee1856040518060600160405280602881526020016148f860289139600760008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610e9761271a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ed29092919063ffffffff16565b612722565b600190509392505050565b610ef961271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d906141d0565b60405180910390fd5b80601e60176101000a81548160ff02191690831515021790555050565b7f000000000000000000000000000000000000000000000000000000000000dead81565b6000611006610ff57f000000000000000000000000000000000000000000000000000000000000dead611725565b601954612f3690919063ffffffff16565b905090565b6000600460009054906101000a900460ff16905090565b60006110cb61102f61271a565b846110c6856007600061104061271a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126bc90919063ffffffff16565b612722565b6001905092915050565b6110dd61271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461116a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611161906141d0565b60405180910390fd5b80601c8190555050565b600b6020528060005260406000206000915054906101000a900460ff1681565b601e60159054906101000a900460ff1681565b60086020528060005260406000206000915054906101000a900460ff1681565b60006111d161271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461125e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611255906141d0565b60405180910390fd5b60008290508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156112a957600080fd5b505afa1580156112bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e19190613b61565b73ffffffffffffffffffffffffffffffffffffffff1663e6a43905308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561134357600080fd5b505afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b9190613b61565b6040518363ffffffff1660e01b815260040161139892919061400e565b60206040518083038186803b1580156113b057600080fd5b505afa1580156113c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e89190613b61565b9150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115a9578073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b15801561146557600080fd5b505afa158015611479573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061149d9190613b61565b73ffffffffffffffffffffffffffffffffffffffff1663c9c65396308373ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156114ff57600080fd5b505afa158015611513573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115379190613b61565b6040518363ffffffff1660e01b815260040161155492919061400e565b602060405180830381600087803b15801561156e57600080fd5b505af1158015611582573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a69190613b61565b91505b81601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160096000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b6000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050919050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601a5481565b601b5481565b60145481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117b161271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461183e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611835906141d0565b60405180910390fd5b80600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6118a161271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461192e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611925906141d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6119f461271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a78906141d0565b60405180910390fd5b80600460016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b606060038054611ad490614518565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0090614518565b8015611b4d5780601f10611b2257610100808354040283529160200191611b4d565b820191906000526020600020905b815481529060010190602001808311611b3057829003601f168201915b5050505050905090565b60125481565b60185481565b6000611c26611b7061271a565b84611c21856040518060600160405280602581526020016149206025913960076000611b9a61271a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ed29092919063ffffffff16565b612722565b6001905092915050565b611c3861271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611cc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbc906141d0565b60405180910390fd5b80601e60166101000a81548160ff02191690831515021790555050565b611cea61271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6e906141d0565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611dcf611dc861271a565b84846128ed565b506001905092915050565b611de261271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e66906141d0565b60405180910390fd5b80600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60135481565b611ed861271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5c906141d0565b60405180910390fd5b80600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60175481565b611fce61271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461205b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612052906141d0565b60405180910390fd5b82601281905550816013819055508060148190555061209b60145461208d6013546012546126bc90919063ffffffff16565b6126bc90919063ffffffff16565b601881905550505050565b6120ae61271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461213b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612132906141d0565b60405180910390fd5b80601e60156101000a81548160ff0219169083151502179055507f53726dfcaf90650aa7eb35524f4d3220f07413c8d6cb404cc8c18bf5591bc159816040516121849190614098565b60405180910390a150565b601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60096020528060005260406000206000915054906101000a900460ff1681565b601e60169054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61227761271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612304576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122fb906141d0565b60405180910390fd5b6001600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61236761271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123eb906141d0565b60405180910390fd5b662386f26fc1000081111561243e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243590614110565b60405180910390fd5b80601a8190555050565b61245061271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d4906141d0565b60405180910390fd5b80601b8190555050565b6124ef61271a565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461257c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612573906141d0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e390614130565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b601e60179054906101000a900460ff1681565b60008082846126cb9190614345565b905083811015612710576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270790614170565b60405180910390fd5b8091505092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612792576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161278990614210565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f990614150565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516128e09190614230565b60405180910390a3505050565b60008073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561295e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612955906141f0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129c5906140f0565b60405180910390fd5b601e60149054906101000a900460ff16156129f5576129ee848484612f80565b9050612ecb565b600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16158015612a995750600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612ae457601a54821115612ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ada90614190565b60405180910390fd5b5b6000612aef30611725565b90506000601c548210159050808015612b155750601e60149054906101000a900460ff16155b8015612b6b5750600b60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b8015612b835750601e60159054906101000a900460ff165b15612bad57601e60169054906101000a900460ff1615612ba357601c5491505b612bac82613153565b5b612c36846040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600660008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ed29092919063ffffffff16565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600860008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612d1c5750600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b612d3057612d2b878787613344565b612d32565b845b9050601e60179054906101000a900460ff168015612d9a5750600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b15612dc957601b54612dbd82612daf89611725565b6126bc90919063ffffffff16565b1115612dc857600080fd5b5b612e1b81600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126bc90919063ffffffff16565b600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612ebb9190614230565b60405180910390a3600193505050505b9392505050565b6000838311158290612f1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f1191906140ce565b60405180910390fd5b5060008385612f299190614426565b9050809150509392505050565b6000612f7883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612ed2565b905092915050565b600061300b826040518060400160405280601481526020017f496e73756666696369656e742042616c616e6365000000000000000000000000815250600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ed29092919063ffffffff16565b600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130a082600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126bc90919063ffffffff16565b600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516131409190614230565b60405180910390a3600190509392505050565b6001601e60146101000a81548160ff02191690831515021790555060006131ac600261319e6018546131906012548761356b90919063ffffffff16565b6135e690919063ffffffff16565b6135e690919063ffffffff16565b905060006131c38284612f3690919063ffffffff16565b90506131ce81613630565b600047905060006131ff6131ee60026012546135e690919063ffffffff16565b601854612f3690919063ffffffff16565b9050600061323d600261322f846132216012548861356b90919063ffffffff16565b6135e690919063ffffffff16565b6135e690919063ffffffff16565b905060006132688361325a6014548761356b90919063ffffffff16565b6135e690919063ffffffff16565b90506000613291826132838588612f3690919063ffffffff16565b612f3690919063ffffffff16565b905060008111156132c9576132c8600460019054906101000a900473ffffffffffffffffffffffffffffffffffffffff168261392d565b5b60008211156132ff576132fe600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168361392d565b5b60008311801561330f5750600087115b1561331f5761331e8784613978565b5b505050505050506000601e60146101000a81548160ff02191690831515021790555050565b60008060009050600b60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156133cc576133c560646133b76015548661356b90919063ffffffff16565b6135e690919063ffffffff16565b905061344a565b600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156134495761344660646134386016548661356b90919063ffffffff16565b6135e690919063ffffffff16565b90505b5b600081111561354e576134a581600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126bc90919063ffffffff16565b600660003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516135459190614230565b60405180910390a35b6135618184612f3690919063ffffffff16565b9150509392505050565b60008083141561357e57600090506135e0565b6000828461358c91906143cc565b905082848261359b919061439b565b146135db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d2906141b0565b60405180910390fd5b809150505b92915050565b600061362883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613a6c565b905092915050565b6000600267ffffffffffffffff811115613673577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156136a15781602001602082028036833780820191505090505b50905030816000815181106136df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561378157600080fd5b505afa158015613795573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b99190613b61565b816001815181106137f3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061385a30601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612722565b601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663791ac9478360008430426040518663ffffffff1660e01b81526004016138be95949392919061427b565b600060405180830381600087803b1580156138d857600080fd5b505af11580156138ec573d6000803e3d6000fd5b505050507f32cde87eb454f3a0b875ab23547023107cfad454363ec88ba5695e2c24aa52a7828260405161392192919061424b565b60405180910390a15050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015613973573d6000803e3d6000fd5b505050565b6139a530601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684612722565b601d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d7198230856000806139f1611780565b426040518863ffffffff1660e01b8152600401613a1396959493929190614037565b6060604051808303818588803b158015613a2c57600080fd5b505af1158015613a40573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613a659190613d2e565b5050505050565b60008083118290613ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613aaa91906140ce565b60405180910390fd5b5060008385613ac2919061439b565b9050809150509392505050565b600081359050613ade816148b2565b92915050565b600081519050613af3816148b2565b92915050565b600081359050613b08816148c9565b92915050565b600081359050613b1d816148e0565b92915050565b600081519050613b32816148e0565b92915050565b600060208284031215613b4a57600080fd5b6000613b5884828501613acf565b91505092915050565b600060208284031215613b7357600080fd5b6000613b8184828501613ae4565b91505092915050565b60008060408385031215613b9d57600080fd5b6000613bab85828601613acf565b9250506020613bbc85828601613acf565b9150509250929050565b600080600060608486031215613bdb57600080fd5b6000613be986828701613acf565b9350506020613bfa86828701613acf565b9250506040613c0b86828701613b0e565b9150509250925092565b60008060408385031215613c2857600080fd5b6000613c3685828601613acf565b9250506020613c4785828601613af9565b9150509250929050565b60008060408385031215613c6457600080fd5b6000613c7285828601613acf565b9250506020613c8385828601613b0e565b9150509250929050565b600060208284031215613c9f57600080fd5b6000613cad84828501613af9565b91505092915050565b600060208284031215613cc857600080fd5b6000613cd684828501613b0e565b91505092915050565b600080600060608486031215613cf457600080fd5b6000613d0286828701613b0e565b9350506020613d1386828701613b0e565b9250506040613d2486828701613b0e565b9150509250925092565b600080600060608486031215613d4357600080fd5b6000613d5186828701613b23565b9350506020613d6286828701613b23565b9250506040613d7386828701613b23565b9150509250925092565b6000613d898383613d95565b60208301905092915050565b613d9e8161445a565b82525050565b613dad8161445a565b82525050565b6000613dbe82614300565b613dc88185614323565b9350613dd3836142f0565b8060005b83811015613e04578151613deb8882613d7d565b9750613df683614316565b925050600181019050613dd7565b5085935050505092915050565b613e1a8161446c565b82525050565b613e29816144af565b82525050565b613e38816144d3565b82525050565b6000613e498261430b565b613e538185614334565b9350613e638185602086016144e5565b613e6c816145d7565b840191505092915050565b6000613e84602383614334565b9150613e8f826145e8565b604082019050919050565b6000613ea7603483614334565b9150613eb282614637565b604082019050919050565b6000613eca602683614334565b9150613ed582614686565b604082019050919050565b6000613eed602283614334565b9150613ef8826146d5565b604082019050919050565b6000613f10601b83614334565b9150613f1b82614724565b602082019050919050565b6000613f33602883614334565b9150613f3e8261474d565b604082019050919050565b6000613f56602183614334565b9150613f618261479c565b604082019050919050565b6000613f79602083614334565b9150613f84826147eb565b602082019050919050565b6000613f9c602583614334565b9150613fa782614814565b604082019050919050565b6000613fbf602483614334565b9150613fca82614863565b604082019050919050565b613fde81614498565b82525050565b613fed816144a2565b82525050565b60006020820190506140086000830184613da4565b92915050565b60006040820190506140236000830185613da4565b6140306020830184613da4565b9392505050565b600060c08201905061404c6000830189613da4565b6140596020830188613fd5565b6140666040830187613e2f565b6140736060830186613e2f565b6140806080830185613da4565b61408d60a0830184613fd5565b979650505050505050565b60006020820190506140ad6000830184613e11565b92915050565b60006020820190506140c86000830184613e20565b92915050565b600060208201905081810360008301526140e88184613e3e565b905092915050565b6000602082019050818103600083015261410981613e77565b9050919050565b6000602082019050818103600083015261412981613e9a565b9050919050565b6000602082019050818103600083015261414981613ebd565b9050919050565b6000602082019050818103600083015261416981613ee0565b9050919050565b6000602082019050818103600083015261418981613f03565b9050919050565b600060208201905081810360008301526141a981613f26565b9050919050565b600060208201905081810360008301526141c981613f49565b9050919050565b600060208201905081810360008301526141e981613f6c565b9050919050565b6000602082019050818103600083015261420981613f8f565b9050919050565b6000602082019050818103600083015261422981613fb2565b9050919050565b60006020820190506142456000830184613fd5565b92915050565b60006040820190506142606000830185613fd5565b81810360208301526142728184613db3565b90509392505050565b600060a0820190506142906000830188613fd5565b61429d6020830187613e2f565b81810360408301526142af8186613db3565b90506142be6060830185613da4565b6142cb6080830184613fd5565b9695505050505050565b60006020820190506142ea6000830184613fe4565b92915050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600061435082614498565b915061435b83614498565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143905761438f61454a565b5b828201905092915050565b60006143a682614498565b91506143b183614498565b9250826143c1576143c0614579565b5b828204905092915050565b60006143d782614498565b91506143e283614498565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561441b5761441a61454a565b5b828202905092915050565b600061443182614498565b915061443c83614498565b92508282101561444f5761444e61454a565b5b828203905092915050565b600061446582614478565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006144ba826144c1565b9050919050565b60006144cc82614478565b9050919050565b60006144de82614498565b9050919050565b60005b838110156145035780820151818401526020810190506144e8565b83811115614512576000848401525b50505050565b6000600282049050600182168061453057607f821691505b60208210811415614544576145436145a8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f4d61782077616c6c65742073686f756c64206265206c657373206f722065757160008201527f616c20746f20342520746f74616c537570706c79000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b7f5472616e7366657220616d6f756e74206578636565647320746865206d61785460008201527f78416d6f756e742e000000000000000000000000000000000000000000000000602082015250565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6148bb8161445a565b81146148c657600080fd5b50565b6148d28161446c565b81146148dd57600080fd5b50565b6148e981614498565b81146148f457600080fd5b5056fe45524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220e66e5698e26cf397ed99b2089dbce7c2fa7dd8866e23e73959adbac15c030ec664736f6c63430008040033