ETH Price: $3,280.43 (+0.87%)
Gas: 1 Gwei

Token

Shiba Chocolate | t.me/ShibaChocolate (SHOCO 🍫)
 

Overview

Max Total Supply

1,000,000,000,000,000 SHOCO 🍫

Holders

855

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
1,643,018,484,929,468,780.397567549 SHOCO 🍫

Value
$0.00
0x1f9e2b2f729d93ca63ed3fad92b40cfd3e97085f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Shoco

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 40 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-06-05
*/

// $SHOCO - ShibaChocolate
// Telegram: https://t.me/ShibaChocolate
// Fair Launch, no Dev Tokens. 100% LP.
// Snipers will be nuked.

// LP Lock immediately on launch.
// Ownership will be renounced 30 minutes after launch.

// Slippage Recommended: 9-12%
// No supply limit: 60s cooldown between transfers.

/**
 *                   ▄              ▄
 *                  ▌▒█           ▄▀▒▌
 *                  ▌▒▒█        ▄▀▒▒▒▐
 *                 ▐▄▀▒▒▀▀▀▀▄▄▄▀▒▒▒▒▒▐
 *               ▄▄▀▒░▒▒▒▒▒▒▒▒▒█▒▒▄█▒▐
 *             ▄▀▒▒▒░░░▒▒▒░░░▒▒▒▀██▀▒▌
 *            ▐▒▒▒▄▄▒▒▒▒░░░▒▒▒▒▒▒▒▀▄▒▒▌
 *            ▌░░▌█▀▒▒▒▒▒▄▀█▄▒▒▒▒▒▒▒█▒▐
 *           ▐░░░▒▒▒▒▒▒▒▒▌██▀▒▒░░░▒▒▒▀▄▌
 *           ▌░▒▄██▄▒▒▒▒▒▒▒▒▒░░░░░░▒▒▒▒▌
 *          ▌▒▀▐▄█▄█▌▄░▀▒▒░░░░░░░░░░▒▒▒▐
 *          ▐▒▒▐▀▐▀▒░▄▄▒▄▒▒▒▒▒▒░▒░▒░▒▒▒▒▌
 *          ▐▒▒▒▀▀▄▄▒▒▒▄▒▒▒▒▒▒▒▒░▒░▒░▒▒▐
 *           ▌▒▒▒▒▒▒▀▀▀▒▒▒▒▒▒░▒░▒░▒░▒▒▒▌
 *           ▐▒▒▒▒▒▒▒▒▒▒▒▒▒▒░▒░▒░▒▒▄▒▒▐
 *            ▀▄▒▒▒▒▒▒▒▒▒▒▒░▒░▒░▒▄▒▒▒▒▌
 *              ▀▄▒▒▒▒▒▒▒▒▒▒▄▄▄▀▒▒▒▒▄▀
 *                ▀▄▄▄▄▄▄▀▀▀▒▒▒▒▒▄▄▀
 *                   ▒▒▒▒▒▒▒▒▒▒▀▀
*/

// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.6.12;

abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

interface IERC20 {
    /**
    * @dev Returns the amount of tokens in existence.
    */
    function totalSupply() external view returns (uint256);

    /**
    * @dev Returns the amount of tokens owned by `account`.
    */
    function balanceOf(address account) external view returns (uint256);

    /**
    * @dev Moves `amount` tokens from the caller's account to `recipient`.
    *
    * Returns a boolean value indicating whether the operation succeeded.
    *
    * Emits a {Transfer} event.
    */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
    * @dev Returns the remaining number of tokens that `spender` will be
    * allowed to spend on behalf of `owner` through {transferFrom}. This is
    * zero by default.
    *
    * This value changes when {approve} or {transferFrom} are called.
    */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
    * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
    *
    * Returns a boolean value indicating whether the operation succeeded.
    *
    * IMPORTANT: Beware that changing an allowance with this method brings the risk
    * that someone may use both the old and the new allowance by unfortunate
    * transaction ordering. One possible solution to mitigate this race
    * condition is to first reduce the spender's allowance to 0 and set the
    * desired value afterwards:
    * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
    *
    * Emits an {Approval} event.
    */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
    * @dev Moves `amount` tokens from `sender` to `recipient` using the
    * allowance mechanism. `amount` is then deducted from the caller's
    * allowance.
    *
    * Returns a boolean value indicating whether the operation succeeded.
    *
    * Emits a {Transfer} event.
    */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
    * @dev Emitted when `value` tokens are moved from one account (`from`) to
    * another (`to`).
    *
    * Note that `value` may be zero.
    */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
    * @dev Emitted when the allowance of a `spender` for an `owner` is set by
    * a call to {approve}. `value` is the new allowance.
    */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

library SafeMath {
    /**
    * @dev Returns the addition of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `+` operator.
    *
    * Requirements:
    *
    * - Addition cannot overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
    * @dev Returns the subtraction of two unsigned integers, reverting on
    * overflow (when the result is negative).
    *
    * Counterpart to Solidity's `-` operator.
    *
    * Requirements:
    *
    * - Subtraction cannot overflow.
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
    * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
    * overflow (when the result is negative).
    *
    * Counterpart to Solidity's `-` operator.
    *
    * Requirements:
    *
    * - Subtraction cannot overflow.
    */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Returns the multiplication of two unsigned integers, reverting on
    * overflow.
    *
    * Counterpart to Solidity's `*` operator.
    *
    * Requirements:
    *
    * - Multiplication cannot overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
    * @dev Returns the integer division of two unsigned integers. Reverts on
    * division by zero. The result is rounded towards zero.
    *
    * Counterpart to Solidity's `/` operator. Note: this function uses a
    * `revert` opcode (which leaves remaining gas untouched) while Solidity
    * uses an invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    *
    * - The divisor cannot be zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
    * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
    * division by zero. The result is rounded towards zero.
    *
    * Counterpart to Solidity's `/` operator. Note: this function uses a
    * `revert` opcode (which leaves remaining gas untouched) while Solidity
    * uses an invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    *
    * - The divisor cannot be zero.
    */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * Reverts when dividing by zero.
    *
    * Counterpart to Solidity's `%` operator. This function uses a `revert`
    * opcode (which leaves remaining gas untouched) while Solidity uses an
    * invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    *
    * - The divisor cannot be zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
    * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
    * Reverts with custom message when dividing by zero.
    *
    * Counterpart to Solidity's `%` operator. This function uses a `revert`
    * opcode (which leaves remaining gas untouched) while Solidity uses an
    * invalid opcode to revert (consuming all remaining gas).
    *
    * Requirements:
    *
    * - The divisor cannot be zero.
    */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library Address {
    /**
    * @dev Returns true if `account` is a contract.
    *
    * [IMPORTANT]
    * ====
    * It is unsafe to assume that an address for which this function returns
    * false is an externally-owned account (EOA) and not a contract.
    *
    * Among others, `isContract` will return false for the following
    * types of addresses:
    *
    *  - an externally-owned account
    *  - a contract in construction
    *  - an address where a contract will be created
    *  - an address where a contract lived, but was destroyed
    * ====
    */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
    * @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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
    * @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");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract Ownable is Context {
    address private _owner;
    address private _previousOwner;
    uint256 private _lockTime;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
    * @dev Initializes the contract setting the deployer as the initial owner.
    */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
    * @dev Returns the address of the current owner.
    */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
    * @dev Throws if called by any account other than the owner.
    */
    modifier onlyOwner() {
        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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    function geUnlockTime() public view returns (uint256) {
        return _lockTime;
    }

    //Locks the contract for owner for the amount of time provided
    function lock(uint256 time) public virtual onlyOwner {
        _previousOwner = _owner;
        _owner = address(0);
        _lockTime = now + time;
        emit OwnershipTransferred(_owner, address(0));
    }

    //Unlocks the contract for owner when _lockTime is exceeds
    function unlock() public virtual {
        require(_previousOwner == msg.sender, "You don't have permission to unlock");
        require(now > _lockTime , "Contract is locked until 7 days");
        emit OwnershipTransferred(_owner, _previousOwner);
        _owner = _previousOwner;
    }
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event 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;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
    external
    returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
    external
    payable
    returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

// Contract implementation
contract Shoco is Context, IERC20, Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _rOwned;
    mapping (address => uint256) private _tOwned;
    mapping (address => uint256) private _lastTx;
    mapping (address => uint256) private _cooldownTradeAttempts;
    mapping (address => mapping (address => uint256)) private _allowances;

    mapping (address => bool) private _isExcludedFromFee;

    mapping (address => bool) private _isExcluded;
    address[] private _excluded;
    mapping (address => bool) private _isSniper;
    address[] private _confirmedSnipers;

    uint256 private constant MAX = ~uint256(0);
    uint256 private _tTotal = 1000000000000000000000000;
    uint256 private _rTotal = (MAX - (MAX % _tTotal));
    uint256 private _tFeeTotal;

    string private _name = 'Shiba Chocolate | t.me/ShibaChocolate';
    string private _symbol = 'SHOCO \xF0\x9F\x8D\xAB';
    uint8 private _decimals = 9;

    uint256 private _taxFee = 1;
    uint256 private _teamDev = 0;
    uint256 private _previousTaxFee = _taxFee;
    uint256 private _previousTeamDev = _teamDev;

    address payable private _teamDevAddress;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;

    bool inSwap = false;
    bool public swapEnabled = true;
    bool public tradingOpen = false; //once switched on, can never be switched off.
    bool public cooldownEnabled = true; //cooldown time on transactions
    bool public uniswapOnly = true; //prevents users from tx'ing to other wallets to avoid cooldowns

    uint256 public _maxTxAmount = 1000000000000000000000000;
    uint256 private _numOfTokensToExchangeForTeamDev = 5000000000000000000;
    bool _txLimitsEnabled = true;

    event MinTokensBeforeSwapUpdated(uint256 minTokensBeforeSwap);
    event SwapEnabledUpdated(bool enabled);

    modifier lockTheSwap {
        inSwap = true;
        _;
        inSwap = false;
    }

    constructor () public {
        _rOwned[_msgSender()] = _rTotal;

        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); // UniswapV2 for Ethereum network
        // Create a uniswap pair for this new token
        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
        .createPair(address(this), _uniswapV2Router.WETH());

        // set the rest of the contract variables
        uniswapV2Router = _uniswapV2Router;
        // Exclude owner and this contract from fee
        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;

        // List of publicly available front-runner & sniper bots
        _isSniper[address(0x7589319ED0fD750017159fb4E4d96C63966173C1)] = true;
        _confirmedSnipers.push(address(0x7589319ED0fD750017159fb4E4d96C63966173C1));

        _isSniper[address(0x65A67DF75CCbF57828185c7C050e34De64d859d0)] = true;
        _confirmedSnipers.push(address(0x65A67DF75CCbF57828185c7C050e34De64d859d0));

        _isSniper[address(0xE031b36b53E53a292a20c5F08fd1658CDdf74fce)] = true;
        _confirmedSnipers.push(address(0xE031b36b53E53a292a20c5F08fd1658CDdf74fce));

        _isSniper[address(0xE031b36b53E53a292a20c5F08fd1658CDdf74fce)] = true;
        _confirmedSnipers.push(address(0xE031b36b53E53a292a20c5F08fd1658CDdf74fce));

        _isSniper[address(0xe516bDeE55b0b4e9bAcaF6285130De15589B1345)] = true;
        _confirmedSnipers.push(address(0xe516bDeE55b0b4e9bAcaF6285130De15589B1345));

        _isSniper[address(0xa1ceC245c456dD1bd9F2815a6955fEf44Eb4191b)] = true;
        _confirmedSnipers.push(address(0xa1ceC245c456dD1bd9F2815a6955fEf44Eb4191b));

        _isSniper[address(0xd7d3EE77D35D0a56F91542D4905b1a2b1CD7cF95)] = true;
        _confirmedSnipers.push(address(0xd7d3EE77D35D0a56F91542D4905b1a2b1CD7cF95));

        _isSniper[address(0xFe76f05dc59fEC04184fA0245AD0C3CF9a57b964)] = true;
        _confirmedSnipers.push(address(0xFe76f05dc59fEC04184fA0245AD0C3CF9a57b964));

        _isSniper[address(0xDC81a3450817A58D00f45C86d0368290088db848)] = true;
        _confirmedSnipers.push(address(0xDC81a3450817A58D00f45C86d0368290088db848));

        _isSniper[address(0x45fD07C63e5c316540F14b2002B085aEE78E3881)] = true;
        _confirmedSnipers.push(address(0x45fD07C63e5c316540F14b2002B085aEE78E3881));

        _isSniper[address(0x27F9Adb26D532a41D97e00206114e429ad58c679)] = true;
        _confirmedSnipers.push(address(0x27F9Adb26D532a41D97e00206114e429ad58c679));

        _isSniper[address(0x9282dc5c422FA91Ff2F6fF3a0b45B7BF97CF78E7)] = true;
        _confirmedSnipers.push(address(0x9282dc5c422FA91Ff2F6fF3a0b45B7BF97CF78E7));

        _isSniper[address(0xfad95B6089c53A0D1d861eabFaadd8901b0F8533)] = true;
        _confirmedSnipers.push(address(0xfad95B6089c53A0D1d861eabFaadd8901b0F8533));

        _isSniper[address(0x1d6E8BAC6EA3730825bde4B005ed7B2B39A2932d)] = true;
        _confirmedSnipers.push(address(0x1d6E8BAC6EA3730825bde4B005ed7B2B39A2932d));

        _isSniper[address(0x000000000000084e91743124a982076C59f10084)] = true;
        _confirmedSnipers.push(address(0x000000000000084e91743124a982076C59f10084));

        _isSniper[address(0x6dA4bEa09C3aA0761b09b19837D9105a52254303)] = true;
        _confirmedSnipers.push(address(0x6dA4bEa09C3aA0761b09b19837D9105a52254303));

        _isSniper[address(0x323b7F37d382A68B0195b873aF17CeA5B67cd595)] = true;
        _confirmedSnipers.push(address(0x323b7F37d382A68B0195b873aF17CeA5B67cd595));

        _isSniper[address(0x000000005804B22091aa9830E50459A15E7C9241)] = true;
        _confirmedSnipers.push(address(0x000000005804B22091aa9830E50459A15E7C9241));

        _isSniper[address(0xA3b0e79935815730d942A444A84d4Bd14A339553)] = true;
        _confirmedSnipers.push(address(0xA3b0e79935815730d942A444A84d4Bd14A339553));

        _isSniper[address(0xf6da21E95D74767009acCB145b96897aC3630BaD)] = true;
        _confirmedSnipers.push(address(0xf6da21E95D74767009acCB145b96897aC3630BaD));

        _isSniper[address(0x0000000000007673393729D5618DC555FD13f9aA)] = true;
        _confirmedSnipers.push(address(0x0000000000007673393729D5618DC555FD13f9aA));

        _isSniper[address(0x00000000000003441d59DdE9A90BFfb1CD3fABf1)] = true;
        _confirmedSnipers.push(address(0x00000000000003441d59DdE9A90BFfb1CD3fABf1));

        _isSniper[address(0x59903993Ae67Bf48F10832E9BE28935FEE04d6F6)] = true;
        _confirmedSnipers.push(address(0x59903993Ae67Bf48F10832E9BE28935FEE04d6F6));

        _isSniper[address(0x000000917de6037d52b1F0a306eeCD208405f7cd)] = true;
        _confirmedSnipers.push(address(0x000000917de6037d52b1F0a306eeCD208405f7cd));

        _isSniper[address(0x7100e690554B1c2FD01E8648db88bE235C1E6514)] = true;
        _confirmedSnipers.push(address(0x7100e690554B1c2FD01E8648db88bE235C1E6514));

        _isSniper[address(0x72b30cDc1583224381132D379A052A6B10725415)] = true;
        _confirmedSnipers.push(address(0x72b30cDc1583224381132D379A052A6B10725415));

        _isSniper[address(0x9eDD647D7d6Eceae6bB61D7785Ef66c5055A9bEE)] = true;
        _confirmedSnipers.push(address(0x9eDD647D7d6Eceae6bB61D7785Ef66c5055A9bEE));

        _isSniper[address(0xfe9d99ef02E905127239E85A611c29ad32c31c2F)] = true;
        _confirmedSnipers.push(address(0xfe9d99ef02E905127239E85A611c29ad32c31c2F));

        _isSniper[address(0x39608b6f20704889C51C0Ae28b1FCA8F36A5239b)] = true;
        _confirmedSnipers.push(address(0x39608b6f20704889C51C0Ae28b1FCA8F36A5239b));

        _isSniper[address(0xc496D84215d5018f6F53E7F6f12E45c9b5e8e8A9)] = true;
        _confirmedSnipers.push(address(0xc496D84215d5018f6F53E7F6f12E45c9b5e8e8A9));

        _isSniper[address(0x59341Bc6b4f3Ace878574b05914f43309dd678c7)] = true;
        _confirmedSnipers.push(address(0x59341Bc6b4f3Ace878574b05914f43309dd678c7));

        _isSniper[address(0xe986d48EfeE9ec1B8F66CD0b0aE8e3D18F091bDF)] = true;
        _confirmedSnipers.push(address(0xe986d48EfeE9ec1B8F66CD0b0aE8e3D18F091bDF));

        _isSniper[address(0x4aEB32e16DcaC00B092596ADc6CD4955EfdEE290)] = true;
        _confirmedSnipers.push(address(0x4aEB32e16DcaC00B092596ADc6CD4955EfdEE290));

        _isSniper[address(0x136F4B5b6A306091b280E3F251fa0E21b1280Cd5)] = true;
        _confirmedSnipers.push(address(0x136F4B5b6A306091b280E3F251fa0E21b1280Cd5));

        _isSniper[address(0x39608b6f20704889C51C0Ae28b1FCA8F36A5239b)] = true;
        _confirmedSnipers.push(address(0x39608b6f20704889C51C0Ae28b1FCA8F36A5239b));

        _isSniper[address(0x5B83A351500B631cc2a20a665ee17f0dC66e3dB7)] = true;
        _confirmedSnipers.push(address(0x5B83A351500B631cc2a20a665ee17f0dC66e3dB7));

        _isSniper[address(0xbCb05a3F85d34f0194C70d5914d5C4E28f11Cc02)] = true;
        _confirmedSnipers.push(address(0xbCb05a3F85d34f0194C70d5914d5C4E28f11Cc02));

        _isSniper[address(0x22246F9BCa9921Bfa9A3f8df5baBc5Bc8ee73850)] = true;
        _confirmedSnipers.push(address(0x22246F9BCa9921Bfa9A3f8df5baBc5Bc8ee73850));

        _isSniper[address(0x42d4C197036BD9984cA652303e07dD29fA6bdB37)] = true;
        _confirmedSnipers.push(address(0x42d4C197036BD9984cA652303e07dD29fA6bdB37));

        _isSniper[address(0x00000000003b3cc22aF3aE1EAc0440BcEe416B40)] = true;
        _confirmedSnipers.push(address(0x00000000003b3cc22aF3aE1EAc0440BcEe416B40));

        _isSniper[address(0x231DC6af3C66741f6Cf618884B953DF0e83C1A2A)] = true;
        _confirmedSnipers.push(address(0x231DC6af3C66741f6Cf618884B953DF0e83C1A2A));

        _isSniper[address(0xC6bF34596f74eb22e066a878848DfB9fC1CF4C65)] = true;
        _confirmedSnipers.push(address(0xC6bF34596f74eb22e066a878848DfB9fC1CF4C65));

        _isSniper[address(0x20f6fCd6B8813c4f98c0fFbD88C87c0255040Aa3)] = true;
        _confirmedSnipers.push(address(0x20f6fCd6B8813c4f98c0fFbD88C87c0255040Aa3));

        _teamDev = 8;
        _teamDevAddress = payable(0x71099527F4c5B626b3D7915B1C3E893863587551);

        emit Transfer(address(0), _msgSender(), _tTotal);
    }

    function openTrading() external onlyOwner() {
        swapEnabled = true;
        cooldownEnabled = true;
        tradingOpen = true;
    }

    function name() public view returns (string memory) {
        return _name;
    }

    function symbol() public view returns (string memory) {
        return _symbol;
    }

    function decimals() public view returns (uint8) {
        return _decimals;
    }

    function totalSupply() public view override returns (uint256) {
        return _tTotal;
    }

    function balanceOf(address account) public view override returns (uint256) {
        if (_isExcluded[account]) return _tOwned[account];
        return tokenFromReflection(_rOwned[account]);
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    function isExcluded(address account) public view returns (bool) {
        return _isExcluded[account];
    }

    function isBlackListed(address account) public view returns (bool) {
        return _isSniper[account];
    }

    function setExcludeFromFee(address account, bool excluded) external onlyOwner() {
        _isExcludedFromFee[account] = excluded;
    }

    function totalFees() public view returns (uint256) {
        return _tFeeTotal;
    }

    function deliver(uint256 tAmount) public {
        address sender = _msgSender();
        require(!_isExcluded[sender], "Excluded addresses cannot call this function");
        (uint256 rAmount,,,,,) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rTotal = _rTotal.sub(rAmount);
        _tFeeTotal = _tFeeTotal.add(tAmount);
    }

    function reflectionFromToken(uint256 tAmount, bool deductTransferFee) public view returns(uint256) {
        require(tAmount <= _tTotal, "Amount must be less than supply");
        if (!deductTransferFee) {
            (uint256 rAmount,,,,,) = _getValues(tAmount);
            return rAmount;
        } else {
            (,uint256 rTransferAmount,,,,) = _getValues(tAmount);
            return rTransferAmount;
        }
    }

    function tokenFromReflection(uint256 rAmount) public view returns(uint256) {
        require(rAmount <= _rTotal, "Amount must be less than total reflections");
        uint256 currentRate =  _getRate();
        return rAmount.div(currentRate);
    }

    function excludeAccount(address account) external onlyOwner() {
        require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not exclude Uniswap router.');
        require(!_isExcluded[account], "Account is already excluded");
        if(_rOwned[account] > 0) {
            _tOwned[account] = tokenFromReflection(_rOwned[account]);
        }
        _isExcluded[account] = true;
        _excluded.push(account);
    }

    function includeAccount(address account) external onlyOwner() {
        require(_isExcluded[account], "Account is already excluded");
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_excluded[i] == account) {
                _excluded[i] = _excluded[_excluded.length - 1];
                _tOwned[account] = 0;
                _isExcluded[account] = false;
                _excluded.pop();
                break;
            }
        }
    }

    function RemoveSniper(address account) external onlyOwner() {
        require(account != 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D, 'We can not blacklist Uniswap router.');
        require(!_isSniper[account], "Account is already blacklisted");
        _isSniper[account] = true;
        _confirmedSnipers.push(account);
    }

    function amnestySniper(address account) external onlyOwner() {
        require(_isSniper[account], "Account is not blacklisted");
        for (uint256 i = 0; i < _confirmedSnipers.length; i++) {
            if (_confirmedSnipers[i] == account) {
                _confirmedSnipers[i] = _confirmedSnipers[_confirmedSnipers.length - 1];
                _isSniper[account] = false;
                _confirmedSnipers.pop();
                break;
            }
        }
    }

    function removeAllFee() private {
        if(_taxFee == 0 && _teamDev == 0) return;

        _previousTaxFee = _taxFee;
        _previousTeamDev = _teamDev;

        _taxFee = 0;
        _teamDev = 0;
    }

    function restoreAllFee() private {
        _taxFee = _previousTaxFee;
        _teamDev = _previousTeamDev;
    }

    function isExcludedFromFee(address account) public view returns(bool) {
        return _isExcludedFromFee[account];
    }

    function setMaxTxPercent(uint256 maxTxPercent) external onlyOwner() {
        _maxTxAmount = _tTotal.mul(maxTxPercent).div(
            10**2
        );
    }

    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _transfer(address sender, address recipient, uint256 amount) private {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        require(amount > 0, "Transfer amount must be greater than zero");
        require(!_isSniper[recipient], "You have no power here!");
        require(!_isSniper[msg.sender], "You have no power here!");

        if(sender != owner() && recipient != owner()) {

            if (!tradingOpen) {
                if (!(sender == address(this) || recipient == address(this)
                || sender == address(owner()) || recipient == address(owner()))) {
                    require(tradingOpen, "Trading is not enabled");
                }
            }

            if (cooldownEnabled) {
                if (block.timestamp > _lastTx[sender]) {
                    _lastTx[sender] = block.timestamp + 60 seconds;
                } else {
                    require(!cooldownEnabled, "You're on cooldown! 60s between trades!");
                }
            }

            if (uniswapOnly) {
                if (
                    sender != address(this) &&
                    recipient != address(this) &&
                    sender != address(uniswapV2Router) &&
                    recipient != address(uniswapV2Router)
                ) {
                    require(
                        _msgSender() == address(uniswapV2Router) ||
                        _msgSender() == uniswapV2Pair,
                        "ERR: Uniswap only"
                    );
                }
            }
        }

        // is the token balance of this contract address over the min number of
        // tokens that we need to initiate a swap?
        // also, don't get caught in a circular charity event.
        // also, don't swap if sender is uniswap pair.
        uint256 contractTokenBalance = balanceOf(address(this));

        bool overMinTokenBalance = contractTokenBalance >= _numOfTokensToExchangeForTeamDev;
        if (!inSwap && swapEnabled && overMinTokenBalance && sender != uniswapV2Pair) {
            // We need to swap the current tokens to ETH and send to the charity wallet
            swapTokensForEth(contractTokenBalance);

            uint256 contractETHBalance = address(this).balance;
            if(contractETHBalance > 0) {
                sendETHToTeamDev(address(this).balance);
            }
        }

        //indicates if fee should be deducted from transfer
        bool takeFee = true;

        //if any account belongs to _isExcludedFromFee account then remove the fee
        if(_isExcludedFromFee[sender] || _isExcludedFromFee[recipient]){
            takeFee = false;
        }

        //transfer amount, it will take tax and fee

        _tokenTransfer(sender,recipient,amount,takeFee);
    }

    function swapTokensForEth(uint256 tokenAmount) private lockTheSwap{
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function sendETHToTeamDev(uint256 amount) private {
        _teamDevAddress.transfer(amount.div(2));
    }

    // We are exposing these functions to be able to manual swap and send
    // in case the token is highly valued and 5M becomes too much
    function manualSwap() external onlyOwner() {
        uint256 contractBalance = balanceOf(address(this));
        swapTokensForEth(contractBalance);
    }

    function manualSend() external onlyOwner() {
        uint256 contractETHBalance = address(this).balance;
        sendETHToTeamDev(contractETHBalance);
    }

    function setSwapEnabled(bool enabled) external onlyOwner(){
        swapEnabled = enabled;
    }

    function _tokenTransfer(address sender, address recipient, uint256 amount, bool takeFee) private {
        if(!takeFee)
            removeAllFee();

        if (_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferFromExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && _isExcluded[recipient]) {
            _transferToExcluded(sender, recipient, amount);
        } else if (!_isExcluded[sender] && !_isExcluded[recipient]) {
            _transferStandard(sender, recipient, amount);
        } else if (_isExcluded[sender] && _isExcluded[recipient]) {
            _transferBothExcluded(sender, recipient, amount);
        } else {
            _transferStandard(sender, recipient, amount);
        }

        if(!takeFee)
            restoreAllFee();
    }

    function _transferStandard(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tCharity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeCharity(tCharity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferToExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tCharity) = _getValues(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeCharity(tCharity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferFromExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tCharity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeCharity(tCharity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _transferBothExcluded(address sender, address recipient, uint256 tAmount) private {
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee, uint256 tTransferAmount, uint256 tFee, uint256 tCharity) = _getValues(tAmount);
        _tOwned[sender] = _tOwned[sender].sub(tAmount);
        _rOwned[sender] = _rOwned[sender].sub(rAmount);
        _tOwned[recipient] = _tOwned[recipient].add(tTransferAmount);
        _rOwned[recipient] = _rOwned[recipient].add(rTransferAmount);
        _takeCharity(tCharity);
        _reflectFee(rFee, tFee);
        emit Transfer(sender, recipient, tTransferAmount);
    }

    function _takeCharity(uint256 tCharity) private {
        uint256 currentRate =  _getRate();
        uint256 rCharity = tCharity.mul(currentRate);
        _rOwned[address(this)] = _rOwned[address(this)].add(rCharity);
        if(_isExcluded[address(this)])
            _tOwned[address(this)] = _tOwned[address(this)].add(tCharity);
    }

    function _reflectFee(uint256 rFee, uint256 tFee) private {
        _rTotal = _rTotal.sub(rFee);
        _tFeeTotal = _tFeeTotal.add(tFee);
    }

    //to recieve ETH from uniswapV2Router when swaping
    receive() external payable {}

    function _getValues(uint256 tAmount) private view returns (uint256, uint256, uint256, uint256, uint256, uint256) {
        (uint256 tTransferAmount, uint256 tFee, uint256 tCharity) = _getTValues(tAmount, _taxFee, _teamDev);
        uint256 currentRate =  _getRate();
        (uint256 rAmount, uint256 rTransferAmount, uint256 rFee) = _getRValues(tAmount, tFee, currentRate);
        return (rAmount, rTransferAmount, rFee, tTransferAmount, tFee, tCharity);
    }

    function _getTValues(uint256 tAmount, uint256 taxFee, uint256 charityFee) private pure returns (uint256, uint256, uint256) {
        uint256 tFee = tAmount.mul(taxFee).div(100);
        uint256 tCharity = tAmount.mul(charityFee).div(100);
        uint256 tTransferAmount = tAmount.sub(tFee).sub(tCharity);
        return (tTransferAmount, tFee, tCharity);
    }

    function _getRValues(uint256 tAmount, uint256 tFee, uint256 currentRate) private pure returns (uint256, uint256, uint256) {
        uint256 rAmount = tAmount.mul(currentRate);
        uint256 rFee = tFee.mul(currentRate);
        uint256 rTransferAmount = rAmount.sub(rFee);
        return (rAmount, rTransferAmount, rFee);
    }

    function _getRate() private view returns(uint256) {
        (uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
        return rSupply.div(tSupply);
    }

    function _getCurrentSupply() private view returns(uint256, uint256) {
        uint256 rSupply = _rTotal;
        uint256 tSupply = _tTotal;
        for (uint256 i = 0; i < _excluded.length; i++) {
            if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply) return (_rTotal, _tTotal);
            rSupply = rSupply.sub(_rOwned[_excluded[i]]);
            tSupply = tSupply.sub(_tOwned[_excluded[i]]);
        }
        if (rSupply < _rTotal.div(_tTotal)) return (_rTotal, _tTotal);
        return (rSupply, tSupply);
    }

    function _getTaxFee() private view returns(uint256) {
        return _taxFee;
    }

    function _getMaxTxAmount() private view returns(uint256) {
        return _maxTxAmount;
    }

    function _getETHBalance() public view returns(uint256 balance) {
        return address(this).balance;
    }

    function _removeTxLimit() external onlyOwner() {
        _maxTxAmount = 1000000000000000000000000;
    }

    // Yes, there are here if I fucked up on the logic and need to disable them.
    function _removeDestLimit() external onlyOwner() {
        uniswapOnly = false;
    }

    function _disableCooldown() external onlyOwner() {
        cooldownEnabled = false;
    }

    function _enableCooldown() external onlyOwner() {
        cooldownEnabled = true;
    }

    function _setExtWallet(address payable teamDevAddress) external onlyOwner() {
        _teamDevAddress = teamDevAddress;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minTokensBeforeSwap","type":"uint256"}],"name":"MinTokensBeforeSwapUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SwapEnabledUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"RemoveSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_disableCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_enableCooldown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_getETHBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_removeDestLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_removeTxLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"teamDevAddress","type":"address"}],"name":"_setExtWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"amnestySniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"}],"name":"deliver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"geUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"includeAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlackListed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcluded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tAmount","type":"uint256"},{"internalType":"bool","name":"deductTransferFee","type":"bool"}],"name":"reflectionFromToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"setExcludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxTxPercent","type":"uint256"}],"name":"setMaxTxPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rAmount","type":"uint256"}],"name":"tokenFromReflection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapOnly","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

69d3c21bcecceda1000000600d5569085afffa6ff50bffffff19600e55610120604052602560c0818152906200456660e03980516200004791601091602090910190620010e7565b5060408051808201909152600a8082526953484f434f20f09f8dab60b01b60209092019182526200007b91601191620010e7565b506012805460ff19908116600917909155600160138190556000601481905560158290556016556017805460ff60c01b1961ffff60b01b1961ffff60a01b19909216600160a81b1791909116600160b81b1716600160c01b17905569d3c21bcecceda1000000601855674563918244f40000601955601a80549092161790553480156200010757600080fd5b50600062000114620010d4565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e54600360006200016f620010d4565b6001600160a01b03166001600160a01b03168152602001908152602001600020819055506000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b158015620001e657600080fd5b505afa158015620001fb573d6000803e3d6000fd5b505050506040513d60208110156200021257600080fd5b5051604080516315ab88c960e31b815290516001600160a01b039283169263c9c653969230929186169163ad5c464891600480820192602092909190829003018186803b1580156200026357600080fd5b505afa15801562000278573d6000803e3d6000fd5b505050506040513d60208110156200028f57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301525160448083019260209291908290030181600087803b158015620002e257600080fd5b505af1158015620002f7573d6000803e3d6000fd5b505050506040513d60208110156200030e57600080fd5b50516001600160601b0319606091821b811660a0529082901b166080526001600860006200033b620010d8565b6001600160a01b0316815260208082019290925260409081016000908120805494151560ff199586161790553081526008808452918120805485166001908117909155600b9093527fc274f9872928131cb7ff581cc24fdbde2670d328386d345e40b59bf36ffda1da8054851684179055600c805480850182557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c790810180546001600160a01b0319908116737589319ed0fd750017159fb4e4d96c63966173c1179091557fe349bf7cb40a1d682fcc1c52ea4dd0fffc14828c762bcf08c0c2a9ef14a583968054881687179055825480870184558201805482167365a67df75ccbf57828185c7c050e34de64d859d01790557f74d7fc0a45c6928cce922f294b8bf5e7fff3f89771e2114b18a5cd1d1f45773580548816871781558354808801855583018054831673e031b36b53e53a292a20c5f08fd1658cddf74fce9081179091558154891688179091558354808801855583018054831690911790557f0f1b60510ca1e1bf00eec02fea41847afc989fbd83852cdb3ca91ce622a1d54d80548816871790558254808701845582018054821673e516bdee55b0b4e9bacaf6285130de15589b13451790557ff8ebe5e7623ca891e5bb8ce5e72b0c5ddeae8c7d8c0932740de908fdac44ec0080548816871790558254808701845582018054821673a1cec245c456dd1bd9f2815a6955fef44eb4191b1790557f16a15fb2aa0b66ff4f4234d97be437d134114b368ffd745d8de6e6838f9fba3a80548816871790558254808701845582018054821673d7d3ee77d35d0a56f91542d4905b1a2b1cd7cf951790557f287292fc49b5d73ef6d6f7f228ef3fe49c8cd2ac6e9c89064eb61fd7fb9f519a80548816871790558254808701845582018054821673fe76f05dc59fec04184fa0245ad0c3cf9a57b9641790557f66504bab4295e88d515a9325b1909b99559a398602c86c64fe2ad7b94e0f761680548816871790558254808701845582018054821673dc81a3450817a58d00f45c86d0368290088db8481790557f4c88ad78a60fb4355141b4ac46c8f7af9256d7dcebaf319200612bf767c0bd8a8054881687179055825480870184558201805482167345fd07c63e5c316540f14b2002b085aee78e38811790557f509f0c09776cdc3f0041fbef622c53cd68b7fdb9a9aa03b44d173795d33d9a2c8054881687179055825480870184558201805482167327f9adb26d532a41d97e00206114e429ad58c6791790557f4ab1ad46ab225965adc4e1d94d5aaeaf25059fc3ba4fcaa5d4b5e7639b276b96805488168717905582548087018455820180548216739282dc5c422fa91ff2f6ff3a0b45b7bf97cf78e71790557fb6cf2af14ec747288a3172f747dce8489db9f7ffed0705b048086a04ae6d883e80548816871790558254808701845582018054821673fad95b6089c53a0d1d861eabfaadd8901b0f85331790557f90f8eb466ce0b8ffe45cba484dc56157a7d0481c956801f8344c8ca9e3ab66fc805488168717905582548087018455820180548216731d6e8bac6ea3730825bde4b005ed7b2b39a2932d1790557f084f1b81bcbce7852bcad334f6636dd62e06d31b2f61a0cfa649d36ddc7a140b8054881687179055825480870184558201805482166d084e91743124a982076c59f100841790557fe964af2a39de4befe9efd0a93c5f33430d4d469a86ca04ead00ca450e1cc51dc805488168717905582548087018455820180548216736da4bea09c3aa0761b09b19837d9105a522543031790557f43bc11ee80840e60bc6eecdaf2f3dbb20e2a51f2ad7c84ccd7a3ee511c229b5680548816871790558254808701845582018054821673323b7f37d382a68b0195b873af17cea5b67cd5951790557ff3f5813ee85ebee82b51c4fbd213ca437b28b57dd42773ca313877c0421fdd498054881687179055825480870184558201805482166f5804b22091aa9830e50459a15e7c92411790557fa806c9890a137af663d0d873337bf05aee2f15a430b39dde586e5d5a9662788280548816871790558254808701845582018054821673a3b0e79935815730d942a444a84d4bd14a3395531790557f37f2334e5c4c9574d9d477ff54aae39ea3eb90b5c2ae4ef3cf5ad5a3292bc0a380548816871790558254808701845582018054821673f6da21e95d74767009accb145b96897ac3630bad1790557f5f39b10403a84e529641be6f242a318374526da4fb6710d79679d47441b2a7c08054881687179055825480870184558201805482166d7673393729d5618dc555fd13f9aa1790557f5c7b6b080beaaf2d4ae0f74ea085f3bbf8609b2401495af9fffe89ed4435564b8054881687179055825480870184558201805482166d03441d59dde9a90bffb1cd3fabf11790557fac0a3c6e1cda4154d919f5f45cd6714b3123d27803fd2d300bb571c9d92f6c778054881687179055825480870184558201805482167359903993ae67bf48f10832e9be28935fee04d6f61790557f3a5d40cea00d9d63dd180120b8b5f647d8c74aca077efca2f559deb04eb5811d80548816871790558254808701845582018054821670917de6037d52b1f0a306eecd208405f7cd1790557f5fa1d7e94eb4942d36a49413ca4d16accd08fb1110f77dfb53231b36d79cc42e805488168717905582548087018455820180548216737100e690554b1c2fd01e8648db88be235c1e65141790557f77fc7072d38bd00627c3a08b633f932d348498925cead243099866a7f90ace068054881687179055825480870184558201805482167372b30cdc1583224381132d379a052a6b107254151790557f3081b1a493729edee55cece4de980fa98487de7a5280b359c0bd87eed203d730805488168717905582548087018455820180548216739edd647d7d6eceae6bb61d7785ef66c5055a9bee1790557f546f120f655c062c354e71127d493f355f17cfa1add369fa90759489adb73fda80548816871790558254808701845582018054821673fe9d99ef02e905127239e85a611c29ad32c31c2f1790557fde956483604ddf4b64ec3e2f9fc80a0dc2088c392511f1411782a7d8ae297f4c8054881687178155835480880185558301805483167339608b6f20704889c51c0ae28b1fca8f36a5239b9081179091557f75b6c254782bae42da9d86e5b3b038adccd258bd17d730f1912a4d8f0937784880548a16891790558454808901865584018054841673c496d84215d5018f6f53e7f6f12e45c9b5e8e8a91790557fde2a7d29f3150e1ddb7d14e8e59cf128a3b67513b254bdfac9b088ad2be525a280548a1689179055845480890186558401805484167359341bc6b4f3ace878574b05914f43309dd678c71790557fa6a51fa55d9d229c03843ddaa598168904b330eef370885236990ddb645da1d880548a16891790558454808901865584018054841673e986d48efee9ec1b8f66cd0b0ae8e3d18f091bdf1790557f55b54b221ed3f9281edb8ffbf0fb95a8ab4be2f4d8cbfaca4dce33d0dfe8587a80548a168917905584548089018655840180548416734aeb32e16dcac00b092596adc6cd4955efdee2901790557f87d3f383669d84cb7b974d2d22e16224a71feda94455970040b83518cc86744680548a16891790558454808901865584018054841673136f4b5b6a306091b280e3f251fa0e21b1280cd51790558154891688179091558354808801855583018054831690911790557f218a0253766218fcda78437f64b24524daefb1cad97e42c50028341fc55cdb22805488168717905582548087018455820180548216735b83a351500b631cc2a20a665ee17f0dc66e3db71790557f436e4ad714e8c3aff7e26123430dd4dbd319e15777b9d8b55411bf1463a9cb5b80548816871790558254808701845582018054821673bcb05a3f85d34f0194c70d5914d5c4e28f11cc021790557fe7b20fa0205f84b9d914c445ceea320ccd2839909270357f6b8947abb472a5908054881687179055825480870184558201805482167322246f9bca9921bfa9a3f8df5babc5bc8ee738501790557f9dfcf2a538dd0b759dd7771d809627012524bcdd77f1316cd21f485a44da421f8054881687179055825480870184558201805482167342d4c197036bd9984ca652303e07dd29fa6bdb371790557f494c6787b69d89b59a43a566573d0eb3bdbbe9fe253e454213f244e13d42e1668054881687179055825480870184558201805482166e3b3cc22af3ae1eac0440bcee416b401790557fbbe2d054b52a64432b404f4c58c46edaaf6f4423cdeabf83f69cf3dddb7aaab880548816871790558254808701845582018054821673231dc6af3c66741f6cf618884b953df0e83c1a2a1790557fa2d156f2feaaf188eee0f3ab58b28e4ad365e80c7a8722fed7272494f9f7423080548816871790558254808701845582018054821673c6bf34596f74eb22e066a878848dfb9fc1cf4c651790557fe0606630f048922c11b6a1604064d1c3580ba1a2e9d2fddf650d03c5b65711498054909716861790965581549485018255915291909101805483167320f6fcd6b8813c4f98c0ffbd88c87c0255040aa3179055601455601780549091167371099527f4c5b626b3d7915b1c3e89386358755117905562001080620010d4565b6001600160a01b031660006001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600d546040518082815260200191505060405180910390a35062001183565b3390565b6000546001600160a01b031690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200112a57805160ff19168380011785556200115a565b828001600101855582156200115a579182015b828111156200115a5782518255916020019190600101906200113d565b50620011689291506200116c565b5090565b5b808211156200116857600081556001016200116d565b60805160601c60a05160601c613391620011d560003980610f6f528061236c5280612436525080610c3152806122b052806122ee528061232a528061274352806127fb528061282252506133916000f3fe60806040526004361061024c5760003560e01c80639354e0fc1161013a578063dd467064116100b1578063dd467064146107fa578063dd62ed3e14610824578063e015061e1461085f578063e01af92c14610874578063e47d6060146108a0578063f2cc0c18146108d3578063f2fde38b14610906578063f429389014610939578063f815a8421461094e578063f84354f114610963578063fe76374f14610996578063ffb54a99146109ab57610253565b80639354e0fc1461065d57806395d89b4114610672578063a457c2d714610687578063a69df4b5146106c0578063a9059cbb146106d5578063a985ceef1461070e578063af9549e014610723578063b6c523241461075e578063c9567bf914610773578063cba0e99614610788578063d07deb4e146107bb578063d543dbeb146107d057610253565b80633bd5d173116101ce5780633bd5d173146104b75780634549b039146104e157806349bd5a5e1461051357806351bc3c85146105285780635342acb41461053d5780636ddd17131461057057806370a0823114610585578063715018a6146105b85780637d1db4a5146105cd57806383b61c8b146105e25780638da5cb5b1461061557806392bbf08e1461062a57610253565b806306fdde0314610258578063095ea7b3146102e25780630b2a808c1461032f57806313114a9d146103645780631694505e1461038b57806318160ddd146103bc5780632338dbe3146103d157806323b872dd146103e65780632d83811914610429578063313ce56714610453578063395093511461047e57610253565b3661025357005b600080fd5b34801561026457600080fd5b5061026d6109c0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102a757818101518382015260200161028f565b50505050905090810190601f1680156102d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ee57600080fd5b5061031b6004803603604081101561030557600080fd5b506001600160a01b038135169060200135610a56565b604080519115158252519081900360200190f35b34801561033b57600080fd5b506103626004803603602081101561035257600080fd5b50356001600160a01b0316610a74565b005b34801561037057600080fd5b50610379610c29565b60408051918252519081900360200190f35b34801561039757600080fd5b506103a0610c2f565b604080516001600160a01b039092168252519081900360200190f35b3480156103c857600080fd5b50610379610c53565b3480156103dd57600080fd5b50610362610c59565b3480156103f257600080fd5b5061031b6004803603606081101561040957600080fd5b506001600160a01b03813581169160208101359091169060400135610cc1565b34801561043557600080fd5b506103796004803603602081101561044c57600080fd5b5035610d48565b34801561045f57600080fd5b50610468610daa565b6040805160ff9092168252519081900360200190f35b34801561048a57600080fd5b5061031b600480360360408110156104a157600080fd5b506001600160a01b038135169060200135610db3565b3480156104c357600080fd5b50610362600480360360208110156104da57600080fd5b5035610e01565b3480156104ed57600080fd5b506103796004803603604081101561050457600080fd5b50803590602001351515610edb565b34801561051f57600080fd5b506103a0610f6d565b34801561053457600080fd5b50610362610f91565b34801561054957600080fd5b5061031b6004803603602081101561056057600080fd5b50356001600160a01b0316611002565b34801561057c57600080fd5b5061031b611020565b34801561059157600080fd5b50610379600480360360208110156105a857600080fd5b50356001600160a01b0316611030565b3480156105c457600080fd5b50610362611092565b3480156105d957600080fd5b50610379611122565b3480156105ee57600080fd5b506103626004803603602081101561060557600080fd5b50356001600160a01b0316611128565b34801561062157600080fd5b506103a06112b0565b34801561063657600080fd5b506103626004803603602081101561064d57600080fd5b50356001600160a01b03166112bf565b34801561066957600080fd5b50610362611339565b34801561067e57600080fd5b5061026d6113a0565b34801561069357600080fd5b5061031b600480360360408110156106aa57600080fd5b506001600160a01b038135169060200135611401565b3480156106cc57600080fd5b50610362611469565b3480156106e157600080fd5b5061031b600480360360408110156106f857600080fd5b506001600160a01b038135169060200135611557565b34801561071a57600080fd5b5061031b61156b565b34801561072f57600080fd5b506103626004803603604081101561074657600080fd5b506001600160a01b038135169060200135151561157b565b34801561076a57600080fd5b506103796115fe565b34801561077f57600080fd5b50610362611604565b34801561079457600080fd5b5061031b600480360360208110156107ab57600080fd5b50356001600160a01b0316611690565b3480156107c757600080fd5b506103626116ae565b3480156107dc57600080fd5b50610362600480360360208110156107f357600080fd5b5035611715565b34801561080657600080fd5b506103626004803603602081101561081d57600080fd5b5035611793565b34801561083057600080fd5b506103796004803603604081101561084757600080fd5b506001600160a01b0381358116916020013516611831565b34801561086b57600080fd5b5061036261185c565b34801561088057600080fd5b506103626004803603602081101561089757600080fd5b503515156118c9565b3480156108ac57600080fd5b5061031b600480360360208110156108c357600080fd5b50356001600160a01b031661193f565b3480156108df57600080fd5b50610362600480360360208110156108f657600080fd5b50356001600160a01b031661195d565b34801561091257600080fd5b506103626004803603602081101561092957600080fd5b50356001600160a01b0316611b3d565b34801561094557600080fd5b50610362611c23565b34801561095a57600080fd5b50610379611c85565b34801561096f57600080fd5b506103626004803603602081101561098657600080fd5b50356001600160a01b0316611c89565b3480156109a257600080fd5b5061031b611e1d565b3480156109b757600080fd5b5061031b611e2d565b60108054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a4c5780601f10610a2157610100808354040283529160200191610a4c565b820191906000526020600020905b815481529060010190602001808311610a2f57829003601f168201915b5050505050905090565b6000610a6a610a63611e3d565b8484611e41565b5060015b92915050565b610a7c611e3d565b6000546001600160a01b03908116911614610acc576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600b602052604090205460ff16610b36576040805162461bcd60e51b815260206004820152601a6024820152791058d8dbdd5b9d081a5cc81b9bdd08189b1858dadb1a5cdd195960321b604482015290519081900360640190fd5b60005b600c54811015610c2557816001600160a01b0316600c8281548110610b5a57fe5b6000918252602090912001546001600160a01b03161415610c1d57600c80546000198101908110610b8757fe5b600091825260209091200154600c80546001600160a01b039092169183908110610bad57fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600b90915260409020805460ff19169055600c805480610bf657fe5b600082815260209020810160001990810180546001600160a01b0319169055019055610c25565b600101610b39565b5050565b600f5490565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d5490565b610c61611e3d565b6000546001600160a01b03908116911614610cb1576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b69d3c21bcecceda1000000601855565b6000610cce848484611f2d565b610d3e84610cda611e3d565b610d39856040518060600160405280602881526020016131a1602891396001600160a01b038a16600090815260076020526040812090610d18611e3d565b6001600160a01b0316815260208101919091526040016000205491906124ea565b611e41565b5060019392505050565b6000600e54821115610d8b5760405162461bcd60e51b815260040180806020018281038252602a81526020018061310e602a913960400191505060405180910390fd5b6000610d95612581565b9050610da183826125a4565b9150505b919050565b60125460ff1690565b6000610a6a610dc0611e3d565b84610d398560076000610dd1611e3d565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906125ea565b6000610e0b611e3d565b6001600160a01b03811660009081526009602052604090205490915060ff1615610e665760405162461bcd60e51b815260040180806020018281038252602c8152602001806132e8602c913960400191505060405180910390fd5b6000610e7183612642565b505050506001600160a01b038416600090815260036020526040902054919250610e9d9190508261269e565b6001600160a01b038316600090815260036020526040902055600e54610ec3908261269e565b600e55600f54610ed390846125ea565b600f55505050565b6000600d54831115610f34576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81610f53576000610f4484612642565b50939550610a6e945050505050565b6000610f5e84612642565b50929550610a6e945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610f99611e3d565b6000546001600160a01b03908116911614610fe9576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6000610ff430611030565b9050610fff816126e0565b50565b6001600160a01b031660009081526008602052604090205460ff1690565b601754600160a81b900460ff1681565b6001600160a01b03811660009081526009602052604081205460ff161561107057506001600160a01b038116600090815260046020526040902054610da5565b6001600160a01b038216600090815260036020526040902054610a6e90610d48565b61109a611e3d565b6000546001600160a01b039081169116146110ea576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116906000805160206131e9833981519152908390a3600080546001600160a01b0319169055565b60185481565b611130611e3d565b6000546001600160a01b03908116911614611180576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03821614156111dc5760405162461bcd60e51b81526004018080602001828103825260248152602001806132326024913960400191505060405180910390fd5b6001600160a01b0381166000908152600b602052604090205460ff161561124a576040805162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c69737465640000604482015290519081900360640190fd5b6001600160a01b03166000818152600b60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319169091179055565b6000546001600160a01b031690565b6112c7611e3d565b6000546001600160a01b03908116911614611317576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b601780546001600160a01b0319166001600160a01b0392909216919091179055565b611341611e3d565b6000546001600160a01b03908116911614611391576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6017805460ff60b81b19169055565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a4c5780601f10610a2157610100808354040283529160200191610a4c565b6000610a6a61140e611e3d565b84610d39856040518060600160405280602581526020016133376025913960076000611438611e3d565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906124ea565b6001546001600160a01b031633146114b25760405162461bcd60e51b81526004018080602001828103825260238152602001806133146023913960400191505060405180910390fd5b6002544211611508576040805162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c2037206461797300604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116916000805160206131e983398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610a6a611564611e3d565b8484611f2d565b601754600160b81b900460ff1681565b611583611e3d565b6000546001600160a01b039081169116146115d3576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b60025490565b61160c611e3d565b6000546001600160a01b0390811691161461165c576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6017805460ff60b01b1960ff60b81b1960ff60a81b19909216600160a81b1791909116600160b81b1716600160b01b179055565b6001600160a01b031660009081526009602052604090205460ff1690565b6116b6611e3d565b6000546001600160a01b03908116911614611706576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6017805460ff60c01b19169055565b61171d611e3d565b6000546001600160a01b0390811691161461176d576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b61178d606461178783600d5461291790919063ffffffff16565b906125a4565b60185550565b61179b611e3d565b6000546001600160a01b039081169116146117eb576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b60008054600180546001600160a01b03199081166001600160a01b0384161790915516815542820160025560405181906000805160206131e9833981519152908290a350565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b611864611e3d565b6000546001600160a01b039081169116146118b4576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6017805460ff60b81b1916600160b81b179055565b6118d1611e3d565b6000546001600160a01b03908116911614611921576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b60178054911515600160a81b0260ff60a81b19909216919091179055565b6001600160a01b03166000908152600b602052604090205460ff1690565b611965611e3d565b6000546001600160a01b039081169116146119b5576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0382161415611a115760405162461bcd60e51b81526004018080602001828103825260228152602001806132c66022913960400191505060405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff1615611a7d576040805162461bcd60e51b815260206004820152601b60248201527a1058d8dbdd5b9d081a5cc8185b1c9958591e48195e18db1d591959602a1b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205415611ad7576001600160a01b038116600090815260036020526040902054611abd90610d48565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b611b45611e3d565b6000546001600160a01b03908116911614611b95576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6001600160a01b038116611bda5760405162461bcd60e51b81526004018080602001828103825260268152602001806131386026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216916000805160206131e983398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611c2b611e3d565b6000546001600160a01b03908116911614611c7b576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b47610fff81612970565b4790565b611c91611e3d565b6000546001600160a01b03908116911614611ce1576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526009602052604090205460ff16611d4c576040805162461bcd60e51b815260206004820152601b60248201527a1058d8dbdd5b9d081a5cc8185b1c9958591e48195e18db1d591959602a1b604482015290519081900360640190fd5b60005b600a54811015610c2557816001600160a01b0316600a8281548110611d7057fe5b6000918252602090912001546001600160a01b03161415611e1557600a80546000198101908110611d9d57fe5b600091825260209091200154600a80546001600160a01b039092169183908110611dc357fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600990925220805460ff19169055600a805480610bf657fe5b600101611d4f565b601754600160c01b900460ff1681565b601754600160b01b900460ff1681565b3390565b6001600160a01b038316611e865760405162461bcd60e51b815260040180806020018281038252602481526020018061327b6024913960400191505060405180910390fd5b6001600160a01b038216611ecb5760405162461bcd60e51b815260040180806020018281038252602281526020018061315e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260076020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611f725760405162461bcd60e51b81526004018080602001828103825260258152602001806132566025913960400191505060405180910390fd5b6001600160a01b038216611fb75760405162461bcd60e51b81526004018080602001828103825260238152602001806130eb6023913960400191505060405180910390fd5b60008111611ff65760405162461bcd60e51b81526004018080602001828103825260298152602001806132096029913960400191505060405180910390fd5b6001600160a01b0382166000908152600b602052604090205460ff161561205e576040805162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b604482015290519081900360640190fd5b336000908152600b602052604090205460ff16156120bd576040805162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b604482015290519081900360640190fd5b6120c56112b0565b6001600160a01b0316836001600160a01b0316141580156120ff57506120e96112b0565b6001600160a01b0316826001600160a01b031614155b156123ec57601754600160b01b900460ff166121d5576001600160a01b03831630148061213457506001600160a01b03821630145b8061215757506121426112b0565b6001600160a01b0316836001600160a01b0316145b8061217a57506121656112b0565b6001600160a01b0316826001600160a01b0316145b6121d557601754600160b01b900460ff166121d5576040805162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81a5cc81b9bdd08195b98589b195960521b604482015290519081900360640190fd5b601754600160b81b900460ff1615612273576001600160a01b03831660009081526005602052604090205442111561222a576001600160a01b0383166000908152600560205260409020603c42019055612273565b601754600160b81b900460ff16156122735760405162461bcd60e51b815260040180806020018281038252602781526020018061329f6027913960400191505060405180910390fd5b601754600160c01b900460ff16156123ec576001600160a01b03831630148015906122a757506001600160a01b0382163014155b80156122e557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b031614155b801561232357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031614155b156123ec577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661235a611e3d565b6001600160a01b031614806123a757507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661239c611e3d565b6001600160a01b0316145b6123ec576040805162461bcd60e51b81526020600482015260116024820152704552523a20556e6973776170206f6e6c7960781b604482015290519081900360640190fd5b60006123f730611030565b60195460175491925082101590600160a01b900460ff161580156124245750601754600160a81b900460ff165b801561242d5750805b801561246b57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031614155b1561248b57612479826126e0565b4780156124895761248947612970565b505b6001600160a01b03851660009081526008602052604090205460019060ff16806124cd57506001600160a01b03851660009081526008602052604090205460ff165b156124d6575060005b6124e2868686846129b2565b505050505050565b600081848411156125795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561253e578181015183820152602001612526565b50505050905090810190601f16801561256b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080600061258e612b26565b909250905061259d82826125a4565b9250505090565b60006125e383836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250612c89565b9392505050565b6000828201838110156125e3576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600080600080600080600080600061265f8a601354601454612cee565b925092509250600061266f612581565b905060008060006126818e8786612d3d565b919e509c509a509598509396509194505050505091939550919395565b60006125e383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ea565b6017805460ff60a01b1916600160a01b1790556040805160028082526060808301845292602083019080368337019050509050308160008151811061272157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561279a57600080fd5b505afa1580156127ae573d6000803e3d6000fd5b505050506040513d60208110156127c457600080fd5b50518151829060019081106127d557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050612820307f000000000000000000000000000000000000000000000000000000000000000084611e41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663791ac9478360008430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156128c55781810151838201526020016128ad565b505050509050019650505050505050600060405180830381600087803b1580156128ee57600080fd5b505af1158015612902573d6000803e3d6000fd5b50506017805460ff60a01b1916905550505050565b60008261292657506000610a6e565b8282028284828161293357fe5b04146125e35760405162461bcd60e51b81526004018080602001828103825260218152602001806131806021913960400191505060405180910390fd5b6017546001600160a01b03166108fc61298a8360026125a4565b6040518115909202916000818181858888f19350505050158015610c25573d6000803e3d6000fd5b806129bf576129bf612d79565b6001600160a01b03841660009081526009602052604090205460ff168015612a0057506001600160a01b03831660009081526009602052604090205460ff16155b15612a1557612a10848484612dab565b612b13565b6001600160a01b03841660009081526009602052604090205460ff16158015612a5657506001600160a01b03831660009081526009602052604090205460ff165b15612a6657612a10848484612ecf565b6001600160a01b03841660009081526009602052604090205460ff16158015612aa857506001600160a01b03831660009081526009602052604090205460ff16155b15612ab857612a10848484612f78565b6001600160a01b03841660009081526009602052604090205460ff168015612af857506001600160a01b03831660009081526009602052604090205460ff165b15612b0857612a10848484612fbc565b612b13848484612f78565b80612b2057612b2061302f565b50505050565b600e54600d546000918291825b600a54811015612c57578260036000600a8481548110612b4f57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612bb457508160046000600a8481548110612b8d57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612bcb57600e54600d5494509450505050612c85565b612c0b60036000600a8481548110612bdf57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061269e565b9250612c4d60046000600a8481548110612c2157fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061269e565b9150600101612b33565b50600d54600e54612c67916125a4565b821015612c7f57600e54600d54935093505050612c85565b90925090505b9091565b60008183612cd85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561253e578181015183820152602001612526565b506000838581612ce457fe5b0495945050505050565b6000808080612d0260646117878989612917565b90506000612d1560646117878a89612917565b90506000612d2d82612d278b8661269e565b9061269e565b9992985090965090945050505050565b6000808080612d4c8786612917565b90506000612d5a8787612917565b90506000612d68838361269e565b929992985090965090945050505050565b601354158015612d895750601454155b15612d9357612da9565b6013805460155560148054601655600091829055555b565b600080600080600080612dbd87612642565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612def908861269e565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054612e1e908761269e565b6001600160a01b03808b1660009081526003602052604080822093909355908a1681522054612e4d90866125ea565b6001600160a01b038916600090815260036020526040902055612e6f8161303d565b612e7984836130c6565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b600080600080600080612ee187612642565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150612f13908761269e565b6001600160a01b03808b16600090815260036020908152604080832094909455918b16815260049091522054612f4990846125ea565b6001600160a01b038916600090815260046020908152604080832093909355600390522054612e4d90866125ea565b600080600080600080612f8a87612642565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150612e1e908761269e565b600080600080600080612fce87612642565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150613000908861269e565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054612f13908761269e565b601554601355601654601455565b6000613047612581565b905060006130558383612917565b3060009081526003602052604090205490915061307290826125ea565b3060009081526003602090815260408083209390935560099052205460ff16156130c157306000908152600460205260409020546130b090846125ea565b306000908152600460205260409020555b505050565b600e546130d3908361269e565b600e55600f546130e390826125ea565b600f55505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f57652063616e206e6f7420626c61636b6c69737420556e697377617020726f757465722e45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373596f75277265206f6e20636f6f6c646f776e2120363073206265747765656e207472616465732157652063616e206e6f74206578636c75646520556e697377617020726f757465722e4578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6f636b45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122008e6c165a535efa0e445d8a30bfff76c4a10a888e2516f3ce37cdca4b93b770d64736f6c634300060c003353686962612043686f636f6c617465207c20742e6d652f536869626143686f636f6c617465

Deployed Bytecode

0x60806040526004361061024c5760003560e01c80639354e0fc1161013a578063dd467064116100b1578063dd467064146107fa578063dd62ed3e14610824578063e015061e1461085f578063e01af92c14610874578063e47d6060146108a0578063f2cc0c18146108d3578063f2fde38b14610906578063f429389014610939578063f815a8421461094e578063f84354f114610963578063fe76374f14610996578063ffb54a99146109ab57610253565b80639354e0fc1461065d57806395d89b4114610672578063a457c2d714610687578063a69df4b5146106c0578063a9059cbb146106d5578063a985ceef1461070e578063af9549e014610723578063b6c523241461075e578063c9567bf914610773578063cba0e99614610788578063d07deb4e146107bb578063d543dbeb146107d057610253565b80633bd5d173116101ce5780633bd5d173146104b75780634549b039146104e157806349bd5a5e1461051357806351bc3c85146105285780635342acb41461053d5780636ddd17131461057057806370a0823114610585578063715018a6146105b85780637d1db4a5146105cd57806383b61c8b146105e25780638da5cb5b1461061557806392bbf08e1461062a57610253565b806306fdde0314610258578063095ea7b3146102e25780630b2a808c1461032f57806313114a9d146103645780631694505e1461038b57806318160ddd146103bc5780632338dbe3146103d157806323b872dd146103e65780632d83811914610429578063313ce56714610453578063395093511461047e57610253565b3661025357005b600080fd5b34801561026457600080fd5b5061026d6109c0565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102a757818101518382015260200161028f565b50505050905090810190601f1680156102d45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ee57600080fd5b5061031b6004803603604081101561030557600080fd5b506001600160a01b038135169060200135610a56565b604080519115158252519081900360200190f35b34801561033b57600080fd5b506103626004803603602081101561035257600080fd5b50356001600160a01b0316610a74565b005b34801561037057600080fd5b50610379610c29565b60408051918252519081900360200190f35b34801561039757600080fd5b506103a0610c2f565b604080516001600160a01b039092168252519081900360200190f35b3480156103c857600080fd5b50610379610c53565b3480156103dd57600080fd5b50610362610c59565b3480156103f257600080fd5b5061031b6004803603606081101561040957600080fd5b506001600160a01b03813581169160208101359091169060400135610cc1565b34801561043557600080fd5b506103796004803603602081101561044c57600080fd5b5035610d48565b34801561045f57600080fd5b50610468610daa565b6040805160ff9092168252519081900360200190f35b34801561048a57600080fd5b5061031b600480360360408110156104a157600080fd5b506001600160a01b038135169060200135610db3565b3480156104c357600080fd5b50610362600480360360208110156104da57600080fd5b5035610e01565b3480156104ed57600080fd5b506103796004803603604081101561050457600080fd5b50803590602001351515610edb565b34801561051f57600080fd5b506103a0610f6d565b34801561053457600080fd5b50610362610f91565b34801561054957600080fd5b5061031b6004803603602081101561056057600080fd5b50356001600160a01b0316611002565b34801561057c57600080fd5b5061031b611020565b34801561059157600080fd5b50610379600480360360208110156105a857600080fd5b50356001600160a01b0316611030565b3480156105c457600080fd5b50610362611092565b3480156105d957600080fd5b50610379611122565b3480156105ee57600080fd5b506103626004803603602081101561060557600080fd5b50356001600160a01b0316611128565b34801561062157600080fd5b506103a06112b0565b34801561063657600080fd5b506103626004803603602081101561064d57600080fd5b50356001600160a01b03166112bf565b34801561066957600080fd5b50610362611339565b34801561067e57600080fd5b5061026d6113a0565b34801561069357600080fd5b5061031b600480360360408110156106aa57600080fd5b506001600160a01b038135169060200135611401565b3480156106cc57600080fd5b50610362611469565b3480156106e157600080fd5b5061031b600480360360408110156106f857600080fd5b506001600160a01b038135169060200135611557565b34801561071a57600080fd5b5061031b61156b565b34801561072f57600080fd5b506103626004803603604081101561074657600080fd5b506001600160a01b038135169060200135151561157b565b34801561076a57600080fd5b506103796115fe565b34801561077f57600080fd5b50610362611604565b34801561079457600080fd5b5061031b600480360360208110156107ab57600080fd5b50356001600160a01b0316611690565b3480156107c757600080fd5b506103626116ae565b3480156107dc57600080fd5b50610362600480360360208110156107f357600080fd5b5035611715565b34801561080657600080fd5b506103626004803603602081101561081d57600080fd5b5035611793565b34801561083057600080fd5b506103796004803603604081101561084757600080fd5b506001600160a01b0381358116916020013516611831565b34801561086b57600080fd5b5061036261185c565b34801561088057600080fd5b506103626004803603602081101561089757600080fd5b503515156118c9565b3480156108ac57600080fd5b5061031b600480360360208110156108c357600080fd5b50356001600160a01b031661193f565b3480156108df57600080fd5b50610362600480360360208110156108f657600080fd5b50356001600160a01b031661195d565b34801561091257600080fd5b506103626004803603602081101561092957600080fd5b50356001600160a01b0316611b3d565b34801561094557600080fd5b50610362611c23565b34801561095a57600080fd5b50610379611c85565b34801561096f57600080fd5b506103626004803603602081101561098657600080fd5b50356001600160a01b0316611c89565b3480156109a257600080fd5b5061031b611e1d565b3480156109b757600080fd5b5061031b611e2d565b60108054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a4c5780601f10610a2157610100808354040283529160200191610a4c565b820191906000526020600020905b815481529060010190602001808311610a2f57829003601f168201915b5050505050905090565b6000610a6a610a63611e3d565b8484611e41565b5060015b92915050565b610a7c611e3d565b6000546001600160a01b03908116911614610acc576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6001600160a01b0381166000908152600b602052604090205460ff16610b36576040805162461bcd60e51b815260206004820152601a6024820152791058d8dbdd5b9d081a5cc81b9bdd08189b1858dadb1a5cdd195960321b604482015290519081900360640190fd5b60005b600c54811015610c2557816001600160a01b0316600c8281548110610b5a57fe5b6000918252602090912001546001600160a01b03161415610c1d57600c80546000198101908110610b8757fe5b600091825260209091200154600c80546001600160a01b039092169183908110610bad57fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600b90915260409020805460ff19169055600c805480610bf657fe5b600082815260209020810160001990810180546001600160a01b0319169055019055610c25565b600101610b39565b5050565b600f5490565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b600d5490565b610c61611e3d565b6000546001600160a01b03908116911614610cb1576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b69d3c21bcecceda1000000601855565b6000610cce848484611f2d565b610d3e84610cda611e3d565b610d39856040518060600160405280602881526020016131a1602891396001600160a01b038a16600090815260076020526040812090610d18611e3d565b6001600160a01b0316815260208101919091526040016000205491906124ea565b611e41565b5060019392505050565b6000600e54821115610d8b5760405162461bcd60e51b815260040180806020018281038252602a81526020018061310e602a913960400191505060405180910390fd5b6000610d95612581565b9050610da183826125a4565b9150505b919050565b60125460ff1690565b6000610a6a610dc0611e3d565b84610d398560076000610dd1611e3d565b6001600160a01b03908116825260208083019390935260409182016000908120918c1681529252902054906125ea565b6000610e0b611e3d565b6001600160a01b03811660009081526009602052604090205490915060ff1615610e665760405162461bcd60e51b815260040180806020018281038252602c8152602001806132e8602c913960400191505060405180910390fd5b6000610e7183612642565b505050506001600160a01b038416600090815260036020526040902054919250610e9d9190508261269e565b6001600160a01b038316600090815260036020526040902055600e54610ec3908261269e565b600e55600f54610ed390846125ea565b600f55505050565b6000600d54831115610f34576040805162461bcd60e51b815260206004820152601f60248201527f416d6f756e74206d757374206265206c657373207468616e20737570706c7900604482015290519081900360640190fd5b81610f53576000610f4484612642565b50939550610a6e945050505050565b6000610f5e84612642565b50929550610a6e945050505050565b7f000000000000000000000000806b6c6819b1f62ca4b66658b669f0a98e385d1881565b610f99611e3d565b6000546001600160a01b03908116911614610fe9576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6000610ff430611030565b9050610fff816126e0565b50565b6001600160a01b031660009081526008602052604090205460ff1690565b601754600160a81b900460ff1681565b6001600160a01b03811660009081526009602052604081205460ff161561107057506001600160a01b038116600090815260046020526040902054610da5565b6001600160a01b038216600090815260036020526040902054610a6e90610d48565b61109a611e3d565b6000546001600160a01b039081169116146110ea576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116906000805160206131e9833981519152908390a3600080546001600160a01b0319169055565b60185481565b611130611e3d565b6000546001600160a01b03908116911614611180576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b03821614156111dc5760405162461bcd60e51b81526004018080602001828103825260248152602001806132326024913960400191505060405180910390fd5b6001600160a01b0381166000908152600b602052604090205460ff161561124a576040805162461bcd60e51b815260206004820152601e60248201527f4163636f756e7420697320616c726561647920626c61636b6c69737465640000604482015290519081900360640190fd5b6001600160a01b03166000818152600b60205260408120805460ff19166001908117909155600c805491820181559091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c70180546001600160a01b0319169091179055565b6000546001600160a01b031690565b6112c7611e3d565b6000546001600160a01b03908116911614611317576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b601780546001600160a01b0319166001600160a01b0392909216919091179055565b611341611e3d565b6000546001600160a01b03908116911614611391576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6017805460ff60b81b19169055565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a4c5780601f10610a2157610100808354040283529160200191610a4c565b6000610a6a61140e611e3d565b84610d39856040518060600160405280602581526020016133376025913960076000611438611e3d565b6001600160a01b03908116825260208083019390935260409182016000908120918d168152925290205491906124ea565b6001546001600160a01b031633146114b25760405162461bcd60e51b81526004018080602001828103825260238152602001806133146023913960400191505060405180910390fd5b6002544211611508576040805162461bcd60e51b815260206004820152601f60248201527f436f6e7472616374206973206c6f636b656420756e74696c2037206461797300604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116916000805160206131e983398151915291a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b6000610a6a611564611e3d565b8484611f2d565b601754600160b81b900460ff1681565b611583611e3d565b6000546001600160a01b039081169116146115d3576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b60025490565b61160c611e3d565b6000546001600160a01b0390811691161461165c576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6017805460ff60b01b1960ff60b81b1960ff60a81b19909216600160a81b1791909116600160b81b1716600160b01b179055565b6001600160a01b031660009081526009602052604090205460ff1690565b6116b6611e3d565b6000546001600160a01b03908116911614611706576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6017805460ff60c01b19169055565b61171d611e3d565b6000546001600160a01b0390811691161461176d576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b61178d606461178783600d5461291790919063ffffffff16565b906125a4565b60185550565b61179b611e3d565b6000546001600160a01b039081169116146117eb576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b60008054600180546001600160a01b03199081166001600160a01b0384161790915516815542820160025560405181906000805160206131e9833981519152908290a350565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b611864611e3d565b6000546001600160a01b039081169116146118b4576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6017805460ff60b81b1916600160b81b179055565b6118d1611e3d565b6000546001600160a01b03908116911614611921576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b60178054911515600160a81b0260ff60a81b19909216919091179055565b6001600160a01b03166000908152600b602052604090205460ff1690565b611965611e3d565b6000546001600160a01b039081169116146119b5576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b737a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0382161415611a115760405162461bcd60e51b81526004018080602001828103825260228152602001806132c66022913960400191505060405180910390fd5b6001600160a01b03811660009081526009602052604090205460ff1615611a7d576040805162461bcd60e51b815260206004820152601b60248201527a1058d8dbdd5b9d081a5cc8185b1c9958591e48195e18db1d591959602a1b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205415611ad7576001600160a01b038116600090815260036020526040902054611abd90610d48565b6001600160a01b0382166000908152600460205260409020555b6001600160a01b03166000818152600960205260408120805460ff19166001908117909155600a805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319169091179055565b611b45611e3d565b6000546001600160a01b03908116911614611b95576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6001600160a01b038116611bda5760405162461bcd60e51b81526004018080602001828103825260268152602001806131386026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216916000805160206131e983398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b611c2b611e3d565b6000546001600160a01b03908116911614611c7b576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b47610fff81612970565b4790565b611c91611e3d565b6000546001600160a01b03908116911614611ce1576040805162461bcd60e51b815260206004820181905260248201526000805160206131c9833981519152604482015290519081900360640190fd5b6001600160a01b03811660009081526009602052604090205460ff16611d4c576040805162461bcd60e51b815260206004820152601b60248201527a1058d8dbdd5b9d081a5cc8185b1c9958591e48195e18db1d591959602a1b604482015290519081900360640190fd5b60005b600a54811015610c2557816001600160a01b0316600a8281548110611d7057fe5b6000918252602090912001546001600160a01b03161415611e1557600a80546000198101908110611d9d57fe5b600091825260209091200154600a80546001600160a01b039092169183908110611dc357fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559184168152600482526040808220829055600990925220805460ff19169055600a805480610bf657fe5b600101611d4f565b601754600160c01b900460ff1681565b601754600160b01b900460ff1681565b3390565b6001600160a01b038316611e865760405162461bcd60e51b815260040180806020018281038252602481526020018061327b6024913960400191505060405180910390fd5b6001600160a01b038216611ecb5760405162461bcd60e51b815260040180806020018281038252602281526020018061315e6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260076020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611f725760405162461bcd60e51b81526004018080602001828103825260258152602001806132566025913960400191505060405180910390fd5b6001600160a01b038216611fb75760405162461bcd60e51b81526004018080602001828103825260238152602001806130eb6023913960400191505060405180910390fd5b60008111611ff65760405162461bcd60e51b81526004018080602001828103825260298152602001806132096029913960400191505060405180910390fd5b6001600160a01b0382166000908152600b602052604090205460ff161561205e576040805162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b604482015290519081900360640190fd5b336000908152600b602052604090205460ff16156120bd576040805162461bcd60e51b8152602060048201526017602482015276596f752068617665206e6f20706f77657220686572652160481b604482015290519081900360640190fd5b6120c56112b0565b6001600160a01b0316836001600160a01b0316141580156120ff57506120e96112b0565b6001600160a01b0316826001600160a01b031614155b156123ec57601754600160b01b900460ff166121d5576001600160a01b03831630148061213457506001600160a01b03821630145b8061215757506121426112b0565b6001600160a01b0316836001600160a01b0316145b8061217a57506121656112b0565b6001600160a01b0316826001600160a01b0316145b6121d557601754600160b01b900460ff166121d5576040805162461bcd60e51b8152602060048201526016602482015275151c98591a5b99c81a5cc81b9bdd08195b98589b195960521b604482015290519081900360640190fd5b601754600160b81b900460ff1615612273576001600160a01b03831660009081526005602052604090205442111561222a576001600160a01b0383166000908152600560205260409020603c42019055612273565b601754600160b81b900460ff16156122735760405162461bcd60e51b815260040180806020018281038252602781526020018061329f6027913960400191505060405180910390fd5b601754600160c01b900460ff16156123ec576001600160a01b03831630148015906122a757506001600160a01b0382163014155b80156122e557507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316836001600160a01b031614155b801561232357507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b0316826001600160a01b031614155b156123ec577f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031661235a611e3d565b6001600160a01b031614806123a757507f000000000000000000000000806b6c6819b1f62ca4b66658b669f0a98e385d186001600160a01b031661239c611e3d565b6001600160a01b0316145b6123ec576040805162461bcd60e51b81526020600482015260116024820152704552523a20556e6973776170206f6e6c7960781b604482015290519081900360640190fd5b60006123f730611030565b60195460175491925082101590600160a01b900460ff161580156124245750601754600160a81b900460ff165b801561242d5750805b801561246b57507f000000000000000000000000806b6c6819b1f62ca4b66658b669f0a98e385d186001600160a01b0316856001600160a01b031614155b1561248b57612479826126e0565b4780156124895761248947612970565b505b6001600160a01b03851660009081526008602052604090205460019060ff16806124cd57506001600160a01b03851660009081526008602052604090205460ff165b156124d6575060005b6124e2868686846129b2565b505050505050565b600081848411156125795760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561253e578181015183820152602001612526565b50505050905090810190601f16801561256b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080600061258e612b26565b909250905061259d82826125a4565b9250505090565b60006125e383836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250612c89565b9392505050565b6000828201838110156125e3576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b600080600080600080600080600061265f8a601354601454612cee565b925092509250600061266f612581565b905060008060006126818e8786612d3d565b919e509c509a509598509396509194505050505091939550919395565b60006125e383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124ea565b6017805460ff60a01b1916600160a01b1790556040805160028082526060808301845292602083019080368337019050509050308160008151811061272157fe5b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b15801561279a57600080fd5b505afa1580156127ae573d6000803e3d6000fd5b505050506040513d60208110156127c457600080fd5b50518151829060019081106127d557fe5b60200260200101906001600160a01b031690816001600160a01b031681525050612820307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84611e41565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663791ac9478360008430426040518663ffffffff1660e01b81526004018086815260200185815260200180602001846001600160a01b03168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b838110156128c55781810151838201526020016128ad565b505050509050019650505050505050600060405180830381600087803b1580156128ee57600080fd5b505af1158015612902573d6000803e3d6000fd5b50506017805460ff60a01b1916905550505050565b60008261292657506000610a6e565b8282028284828161293357fe5b04146125e35760405162461bcd60e51b81526004018080602001828103825260218152602001806131806021913960400191505060405180910390fd5b6017546001600160a01b03166108fc61298a8360026125a4565b6040518115909202916000818181858888f19350505050158015610c25573d6000803e3d6000fd5b806129bf576129bf612d79565b6001600160a01b03841660009081526009602052604090205460ff168015612a0057506001600160a01b03831660009081526009602052604090205460ff16155b15612a1557612a10848484612dab565b612b13565b6001600160a01b03841660009081526009602052604090205460ff16158015612a5657506001600160a01b03831660009081526009602052604090205460ff165b15612a6657612a10848484612ecf565b6001600160a01b03841660009081526009602052604090205460ff16158015612aa857506001600160a01b03831660009081526009602052604090205460ff16155b15612ab857612a10848484612f78565b6001600160a01b03841660009081526009602052604090205460ff168015612af857506001600160a01b03831660009081526009602052604090205460ff165b15612b0857612a10848484612fbc565b612b13848484612f78565b80612b2057612b2061302f565b50505050565b600e54600d546000918291825b600a54811015612c57578260036000600a8481548110612b4f57fe5b60009182526020808320909101546001600160a01b031683528201929092526040019020541180612bb457508160046000600a8481548110612b8d57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054115b15612bcb57600e54600d5494509450505050612c85565b612c0b60036000600a8481548110612bdf57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054849061269e565b9250612c4d60046000600a8481548110612c2157fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902054839061269e565b9150600101612b33565b50600d54600e54612c67916125a4565b821015612c7f57600e54600d54935093505050612c85565b90925090505b9091565b60008183612cd85760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561253e578181015183820152602001612526565b506000838581612ce457fe5b0495945050505050565b6000808080612d0260646117878989612917565b90506000612d1560646117878a89612917565b90506000612d2d82612d278b8661269e565b9061269e565b9992985090965090945050505050565b6000808080612d4c8786612917565b90506000612d5a8787612917565b90506000612d68838361269e565b929992985090965090945050505050565b601354158015612d895750601454155b15612d9357612da9565b6013805460155560148054601655600091829055555b565b600080600080600080612dbd87612642565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150612def908861269e565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054612e1e908761269e565b6001600160a01b03808b1660009081526003602052604080822093909355908a1681522054612e4d90866125ea565b6001600160a01b038916600090815260036020526040902055612e6f8161303d565b612e7984836130c6565b876001600160a01b0316896001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050505050565b600080600080600080612ee187612642565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150612f13908761269e565b6001600160a01b03808b16600090815260036020908152604080832094909455918b16815260049091522054612f4990846125ea565b6001600160a01b038916600090815260046020908152604080832093909355600390522054612e4d90866125ea565b600080600080600080612f8a87612642565b6001600160a01b038f16600090815260036020526040902054959b50939950919750955093509150612e1e908761269e565b600080600080600080612fce87612642565b6001600160a01b038f16600090815260046020526040902054959b50939950919750955093509150613000908861269e565b6001600160a01b038a16600090815260046020908152604080832093909355600390522054612f13908761269e565b601554601355601654601455565b6000613047612581565b905060006130558383612917565b3060009081526003602052604090205490915061307290826125ea565b3060009081526003602090815260408083209390935560099052205460ff16156130c157306000908152600460205260409020546130b090846125ea565b306000908152600460205260409020555b505050565b600e546130d3908361269e565b600e55600f546130e390826125ea565b600f55505056fe45524332303a207472616e7366657220746f20746865207a65726f2061646472657373416d6f756e74206d757374206265206c657373207468616e20746f74616c207265666c656374696f6e734f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65728be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05472616e7366657220616d6f756e74206d7573742062652067726561746572207468616e207a65726f57652063616e206e6f7420626c61636b6c69737420556e697377617020726f757465722e45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373596f75277265206f6e20636f6f6c646f776e2120363073206265747765656e207472616465732157652063616e206e6f74206578636c75646520556e697377617020726f757465722e4578636c75646564206164647265737365732063616e6e6f742063616c6c20746869732066756e6374696f6e596f7520646f6e27742068617665207065726d697373696f6e20746f20756e6c6f636b45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122008e6c165a535efa0e445d8a30bfff76c4a10a888e2516f3ce37cdca4b93b770d64736f6c634300060c0033

Deployed Bytecode Sourcemap

26071:27369:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36388:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37300:161;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37300:161:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;41137:481;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41137:481:0;-1:-1:-1;;;;;41137:481:0;;:::i;:::-;;38675:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27302:51;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;27302:51:0;;;;;;;;;;;;;;36665:95;;;;;;;;;;;;;:::i;52823:106::-;;;;;;;;;;;;;:::i;37469:313::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37469:313:0;;;;;;;;;;;;;;;;;:::i;39599:253::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39599:253:0;;:::i;36574:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37790:218;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37790:218:0;;;;;;;;:::i;38770:377::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38770:377:0;;:::i;39155:436::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39155:436:0;;;;;;;;;:::i;27360:38::-;;;;;;;;;;;;;:::i;46439:156::-;;;;;;;;;;;;;:::i;41971:123::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41971:123:0;-1:-1:-1;;;;;41971:123:0;;:::i;27433:30::-;;;;;;;;;;;;;:::i;36768:198::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36768:198:0;-1:-1:-1;;;;;36768:198:0;;:::i;16817:148::-;;;;;;;;;;;;;:::i;27732:55::-;;;;;;;;;;;;;:::i;40797:332::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40797:332:0;-1:-1:-1;;;;;40797:332:0;;:::i;16183:79::-;;;;;;;;;;;;;:::i;53310:127::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53310:127:0;-1:-1:-1;;;;;53310:127:0;;:::i;53114:91::-;;;;;;;;;;;;;:::i;36479:87::-;;;;;;;;;;;;;:::i;38016:269::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38016:269:0;;;;;;;;:::i;17820:293::-;;;;;;;;;;;;;:::i;36974:167::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36974:167:0;;;;;;;;:::i;27555:34::-;;;;;;;;;;;;;:::i;38530:137::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38530:137:0;;;;;;;;;;:::i;17369:89::-;;;;;;;;;;;;;:::i;36237:143::-;;;;;;;;;;;;;:::i;38293:110::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38293:110:0;-1:-1:-1;;;;;38293:110:0;;:::i;53019:87::-;;;;;;;;;;;;;:::i;42102:162::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42102:162:0;;:::i;17534:214::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17534:214:0;;:::i;37149:143::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;37149:143:0;;;;;;;;;;:::i;53213:89::-;;;;;;;;;;;;;:::i;46770:98::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46770:98:0;;;;:::i;38411:111::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38411:111:0;-1:-1:-1;;;;;38411:111:0;;:::i;39860:443::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39860:443:0;-1:-1:-1;;;;;39860:443:0;;:::i;17117:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17117:244:0;-1:-1:-1;;;;;17117:244:0;;:::i;46603:159::-;;;;;;;;;;;;;:::i;52705:110::-;;;;;;;;;;;;;:::i;40311:478::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40311:478:0;-1:-1:-1;;;;;40311:478:0;;:::i;27628:30::-;;;;;;;;;;;;;:::i;27470:31::-;;;;;;;;;;;;;:::i;36388:83::-;36458:5;36451:12;;;;;;;;-1:-1:-1;;36451:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36425:13;;36451:12;;36458:5;;36451:12;;36458:5;36451:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36388:83;:::o;37300:161::-;37375:4;37392:39;37401:12;:10;:12::i;:::-;37415:7;37424:6;37392:8;:39::i;:::-;-1:-1:-1;37449:4:0;37300:161;;;;;:::o;41137:481::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41217:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;41209:57;;;::::0;;-1:-1:-1;;;41209:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;41209:57:0;;;;;;;;;;;;;::::1;;41282:9;41277:334;41301:17;:24:::0;41297:28;::::1;41277:334;;;41375:7;-1:-1:-1::0;;;;;41351:31:0::1;:17;41369:1;41351:20;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;41351:20:0::1;:31;41347:253;;;41426:17;41444:24:::0;;-1:-1:-1;;41444:28:0;;;41426:47;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;41403:17:::1;:20:::0;;-1:-1:-1;;;;;41426:47:0;;::::1;::::0;41421:1;;41403:20;::::1;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:70:::0;;-1:-1:-1;;;;;;41403:70:0::1;-1:-1:-1::0;;;;;41403:70:0;;::::1;;::::0;;41492:18;;::::1;::::0;;:9:::1;:18:::0;;;;;;:26;;-1:-1:-1;;41492:26:0::1;::::0;;41537:17:::1;:23:::0;;;::::1;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;41537:23:0;;;;;-1:-1:-1;;;;;;41537:23:0::1;::::0;;;;;41579:5:::1;;41347:253;41327:3;;41277:334;;;;41137:481:::0;:::o;38675:87::-;38744:10;;38675:87;:::o;27302:51::-;;;:::o;36665:95::-;36745:7;;36665:95;:::o;52823:106::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;52896:25:::1;52881:12;:40:::0;52823:106::o;37469:313::-;37567:4;37584:36;37594:6;37602:9;37613:6;37584:9;:36::i;:::-;37631:121;37640:6;37648:12;:10;:12::i;:::-;37662:89;37700:6;37662:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37662:19:0;;;;;;:11;:19;;;;;;37682:12;:10;:12::i;:::-;-1:-1:-1;;;;;37662:33:0;;;;;;;;;;;;-1:-1:-1;37662:33:0;;;:89;:37;:89::i;:::-;37631:8;:121::i;:::-;-1:-1:-1;37770:4:0;37469:313;;;;;:::o;39599:253::-;39665:7;39704;;39693;:18;;39685:73;;;;-1:-1:-1;;;39685:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39769:19;39792:10;:8;:10::i;:::-;39769:33;-1:-1:-1;39820:24:0;:7;39769:33;39820:11;:24::i;:::-;39813:31;;;39599:253;;;;:::o;36574:83::-;36640:9;;;;36574:83;:::o;37790:218::-;37878:4;37895:83;37904:12;:10;:12::i;:::-;37918:7;37927:50;37966:10;37927:11;:25;37939:12;:10;:12::i;:::-;-1:-1:-1;;;;;37927:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;37927:25:0;;;:34;;;;;;;;;;;:38;:50::i;38770:377::-;38822:14;38839:12;:10;:12::i;:::-;-1:-1:-1;;;;;38871:19:0;;;;;;:11;:19;;;;;;38822:29;;-1:-1:-1;38871:19:0;;38870:20;38862:77;;;;-1:-1:-1;;;38862:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38951:15;38975:19;38986:7;38975:10;:19::i;:::-;-1:-1:-1;;;;;;;;;39023:15:0;;;;;;:7;:15;;;;;;38950:44;;-1:-1:-1;39023:28:0;;:15;-1:-1:-1;38950:44:0;39023:19;:28::i;:::-;-1:-1:-1;;;;;39005:15:0;;;;;;:7;:15;;;;;:46;39072:7;;:20;;39084:7;39072:11;:20::i;:::-;39062:7;:30;39116:10;;:23;;39131:7;39116:14;:23::i;:::-;39103:10;:36;-1:-1:-1;;;38770:377:0:o;39155:436::-;39245:7;39284;;39273;:18;;39265:62;;;;;-1:-1:-1;;;39265:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39343:17;39338:246;;39378:15;39402:19;39413:7;39402:10;:19::i;:::-;-1:-1:-1;39377:44:0;;-1:-1:-1;39436:14:0;;-1:-1:-1;;;;;39436:14:0;39338:246;39485:23;39516:19;39527:7;39516:10;:19::i;:::-;-1:-1:-1;39483:52:0;;-1:-1:-1;39550:22:0;;-1:-1:-1;;;;;39550:22:0;27360:38;;;:::o;46439:156::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;46493:23:::1;46519:24;46537:4;46519:9;:24::i;:::-;46493:50;;46554:33;46571:15;46554:16;:33::i;:::-;16463:1;46439:156::o:0;41971:123::-;-1:-1:-1;;;;;42059:27:0;42035:4;42059:27;;;:18;:27;;;;;;;;;41971:123::o;27433:30::-;;;-1:-1:-1;;;27433:30:0;;;;;:::o;36768:198::-;-1:-1:-1;;;;;36858:20:0;;36834:7;36858:20;;;:11;:20;;;;;;;;36854:49;;;-1:-1:-1;;;;;;36887:16:0;;;;;;:7;:16;;;;;;36880:23;;36854:49;-1:-1:-1;;;;;36941:16:0;;;;;;:7;:16;;;;;;36921:37;;:19;:37::i;16817:148::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;16924:1:::1;16908:6:::0;;16887:40:::1;::::0;-1:-1:-1;;;;;16908:6:0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;16887:40:0;16924:1;;16887:40:::1;16955:1;16938:19:::0;;-1:-1:-1;;;;;;16938:19:0::1;::::0;;16817:148::o;27732:55::-;;;;:::o;40797:332::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;40887:42:::1;-1:-1:-1::0;;;;;40876:53:0;::::1;;;40868:102;;;;-1:-1:-1::0;;;40868:102:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;40990:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;::::1;;40989:19;40981:62;;;::::0;;-1:-1:-1;;;40981:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;41054:18:0::1;;::::0;;;:9:::1;:18;::::0;;;;:25;;-1:-1:-1;;41054:25:0::1;41075:4;41054:25:::0;;::::1;::::0;;;41090:17:::1;:31:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;41090:31:0::1;::::0;;::::1;::::0;;40797:332::o;16183:79::-;16221:7;16248:6;-1:-1:-1;;;;;16248:6:0;16183:79;:::o;53310:127::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;53397:15:::1;:32:::0;;-1:-1:-1;;;;;;53397:32:0::1;-1:-1:-1::0;;;;;53397:32:0;;;::::1;::::0;;;::::1;::::0;;53310:127::o;53114:91::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;53174:15:::1;:23:::0;;-1:-1:-1;;;;53174:23:0::1;::::0;;53114:91::o;36479:87::-;36551:7;36544:14;;;;;;;;-1:-1:-1;;36544:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36518:13;;36544:14;;36551:7;;36544:14;;36551:7;36544:14;;;;;;;;;;;;;;;;;;;;;;;;38016:269;38109:4;38126:129;38135:12;:10;:12::i;:::-;38149:7;38158:96;38197:15;38158:96;;;;;;;;;;;;;;;;;:11;:25;38170:12;:10;:12::i;:::-;-1:-1:-1;;;;;38158:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;38158:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;17820:293::-;17872:14;;-1:-1:-1;;;;;17872:14:0;17890:10;17872:28;17864:76;;;;-1:-1:-1;;;17864:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17965:9;;17959:3;:15;17951:60;;;;;-1:-1:-1;;;17951:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18056:14;;;18048:6;;18027:44;;-1:-1:-1;;;;;18056:14:0;;;;18048:6;;;;-1:-1:-1;;;;;;;;;;;18027:44:0;;18091:14;;;18082:23;;-1:-1:-1;;;;;;18082:23:0;-1:-1:-1;;;;;18091:14:0;;;18082:23;;;;;;17820:293::o;36974:167::-;37052:4;37069:42;37079:12;:10;:12::i;:::-;37093:9;37104:6;37069:9;:42::i;27555:34::-;;;-1:-1:-1;;;27555:34:0;;;;;:::o;38530:137::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;38621:27:0;;;::::1;;::::0;;;:18:::1;:27;::::0;;;;:38;;-1:-1:-1;;38621:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;38530:137::o;17369:89::-;17441:9;;17369:89;:::o;36237:143::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;36292:11:::1;:18:::0;;-1:-1:-1;;;;;;;;;;;;36292:18:0;;::::1;-1:-1:-1::0;;;36292:18:0::1;36321:22:::0;;;::::1;-1:-1:-1::0;;;36321:22:0::1;36354:18;-1:-1:-1::0;;;36354:18:0::1;::::0;;36237:143::o;38293:110::-;-1:-1:-1;;;;;38375:20:0;38351:4;38375:20;;;:11;:20;;;;;;;;;38293:110::o;53019:87::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;53079:11:::1;:19:::0;;-1:-1:-1;;;;53079:19:0::1;::::0;;53019:87::o;42102:162::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;42196:60:::1;42240:5;42196:25;42208:12;42196:7;;:11;;:25;;;;:::i;:::-;:29:::0;::::1;:60::i;:::-;42181:12;:75:::0;-1:-1:-1;42102:162:0:o;17534:214::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;17615:6:::1;::::0;;;17598:23;;-1:-1:-1;;;;;;17598:23:0;;::::1;-1:-1:-1::0;;;;;17615:6:0;::::1;17598:23;::::0;;;17632:19:::1;::::0;;17674:3:::1;:10:::0;::::1;17662:9;:22:::0;17700:40:::1;::::0;17615:6;;-1:-1:-1;;;;;;;;;;;17700:40:0;17615:6;;17700:40:::1;17534:214:::0;:::o;37149:143::-;-1:-1:-1;;;;;37257:18:0;;;37230:7;37257:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;37149:143::o;53213:89::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;53272:15:::1;:22:::0;;-1:-1:-1;;;;53272:22:0::1;-1:-1:-1::0;;;53272:22:0::1;::::0;;53213:89::o;46770:98::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;46839:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;46839:21:0::1;-1:-1:-1::0;;;;46839:21:0;;::::1;::::0;;;::::1;::::0;;46770:98::o;38411:111::-;-1:-1:-1;;;;;38496:18:0;38472:4;38496:18;;;:9;:18;;;;;;;;;38411:111::o;39860:443::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;39952:42:::1;-1:-1:-1::0;;;;;39941:53:0;::::1;;;39933:100;;;;-1:-1:-1::0;;;39933:100:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;40053:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;40052:21;40044:61;;;::::0;;-1:-1:-1;;;40044:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40044:61:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;40119:16:0;::::1;40138:1;40119:16:::0;;;:7:::1;:16;::::0;;;;;:20;40116:108:::1;;-1:-1:-1::0;;;;;40195:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;;40175:37:::1;::::0;:19:::1;:37::i;:::-;-1:-1:-1::0;;;;;40156:16:0;::::1;;::::0;;;:7:::1;:16;::::0;;;;:56;40116:108:::1;-1:-1:-1::0;;;;;40234:20:0::1;;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;40234:27:0::1;40257:4;40234:27:::0;;::::1;::::0;;;40272:9:::1;:23:::0;;;;::::1;::::0;;;;;;::::1;::::0;;-1:-1:-1;;;;;;40272:23:0::1;::::0;;::::1;::::0;;39860:443::o;17117:244::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;17206:22:0;::::1;17198:73;;;;-1:-1:-1::0;;;17198:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17308:6;::::0;;17287:38:::1;::::0;-1:-1:-1;;;;;17287:38:0;;::::1;::::0;17308:6;::::1;::::0;-1:-1:-1;;;;;;;;;;;17287:38:0;::::1;17336:6;:17:::0;;-1:-1:-1;;;;;;17336:17:0::1;-1:-1:-1::0;;;;;17336:17:0;;;::::1;::::0;;;::::1;::::0;;17117:244::o;46603:159::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;46686:21:::1;46718:36;46686:21:::0;46718:16:::1;:36::i;52705:110::-:0;52786:21;52705:110;:::o;40311:478::-;16403:12;:10;:12::i;:::-;16393:6;;-1:-1:-1;;;;;16393:6:0;;;:22;;;16385:67;;;;;-1:-1:-1;;;16385:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;16385:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40392:20:0;::::1;;::::0;;;:11:::1;:20;::::0;;;;;::::1;;40384:60;;;::::0;;-1:-1:-1;;;40384:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40384:60:0;;;;;;;;;;;;;::::1;;40460:9;40455:327;40479:9;:16:::0;40475:20;::::1;40455:327;;;40537:7;-1:-1:-1::0;;;;;40521:23:0::1;:9;40531:1;40521:12;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;40521:12:0::1;:23;40517:254;;;40580:9;40590:16:::0;;-1:-1:-1;;40590:20:0;;;40580:31;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;40565:9:::1;:12:::0;;-1:-1:-1;;;;;40580:31:0;;::::1;::::0;40575:1;;40565:12;::::1;;;;;;::::0;;;::::1;::::0;;;;;;::::1;:46:::0;;-1:-1:-1;;;;;;40565:46:0::1;-1:-1:-1::0;;;;;40565:46:0;;::::1;;::::0;;40630:16;;::::1;::::0;;:7:::1;:16:::0;;;;;;:20;;;40669:11:::1;:20:::0;;;;:28;;-1:-1:-1;;40669:28:0::1;::::0;;40716:9:::1;:15:::0;;;::::1;;;40517:254;40497:3;;40455:327;;27628:30:::0;;;-1:-1:-1;;;27628:30:0;;;;;:::o;27470:31::-;;;-1:-1:-1;;;27470:31:0;;;;;:::o;2004:106::-;2092:10;2004:106;:::o;42272:337::-;-1:-1:-1;;;;;42365:19:0;;42357:68;;;;-1:-1:-1;;;42357:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42444:21:0;;42436:68;;;;-1:-1:-1;;;42436:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42517:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;42569:32;;;;;;;;;;;;;;;;;42272:337;;;:::o;42617:2948::-;-1:-1:-1;;;;;42714:20:0;;42706:70;;;;-1:-1:-1;;;42706:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42795:23:0;;42787:71;;;;-1:-1:-1;;;42787:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42886:1;42877:6;:10;42869:64;;;;-1:-1:-1;;;42869:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42953:20:0;;;;;;:9;:20;;;;;;;;42952:21;42944:57;;;;;-1:-1:-1;;;42944:57:0;;;;;;;;;;;;-1:-1:-1;;;42944:57:0;;;;;;;;;;;;;;;43031:10;43021:21;;;;:9;:21;;;;;;;;43020:22;43012:58;;;;;-1:-1:-1;;;43012:58:0;;;;;;;;;;;;-1:-1:-1;;;43012:58:0;;;;;;;;;;;;;;;43096:7;:5;:7::i;:::-;-1:-1:-1;;;;;43086:17:0;:6;-1:-1:-1;;;;;43086:17:0;;;:41;;;;;43120:7;:5;:7::i;:::-;-1:-1:-1;;;;;43107:20:0;:9;-1:-1:-1;;;;;43107:20:0;;;43086:41;43083:1225;;;43151:11;;-1:-1:-1;;;43151:11:0;;;;43146:283;;-1:-1:-1;;;;;43189:23:0;;43207:4;43189:23;;:53;;-1:-1:-1;;;;;;43216:26:0;;43237:4;43216:26;43189:53;:100;;;;43281:7;:5;:7::i;:::-;-1:-1:-1;;;;;43263:26:0;:6;-1:-1:-1;;;;;43263:26:0;;43189:100;:133;;;;43314:7;:5;:7::i;:::-;-1:-1:-1;;;;;43293:29:0;:9;-1:-1:-1;;;;;43293:29:0;;43189:133;43183:231;;43356:11;;-1:-1:-1;;;43356:11:0;;;;43348:46;;;;;-1:-1:-1;;;43348:46:0;;;;;;;;;;;;-1:-1:-1;;;43348:46:0;;;;;;;;;;;;;;;43449:15;;-1:-1:-1;;;43449:15:0;;;;43445:300;;;-1:-1:-1;;;;;43507:15:0;;;;;;:7;:15;;;;;;43489;:33;43485:245;;;-1:-1:-1;;;;;43547:15:0;;;;;;:7;:15;;;;;43583:10;43565:15;:28;43547:46;;43485:245;;;43651:15;;-1:-1:-1;;;43651:15:0;;;;43650:16;43642:68;;;;-1:-1:-1;;;43642:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43765:11;;-1:-1:-1;;;43765:11:0;;;;43761:536;;;-1:-1:-1;;;;;43823:23:0;;43841:4;43823:23;;;;:74;;-1:-1:-1;;;;;;43871:26:0;;43892:4;43871:26;;43823:74;:133;;;;;43940:15;-1:-1:-1;;;;;43922:34:0;:6;-1:-1:-1;;;;;43922:34:0;;;43823:133;:195;;;;;44002:15;-1:-1:-1;;;;;43981:37:0;:9;-1:-1:-1;;;;;43981:37:0;;;43823:195;43797:485;;;44119:15;-1:-1:-1;;;;;44095:40:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;44095:40:0;;:98;;;;44180:13;-1:-1:-1;;;;;44164:29:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;44164:29:0;;44095:98;44061:201;;;;;-1:-1:-1;;;44061:201:0;;;;;;;;;;;;-1:-1:-1;;;44061:201:0;;;;;;;;;;;;;;;44573:28;44604:24;44622:4;44604:9;:24::i;:::-;44692:32;;44740:6;;44573:55;;-1:-1:-1;44668:56:0;;;;-1:-1:-1;;;44740:6:0;;;;44739:7;:22;;;;-1:-1:-1;44750:11:0;;-1:-1:-1;;;44750:11:0;;;;44739:22;:45;;;;;44765:19;44739:45;:72;;;;;44798:13;-1:-1:-1;;;;;44788:23:0;:6;-1:-1:-1;;;;;44788:23:0;;;44739:72;44735:414;;;44917:38;44934:20;44917:16;:38::i;:::-;45001:21;45040:22;;45037:101;;45083:39;45100:21;45083:16;:39::i;:::-;44735:414;;-1:-1:-1;;;;;45341:26:0;;45222:12;45341:26;;;:18;:26;;;;;;45237:4;;45341:26;;;:59;;-1:-1:-1;;;;;;45371:29:0;;;;;;:18;:29;;;;;;;;45341:59;45338:105;;;-1:-1:-1;45426:5:0;45338:105;45510:47;45525:6;45532:9;45542:6;45549:7;45510:14;:47::i;:::-;42617:2948;;;;;;:::o;6091:192::-;6177:7;6213:12;6205:6;;;;6197:29;;;;-1:-1:-1;;;6197:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;6249:5:0;;;6091:192::o;51775:163::-;51816:7;51837:15;51854;51873:19;:17;:19::i;:::-;51836:56;;-1:-1:-1;51836:56:0;-1:-1:-1;51910:20:0;51836:56;;51910:11;:20::i;:::-;51903:27;;;;51775:163;:::o;7469:132::-;7527:7;7554:39;7558:1;7561;7554:39;;;;;;;;;;;;;-1:-1:-1;;;7554:39:0;;;:3;:39::i;:::-;7547:46;7469:132;-1:-1:-1;;;7469:132:0:o;5206:181::-;5264:7;5296:5;;;5320:6;;;;5312:46;;;;;-1:-1:-1;;;5312:46:0;;;;;;;;;;;;-1:-1:-1;;;5312:46:0;;;;;;;;;;;;;;50584:467;50643:7;50652;50661;50670;50679;50688;50709:23;50734:12;50748:16;50768:39;50780:7;50789;;50798:8;;50768:11;:39::i;:::-;50708:99;;;;;;50818:19;50841:10;:8;:10::i;:::-;50818:33;;50863:15;50880:23;50905:12;50921:39;50933:7;50942:4;50948:11;50921;:39::i;:::-;50862:98;;-1:-1:-1;50862:98:0;-1:-1:-1;50862:98:0;-1:-1:-1;51011:15:0;;-1:-1:-1;51028:4:0;;-1:-1:-1;51034:8:0;;-1:-1:-1;;;;;50584:467:0;;;;;;;:::o;5661:136::-;5719:7;5746:43;5750:1;5753;5746:43;;;;;;;;;;;;;;;;;:3;:43::i;45573:600::-;28055:6;:13;;-1:-1:-1;;;;28055:13:0;-1:-1:-1;;;28055:13:0;;;45734:16:::1;::::0;;45748:1:::1;45734:16:::0;;;45710:21:::1;45734:16:::0;;::::1;::::0;;45710:21;45734:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;45734:16:0::1;45710:40;;45779:4;45761;45766:1;45761:7;;;;;;;;;;;;;:23;-1:-1:-1::0;;;;;45761:23:0::1;;;-1:-1:-1::0;;;;;45761:23:0::1;;;::::0;::::1;45805:15;-1:-1:-1::0;;;;;45805:20:0::1;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45805:22:0;45795:7;;:4;;45800:1:::1;::::0;45795:7;::::1;;;;;;;;;;:32;-1:-1:-1::0;;;;;45795:32:0::1;;;-1:-1:-1::0;;;;;45795:32:0::1;;;::::0;::::1;45840:62;45857:4;45872:15;45890:11;45840:8;:62::i;:::-;45941:15;-1:-1:-1::0;;;;;45941:66:0::1;;46022:11;46048:1;46092:4;46119;46139:15;45941:224;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;45941:224:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;28091:6:0;:14;;-1:-1:-1;;;;28091:14:0;;;-1:-1:-1;;;;45573:600:0:o;6533:471::-;6591:7;6836:6;6832:47;;-1:-1:-1;6866:1:0;6859:8;;6832:47;6903:5;;;6907:1;6903;:5;:1;6927:5;;;;;:10;6919:56;;;;-1:-1:-1;;;6919:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46181:108;46242:15;;-1:-1:-1;;;;;46242:15:0;:39;46267:13;:6;46278:1;46267:10;:13::i;:::-;46242:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46876:819;46988:7;46984:40;;47010:14;:12;:14::i;:::-;-1:-1:-1;;;;;47041:19:0;;;;;;:11;:19;;;;;;;;:46;;;;-1:-1:-1;;;;;;47065:22:0;;;;;;:11;:22;;;;;;;;47064:23;47041:46;47037:597;;;47104:48;47126:6;47134:9;47145:6;47104:21;:48::i;:::-;47037:597;;;-1:-1:-1;;;;;47175:19:0;;;;;;:11;:19;;;;;;;;47174:20;:46;;;;-1:-1:-1;;;;;;47198:22:0;;;;;;:11;:22;;;;;;;;47174:46;47170:464;;;47237:46;47257:6;47265:9;47276:6;47237:19;:46::i;47170:464::-;-1:-1:-1;;;;;47306:19:0;;;;;;:11;:19;;;;;;;;47305:20;:47;;;;-1:-1:-1;;;;;;47330:22:0;;;;;;:11;:22;;;;;;;;47329:23;47305:47;47301:333;;;47369:44;47387:6;47395:9;47406:6;47369:17;:44::i;47301:333::-;-1:-1:-1;;;;;47435:19:0;;;;;;:11;:19;;;;;;;;:45;;;;-1:-1:-1;;;;;;47458:22:0;;;;;;:11;:22;;;;;;;;47435:45;47431:203;;;47497:48;47519:6;47527:9;47538:6;47497:21;:48::i;47431:203::-;47578:44;47596:6;47604:9;47615:6;47578:17;:44::i;:::-;47650:7;47646:41;;47672:15;:13;:15::i;:::-;46876:819;;;;:::o;51946:555::-;52043:7;;52079;;51996;;;;;52097:289;52121:9;:16;52117:20;;52097:289;;;52187:7;52163;:21;52171:9;52181:1;52171:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52171:12:0;52163:21;;;;;;;;;;;;;:31;;:66;;;52222:7;52198;:21;52206:9;52216:1;52206:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52206:12:0;52198:21;;;;;;;;;;;;;:31;52163:66;52159:97;;;52239:7;;52248;;52231:25;;;;;;;;;52159:97;52281:34;52293:7;:21;52301:9;52311:1;52301:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52301:12:0;52293:21;;;;;;;;;;;;;52281:7;;:11;:34::i;:::-;52271:44;;52340:34;52352:7;:21;52360:9;52370:1;52360:12;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;52360:12:0;52352:21;;;;;;;;;;;;;52340:7;;:11;:34::i;:::-;52330:44;-1:-1:-1;52139:3:0;;52097:289;;;-1:-1:-1;52422:7:0;;52410;;:20;;:11;:20::i;:::-;52400:7;:30;52396:61;;;52440:7;;52449;;52432:25;;;;;;;;52396:61;52476:7;;-1:-1:-1;52485:7:0;-1:-1:-1;51946:555:0;;;:::o;8086:278::-;8172:7;8207:12;8200:5;8192:28;;;;-1:-1:-1;;;8192:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8231:9;8247:1;8243;:5;;;;;;;8086:278;-1:-1:-1;;;;;8086:278:0:o;51059:366::-;51155:7;;;;51208:28;51232:3;51208:19;:7;51220:6;51208:11;:19::i;:28::-;51193:43;-1:-1:-1;51247:16:0;51266:32;51294:3;51266:23;:7;51278:10;51266:11;:23::i;:32::-;51247:51;-1:-1:-1;51309:23:0;51335:31;51247:51;51335:17;:7;51347:4;51335:11;:17::i;:::-;:21;;:31::i;:::-;51309:57;51402:4;;-1:-1:-1;51408:8:0;;-1:-1:-1;51059:366:0;;-1:-1:-1;;;;;51059:366:0:o;51433:334::-;51528:7;;;;51584:24;:7;51596:11;51584;:24::i;:::-;51566:42;-1:-1:-1;51619:12:0;51634:21;:4;51643:11;51634:8;:21::i;:::-;51619:36;-1:-1:-1;51666:23:0;51692:17;:7;51619:36;51692:11;:17::i;:::-;51728:7;;;;-1:-1:-1;51754:4:0;;-1:-1:-1;51433:334:0;;-1:-1:-1;;;;;51433:334:0:o;41626:214::-;41672:7;;:12;:29;;;;-1:-1:-1;41688:8:0;;:13;41672:29;41669:41;;;41703:7;;41669:41;41740:7;;;41722:15;:25;41777:8;;;41758:16;:27;-1:-1:-1;41798:11:0;;;;41820:12;41626:214;:::o;48784:557::-;48887:15;48904:23;48929:12;48943:23;48968:12;48982:16;49002:19;49013:7;49002:10;:19::i;:::-;-1:-1:-1;;;;;49050:15:0;;;;;;:7;:15;;;;;;48886:135;;-1:-1:-1;48886:135:0;;-1:-1:-1;48886:135:0;;-1:-1:-1;48886:135:0;-1:-1:-1;48886:135:0;-1:-1:-1;48886:135:0;-1:-1:-1;49050:28:0;;49070:7;49050:19;:28::i;:::-;-1:-1:-1;;;;;49032:15:0;;;;;;:7;:15;;;;;;;;:46;;;;49107:7;:15;;;;:28;;49127:7;49107:19;:28::i;:::-;-1:-1:-1;;;;;49089:15:0;;;;;;;:7;:15;;;;;;:46;;;;49167:18;;;;;;;:39;;49190:15;49167:22;:39::i;:::-;-1:-1:-1;;;;;49146:18:0;;;;;;:7;:18;;;;;:60;49217:22;49230:8;49217:12;:22::i;:::-;49250:23;49262:4;49268;49250:11;:23::i;:::-;49306:9;-1:-1:-1;;;;;49289:44:0;49298:6;-1:-1:-1;;;;;49289:44:0;;49317:15;49289:44;;;;;;;;;;;;;;;;;;48784:557;;;;;;;;;:::o;48207:569::-;48308:15;48325:23;48350:12;48364:23;48389:12;48403:16;48423:19;48434:7;48423:10;:19::i;:::-;-1:-1:-1;;;;;48471:15:0;;;;;;:7;:15;;;;;;48307:135;;-1:-1:-1;48307:135:0;;-1:-1:-1;48307:135:0;;-1:-1:-1;48307:135:0;-1:-1:-1;48307:135:0;-1:-1:-1;48307:135:0;-1:-1:-1;48471:28:0;;48307:135;48471:19;:28::i;:::-;-1:-1:-1;;;;;48453:15:0;;;;;;;:7;:15;;;;;;;;:46;;;;48531:18;;;;;:7;:18;;;;;:39;;48554:15;48531:22;:39::i;:::-;-1:-1:-1;;;;;48510:18:0;;;;;;:7;:18;;;;;;;;:60;;;;48602:7;:18;;;;:39;;48625:15;48602:22;:39::i;47703:496::-;47802:15;47819:23;47844:12;47858:23;47883:12;47897:16;47917:19;47928:7;47917:10;:19::i;:::-;-1:-1:-1;;;;;47965:15:0;;;;;;:7;:15;;;;;;47801:135;;-1:-1:-1;47801:135:0;;-1:-1:-1;47801:135:0;;-1:-1:-1;47801:135:0;-1:-1:-1;47801:135:0;-1:-1:-1;47801:135:0;-1:-1:-1;47965:28:0;;47801:135;47965:19;:28::i;49349:628::-;49452:15;49469:23;49494:12;49508:23;49533:12;49547:16;49567:19;49578:7;49567:10;:19::i;:::-;-1:-1:-1;;;;;49615:15:0;;;;;;:7;:15;;;;;;49451:135;;-1:-1:-1;49451:135:0;;-1:-1:-1;49451:135:0;;-1:-1:-1;49451:135:0;-1:-1:-1;49451:135:0;-1:-1:-1;49451:135:0;-1:-1:-1;49615:28:0;;49635:7;49615:19;:28::i;:::-;-1:-1:-1;;;;;49597:15:0;;;;;;:7;:15;;;;;;;;:46;;;;49672:7;:15;;;;:28;;49692:7;49672:19;:28::i;41848:115::-;41902:15;;41892:7;:25;41939:16;;41928:8;:27;41848:115::o;49985:343::-;50044:19;50067:10;:8;:10::i;:::-;50044:33;-1:-1:-1;50088:16:0;50107:25;:8;50044:33;50107:12;:25::i;:::-;50184:4;50168:22;;;;:7;:22;;;;;;50088:44;;-1:-1:-1;50168:36:0;;50088:44;50168:26;:36::i;:::-;50159:4;50143:22;;;;:7;:22;;;;;;;;:61;;;;50218:11;:26;;;;;;50215:105;;;50300:4;50284:22;;;;:7;:22;;;;;;:36;;50311:8;50284:26;:36::i;:::-;50275:4;50259:22;;;;:7;:22;;;;;:61;50215:105;49985:343;;;:::o;50336:147::-;50414:7;;:17;;50426:4;50414:11;:17::i;:::-;50404:7;:27;50455:10;;:20;;50470:4;50455:14;:20::i;:::-;50442:10;:33;-1:-1:-1;;50336:147:0:o

Swarm Source

ipfs://08e6c165a535efa0e445d8a30bfff76c4a10a888e2516f3ce37cdca4b93b770d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.