Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
Code
Read Contract
Write Contract
- Contract name:
- AboatToken
- Optimization enabled
- true
- Compiler version
- v0.8.7+commit.e28d00a7
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2022-07-20T13:33:13.912124Z
Contract source code
// File: gist-e02d18f9ec39f1018187895f0a8c9692/contracts/interfaces/IMasterEntertainer.sol pragma solidity 0.8.7; interface IMasterEntertainer { function updatePrice() external; function getBalanceOf(address _user, uint256 _vesting) external view returns (uint256); function depositForUser(uint256 _pid, uint256 _amount, address _user) external; } // File: gist-e02d18f9ec39f1018187895f0a8c9692/contracts/interfaces/IKaiDexRouter.sol pragma solidity 0.8.7; interface IKaiDexRouter { 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 addLiquidityKAI( address token, uint amountTokenDesired, uint amountTokenMin, uint amountKAIMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountKAI, 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 removeLiquidityKAI( address token, uint liquidity, uint amountTokenMin, uint amountKAIMin, address to, uint deadline ) external returns (uint amountToken, uint amountKAI); 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 swapExactKAIForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactKAI(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForKAI(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapKAIForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityKAIWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountKAIMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountKAI); function removeLiquidityKAISupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountKAIMin, address to, uint deadline ) external returns (uint amountKAI); function removeLiquidityKAIWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountKAIMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountKAI); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactKAIForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForKAISupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; 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); } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: gist-e02d18f9ec39f1018187895f0a8c9692/contracts/libraries/TransferHelper.sol pragma solidity 0.8.7; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeTransfer: transfer failed" ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::transferFrom: transferFrom failed" ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require( success, "TransferHelper::safeTransferETH: ETH transfer failed" ); } } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol pragma solidity >=0.5.0; 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; } // File: @uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol pragma solidity >=0.5.0; 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 Mint(address indexed sender, uint amount0, uint amount1); 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 mint(address to) external returns (uint liquidity); 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; } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol 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); } // File: @uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol pragma solidity >=0.6.2; 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; } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { 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); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File: gist-e02d18f9ec39f1018187895f0a8c9692/contracts/libraries/TimeLock.sol pragma solidity 0.8.7; abstract contract TimeLock is Ownable { using Address for address; /* ===================================================================================================================== Variables ===================================================================================================================== */ bool public isLockEnabled = false; mapping(string => uint256) public timelock; uint256 private constant _TIMELOCK = 1 days; address private _maintainer; /* ===================================================================================================================== Events ===================================================================================================================== */ event MaintainerTransferred(address indexed previousMaintainer, address indexed newMaintainer); event UnlockedFunction(string indexed functionName, uint256 indexed unlockedAt); event EnabledLock(); /* ===================================================================================================================== Modifier ===================================================================================================================== */ //After unlock we have to wait for _TIMELOCK before we can call the Function //Additionally we have a time window of 24 hours to call the function to prevent pre-unlocked calls modifier locked(string memory _fn) { require(!isLockEnabled || (timelock[_fn] != 0 && timelock[_fn] <= block.timestamp && timelock[_fn] + _TIMELOCK >= block.timestamp), "Function is locked"); _; lockFunction(_fn); } modifier onlyMaintainerOrOwner() { require(owner() == msg.sender || _maintainer == msg.sender, "operator: caller is not allowed to call this function"); _; } constructor() { _maintainer = msg.sender; } /* ===================================================================================================================== Get Functions ===================================================================================================================== */ function maintainer() public view returns (address) { return _maintainer; } /* ===================================================================================================================== Set Functions ===================================================================================================================== */ function setMaintainer(address _newMaintainer) public onlyMaintainerOrOwner locked("maintainer") { require(_newMaintainer != _maintainer && _newMaintainer != address(0), "ABOAT::setMaintainer: Maintainer can\'t equal previous maintainer or zero address"); address previousMaintainer = _maintainer; _maintainer = _newMaintainer; emit MaintainerTransferred(previousMaintainer, _maintainer); } function setTimelockEnabled() public onlyMaintainerOrOwner { isLockEnabled = true; emit EnabledLock(); } /* ===================================================================================================================== Utility Functions ===================================================================================================================== */ //unlock timelock function unlockFunction(string memory _fn) public onlyMaintainerOrOwner { timelock[_fn] = block.timestamp + _TIMELOCK; emit UnlockedFunction(_fn, timelock[_fn]); } //lock timelock function lockFunction(string memory _fn) public onlyMaintainerOrOwner { timelock[_fn] = 0; } } // File: gist-e02d18f9ec39f1018187895f0a8c9692/contracts/libraries/Liquify.sol pragma solidity 0.8.7; abstract contract Liquify is ERC20, ReentrancyGuard, Ownable, TimeLock { using Address for address; using SafeMath for uint256; /* ===================================================================================================================== Variables ===================================================================================================================== */ //Transfer Tax //Transfer tax rate in basis points. default 100 => 1% uint16 public minimumTransferTaxRate = 500; uint16 public maximumTransferTaxRate = 1000; uint16 public constant MAXIMUM_TAX = 1000; uint16 public reDistributionRate = 40; uint16 public devRate = 20; uint16 public donationRate = 10; bool public isLiquifyActive = false; uint256 public _minAmountToLiquify = 100000 ether; address public _devWallet = 0xc559aCc356D3037EC6dbc33a20587051188b8634; //Wallet where the dev fees will go to address public _donationWallet = 0x2EA9CA0ca8043575f2189CFF9897B575b0c7e857; //Wallet where donation fees will go to address public _rewardWallet = 0x2EA9CA0ca8043575f2189CFF9897B575b0c7e857; //Wallet where rewards will be distributed address public _weth = 0xAF984E23EAA3E7967F3C5E007fbe397D8566D23d; address public _liquidityPair; IKaiDexRouter public _router; address public _factory = 0xC9567a8B6b622cdc8076C6b4432Ade0e11F50Da1; mapping(address => bool) public _excludedFromFeesAsSender; mapping(address => bool) public _excludedFromFeesAsReceiver; /* ===================================================================================================================== Events ===================================================================================================================== */ event MinimumTransferTaxRateUpdated(address indexed caller, uint256 previousRate, uint256 newRate); event MaximumTransferTaxRateUpdated(address indexed caller, uint256 previousRate, uint256 newRate); event UpdateTax(uint16 redistribution, uint16 dev, uint16 donation); event MinAmountToLiquifyUpdated(address indexed caller, uint256 previousAmount, uint256 newAmount); event RouterUpdated(address indexed caller, address indexed router, address indexed pair); event ChangedLiquidityPair(address indexed caller, address indexed pair); event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiquidity); /* ===================================================================================================================== Modifier ===================================================================================================================== */ modifier taxFree { uint16 _minimumTransferTaxRate = minimumTransferTaxRate; uint16 _maximumTransferTaxRate = maximumTransferTaxRate; minimumTransferTaxRate = 0; maximumTransferTaxRate = 0; _; minimumTransferTaxRate = _minimumTransferTaxRate; maximumTransferTaxRate = _maximumTransferTaxRate; } constructor() { excludeFromAll(msg.sender); excludeFromAll(_devWallet); excludeFromAll(_donationWallet); updateRouter(0xbAFcdabe65A03825a131298bE7670c0aEC77B37f); } /* ===================================================================================================================== Set Functions ===================================================================================================================== */ function setLiquidityPair(address _tokenB) public onlyMaintainerOrOwner locked("lp_pair") { require(_tokenB != address(0), "Liquify::setLiquidityPair: Liquidity pair can't contain zero address"); _liquidityPair = IUniswapV2Factory(_factory).getPair(address(this), _tokenB); if(_liquidityPair == address(0)) { _liquidityPair = IUniswapV2Factory(_factory).createPair(address(this), _tokenB); } excludeTransferFeeAsSender(address(_liquidityPair)); emit ChangedLiquidityPair(msg.sender, _liquidityPair); } function setLPAddress(address token) public onlyMaintainerOrOwner locked("lp_pair_address") { require(token != address(0), "Liquify::setLiquidityPair: Liquidity pair can't contain zero address"); _liquidityPair = token; excludeTransferFeeAsSender(address(_liquidityPair)); emit ChangedLiquidityPair(msg.sender, _liquidityPair); } function setDevWallet(address wallet) public onlyMaintainerOrOwner { require(wallet != address(0), "ABOAT::setDevWallet: Address can't be zero address"); _devWallet = wallet; excludeFromAll(_devWallet); } function setDonationWallet(address wallet) public onlyMaintainerOrOwner { require(wallet != address(0), "ABOAT::setDonationWallet: Address can't be zero address"); _donationWallet = wallet; } function setRewardWallet(address wallet) public onlyMaintainerOrOwner { require(wallet != address(0), "ABOAT::setRewardWallet: Address can't be zero address"); _rewardWallet = wallet; excludeFromAll(_rewardWallet); } function disableAutomaticLiquify() public onlyMaintainerOrOwner { isLiquifyActive = true; } function enableAutomaticLiquify() public onlyMaintainerOrOwner { isLiquifyActive = false; } function setMinAmountToLiquify(uint256 _amount) public onlyMaintainerOrOwner { _minAmountToLiquify = _amount; } /* ===================================================================================================================== Utility Functions ===================================================================================================================== */ function excludeFromAll(address _excludee) public onlyMaintainerOrOwner { _excludedFromFeesAsSender[_excludee] = true; _excludedFromFeesAsReceiver[_excludee] = true; } function excludeTransferFeeAsSender(address _excludee) public onlyMaintainerOrOwner { _excludedFromFeesAsSender[_excludee] = true; } function excludeFromFeesAsReceiver(address _excludee) public onlyMaintainerOrOwner { _excludedFromFeesAsReceiver[_excludee] = true; } function includeForAll(address _excludee) public onlyMaintainerOrOwner { _excludedFromFeesAsSender[_excludee] = false; _excludedFromFeesAsReceiver[_excludee] = false; } function includeTransferFeeAsSender(address _excludee) public onlyMaintainerOrOwner { _excludedFromFeesAsSender[_excludee] = false; } function includeForFeesAsReciever(address _excludee) public onlyMaintainerOrOwner { _excludedFromFeesAsReceiver[_excludee] = false; } function updateMinimumTransferTaxRate(uint16 _transferTaxRate) public onlyMaintainerOrOwner locked("min_tax") { require(_transferTaxRate <= maximumTransferTaxRate, "ABOAT::updateMinimumTransferTaxRate: minimumTransferTaxRate must not exceed maximumTransferTaxRate."); emit MinimumTransferTaxRateUpdated(msg.sender, minimumTransferTaxRate, _transferTaxRate); minimumTransferTaxRate = _transferTaxRate; } function updateMaximumTransferTaxRate(uint16 _transferTaxRate) public onlyMaintainerOrOwner locked("max_tax") { require(_transferTaxRate >= minimumTransferTaxRate, "ABOAT::updateMaximumTransferTaxRate: maximumTransferTaxRate must not be below minimumTransferTaxRate."); require(_transferTaxRate <= MAXIMUM_TAX, "ABOAT::updateMaximumTransferTaxRate: maximumTransferTaxRate must exceed MAXIMUM_TAX."); emit MaximumTransferTaxRateUpdated(msg.sender, minimumTransferTaxRate, _transferTaxRate); maximumTransferTaxRate = _transferTaxRate; } function updateTax(uint16 _redistribution, uint16 _dev, uint16 _donation) public onlyMaintainerOrOwner locked("updateTax") { require(_redistribution + _dev + _donation <= 100, "ABOAT::updateTax: Tax cant exceed 100 percent!"); reDistributionRate = _redistribution; devRate = _dev; donationRate = _donation; emit UpdateTax(reDistributionRate, devRate, donationRate); } function updateRouter(address router) public onlyMaintainerOrOwner locked("router") { _router = IKaiDexRouter(router); setLiquidityPair(_weth); excludeTransferFeeAsSender(router); emit RouterUpdated(msg.sender, router, _liquidityPair); } /* ===================================================================================================================== Liquidity Functions ===================================================================================================================== */ /* * @dev Function to swap the stored liquidity fee tokens and add them to the current liquidity pool */ function swapAndLiquify() public taxFree { if(isLiquifyActive) { return; } isLiquifyActive = true; uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance >= _minAmountToLiquify) { IUniswapV2Pair pair = IUniswapV2Pair(_liquidityPair); uint256 devTax = contractTokenBalance.mul(devRate).div(100); uint256 donationTax = contractTokenBalance.mul(donationRate).div(100); // split the liquify amount into halves uint256 half = contractTokenBalance.sub(devTax).sub(donationTax).div(2); uint256 otherHalfWithTax = contractTokenBalance.sub(half); address tokenA = address(pair.token0()); address tokenB = address(pair.token1()); require(tokenA != tokenB, "Invalid liqudity pair: Pair can\'t contain the same token twice"); bool isWeth = tokenA == _weth || tokenB == _weth; uint256 newBalance = 0; if(isWeth) { swapAndLiquifyEth(otherHalfWithTax, half); } else { swapAndLiquifyTokens(tokenA != address(this) ? tokenA : tokenB, otherHalfWithTax, half); } emit SwapAndLiquify(otherHalfWithTax, newBalance, half); } isLiquifyActive = false; } function swapForEth(uint256 amount) private returns (uint256) { uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(amount); uint256 newBalance = address(this).balance.sub(initialBalance); require(newBalance > 0, "Balance not high enough"); uint256 devTax = newBalance.mul(devRate).div(100); uint256 donationTax = newBalance.mul(donationRate).div(100); TransferHelper.safeTransferETH(_devWallet, devTax); TransferHelper.safeTransferETH(_donationWallet, donationTax); return address(this).balance.sub(initialBalance); } function swapAndLiquifyEth(uint256 half, uint256 otherHalf) private { uint256 newBalance = swapForEth(half); if(newBalance > 0) { addLiquidityETH(otherHalf, newBalance); } } function swapAndLiquifyTokens(address tokenB, uint256 half, uint256 otherHalf) private { IERC20 tokenBContract = IERC20(tokenB); uint256 ethAmount = swapForEth(half); uint256 initialBalance = tokenBContract.balanceOf(address(this)); swapEthForTokens(ethAmount, tokenB); uint256 newBalance = tokenBContract.balanceOf(address(this)).sub(initialBalance); addLiquidity(otherHalf, newBalance, tokenB); } function swapEthForTokens(uint256 tokenAmount, address tokenB) private { address[] memory path = new address[](2); path[0] = _weth; path[1] = tokenB; _router.swapExactKAIForTokensSupportingFeeOnTransferTokens{value: tokenAmount}( 0, // accept any amount of ETH path, address(this), block.timestamp ); } /// @dev Swap tokens for eth function swapTokensForEth(uint256 tokenAmount) private { // generate the Enodi pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = _weth; _approve(address(this), address(_router), tokenAmount); // make the swap _router.swapExactTokensForKAISupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } function addLiquidity(uint256 tokenAmount, uint256 otherAmount, address tokenB) internal { // approve token transfer to cover all possible scenarios _approve(address(this), address(_router), tokenAmount); IERC20(tokenB).approve(address(_router), otherAmount); _router.addLiquidity( address(this), tokenB, tokenAmount, otherAmount, 0, 0, address(0), block.timestamp ); } /// @dev Add liquidity function addLiquidityETH(uint256 tokenAmount, uint256 ethAmount) internal { // approve token transfer to cover all possible scenarios _approve(address(this), address(_router), tokenAmount); // add the liquidity _router.addLiquidityKAI{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(0), //burn lp token block.timestamp ); } } // File: gist-e02d18f9ec39f1018187895f0a8c9692/contracts/AboatToken.sol pragma solidity 0.8.7; /** @dev Implements Liquify which implements the TimeLock library. * @dev We use the maintainer for to hold the ability to change important attributes * @dev Owner will be given to the MasterEntertainer contract to mint new tokens for staking/yield farming */ contract AboatToken is ERC20, Liquify { using SafeMath for uint256; using Address for address; /* ===================================================================================================================== Variables ===================================================================================================================== */ uint256 public maxDistribution = 1000000000000 ether; bool public isContractActive = false; bool public isHighFeeActive = true; uint16 public maxTxQuantity = 100; uint16 public maxAccBalance = 300; uint256 public gasCost = 2100000000000000; uint public totalFeesPaid; uint public devFeesPaid; uint public donationFeesPaid; uint public reDistributionFeesPaid; uint public liquidityFeesPaid; //Master Entertainer contract IMasterEntertainer public _masterEntertainer; mapping(address => bool) private blacklisted; mapping(address => bool) private requestedWhitelist; /* ===================================================================================================================== Events ===================================================================================================================== */ event ChangedHighFeeState(bool indexed state); event MasterEntertainerTransferred(address indexed previousMasterEntertainer, address indexed newMasterEntertainer); event MaxDistributionChanged(uint256 indexed newMaxDistribution); event RequestedWhitelist(address indexed requestee); event Blacklisted(address indexed user); event MaxAccBalanceChanged(uint16 indexed previousMaxBalance, uint16 indexed newMaxBalance); event MaxTransactionQuantityChanged(uint16 indexed previousMaxTxQuantity, uint16 indexed newMaxTxQuantity); event GasCostChanged(uint256 indexed previousGasCost, uint256 indexed newGasCost); /* ===================================================================================================================== Modifier ===================================================================================================================== */ constructor() ERC20("Aboat Token", "ABOAT") { mint(msg.sender, 600000000000 ether); excludeFromAll(msg.sender); setTimelockEnabled(); } /* ===================================================================================================================== Set Functions ===================================================================================================================== */ function setMasterEntertainer(address _newMasterEntertainer) public onlyOwner { require(_newMasterEntertainer != address(_masterEntertainer) && _newMasterEntertainer != address(0), "ABOAT::setMasterEntertainer: Master entertainer can\'t equal previous master entertainer or zero address"); address previousEntertainer = address(_masterEntertainer); _masterEntertainer = IMasterEntertainer(_newMasterEntertainer); excludeFromAll(_newMasterEntertainer); transferOwnership(_newMasterEntertainer); emit MasterEntertainerTransferred(previousEntertainer, _newMasterEntertainer); } function setMaxDistribution(uint256 _newDistribution) public onlyMaintainerOrOwner locked("max_distribution") { require(_newDistribution > totalSupply(), "ABOAT::setMaxDistribution: Distribution can't be lower than the current total supply"); maxDistribution = _newDistribution; emit MaxDistributionChanged(_newDistribution); } function setMaxAccBalance(uint16 maxBalance) public onlyMaintainerOrOwner { require(maxBalance > 100, "Max account balance can't be lower than 1% of total supply"); uint16 previousMaxBalance = maxAccBalance; maxAccBalance = maxBalance; emit MaxAccBalanceChanged(previousMaxBalance, maxAccBalance); } function setMaxTransactionQuantity(uint16 quantity) public onlyMaintainerOrOwner { require(quantity > 10, "Max transaction size can't be lower than 0.1% of total supply"); uint16 previous = maxTxQuantity; maxTxQuantity = quantity; emit MaxTransactionQuantityChanged(previous, maxTxQuantity); } function setGasCost(uint256 cost) public onlyMaintainerOrOwner { uint256 previous = gasCost; gasCost = cost; emit GasCostChanged(previous, gasCost); } /* ===================================================================================================================== Get Functions ===================================================================================================================== */ function isExcludedFromSenderTax(address _account) public view returns (bool) { return _excludedFromFeesAsSender[_account]; } function isExcludedFromReceiverTax(address _account) public view returns (bool) { return _excludedFromFeesAsReceiver[_account]; } function hasRequestedWhitelist(address user) public onlyMaintainerOrOwner view returns (bool) { return requestedWhitelist[user]; } function getBalanceOf(address _user) public view returns (uint256) { return balanceOf(_user).add(_masterEntertainer.getBalanceOf(_user, 0)); } function getTaxFee(address _sender) public view returns (uint256) { //Anti-Bot: The first Blocks will have a 90% fee if(isHighFeeActive) { return 9000; } uint balance = getBalanceOf(_sender); if(balance > totalSupply()) { return maximumTransferTaxRate; } else if(balance < totalSupply() / 100000) { return minimumTransferTaxRate; } uint tax = balance * 100000 / totalSupply(); if(tax > 100) { uint realTax = minimumTransferTaxRate + tax - 100; return realTax > maximumTransferTaxRate ? maximumTransferTaxRate : realTax; } else { return minimumTransferTaxRate; } } function liquidityPair() public view returns (address) { return _liquidityPair; } function getLiquidityTokenAddress() public view returns (address) { IUniswapV2Pair pair = IUniswapV2Pair(_liquidityPair); address tokenA = address(pair.token0()); address tokenB = address(pair.token1()); return tokenA != address(this) ? tokenA : tokenB; } function liquidityTokenBalance() public view returns (uint256) { return IERC20(getLiquidityTokenAddress()).balanceOf(address(this)); } function canMintNewCoins(uint256 _amount) public view returns (bool) { return totalSupply() + _amount <= maxDistribution; } function getCirculatingSupply() public view returns (uint256) { return totalSupply().sub(balanceOf(_rewardWallet)); } /* ===================================================================================================================== Utility Functions ===================================================================================================================== */ receive() external payable {} function activateHighFee() public onlyMaintainerOrOwner { isHighFeeActive = true; emit ChangedHighFeeState(isHighFeeActive); } function deactivateHighFee() public onlyMaintainerOrOwner { isHighFeeActive = false; isContractActive = true; emit ChangedHighFeeState(isHighFeeActive); } function activateContract() public onlyMaintainerOrOwner { isContractActive = true; } function blacklist(address user) public onlyMaintainerOrOwner { blacklisted[user] = true; emit Blacklisted(user); } function whitelist(address user) public onlyMaintainerOrOwner { blacklisted[user] = true; requestedWhitelist[user] = false; } function requestWhitelist() public payable { require(blacklisted[msg.sender], "ABOAT::requestWhitelist: You are not blacklisted!"); require(!requestedWhitelist[msg.sender], "ABOAT::requestWhitelist: You already requested whitelist!"); require(msg.value >= gasCost, "ABOAT::requestWhitelist: Amount of bnb to claim should carry the cost to add the claimable"); TransferHelper.safeTransferETH(_devWallet, msg.value); requestedWhitelist[msg.sender] = true; emit RequestedWhitelist(msg.sender); } function claimExceedingETH() public onlyMaintainerOrOwner { require(address(this).balance > 0, "ABOAT::claimExceedingLiquidityTokenBalance: No exceeding balance"); TransferHelper.safeTransferETH(msg.sender, address(this).balance); } function mint(address _to, uint256 _amount) public onlyOwner { require(totalSupply() + _amount <= maxDistribution, "ABOAT::mint: Can't mint more aboat token than maxDistribution allows"); _mint(_to, _amount); } function _transfer(address sender, address recipient, uint256 amount) internal virtual override nonReentrant { require(sender != address(0), "ABOAT::_transfer: transfer from the zero address"); require(recipient != address(0), "ABOAT::_transfer: transfer to the zero address"); require(amount > 0, "ABOAT::_transfer:Transfer amount must be greater than zero"); require(amount <= balanceOf(sender), "ABOAT::_transfer:Transfer amount must be lower or equal senders balance"); //Anti-Bot: If someone sends too many recurrent transactions in a short amount of time he will be blacklisted require(!blacklisted[sender], "ABOAT::_transfer:You're currently blacklisted. Please report to [email protected] if you want to get removed from blacklist!"); //Anti-Bot: Disable transactions with more than 1% of total supply require(amount * 10000 / totalSupply() <= maxTxQuantity || sender == owner() || sender == maintainer() || _excludedFromFeesAsSender[sender] || _excludedFromFeesAsReceiver[sender], "Your transfer exceeds the maximum possible amount per transaction"); //Anti-Whale: Only allow wallets to hold a certain percentage of total supply require((amount + getBalanceOf(recipient)) * 10000 / totalSupply() <= maxAccBalance || recipient == owner() || recipient == maintainer() || recipient == address(this) || _excludedFromFeesAsReceiver[recipient] || _excludedFromFeesAsSender[recipient], "ABOAT::_transfer:Balance of recipient can't exceed maxAccBalance"); //Liquidity Provision safety require(isContractActive || sender == owner() || sender == maintainer() || _excludedFromFeesAsReceiver[recipient] || _excludedFromFeesAsSender[sender], "ABOAT::_transfer:Contract is not yet open for community"); if ((!isHighFeeActive || sender == maintainer() || sender == owner() || _excludedFromFeesAsSender[sender] && _excludedFromFeesAsReceiver[recipient]) && (recipient == address(0) || maximumTransferTaxRate == 0 || _excludedFromFeesAsReceiver[recipient] || _excludedFromFeesAsSender[sender])) { super._transfer(sender, recipient, amount); } else { uint256 taxAmount = amount.mul(getTaxFee(sender)).div(10000); uint256 reDistributionAmount = taxAmount.mul(reDistributionRate).div(100); uint256 devAmount = taxAmount.mul(devRate).div(100); uint256 donationAmount = taxAmount.mul(donationRate).div(100); uint256 liquidityAmount = taxAmount.sub(reDistributionAmount.add(devAmount).add(donationAmount)); require(taxAmount == reDistributionAmount + liquidityAmount + devAmount + donationAmount, "ABOAT::transfer: Fee amount does not equal the split fee amount"); uint256 sendAmount = amount.sub(taxAmount); require(amount == sendAmount + taxAmount, "ABOAT::transfer: amount to send with tax amount exceeds maximum possible amount"); super._transfer(sender, address(this), liquidityAmount + devAmount + donationAmount); super._transfer(sender, recipient, sendAmount); super._transfer(sender, _rewardWallet, reDistributionAmount); amount = sendAmount; totalFeesPaid += taxAmount; devFeesPaid += devAmount; donationFeesPaid += donationAmount; liquidityFeesPaid += liquidityAmount; } checkPriceUpdate(); } function checkPriceUpdate() public { if(address(_masterEntertainer) != address(0)) { _masterEntertainer.updatePrice(); } } }
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":"Blacklisted","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ChangedHighFeeState","inputs":[{"type":"bool","name":"state","internalType":"bool","indexed":true}],"anonymous":false},{"type":"event","name":"ChangedLiquidityPair","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"address","name":"pair","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"EnabledLock","inputs":[],"anonymous":false},{"type":"event","name":"GasCostChanged","inputs":[{"type":"uint256","name":"previousGasCost","internalType":"uint256","indexed":true},{"type":"uint256","name":"newGasCost","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"MaintainerTransferred","inputs":[{"type":"address","name":"previousMaintainer","internalType":"address","indexed":true},{"type":"address","name":"newMaintainer","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"MasterEntertainerTransferred","inputs":[{"type":"address","name":"previousMasterEntertainer","internalType":"address","indexed":true},{"type":"address","name":"newMasterEntertainer","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"MaxAccBalanceChanged","inputs":[{"type":"uint16","name":"previousMaxBalance","internalType":"uint16","indexed":true},{"type":"uint16","name":"newMaxBalance","internalType":"uint16","indexed":true}],"anonymous":false},{"type":"event","name":"MaxDistributionChanged","inputs":[{"type":"uint256","name":"newMaxDistribution","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"MaxTransactionQuantityChanged","inputs":[{"type":"uint16","name":"previousMaxTxQuantity","internalType":"uint16","indexed":true},{"type":"uint16","name":"newMaxTxQuantity","internalType":"uint16","indexed":true}],"anonymous":false},{"type":"event","name":"MaximumTransferTaxRateUpdated","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"uint256","name":"previousRate","internalType":"uint256","indexed":false},{"type":"uint256","name":"newRate","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MinAmountToLiquifyUpdated","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"uint256","name":"previousAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"newAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MinimumTransferTaxRateUpdated","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"uint256","name":"previousRate","internalType":"uint256","indexed":false},{"type":"uint256","name":"newRate","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":"RequestedWhitelist","inputs":[{"type":"address","name":"requestee","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"RouterUpdated","inputs":[{"type":"address","name":"caller","internalType":"address","indexed":true},{"type":"address","name":"router","internalType":"address","indexed":true},{"type":"address","name":"pair","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":"tokensIntoLiquidity","internalType":"uint256","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":"event","name":"UnlockedFunction","inputs":[{"type":"string","name":"functionName","internalType":"string","indexed":true},{"type":"uint256","name":"unlockedAt","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"UpdateTax","inputs":[{"type":"uint16","name":"redistribution","internalType":"uint16","indexed":false},{"type":"uint16","name":"dev","internalType":"uint16","indexed":false},{"type":"uint16","name":"donation","internalType":"uint16","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"MAXIMUM_TAX","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_devWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_donationWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_excludedFromFeesAsReceiver","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"_excludedFromFeesAsSender","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_factory","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_liquidityPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IMasterEntertainer"}],"name":"_masterEntertainer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_minAmountToLiquify","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_rewardWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IKaiDexRouter"}],"name":"_router","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"_weth","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"activateContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"activateHighFee","inputs":[]},{"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":[],"name":"blacklist","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"canMintNewCoins","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"checkPriceUpdate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimExceedingETH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deactivateHighFee","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":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"devFeesPaid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"devRate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"disableAutomaticLiquify","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"donationFeesPaid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"donationRate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableAutomaticLiquify","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromAll","inputs":[{"type":"address","name":"_excludee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeFromFeesAsReceiver","inputs":[{"type":"address","name":"_excludee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"excludeTransferFeeAsSender","inputs":[{"type":"address","name":"_excludee","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"gasCost","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBalanceOf","inputs":[{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getCirculatingSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getLiquidityTokenAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTaxFee","inputs":[{"type":"address","name":"_sender","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"hasRequestedWhitelist","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeForAll","inputs":[{"type":"address","name":"_excludee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeForFeesAsReciever","inputs":[{"type":"address","name":"_excludee","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"includeTransferFeeAsSender","inputs":[{"type":"address","name":"_excludee","internalType":"address"}]},{"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":"isContractActive","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromReceiverTax","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isExcludedFromSenderTax","inputs":[{"type":"address","name":"_account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isHighFeeActive","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLiquifyActive","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isLockEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFeesPaid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"liquidityPair","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityTokenBalance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lockFunction","inputs":[{"type":"string","name":"_fn","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"maintainer","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"maxAccBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxDistribution","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"maxTxQuantity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"maximumTransferTaxRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"minimumTransferTaxRate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mint","inputs":[{"type":"address","name":"_to","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"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":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reDistributionFeesPaid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"reDistributionRate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"requestWhitelist","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDevWallet","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDonationWallet","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setGasCost","inputs":[{"type":"uint256","name":"cost","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLPAddress","inputs":[{"type":"address","name":"token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setLiquidityPair","inputs":[{"type":"address","name":"_tokenB","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaintainer","inputs":[{"type":"address","name":"_newMaintainer","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMasterEntertainer","inputs":[{"type":"address","name":"_newMasterEntertainer","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxAccBalance","inputs":[{"type":"uint16","name":"maxBalance","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxDistribution","inputs":[{"type":"uint256","name":"_newDistribution","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxTransactionQuantity","inputs":[{"type":"uint16","name":"quantity","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinAmountToLiquify","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setRewardWallet","inputs":[{"type":"address","name":"wallet","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTimelockEnabled","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapAndLiquify","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":"timelock","inputs":[{"type":"string","name":"","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFeesPaid","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":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","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":"nonpayable","outputs":[],"name":"unlockFunction","inputs":[{"type":"string","name":"_fn","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMaximumTransferTaxRate","inputs":[{"type":"uint16","name":"_transferTaxRate","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateMinimumTransferTaxRate","inputs":[{"type":"uint16","name":"_transferTaxRate","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateRouter","inputs":[{"type":"address","name":"router","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateTax","inputs":[{"type":"uint16","name":"_redistribution","internalType":"uint16"},{"type":"uint16","name":"_dev","internalType":"uint16"},{"type":"uint16","name":"_donation","internalType":"uint16"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"whitelist","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60806040526006805460ff60a01b1916905560088054600160a01b600160f81b03191668028005000a00fa007d60a21b17905569152d02c7e14af6800000600955600a80546001600160a01b031990811673c559acc356d3037ec6dbc33a20587051188b863417909155600b80548216732ea9ca0ca8043575f2189cff9897b575b0c7e857908117909155600c805483169091179055600d8054821673af984e23eaa3e7967f3c5e007fbe397d8566d23d1790556010805490911673c9567a8b6b622cdc8076c6b4432ade0e11f50da11790556c0c9f2c9cd04674edea400000006013556014805465012c0064010065ffffffffffff19909116179055660775f05a0740006015553480156200011457600080fd5b50604080518082018252600b81526a20b137b0ba102a37b5b2b760a91b602080830191825283518085019094526005845264105093d05560da1b908401528151919291620001659160039162000d32565b5080516200017b90600490602084019062000d32565b50506001600555506200018e336200022f565b600880546001600160a01b03191633908117909155620001ae9062000281565b600a54620001c5906001600160a01b031662000281565b600b54620001dc906001600160a01b031662000281565b620001fb73bafcdabe65a03825a131298be7670c0aec77b37f62000347565b62000214336c0792b45e1690ac8ebfc000000062000556565b6200021f3362000281565b620002296200060a565b62000eac565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b33620002956006546001600160a01b031690565b6001600160a01b03161480620002b557506008546001600160a01b031633145b6200030b5760405162461bcd60e51b8152602060048201526035602482015260008051602062006a19833981519152604482015260008051602062006a3983398151915260648201526084015b60405180910390fd5b6001600160a01b031660009081526011602090815260408083208054600160ff1991821681179092556012909352922080549091169091179055565b336200035b6006546001600160a01b031690565b6001600160a01b031614806200037b57506008546001600160a01b031633145b620003cd5760405162461bcd60e51b8152602060048201526035602482015260008051602062006a19833981519152604482015260008051602062006a39833981519152606482015260840162000302565b604080518082019091526006808252653937baba32b960d11b602083015254600160a01b900460ff1615806200048d575060078160405162000410919062000e0a565b908152602001604051809103902054600014158015620004505750426007826040516200043e919062000e0a565b90815260200160405180910390205411155b80156200048d575042620151806007836040516200046f919062000e0a565b9081526020016040518091039020546200048a919062000e48565b10155b620004d05760405162461bcd60e51b8152602060048201526012602482015271119d5b98dd1a5bdb881a5cc81b1bd8dad95960721b604482015260640162000302565b600f80546001600160a01b0319166001600160a01b0384811691909117909155600d54620004ff9116620006ce565b6200050a8262000a96565b600e546040516001600160a01b039182169184169033907feb7c1e97c05570337fe795ab9d5755a8f731c9c52e756b720275940fa283327690600090a4620005528162000b40565b5050565b6200056062000bed565b601354816200056e60025490565b6200057a919062000e48565b1115620005fe5760405162461bcd60e51b8152602060048201526044602482018190527f41424f41543a3a6d696e743a2043616e2774206d696e74206d6f72652061626f908201527f617420746f6b656e207468616e206d6178446973747269627574696f6e20616c6064820152636c6f777360e01b608482015260a40162000302565b62000552828262000c4b565b336200061e6006546001600160a01b031690565b6001600160a01b031614806200063e57506008546001600160a01b031633145b620006905760405162461bcd60e51b8152602060048201526035602482015260008051602062006a19833981519152604482015260008051602062006a39833981519152606482015260840162000302565b6006805460ff60a01b1916600160a01b1790556040517f2c08b62bfac9a1b19bb1dec9323f1ce01696a77948b256abf3603d30f25a864e90600090a1565b33620006e26006546001600160a01b031690565b6001600160a01b031614806200070257506008546001600160a01b031633145b620007545760405162461bcd60e51b8152602060048201526035602482015260008051602062006a19833981519152604482015260008051602062006a39833981519152606482015260840162000302565b60408051808201909152600781526636382fb830b4b960c91b6020820152600654600160a01b900460ff16158062000816575060078160405162000799919062000e0a565b908152602001604051809103902054600014158015620007d9575042600782604051620007c7919062000e0a565b90815260200160405180910390205411155b80156200081657504262015180600783604051620007f8919062000e0a565b90815260200160405180910390205462000813919062000e48565b10155b620008595760405162461bcd60e51b8152602060048201526012602482015271119d5b98dd1a5bdb881a5cc81b1bd8dad95960721b604482015260640162000302565b6001600160a01b038216620008e55760405162461bcd60e51b8152602060048201526044602482018190527f4c6971756966793a3a7365744c6971756964697479506169723a204c69717569908201527f6469747920706169722063616e277420636f6e7461696e207a65726f206164646064820152637265737360e01b608482015260a40162000302565b60105460405163e6a4390560e01b81523060048201526001600160a01b0384811660248301529091169063e6a439059060440160206040518083038186803b1580156200093157600080fd5b505afa15801562000946573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200096c919062000dd8565b600e80546001600160a01b0319166001600160a01b0392909216918217905562000a3a576010546040516364e329cb60e11b81523060048201526001600160a01b0384811660248301529091169063c9c6539690604401602060405180830381600087803b158015620009de57600080fd5b505af1158015620009f3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a19919062000dd8565b600e80546001600160a01b0319166001600160a01b03929092169190911790555b600e5462000a51906001600160a01b031662000a96565b600e546040516001600160a01b039091169033907f6c587433dea122b342b093acb4dde076ca1a441413e43a5a14dde8a8842c944790600090a3620005528162000b40565b3362000aaa6006546001600160a01b031690565b6001600160a01b0316148062000aca57506008546001600160a01b031633145b62000b1c5760405162461bcd60e51b8152602060048201526035602482015260008051602062006a19833981519152604482015260008051602062006a39833981519152606482015260840162000302565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b3362000b546006546001600160a01b031690565b6001600160a01b0316148062000b7457506008546001600160a01b031633145b62000bc65760405162461bcd60e51b8152602060048201526035602482015260008051602062006a19833981519152604482015260008051602062006a39833981519152606482015260840162000302565b600060078260405162000bda919062000e0a565b9081526040519081900360200190205550565b6006546001600160a01b0316331462000c495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000302565b565b6001600160a01b03821662000ca35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640162000302565b806002600082825462000cb7919062000e48565b90915550506001600160a01b0382166000908152602081905260408120805483929062000ce690849062000e48565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a362000552565b82805462000d409062000e6f565b90600052602060002090601f01602090048101928262000d64576000855562000daf565b82601f1062000d7f57805160ff191683800117855562000daf565b8280016001018555821562000daf579182015b8281111562000daf57825182559160200191906001019062000d92565b5062000dbd92915062000dc1565b5090565b5b8082111562000dbd576000815560010162000dc2565b60006020828403121562000deb57600080fd5b81516001600160a01b038116811462000e0357600080fd5b9392505050565b6000825160005b8181101562000e2d576020818601810151858301520162000e11565b8181111562000e3d576000828501525b509190910192915050565b6000821982111562000e6a57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168062000e8457607f821691505b6020821081141562000ea657634e487b7160e01b600052602260045260246000fd5b50919050565b615b5d8062000ebc6000396000f3fe6080604052600436106105055760003560e01c80637a351a1d11610297578063a457c2d711610165578063d9324079116100cc578063f2fde38b11610085578063f2fde38b14610f9c578063f4762fd614610fbc578063f98080c014610fd1578063f9f92be414611009578063fafa448914611029578063fb25c1201461104b57600080fd5b8063d932407914610efb578063dd62ed3e14610f11578063df6f663014610f31578063e9fd586214610f51578063edae876f14610f67578063f1a3da2214610f8757600080fd5b8063b29ad50a1161011e578063b29ad50a14610e2b578063bb92201414610e40578063c1316eb614610e79578063c5cc6b6a14610e99578063c851cc3214610eb9578063c957497514610ed957600080fd5b8063a457c2d714610d5b578063a4f4a76514610d7b578063a607494a14610d9b578063a9059cbb14610dbb578063ae7e1d7a14610ddb578063af10e03e14610e0b57600080fd5b806395d89b41116102095780639d93598e116101c25780639d93598e14610c9a5780639f53115614610cba578063a17252a414610cda578063a176459514610cfa578063a347511a14610d1a578063a37f4ea914610d3b57600080fd5b806395d89b4114610bf1578063982ceeb714610c065780639850d32b14610c1c578063986d614214610c3a5780639b19251a14610c5a5780639b96eece14610c7a57600080fd5b80638aba46591161025b5780638aba465914610b4e5780638da5cb5b14610b6e5780638efd5e3b14610b8c5780638f5949f914610bac5780638fda356d14610bc657806391ee586414610bdb57600080fd5b80637a351a1d14610a965780637d8e961514610ab65780638053575b14610ad6578063808a545714610b0f57806388bce12314610b2d57600080fd5b8063313ce567116103d45780635958621e116103465780636e1e9349116102ff5780636e1e9349146109ed57806370a08231146109f5578063715018a614610a2b578063737dc9bd14610a4057806373b002a514610a605780637897af8614610a7657600080fd5b80635958621e146109385780635a96cdd714610958578063626bb27414610978578063645830b41461098e578063653465bf146109ae57806369372b30146109cd57600080fd5b806340c10f191161039857806340c10f191461088e578063437f660e146108ae5780634ad1eb81146108c3578063506ee100146108e357806353a54511146108f8578063546134501461091857600080fd5b8063313ce567146107fd578063318913fb146108195780633707c31014610839578063370f0a601461084e578063395093511461086e57600080fd5b80631745685711610478578063239eb21111610431578063239eb2111461076857806323b872dd1461077d5780632a83759b1461079d5780632b112e49146107b25780632b714147146107c75780633071fed2146107dd57600080fd5b806317456857146106c357806318160ddd146106d85780631ac818a1146106ed5780631b6111111461071d5780631d5e3fe5146107325780631f53ac021461074857600080fd5b806306fdde03116104ca57806306fdde03146105e5578063095ea7b3146106075780630cd84dc6146106275780630d38ffcd1461065f57806311a63e171461068157806313ea5d29146106a157600080fd5b80625d1afc146105115780630181bb781461054757806301bbba4d1461057d57806303fcdbdf1461059f578063044e0ea2146105c157600080fd5b3661050c57005b600080fd5b34801561051d57600080fd5b5060085461053290600160f01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561055357600080fd5b5060145461056a90640100000000900461ffff1681565b60405161ffff909116815260200161053e565b34801561058957600080fd5b5060085461056a90600160a01b900461ffff1681565b3480156105ab57600080fd5b5060085461056a90600160c01b900461ffff1681565b3480156105cd57600080fd5b506105d760135481565b60405190815260200161053e565b3480156105f157600080fd5b506105fa61106b565b60405161053e9190615879565b34801561061357600080fd5b50610532610622366004615627565b6110fd565b34801561063357600080fd5b50601b54610647906001600160a01b031681565b6040516001600160a01b03909116815260200161053e565b34801561066b57600080fd5b5060085461056a90600160e01b900461ffff1681565b34801561068d57600080fd5b50600a54610647906001600160a01b031681565b3480156106ad57600080fd5b506106c16106bc366004615573565b611115565b005b3480156106cf57600080fd5b506106c161134f565b3480156106e457600080fd5b506002546105d7565b3480156106f957600080fd5b50610532610708366004615573565b60126020526000908152604090205460ff1681565b34801561072957600080fd5b506106c16113b2565b34801561073e57600080fd5b506105d760155481565b34801561075457600080fd5b506106c1610763366004615573565b611484565b34801561077457600080fd5b506105d761156d565b34801561078957600080fd5b506105326107983660046155e6565b6115f5565b3480156107a957600080fd5b506106c1611619565b3480156107be57600080fd5b506105d76116ae565b3480156107d357600080fd5b506105d760185481565b3480156107e957600080fd5b506105d76107f8366004615573565b6116d7565b34801561080957600080fd5b506040516012815260200161053e565b34801561082557600080fd5b50610532610834366004615573565b6117f9565b34801561084557600080fd5b506106c161186c565b34801561085a57600080fd5b506106c1610869366004615573565b6118c9565b34801561087a57600080fd5b50610532610889366004615627565b611953565b34801561089a57600080fd5b506106c16108a9366004615627565b611975565b3480156108ba57600080fd5b506106c1611a20565b3480156108cf57600080fd5b506106c16108de366004615573565b611a9b565b3480156108ef57600080fd5b50610647611b0a565b34801561090457600080fd5b506106c1610913366004615573565b611c23565b34801561092457600080fd5b506106c1610933366004615573565b611c92565b34801561094457600080fd5b506106c1610953366004615573565b611ddd565b34801561096457600080fd5b506106c1610973366004615573565b611ec6565b34801561098457600080fd5b506105d760195481565b34801561099a57600080fd5b50600e54610647906001600160a01b031681565b3480156109ba57600080fd5b5060145461053290610100900460ff1681565b3480156109d957600080fd5b506105326109e8366004615784565b611fb2565b6106c1611fd3565b348015610a0157600080fd5b506105d7610a10366004615573565b6001600160a01b031660009081526020819052604090205490565b348015610a3757600080fd5b506106c16121c8565b348015610a4c57600080fd5b506106c1610a5b366004615741565b6121da565b348015610a6c57600080fd5b506105d7601a5481565b348015610a8257600080fd5b506106c1610a91366004615573565b612424565b348015610aa257600080fd5b506106c1610ab1366004615573565b612496565b348015610ac257600080fd5b506106c1610ad1366004615726565b61264f565b348015610ae257600080fd5b50610532610af1366004615573565b6001600160a01b031660009081526012602052604090205460ff1690565b348015610b1b57600080fd5b50600e546001600160a01b0316610647565b348015610b3957600080fd5b5060145461056a9062010000900461ffff1681565b348015610b5a57600080fd5b506106c1610b69366004615784565b612897565b348015610b7a57600080fd5b506006546001600160a01b0316610647565b348015610b9857600080fd5b506106c1610ba7366004615784565b61291e565b348015610bb857600080fd5b506014546105329060ff1681565b348015610bd257600080fd5b506106c1612971565b348015610be757600080fd5b506105d760175481565b348015610bfd57600080fd5b506105fa6129ce565b348015610c1257600080fd5b506105d760095481565b348015610c2857600080fd5b506008546001600160a01b0316610647565b348015610c4657600080fd5b506106c1610c55366004615573565b6129dd565b348015610c6657600080fd5b506106c1610c75366004615573565b612a4f565b348015610c8657600080fd5b506105d7610c95366004615573565b612ad6565b348015610ca657600080fd5b506106c1610cb5366004615573565b612b86565b348015610cc657600080fd5b506106c1610cd5366004615675565b612e2e565b348015610ce657600080fd5b506106c1610cf5366004615573565b612ea1565b348015610d0657600080fd5b50600d54610647906001600160a01b031681565b348015610d2657600080fd5b5060065461053290600160a01b900460ff1681565b348015610d4757600080fd5b50600b54610647906001600160a01b031681565b348015610d6757600080fd5b50610532610d76366004615627565b612f25565b348015610d8757600080fd5b50600c54610647906001600160a01b031681565b348015610da757600080fd5b506106c1610db6366004615675565b612fa0565b348015610dc757600080fd5b50610532610dd6366004615627565b61307d565b348015610de757600080fd5b50610532610df6366004615573565b60116020526000908152604090205460ff1681565b348015610e1757600080fd5b506106c1610e26366004615726565b61308b565b348015610e3757600080fd5b506106c161336e565b348015610e4c57600080fd5b50610532610e5b366004615573565b6001600160a01b031660009081526011602052604090205460ff1690565b348015610e8557600080fd5b506106c1610e94366004615726565b6136cc565b348015610ea557600080fd5b50601054610647906001600160a01b031681565b348015610ec557600080fd5b506106c1610ed4366004615573565b6137eb565b348015610ee557600080fd5b5060085461056a90600160d01b900461ffff1681565b348015610f0757600080fd5b5061056a6103e881565b348015610f1d57600080fd5b506105d7610f2c3660046155ad565b613986565b348015610f3d57600080fd5b506106c1610f4c366004615784565b6139b1565b348015610f5d57600080fd5b506105d760165481565b348015610f7357600080fd5b50600f54610647906001600160a01b031681565b348015610f9357600080fd5b506106c1613ba8565b348015610fa857600080fd5b506106c1610fb7366004615573565b613c3c565b348015610fc857600080fd5b506106c1613cb2565b348015610fdd57600080fd5b506105d7610fec366004615675565b805160208183018101805160078252928201919093012091525481565b34801561101557600080fd5b506106c1611024366004615573565b613d3e565b34801561103557600080fd5b5060085461056a90600160b01b900461ffff1681565b34801561105757600080fd5b506106c1611066366004615726565b613dd8565b60606003805461107a90615a95565b80601f01602080910402602001604051908101604052809291908181526020018280546110a690615a95565b80156110f35780601f106110c8576101008083540402835291602001916110f3565b820191906000526020600020905b8154815290600101906020018083116110d657829003601f168201915b5050505050905090565b60003361110b818585613efb565b5060019392505050565b336111286006546001600160a01b031690565b6001600160a01b0316148061114757506008546001600160a01b031633145b61116c5760405162461bcd60e51b8152600401611163906158d8565b60405180910390fd5b60408051808201909152600a81526936b0b4b73a30b4b732b960b11b6020820152600654600160a01b900460ff16158061122657506007816040516111b19190615828565b9081526020016040518091039020546000141580156111ee5750426007826040516111dc9190615828565b90815260200160405180910390205411155b80156112265750426201518060078360405161120a9190615828565b90815260200160405180910390205461122391906159f9565b10155b6112425760405162461bcd60e51b8152600401611163906158ac565b6008546001600160a01b0383811691161480159061126857506001600160a01b03821615155b6112f35760405162461bcd60e51b815260206004820152605060248201527f41424f41543a3a7365744d61696e7461696e65723a204d61696e7461696e657260448201527f2063616e277420657175616c2070726576696f7573206d61696e7461696e657260648201526f206f72207a65726f206164647265737360801b608482015260a401611163565b600880546001600160a01b038481166001600160a01b0319831681179093556040519116919082907f2f3ffaaaad93928855c8700645d1a3643e6ccfdd500efa9fda048a88f557cf0190600090a35061134b81612e2e565b5050565b336113626006546001600160a01b031690565b6001600160a01b0316148061138157506008546001600160a01b031633145b61139d5760405162461bcd60e51b8152600401611163906158d8565b6008805460ff60f01b1916600160f01b179055565b336113c56006546001600160a01b031690565b6001600160a01b031614806113e457506008546001600160a01b031633145b6114005760405162461bcd60e51b8152600401611163906158d8565b60004711611478576040805162461bcd60e51b81526020600482015260248101919091527f41424f41543a3a636c61696d457863656564696e674c6971756964697479546f60448201527f6b656e42616c616e63653a204e6f20657863656564696e672062616c616e63656064820152608401611163565b611482334761401f565b565b336114976006546001600160a01b031690565b6001600160a01b031614806114b657506008546001600160a01b031633145b6114d25760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b0381166115435760405162461bcd60e51b815260206004820152603260248201527f41424f41543a3a73657444657657616c6c65743a20416464726573732063616e6044820152712774206265207a65726f206164647265737360701b6064820152608401611163565b600a80546001600160a01b0319166001600160a01b03831690811790915561156a906118c9565b50565b6000611577611b0a565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b1580156115b857600080fd5b505afa1580156115cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f0919061579d565b905090565b6000336116038582856140fe565b61160e858585614172565b506001949350505050565b3361162c6006546001600160a01b031690565b6001600160a01b0316148061164b57506008546001600160a01b031633145b6116675760405162461bcd60e51b8152600401611163906158d8565b6014805461ffff19166001179081905560405161010090910460ff161515907f4c67d13291f7fe21c52eee8f752cbc5c7451e593e18093d087403081206fd46c90600090a2565b600c546001600160a01b03166000908152602081905260408120546115f0906002545b90614b99565b601454600090610100900460ff16156116f35750612328919050565b60006116fe83612ad6565b905061170960025490565b811115611725575050600854600160b01b900461ffff16919050565b620186a061173260025490565b61173c9190615a11565b811015611758575050600854600160a01b900461ffff16919050565b600061176360025490565b61177083620186a0615a33565b61177a9190615a11565b905060648111156117e3576008546000906064906117a4908490600160a01b900461ffff166159f9565b6117ae9190615a52565b600854909150600160b01b900461ffff1681116117cb57806117da565b600854600160b01b900461ffff165b95945050505050565b5050600854600160a01b900461ffff1692915050565b60003361180e6006546001600160a01b031690565b6001600160a01b0316148061182d57506008546001600160a01b031633145b6118495760405162461bcd60e51b8152600401611163906158d8565b506001600160a01b0381166000908152601d602052604090205460ff165b919050565b3361187f6006546001600160a01b031690565b6001600160a01b0316148061189e57506008546001600160a01b031633145b6118ba5760405162461bcd60e51b8152600401611163906158d8565b6008805460ff60f01b19169055565b336118dc6006546001600160a01b031690565b6001600160a01b031614806118fb57506008546001600160a01b031633145b6119175760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b031660009081526011602090815260408083208054600160ff1991821681179092556012909352922080549091169091179055565b60003361110b8185856119668383613986565b61197091906159f9565b613efb565b61197d614bac565b6013548161198a60025490565b61199491906159f9565b1115611a165760405162461bcd60e51b8152602060048201526044602482018190527f41424f41543a3a6d696e743a2043616e2774206d696e74206d6f72652061626f908201527f617420746f6b656e207468616e206d6178446973747269627574696f6e20616c6064820152636c6f777360e01b608482015260a401611163565b61134b8282614c06565b601b546001600160a01b03161561148257601b60009054906101000a90046001600160a01b03166001600160a01b031663673a7e286040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a8157600080fd5b505af1158015611a95573d6000803e3d6000fd5b50505050565b33611aae6006546001600160a01b031690565b6001600160a01b03161480611acd57506008546001600160a01b031633145b611ae95760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601160205260409020805460ff19169055565b600e5460408051630dfe168160e01b815290516000926001600160a01b03169183918391630dfe1681916004808301926020929190829003018186803b158015611b5357600080fd5b505afa158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8b9190615590565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc857600080fd5b505afa158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190615590565b90506001600160a01b038216301415611c195780611c1b565b815b935050505090565b33611c366006546001600160a01b031690565b6001600160a01b03161480611c5557506008546001600160a01b031633145b611c715760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601260205260409020805460ff19169055565b611c9a614bac565b601b546001600160a01b03828116911614801590611cc057506001600160a01b03811615155b611d685760405162461bcd60e51b815260206004820152606760248201527f41424f41543a3a7365744d6173746572456e7465727461696e65723a204d617360448201527f74657220656e7465727461696e65722063616e277420657175616c207072657660648201527f696f7573206d617374657220656e7465727461696e6572206f72207a65726f206084820152666164647265737360c81b60a482015260c401611163565b601b80546001600160a01b038381166001600160a01b031983161790925516611d90826118c9565b611d9982613c3c565b816001600160a01b0316816001600160a01b03167fdbc41a91ae00463e0c8208e05c807f2559c82a27989b5dd9f984e3a0b8059d6960405160405180910390a35050565b33611df06006546001600160a01b031690565b6001600160a01b03161480611e0f57506008546001600160a01b031633145b611e2b5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b038116611e9f5760405162461bcd60e51b815260206004820152603560248201527f41424f41543a3a73657452657761726457616c6c65743a20416464726573732060448201527463616e2774206265207a65726f206164647265737360581b6064820152608401611163565b600c80546001600160a01b0319166001600160a01b03831690811790915561156a906118c9565b33611ed96006546001600160a01b031690565b6001600160a01b03161480611ef857506008546001600160a01b031633145b611f145760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b038116611f905760405162461bcd60e51b815260206004820152603760248201527f41424f41543a3a736574446f6e6174696f6e57616c6c65743a2041646472657360448201527f732063616e2774206265207a65726f20616464726573730000000000000000006064820152608401611163565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600060135482611fc160025490565b611fcb91906159f9565b111592915050565b336000908152601c602052604090205460ff1661204c5760405162461bcd60e51b815260206004820152603160248201527f41424f41543a3a7265717565737457686974656c6973743a20596f7520617265604482015270206e6f7420626c61636b6c69737465642160781b6064820152608401611163565b336000908152601d602052604090205460ff16156120d25760405162461bcd60e51b815260206004820152603960248201527f41424f41543a3a7265717565737457686974656c6973743a20596f7520616c7260448201527f65616479207265717565737465642077686974656c69737421000000000000006064820152608401611163565b6015543410156121705760405162461bcd60e51b815260206004820152605a60248201527f41424f41543a3a7265717565737457686974656c6973743a20416d6f756e742060448201527f6f6620626e6220746f20636c61696d2073686f756c642063617272792074686560648201527f20636f737420746f206164642074686520636c61696d61626c65000000000000608482015260a401611163565b600a54612186906001600160a01b03163461401f565b336000818152601d6020526040808220805460ff19166001179055517fd0401c9f53bc0a133a6eb391664575ad9c8e05bdda210963e7e75591938ee5109190a2565b6121d0614bac565b6114826000614ce5565b336121ed6006546001600160a01b031690565b6001600160a01b0316148061220c57506008546001600160a01b031633145b6122285760405162461bcd60e51b8152600401611163906158d8565b6040805180820190915260098152680eae0c8c2e8caa8c2f60bb1b6020820152600654600160a01b900460ff1615806122e1575060078160405161226c9190615828565b9081526020016040518091039020546000141580156122a95750426007826040516122979190615828565b90815260200160405180910390205411155b80156122e1575042620151806007836040516122c59190615828565b9081526020016040518091039020546122de91906159f9565b10155b6122fd5760405162461bcd60e51b8152600401611163906158ac565b60648261230a85876159d3565b61231491906159d3565b61ffff16111561237d5760405162461bcd60e51b815260206004820152602e60248201527f41424f41543a3a7570646174655461783a205461782063616e7420657863656560448201526d64203130302070657263656e742160901b6064820152608401611163565b6008805463ffffffff60c01b1916600160c01b61ffff878116820261ffff60d01b191692909217600160d01b87841681029190911761ffff60e01b1916600160e01b87851681029190911794859055604080519386048516845291850484166020840152909304909116918101919091527f49b216608947f85b55485549bcbeb9b3885d85690a8ecce31f0b27e390af5c7a9060600160405180910390a1611a9581612e2e565b336124376006546001600160a01b031690565b6001600160a01b0316148061245657506008546001600160a01b031633145b6124725760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b336124a96006546001600160a01b031690565b6001600160a01b031614806124c857506008546001600160a01b031633145b6124e45760405162461bcd60e51b8152600401611163906158d8565b60408051808201909152600f81526e6c705f706169725f6164647265737360881b6020820152600654600160a01b900460ff1615806125a3575060078160405161252e9190615828565b90815260200160405180910390205460001415801561256b5750426007826040516125599190615828565b90815260200160405180910390205411155b80156125a3575042620151806007836040516125879190615828565b9081526020016040518091039020546125a091906159f9565b10155b6125bf5760405162461bcd60e51b8152600401611163906158ac565b6001600160a01b0382166125e55760405162461bcd60e51b81526004016111639061592d565b600e80546001600160a01b0319166001600160a01b03841690811790915561260c90612424565b600e546040516001600160a01b039091169033907f6c587433dea122b342b093acb4dde076ca1a441413e43a5a14dde8a8842c944790600090a361134b81612e2e565b336126626006546001600160a01b031690565b6001600160a01b0316148061268157506008546001600160a01b031633145b61269d5760405162461bcd60e51b8152600401611163906158d8565b6040805180820190915260078152660dad2dcbee8c2f60cb1b6020820152600654600160a01b900460ff16158061275457506007816040516126df9190615828565b90815260200160405180910390205460001415801561271c57504260078260405161270a9190615828565b90815260200160405180910390205411155b8015612754575042620151806007836040516127389190615828565b90815260200160405180910390205461275191906159f9565b10155b6127705760405162461bcd60e51b8152600401611163906158ac565b60085461ffff600160b01b909104811690831611156128295760405162461bcd60e51b815260206004820152606360248201527f41424f41543a3a7570646174654d696e696d756d5472616e736665725461785260448201527f6174653a206d696e696d756d5472616e7366657254617852617465206d75737460648201527f206e6f7420657863656564206d6178696d756d5472616e7366657254617852616084820152623a329760e91b60a482015260c401611163565b60085460408051600160a01b90920461ffff90811683528416602083015233917fb2f2e219f74b4a7e339376870ae1b18d655e3cf85f60dc47f56e7cd7bad470c5910160405180910390a26008805461ffff60a01b1916600160a01b61ffff85160217905561134b81612e2e565b336128aa6006546001600160a01b031690565b6001600160a01b031614806128c957506008546001600160a01b031633145b6128e55760405162461bcd60e51b8152600401611163906158d8565b6015805490829055604051829082907fa4257144dd1cd8b911052d6273102723e361f2b03e4cb7312cf347093492db7890600090a35050565b336129316006546001600160a01b031690565b6001600160a01b0316148061295057506008546001600160a01b031633145b61296c5760405162461bcd60e51b8152600401611163906158d8565b600955565b336129846006546001600160a01b031690565b6001600160a01b031614806129a357506008546001600160a01b031633145b6129bf5760405162461bcd60e51b8152600401611163906158d8565b6014805460ff19166001179055565b60606004805461107a90615a95565b336129f06006546001600160a01b031690565b6001600160a01b03161480612a0f57506008546001600160a01b031633145b612a2b5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b33612a626006546001600160a01b031690565b6001600160a01b03161480612a8157506008546001600160a01b031633145b612a9d5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601c60209081526040808320805460ff19908116600117909155601d90925290912080549091169055565b601b546040516394d45b5960e01b81526001600160a01b03838116600483015260006024830181905292612b80929116906394d45b599060440160206040518083038186803b158015612b2857600080fd5b505afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b60919061579d565b6001600160a01b0384166000908152602081905260409020545b90614d37565b92915050565b33612b996006546001600160a01b031690565b6001600160a01b03161480612bb857506008546001600160a01b031633145b612bd45760405162461bcd60e51b8152600401611163906158d8565b60408051808201909152600781526636382fb830b4b960c91b6020820152600654600160a01b900460ff161580612c8b5750600781604051612c169190615828565b908152602001604051809103902054600014158015612c53575042600782604051612c419190615828565b90815260200160405180910390205411155b8015612c8b57504262015180600783604051612c6f9190615828565b908152602001604051809103902054612c8891906159f9565b10155b612ca75760405162461bcd60e51b8152600401611163906158ac565b6001600160a01b038216612ccd5760405162461bcd60e51b81526004016111639061592d565b60105460405163e6a4390560e01b81523060048201526001600160a01b0384811660248301529091169063e6a439059060440160206040518083038186803b158015612d1857600080fd5b505afa158015612d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d509190615590565b600e80546001600160a01b0319166001600160a01b03929092169182179055612e19576010546040516364e329cb60e11b81523060048201526001600160a01b0384811660248301529091169063c9c6539690604401602060405180830381600087803b158015612dc057600080fd5b505af1158015612dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df89190615590565b600e80546001600160a01b0319166001600160a01b03929092169190911790555b600e5461260c906001600160a01b0316612424565b33612e416006546001600160a01b031690565b6001600160a01b03161480612e6057506008546001600160a01b031633145b612e7c5760405162461bcd60e51b8152600401611163906158d8565b6000600782604051612e8e9190615828565b9081526040519081900360200190205550565b33612eb46006546001600160a01b031690565b6001600160a01b03161480612ed357506008546001600160a01b031633145b612eef5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601160209081526040808320805460ff19908116909155601290925290912080549091169055565b60003381612f338286613986565b905083811015612f935760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401611163565b61160e8286868403613efb565b33612fb36006546001600160a01b031690565b6001600160a01b03161480612fd257506008546001600160a01b031633145b612fee5760405162461bcd60e51b8152600401611163906158d8565b612ffb62015180426159f9565b60078260405161300b9190615828565b90815260200160405180910390208190555060078160405161302d9190615828565b9081526020016040518091039020548160405161304a9190615828565b604051908190038120907ff77f9a799fe8b0be1463abd7459a18fc55dfd8a6a24ddd29b54fd098088089c890600090a350565b60003361110b818585614172565b3361309e6006546001600160a01b031690565b6001600160a01b031614806130bd57506008546001600160a01b031633145b6130d95760405162461bcd60e51b8152600401611163906158d8565b6040805180820190915260078152660dac2f0bee8c2f60cb1b6020820152600654600160a01b900460ff161580613190575060078160405161311b9190615828565b9081526020016040518091039020546000141580156131585750426007826040516131469190615828565b90815260200160405180910390205411155b8015613190575042620151806007836040516131749190615828565b90815260200160405180910390205461318d91906159f9565b10155b6131ac5760405162461bcd60e51b8152600401611163906158ac565b60085461ffff600160a01b909104811690831610156132675760405162461bcd60e51b815260206004820152606560248201527f41424f41543a3a7570646174654d6178696d756d5472616e736665725461785260448201527f6174653a206d6178696d756d5472616e7366657254617852617465206d75737460648201527f206e6f742062652062656c6f77206d696e696d756d5472616e736665725461786084820152642930ba329760d91b60a482015260c401611163565b6103e861ffff831611156133005760405162461bcd60e51b815260206004820152605460248201527f41424f41543a3a7570646174654d6178696d756d5472616e736665725461785260448201527f6174653a206d6178696d756d5472616e7366657254617852617465206d7573746064820152731032bc31b2b2b21026a0ac24a6aaa6afaa20ac1760611b608482015260a401611163565b60085460408051600160a01b90920461ffff90811683528416602083015233917ffc18b74e18e9bf8100ca625de9f64c93e88284a81d82c9edfc899869f34b506f910160405180910390a26008805461ffff60b01b1916600160b01b61ffff85160217905561134b81612e2e565b6008805463ffffffff60a01b1981169182905561ffff600160a01b8204811692600160b01b909204169060ff600160f01b90910416156133ad57613694565b6008805460ff60f01b1916600160f01b179055306000908152602081905260408120549050600954811061368557600e546008546001600160a01b03909116906000906134139060649061340d908690600160d01b900461ffff16614d43565b90614d4f565b6008549091506000906134399060649061340d908790600160e01b900461ffff16614d43565b90506000613450600261340d846116d18988614b99565b9050600061345e8683614b99565b90506000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561349b57600080fd5b505afa1580156134af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d39190615590565b90506000866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561351057600080fd5b505afa158015613524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135489190615590565b9050806001600160a01b0316826001600160a01b031614156135d25760405162461bcd60e51b815260206004820152603e60248201527f496e76616c6964206c6971756469747920706169723a20506169722063616e2760448201527f7420636f6e7461696e207468652073616d6520746f6b656e20747769636500006064820152608401611163565b600d546000906001600160a01b03848116911614806135fe5750600d546001600160a01b038381169116145b905060008115613617576136128587614d5b565b61363a565b61363a6001600160a01b0385163014156136315783613633565b845b8688614d78565b60408051868152602081018390529081018790527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050505050505b506008805460ff60f01b191690555b6008805463ffffffff60a01b1916600160a01b61ffff9485160261ffff60b01b191617600160b01b9290931691909102919091179055565b336136df6006546001600160a01b031690565b6001600160a01b031614806136fe57506008546001600160a01b031633145b61371a5760405162461bcd60e51b8152600401611163906158d8565b600a8161ffff16116137945760405162461bcd60e51b815260206004820152603d60248201527f4d6178207472616e73616374696f6e2073697a652063616e2774206265206c6f60448201527f776572207468616e20302e3125206f6620746f74616c20737570706c790000006064820152608401611163565b6014805461ffff8381166201000090810263ffff000019841617938490556040519281900482169304169082907f8f171bb23056cced8a730912e267dbf04c43510f33032f06a749b0ccdc8587b490600090a35050565b336137fe6006546001600160a01b031690565b6001600160a01b0316148061381d57506008546001600160a01b031633145b6138395760405162461bcd60e51b8152600401611163906158d8565b604080518082019091526006808252653937baba32b960d11b602083015254600160a01b900460ff1615806138ee57506007816040516138799190615828565b9081526020016040518091039020546000141580156138b65750426007826040516138a49190615828565b90815260200160405180910390205411155b80156138ee575042620151806007836040516138d29190615828565b9081526020016040518091039020546138eb91906159f9565b10155b61390a5760405162461bcd60e51b8152600401611163906158ac565b600f80546001600160a01b0319166001600160a01b0384811691909117909155600d546139379116612b86565b61394082612424565b600e546040516001600160a01b039182169184169033907feb7c1e97c05570337fe795ab9d5755a8f731c9c52e756b720275940fa283327690600090a461134b81612e2e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336139c46006546001600160a01b031690565b6001600160a01b031614806139e357506008546001600160a01b031633145b6139ff5760405162461bcd60e51b8152600401611163906158d8565b60408051808201909152601081526f36b0bc2fb234b9ba3934b13aba34b7b760811b6020820152600654600160a01b900460ff161580613abf5750600781604051613a4a9190615828565b908152602001604051809103902054600014158015613a87575042600782604051613a759190615828565b90815260200160405180910390205411155b8015613abf57504262015180600783604051613aa39190615828565b908152602001604051809103902054613abc91906159f9565b10155b613adb5760405162461bcd60e51b8152600401611163906158ac565b6002548211613b6f5760405162461bcd60e51b815260206004820152605460248201527f41424f41543a3a7365744d6178446973747269627574696f6e3a20446973747260448201527f69627574696f6e2063616e2774206265206c6f776572207468616e207468652060648201527363757272656e7420746f74616c20737570706c7960601b608482015260a401611163565b601382905560405182907f0a7e08474511c62a58c1dc04d12cff13c93670ffc4d0056882f95ebfe2df50ed90600090a261134b81612e2e565b33613bbb6006546001600160a01b031690565b6001600160a01b03161480613bda57506008546001600160a01b031633145b613bf65760405162461bcd60e51b8152600401611163906158d8565b6014805461ff00191661010090811791829055604051910460ff161515907f4c67d13291f7fe21c52eee8f752cbc5c7451e593e18093d087403081206fd46c90600090a2565b613c44614bac565b6001600160a01b038116613ca95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611163565b61156a81614ce5565b33613cc56006546001600160a01b031690565b6001600160a01b03161480613ce457506008546001600160a01b031633145b613d005760405162461bcd60e51b8152600401611163906158d8565b6006805460ff60a01b1916600160a01b1790556040517f2c08b62bfac9a1b19bb1dec9323f1ce01696a77948b256abf3603d30f25a864e90600090a1565b33613d516006546001600160a01b031690565b6001600160a01b03161480613d7057506008546001600160a01b031633145b613d8c5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b0381166000818152601c6020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b33613deb6006546001600160a01b031690565b6001600160a01b03161480613e0a57506008546001600160a01b031633145b613e265760405162461bcd60e51b8152600401611163906158d8565b60648161ffff1611613ea05760405162461bcd60e51b815260206004820152603a60248201527f4d6178206163636f756e742062616c616e63652063616e2774206265206c6f7760448201527f6572207468616e203125206f6620746f74616c20737570706c790000000000006064820152608401611163565b6014805461ffff83811664010000000090810265ffff0000000019841617938490556040519281900482169304169082907f537619d54465d4bf80b6c360206170815aa95deaa5993a7c17ab783706693a4d90600090a35050565b6001600160a01b038316613f5d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611163565b6001600160a01b038216613fbe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611163565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b604080516000808252602082019092526001600160a01b0384169083906040516140499190615828565b60006040518083038185875af1925050503d8060008114614086576040519150601f19603f3d011682016040523d82523d6000602084013e61408b565b606091505b50509050806140f95760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401611163565b505050565b600061410a8484613986565b90506000198114611a9557818110156141655760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401611163565b611a958484848403613efb565b600260055414156141c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611163565b60026005556001600160a01b0383166142395760405162461bcd60e51b815260206004820152603060248201527f41424f41543a3a5f7472616e736665723a207472616e736665722066726f6d2060448201526f746865207a65726f206164647265737360801b6064820152608401611163565b6001600160a01b0382166142a65760405162461bcd60e51b815260206004820152602e60248201527f41424f41543a3a5f7472616e736665723a207472616e7366657220746f20746860448201526d65207a65726f206164647265737360901b6064820152608401611163565b6000811161431c5760405162461bcd60e51b815260206004820152603a60248201527f41424f41543a3a5f7472616e736665723a5472616e7366657220616d6f756e7460448201527f206d7573742062652067726561746572207468616e207a65726f0000000000006064820152608401611163565b6001600160a01b0383166000908152602081905260409020548111156143ba5760405162461bcd60e51b815260206004820152604760248201527f41424f41543a3a5f7472616e736665723a5472616e7366657220616d6f756e7460448201527f206d757374206265206c6f776572206f7220657175616c2073656e646572732060648201526662616c616e636560c81b608482015260a401611163565b6001600160a01b0383166000908152601c602052604090205460ff16156144a15760405162461bcd60e51b815260206004820152608360248201527f41424f41543a3a5f7472616e736665723a596f752772652063757272656e746c60448201527f7920626c61636b6c69737465642e20506c65617365207265706f727420746f2060648201527f736572766963654074616c6b61626f61742e6f6e6c696e6520696620796f752060848201527f77616e7420746f206765742072656d6f7665642066726f6d20626c61636b6c6960a48201526273742160e81b60c482015260e401611163565b60145461ffff62010000909104166144b860025490565b6144c483612710615a33565b6144ce9190615a11565b1115806144e857506006546001600160a01b038481169116145b8061450057506008546001600160a01b038481169116145b8061452357506001600160a01b03831660009081526011602052604090205460ff165b8061454657506001600160a01b03831660009081526012602052604090205460ff165b6145c25760405162461bcd60e51b815260206004820152604160248201527f596f7572207472616e73666572206578636565647320746865206d6178696d7560448201527f6d20706f737369626c6520616d6f756e7420706572207472616e73616374696f6064820152603760f91b608482015260a401611163565b60145461ffff640100000000909104166145db60025490565b6145e484612ad6565b6145ee90846159f9565b6145fa90612710615a33565b6146049190615a11565b11158061461e57506006546001600160a01b038381169116145b8061463657506008546001600160a01b038381169116145b8061464957506001600160a01b03821630145b8061466c57506001600160a01b03821660009081526012602052604090205460ff165b8061468f57506001600160a01b03821660009081526011602052604090205460ff165b614703576040805162461bcd60e51b81526020600482015260248101919091527f41424f41543a3a5f7472616e736665723a42616c616e6365206f66207265636960448201527f7069656e742063616e277420657863656564206d617841636342616c616e63656064820152608401611163565b60145460ff168061472157506006546001600160a01b038481169116145b8061473957506008546001600160a01b038481169116145b8061475c57506001600160a01b03821660009081526012602052604090205460ff165b8061477f57506001600160a01b03831660009081526011602052604090205460ff165b6147f15760405162461bcd60e51b815260206004820152603760248201527f41424f41543a3a5f7472616e736665723a436f6e7472616374206973206e6f7460448201527f20796574206f70656e20666f7220636f6d6d756e6974790000000000000000006064820152608401611163565b601454610100900460ff16158061481557506008546001600160a01b038481169116145b8061482d57506006546001600160a01b038481169116145b8061487357506001600160a01b03831660009081526011602052604090205460ff16801561487357506001600160a01b03821660009081526012602052604090205460ff165b80156148e157506001600160a01b038216158061489b5750600854600160b01b900461ffff16155b806148be57506001600160a01b03821660009081526012602052604090205460ff165b806148e157506001600160a01b03831660009081526011602052604090205460ff165b156148f6576148f1838383614ea3565b614b87565b600061491161271061340d61490a876116d7565b8590614d43565b6008549091506000906149379060649061340d908590600160c01b900461ffff16614d43565b60085490915060009061495d9060649061340d908690600160d01b900461ffff16614d43565b6008549091506000906149839060649061340d908790600160e01b900461ffff16614d43565b9050600061499f61499883612b7a8787614d37565b8690614b99565b905081836149ad83876159f9565b6149b791906159f9565b6149c191906159f9565b8514614a355760405162461bcd60e51b815260206004820152603f60248201527f41424f41543a3a7472616e736665723a2046656520616d6f756e7420646f657360448201527f206e6f7420657175616c207468652073706c69742066656520616d6f756e74006064820152608401611163565b6000614a418787614b99565b9050614a4d86826159f9565b8714614ad95760405162461bcd60e51b815260206004820152604f60248201527f41424f41543a3a7472616e736665723a20616d6f756e7420746f2073656e642060448201527f776974682074617820616d6f756e742065786365656473206d6178696d756d2060648201526e1c1bdcdcda589b1948185b5bdd5b9d608a1b608482015260a401611163565b614af8893085614ae988876159f9565b614af391906159f9565b614ea3565b614b03898983614ea3565b600c54614b1b908a906001600160a01b031687614ea3565b8096508560166000828254614b3091906159f9565b925050819055508360176000828254614b4991906159f9565b925050819055508260186000828254614b6291906159f9565b9250508190555081601a6000828254614b7b91906159f9565b90915550505050505050505b614b8f611a20565b5050600160055550565b6000614ba58284615a52565b9392505050565b6006546001600160a01b031633146114825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611163565b6001600160a01b038216614c5c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611163565b8060026000828254614c6e91906159f9565b90915550506001600160a01b03821660009081526020819052604081208054839290614c9b9084906159f9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000614ba582846159f9565b6000614ba58284615a33565b6000614ba58284615a11565b6000614d6683615071565b905080156140f9576140f98282615167565b826000614d8484615071565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b158015614dc957600080fd5b505afa158015614ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e01919061579d565b9050614e0d8287615227565b6040516370a0823160e01b8152306004820152600090614e8d9083906001600160a01b038716906370a082319060240160206040518083038186803b158015614e5557600080fd5b505afa158015614e69573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d1919061579d565b9050614e9a858289615319565b50505050505050565b6001600160a01b038316614f075760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611163565b6001600160a01b038216614f695760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611163565b6001600160a01b03831660009081526020819052604090205481811015614fe15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401611163565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906150189084906159f9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161506491815260200190565b60405180910390a3611a95565b60004761507d8361546e565b60006150894783614b99565b9050600081116150db5760405162461bcd60e51b815260206004820152601760248201527f42616c616e6365206e6f74206869676820656e6f7567680000000000000000006044820152606401611163565b6008546000906150fe9060649061340d908590600160d01b900461ffff16614d43565b6008549091506000906151249060649061340d908690600160e01b900461ffff16614d43565b600a5490915061513d906001600160a01b03168361401f565b600b54615153906001600160a01b03168261401f565b61515d4785614b99565b9695505050505050565b600f5461517f9030906001600160a01b031684613efb565b600f5460405163d06ebe7d60e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063d06ebe7d90839060c4016060604051808303818588803b1580156151e757600080fd5b505af11580156151fb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061522091906157b6565b5050505050565b6040805160028082526060820183526000926020830190803683375050600d5482519293506001600160a01b03169183915060009061526857615268615ae6565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061529c5761529c615ae6565b6001600160a01b039283166020918202929092010152600f546040516304d464b160e01b81529116906304d464b19085906152e290600090869030904290600401615844565b6000604051808303818588803b1580156152fb57600080fd5b505af115801561530f573d6000803e3d6000fd5b5050505050505050565b600f546153319030906001600160a01b031685613efb565b600f5460405163095ea7b360e01b81526001600160a01b039182166004820152602481018490529082169063095ea7b390604401602060405180830381600087803b15801561537f57600080fd5b505af1158015615393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153b79190615653565b50600f5460405162e8e33760e81b81523060048201526001600160a01b038381166024830152604482018690526064820185905260006084830181905260a4830181905260c48301524260e48301529091169063e8e337009061010401606060405180830381600087803b15801561542e57600080fd5b505af1158015615442573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061546691906157b6565b505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106154a3576154a3615ae6565b6001600160a01b039283166020918202929092010152600d548251911690829060019081106154d4576154d4615ae6565b6001600160a01b039283166020918202929092010152600f546154fa9130911684613efb565b600f5460405163b6a046b360e01b81526001600160a01b039091169063b6a046b390615533908590600090869030904290600401615997565b600060405180830381600087803b15801561554d57600080fd5b505af1158015615466573d6000803e3d6000fd5b803561ffff8116811461186757600080fd5b60006020828403121561558557600080fd5b8135614ba581615b12565b6000602082840312156155a257600080fd5b8151614ba581615b12565b600080604083850312156155c057600080fd5b82356155cb81615b12565b915060208301356155db81615b12565b809150509250929050565b6000806000606084860312156155fb57600080fd5b833561560681615b12565b9250602084013561561681615b12565b929592945050506040919091013590565b6000806040838503121561563a57600080fd5b823561564581615b12565b946020939093013593505050565b60006020828403121561566557600080fd5b81518015158114614ba557600080fd5b60006020828403121561568757600080fd5b813567ffffffffffffffff8082111561569f57600080fd5b818401915084601f8301126156b357600080fd5b8135818111156156c5576156c5615afc565b604051601f8201601f19908116603f011681019083821181831017156156ed576156ed615afc565b8160405282815287602084870101111561570657600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561573857600080fd5b614ba582615561565b60008060006060848603121561575657600080fd5b61575f84615561565b925061576d60208501615561565b915061577b60408501615561565b90509250925092565b60006020828403121561579657600080fd5b5035919050565b6000602082840312156157af57600080fd5b5051919050565b6000806000606084860312156157cb57600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b8381101561581d5781516001600160a01b0316875295820195908201906001016157f8565b509495945050505050565b6000825161583a818460208701615a69565b9190910192915050565b84815260806020820152600061585d60808301866157e4565b6001600160a01b03949094166040830152506060015292915050565b6020815260008251806020840152615898816040850160208701615a69565b601f01601f19169190910160400192915050565b602080825260129082015271119d5b98dd1a5bdb881a5cc81b1bd8dad95960721b604082015260600190565b60208082526035908201527f6f70657261746f723a2063616c6c6572206973206e6f7420616c6c6f776564206040820152743a379031b0b636103a3434b990333ab731ba34b7b760591b606082015260800190565b60208082526044908201527f4c6971756966793a3a7365744c6971756964697479506169723a204c6971756960408201527f6469747920706169722063616e277420636f6e7461696e207a65726f206164646060820152637265737360e01b608082015260a00190565b85815284602082015260a0604082015260006159b660a08301866157e4565b6001600160a01b0394909416606083015250608001529392505050565b600061ffff8083168185168083038211156159f0576159f0615ad0565b01949350505050565b60008219821115615a0c57615a0c615ad0565b500190565b600082615a2e57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615a4d57615a4d615ad0565b500290565b600082821015615a6457615a64615ad0565b500390565b60005b83811015615a84578181015183820152602001615a6c565b83811115611a955750506000910152565b600181811c90821680615aa957607f821691505b60208210811415615aca57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461156a57600080fdfea264697066735822122000cec931157e5e85b1b0d0712c18a4dd0cd524c27fb6e4486721fc5897c8debd64736f6c634300080700336f70657261746f723a2063616c6c6572206973206e6f7420616c6c6f77656420746f2063616c6c20746869732066756e6374696f6e0000000000000000000000
Deployed ByteCode
0x6080604052600436106105055760003560e01c80637a351a1d11610297578063a457c2d711610165578063d9324079116100cc578063f2fde38b11610085578063f2fde38b14610f9c578063f4762fd614610fbc578063f98080c014610fd1578063f9f92be414611009578063fafa448914611029578063fb25c1201461104b57600080fd5b8063d932407914610efb578063dd62ed3e14610f11578063df6f663014610f31578063e9fd586214610f51578063edae876f14610f67578063f1a3da2214610f8757600080fd5b8063b29ad50a1161011e578063b29ad50a14610e2b578063bb92201414610e40578063c1316eb614610e79578063c5cc6b6a14610e99578063c851cc3214610eb9578063c957497514610ed957600080fd5b8063a457c2d714610d5b578063a4f4a76514610d7b578063a607494a14610d9b578063a9059cbb14610dbb578063ae7e1d7a14610ddb578063af10e03e14610e0b57600080fd5b806395d89b41116102095780639d93598e116101c25780639d93598e14610c9a5780639f53115614610cba578063a17252a414610cda578063a176459514610cfa578063a347511a14610d1a578063a37f4ea914610d3b57600080fd5b806395d89b4114610bf1578063982ceeb714610c065780639850d32b14610c1c578063986d614214610c3a5780639b19251a14610c5a5780639b96eece14610c7a57600080fd5b80638aba46591161025b5780638aba465914610b4e5780638da5cb5b14610b6e5780638efd5e3b14610b8c5780638f5949f914610bac5780638fda356d14610bc657806391ee586414610bdb57600080fd5b80637a351a1d14610a965780637d8e961514610ab65780638053575b14610ad6578063808a545714610b0f57806388bce12314610b2d57600080fd5b8063313ce567116103d45780635958621e116103465780636e1e9349116102ff5780636e1e9349146109ed57806370a08231146109f5578063715018a614610a2b578063737dc9bd14610a4057806373b002a514610a605780637897af8614610a7657600080fd5b80635958621e146109385780635a96cdd714610958578063626bb27414610978578063645830b41461098e578063653465bf146109ae57806369372b30146109cd57600080fd5b806340c10f191161039857806340c10f191461088e578063437f660e146108ae5780634ad1eb81146108c3578063506ee100146108e357806353a54511146108f8578063546134501461091857600080fd5b8063313ce567146107fd578063318913fb146108195780633707c31014610839578063370f0a601461084e578063395093511461086e57600080fd5b80631745685711610478578063239eb21111610431578063239eb2111461076857806323b872dd1461077d5780632a83759b1461079d5780632b112e49146107b25780632b714147146107c75780633071fed2146107dd57600080fd5b806317456857146106c357806318160ddd146106d85780631ac818a1146106ed5780631b6111111461071d5780631d5e3fe5146107325780631f53ac021461074857600080fd5b806306fdde03116104ca57806306fdde03146105e5578063095ea7b3146106075780630cd84dc6146106275780630d38ffcd1461065f57806311a63e171461068157806313ea5d29146106a157600080fd5b80625d1afc146105115780630181bb781461054757806301bbba4d1461057d57806303fcdbdf1461059f578063044e0ea2146105c157600080fd5b3661050c57005b600080fd5b34801561051d57600080fd5b5060085461053290600160f01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561055357600080fd5b5060145461056a90640100000000900461ffff1681565b60405161ffff909116815260200161053e565b34801561058957600080fd5b5060085461056a90600160a01b900461ffff1681565b3480156105ab57600080fd5b5060085461056a90600160c01b900461ffff1681565b3480156105cd57600080fd5b506105d760135481565b60405190815260200161053e565b3480156105f157600080fd5b506105fa61106b565b60405161053e9190615879565b34801561061357600080fd5b50610532610622366004615627565b6110fd565b34801561063357600080fd5b50601b54610647906001600160a01b031681565b6040516001600160a01b03909116815260200161053e565b34801561066b57600080fd5b5060085461056a90600160e01b900461ffff1681565b34801561068d57600080fd5b50600a54610647906001600160a01b031681565b3480156106ad57600080fd5b506106c16106bc366004615573565b611115565b005b3480156106cf57600080fd5b506106c161134f565b3480156106e457600080fd5b506002546105d7565b3480156106f957600080fd5b50610532610708366004615573565b60126020526000908152604090205460ff1681565b34801561072957600080fd5b506106c16113b2565b34801561073e57600080fd5b506105d760155481565b34801561075457600080fd5b506106c1610763366004615573565b611484565b34801561077457600080fd5b506105d761156d565b34801561078957600080fd5b506105326107983660046155e6565b6115f5565b3480156107a957600080fd5b506106c1611619565b3480156107be57600080fd5b506105d76116ae565b3480156107d357600080fd5b506105d760185481565b3480156107e957600080fd5b506105d76107f8366004615573565b6116d7565b34801561080957600080fd5b506040516012815260200161053e565b34801561082557600080fd5b50610532610834366004615573565b6117f9565b34801561084557600080fd5b506106c161186c565b34801561085a57600080fd5b506106c1610869366004615573565b6118c9565b34801561087a57600080fd5b50610532610889366004615627565b611953565b34801561089a57600080fd5b506106c16108a9366004615627565b611975565b3480156108ba57600080fd5b506106c1611a20565b3480156108cf57600080fd5b506106c16108de366004615573565b611a9b565b3480156108ef57600080fd5b50610647611b0a565b34801561090457600080fd5b506106c1610913366004615573565b611c23565b34801561092457600080fd5b506106c1610933366004615573565b611c92565b34801561094457600080fd5b506106c1610953366004615573565b611ddd565b34801561096457600080fd5b506106c1610973366004615573565b611ec6565b34801561098457600080fd5b506105d760195481565b34801561099a57600080fd5b50600e54610647906001600160a01b031681565b3480156109ba57600080fd5b5060145461053290610100900460ff1681565b3480156109d957600080fd5b506105326109e8366004615784565b611fb2565b6106c1611fd3565b348015610a0157600080fd5b506105d7610a10366004615573565b6001600160a01b031660009081526020819052604090205490565b348015610a3757600080fd5b506106c16121c8565b348015610a4c57600080fd5b506106c1610a5b366004615741565b6121da565b348015610a6c57600080fd5b506105d7601a5481565b348015610a8257600080fd5b506106c1610a91366004615573565b612424565b348015610aa257600080fd5b506106c1610ab1366004615573565b612496565b348015610ac257600080fd5b506106c1610ad1366004615726565b61264f565b348015610ae257600080fd5b50610532610af1366004615573565b6001600160a01b031660009081526012602052604090205460ff1690565b348015610b1b57600080fd5b50600e546001600160a01b0316610647565b348015610b3957600080fd5b5060145461056a9062010000900461ffff1681565b348015610b5a57600080fd5b506106c1610b69366004615784565b612897565b348015610b7a57600080fd5b506006546001600160a01b0316610647565b348015610b9857600080fd5b506106c1610ba7366004615784565b61291e565b348015610bb857600080fd5b506014546105329060ff1681565b348015610bd257600080fd5b506106c1612971565b348015610be757600080fd5b506105d760175481565b348015610bfd57600080fd5b506105fa6129ce565b348015610c1257600080fd5b506105d760095481565b348015610c2857600080fd5b506008546001600160a01b0316610647565b348015610c4657600080fd5b506106c1610c55366004615573565b6129dd565b348015610c6657600080fd5b506106c1610c75366004615573565b612a4f565b348015610c8657600080fd5b506105d7610c95366004615573565b612ad6565b348015610ca657600080fd5b506106c1610cb5366004615573565b612b86565b348015610cc657600080fd5b506106c1610cd5366004615675565b612e2e565b348015610ce657600080fd5b506106c1610cf5366004615573565b612ea1565b348015610d0657600080fd5b50600d54610647906001600160a01b031681565b348015610d2657600080fd5b5060065461053290600160a01b900460ff1681565b348015610d4757600080fd5b50600b54610647906001600160a01b031681565b348015610d6757600080fd5b50610532610d76366004615627565b612f25565b348015610d8757600080fd5b50600c54610647906001600160a01b031681565b348015610da757600080fd5b506106c1610db6366004615675565b612fa0565b348015610dc757600080fd5b50610532610dd6366004615627565b61307d565b348015610de757600080fd5b50610532610df6366004615573565b60116020526000908152604090205460ff1681565b348015610e1757600080fd5b506106c1610e26366004615726565b61308b565b348015610e3757600080fd5b506106c161336e565b348015610e4c57600080fd5b50610532610e5b366004615573565b6001600160a01b031660009081526011602052604090205460ff1690565b348015610e8557600080fd5b506106c1610e94366004615726565b6136cc565b348015610ea557600080fd5b50601054610647906001600160a01b031681565b348015610ec557600080fd5b506106c1610ed4366004615573565b6137eb565b348015610ee557600080fd5b5060085461056a90600160d01b900461ffff1681565b348015610f0757600080fd5b5061056a6103e881565b348015610f1d57600080fd5b506105d7610f2c3660046155ad565b613986565b348015610f3d57600080fd5b506106c1610f4c366004615784565b6139b1565b348015610f5d57600080fd5b506105d760165481565b348015610f7357600080fd5b50600f54610647906001600160a01b031681565b348015610f9357600080fd5b506106c1613ba8565b348015610fa857600080fd5b506106c1610fb7366004615573565b613c3c565b348015610fc857600080fd5b506106c1613cb2565b348015610fdd57600080fd5b506105d7610fec366004615675565b805160208183018101805160078252928201919093012091525481565b34801561101557600080fd5b506106c1611024366004615573565b613d3e565b34801561103557600080fd5b5060085461056a90600160b01b900461ffff1681565b34801561105757600080fd5b506106c1611066366004615726565b613dd8565b60606003805461107a90615a95565b80601f01602080910402602001604051908101604052809291908181526020018280546110a690615a95565b80156110f35780601f106110c8576101008083540402835291602001916110f3565b820191906000526020600020905b8154815290600101906020018083116110d657829003601f168201915b5050505050905090565b60003361110b818585613efb565b5060019392505050565b336111286006546001600160a01b031690565b6001600160a01b0316148061114757506008546001600160a01b031633145b61116c5760405162461bcd60e51b8152600401611163906158d8565b60405180910390fd5b60408051808201909152600a81526936b0b4b73a30b4b732b960b11b6020820152600654600160a01b900460ff16158061122657506007816040516111b19190615828565b9081526020016040518091039020546000141580156111ee5750426007826040516111dc9190615828565b90815260200160405180910390205411155b80156112265750426201518060078360405161120a9190615828565b90815260200160405180910390205461122391906159f9565b10155b6112425760405162461bcd60e51b8152600401611163906158ac565b6008546001600160a01b0383811691161480159061126857506001600160a01b03821615155b6112f35760405162461bcd60e51b815260206004820152605060248201527f41424f41543a3a7365744d61696e7461696e65723a204d61696e7461696e657260448201527f2063616e277420657175616c2070726576696f7573206d61696e7461696e657260648201526f206f72207a65726f206164647265737360801b608482015260a401611163565b600880546001600160a01b038481166001600160a01b0319831681179093556040519116919082907f2f3ffaaaad93928855c8700645d1a3643e6ccfdd500efa9fda048a88f557cf0190600090a35061134b81612e2e565b5050565b336113626006546001600160a01b031690565b6001600160a01b0316148061138157506008546001600160a01b031633145b61139d5760405162461bcd60e51b8152600401611163906158d8565b6008805460ff60f01b1916600160f01b179055565b336113c56006546001600160a01b031690565b6001600160a01b031614806113e457506008546001600160a01b031633145b6114005760405162461bcd60e51b8152600401611163906158d8565b60004711611478576040805162461bcd60e51b81526020600482015260248101919091527f41424f41543a3a636c61696d457863656564696e674c6971756964697479546f60448201527f6b656e42616c616e63653a204e6f20657863656564696e672062616c616e63656064820152608401611163565b611482334761401f565b565b336114976006546001600160a01b031690565b6001600160a01b031614806114b657506008546001600160a01b031633145b6114d25760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b0381166115435760405162461bcd60e51b815260206004820152603260248201527f41424f41543a3a73657444657657616c6c65743a20416464726573732063616e6044820152712774206265207a65726f206164647265737360701b6064820152608401611163565b600a80546001600160a01b0319166001600160a01b03831690811790915561156a906118c9565b50565b6000611577611b0a565b6040516370a0823160e01b81523060048201526001600160a01b0391909116906370a082319060240160206040518083038186803b1580156115b857600080fd5b505afa1580156115cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f0919061579d565b905090565b6000336116038582856140fe565b61160e858585614172565b506001949350505050565b3361162c6006546001600160a01b031690565b6001600160a01b0316148061164b57506008546001600160a01b031633145b6116675760405162461bcd60e51b8152600401611163906158d8565b6014805461ffff19166001179081905560405161010090910460ff161515907f4c67d13291f7fe21c52eee8f752cbc5c7451e593e18093d087403081206fd46c90600090a2565b600c546001600160a01b03166000908152602081905260408120546115f0906002545b90614b99565b601454600090610100900460ff16156116f35750612328919050565b60006116fe83612ad6565b905061170960025490565b811115611725575050600854600160b01b900461ffff16919050565b620186a061173260025490565b61173c9190615a11565b811015611758575050600854600160a01b900461ffff16919050565b600061176360025490565b61177083620186a0615a33565b61177a9190615a11565b905060648111156117e3576008546000906064906117a4908490600160a01b900461ffff166159f9565b6117ae9190615a52565b600854909150600160b01b900461ffff1681116117cb57806117da565b600854600160b01b900461ffff165b95945050505050565b5050600854600160a01b900461ffff1692915050565b60003361180e6006546001600160a01b031690565b6001600160a01b0316148061182d57506008546001600160a01b031633145b6118495760405162461bcd60e51b8152600401611163906158d8565b506001600160a01b0381166000908152601d602052604090205460ff165b919050565b3361187f6006546001600160a01b031690565b6001600160a01b0316148061189e57506008546001600160a01b031633145b6118ba5760405162461bcd60e51b8152600401611163906158d8565b6008805460ff60f01b19169055565b336118dc6006546001600160a01b031690565b6001600160a01b031614806118fb57506008546001600160a01b031633145b6119175760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b031660009081526011602090815260408083208054600160ff1991821681179092556012909352922080549091169091179055565b60003361110b8185856119668383613986565b61197091906159f9565b613efb565b61197d614bac565b6013548161198a60025490565b61199491906159f9565b1115611a165760405162461bcd60e51b8152602060048201526044602482018190527f41424f41543a3a6d696e743a2043616e2774206d696e74206d6f72652061626f908201527f617420746f6b656e207468616e206d6178446973747269627574696f6e20616c6064820152636c6f777360e01b608482015260a401611163565b61134b8282614c06565b601b546001600160a01b03161561148257601b60009054906101000a90046001600160a01b03166001600160a01b031663673a7e286040518163ffffffff1660e01b8152600401600060405180830381600087803b158015611a8157600080fd5b505af1158015611a95573d6000803e3d6000fd5b50505050565b33611aae6006546001600160a01b031690565b6001600160a01b03161480611acd57506008546001600160a01b031633145b611ae95760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601160205260409020805460ff19169055565b600e5460408051630dfe168160e01b815290516000926001600160a01b03169183918391630dfe1681916004808301926020929190829003018186803b158015611b5357600080fd5b505afa158015611b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b8b9190615590565b90506000826001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc857600080fd5b505afa158015611bdc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c009190615590565b90506001600160a01b038216301415611c195780611c1b565b815b935050505090565b33611c366006546001600160a01b031690565b6001600160a01b03161480611c5557506008546001600160a01b031633145b611c715760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601260205260409020805460ff19169055565b611c9a614bac565b601b546001600160a01b03828116911614801590611cc057506001600160a01b03811615155b611d685760405162461bcd60e51b815260206004820152606760248201527f41424f41543a3a7365744d6173746572456e7465727461696e65723a204d617360448201527f74657220656e7465727461696e65722063616e277420657175616c207072657660648201527f696f7573206d617374657220656e7465727461696e6572206f72207a65726f206084820152666164647265737360c81b60a482015260c401611163565b601b80546001600160a01b038381166001600160a01b031983161790925516611d90826118c9565b611d9982613c3c565b816001600160a01b0316816001600160a01b03167fdbc41a91ae00463e0c8208e05c807f2559c82a27989b5dd9f984e3a0b8059d6960405160405180910390a35050565b33611df06006546001600160a01b031690565b6001600160a01b03161480611e0f57506008546001600160a01b031633145b611e2b5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b038116611e9f5760405162461bcd60e51b815260206004820152603560248201527f41424f41543a3a73657452657761726457616c6c65743a20416464726573732060448201527463616e2774206265207a65726f206164647265737360581b6064820152608401611163565b600c80546001600160a01b0319166001600160a01b03831690811790915561156a906118c9565b33611ed96006546001600160a01b031690565b6001600160a01b03161480611ef857506008546001600160a01b031633145b611f145760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b038116611f905760405162461bcd60e51b815260206004820152603760248201527f41424f41543a3a736574446f6e6174696f6e57616c6c65743a2041646472657360448201527f732063616e2774206265207a65726f20616464726573730000000000000000006064820152608401611163565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600060135482611fc160025490565b611fcb91906159f9565b111592915050565b336000908152601c602052604090205460ff1661204c5760405162461bcd60e51b815260206004820152603160248201527f41424f41543a3a7265717565737457686974656c6973743a20596f7520617265604482015270206e6f7420626c61636b6c69737465642160781b6064820152608401611163565b336000908152601d602052604090205460ff16156120d25760405162461bcd60e51b815260206004820152603960248201527f41424f41543a3a7265717565737457686974656c6973743a20596f7520616c7260448201527f65616479207265717565737465642077686974656c69737421000000000000006064820152608401611163565b6015543410156121705760405162461bcd60e51b815260206004820152605a60248201527f41424f41543a3a7265717565737457686974656c6973743a20416d6f756e742060448201527f6f6620626e6220746f20636c61696d2073686f756c642063617272792074686560648201527f20636f737420746f206164642074686520636c61696d61626c65000000000000608482015260a401611163565b600a54612186906001600160a01b03163461401f565b336000818152601d6020526040808220805460ff19166001179055517fd0401c9f53bc0a133a6eb391664575ad9c8e05bdda210963e7e75591938ee5109190a2565b6121d0614bac565b6114826000614ce5565b336121ed6006546001600160a01b031690565b6001600160a01b0316148061220c57506008546001600160a01b031633145b6122285760405162461bcd60e51b8152600401611163906158d8565b6040805180820190915260098152680eae0c8c2e8caa8c2f60bb1b6020820152600654600160a01b900460ff1615806122e1575060078160405161226c9190615828565b9081526020016040518091039020546000141580156122a95750426007826040516122979190615828565b90815260200160405180910390205411155b80156122e1575042620151806007836040516122c59190615828565b9081526020016040518091039020546122de91906159f9565b10155b6122fd5760405162461bcd60e51b8152600401611163906158ac565b60648261230a85876159d3565b61231491906159d3565b61ffff16111561237d5760405162461bcd60e51b815260206004820152602e60248201527f41424f41543a3a7570646174655461783a205461782063616e7420657863656560448201526d64203130302070657263656e742160901b6064820152608401611163565b6008805463ffffffff60c01b1916600160c01b61ffff878116820261ffff60d01b191692909217600160d01b87841681029190911761ffff60e01b1916600160e01b87851681029190911794859055604080519386048516845291850484166020840152909304909116918101919091527f49b216608947f85b55485549bcbeb9b3885d85690a8ecce31f0b27e390af5c7a9060600160405180910390a1611a9581612e2e565b336124376006546001600160a01b031690565b6001600160a01b0316148061245657506008546001600160a01b031633145b6124725760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601160205260409020805460ff19166001179055565b336124a96006546001600160a01b031690565b6001600160a01b031614806124c857506008546001600160a01b031633145b6124e45760405162461bcd60e51b8152600401611163906158d8565b60408051808201909152600f81526e6c705f706169725f6164647265737360881b6020820152600654600160a01b900460ff1615806125a3575060078160405161252e9190615828565b90815260200160405180910390205460001415801561256b5750426007826040516125599190615828565b90815260200160405180910390205411155b80156125a3575042620151806007836040516125879190615828565b9081526020016040518091039020546125a091906159f9565b10155b6125bf5760405162461bcd60e51b8152600401611163906158ac565b6001600160a01b0382166125e55760405162461bcd60e51b81526004016111639061592d565b600e80546001600160a01b0319166001600160a01b03841690811790915561260c90612424565b600e546040516001600160a01b039091169033907f6c587433dea122b342b093acb4dde076ca1a441413e43a5a14dde8a8842c944790600090a361134b81612e2e565b336126626006546001600160a01b031690565b6001600160a01b0316148061268157506008546001600160a01b031633145b61269d5760405162461bcd60e51b8152600401611163906158d8565b6040805180820190915260078152660dad2dcbee8c2f60cb1b6020820152600654600160a01b900460ff16158061275457506007816040516126df9190615828565b90815260200160405180910390205460001415801561271c57504260078260405161270a9190615828565b90815260200160405180910390205411155b8015612754575042620151806007836040516127389190615828565b90815260200160405180910390205461275191906159f9565b10155b6127705760405162461bcd60e51b8152600401611163906158ac565b60085461ffff600160b01b909104811690831611156128295760405162461bcd60e51b815260206004820152606360248201527f41424f41543a3a7570646174654d696e696d756d5472616e736665725461785260448201527f6174653a206d696e696d756d5472616e7366657254617852617465206d75737460648201527f206e6f7420657863656564206d6178696d756d5472616e7366657254617852616084820152623a329760e91b60a482015260c401611163565b60085460408051600160a01b90920461ffff90811683528416602083015233917fb2f2e219f74b4a7e339376870ae1b18d655e3cf85f60dc47f56e7cd7bad470c5910160405180910390a26008805461ffff60a01b1916600160a01b61ffff85160217905561134b81612e2e565b336128aa6006546001600160a01b031690565b6001600160a01b031614806128c957506008546001600160a01b031633145b6128e55760405162461bcd60e51b8152600401611163906158d8565b6015805490829055604051829082907fa4257144dd1cd8b911052d6273102723e361f2b03e4cb7312cf347093492db7890600090a35050565b336129316006546001600160a01b031690565b6001600160a01b0316148061295057506008546001600160a01b031633145b61296c5760405162461bcd60e51b8152600401611163906158d8565b600955565b336129846006546001600160a01b031690565b6001600160a01b031614806129a357506008546001600160a01b031633145b6129bf5760405162461bcd60e51b8152600401611163906158d8565b6014805460ff19166001179055565b60606004805461107a90615a95565b336129f06006546001600160a01b031690565b6001600160a01b03161480612a0f57506008546001600160a01b031633145b612a2b5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b33612a626006546001600160a01b031690565b6001600160a01b03161480612a8157506008546001600160a01b031633145b612a9d5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601c60209081526040808320805460ff19908116600117909155601d90925290912080549091169055565b601b546040516394d45b5960e01b81526001600160a01b03838116600483015260006024830181905292612b80929116906394d45b599060440160206040518083038186803b158015612b2857600080fd5b505afa158015612b3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b60919061579d565b6001600160a01b0384166000908152602081905260409020545b90614d37565b92915050565b33612b996006546001600160a01b031690565b6001600160a01b03161480612bb857506008546001600160a01b031633145b612bd45760405162461bcd60e51b8152600401611163906158d8565b60408051808201909152600781526636382fb830b4b960c91b6020820152600654600160a01b900460ff161580612c8b5750600781604051612c169190615828565b908152602001604051809103902054600014158015612c53575042600782604051612c419190615828565b90815260200160405180910390205411155b8015612c8b57504262015180600783604051612c6f9190615828565b908152602001604051809103902054612c8891906159f9565b10155b612ca75760405162461bcd60e51b8152600401611163906158ac565b6001600160a01b038216612ccd5760405162461bcd60e51b81526004016111639061592d565b60105460405163e6a4390560e01b81523060048201526001600160a01b0384811660248301529091169063e6a439059060440160206040518083038186803b158015612d1857600080fd5b505afa158015612d2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d509190615590565b600e80546001600160a01b0319166001600160a01b03929092169182179055612e19576010546040516364e329cb60e11b81523060048201526001600160a01b0384811660248301529091169063c9c6539690604401602060405180830381600087803b158015612dc057600080fd5b505af1158015612dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612df89190615590565b600e80546001600160a01b0319166001600160a01b03929092169190911790555b600e5461260c906001600160a01b0316612424565b33612e416006546001600160a01b031690565b6001600160a01b03161480612e6057506008546001600160a01b031633145b612e7c5760405162461bcd60e51b8152600401611163906158d8565b6000600782604051612e8e9190615828565b9081526040519081900360200190205550565b33612eb46006546001600160a01b031690565b6001600160a01b03161480612ed357506008546001600160a01b031633145b612eef5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b03166000908152601160209081526040808320805460ff19908116909155601290925290912080549091169055565b60003381612f338286613986565b905083811015612f935760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401611163565b61160e8286868403613efb565b33612fb36006546001600160a01b031690565b6001600160a01b03161480612fd257506008546001600160a01b031633145b612fee5760405162461bcd60e51b8152600401611163906158d8565b612ffb62015180426159f9565b60078260405161300b9190615828565b90815260200160405180910390208190555060078160405161302d9190615828565b9081526020016040518091039020548160405161304a9190615828565b604051908190038120907ff77f9a799fe8b0be1463abd7459a18fc55dfd8a6a24ddd29b54fd098088089c890600090a350565b60003361110b818585614172565b3361309e6006546001600160a01b031690565b6001600160a01b031614806130bd57506008546001600160a01b031633145b6130d95760405162461bcd60e51b8152600401611163906158d8565b6040805180820190915260078152660dac2f0bee8c2f60cb1b6020820152600654600160a01b900460ff161580613190575060078160405161311b9190615828565b9081526020016040518091039020546000141580156131585750426007826040516131469190615828565b90815260200160405180910390205411155b8015613190575042620151806007836040516131749190615828565b90815260200160405180910390205461318d91906159f9565b10155b6131ac5760405162461bcd60e51b8152600401611163906158ac565b60085461ffff600160a01b909104811690831610156132675760405162461bcd60e51b815260206004820152606560248201527f41424f41543a3a7570646174654d6178696d756d5472616e736665725461785260448201527f6174653a206d6178696d756d5472616e7366657254617852617465206d75737460648201527f206e6f742062652062656c6f77206d696e696d756d5472616e736665725461786084820152642930ba329760d91b60a482015260c401611163565b6103e861ffff831611156133005760405162461bcd60e51b815260206004820152605460248201527f41424f41543a3a7570646174654d6178696d756d5472616e736665725461785260448201527f6174653a206d6178696d756d5472616e7366657254617852617465206d7573746064820152731032bc31b2b2b21026a0ac24a6aaa6afaa20ac1760611b608482015260a401611163565b60085460408051600160a01b90920461ffff90811683528416602083015233917ffc18b74e18e9bf8100ca625de9f64c93e88284a81d82c9edfc899869f34b506f910160405180910390a26008805461ffff60b01b1916600160b01b61ffff85160217905561134b81612e2e565b6008805463ffffffff60a01b1981169182905561ffff600160a01b8204811692600160b01b909204169060ff600160f01b90910416156133ad57613694565b6008805460ff60f01b1916600160f01b179055306000908152602081905260408120549050600954811061368557600e546008546001600160a01b03909116906000906134139060649061340d908690600160d01b900461ffff16614d43565b90614d4f565b6008549091506000906134399060649061340d908790600160e01b900461ffff16614d43565b90506000613450600261340d846116d18988614b99565b9050600061345e8683614b99565b90506000856001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561349b57600080fd5b505afa1580156134af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134d39190615590565b90506000866001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b15801561351057600080fd5b505afa158015613524573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135489190615590565b9050806001600160a01b0316826001600160a01b031614156135d25760405162461bcd60e51b815260206004820152603e60248201527f496e76616c6964206c6971756469747920706169723a20506169722063616e2760448201527f7420636f6e7461696e207468652073616d6520746f6b656e20747769636500006064820152608401611163565b600d546000906001600160a01b03848116911614806135fe5750600d546001600160a01b038381169116145b905060008115613617576136128587614d5b565b61363a565b61363a6001600160a01b0385163014156136315783613633565b845b8688614d78565b60408051868152602081018390529081018790527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15050505050505050505b506008805460ff60f01b191690555b6008805463ffffffff60a01b1916600160a01b61ffff9485160261ffff60b01b191617600160b01b9290931691909102919091179055565b336136df6006546001600160a01b031690565b6001600160a01b031614806136fe57506008546001600160a01b031633145b61371a5760405162461bcd60e51b8152600401611163906158d8565b600a8161ffff16116137945760405162461bcd60e51b815260206004820152603d60248201527f4d6178207472616e73616374696f6e2073697a652063616e2774206265206c6f60448201527f776572207468616e20302e3125206f6620746f74616c20737570706c790000006064820152608401611163565b6014805461ffff8381166201000090810263ffff000019841617938490556040519281900482169304169082907f8f171bb23056cced8a730912e267dbf04c43510f33032f06a749b0ccdc8587b490600090a35050565b336137fe6006546001600160a01b031690565b6001600160a01b0316148061381d57506008546001600160a01b031633145b6138395760405162461bcd60e51b8152600401611163906158d8565b604080518082019091526006808252653937baba32b960d11b602083015254600160a01b900460ff1615806138ee57506007816040516138799190615828565b9081526020016040518091039020546000141580156138b65750426007826040516138a49190615828565b90815260200160405180910390205411155b80156138ee575042620151806007836040516138d29190615828565b9081526020016040518091039020546138eb91906159f9565b10155b61390a5760405162461bcd60e51b8152600401611163906158ac565b600f80546001600160a01b0319166001600160a01b0384811691909117909155600d546139379116612b86565b61394082612424565b600e546040516001600160a01b039182169184169033907feb7c1e97c05570337fe795ab9d5755a8f731c9c52e756b720275940fa283327690600090a461134b81612e2e565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336139c46006546001600160a01b031690565b6001600160a01b031614806139e357506008546001600160a01b031633145b6139ff5760405162461bcd60e51b8152600401611163906158d8565b60408051808201909152601081526f36b0bc2fb234b9ba3934b13aba34b7b760811b6020820152600654600160a01b900460ff161580613abf5750600781604051613a4a9190615828565b908152602001604051809103902054600014158015613a87575042600782604051613a759190615828565b90815260200160405180910390205411155b8015613abf57504262015180600783604051613aa39190615828565b908152602001604051809103902054613abc91906159f9565b10155b613adb5760405162461bcd60e51b8152600401611163906158ac565b6002548211613b6f5760405162461bcd60e51b815260206004820152605460248201527f41424f41543a3a7365744d6178446973747269627574696f6e3a20446973747260448201527f69627574696f6e2063616e2774206265206c6f776572207468616e207468652060648201527363757272656e7420746f74616c20737570706c7960601b608482015260a401611163565b601382905560405182907f0a7e08474511c62a58c1dc04d12cff13c93670ffc4d0056882f95ebfe2df50ed90600090a261134b81612e2e565b33613bbb6006546001600160a01b031690565b6001600160a01b03161480613bda57506008546001600160a01b031633145b613bf65760405162461bcd60e51b8152600401611163906158d8565b6014805461ff00191661010090811791829055604051910460ff161515907f4c67d13291f7fe21c52eee8f752cbc5c7451e593e18093d087403081206fd46c90600090a2565b613c44614bac565b6001600160a01b038116613ca95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611163565b61156a81614ce5565b33613cc56006546001600160a01b031690565b6001600160a01b03161480613ce457506008546001600160a01b031633145b613d005760405162461bcd60e51b8152600401611163906158d8565b6006805460ff60a01b1916600160a01b1790556040517f2c08b62bfac9a1b19bb1dec9323f1ce01696a77948b256abf3603d30f25a864e90600090a1565b33613d516006546001600160a01b031690565b6001600160a01b03161480613d7057506008546001600160a01b031633145b613d8c5760405162461bcd60e51b8152600401611163906158d8565b6001600160a01b0381166000818152601c6020526040808220805460ff19166001179055517fffa4e6181777692565cf28528fc88fd1516ea86b56da075235fa575af6a4b8559190a250565b33613deb6006546001600160a01b031690565b6001600160a01b03161480613e0a57506008546001600160a01b031633145b613e265760405162461bcd60e51b8152600401611163906158d8565b60648161ffff1611613ea05760405162461bcd60e51b815260206004820152603a60248201527f4d6178206163636f756e742062616c616e63652063616e2774206265206c6f7760448201527f6572207468616e203125206f6620746f74616c20737570706c790000000000006064820152608401611163565b6014805461ffff83811664010000000090810265ffff0000000019841617938490556040519281900482169304169082907f537619d54465d4bf80b6c360206170815aa95deaa5993a7c17ab783706693a4d90600090a35050565b6001600160a01b038316613f5d5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401611163565b6001600160a01b038216613fbe5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401611163565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b604080516000808252602082019092526001600160a01b0384169083906040516140499190615828565b60006040518083038185875af1925050503d8060008114614086576040519150601f19603f3d011682016040523d82523d6000602084013e61408b565b606091505b50509050806140f95760405162461bcd60e51b815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527308115512081d1c985b9cd9995c8819985a5b195960621b6064820152608401611163565b505050565b600061410a8484613986565b90506000198114611a9557818110156141655760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401611163565b611a958484848403613efb565b600260055414156141c55760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611163565b60026005556001600160a01b0383166142395760405162461bcd60e51b815260206004820152603060248201527f41424f41543a3a5f7472616e736665723a207472616e736665722066726f6d2060448201526f746865207a65726f206164647265737360801b6064820152608401611163565b6001600160a01b0382166142a65760405162461bcd60e51b815260206004820152602e60248201527f41424f41543a3a5f7472616e736665723a207472616e7366657220746f20746860448201526d65207a65726f206164647265737360901b6064820152608401611163565b6000811161431c5760405162461bcd60e51b815260206004820152603a60248201527f41424f41543a3a5f7472616e736665723a5472616e7366657220616d6f756e7460448201527f206d7573742062652067726561746572207468616e207a65726f0000000000006064820152608401611163565b6001600160a01b0383166000908152602081905260409020548111156143ba5760405162461bcd60e51b815260206004820152604760248201527f41424f41543a3a5f7472616e736665723a5472616e7366657220616d6f756e7460448201527f206d757374206265206c6f776572206f7220657175616c2073656e646572732060648201526662616c616e636560c81b608482015260a401611163565b6001600160a01b0383166000908152601c602052604090205460ff16156144a15760405162461bcd60e51b815260206004820152608360248201527f41424f41543a3a5f7472616e736665723a596f752772652063757272656e746c60448201527f7920626c61636b6c69737465642e20506c65617365207265706f727420746f2060648201527f736572766963654074616c6b61626f61742e6f6e6c696e6520696620796f752060848201527f77616e7420746f206765742072656d6f7665642066726f6d20626c61636b6c6960a48201526273742160e81b60c482015260e401611163565b60145461ffff62010000909104166144b860025490565b6144c483612710615a33565b6144ce9190615a11565b1115806144e857506006546001600160a01b038481169116145b8061450057506008546001600160a01b038481169116145b8061452357506001600160a01b03831660009081526011602052604090205460ff165b8061454657506001600160a01b03831660009081526012602052604090205460ff165b6145c25760405162461bcd60e51b815260206004820152604160248201527f596f7572207472616e73666572206578636565647320746865206d6178696d7560448201527f6d20706f737369626c6520616d6f756e7420706572207472616e73616374696f6064820152603760f91b608482015260a401611163565b60145461ffff640100000000909104166145db60025490565b6145e484612ad6565b6145ee90846159f9565b6145fa90612710615a33565b6146049190615a11565b11158061461e57506006546001600160a01b038381169116145b8061463657506008546001600160a01b038381169116145b8061464957506001600160a01b03821630145b8061466c57506001600160a01b03821660009081526012602052604090205460ff165b8061468f57506001600160a01b03821660009081526011602052604090205460ff165b614703576040805162461bcd60e51b81526020600482015260248101919091527f41424f41543a3a5f7472616e736665723a42616c616e6365206f66207265636960448201527f7069656e742063616e277420657863656564206d617841636342616c616e63656064820152608401611163565b60145460ff168061472157506006546001600160a01b038481169116145b8061473957506008546001600160a01b038481169116145b8061475c57506001600160a01b03821660009081526012602052604090205460ff165b8061477f57506001600160a01b03831660009081526011602052604090205460ff165b6147f15760405162461bcd60e51b815260206004820152603760248201527f41424f41543a3a5f7472616e736665723a436f6e7472616374206973206e6f7460448201527f20796574206f70656e20666f7220636f6d6d756e6974790000000000000000006064820152608401611163565b601454610100900460ff16158061481557506008546001600160a01b038481169116145b8061482d57506006546001600160a01b038481169116145b8061487357506001600160a01b03831660009081526011602052604090205460ff16801561487357506001600160a01b03821660009081526012602052604090205460ff165b80156148e157506001600160a01b038216158061489b5750600854600160b01b900461ffff16155b806148be57506001600160a01b03821660009081526012602052604090205460ff165b806148e157506001600160a01b03831660009081526011602052604090205460ff165b156148f6576148f1838383614ea3565b614b87565b600061491161271061340d61490a876116d7565b8590614d43565b6008549091506000906149379060649061340d908590600160c01b900461ffff16614d43565b60085490915060009061495d9060649061340d908690600160d01b900461ffff16614d43565b6008549091506000906149839060649061340d908790600160e01b900461ffff16614d43565b9050600061499f61499883612b7a8787614d37565b8690614b99565b905081836149ad83876159f9565b6149b791906159f9565b6149c191906159f9565b8514614a355760405162461bcd60e51b815260206004820152603f60248201527f41424f41543a3a7472616e736665723a2046656520616d6f756e7420646f657360448201527f206e6f7420657175616c207468652073706c69742066656520616d6f756e74006064820152608401611163565b6000614a418787614b99565b9050614a4d86826159f9565b8714614ad95760405162461bcd60e51b815260206004820152604f60248201527f41424f41543a3a7472616e736665723a20616d6f756e7420746f2073656e642060448201527f776974682074617820616d6f756e742065786365656473206d6178696d756d2060648201526e1c1bdcdcda589b1948185b5bdd5b9d608a1b608482015260a401611163565b614af8893085614ae988876159f9565b614af391906159f9565b614ea3565b614b03898983614ea3565b600c54614b1b908a906001600160a01b031687614ea3565b8096508560166000828254614b3091906159f9565b925050819055508360176000828254614b4991906159f9565b925050819055508260186000828254614b6291906159f9565b9250508190555081601a6000828254614b7b91906159f9565b90915550505050505050505b614b8f611a20565b5050600160055550565b6000614ba58284615a52565b9392505050565b6006546001600160a01b031633146114825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611163565b6001600160a01b038216614c5c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401611163565b8060026000828254614c6e91906159f9565b90915550506001600160a01b03821660009081526020819052604081208054839290614c9b9084906159f9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000614ba582846159f9565b6000614ba58284615a33565b6000614ba58284615a11565b6000614d6683615071565b905080156140f9576140f98282615167565b826000614d8484615071565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a082319060240160206040518083038186803b158015614dc957600080fd5b505afa158015614ddd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614e01919061579d565b9050614e0d8287615227565b6040516370a0823160e01b8152306004820152600090614e8d9083906001600160a01b038716906370a082319060240160206040518083038186803b158015614e5557600080fd5b505afa158015614e69573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116d1919061579d565b9050614e9a858289615319565b50505050505050565b6001600160a01b038316614f075760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401611163565b6001600160a01b038216614f695760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401611163565b6001600160a01b03831660009081526020819052604090205481811015614fe15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401611163565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906150189084906159f9565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161506491815260200190565b60405180910390a3611a95565b60004761507d8361546e565b60006150894783614b99565b9050600081116150db5760405162461bcd60e51b815260206004820152601760248201527f42616c616e6365206e6f74206869676820656e6f7567680000000000000000006044820152606401611163565b6008546000906150fe9060649061340d908590600160d01b900461ffff16614d43565b6008549091506000906151249060649061340d908690600160e01b900461ffff16614d43565b600a5490915061513d906001600160a01b03168361401f565b600b54615153906001600160a01b03168261401f565b61515d4785614b99565b9695505050505050565b600f5461517f9030906001600160a01b031684613efb565b600f5460405163d06ebe7d60e01b8152306004820152602481018490526000604482018190526064820181905260848201524260a48201526001600160a01b039091169063d06ebe7d90839060c4016060604051808303818588803b1580156151e757600080fd5b505af11580156151fb573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061522091906157b6565b5050505050565b6040805160028082526060820183526000926020830190803683375050600d5482519293506001600160a01b03169183915060009061526857615268615ae6565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061529c5761529c615ae6565b6001600160a01b039283166020918202929092010152600f546040516304d464b160e01b81529116906304d464b19085906152e290600090869030904290600401615844565b6000604051808303818588803b1580156152fb57600080fd5b505af115801561530f573d6000803e3d6000fd5b5050505050505050565b600f546153319030906001600160a01b031685613efb565b600f5460405163095ea7b360e01b81526001600160a01b039182166004820152602481018490529082169063095ea7b390604401602060405180830381600087803b15801561537f57600080fd5b505af1158015615393573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906153b79190615653565b50600f5460405162e8e33760e81b81523060048201526001600160a01b038381166024830152604482018690526064820185905260006084830181905260a4830181905260c48301524260e48301529091169063e8e337009061010401606060405180830381600087803b15801561542e57600080fd5b505af1158015615442573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061546691906157b6565b505050505050565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106154a3576154a3615ae6565b6001600160a01b039283166020918202929092010152600d548251911690829060019081106154d4576154d4615ae6565b6001600160a01b039283166020918202929092010152600f546154fa9130911684613efb565b600f5460405163b6a046b360e01b81526001600160a01b039091169063b6a046b390615533908590600090869030904290600401615997565b600060405180830381600087803b15801561554d57600080fd5b505af1158015615466573d6000803e3d6000fd5b803561ffff8116811461186757600080fd5b60006020828403121561558557600080fd5b8135614ba581615b12565b6000602082840312156155a257600080fd5b8151614ba581615b12565b600080604083850312156155c057600080fd5b82356155cb81615b12565b915060208301356155db81615b12565b809150509250929050565b6000806000606084860312156155fb57600080fd5b833561560681615b12565b9250602084013561561681615b12565b929592945050506040919091013590565b6000806040838503121561563a57600080fd5b823561564581615b12565b946020939093013593505050565b60006020828403121561566557600080fd5b81518015158114614ba557600080fd5b60006020828403121561568757600080fd5b813567ffffffffffffffff8082111561569f57600080fd5b818401915084601f8301126156b357600080fd5b8135818111156156c5576156c5615afc565b604051601f8201601f19908116603f011681019083821181831017156156ed576156ed615afc565b8160405282815287602084870101111561570657600080fd5b826020860160208301376000928101602001929092525095945050505050565b60006020828403121561573857600080fd5b614ba582615561565b60008060006060848603121561575657600080fd5b61575f84615561565b925061576d60208501615561565b915061577b60408501615561565b90509250925092565b60006020828403121561579657600080fd5b5035919050565b6000602082840312156157af57600080fd5b5051919050565b6000806000606084860312156157cb57600080fd5b8351925060208401519150604084015190509250925092565b600081518084526020808501945080840160005b8381101561581d5781516001600160a01b0316875295820195908201906001016157f8565b509495945050505050565b6000825161583a818460208701615a69565b9190910192915050565b84815260806020820152600061585d60808301866157e4565b6001600160a01b03949094166040830152506060015292915050565b6020815260008251806020840152615898816040850160208701615a69565b601f01601f19169190910160400192915050565b602080825260129082015271119d5b98dd1a5bdb881a5cc81b1bd8dad95960721b604082015260600190565b60208082526035908201527f6f70657261746f723a2063616c6c6572206973206e6f7420616c6c6f776564206040820152743a379031b0b636103a3434b990333ab731ba34b7b760591b606082015260800190565b60208082526044908201527f4c6971756966793a3a7365744c6971756964697479506169723a204c6971756960408201527f6469747920706169722063616e277420636f6e7461696e207a65726f206164646060820152637265737360e01b608082015260a00190565b85815284602082015260a0604082015260006159b660a08301866157e4565b6001600160a01b0394909416606083015250608001529392505050565b600061ffff8083168185168083038211156159f0576159f0615ad0565b01949350505050565b60008219821115615a0c57615a0c615ad0565b500190565b600082615a2e57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615615a4d57615a4d615ad0565b500290565b600082821015615a6457615a64615ad0565b500390565b60005b83811015615a84578181015183820152602001615a6c565b83811115611a955750506000910152565b600181811c90821680615aa957607f821691505b60208210811415615aca57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461156a57600080fdfea264697066735822122000cec931157e5e85b1b0d0712c18a4dd0cd524c27fb6e4486721fc5897c8debd64736f6c63430008070033