ETH Price: $3,255.05 (-0.61%)
Gas: 1 Gwei

Token

ShibaHood (SHOOD)
 

Overview

Max Total Supply

100,000,000 SHOOD

Holders

169

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 9 Decimals)

Balance
13,579.8693 SHOOD

Value
$0.00
0x982be252407d54c8df1b93caed441ba7c6be3e12
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:
ShibaHood

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-14
*/

/*
* 
ShibaHood

Supply: 100 000 000 
Max Wallet: 500 000 to start then 2 000 000
Max TX: 250 000 to start then 1 000 000

Tax: 7%

1% LP
4% Buybacks/Marketing/Dev
2% Charity Wallet

DO NOT BUY UNTIL CONTRACT ADDRESS IS POSTED IN TELEGRAM

https://t.me/shibahoodportal

*
*/

pragma solidity =0.8.9;

// SPDX-License-Identifier: UNLICENSED

interface IBEP20 {
  function totalSupply() external view returns (uint256);
  function decimals() external view returns (uint8);
  function symbol() external view returns (string memory);
  function name() external view returns (string memory);
  function getOwner() external view returns (address);
  function balanceOf(address account) external view returns (uint256);
  function transfer(address recipient, uint256 amount) external returns (bool);
  function allowance(address _owner, address spender) external view returns (uint256);
  function approve(address spender, uint256 amount) external returns (bool);
  function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
  event Approval(address indexed owner, address indexed spender, uint256 value);
}


interface IuniswapV2ERC20 {
    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;
}

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 IuniswapV2Router01 {
    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 factory() external pure returns (address);
    function WETH() external pure returns (address);
    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;
}



/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = msg.sender;
        _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() == msg.sender, "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() external 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) external onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // 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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}

//ShibaHood Contract /////////////

contract ShibaHood is IBEP20, Ownable
{
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    event ContractChanged(uint256 indexed value);
    event ContractChangedBool(bool indexed value);
    event ContractChangedAddress(address indexed value);
    event antiBotBan(address indexed value);
    
    
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;
    mapping (address => uint256) private _buyLock;

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _isBlacklisted;

    //Token Info
    string private constant _name = 'ShibaHood';
    string private constant _symbol = 'SHOOD';
    uint8 private constant _decimals = 9;
    uint256 public constant InitialSupply= 100000000 * 10**_decimals;

    //Amount to Swap variable
    uint256 currentAmountToSwap = 1500000 * 10**_decimals;
    //Divider for the MaxBalance based on circulating Supply (2%)
    uint8 public constant BalanceLimitDivider=50;
    //Divider for sellLimit based on circulating Supply (0.25%)
    uint16 public constant SellLimitDivider=400;
	//Buyers get locked for MaxBuyLockTime (put in seconds, works better especially if changing later) so they can't buy repeatedly
    uint16 public constant MaxBuyLockTime= 15 seconds;
    //The time Liquidity gets locked at start and prolonged once it gets released
    uint256 private constant DefaultLiquidityLockTime= 1800;
    //DevWallets
    address public TeamWallet=payable(0x974F7a3eCD3fDE631e603891d0F5Ee5c3E60C30f);
    address public CharityWallet=payable(0x86feA555875Cd9820626c3dFd831adf9Cb35545b);
    //Uniswap router (Main & Testnet)
    address private uniswapV2Router=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;


    //variables that track balanceLimit and sellLimit,
    //can be updated based on circulating supply and Sell- and BalanceLimitDividers
    uint256 private _circulatingSupply =InitialSupply;
    uint256 public  balanceLimit = _circulatingSupply;
    uint256 public  sellLimit = _circulatingSupply;
	uint256 private antiWhale = 250000 * 10**_decimals;

    //Used for anti-bot autoblacklist
    uint256 private tradingEnabledAt; //DO NOT CHANGE, THIS IS FOR HOLDING A TIMESTAMP
	uint256 private autoBanTime = 30; // Set to the amount of time in seconds after enable trading you want addresses to be auto blacklisted if they buy/sell/transfer in this time.
	uint256 private enableAutoBlacklist = 1; //Leave 1 if using, set to 0 if not using.
    
    //Tracks the current Taxes, different Taxes can be applied for buy/sell/transfer
    uint8 private _buyTax;
    uint8 private _sellTax;
    uint8 private _transferTax;

    uint8 private _burnTax;
    uint8 private _liquidityTax;
    uint8 private _marketingTax;
       
    address private _uniswapV2PairAddress; 
    IuniswapV2Router02 private _uniswapV2Router;

    //Constructor///////////

    constructor () {
        //contract creator gets 90% of the token to create LP-Pair
        uint256 deployerBalance=_circulatingSupply;
        _balances[msg.sender] = deployerBalance;
        emit Transfer(address(0), msg.sender, deployerBalance);
        // Uniswap Router
        _uniswapV2Router = IuniswapV2Router02(uniswapV2Router);
        //Creates a Uniswap Pair
        _uniswapV2PairAddress = IuniswapV2Factory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
        
        //Sets Buy/Sell limits
        balanceLimit=InitialSupply/BalanceLimitDivider;
        sellLimit=InitialSupply/SellLimitDivider;
		
		//Sets buyLockTime
        buyLockTime=0;

        //Set Starting Taxes 
        
        _buyTax=7;
        _sellTax=7;
        _transferTax=7;

        _burnTax=0;
        _liquidityTax=10;
        _marketingTax=90;

        //Team wallets and deployer are excluded from Taxes
        _excluded.add(TeamWallet);
        _excluded.add(CharityWallet);
        _excluded.add(msg.sender);
    
    }

    //Transfer functionality///

    //transfer function, every transfer runs through this function
    function _transfer(address sender, address recipient, uint256 amount) private{
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");
        
        //Manually Excluded adresses are transfering tax and lock free
        bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient));
        
        //Transactions from and to the contract are always tax and lock free
        bool isContractTransfer=(sender==address(this) || recipient==address(this));
        
        //transfers between UniswapRouter and UniswapPair are tax and lock free
        address uniswapV2Router=address(_uniswapV2Router);
        bool isLiquidityTransfer = ((sender == _uniswapV2PairAddress && recipient == uniswapV2Router) 
        || (recipient == _uniswapV2PairAddress && sender == uniswapV2Router));

        //differentiate between buy/sell/transfer to apply different taxes/restrictions
        bool isBuy=sender==_uniswapV2PairAddress|| sender == uniswapV2Router;
        bool isSell=recipient==_uniswapV2PairAddress|| recipient == uniswapV2Router;

        //Pick transfer
        if(isContractTransfer || isLiquidityTransfer || isExcluded){
            _feelessTransfer(sender, recipient, amount);
        }
        else{ 
            //once trading is enabled, it can't be turned off again
            require(tradingEnabled,"trading not yet enabled");
            _taxedTransfer(sender,recipient,amount,isBuy,isSell);
        }
    }
    //applies taxes, checks for limits, locks generates autoLP
    function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell) private{
        uint256 recipientBalance = _balances[recipient];
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");

        uint8 tax;
        if(isSell){
            //Sells can't exceed the sell limit
            require(amount<=sellLimit,"Dump protection");
            require(_isBlacklisted.contains(sender) == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }
            tax=_sellTax;


        } else if(isBuy){
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(recipientBalance+amount<=balanceLimit,"whale protection");
			require(amount <= antiWhale,"Tx amount exceeding max buy amount");
            require(_isBlacklisted.contains(recipient) == false, "Address blacklisted!");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(recipient);
                emit antiBotBan(recipient);
            }
            tax=_buyTax;

        } else {//Transfer
            //Checks If the recipient balance(excluding Taxes) would exceed Balance Limit
            require(_isBlacklisted.contains(sender) == false, "Sender address blacklisted!");
            require(_isBlacklisted.contains(recipient) == false, "Recipient address blacklisted!");
            require(recipientBalance+amount<=balanceLimit,"whale protection");
            if (block.timestamp <= tradingEnabledAt + autoBanTime && enableAutoBlacklist == 1) {
                _isBlacklisted.add(sender);
                emit antiBotBan(sender);
            }
            tax=_transferTax;


        }     
        //Swapping AutoLP and MarketingETH is only possible if sender is not uniswapV2 pair, 
        //if its not manually disabled, if its not already swapping and if its a Sell to avoid
        // people from causing a large price impact from repeatedly transfering when theres a large backlog of Tokens
        if((sender!=_uniswapV2PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)&&isSell)
            _swapContractToken();
        //Calculates the exact token amount for each tax
        uint256 tokensToBeBurnt=_calculateFee(amount, tax, _burnTax);
        uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax);
        //Subtract the Taxed Tokens from the amount
        uint256 taxedAmount=amount-(tokensToBeBurnt + contractToken);

        //Removes token
        _removeToken(sender,amount);
        
        //Adds the taxed tokens to the contract wallet
        _balances[address(this)] += contractToken;
        //Burns tokens
        _circulatingSupply-=tokensToBeBurnt;

        //Adds token
        _addToken(recipient, taxedAmount);
        
        emit Transfer(sender,recipient,taxedAmount);

    }

    //Feeless transfer only transfers
    function _feelessTransfer(address sender, address recipient, uint256 amount) private{
        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "Transfer exceeds balance");
        //Removes token
        _removeToken(sender,amount);
        //Adds token
        _addToken(recipient, amount);
        
        emit Transfer(sender,recipient,amount);

    }
    //Calculates the token that should be taxed
    function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) {
        return (amount*tax*taxPercent) / 10000;
    }
  
    //balance that is claimable by the team
    uint256 public marketingBalance;

    //adds Token to balances
    function _addToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]+amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }
    
    
    //removes Token
    function _removeToken(address addr, uint256 amount) private {
        //the amount of token after transfer
        uint256 newAmount=_balances[addr]-amount;
        //sets newBalance
        _balances[addr]=newAmount;
    }

    //Swap Contract Tokens//////////////////////////////////////////////////////////////////////////////////

    //tracks auto generated ETH, useful for ticker etc
    uint256 public totalLPETH;
    //Locks the swap if already swapping
    bool private _isSwappingContractModifier;
    modifier lockTheSwap {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    //swaps the token on the contract for Marketing ETH and LP Token.
    //always swaps the sellLimit of token to avoid a large price impact
    function _swapContractToken() private lockTheSwap{
        uint256 contractBalance=_balances[address(this)];
        uint16 totalTax=_marketingTax+_liquidityTax;
        uint256 tokenToSwap = currentAmountToSwap;
        //only swap if contractBalance is larger than tokenToSwap, and totalTax is unequal to 0
        if(contractBalance<tokenToSwap||totalTax==0){
            return;
        }
        //splits the token in TokenForLiquidity and tokenForMarketing
        uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax;
        uint256 tokenForMarketing= tokenToSwap-tokenForLiquidity;

        //splits tokenForLiquidity in 2 halves
        uint256 liqToken=tokenForLiquidity/2;
        uint256 liqETHToken=tokenForLiquidity-liqToken;

        //swaps marktetingToken and the liquidity token half for ETH
        uint256 swapToken=liqETHToken+tokenForMarketing;
        //Gets the initial ETH balance
        uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH=(address(this).balance - initialETHBalance);
        //calculates the amount of ETH belonging to the LP-Pair and converts them to LP
        uint256 liqETH = (newETH*liqETHToken)/swapToken;
        _addLiquidity(liqToken, liqETH);
        //Get the ETH balance after LP generation to get the
        //exact amount of token left for marketing
        uint256 distributeETH=(address(this).balance - initialETHBalance);
        //distributes remaining BETHNB to Marketing
        marketingBalance+=distributeETH;
    }
    //swaps tokens on the contract for ETH
    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_uniswapV2Router), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapV2Router.WETH();

        _uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }
    //Adds Liquidity directly to the contract where LP are locked(unlike safemoon forks, that transfer it to the owner)
    function _addLiquidity(uint256 tokenamount, uint256 ethamount) private returns (uint256 tAmountSent, uint256 ethAmountSent) {
        totalLPETH+=ethamount;
        uint256 minETH = (ethamount*75) / 100;
        uint256 minTokens = (tokenamount*75) / 100;
        _approve(address(this), address(_uniswapV2Router), tokenamount);
        _uniswapV2Router.addLiquidityETH{value: ethamount}(
            address(this),
            tokenamount,
            minTokens,
            minETH,
            address(this),
            block.timestamp
        );
        tAmountSent = tokenamount;
        ethAmountSent = ethamount;
        return (tAmountSent, ethAmountSent);
    }

    //public functions /////////////////////////////////////////////////////////////////////////////////////

    function getLiquidityReleaseTimeInSeconds() external view returns (uint256){
        if(block.timestamp<_liquidityUnlockTime){
            return _liquidityUnlockTime-block.timestamp;
        }
        return 0;
    }

    function getBurnedTokens() external view returns(uint256){
        return (InitialSupply-_circulatingSupply)/10**_decimals;
    }

    function getLimits() external view returns(uint256 balance, uint256 sell){
        return(balanceLimit/10**_decimals, sellLimit/10**_decimals);
    }

    function getTaxes() external view returns(uint256 burnTax,uint256 liquidityTax, uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){
        return (_burnTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax);
    }
	
    //How long is a given address still locked from buying
	function getAddressBuyLockTimeInSeconds(address AddressToCheck) external view returns (uint256){
       uint256 lockTime=_buyLock[AddressToCheck];
       if(lockTime<=block.timestamp)
       {
           return 0;
       }
       return lockTime-block.timestamp;
    }
    function getBuyLockTimeInSeconds() external view returns(uint256){
        return buyLockTime;
    }
    
    //Functions every wallet can call
	
	//Resets buy lock of caller to the default buyLockTime should something go very wrong
    function AddressResetBuyLock() external{
        _buyLock[msg.sender]=block.timestamp+buyLockTime;
	
    }

    //Settings//////////////////////////////////////////////////////////////////////////////////////////////
 
	bool public buyLockDisabled;
    uint256 public buyLockTime;
    bool public manualConversion; 

    function TeamWithdrawALLMarketingETH() external onlyOwner{
        uint256 amount=marketingBalance;
        marketingBalance=0;
        payable(TeamWallet).transfer((amount*66) / 100);
        payable(CharityWallet).transfer((amount-(amount*66) / 100));
        emit Transfer(address(this), TeamWallet, (amount*66) / 100);
        emit Transfer(address(this), CharityWallet, (amount-(amount*66) / 100));
    } 
    function TeamWithdrawXMarketingETH(uint256 amount) external onlyOwner{
        require(amount<=marketingBalance,
        "Error: Amount greater than available balance.");
        marketingBalance-=amount;
        payable(TeamWallet).transfer((amount*66) / 100);
        payable(CharityWallet).transfer((amount-(amount*66) / 100));
        emit Transfer(address(this), TeamWallet, (amount*66) / 100);
        emit Transfer(address(this), CharityWallet, (amount-(amount*66) / 100));
    } 

    //switches autoLiquidity and marketing ETH generation during transfers
    function TeamSwitchManualETHConversion(bool manual) external onlyOwner{
        manualConversion=manual;
        emit ContractChangedBool(manualConversion);
    }
	
	function TeamChangeAntiWhale(uint256 newAntiWhale) external onlyOwner{
      antiWhale=newAntiWhale * 10**_decimals;
      emit ContractChanged(antiWhale);
    }
    
    function TeamChangeTeamWallet(address newTeamWallet) external onlyOwner{
      require(newTeamWallet != address(0),
      "Error: Cannot be 0 address.");
      TeamWallet=payable(newTeamWallet);
      emit ContractChangedAddress(TeamWallet);
    }
    
    function TeamChangeCharityWallet(address newCharityWallet) external onlyOwner{
      require(newCharityWallet != address(0),
      "Error: Cannot be 0 address.");
      CharityWallet=payable(newCharityWallet);
      emit ContractChangedAddress(CharityWallet);
    }
	
	//Disables the timeLock after buying for everyone
    function TeamDisableBuyLock(bool disabled) external onlyOwner{
        buyLockDisabled=disabled;
        emit ContractChangedBool(buyLockDisabled);
    }
	
	//Sets BuyLockTime, needs to be lower than MaxBuyLockTime
    function TeamSetBuyLockTime(uint256 buyLockSeconds) external onlyOwner{
            require(buyLockSeconds<=MaxBuyLockTime,"Buy Lock time too high");
            buyLockTime=buyLockSeconds;
            emit ContractChanged(buyLockTime);
    } 

    //Allows CA owner to change how much the contract sells to prevent massive contract sells as the token grows.
    function TeamUpdateAmountToSwap(uint256 newSwapAmount) external onlyOwner{
        currentAmountToSwap = newSwapAmount;
        emit ContractChanged(currentAmountToSwap);
    }
    
    //Allows wallet exclusion to be added after launch
    function addWalletExclusion(address exclusionAdd) external onlyOwner{
        _excluded.add(exclusionAdd);
        emit ContractChangedAddress(exclusionAdd);
    }

    //Allows you to remove wallet exclusions after launch
    function removeWalletExclusion(address exclusionRemove) external onlyOwner{
        _excluded.remove(exclusionRemove);
        emit ContractChangedAddress(exclusionRemove);
    }

    //Adds address to blacklist and prevents sells, buys or transfers.
    function addAddressToBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.add(blacklistedAddress);
        emit ContractChangedAddress(blacklistedAddress);
    }

    //Remove address from blacklist and allow sells, buys or transfers.
    function removeAddressFromBlacklist(address blacklistedAddress) external onlyOwner {
        _isBlacklisted.remove(blacklistedAddress);
        emit ContractChangedAddress(blacklistedAddress);
    }
    
    //Sets Taxes, is limited by MaxTax(20%) to make it impossible to create honeypot
    function TeamSetTaxes(uint8 burnTaxes, uint8 liquidityTaxes, uint8 marketingTaxes, uint8 buyTax, uint8 sellTax, uint8 transferTax) external onlyOwner{
        uint8 totalTax=burnTaxes+liquidityTaxes+marketingTaxes;
        require(totalTax==100, "burn+liq+marketing needs to equal 100%");
        require(buyTax <= 20,
        "Error: Honeypot prevention prevents buyTax from exceeding 20.");
        require(sellTax <= 20,
        "Error: Honeypot prevention prevents sellTax from exceeding 20.");
        require(transferTax <= 20,
        "Error: Honeypot prevention prevents transferTax from exceeding 20.");

        _burnTax=burnTaxes;
        _liquidityTax=liquidityTaxes;
        _marketingTax=marketingTaxes;
        
        _buyTax=buyTax;
        _sellTax=sellTax;
        _transferTax=transferTax;

        emit ContractChanged(_burnTax);
        emit ContractChanged(_liquidityTax);
        emit ContractChanged(_buyTax);
        emit ContractChanged(_sellTax);
        emit ContractChanged(_transferTax);
    }

    //manually converts contract token to LP
    function TeamCreateLPandETH() external onlyOwner{
    _swapContractToken();
    }
    
    function teamUpdateUniswapRouter(address newRouter) external onlyOwner {
        require(newRouter != address(0),
        "Error: Cannot be 0 address.");
        uniswapV2Router=newRouter;
        emit ContractChangedAddress(newRouter);
    }
     //Limits need to be at least target, to avoid setting value to 0(avoid potential Honeypot)
    function TeamUpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) external onlyOwner{
        //SellLimit needs to be below 1% to avoid a Large Price impact when generating auto LP
        require(newSellLimit<_circulatingSupply/100,
        "Error: New sell limit above 1% of circulating supply.");
        //Adds decimals to limits
        newBalanceLimit=newBalanceLimit*10**_decimals;
        newSellLimit=newSellLimit*10**_decimals;
        //Calculates the target Limits based on supply
        uint256 targetBalanceLimit=_circulatingSupply/BalanceLimitDivider;
        uint256 targetSellLimit=_circulatingSupply/SellLimitDivider;

        require((newBalanceLimit>=targetBalanceLimit), 
        "newBalanceLimit needs to be at least target");
        require((newSellLimit>=targetSellLimit), 
        "newSellLimit needs to be at least target");

        balanceLimit = newBalanceLimit;
        sellLimit = newSellLimit;
        emit ContractChanged(balanceLimit);
        emit ContractChanged(sellLimit);
    }

    
    //Setup Functions///////////////////////////////////////////////////////////////////////////////////////
    
    bool public tradingEnabled;
    address private _liquidityTokenAddress;
    //Enables trading for everyone
    function SetupEnableTrading() external onlyOwner{
        tradingEnabled=true;
        tradingEnabledAt=block.timestamp;
    }
    //Sets up the LP-Token Address required for LP Release
    function SetupLiquidityTokenAddress(address liquidityTokenAddress) external onlyOwner{
        require(liquidityTokenAddress != address(0),
        "Error: Cannot be 0 address.");
        _liquidityTokenAddress=liquidityTokenAddress;
    }

    //Liquidity Lock////////////////////////////////////////////////////////////////////////////////////////
    //the timestamp when Liquidity unlocks
    uint256 private _liquidityUnlockTime;

    //Adds time to LP lock in seconds.
    function TeamProlongLiquidityLockInSeconds(uint256 secondsUntilUnlock) external onlyOwner{
        _prolongLiquidityLock(secondsUntilUnlock+block.timestamp);
        emit ContractChanged(secondsUntilUnlock+block.timestamp);
    }
    //Adds time to LP lock based on set time.
    function _prolongLiquidityLock(uint256 newUnlockTime) private{
        // require new unlock time to be longer than old one
        require(newUnlockTime>_liquidityUnlockTime,
        "Error: New unlock time is shorter than old one.");
        _liquidityUnlockTime=newUnlockTime;
        emit ContractChanged(_liquidityUnlockTime);
    }

    //Release Liquidity Tokens once unlock time is over
    function TeamReleaseLiquidity() external onlyOwner returns (address tWAddress, uint256 amountSent) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        //Liquidity release if something goes wrong at start
        liquidityToken.transfer(TeamWallet, amount);
        emit Transfer(address(this), TeamWallet, amount);
        tWAddress = TeamWallet;
        amountSent = amount;
        return (tWAddress, amountSent);
        
    }
    //Removes Liquidity once unlock Time is over, 
    function TeamRemoveLiquidity() external onlyOwner returns (uint256 newBalance) {
        //Only callable if liquidity Unlock time is over
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        IuniswapV2ERC20 liquidityToken = IuniswapV2ERC20(_liquidityTokenAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));

        liquidityToken.approve(address(_uniswapV2Router),amount);
        //Removes Liquidity and adds it to marketing Balance
        uint256 initialETHBalance = address(this).balance;
        
        _uniswapV2Router.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            (amount*75) / 100,
            (amount*75) / 100,
            address(this),
            block.timestamp
            );
        uint256 newETHBalance = address(this).balance-initialETHBalance;
        marketingBalance+=newETHBalance;
        newBalance=newETHBalance;
        return newBalance;
    }
    //Releases all remaining ETH on the contract wallet, so ETH wont be burned
    function TeamRemoveRemainingETH() external onlyOwner{
        require(block.timestamp >= _liquidityUnlockTime, "Not yet unlocked");
        (bool sent,) =TeamWallet.call{value: (address(this).balance)}("");
        require(sent,
        "Error: Not sent.");
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////
    //external//////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////////////////////////////////////////////////////////

    receive() external payable {}
    fallback() external payable {}
    // IBEP20

    function getOwner() external view override returns (address) {
        return owner();
    }

    function name() external pure override returns (string memory) {
        return _name;
    }

    function symbol() external pure override returns (string memory) {
        return _symbol;
    }

    function decimals() external pure override returns (uint8) {
        return _decimals;
    }

    function totalSupply() external view override returns (uint256) {
        return _circulatingSupply;
    }

    function balanceOf(address account) external view override returns (uint256) {
        return _balances[account];
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }
    function _approve(address owner, address spender, uint256 amount) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

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

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    // IBEP20 - Helpers

    function increaseAllowance(address spender, uint256 addedValue) external returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

}

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":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"ContractChangedAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"ContractChangedBool","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":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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"value","type":"address"}],"name":"antiBotBan","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"AddressResetBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CharityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxBuyLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SetupEnableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"SetupLiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAntiWhale","type":"uint256"}],"name":"TeamChangeAntiWhale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCharityWallet","type":"address"}],"name":"TeamChangeCharityWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTeamWallet","type":"address"}],"name":"TeamChangeTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamCreateLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"TeamDisableBuyLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"secondsUntilUnlock","type":"uint256"}],"name":"TeamProlongLiquidityLockInSeconds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamReleaseLiquidity","outputs":[{"internalType":"address","name":"tWAddress","type":"address"},{"internalType":"uint256","name":"amountSent","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveLiquidity","outputs":[{"internalType":"uint256","name":"newBalance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamRemoveRemainingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"buyLockSeconds","type":"uint256"}],"name":"TeamSetBuyLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"burnTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"marketingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"TeamSetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"TeamSwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSwapAmount","type":"uint256"}],"name":"TeamUpdateAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"TeamUpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"TeamWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TeamWithdrawALLMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamWithdrawXMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"addAddressToBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionAdd","type":"address"}],"name":"addWalletExclusion","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":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"address","name":"AddressToCheck","type":"address"}],"name":"getAddressBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBurnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBuyLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityReleaseTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxes","outputs":[{"internalType":"uint256","name":"burnTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","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":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"blacklistedAddress","type":"address"}],"name":"removeAddressFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exclusionRemove","type":"address"}],"name":"removeWalletExclusion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"newRouter","type":"address"}],"name":"teamUpdateUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalLPETH","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":"tradingEnabled","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"},{"stateMutability":"payable","type":"receive"}]

6080604052620000126009600a620005c2565b62000021906216e360620005d3565b600855600980546001600160a01b031990811673974f7a3ecd3fde631e603891d0f5ee5c3e60c30f178255600a805482167386fea555875cd9820626c3dfd831adf9cb35545b178155600b8054909216737a250d5630b4cf539739df2c5dacb4c659f2488d17909155620000969190620005c2565b620000a6906305f5e100620005d3565b600c819055600d819055600e55620000c16009600a620005c2565b620000d0906203d090620005d3565b600f55601e6011556001601255348015620000ea57600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c54336000818152600160209081526040808320859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3600b54601480546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a015591600480820192602092909190829003018186803b158015620001cb57600080fd5b505afa158015620001e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002069190620005f5565b6001600160a01b031663c9c6539630601460009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200026457600080fd5b505afa15801562000279573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029f9190620005f5565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b158015620002e857600080fd5b505af1158015620002fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003239190620005f5565b601380546001600160a01b0392909216660100000000000002600160301b600160d01b03199092169190911790556032620003616009600a620005c2565b62000371906305f5e100620005d3565b6200037d919062000627565b600d55610190620003916009600a620005c2565b620003a1906305f5e100620005d3565b620003ad919062000627565b600e5560006018556013805465ffffffffffff1916655a0a00070707179055600954620003f2906004906001600160a01b03166200043d602090811b620022e617901c565b50600a5462000419906004906001600160a01b03166200043d602090811b620022e617901c565b50620004353360046200043d60201b620022e61790919060201c565b50506200064a565b600062000454836001600160a01b0384166200045d565b90505b92915050565b6000818152600183016020526040812054620004a65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000457565b50600062000457565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000506578160001904821115620004ea57620004ea620004af565b80851615620004f857918102915b93841c9390800290620004ca565b509250929050565b6000826200051f5750600162000457565b816200052e5750600062000457565b8160018114620005475760028114620005525762000572565b600191505062000457565b60ff841115620005665762000566620004af565b50506001821b62000457565b5060208310610133831016604e8410600b841016171562000597575081810a62000457565b620005a38383620004c5565b8060001904821115620005ba57620005ba620004af565b029392505050565b60006200045460ff8416836200050e565b6000816000190483118215151615620005f057620005f0620004af565b500290565b6000602082840312156200060857600080fd5b81516001600160a01b03811681146200062057600080fd5b9392505050565b6000826200064557634e487b7160e01b600052601260045260246000fd5b500490565b613958806200065a6000396000f3fe6080604052600436106103605760003560e01c80636eb8c7f1116101c45780639fa62d5f116100f6578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610a6f578063f2c816ae14610a8f578063f2fde38b14610aaf578063f9ab736614610acf57005b8063daf9a47a146109c9578063dd62ed3e146109e9578063e2fd002a14610a2f578063e60ccfb014610a4f57005b8063b766a386116100d3578063b766a3861461095f578063c3a3c0321461097f578063c3f4f54f14610994578063d11edf74146109a957005b80639fa62d5f146108ff578063a457c2d71461091f578063a9059cbb1461093f57005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461087157806395d89b41146108915780639bc845fb146108bf5780639bf65770146108df57005b8063828e8b7e1461082457806386d0ada814610839578063893d20e8146108535780638da5cb5b1461085357005b8063715018a6116101a1578063715018a6146107c4578063762bb282146107d95780637b9e987a146107ef5780637e9ae5da1461080457005b80636eb8c7f1146107445780636f89e4091461076457806370a082311461078e57005b8063395093511161029d5780634cdaf0ae1161024157806358e553651161021357806358e55365146106c15780635c69f690146106d757806361cb2748146106ec578063677a88701461070c57005b80634cdaf0ae146106565780634f91e48c1461067657806357ad67d11461068c57806358e1df92146106ac57005b80634476f35a1161027a5780634476f35a146105ec57806344f3c83a1461060c5780634ada218b146106225780634cbf8e241461064157005b806339509351146105825780633c7a309b146105a25780633cc39b7a146105d657005b806323b872dd116103045780633054f8a3116102e15780633054f8a314610508578063311a869714610527578063313ce5671461054e57806335e82f3a1461056257005b806323b872dd14610468578063243b529a146104885780632973ef2d1461049d57005b80630fd99e161161033d5780630fd99e161461040057806314ddc0951461042957806318160ddd1461043e5780631eb25d131461045357005b806306fdde0314610369578063095ea7b3146103ad5780630fa5b215146103dd57005b3661036757005b005b34801561037557600080fd5b5060408051808201909152600981526814da1a5898521bdbd960ba1b60208201525b6040516103a49190613318565b60405180910390f35b3480156103b957600080fd5b506103cd6103c8366004613382565b610aef565b60405190151581526020016103a4565b3480156103e957600080fd5b506103f2610b06565b6040519081526020016103a4565b34801561040c57600080fd5b5061041661019081565b60405161ffff90911681526020016103a4565b34801561043557600080fd5b506018546103f2565b34801561044a57600080fd5b50600c546103f2565b34801561045f57600080fd5b506103f2610d61565b34801561047457600080fd5b506103cd6104833660046133ae565b610d7e565b34801561049457600080fd5b50610367610e15565b3480156104a957600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a4565b34801561051457600080fd5b506017546103cd90610100900460ff1681565b34801561053357600080fd5b5061053c603281565b60405160ff90911681526020016103a4565b34801561055a57600080fd5b50600961053c565b34801561056e57600080fd5b5061036761057d3660046133ef565b610e58565b34801561058e57600080fd5b506103cd61059d366004613382565b610ec2565b3480156105ae57600080fd5b506105b7610ef9565b604080516001600160a01b0390931683526020830191909152016103a4565b3480156105e257600080fd5b506103f260165481565b3480156105f857600080fd5b5061036761060736600461340c565b6110ac565b34801561061857600080fd5b506103f260185481565b34801561062e57600080fd5b506019546103cd90610100900460ff1681565b34801561064d57600080fd5b506103676112a1565b34801561066257600080fd5b506103676106713660046133ef565b611395565b34801561068257600080fd5b506103f2600e5481565b34801561069857600080fd5b506103676106a736600461343b565b61141e565b3480156106b857600080fd5b506103676117b3565b3480156106cd57600080fd5b506103f260155481565b3480156106e357600080fd5b50610416600f81565b3480156106f857600080fd5b506103676107073660046133ef565b611811565b34801561071857600080fd5b5060095461072c906001600160a01b031681565b6040516001600160a01b0390911681526020016103a4565b34801561075057600080fd5b5061036761075f36600461340c565b611855565b34801561077057600080fd5b506107796118c4565b604080519283526020830191909152016103a4565b34801561079a57600080fd5b506103f26107a93660046133ef565b6001600160a01b031660009081526001602052604090205490565b3480156107d057600080fd5b50610367611901565b3480156107e557600080fd5b506103f2600d5481565b3480156107fb57600080fd5b50610367611984565b34801561081057600080fd5b5061036761081f3660046133ef565b6119d2565b34801561083057600080fd5b50610367611a69565b34801561084557600080fd5b506019546103cd9060ff1681565b34801561085f57600080fd5b506000546001600160a01b031661072c565b34801561087d57600080fd5b5061036761088c3660046133ef565b611a8d565b34801561089d57600080fd5b5060408051808201909152600581526414d213d3d160da1b6020820152610397565b3480156108cb57600080fd5b506103676108da3660046133ef565b611b24565b3480156108eb57600080fd5b506103676108fa3660046134bd565b611bbb565b34801561090b57600080fd5b5061036761091a3660046134da565b611c39565b34801561092b57600080fd5b506103cd61093a366004613382565b611e53565b34801561094b57600080fd5b506103cd61095a366004613382565b611ecf565b34801561096b57600080fd5b5061036761097a3660046134bd565b611edc565b34801561098b57600080fd5b506103f2611f64565b3480156109a057600080fd5b506103f2611f84565b3480156109b557600080fd5b506103676109c436600461340c565b611fc3565b3480156109d557600080fd5b506103676109e436600461340c565b61201d565b3480156109f557600080fd5b506103f2610a043660046134fc565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a3b57600080fd5b50610367610a4a36600461340c565b61208b565b348015610a5b57600080fd5b50600a5461072c906001600160a01b031681565b348015610a7b57600080fd5b506103f2610a8a3660046133ef565b61212f565b348015610a9b57600080fd5b50610367610aaa3660046133ef565b612169565b348015610abb57600080fd5b50610367610aca3660046133ef565b6121ad565b348015610adb57600080fd5b50610367610aea3660046133ef565b6122a6565b6000610afc3384846122fb565b5060015b92915050565b600033610b1b6000546001600160a01b031690565b6001600160a01b031614610b4a5760405162461bcd60e51b8152600401610b4190613535565b60405180910390fd5b601a54421015610b6c5760405162461bcd60e51b8152600401610b419061356a565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bb957600080fd5b505afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf19190613594565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c4157600080fd5b505af1158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7991906135ad565b5060145447906001600160a01b031663af2979eb30846064610c9c82604b6135e0565b610ca691906135ff565b6064610cb388604b6135e0565b610cbd91906135ff565b30426040518763ffffffff1660e01b8152600401610ce096959493929190613621565b602060405180830381600087803b158015610cfa57600080fd5b505af1158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d329190613594565b506000610d3f824761365c565b90508060156000828254610d539190613673565b909155509094505050505090565b610d6d6009600a61376f565b610d7b906305f5e1006135e0565b81565b6000610d8b8484846123ee565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610df65760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b41565b610e0a8533610e05868561365c565b6122fb565b506001949350505050565b33610e286000546001600160a01b031690565b6001600160a01b031614610e4e5760405162461bcd60e51b8152600401610b4190613535565b610e5661264b565b565b33610e6b6000546001600160a01b031690565b6001600160a01b031614610e915760405162461bcd60e51b8152600401610b4190613535565b610e9c60068261279e565b506040516001600160a01b0382169060008051602061390383398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610afc918590610e05908690613673565b60008033610f0f6000546001600160a01b031690565b6001600160a01b031614610f355760405162461bcd60e51b8152600401610b4190613535565b601a54421015610f575760405162461bcd60e51b8152600401610b419061356a565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fa457600080fd5b505afa158015610fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdc9190613594565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561102c57600080fd5b505af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906135ad565b506009546040518281526001600160a01b039091169030906000805160206138e38339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336110bf6000546001600160a01b031690565b6001600160a01b0316146110e55760405162461bcd60e51b8152600401610b4190613535565b60155481111561114d5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b41565b806015600082825461115f919061365c565b90915550506009546001600160a01b03166108fc60646111808460426135e0565b61118a91906135ff565b6040518115909202916000818181858888f193505050501580156111b2573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111cf8460426135e0565b6111d991906135ff565b6111e3908461365c565b6040518115909202916000818181858888f1935050505015801561120b573d6000803e3d6000fd5b506009546001600160a01b0316306000805160206138e383398151915260646112358560426135e0565b61123f91906135ff565b60405190815260200160405180910390a3600a546001600160a01b0316306000805160206138e383398151915260646112798560426135e0565b61128391906135ff565b61128d908561365c565b60405190815260200160405180910390a350565b336112b46000546001600160a01b031690565b6001600160a01b0316146112da5760405162461bcd60e51b8152600401610b4190613535565b601a544210156112fc5760405162461bcd60e51b8152600401610b419061356a565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611349576040519150601f19603f3d011682016040523d82523d6000602084013e61134e565b606091505b50509050806113925760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b41565b50565b336113a86000546001600160a01b031690565b6001600160a01b0316146113ce5760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b0381166113f45760405162461bcd60e51b8152600401610b419061377e565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114316000546001600160a01b031690565b6001600160a01b0316146114575760405162461bcd60e51b8152600401610b4190613535565b60008461146487896137b5565b61146e91906137b5565b90508060ff166064146114d25760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b41565b60148460ff16111561154c5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b41565b60148360ff1611156115c65760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b41565b60148260ff16111561164b5760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b41565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138c383398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138c383398151915290600090a260135460405160ff909116906000805160206138c383398151915290600090a260135460405161010090910460ff16906000805160206138c383398151915290600090a26013546040516201000090910460ff16906000805160206138c383398151915290600090a250505050505050565b336117c66000546001600160a01b031690565b6001600160a01b0316146117ec5760405162461bcd60e51b8152600401610b4190613535565b6015805460009091556009546001600160a01b03166108fc60646111808460426135e0565b336118246000546001600160a01b031690565b6001600160a01b03161461184a5760405162461bcd60e51b8152600401610b4190613535565b610e9c60048261279e565b336118686000546001600160a01b031690565b6001600160a01b03161461188e5760405162461bcd60e51b8152600401610b4190613535565b6118a061189b4283613673565b6127b3565b6118aa4282613673565b6040516000805160206138c383398151915290600090a250565b6000806118d36009600a61376f565b600d546118e091906135ff565b6118ec6009600a61376f565b600e546118f991906135ff565b915091509091565b336119146000546001600160a01b031690565b6001600160a01b03161461193a5760405162461bcd60e51b8152600401610b4190613535565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336119976000546001600160a01b031690565b6001600160a01b0316146119bd5760405162461bcd60e51b8152600401610b4190613535565b6019805461ff00191661010017905542601055565b336119e56000546001600160a01b031690565b6001600160a01b031614611a0b5760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b038116611a315760405162461bcd60e51b8152600401610b419061377e565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390383398151915290600090a250565b601854611a769042613673565b33600090815260036020526040902055565b905090565b33611aa06000546001600160a01b031690565b6001600160a01b031614611ac65760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b038116611aec5760405162461bcd60e51b8152600401610b419061377e565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390383398151915290600090a250565b33611b376000546001600160a01b031690565b6001600160a01b031614611b5d5760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b038116611b835760405162461bcd60e51b8152600401610b419061377e565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390383398151915290600090a250565b33611bce6000546001600160a01b031690565b6001600160a01b031614611bf45760405162461bcd60e51b8152600401610b4190613535565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611c4c6000546001600160a01b031690565b6001600160a01b031614611c725760405162461bcd60e51b8152600401610b4190613535565b6064600c54611c8191906135ff565b8110611ced5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b41565b611cf96009600a61376f565b611d0390836135e0565b9150611d116009600a61376f565b611d1b90826135e0565b90506000603260ff16600c54611d3191906135ff565b9050600061019061ffff16600c54611d4991906135ff565b905081841015611daf5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b41565b80831015611e105760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b41565b600d849055600e83905560405184906000805160206138c383398151915290600090a2600e546040516000805160206138c383398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611eb65760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b41565b611ec53385610e05868561365c565b5060019392505050565b6000610afc3384846123ee565b33611eef6000546001600160a01b031690565b6001600160a01b031614611f155760405162461bcd60e51b8152600401610b4190613535565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611f7e5742601a54611a88919061365c565b50600090565b6000611f926009600a61376f565b600c54611fa16009600a61376f565b611faf906305f5e1006135e0565b611fb9919061365c565b611a8891906135ff565b33611fd66000546001600160a01b031690565b6001600160a01b031614611ffc5760405162461bcd60e51b8152600401610b4190613535565b600881905560405181906000805160206138c383398151915290600090a250565b336120306000546001600160a01b031690565b6001600160a01b0316146120565760405162461bcd60e51b8152600401610b4190613535565b6120626009600a61376f565b61206c90826135e0565b600f8190556040516000805160206138c383398151915290600090a250565b3361209e6000546001600160a01b031690565b6001600160a01b0316146120c45760405162461bcd60e51b8152600401610b4190613535565b600f81111561210e5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b41565b601881905560405181906000805160206138c383398151915290600090a250565b6001600160a01b0381166000908152600360205260408120544281116121585750600092915050565b612162428261365c565b9392505050565b3361217c6000546001600160a01b031690565b6001600160a01b0316146121a25760405162461bcd60e51b8152600401610b4190613535565b610e9c6006826122e6565b336121c06000546001600160a01b031690565b6001600160a01b0316146121e65760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b03811661224b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b41565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122b96000546001600160a01b031690565b6001600160a01b0316146122df5760405162461bcd60e51b8152600401610b4190613535565b610e9c6004825b6000612162836001600160a01b03841661283d565b6001600160a01b0383166123455760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b41565b6001600160a01b03821661238d5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b41565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124395760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b41565b6001600160a01b0382166124825760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b41565b600061248f60048561288c565b806124a057506124a060048461288c565b905060006001600160a01b0385163014806124c357506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156125055750816001600160a01b0316866001600160a01b0316145b8061254057506013546001600160a01b03878116600160301b909204161480156125405750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b90920416148061257a5750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125b45750836001600160a01b0316886001600160a01b0316145b905084806125bf5750825b806125c75750855b156125dc576125d78989896128ae565b612640565b601954610100900460ff166126335760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b41565b6126408989898585612967565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061269390640100000000810460ff90811691650100000000009004166137b5565b60ff16905060006008549050808310806126af575061ffff8216155b156126bc57505050612792565b60135460009061ffff8416906126dd90640100000000900460ff16846135e0565b6126e791906135ff565b905060006126f5828461365c565b905060006127046002846135ff565b90506000612712828561365c565b905060006127208483613673565b90504761272c82612f21565b6000612738824761365c565b905060008361274786846135e0565b61275191906135ff565b905061275d8682613089565b506000905061276c844761365c565b905080601560008282546127809190613673565b90915550505050505050505050505050505b6017805460ff19169055565b6000612162836001600160a01b03841661318e565b601a54811161281c5760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b41565b601a81905560405181906000805160206138c383398151915290600090a250565b600081815260018301602052604081205461288457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b00565b506000610b00565b6001600160a01b03811660009081526001830160205260408120541515612162565b6001600160a01b038316600090815260016020526040902054818110156129125760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b41565b61291c848361327b565b61292683836132c0565b826001600160a01b0316846001600160a01b03166000805160206138e38339815191528460405161295991815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129d55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b41565b60008315612ae857600e54861115612a215760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b41565b612a2c60068961288c565b15612a705760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b41565b601154601054612a809190613673565b4211158015612a9157506012546001145b15612ad757612aa16006896122e6565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dce565b8415612c5b57600d54612afb8785613673565b1115612b3c5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b41565b600f54861115612b995760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b41565b612ba460068861288c565b15612be85760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b41565b601154601054612bf89190613673565b4211158015612c0957506012546001145b15612c4f57612c196006886122e6565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dce565b612c6660068961288c565b15612cb35760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b41565b612cbe60068861288c565b15612d0b5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b41565b600d54612d188785613673565b1115612d595760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b41565b601154601054612d699190613673565b4211158015612d7a57506012546001145b15612dc057612d8a6006896122e6565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612df6575060195460ff16155b8015612e05575060175460ff16155b8015612e0e5750835b15612e1b57612e1b61264b565b6000612e378783601360039054906101000a900460ff166132e4565b601354909150600090612e6d9089908590612e689060ff6401000000008204811691650100000000009004166137b5565b6132e4565b90506000612e7b8284613673565b612e85908a61365c565b9050612e918b8a61327b565b3060009081526001602052604081208054849290612eb0908490613673565b9250508190555082600c6000828254612ec9919061365c565b90915550612ed990508a826132c0565b896001600160a01b03168b6001600160a01b03166000805160206138e383398151915283604051612f0c91815260200190565b60405180910390a35050505050505050505050565b601454612f399030906001600160a01b0316836122fb565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f6e57612f6e6137da565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fc257600080fd5b505afa158015612fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffa91906137f0565b8160018151811061300d5761300d6137da565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac9479061305390859060009086903090429060040161380d565b600060405180830381600087803b15801561306d57600080fd5b505af1158015613081573d6000803e3d6000fd5b505050505050565b600080826016600082825461309e9190613673565b909155506000905060646130b385604b6135e0565b6130bd91906135ff565b9050600060646130ce87604b6135e0565b6130d891906135ff565b6014549091506130f39030906001600160a01b0316886122fb565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d71990879061312f9030908b908790899084904290600401613621565b6060604051808303818588803b15801561314857600080fd5b505af115801561315c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613181919061387e565b5096979596505050505050565b600081815260018301602052604081205480156132715760006131b260018361365c565b85549091506000906131c69060019061365c565b905060008660000182815481106131df576131df6137da565b9060005260206000200154905080876000018481548110613202576132026137da565b600091825260208083209091019290925582815260018901909152604090208490558654879080613235576132356138ac565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b00565b6000915050610b00565b6001600160a01b03821660009081526001602052604081205461329f90839061365c565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461329f908390613673565b60006127108260ff168460ff16866132fc91906135e0565b61330691906135e0565b61331091906135ff565b949350505050565b600060208083528351808285015260005b8181101561334557858101830151858201604001528201613329565b81811115613357576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461139257600080fd5b6000806040838503121561339557600080fd5b82356133a08161336d565b946020939093013593505050565b6000806000606084860312156133c357600080fd5b83356133ce8161336d565b925060208401356133de8161336d565b929592945050506040919091013590565b60006020828403121561340157600080fd5b81356121628161336d565b60006020828403121561341e57600080fd5b5035919050565b803560ff8116811461343657600080fd5b919050565b60008060008060008060c0878903121561345457600080fd5b61345d87613425565b955061346b60208801613425565b945061347960408801613425565b935061348760608801613425565b925061349560808801613425565b91506134a360a08801613425565b90509295509295509295565b801515811461139257600080fd5b6000602082840312156134cf57600080fd5b8135612162816134af565b600080604083850312156134ed57600080fd5b50508035926020909101359150565b6000806040838503121561350f57600080fd5b823561351a8161336d565b9150602083013561352a8161336d565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156135a657600080fd5b5051919050565b6000602082840312156135bf57600080fd5b8151612162816134af565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156135fa576135fa6135ca565b500290565b60008261361c57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008282101561366e5761366e6135ca565b500390565b60008219821115613686576136866135ca565b500190565b600181815b808511156136c65781600019048211156136ac576136ac6135ca565b808516156136b957918102915b93841c9390800290613690565b509250929050565b6000826136dd57506001610b00565b816136ea57506000610b00565b8160018114613700576002811461370a57613726565b6001915050610b00565b60ff84111561371b5761371b6135ca565b50506001821b610b00565b5060208310610133831016604e8410600b8410161715613749575081810a610b00565b613753838361368b565b8060001904821115613767576137676135ca565b029392505050565b600061216260ff8416836136ce565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff038211156137d2576137d26135ca565b019392505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561380257600080fd5b81516121628161336d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561385d5784516001600160a01b031683529383019391830191600101613838565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561389357600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda2646970667358221220ac591d4e7561cca506a56a6ac893ab0424cad6c94b0aef887ab8dcaa38ddbbb664736f6c63430008090033

Deployed Bytecode

0x6080604052600436106103605760003560e01c80636eb8c7f1116101c45780639fa62d5f116100f6578063daf9a47a1161009a578063e803050c1161006c578063e803050c14610a6f578063f2c816ae14610a8f578063f2fde38b14610aaf578063f9ab736614610acf57005b8063daf9a47a146109c9578063dd62ed3e146109e9578063e2fd002a14610a2f578063e60ccfb014610a4f57005b8063b766a386116100d3578063b766a3861461095f578063c3a3c0321461097f578063c3f4f54f14610994578063d11edf74146109a957005b80639fa62d5f146108ff578063a457c2d71461091f578063a9059cbb1461093f57005b8063828e8b7e11610168578063929dffda1161013a578063929dffda1461087157806395d89b41146108915780639bc845fb146108bf5780639bf65770146108df57005b8063828e8b7e1461082457806386d0ada814610839578063893d20e8146108535780638da5cb5b1461085357005b8063715018a6116101a1578063715018a6146107c4578063762bb282146107d95780637b9e987a146107ef5780637e9ae5da1461080457005b80636eb8c7f1146107445780636f89e4091461076457806370a082311461078e57005b8063395093511161029d5780634cdaf0ae1161024157806358e553651161021357806358e55365146106c15780635c69f690146106d757806361cb2748146106ec578063677a88701461070c57005b80634cdaf0ae146106565780634f91e48c1461067657806357ad67d11461068c57806358e1df92146106ac57005b80634476f35a1161027a5780634476f35a146105ec57806344f3c83a1461060c5780634ada218b146106225780634cbf8e241461064157005b806339509351146105825780633c7a309b146105a25780633cc39b7a146105d657005b806323b872dd116103045780633054f8a3116102e15780633054f8a314610508578063311a869714610527578063313ce5671461054e57806335e82f3a1461056257005b806323b872dd14610468578063243b529a146104885780632973ef2d1461049d57005b80630fd99e161161033d5780630fd99e161461040057806314ddc0951461042957806318160ddd1461043e5780631eb25d131461045357005b806306fdde0314610369578063095ea7b3146103ad5780630fa5b215146103dd57005b3661036757005b005b34801561037557600080fd5b5060408051808201909152600981526814da1a5898521bdbd960ba1b60208201525b6040516103a49190613318565b60405180910390f35b3480156103b957600080fd5b506103cd6103c8366004613382565b610aef565b60405190151581526020016103a4565b3480156103e957600080fd5b506103f2610b06565b6040519081526020016103a4565b34801561040c57600080fd5b5061041661019081565b60405161ffff90911681526020016103a4565b34801561043557600080fd5b506018546103f2565b34801561044a57600080fd5b50600c546103f2565b34801561045f57600080fd5b506103f2610d61565b34801561047457600080fd5b506103cd6104833660046133ae565b610d7e565b34801561049457600080fd5b50610367610e15565b3480156104a957600080fd5b506013546040805160ff63010000008404811682526401000000008404811660208301526501000000000084048116928201929092528183166060820152610100830482166080820152620100009092041660a082015260c0016103a4565b34801561051457600080fd5b506017546103cd90610100900460ff1681565b34801561053357600080fd5b5061053c603281565b60405160ff90911681526020016103a4565b34801561055a57600080fd5b50600961053c565b34801561056e57600080fd5b5061036761057d3660046133ef565b610e58565b34801561058e57600080fd5b506103cd61059d366004613382565b610ec2565b3480156105ae57600080fd5b506105b7610ef9565b604080516001600160a01b0390931683526020830191909152016103a4565b3480156105e257600080fd5b506103f260165481565b3480156105f857600080fd5b5061036761060736600461340c565b6110ac565b34801561061857600080fd5b506103f260185481565b34801561062e57600080fd5b506019546103cd90610100900460ff1681565b34801561064d57600080fd5b506103676112a1565b34801561066257600080fd5b506103676106713660046133ef565b611395565b34801561068257600080fd5b506103f2600e5481565b34801561069857600080fd5b506103676106a736600461343b565b61141e565b3480156106b857600080fd5b506103676117b3565b3480156106cd57600080fd5b506103f260155481565b3480156106e357600080fd5b50610416600f81565b3480156106f857600080fd5b506103676107073660046133ef565b611811565b34801561071857600080fd5b5060095461072c906001600160a01b031681565b6040516001600160a01b0390911681526020016103a4565b34801561075057600080fd5b5061036761075f36600461340c565b611855565b34801561077057600080fd5b506107796118c4565b604080519283526020830191909152016103a4565b34801561079a57600080fd5b506103f26107a93660046133ef565b6001600160a01b031660009081526001602052604090205490565b3480156107d057600080fd5b50610367611901565b3480156107e557600080fd5b506103f2600d5481565b3480156107fb57600080fd5b50610367611984565b34801561081057600080fd5b5061036761081f3660046133ef565b6119d2565b34801561083057600080fd5b50610367611a69565b34801561084557600080fd5b506019546103cd9060ff1681565b34801561085f57600080fd5b506000546001600160a01b031661072c565b34801561087d57600080fd5b5061036761088c3660046133ef565b611a8d565b34801561089d57600080fd5b5060408051808201909152600581526414d213d3d160da1b6020820152610397565b3480156108cb57600080fd5b506103676108da3660046133ef565b611b24565b3480156108eb57600080fd5b506103676108fa3660046134bd565b611bbb565b34801561090b57600080fd5b5061036761091a3660046134da565b611c39565b34801561092b57600080fd5b506103cd61093a366004613382565b611e53565b34801561094b57600080fd5b506103cd61095a366004613382565b611ecf565b34801561096b57600080fd5b5061036761097a3660046134bd565b611edc565b34801561098b57600080fd5b506103f2611f64565b3480156109a057600080fd5b506103f2611f84565b3480156109b557600080fd5b506103676109c436600461340c565b611fc3565b3480156109d557600080fd5b506103676109e436600461340c565b61201d565b3480156109f557600080fd5b506103f2610a043660046134fc565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a3b57600080fd5b50610367610a4a36600461340c565b61208b565b348015610a5b57600080fd5b50600a5461072c906001600160a01b031681565b348015610a7b57600080fd5b506103f2610a8a3660046133ef565b61212f565b348015610a9b57600080fd5b50610367610aaa3660046133ef565b612169565b348015610abb57600080fd5b50610367610aca3660046133ef565b6121ad565b348015610adb57600080fd5b50610367610aea3660046133ef565b6122a6565b6000610afc3384846122fb565b5060015b92915050565b600033610b1b6000546001600160a01b031690565b6001600160a01b031614610b4a5760405162461bcd60e51b8152600401610b4190613535565b60405180910390fd5b601a54421015610b6c5760405162461bcd60e51b8152600401610b419061356a565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610bb957600080fd5b505afa158015610bcd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf19190613594565b60145460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b390604401602060405180830381600087803b158015610c4157600080fd5b505af1158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c7991906135ad565b5060145447906001600160a01b031663af2979eb30846064610c9c82604b6135e0565b610ca691906135ff565b6064610cb388604b6135e0565b610cbd91906135ff565b30426040518763ffffffff1660e01b8152600401610ce096959493929190613621565b602060405180830381600087803b158015610cfa57600080fd5b505af1158015610d0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d329190613594565b506000610d3f824761365c565b90508060156000828254610d539190613673565b909155509094505050505090565b610d6d6009600a61376f565b610d7b906305f5e1006135e0565b81565b6000610d8b8484846123ee565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610df65760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401610b41565b610e0a8533610e05868561365c565b6122fb565b506001949350505050565b33610e286000546001600160a01b031690565b6001600160a01b031614610e4e5760405162461bcd60e51b8152600401610b4190613535565b610e5661264b565b565b33610e6b6000546001600160a01b031690565b6001600160a01b031614610e915760405162461bcd60e51b8152600401610b4190613535565b610e9c60068261279e565b506040516001600160a01b0382169060008051602061390383398151915290600090a250565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610afc918590610e05908690613673565b60008033610f0f6000546001600160a01b031690565b6001600160a01b031614610f355760405162461bcd60e51b8152600401610b4190613535565b601a54421015610f575760405162461bcd60e51b8152600401610b419061356a565b6019546040516370a0823160e01b8152306004820152620100009091046001600160a01b03169060009082906370a082319060240160206040518083038186803b158015610fa457600080fd5b505afa158015610fb8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdc9190613594565b60095460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810183905291925083169063a9059cbb90604401602060405180830381600087803b15801561102c57600080fd5b505af1158015611040573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106491906135ad565b506009546040518281526001600160a01b039091169030906000805160206138e38339815191529060200160405180910390a36009546001600160a01b031693509150509091565b336110bf6000546001600160a01b031690565b6001600160a01b0316146110e55760405162461bcd60e51b8152600401610b4190613535565b60155481111561114d5760405162461bcd60e51b815260206004820152602d60248201527f4572726f723a20416d6f756e742067726561746572207468616e20617661696c60448201526c30b13632903130b630b731b29760991b6064820152608401610b41565b806015600082825461115f919061365c565b90915550506009546001600160a01b03166108fc60646111808460426135e0565b61118a91906135ff565b6040518115909202916000818181858888f193505050501580156111b2573d6000803e3d6000fd5b50600a546001600160a01b03166108fc60646111cf8460426135e0565b6111d991906135ff565b6111e3908461365c565b6040518115909202916000818181858888f1935050505015801561120b573d6000803e3d6000fd5b506009546001600160a01b0316306000805160206138e383398151915260646112358560426135e0565b61123f91906135ff565b60405190815260200160405180910390a3600a546001600160a01b0316306000805160206138e383398151915260646112798560426135e0565b61128391906135ff565b61128d908561365c565b60405190815260200160405180910390a350565b336112b46000546001600160a01b031690565b6001600160a01b0316146112da5760405162461bcd60e51b8152600401610b4190613535565b601a544210156112fc5760405162461bcd60e51b8152600401610b419061356a565b6009546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611349576040519150601f19603f3d011682016040523d82523d6000602084013e61134e565b606091505b50509050806113925760405162461bcd60e51b815260206004820152601060248201526f22b93937b91d102737ba1039b2b73a1760811b6044820152606401610b41565b50565b336113a86000546001600160a01b031690565b6001600160a01b0316146113ce5760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b0381166113f45760405162461bcd60e51b8152600401610b419061377e565b601980546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b336114316000546001600160a01b031690565b6001600160a01b0316146114575760405162461bcd60e51b8152600401610b4190613535565b60008461146487896137b5565b61146e91906137b5565b90508060ff166064146114d25760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401610b41565b60148460ff16111561154c5760405162461bcd60e51b815260206004820152603d60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473206275795461782066726f6d20657863656564696e672032302e0000006064820152608401610b41565b60148360ff1611156115c65760405162461bcd60e51b815260206004820152603e60248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e74732073656c6c5461782066726f6d20657863656564696e672032302e00006064820152608401610b41565b60148260ff16111561164b5760405162461bcd60e51b815260206004820152604260248201527f4572726f723a20486f6e6579706f742070726576656e74696f6e20707265766560448201527f6e7473207472616e736665725461782066726f6d20657863656564696e672032606482015261181760f11b608482015260a401610b41565b86601360036101000a81548160ff021916908360ff16021790555085601360046101000a81548160ff021916908360ff16021790555084601360056101000a81548160ff021916908360ff16021790555083601360006101000a81548160ff021916908360ff16021790555082601360016101000a81548160ff021916908360ff16021790555081601360026101000a81548160ff021916908360ff160217905550601360039054906101000a900460ff1660ff166000805160206138c383398151915260405160405180910390a260135460405164010000000090910460ff16906000805160206138c383398151915290600090a260135460405160ff909116906000805160206138c383398151915290600090a260135460405161010090910460ff16906000805160206138c383398151915290600090a26013546040516201000090910460ff16906000805160206138c383398151915290600090a250505050505050565b336117c66000546001600160a01b031690565b6001600160a01b0316146117ec5760405162461bcd60e51b8152600401610b4190613535565b6015805460009091556009546001600160a01b03166108fc60646111808460426135e0565b336118246000546001600160a01b031690565b6001600160a01b03161461184a5760405162461bcd60e51b8152600401610b4190613535565b610e9c60048261279e565b336118686000546001600160a01b031690565b6001600160a01b03161461188e5760405162461bcd60e51b8152600401610b4190613535565b6118a061189b4283613673565b6127b3565b6118aa4282613673565b6040516000805160206138c383398151915290600090a250565b6000806118d36009600a61376f565b600d546118e091906135ff565b6118ec6009600a61376f565b600e546118f991906135ff565b915091509091565b336119146000546001600160a01b031690565b6001600160a01b03161461193a5760405162461bcd60e51b8152600401610b4190613535565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b336119976000546001600160a01b031690565b6001600160a01b0316146119bd5760405162461bcd60e51b8152600401610b4190613535565b6019805461ff00191661010017905542601055565b336119e56000546001600160a01b031690565b6001600160a01b031614611a0b5760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b038116611a315760405162461bcd60e51b8152600401610b419061377e565b600a80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390383398151915290600090a250565b601854611a769042613673565b33600090815260036020526040902055565b905090565b33611aa06000546001600160a01b031690565b6001600160a01b031614611ac65760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b038116611aec5760405162461bcd60e51b8152600401610b419061377e565b600b80546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390383398151915290600090a250565b33611b376000546001600160a01b031690565b6001600160a01b031614611b5d5760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b038116611b835760405162461bcd60e51b8152600401610b419061377e565b600980546001600160a01b0319166001600160a01b03831690811790915560405160008051602061390383398151915290600090a250565b33611bce6000546001600160a01b031690565b6001600160a01b031614611bf45760405162461bcd60e51b8152600401610b4190613535565b6019805460ff191682151590811790915560405160ff9091161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b33611c4c6000546001600160a01b031690565b6001600160a01b031614611c725760405162461bcd60e51b8152600401610b4190613535565b6064600c54611c8191906135ff565b8110611ced5760405162461bcd60e51b815260206004820152603560248201527f4572726f723a204e65772073656c6c206c696d69742061626f7665203125206f604482015274331031b4b931bab630ba34b7339039bab838363c9760591b6064820152608401610b41565b611cf96009600a61376f565b611d0390836135e0565b9150611d116009600a61376f565b611d1b90826135e0565b90506000603260ff16600c54611d3191906135ff565b9050600061019061ffff16600c54611d4991906135ff565b905081841015611daf5760405162461bcd60e51b815260206004820152602b60248201527f6e657742616c616e63654c696d6974206e6565647320746f206265206174206c60448201526a19585cdd081d185c99d95d60aa1b6064820152608401610b41565b80831015611e105760405162461bcd60e51b815260206004820152602860248201527f6e657753656c6c4c696d6974206e6565647320746f206265206174206c6561736044820152671d081d185c99d95d60c21b6064820152608401610b41565b600d849055600e83905560405184906000805160206138c383398151915290600090a2600e546040516000805160206138c383398151915290600090a250505050565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611eb65760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401610b41565b611ec53385610e05868561365c565b5060019392505050565b6000610afc3384846123ee565b33611eef6000546001600160a01b031690565b6001600160a01b031614611f155760405162461bcd60e51b8152600401610b4190613535565b6017805461ff0019166101008315158102919091179182905560405160ff91909204161515907f669a6418e904a59fab89972d5ce42429cb380f287efcaef65dace33212fda0d990600090a250565b6000601a54421015611f7e5742601a54611a88919061365c565b50600090565b6000611f926009600a61376f565b600c54611fa16009600a61376f565b611faf906305f5e1006135e0565b611fb9919061365c565b611a8891906135ff565b33611fd66000546001600160a01b031690565b6001600160a01b031614611ffc5760405162461bcd60e51b8152600401610b4190613535565b600881905560405181906000805160206138c383398151915290600090a250565b336120306000546001600160a01b031690565b6001600160a01b0316146120565760405162461bcd60e51b8152600401610b4190613535565b6120626009600a61376f565b61206c90826135e0565b600f8190556040516000805160206138c383398151915290600090a250565b3361209e6000546001600160a01b031690565b6001600160a01b0316146120c45760405162461bcd60e51b8152600401610b4190613535565b600f81111561210e5760405162461bcd60e51b8152602060048201526016602482015275084eaf24098dec6d640e8d2daca40e8dede40d0d2ced60531b6044820152606401610b41565b601881905560405181906000805160206138c383398151915290600090a250565b6001600160a01b0381166000908152600360205260408120544281116121585750600092915050565b612162428261365c565b9392505050565b3361217c6000546001600160a01b031690565b6001600160a01b0316146121a25760405162461bcd60e51b8152600401610b4190613535565b610e9c6006826122e6565b336121c06000546001600160a01b031690565b6001600160a01b0316146121e65760405162461bcd60e51b8152600401610b4190613535565b6001600160a01b03811661224b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b41565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b336122b96000546001600160a01b031690565b6001600160a01b0316146122df5760405162461bcd60e51b8152600401610b4190613535565b610e9c6004825b6000612162836001600160a01b03841661283d565b6001600160a01b0383166123455760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401610b41565b6001600160a01b03821661238d5760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401610b41565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166124395760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401610b41565b6001600160a01b0382166124825760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401610b41565b600061248f60048561288c565b806124a057506124a060048461288c565b905060006001600160a01b0385163014806124c357506001600160a01b03841630145b6014546013549192506001600160a01b0390811691600091888116600160301b909204161480156125055750816001600160a01b0316866001600160a01b0316145b8061254057506013546001600160a01b03878116600160301b909204161480156125405750816001600160a01b0316876001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b90920416148061257a5750826001600160a01b0316886001600160a01b0316145b6013549091506000906001600160a01b03898116600160301b9092041614806125b45750836001600160a01b0316886001600160a01b0316145b905084806125bf5750825b806125c75750855b156125dc576125d78989896128ae565b612640565b601954610100900460ff166126335760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401610b41565b6126408989898585612967565b505050505050505050565b6017805460ff19166001908117909155306000908152602091909152604081205460135490919061269390640100000000810460ff90811691650100000000009004166137b5565b60ff16905060006008549050808310806126af575061ffff8216155b156126bc57505050612792565b60135460009061ffff8416906126dd90640100000000900460ff16846135e0565b6126e791906135ff565b905060006126f5828461365c565b905060006127046002846135ff565b90506000612712828561365c565b905060006127208483613673565b90504761272c82612f21565b6000612738824761365c565b905060008361274786846135e0565b61275191906135ff565b905061275d8682613089565b506000905061276c844761365c565b905080601560008282546127809190613673565b90915550505050505050505050505050505b6017805460ff19169055565b6000612162836001600160a01b03841661318e565b601a54811161281c5760405162461bcd60e51b815260206004820152602f60248201527f4572726f723a204e657720756e6c6f636b2074696d652069732073686f72746560448201526e39103a3430b71037b6321037b7329760891b6064820152608401610b41565b601a81905560405181906000805160206138c383398151915290600090a250565b600081815260018301602052604081205461288457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610b00565b506000610b00565b6001600160a01b03811660009081526001830160205260408120541515612162565b6001600160a01b038316600090815260016020526040902054818110156129125760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b41565b61291c848361327b565b61292683836132c0565b826001600160a01b0316846001600160a01b03166000805160206138e38339815191528460405161295991815260200190565b60405180910390a350505050565b6001600160a01b03808516600090815260016020526040808220549288168252902054848110156129d55760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401610b41565b60008315612ae857600e54861115612a215760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401610b41565b612a2c60068961288c565b15612a705760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b41565b601154601054612a809190613673565b4211158015612a9157506012546001145b15612ad757612aa16006896122e6565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b50601354610100900460ff16612dce565b8415612c5b57600d54612afb8785613673565b1115612b3c5760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b41565b600f54861115612b995760405162461bcd60e51b815260206004820152602260248201527f547820616d6f756e7420657863656564696e67206d61782062757920616d6f756044820152611b9d60f21b6064820152608401610b41565b612ba460068861288c565b15612be85760405162461bcd60e51b81526020600482015260146024820152734164647265737320626c61636b6c69737465642160601b6044820152606401610b41565b601154601054612bf89190613673565b4211158015612c0957506012546001145b15612c4f57612c196006886122e6565b506040516001600160a01b038816907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135460ff16612dce565b612c6660068961288c565b15612cb35760405162461bcd60e51b815260206004820152601b60248201527f53656e646572206164647265737320626c61636b6c69737465642100000000006044820152606401610b41565b612cbe60068861288c565b15612d0b5760405162461bcd60e51b815260206004820152601e60248201527f526563697069656e74206164647265737320626c61636b6c69737465642100006044820152606401610b41565b600d54612d188785613673565b1115612d595760405162461bcd60e51b815260206004820152601060248201526f3bb430b63290383937ba32b1ba34b7b760811b6044820152606401610b41565b601154601054612d699190613673565b4211158015612d7a57506012546001145b15612dc057612d8a6006896122e6565b506040516001600160a01b038916907f8c21268f4379683ad2b81c32b4357f44a17e83e73d741ba6e8c23e085e57135190600090a25b5060135462010000900460ff165b6013546001600160a01b03898116600160301b9092041614801590612df6575060195460ff16155b8015612e05575060175460ff16155b8015612e0e5750835b15612e1b57612e1b61264b565b6000612e378783601360039054906101000a900460ff166132e4565b601354909150600090612e6d9089908590612e689060ff6401000000008204811691650100000000009004166137b5565b6132e4565b90506000612e7b8284613673565b612e85908a61365c565b9050612e918b8a61327b565b3060009081526001602052604081208054849290612eb0908490613673565b9250508190555082600c6000828254612ec9919061365c565b90915550612ed990508a826132c0565b896001600160a01b03168b6001600160a01b03166000805160206138e383398151915283604051612f0c91815260200190565b60405180910390a35050505050505050505050565b601454612f399030906001600160a01b0316836122fb565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f6e57612f6e6137da565b6001600160a01b03928316602091820292909201810191909152601454604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b158015612fc257600080fd5b505afa158015612fd6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ffa91906137f0565b8160018151811061300d5761300d6137da565b6001600160a01b03928316602091820292909201015260145460405163791ac94760e01b815291169063791ac9479061305390859060009086903090429060040161380d565b600060405180830381600087803b15801561306d57600080fd5b505af1158015613081573d6000803e3d6000fd5b505050505050565b600080826016600082825461309e9190613673565b909155506000905060646130b385604b6135e0565b6130bd91906135ff565b9050600060646130ce87604b6135e0565b6130d891906135ff565b6014549091506130f39030906001600160a01b0316886122fb565b60145460405163f305d71960e01b81526001600160a01b039091169063f305d71990879061312f9030908b908790899084904290600401613621565b6060604051808303818588803b15801561314857600080fd5b505af115801561315c573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613181919061387e565b5096979596505050505050565b600081815260018301602052604081205480156132715760006131b260018361365c565b85549091506000906131c69060019061365c565b905060008660000182815481106131df576131df6137da565b9060005260206000200154905080876000018481548110613202576132026137da565b600091825260208083209091019290925582815260018901909152604090208490558654879080613235576132356138ac565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610b00565b6000915050610b00565b6001600160a01b03821660009081526001602052604081205461329f90839061365c565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b03821660009081526001602052604081205461329f908390613673565b60006127108260ff168460ff16866132fc91906135e0565b61330691906135e0565b61331091906135ff565b949350505050565b600060208083528351808285015260005b8181101561334557858101830151858201604001528201613329565b81811115613357576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461139257600080fd5b6000806040838503121561339557600080fd5b82356133a08161336d565b946020939093013593505050565b6000806000606084860312156133c357600080fd5b83356133ce8161336d565b925060208401356133de8161336d565b929592945050506040919091013590565b60006020828403121561340157600080fd5b81356121628161336d565b60006020828403121561341e57600080fd5b5035919050565b803560ff8116811461343657600080fd5b919050565b60008060008060008060c0878903121561345457600080fd5b61345d87613425565b955061346b60208801613425565b945061347960408801613425565b935061348760608801613425565b925061349560808801613425565b91506134a360a08801613425565b90509295509295509295565b801515811461139257600080fd5b6000602082840312156134cf57600080fd5b8135612162816134af565b600080604083850312156134ed57600080fd5b50508035926020909101359150565b6000806040838503121561350f57600080fd5b823561351a8161336d565b9150602083013561352a8161336d565b809150509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f139bdd081e595d081d5b9b1bd8dad95960821b604082015260600190565b6000602082840312156135a657600080fd5b5051919050565b6000602082840312156135bf57600080fd5b8151612162816134af565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156135fa576135fa6135ca565b500290565b60008261361c57634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b60008282101561366e5761366e6135ca565b500390565b60008219821115613686576136866135ca565b500190565b600181815b808511156136c65781600019048211156136ac576136ac6135ca565b808516156136b957918102915b93841c9390800290613690565b509250929050565b6000826136dd57506001610b00565b816136ea57506000610b00565b8160018114613700576002811461370a57613726565b6001915050610b00565b60ff84111561371b5761371b6135ca565b50506001821b610b00565b5060208310610133831016604e8410600b8410161715613749575081810a610b00565b613753838361368b565b8060001904821115613767576137676135ca565b029392505050565b600061216260ff8416836136ce565b6020808252601b908201527f4572726f723a2043616e6e6f74206265203020616464726573732e0000000000604082015260600190565b600060ff821660ff84168060ff038211156137d2576137d26135ca565b019392505050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561380257600080fd5b81516121628161336d565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561385d5784516001600160a01b031683529383019391830191600101613838565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561389357600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052603160045260246000fdfefb60e050a21ad73ac014de3ac7e8beec47ce0426c74545f9eded8135493e8e02ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef156f82350b7972f1821f0b3cc744ecec05d5c0893150eccf16174dbc4bf8d8dda2646970667358221220ac591d4e7561cca506a56a6ac893ab0424cad6c94b0aef887ab8dcaa38ddbbb664736f6c63430008090033

Deployed Bytecode Sourcemap

27684:28648:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53986:94;;;;;;;;;;-1:-1:-1;54067:5:0;;;;;;;;;;;;-1:-1:-1;;;54067:5:0;;;;53986:94;;;;;;;:::i;:::-;;;;;;;;54871:161;;;;;;;;;;-1:-1:-1;54871:161:0;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;54871:161:0;1072:187:1;52087:1015:0;;;;;;;;;;;;;:::i;:::-;;;1410:25:1;;;1398:2;1383:18;52087:1015:0;1264:177:1;28832:43:0;;;;;;;;;;;;28872:3;28832:43;;;;;1620:6:1;1608:19;;;1590:38;;1578:2;1563:18;28832:43:0;1446:188:1;42691:102:0;;;;;;;;;;-1:-1:-1;42774:11:0;;42691:102;;54296:108;;;;;;;;;;-1:-1:-1;54378:18:0;;54296:108;;28485:64;;;;;;;;;;;;;:::i;55345:392::-;;;;;;;;;;-1:-1:-1;55345:392:0;;;;;:::i;:::-;;:::i;48222:83::-;;;;;;;;;;;;;:::i;42095:249::-;;;;;;;;;;-1:-1:-1;42269:8:0;;42095:249;;;42269:8;;;;;;2387:25:1;;42278:13:0;;;;;2443:2:1;2428:18;;2421:34;42292:13:0;;;;;2471:18:1;;;2464:34;;;;42306:7:0;;;2529:2:1;2514:18;;2507:34;42269:8:0;42314;;;;2572:3:1;2557:19;;2550:35;42323:12:0;;;;;2616:3:1;2601:19;;2594:35;2374:3;2359:19;42095:249:0;2100:535:1;43162:27:0;;;;;;;;;;-1:-1:-1;43162:27:0;;;;;;;;;;;28716:44;;;;;;;;;;;;28758:2;28716:44;;;;;2812:4:1;2800:17;;;2782:36;;2770:2;2755:18;28716:44:0;2640:184:1;54194:94:0;;;;;;;;;;-1:-1:-1;28477:1:0;54194:94;;46821:201;;;;;;;;;;-1:-1:-1;46821:201:0;;;;;:::i;:::-;;:::i;55772:205::-;;;;;;;;;;-1:-1:-1;55772:205:0;;;;;:::i;:::-;;:::i;51334:695::-;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;3273:32:1;;;3255:51;;3337:2;3322:18;;3315:34;;;;3228:18;51334:695:0;3081:274:1;38136:25:0;;;;;;;;;;;;;;;;43690:494;;;;;;;;;;-1:-1:-1;43690:494:0;;;;;:::i;:::-;;:::i;43196:26::-;;;;;;;;;;;;;;;;49842;;;;;;;;;;-1:-1:-1;49842:26:0;;;;;;;;;;;53188:268;;;;;;;;;;;;;:::i;50151:243::-;;;;;;;;;;-1:-1:-1;50151:243:0;;;;;:::i;:::-;;:::i;29779:46::-;;;;;;;;;;;;;;;;47120:1048;;;;;;;;;;-1:-1:-1;47120:1048:0;;;;;:::i;:::-;;:::i;43267:416::-;;;;;;;;;;;;;:::i;37398:31::-;;;;;;;;;;;;;;;;29012:49;;;;;;;;;;;;29051:10;29012:49;;46286:181;;;;;;;;;;-1:-1:-1;46286:181:0;;;;;:::i;:::-;;:::i;29231:77::-;;;;;;;;;;-1:-1:-1;29231:77:0;;;;-1:-1:-1;;;;;29231:77:0;;;;;;-1:-1:-1;;;;;4410:32:1;;;4392:51;;4380:2;4365:18;29231:77:0;4246:203:1;50641:232:0;;;;;;;;;;-1:-1:-1;50641:232:0;;;;;:::i;:::-;;:::i;41936:151::-;;;;;;;;;;;;;:::i;:::-;;;;4628:25:1;;;4684:2;4669:18;;4662:34;;;;4601:18;41936:151:0;4454:248:1;54412:121:0;;;;;;;;;;-1:-1:-1;54412:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;54507:18:0;54480:7;54507:18;;;:9;:18;;;;;;;54412:121;9540:142;;;;;;;;;;;;;:::i;29723:49::-;;;;;;;;;;;;;;;;49956:129;;;;;;;;;;;;;:::i;44880:270::-;;;;;;;;;;-1:-1:-1;44880:270:0;;;;;:::i;:::-;;:::i;42935:109::-;;;;;;;;;;;;;:::i;43229:28::-;;;;;;;;;;-1:-1:-1;43229:28:0;;;;;;;;53884:94;;;;;;;;;;-1:-1:-1;53936:7:0;8964:6;-1:-1:-1;;;;;8964:6:0;53884:94;;48317:247;;;;;;;;;;-1:-1:-1;48317:247:0;;;;;:::i;:::-;;:::i;54088:98::-;;;;;;;;;;-1:-1:-1;54171:7:0;;;;;;;;;;;;-1:-1:-1;;;54171:7:0;;;;54088:98;;44616:252;;;;;;;;;;-1:-1:-1;44616:252:0;;;;;:::i;:::-;;:::i;44269:165::-;;;;;;;;;;-1:-1:-1;44269:165:0;;;;;:::i;:::-;;:::i;48667:1045::-;;;;;;;;;;-1:-1:-1;48667:1045:0;;;;;:::i;:::-;;:::i;55985:342::-;;;;;;;;;;-1:-1:-1;55985:342:0;;;;;:::i;:::-;;:::i;54541:167::-;;;;;;;;;;-1:-1:-1;54541:167:0;;;;;:::i;:::-;;:::i;45211:156::-;;;;;;;;;;-1:-1:-1;45211:156:0;;;;;:::i;:::-;;:::i;41567:222::-;;;;;;;;;;;;;:::i;41797:131::-;;;;;;;;;;;;;:::i;45806:179::-;;;;;;;;;;-1:-1:-1;45806:179:0;;;;;:::i;:::-;;:::i;44440:164::-;;;;;;;;;;-1:-1:-1;44440:164:0;;;;;:::i;:::-;;:::i;54716:147::-;;;;;;;;;;-1:-1:-1;54716:147:0;;;;;:::i;:::-;-1:-1:-1;;;;;54827:19:0;;;54800:7;54827:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;54716:147;45436:246;;;;;;;;;;-1:-1:-1;45436:246:0;;;;;:::i;:::-;;:::i;29315:80::-;;;;;;;;;;-1:-1:-1;29315:80:0;;;;-1:-1:-1;;;;;29315:80:0;;;42410:275;;;;;;;;;;-1:-1:-1;42410:275:0;;;;;:::i;:::-;;:::i;46547:193::-;;;;;;;;;;-1:-1:-1;46547:193:0;;;;;:::i;:::-;;:::i;9837:238::-;;;;;;;;;;-1:-1:-1;9837:238:0;;;;;:::i;:::-;;:::i;46053:166::-;;;;;;;;;;-1:-1:-1;46053:166:0;;;;;:::i;:::-;;:::i;54871:161::-;54948:4;54965:37;54974:10;54986:7;54995:6;54965:8;:37::i;:::-;-1:-1:-1;55020:4:0;54871:161;;;;;:::o;52087:1015::-;52146:18;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;;;;;;;;;52262:20:::1;;52243:15;:39;;52235:68;;;;-1:-1:-1::0;;;52235:68:0::1;;;;;;;:::i;:::-;52363:22;::::0;52414:39:::1;::::0;-1:-1:-1;;;52414:39:0;;52447:4:::1;52414:39;::::0;::::1;4392:51:1::0;52363:22:0;;;::::1;-1:-1:-1::0;;;;;52363:22:0::1;::::0;52314:30:::1;::::0;52363:22;;52414:24:::1;::::0;4365:18:1;;52414:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52497:16;::::0;52466:56:::1;::::0;-1:-1:-1;;;52466:56:0;;-1:-1:-1;;;;;52497:16:0;;::::1;52466:56;::::0;::::1;3255:51:1::0;3322:18;;;3315:34;;;52397:56:0;;-1:-1:-1;52466:22:0;::::1;::::0;::::1;::::0;3228:18:1;;52466:56:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52665:16:0::1;::::0;52623:21:::1;::::0;-1:-1:-1;;;;;52665:16:0::1;:64;52752:4;52772:6:::0;52807:3:::1;52794:9;52772:6:::0;52801:2:::1;52794:9;:::i;:::-;52793:17;;;;:::i;:::-;52839:3;52826:9;:6:::0;52833:2:::1;52826:9;:::i;:::-;52825:17;;;;:::i;:::-;52865:4;52885:15;52665:250;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;52926:21:0::1;52950:39;52972:17:::0;52950:21:::1;:39;:::i;:::-;52926:63;;53018:13;53000:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;53053:13:0;;-1:-1:-1;;;;;52087:1015:0;:::o;28485:64::-;28536:13;28477:1;28536:2;:13;:::i;:::-;28524:25;;:9;:25;:::i;:::-;28485:64;:::o;55345:392::-;55445:4;55462:36;55472:6;55480:9;55491:6;55462:9;:36::i;:::-;-1:-1:-1;;;;;55538:19:0;;55511:24;55538:19;;;:11;:19;;;;;;;;55558:10;55538:31;;;;;;;;55588:26;;;;55580:59;;;;-1:-1:-1;;;55580:59:0;;9838:2:1;55580:59:0;;;9820:21:1;9877:2;9857:18;;;9850:30;-1:-1:-1;;;9896:18:1;;;9889:50;9956:18;;55580:59:0;9636:344:1;55580:59:0;55652:55;55661:6;55669:10;55681:25;55700:6;55681:16;:25;:::i;:::-;55652:8;:55::i;:::-;-1:-1:-1;55725:4:0;;55345:392;-1:-1:-1;;;;55345:392:0:o;48222:83::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;48277:20:::1;:18;:20::i;:::-;48222:83::o:0;46821:201::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;46915:41:::1;:14;46937:18:::0;46915:21:::1;:41::i;:::-;-1:-1:-1::0;46972:42:0::1;::::0;-1:-1:-1;;;;;46972:42:0;::::1;::::0;-1:-1:-1;;;;;;;;;;;46972:42:0;;;::::1;46821:201:::0;:::o;55772:205::-;55880:10;55854:4;55901:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;55901:32:0;;;;;;;;;;55854:4;;55871:76;;55892:7;;55901:45;;55936:10;;55901:45;:::i;51334:695::-;51394:17;;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;51529:20:::1;;51510:15;:39;;51502:68;;;;-1:-1:-1::0;;;51502:68:0::1;;;;;;;:::i;:::-;51640:22;::::0;51691:39:::1;::::0;-1:-1:-1;;;51691:39:0;;51724:4:::1;51691:39;::::0;::::1;4392:51:1::0;51640:22:0;;;::::1;-1:-1:-1::0;;;;;51640:22:0::1;::::0;51591:30:::1;::::0;51640:22;;51691:24:::1;::::0;4365:18:1;;51691:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51829:10;::::0;51805:43:::1;::::0;-1:-1:-1;;;51805:43:0;;-1:-1:-1;;;;;51829:10:0;;::::1;51805:43;::::0;::::1;3255:51:1::0;3322:18;;;3315:34;;;51674:56:0;;-1:-1:-1;51805:23:0;::::1;::::0;::::1;::::0;3228:18:1;;51805:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;51888:10:0::1;::::0;51864:43:::1;::::0;1410:25:1;;;-1:-1:-1;;;;;51888:10:0;;::::1;::::0;51881:4:::1;::::0;-1:-1:-1;;;;;;;;;;;51864:43:0;1398:2:1;1383:18;51864:43:0::1;;;;;;;51930:10;::::0;-1:-1:-1;;;;;51930:10:0::1;::::0;-1:-1:-1;51964:6:0;-1:-1:-1;;51334:695:0;;:::o;43690:494::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;43786:16:::1;;43778:6;:24;;43770:91;;;::::0;-1:-1:-1;;;43770:91:0;;10187:2:1;43770:91:0::1;::::0;::::1;10169:21:1::0;10226:2;10206:18;;;10199:30;10265:34;10245:18;;;10238:62;-1:-1:-1;;;10316:18:1;;;10309:43;10369:19;;43770:91:0::1;9985:409:1::0;43770:91:0::1;43890:6;43872:16;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;43915:10:0::1;::::0;-1:-1:-1;;;;;43915:10:0::1;43907:47;43950:3;43937:9;:6:::0;43944:2:::1;43937:9;:::i;:::-;43936:17;;;;:::i;:::-;43907:47;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;43973:13:0::1;::::0;-1:-1:-1;;;;;43973:13:0::1;43965:59;44019:3;44006:9;:6:::0;44013:2:::1;44006:9;:::i;:::-;44005:17;;;;:::i;:::-;43998:24;::::0;:6;:24:::1;:::i;:::-;43965:59;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;44064:10:0::1;::::0;-1:-1:-1;;;;;44064:10:0::1;44057:4;-1:-1:-1::0;;;;;;;;;;;44090:3:0::1;44077:9;:6:::0;44084:2:::1;44077:9;:::i;:::-;44076:17;;;;:::i;:::-;44040:54;::::0;1410:25:1;;;1398:2;1383:18;44040:54:0::1;;;;;;;44134:13;::::0;-1:-1:-1;;;;;44134:13:0::1;44127:4;-1:-1:-1::0;;;;;;;;;;;44171:3:0::1;44158:9;:6:::0;44165:2:::1;44158:9;:::i;:::-;44157:17;;;;:::i;:::-;44150:24;::::0;:6;:24:::1;:::i;:::-;44110:66;::::0;1410:25:1;;;1398:2;1383:18;44110:66:0::1;;;;;;;43690:494:::0;:::o;53188:268::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;53278:20:::1;;53259:15;:39;;53251:68;;;;-1:-1:-1::0;;;53251:68:0::1;;;;;;;:::i;:::-;53344:10;::::0;:51:::1;::::0;53331:9:::1;::::0;-1:-1:-1;;;;;53344:10:0::1;::::0;53368:21:::1;::::0;53331:9;53344:51;53331:9;53344:51;53368:21;53344:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53330:65;;;53414:4;53406:42;;;::::0;-1:-1:-1;;;53406:42:0;;10811:2:1;53406:42:0::1;::::0;::::1;10793:21:1::0;10850:2;10830:18;;;10823:30;-1:-1:-1;;;10869:18:1;;;10862:46;10925:18;;53406:42:0::1;10609:340:1::0;53406:42:0::1;53240:216;53188:268::o:0;50151:243::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;50255:35:0;::::1;50247:84;;;;-1:-1:-1::0;;;50247:84:0::1;;;;;;;:::i;:::-;50342:22;:44:::0;;-1:-1:-1;;;;;50342:44:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;50342:44:0;;::::1;::::0;;;::::1;::::0;;50151:243::o;47120:1048::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;47280:14:::1;47320::::0;47295:24:::1;47305:14:::0;47295:9;:24:::1;:::i;:::-;:39;;;;:::i;:::-;47280:54;;47353:8;:13;;47363:3;47353:13;47345:64;;;::::0;-1:-1:-1;;;47345:64:0;;11721:2:1;47345:64:0::1;::::0;::::1;11703:21:1::0;11760:2;11740:18;;;11733:30;11799:34;11779:18;;;11772:62;-1:-1:-1;;;11850:18:1;;;11843:36;11896:19;;47345:64:0::1;11519:402:1::0;47345:64:0::1;47438:2;47428:6;:12;;;;47420:95;;;::::0;-1:-1:-1;;;47420:95:0;;12128:2:1;47420:95:0::1;::::0;::::1;12110:21:1::0;12167:2;12147:18;;;12140:30;12206:34;12186:18;;;12179:62;12277:31;12257:18;;;12250:59;12326:19;;47420:95:0::1;11926:425:1::0;47420:95:0::1;47545:2;47534:7;:13;;;;47526:97;;;::::0;-1:-1:-1;;;47526:97:0;;12558:2:1;47526:97:0::1;::::0;::::1;12540:21:1::0;12597:2;12577:18;;;12570:30;12636:34;12616:18;;;12609:62;12707:32;12687:18;;;12680:60;12757:19;;47526:97:0::1;12356:426:1::0;47526:97:0::1;47657:2;47642:11;:17;;;;47634:105;;;::::0;-1:-1:-1;;;47634:105:0;;12989:2:1;47634:105:0::1;::::0;::::1;12971:21:1::0;13028:2;13008:18;;;13001:30;13067:34;13047:18;;;13040:62;13138:34;13118:18;;;13111:62;-1:-1:-1;;;13189:19:1;;;13182:33;13232:19;;47634:105:0::1;12787:470:1::0;47634:105:0::1;47761:9;47752:8;;:18;;;;;;;;;;;;;;;;;;47795:14;47781:13;;:28;;;;;;;;;;;;;;;;;;47834:14;47820:13;;:28;;;;;;;;;;;;;;;;;;47877:6;47869:7;;:14;;;;;;;;;;;;;;;;;;47903:7;47894:8;;:16;;;;;;;;;;;;;;;;;;47934:11;47921:12;;:24;;;;;;;;;;;;;;;;;;47979:8;;;;;;;;;;;47963:25;;-1:-1:-1::0;;;;;;;;;;;47963:25:0::1;;;;;;;;;48020:13;::::0;48004:30:::1;::::0;48020:13;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48004:30:0;;;::::1;48066:7;::::0;48050:24:::1;::::0;48066:7:::1;::::0;;::::1;::::0;-1:-1:-1;;;;;;;;;;;48050:24:0;48066:7:::1;::::0;48050:24:::1;48106:8;::::0;48090:25:::1;::::0;48106:8:::1;::::0;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48090:25:0;;;::::1;48147:12;::::0;48131:29:::1;::::0;48147:12;;;::::1;;;::::0;-1:-1:-1;;;;;;;;;;;48131:29:0;;;::::1;47269:899;47120:1048:::0;;;;;;:::o;43267:416::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;43350:16:::1;::::0;;43335:14:::1;43377:18:::0;;;43414:10:::1;::::0;-1:-1:-1;;;;;43414:10:0::1;43406:47;43449:3;43436:9;43350:16:::0;43443:2:::1;43436:9;:::i;46286:181::-:0;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;46371:33:::1;:9;46388:15:::0;46371:16:::1;:33::i;50641:232::-:0;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;50741:57:::1;50763:34;50782:15;50763:18:::0;:34:::1;:::i;:::-;50741:21;:57::i;:::-;50830:34;50849:15;50830:18:::0;:34:::1;:::i;:::-;50814:51;::::0;-1:-1:-1;;;;;;;;;;;50814:51:0;;;::::1;50641:232:::0;:::o;41936:151::-;41979:15;;42040:13;28477:1;42040:2;:13;:::i;:::-;42027:12;;:26;;;;:::i;:::-;42065:13;28477:1;42065:2;:13;:::i;:::-;42055:9;;:23;;;;:::i;:::-;42020:59;;;;41936:151;;:::o;9540:142::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;9641:1:::1;9625:6:::0;;9604:40:::1;::::0;-1:-1:-1;;;;;9625:6:0;;::::1;::::0;9604:40:::1;::::0;9641:1;;9604:40:::1;9672:1;9655:19:::0;;-1:-1:-1;;;;;;9655:19:0::1;::::0;;9540:142::o;49956:129::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;50015:14:::1;:19:::0;;-1:-1:-1;;50015:19:0::1;;;::::0;;50062:15:::1;50045:16;:32:::0;49956:129::o;44880:270::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44974:30:0;::::1;44966:77;;;;-1:-1:-1::0;;;44966:77:0::1;;;;;;;:::i;:::-;45052:13;:39:::0;;-1:-1:-1;;;;;;45052:39:0::1;-1:-1:-1::0;;;;;45052:39:0;::::1;::::0;;::::1;::::0;;;45105:37:::1;::::0;-1:-1:-1;;;;;;;;;;;45105:37:0;-1:-1:-1;;45105:37:0::1;44880:270:::0;:::o;42935:109::-;43022:11;;43006:27;;:15;:27;:::i;:::-;42994:10;42985:20;;;;:8;:20;;;;;:48;42935:109::o;53963:7::-;53956:14;;53884:94;:::o;48317:247::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48407:23:0;::::1;48399:72;;;;-1:-1:-1::0;;;48399:72:0::1;;;;;;;:::i;:::-;48482:15;:25:::0;;-1:-1:-1;;;;;;48482:25:0::1;-1:-1:-1::0;;;;;48482:25:0;::::1;::::0;;::::1;::::0;;;48523:33:::1;::::0;-1:-1:-1;;;;;;;;;;;48523:33:0;-1:-1:-1;;48523:33:0::1;48317:247:::0;:::o;44616:252::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44704:27:0;::::1;44696:74;;;;-1:-1:-1::0;;;44696:74:0::1;;;;;;;:::i;:::-;44779:10;:33:::0;;-1:-1:-1;;;;;;44779:33:0::1;-1:-1:-1::0;;;;;44779:33:0;::::1;::::0;;::::1;::::0;;;44826:34:::1;::::0;-1:-1:-1;;;;;;;;;;;44826:34:0;-1:-1:-1;;44826:34:0::1;44616:252:::0;:::o;44269:165::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;44350:16:::1;:23:::0;;-1:-1:-1;;44350:23:0::1;::::0;::::1;;::::0;;::::1;::::0;;;44389:37:::1;::::0;44350:23:::1;44409:16:::0;;;44389:37:::1;;::::0;::::1;::::0;-1:-1:-1;;44389:37:0::1;44269:165:::0;:::o;48667:1045::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;48905:3:::1;48886:18;;:22;;;;:::i;:::-;48873:12;:35;48865:110;;;::::0;-1:-1:-1;;;48865:110:0;;13464:2:1;48865:110:0::1;::::0;::::1;13446:21:1::0;13503:2;13483:18;;;13476:30;13542:34;13522:18;;;13515:62;-1:-1:-1;;;13593:18:1;;;13586:51;13654:19;;48865:110:0::1;13262:417:1::0;48865:110:0::1;49053:13;28477:1;49053:2;:13;:::i;:::-;49037:29;::::0;:15;:29:::1;:::i;:::-;49021:45:::0;-1:-1:-1;49103:13:0::1;28477:1;49103:2;:13;:::i;:::-;49090:26;::::0;:12;:26:::1;:::i;:::-;49077:39;;49183:26;28758:2;49210:38;;:18;;:38;;;;:::i;:::-;49183:65;;49259:23;28872:3;49283:35;;:18;;:35;;;;:::i;:::-;49259:59;;49357:18;49340:15;:35;;49331:103;;;::::0;-1:-1:-1;;;49331:103:0;;13886:2:1;49331:103:0::1;::::0;::::1;13868:21:1::0;13925:2;13905:18;;;13898:30;13964:34;13944:18;;;13937:62;-1:-1:-1;;;14015:18:1;;;14008:41;14066:19;;49331:103:0::1;13684:407:1::0;49331:103:0::1;49468:15;49454:12;:29;;49445:94;;;::::0;-1:-1:-1;;;49445:94:0;;14298:2:1;49445:94:0::1;::::0;::::1;14280:21:1::0;14337:2;14317:18;;;14310:30;14376:34;14356:18;;;14349:62;-1:-1:-1;;;14427:18:1;;;14420:38;14475:19;;49445:94:0::1;14096:404:1::0;49445:94:0::1;49552:12;:30:::0;;;49593:9:::1;:24:::0;;;49633:29:::1;::::0;49567:15;;-1:-1:-1;;;;;;;;;;;49633:29:0;-1:-1:-1;;49633:29:0::1;49694:9;::::0;49678:26:::1;::::0;-1:-1:-1;;;;;;;;;;;49678:26:0;;;::::1;48758:954;;48667:1045:::0;;:::o;55985:342::-;56128:10;56072:4;56116:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;56116:32:0;;;;;;;;;;56167:35;;;;56159:60;;;;-1:-1:-1;;;56159:60:0;;14707:2:1;56159:60:0;;;14689:21:1;14746:2;14726:18;;;14719:30;-1:-1:-1;;;14765:18:1;;;14758:42;14817:18;;56159:60:0;14505:336:1;56159:60:0;56232:65;56241:10;56253:7;56262:34;56281:15;56262:16;:34;:::i;56232:65::-;-1:-1:-1;56315:4:0;;55985:342;-1:-1:-1;;;55985:342:0:o;54541:167::-;54621:4;54638:40;54648:10;54660:9;54671:6;54638:9;:40::i;45211:156::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;45283:15:::1;:24:::0;;-1:-1:-1;;45283:24:0::1;;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;45323:36:::1;::::0;45283:24:::1;45343:15:::0;;;::::1;;45323:36;;::::0;::::1;::::0;-1:-1:-1;;45323:36:0::1;45211:156:::0;:::o;41567:222::-;41634:7;41672:20;;41656:15;:36;41653:110;;;41736:15;41715:20;;:36;;;;:::i;41653:110::-;-1:-1:-1;41780:1:0;;41567:222::o;41797:131::-;41846:7;41907:13;28477:1;41907:2;:13;:::i;:::-;41887:18;;28536:13;28477:1;28536:2;:13;:::i;:::-;28524:25;;:9;:25;:::i;:::-;41873:32;;;;:::i;:::-;41872:48;;;;:::i;45806:179::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;45890:19:::1;:35:::0;;;45941:36:::1;::::0;45912:13;;-1:-1:-1;;;;;;;;;;;45941:36:0;;;::::1;45806:179:::0;:::o;44440:164::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;44543:13:::1;28477:1;44543:2;:13;:::i;:::-;44528:28;::::0;:12;:28:::1;:::i;:::-;44518:9;:38:::0;;;44570:26:::1;::::0;-1:-1:-1;;;;;;;;;;;44570:26:0;;;::::1;44440:164:::0;:::o;45436:246::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;29051:10:::1;45529:30:::0;::::1;;45521:64;;;::::0;-1:-1:-1;;;45521:64:0;;15048:2:1;45521:64:0::1;::::0;::::1;15030:21:1::0;15087:2;15067:18;;;15060:30;-1:-1:-1;;;15106:18:1;;;15099:52;15168:18;;45521:64:0::1;14846:346:1::0;45521:64:0::1;45600:11;:26:::0;;;45646:28:::1;::::0;45612:14;;-1:-1:-1;;;;;;;;;;;45646:28:0;;;::::1;45436:246:::0;:::o;42410:275::-;-1:-1:-1;;;;;42532:24:0;;42497:7;42532:24;;;:8;:24;;;;;;42579:15;42569:25;;42566:71;;-1:-1:-1;42625:1:0;;42410:275;-1:-1:-1;;42410:275:0:o;42566:71::-;42653:24;42662:15;42653:8;:24;:::i;:::-;42646:31;42410:275;-1:-1:-1;;;42410:275:0:o;46547:193::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;46636:38:::1;:14;46655:18:::0;46636::::1;:38::i;9837:238::-:0;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9920:22:0;::::1;9912:73;;;::::0;-1:-1:-1;;;9912:73:0;;15399:2:1;9912:73:0::1;::::0;::::1;15381:21:1::0;15438:2;15418:18;;;15411:30;15477:34;15457:18;;;15450:62;-1:-1:-1;;;15528:18:1;;;15521:36;15574:19;;9912:73:0::1;15197:402:1::0;9912:73:0::1;10022:6;::::0;;10001:38:::1;::::0;-1:-1:-1;;;;;10001:38:0;;::::1;::::0;10022:6;::::1;::::0;10001:38:::1;::::0;::::1;10050:6;:17:::0;;-1:-1:-1;;;;;;10050:17:0::1;-1:-1:-1::0;;;;;10050:17:0;;;::::1;::::0;;;::::1;::::0;;9837:238::o;46053:166::-;9122:10;9111:7;8937;8964:6;-1:-1:-1;;;;;8964:6:0;;8899:79;9111:7;-1:-1:-1;;;;;9111:21:0;;9103:66;;;;-1:-1:-1;;;9103:66:0;;;;;;;:::i;:::-;46132:27:::1;:9;46146:12:::0;24590:152;24660:4;24684:50;24689:3;-1:-1:-1;;;;;24709:23:0;;24684:4;:50::i;55038:299::-;-1:-1:-1;;;;;55131:19:0;;55123:49;;;;-1:-1:-1;;;55123:49:0;;15806:2:1;55123:49:0;;;15788:21:1;15845:2;15825:18;;;15818:30;-1:-1:-1;;;15864:18:1;;;15857:47;15921:18;;55123:49:0;15604:341:1;55123:49:0;-1:-1:-1;;;;;55191:21:0;;55183:49;;;;-1:-1:-1;;;55183:49:0;;16152:2:1;55183:49:0;;;16134:21:1;16191:2;16171:18;;;16164:30;-1:-1:-1;;;16210:18:1;;;16203:45;16265:18;;55183:49:0;15950:339:1;55183:49:0;-1:-1:-1;;;;;55245:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;55297:32;;1410:25:1;;;55297:32:0;;1383:18:1;55297:32:0;;;;;;;55038:299;;;:::o;31892:1540::-;-1:-1:-1;;;;;31988:20:0;;31980:51;;;;-1:-1:-1;;;31980:51:0;;16496:2:1;31980:51:0;;;16478:21:1;16535:2;16515:18;;;16508:30;-1:-1:-1;;;16554:18:1;;;16547:48;16612:18;;31980:51:0;16294:342:1;31980:51:0;-1:-1:-1;;;;;32050:23:0;;32042:52;;;;-1:-1:-1;;;32042:52:0;;16843:2:1;32042:52:0;;;16825:21:1;16882:2;16862:18;;;16855:30;-1:-1:-1;;;16901:18:1;;;16894:46;16957:18;;32042:52:0;16641:340:1;32042:52:0;32187:15;32206:26;:9;32225:6;32206:18;:26::i;:::-;:59;;;-1:-1:-1;32236:29:0;:9;32255;32236:18;:29::i;:::-;32187:79;-1:-1:-1;32365:23:0;-1:-1:-1;;;;;32390:21:0;;32406:4;32390:21;;:49;;-1:-1:-1;;;;;;32415:24:0;;32434:4;32415:24;32390:49;32574:16;;32641:21;;32365:75;;-1:-1:-1;;;;;;32574:16:0;;;;32542:23;;32631:31;;;-1:-1:-1;;;32641:21:0;;;;32631:31;:63;;;;;32679:15;-1:-1:-1;;;;;32666:28:0;:9;-1:-1:-1;;;;;32666:28:0;;32631:63;32630:144;;;-1:-1:-1;32723:21:0;;-1:-1:-1;;;;;32710:34:0;;;-1:-1:-1;;;32723:21:0;;;;32710:34;:63;;;;;32758:15;-1:-1:-1;;;;;32748:25:0;:6;-1:-1:-1;;;;;32748:25:0;;32710:63;32896:21;;32602:173;;-1:-1:-1;32877:10:0;;-1:-1:-1;;;;;32888:29:0;;;-1:-1:-1;;;32896:21:0;;;;32888:29;;:57;;;32930:15;-1:-1:-1;;;;;32920:25:0;:6;-1:-1:-1;;;;;32920:25:0;;32888:57;32979:21;;32877:68;;-1:-1:-1;32956:11:0;;-1:-1:-1;;;;;32968:32:0;;;-1:-1:-1;;;32979:21:0;;;;32968:32;;:63;;;33016:15;-1:-1:-1;;;;;33003:28:0;:9;-1:-1:-1;;;;;33003:28:0;;32968:63;32956:75;;33072:18;:41;;;;33094:19;33072:41;:55;;;;33117:10;33072:55;33069:356;;;33143:43;33160:6;33168:9;33179:6;33143:16;:43::i;:::-;33069:356;;;33305:14;;;;;;;33297:49;;;;-1:-1:-1;;;33297:49:0;;17188:2:1;33297:49:0;;;17170:21:1;17227:2;17207:18;;;17200:30;17266:25;17246:18;;;17239:53;17309:18;;33297:49:0;16986:347:1;33297:49:0;33361:52;33376:6;33383:9;33393:6;33400:5;33406:6;33361:14;:52::i;:::-;31969:1463;;;;;;31892:1540;;;:::o;38541:1582::-;38289:27;:34;;-1:-1:-1;;38289:34:0;38319:4;38289:34;;;;;;38643:4:::1;38289:27:::0;38625:24;;;::::1;::::0;;;;;;;;38690:13:::1;::::0;38625:24;;38289:27;38676::::1;::::0;38690:13;;::::1;38289:34:::0;38690:13;;::::1;::::0;38676;;::::1;;:27;:::i;:::-;38660:43;;;;38714:19;38736;;38714:41;;38882:11;38866:15;:27;:40;;;-1:-1:-1::0;38895:11:0::1;::::0;::::1;::::0;38866:40:::1;38863:77;;;38922:7;;;;;38863:77;39060:13;::::0;39021:25:::1;::::0;39047:36:::1;::::0;::::1;::::0;39048:25:::1;::::0;39060:13;;::::1;;;39048:11:::0;:25:::1;:::i;:::-;39047:36;;;;:::i;:::-;39021:62:::0;-1:-1:-1;39094:25:0::1;39121:29;39021:62:::0;39121:11;:29:::1;:::i;:::-;39094:56:::0;-1:-1:-1;39211:16:0::1;39228:19;39246:1;39228:17:::0;:19:::1;:::i;:::-;39211:36:::0;-1:-1:-1;39258:19:0::1;39278:26;39211:36:::0;39278:17;:26:::1;:::i;:::-;39258:46:::0;-1:-1:-1;39387:17:0::1;39405:29;39417:17:::0;39258:46;39405:29:::1;:::i;:::-;39387:47:::0;-1:-1:-1;39513:21:0::1;39545:27;39387:47:::0;39545:16:::1;:27::i;:::-;39583:14;39599:41;39623:17:::0;39599:21:::1;:41;:::i;:::-;39583:58:::0;-1:-1:-1;39741:14:0::1;39779:9:::0;39759:18:::1;39766:11:::0;39583:58;39759:18:::1;:::i;:::-;39758:30;;;;:::i;:::-;39741:47;;39799:31;39813:8;39823:6;39799:13;:31::i;:::-;-1:-1:-1::0;39955:21:0::1;::::0;-1:-1:-1;39978:41:0::1;40002:17:::0;39978:21:::1;:41;:::i;:::-;39955:65;;40102:13;40084:16;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;;;;;;;;38334:1:0::1;38346:27:::0;:35;;-1:-1:-1;;38346:35:0;;;38541:1582::o;24918:158::-;24991:4;25015:53;25023:3;-1:-1:-1;;;;;25043:23:0;;25015:7;:53::i;50926:343::-;51082:20;;51068:13;:34;51060:103;;;;-1:-1:-1;;;51060:103:0;;17540:2:1;51060:103:0;;;17522:21:1;17579:2;17559:18;;;17552:30;17618:34;17598:18;;;17591:62;-1:-1:-1;;;17669:18:1;;;17662:45;17724:19;;51060:103:0;17338:411:1;51060:103:0;51174:20;:34;;;51224:37;;51195:13;;-1:-1:-1;;;;;;;;;;;51224:37:0;;;;50926:343;:::o;19645:414::-;19708:4;21971:19;;;:12;;;:19;;;;;;19725:327;;-1:-1:-1;19768:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;19951:18;;19929:19;;;:12;;;:19;;;;;;:40;;;;19984:11;;19725:327;-1:-1:-1;20035:5:0;20028:12;;25162:167;-1:-1:-1;;;;;25296:23:0;;25242:4;21971:19;;;:12;;;:19;;;;;;:24;;25266:55;21874:129;36732:400;-1:-1:-1;;;;;36851:17:0;;36827:21;36851:17;;;:9;:17;;;;;;36887:23;;;;36879:60;;;;-1:-1:-1;;;36879:60:0;;17956:2:1;36879:60:0;;;17938:21:1;17995:2;17975:18;;;17968:30;-1:-1:-1;;;18014:18:1;;;18007:54;18078:18;;36879:60:0;17754:348:1;36879:60:0;36975:27;36988:6;36995;36975:12;:27::i;:::-;37035:28;37045:9;37056:6;37035:9;:28::i;:::-;37105:9;-1:-1:-1;;;;;37089:33:0;37098:6;-1:-1:-1;;;;;37089:33:0;-1:-1:-1;;;;;;;;;;;37115:6:0;37089:33;;;;1410:25:1;;1398:2;1383:18;;1264:177;37089:33:0;;;;;;;;36816:316;36732:400;;;:::o;33502:3183::-;-1:-1:-1;;;;;33645:20:0;;;33618:24;33645:20;;;:9;:20;;;;;;;33700:17;;;;;;;;33736:23;;;;33728:60;;;;-1:-1:-1;;;33728:60:0;;17956:2:1;33728:60:0;;;17938:21:1;17995:2;17975:18;;;17968:30;-1:-1:-1;;;18014:18:1;;;18007:54;18078:18;;33728:60:0;17754:348:1;33728:60:0;33801:9;33824:6;33821:1673;;;33911:9;;33903:6;:17;;33895:44;;;;-1:-1:-1;;;33895:44:0;;18309:2:1;33895:44:0;;;18291:21:1;18348:2;18328:18;;;18321:30;-1:-1:-1;;;18367:18:1;;;18360:45;18422:18;;33895:44:0;18107:339:1;33895:44:0;33962:31;:14;33986:6;33962:23;:31::i;:::-;:40;33954:73;;;;-1:-1:-1;;;33954:73:0;;18653:2:1;33954:73:0;;;18635:21:1;18692:2;18672:18;;;18665:30;-1:-1:-1;;;18711:18:1;;;18704:50;18771:18;;33954:73:0;18451:344:1;33954:73:0;34084:11;;34065:16;;:30;;;;:::i;:::-;34046:15;:49;;:77;;;;;34099:19;;34122:1;34099:24;34046:77;34042:186;;;34144:26;:14;34163:6;34144:18;:26::i;:::-;-1:-1:-1;34194:18:0;;-1:-1:-1;;;;;34194:18:0;;;;;;;;34042:186;-1:-1:-1;34246:8:0;;;;;;;33821:1673;;;34279:5;34276:1218;;;34424:12;;34399:23;34416:6;34399:16;:23;:::i;:::-;:37;;34391:65;;;;-1:-1:-1;;;34391:65:0;;19002:2:1;34391:65:0;;;18984:21:1;19041:2;19021:18;;;19014:30;-1:-1:-1;;;19060:18:1;;;19053:46;19116:18;;34391:65:0;18800:340:1;34391:65:0;34480:9;;34470:6;:19;;34462:65;;;;-1:-1:-1;;;34462:65:0;;19347:2:1;34462:65:0;;;19329:21:1;19386:2;19366:18;;;19359:30;19425:34;19405:18;;;19398:62;-1:-1:-1;;;19476:18:1;;;19469:32;19518:19;;34462:65:0;19145:398:1;34462:65:0;34550:34;:14;34574:9;34550:23;:34::i;:::-;:43;34542:76;;;;-1:-1:-1;;;34542:76:0;;18653:2:1;34542:76:0;;;18635:21:1;18692:2;18672:18;;;18665:30;-1:-1:-1;;;18711:18:1;;;18704:50;18771:18;;34542:76:0;18451:344:1;34542:76:0;34675:11;;34656:16;;:30;;;;:::i;:::-;34637:15;:49;;:77;;;;;34690:19;;34713:1;34690:24;34637:77;34633:192;;;34735:29;:14;34754:9;34735:18;:29::i;:::-;-1:-1:-1;34788:21:0;;-1:-1:-1;;;;;34788:21:0;;;;;;;;34633:192;-1:-1:-1;34843:7:0;;;;34276:1218;;;34994:31;:14;35018:6;34994:23;:31::i;:::-;:40;34986:80;;;;-1:-1:-1;;;34986:80:0;;19750:2:1;34986:80:0;;;19732:21:1;19789:2;19769:18;;;19762:30;19828:29;19808:18;;;19801:57;19875:18;;34986:80:0;19548:351:1;34986:80:0;35089:34;:14;35113:9;35089:23;:34::i;:::-;:43;35081:86;;;;-1:-1:-1;;;35081:86:0;;20106:2:1;35081:86:0;;;20088:21:1;20145:2;20125:18;;;20118:30;20184:32;20164:18;;;20157:60;20234:18;;35081:86:0;19904:354:1;35081:86:0;35215:12;;35190:23;35207:6;35190:16;:23;:::i;:::-;:37;;35182:65;;;;-1:-1:-1;;;35182:65:0;;19002:2:1;35182:65:0;;;18984:21:1;19041:2;19021:18;;;19014:30;-1:-1:-1;;;19060:18:1;;;19053:46;19116:18;;35182:65:0;18800:340:1;35182:65:0;35304:11;;35285:16;;:30;;;;:::i;:::-;35266:15;:49;;:77;;;;;35319:19;;35342:1;35319:24;35266:77;35262:186;;;35364:26;:14;35383:6;35364:18;:26::i;:::-;-1:-1:-1;35414:18:0;;-1:-1:-1;;;;;35414:18:0;;;;;;;;35262:186;-1:-1:-1;35466:12:0;;;;;;;34276:1218;35831:21;;-1:-1:-1;;;;;35823:29:0;;;-1:-1:-1;;;35831:21:0;;;;35823:29;;;;35822:52;;-1:-1:-1;35857:16:0;;;;35856:17;35822:52;:84;;;;-1:-1:-1;35878:27:0;;;;35877:28;35822:84;:92;;;;;35908:6;35822:92;35819:130;;;35929:20;:18;:20::i;:::-;36018:23;36042:36;36056:6;36064:3;36069:8;;;;;;;;;;;36042:13;:36::i;:::-;36152:13;;36018:60;;-1:-1:-1;36089:21:0;;36111:55;;36125:6;;36133:3;;36138:27;;36152:13;;;;;;;36138;;;;:27;:::i;:::-;36111:13;:55::i;:::-;36089:77;-1:-1:-1;36230:19:0;36258:31;36089:77;36258:15;:31;:::i;:::-;36250:40;;:6;:40;:::i;:::-;36230:60;;36328:27;36341:6;36348;36328:12;:27::i;:::-;36450:4;36432:24;;;;:9;:24;;;;;:41;;36460:13;;36432:24;:41;;36460:13;;36432:41;:::i;:::-;;;;;;;;36528:15;36508:18;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;36578:33:0;;-1:-1:-1;36588:9:0;36599:11;36578:9;:33::i;:::-;36653:9;-1:-1:-1;;;;;36637:38:0;36646:6;-1:-1:-1;;;;;36637:38:0;-1:-1:-1;;;;;;;;;;;36663:11:0;36637:38;;;;1410:25:1;;1398:2;1383:18;;1264:177;36637:38:0;;;;;;;;33607:3078;;;;;;33502:3183;;;;;:::o;40173:461::-;40266:16;;40234:58;;40251:4;;-1:-1:-1;;;;;40266:16:0;40285:6;40234:8;:58::i;:::-;40327:16;;;40341:1;40327:16;;;;;;;;40303:21;;40327:16;;;;;;;;;;-1:-1:-1;40327:16:0;40303:40;;40372:4;40354;40359:1;40354:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40354:23:0;;;:7;;;;;;;;;;:23;;;;40398:16;;:23;;;-1:-1:-1;;;40398:23:0;;;;:16;;;;;:21;;:23;;;;;40354:7;;40398:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40388:4;40393:1;40388:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;40388:33:0;;;:7;;;;;;;;;:33;40434:16;;:192;;-1:-1:-1;;;40434:192:0;;:16;;;:67;;:192;;40516:6;;40434:16;;40553:4;;40580;;40600:15;;40434:192;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40223:411;40173:461;:::o;40761:686::-;40841:19;40862:21;40908:9;40896:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;40928:14:0;;-1:-1:-1;40962:3:0;40946:12;:9;40956:2;40946:12;:::i;:::-;40945:20;;;;:::i;:::-;40928:37;-1:-1:-1;40976:17:0;41015:3;40997:14;:11;41009:2;40997:14;:::i;:::-;40996:22;;;;:::i;:::-;41061:16;;40976:42;;-1:-1:-1;41029:63:0;;41046:4;;-1:-1:-1;;;;;41061:16:0;41080:11;41029:8;:63::i;:::-;41103:16;;:218;;-1:-1:-1;;;41103:218:0;;-1:-1:-1;;;;;41103:16:0;;;;:32;;41143:9;;41103:218;;41176:4;;41196:11;;41222:9;;41246:6;;41176:4;;41295:15;;41103:218;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41346:11:0;;41384:9;;-1:-1:-1;;;;;;40761:686:0:o;20235:1553::-;20301:4;20440:19;;;:12;;;:19;;;;;;20476:15;;20472:1309;;20838:21;20862:14;20875:1;20862:10;:14;:::i;:::-;20911:18;;20838:38;;-1:-1:-1;20891:17:0;;20911:22;;20932:1;;20911:22;:::i;:::-;20891:42;;21178:17;21198:3;:11;;21210:9;21198:22;;;;;;;;:::i;:::-;;;;;;;;;21178:42;;21344:9;21315:3;:11;;21327:13;21315:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;21421:23;;;:12;;;:23;;;;;;:36;;;21582:17;;21421:3;;21582:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;21677:3;:12;;:19;21690:5;21677:19;;;;;;;;;;;21670:26;;;21720:4;21713:11;;;;;;;;20472:1309;21764:5;21757:12;;;;;37732:228;-1:-1:-1;;;;;37867:15:0;;37849:17;37867:15;;;:9;:15;;;;;;:22;;37883:6;;37867:22;:::i;:::-;-1:-1:-1;;;;;37927:15:0;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;37732:228:0:o;37468:225::-;-1:-1:-1;;;;;37600:15:0;;37582:17;37600:15;;;:9;:15;;;;;;:22;;37616:6;;37600:22;:::i;37187:156::-;37277:7;37330:5;37316:10;37305:21;;37312:3;37305:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;37304:31;;;;:::i;:::-;37297:38;37187:156;-1:-1:-1;;;;37187:156:0:o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1639:456::-;1716:6;1724;1732;1785:2;1773:9;1764:7;1760:23;1756:32;1753:52;;;1801:1;1798;1791:12;1753:52;1840:9;1827:23;1859:31;1884:5;1859:31;:::i;:::-;1909:5;-1:-1:-1;1966:2:1;1951:18;;1938:32;1979:33;1938:32;1979:33;:::i;:::-;1639:456;;2031:7;;-1:-1:-1;;;2085:2:1;2070:18;;;;2057:32;;1639:456::o;2829:247::-;2888:6;2941:2;2929:9;2920:7;2916:23;2912:32;2909:52;;;2957:1;2954;2947:12;2909:52;2996:9;2983:23;3015:31;3040:5;3015:31;:::i;3360:180::-;3419:6;3472:2;3460:9;3451:7;3447:23;3443:32;3440:52;;;3488:1;3485;3478:12;3440:52;-1:-1:-1;3511:23:1;;3360:180;-1:-1:-1;3360:180:1:o;3545:156::-;3611:20;;3671:4;3660:16;;3650:27;;3640:55;;3691:1;3688;3681:12;3640:55;3545:156;;;:::o;3706:535::-;3798:6;3806;3814;3822;3830;3838;3891:3;3879:9;3870:7;3866:23;3862:33;3859:53;;;3908:1;3905;3898:12;3859:53;3931:27;3948:9;3931:27;:::i;:::-;3921:37;;3977:36;4009:2;3998:9;3994:18;3977:36;:::i;:::-;3967:46;;4032:36;4064:2;4053:9;4049:18;4032:36;:::i;:::-;4022:46;;4087:36;4119:2;4108:9;4104:18;4087:36;:::i;:::-;4077:46;;4142:37;4174:3;4163:9;4159:19;4142:37;:::i;:::-;4132:47;;4198:37;4230:3;4219:9;4215:19;4198:37;:::i;:::-;4188:47;;3706:535;;;;;;;;:::o;4707:118::-;4793:5;4786:13;4779:21;4772:5;4769:32;4759:60;;4815:1;4812;4805:12;4830:241;4886:6;4939:2;4927:9;4918:7;4914:23;4910:32;4907:52;;;4955:1;4952;4945:12;4907:52;4994:9;4981:23;5013:28;5035:5;5013:28;:::i;5076:248::-;5144:6;5152;5205:2;5193:9;5184:7;5180:23;5176:32;5173:52;;;5221:1;5218;5211:12;5173:52;-1:-1:-1;;5244:23:1;;;5314:2;5299:18;;;5286:32;;-1:-1:-1;5076:248:1:o;5329:388::-;5397:6;5405;5458:2;5446:9;5437:7;5433:23;5429:32;5426:52;;;5474:1;5471;5464:12;5426:52;5513:9;5500:23;5532:31;5557:5;5532:31;:::i;:::-;5582:5;-1:-1:-1;5639:2:1;5624:18;;5611:32;5652:33;5611:32;5652:33;:::i;:::-;5704:7;5694:17;;;5329:388;;;;;:::o;5722:356::-;5924:2;5906:21;;;5943:18;;;5936:30;6002:34;5997:2;5982:18;;5975:62;6069:2;6054:18;;5722:356::o;6083:340::-;6285:2;6267:21;;;6324:2;6304:18;;;6297:30;-1:-1:-1;;;6358:2:1;6343:18;;6336:46;6414:2;6399:18;;6083:340::o;6428:184::-;6498:6;6551:2;6539:9;6530:7;6526:23;6522:32;6519:52;;;6567:1;6564;6557:12;6519:52;-1:-1:-1;6590:16:1;;6428:184;-1:-1:-1;6428:184:1:o;6617:245::-;6684:6;6737:2;6725:9;6716:7;6712:23;6708:32;6705:52;;;6753:1;6750;6743:12;6705:52;6785:9;6779:16;6804:28;6826:5;6804:28;:::i;6867:127::-;6928:10;6923:3;6919:20;6916:1;6909:31;6959:4;6956:1;6949:15;6983:4;6980:1;6973:15;6999:168;7039:7;7105:1;7101;7097:6;7093:14;7090:1;7087:21;7082:1;7075:9;7068:17;7064:45;7061:71;;;7112:18;;:::i;:::-;-1:-1:-1;7152:9:1;;6999:168::o;7172:217::-;7212:1;7238;7228:132;;7282:10;7277:3;7273:20;7270:1;7263:31;7317:4;7314:1;7307:15;7345:4;7342:1;7335:15;7228:132;-1:-1:-1;7374:9:1;;7172:217::o;7394:591::-;-1:-1:-1;;;;;7737:15:1;;;7719:34;;7784:2;7769:18;;7762:34;;;;7827:2;7812:18;;7805:34;;;;7870:2;7855:18;;7848:34;;;;7919:15;;;7913:3;7898:19;;7891:44;7699:3;7951:19;;7944:35;;;;7668:3;7653:19;;7394:591::o;7990:125::-;8030:4;8058:1;8055;8052:8;8049:34;;;8063:18;;:::i;:::-;-1:-1:-1;8100:9:1;;7990:125::o;8120:128::-;8160:3;8191:1;8187:6;8184:1;8181:13;8178:39;;;8197:18;;:::i;:::-;-1:-1:-1;8233:9:1;;8120:128::o;8253:422::-;8342:1;8385:5;8342:1;8399:270;8420:7;8410:8;8407:21;8399:270;;;8479:4;8475:1;8471:6;8467:17;8461:4;8458:27;8455:53;;;8488:18;;:::i;:::-;8538:7;8528:8;8524:22;8521:55;;;8558:16;;;;8521:55;8637:22;;;;8597:15;;;;8399:270;;;8403:3;8253:422;;;;;:::o;8680:806::-;8729:5;8759:8;8749:80;;-1:-1:-1;8800:1:1;8814:5;;8749:80;8848:4;8838:76;;-1:-1:-1;8885:1:1;8899:5;;8838:76;8930:4;8948:1;8943:59;;;;9016:1;9011:130;;;;8923:218;;8943:59;8973:1;8964:10;;8987:5;;;9011:130;9048:3;9038:8;9035:17;9032:43;;;9055:18;;:::i;:::-;-1:-1:-1;;9111:1:1;9097:16;;9126:5;;8923:218;;9225:2;9215:8;9212:16;9206:3;9200:4;9197:13;9193:36;9187:2;9177:8;9174:16;9169:2;9163:4;9160:12;9156:35;9153:77;9150:159;;;-1:-1:-1;9262:19:1;;;9294:5;;9150:159;9341:34;9366:8;9360:4;9341:34;:::i;:::-;9411:6;9407:1;9403:6;9399:19;9390:7;9387:32;9384:58;;;9422:18;;:::i;:::-;9460:20;;8680:806;-1:-1:-1;;;8680:806:1:o;9491:140::-;9549:5;9578:47;9619:4;9609:8;9605:19;9599:4;9578:47;:::i;10954:351::-;11156:2;11138:21;;;11195:2;11175:18;;;11168:30;11234:29;11229:2;11214:18;;11207:57;11296:2;11281:18;;10954:351::o;11310:204::-;11348:3;11384:4;11381:1;11377:12;11416:4;11413:1;11409:12;11451:3;11445:4;11441:14;11436:3;11433:23;11430:49;;;11459:18;;:::i;:::-;11495:13;;11310:204;-1:-1:-1;;;11310:204:1:o;20395:127::-;20456:10;20451:3;20447:20;20444:1;20437:31;20487:4;20484:1;20477:15;20511:4;20508:1;20501:15;20527:251;20597:6;20650:2;20638:9;20629:7;20625:23;20621:32;20618:52;;;20666:1;20663;20656:12;20618:52;20698:9;20692:16;20717:31;20742:5;20717:31;:::i;20783:980::-;21045:4;21093:3;21082:9;21078:19;21124:6;21113:9;21106:25;21150:2;21188:6;21183:2;21172:9;21168:18;21161:34;21231:3;21226:2;21215:9;21211:18;21204:31;21255:6;21290;21284:13;21321:6;21313;21306:22;21359:3;21348:9;21344:19;21337:26;;21398:2;21390:6;21386:15;21372:29;;21419:1;21429:195;21443:6;21440:1;21437:13;21429:195;;;21508:13;;-1:-1:-1;;;;;21504:39:1;21492:52;;21599:15;;;;21564:12;;;;21540:1;21458:9;21429:195;;;-1:-1:-1;;;;;;;21680:32:1;;;;21675:2;21660:18;;21653:60;-1:-1:-1;;;21744:3:1;21729:19;21722:35;21641:3;20783:980;-1:-1:-1;;;20783:980:1:o;21768:306::-;21856:6;21864;21872;21925:2;21913:9;21904:7;21900:23;21896:32;21893:52;;;21941:1;21938;21931:12;21893:52;21970:9;21964:16;21954:26;;22020:2;22009:9;22005:18;21999:25;21989:35;;22064:2;22053:9;22049:18;22043:25;22033:35;;21768:306;;;;;:::o;22079:127::-;22140:10;22135:3;22131:20;22128:1;22121:31;22171:4;22168:1;22161:15;22195:4;22192:1;22185:15

Swarm Source

ipfs://ac591d4e7561cca506a56a6ac893ab0424cad6c94b0aef887ab8dcaa38ddbbb6
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.