Contract Address Details

0x186B1B6CE63932a34FAa8D08bB11B775591Fd6f4

Token
Aboat Token (ABOAT)
Creator
0x912e63–ae3ff6 at 0xf2ae67–158683
Balance
0 KAI ( )
Tokens
Fetching tokens...
Transactions
1,641 Transactions
Transfers
3,941 Transfers
Gas Used
116,329,204
Last Balance Update
24325364
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