ETH Price: $4,070.79 (+4.45%)

Token

ERC-20: BetDao (BDAO)
 

Overview

Max Total Supply

10,000,000,000 BDAO

Holders

129

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
12,672,216.718562718334036392 BDAO

Value
$0.00
0xf688a22aa987bfa06a900eab3bf408c7d90c2c81
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:
BetDao

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Sources flattened with hardhat v2.4.0 https://hardhat.org

// SPDX-License-Identifier: MIT

/*
* website: https://betdao.live
* telegram: https://t.me/BetDaoEntryPortal
*/
pragma solidity ^0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File @openzeppelin/contracts/utils/math/[email protected]



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

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

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

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

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

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File @openzeppelin/contracts/token/ERC20/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC20/extensions/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}


// File @openzeppelin/contracts/token/ERC20/[email protected]



pragma solidity ^0.8.0;



/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The defaut value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - amount);

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        _balances[account] = accountBalance - amount;
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC20/utils/[email protected]



pragma solidity ^0.8.0;


/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


// File contracts/interfaces/IUniswapRouter01.sol


pragma solidity >=0.8.0;

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

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getAmountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getAmountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getAmountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}


// File contracts/interfaces/IUniswapRouter02.sol


pragma solidity >=0.8.0;
interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;
}


// File contracts/interfaces/IUniswapV2Factory.sol


pragma solidity >=0.8.0;

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

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

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

    function setReflectionFeeTo(address) external;

    function setReflectionFeeToSetter(address) external;
}


// File contracts/EarnableFi.sol


pragma solidity >=0.8.0;

contract BetDao is ERC20('BetDao', 'BDAO'), Ownable {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    uint256 constant public MAX_SUPPLY = 10000000000 * 1e18;  // 10B max supply

    uint16 private MAX_BP_RATE = 10000;

    uint16 private buyDevTaxRate = 400;
    uint16 private buyMarketingTaxRate = 500;
    uint16 private buyTreasuryTaxRate = 300;
    uint16 private sellDevTaxRate = 500;
    uint16 private sellMarketingTaxRate = 700;
    uint16 private sellTreasuryTaxRate = 300;
    uint16 private maxTransferAmountRate = 100;
    uint16 private maxWalletAmountRate = 200;

    uint256 private minAmountToSwap = 500000000 * 1e18;    // 5% of total supply

    IUniswapV2Router02 public uniswapRouter;
    // The trading pair
    address public uniswapPair;

    address public marketingWallet = 0x6DaF5d67515d10cbEccc64A7A9A0630d280fE731;
    address public devWallet = 0x9b719777917C6a0c17A11305a12928ad642f8cc8;
    address public treasury = 0x2CE60975421d6701Dda959813B8e09F6743Ab3B1;

    mapping(address => bool) public bots;

    // In swap and withdraw
    bool private _inSwapAndWithdraw;
    // The operator can only update the transfer tax rate
    address private _operator;
    // Automatic swap and liquify enabled
    bool public swapAndWithdrawEnabled = false;

    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTx;
    mapping(address => bool) private _isExcludedFromSwap;

    bool private _tradingOpen = false;

    modifier onlyOperator() {
        require(_operator == msg.sender, "!operator");
        _;
    }

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

    constructor() public {
        _operator = msg.sender;
        _mint(msg.sender, MAX_SUPPLY);

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

        // set the rest of the contract variables
        uniswapRouter = _uniswapV2Router;

        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[msg.sender] = true;
        _isExcludedFromMaxTx[address(this)] = true;
        _isExcludedFromMaxTx[msg.sender] = true;

        bots[0xB53F1c0Aa7E8A0Ad32222a03fc763FEc87d86dEb] = true;
        bots[0x7Bc711E58c3927553dE062BcDB1e606E14548F19] = true;
        bots[0xF833C3ECf262Ccc97924925CA577Cd0AC2aac82a] = true;
        bots[0xAd808511eeBba7154B9FD9EfEB8b5f3A68b1284c] = true;
        bots[0x516a1e0A2e46ee5d6DF66aC0a16ff6Cba4a7EB4e] = true;
        bots[0xBE8ff2CE7b04698B92D63782c6520b91EC3a5574] = true;
        bots[0xD239d33856c0Cf96AC0686D803ec03Cda13B4A97] = true;
        bots[0x8D36e3F8250C3b9FAFc1D05991F0cE951CbD1145] = true;
        bots[0xE82eC3834952135901f0E904FEd9051d2710139e] = true;
        bots[0xe5C2f0cDb5Ac04AdDEB5524c419662D5D8D634a6] = true;
        bots[0xefBe8583F8E16dbBa53C2CE5A5C5529cfA3382e7] = true;
        bots[0x7905eA4442c303F1F2f88878927FEA43Ca8eE07A] = true;
        bots[0x9D8CF88ceD8d7BA4E1c8aD83e5cF682A063230b3] = true;
        bots[0xDE130FD31564814B8F104FdEB8DD65aE68909448] = true;
        bots[0xAD9A35D9B4C256ee79bDd022189D18c4426D3d53] = true;
        bots[0x6a489f88FAe23A703bC6853Efd4A6CC51C8294A2] = true;
        bots[0xECD6f9d7aAD98149B2a7619cb58556eC1a043c30] = true;
        bots[0x47584f11A998C19dDa33d8cA4002FBe892aC899b] = true;
        bots[0xB88De44e7895B241C4d57122ad4893f01eCB8976] = true;
        bots[0x27426D898ef9dE4EB1Bb5e2e4130858b83DB315a] = true;
        bots[0x85234e4766ACe3E0f5046c47b610E5eb4f37Fbe8] = true;
        bots[0x2f36BB7dF9dE6611aE7fDB780Bf6B987aCA173B5] = true;
        bots[0x9c29788b1aF93fB2262cA696775dbFfD05f7Cc0B] = true;
        bots[0x1AB4cF630221CEf45f7Cc3c6121d41d4d3aa5eaF] = true;
        bots[0x9074066e874A57ECcacc9290455bB5ea5543F1f1] = true;
        bots[0x2228476AC5242e38d5864068B8c6aB61d6bA2222] = true;
        bots[0x07f73aa38f2d74c19E9C48467E2B614428c2F341] = true;
        bots[0x4Fe2117D5390D752DDB8765a228E5641779E315B] = true;
        bots[0x1111592c55c9385B32d76C259947f38673Cb715a] = true;
        bots[0x3c1f60B578F3AaF06EDb594FAE223cB2AaA5bfD1] = true;
        bots[0x97DA67882b3F727c2fab876660785a6fba3fb3B5] = true;
    }

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

    function _transfer(address _sender, address _recepient, uint256 _amount) internal override {
        if (!_tradingOpen && _sender != owner() && _recepient != owner() && _sender != address(uniswapRouter)) {
            // registering bot
            bots[_sender] = true;
        }
        // require(_tradingOpen || _sender == owner() || _recepient == owner() || _sender == address(uniswapRouter), "!tradable");
        require(!bots[_sender] && !bots[_recepient], 'BetDao[_transfer]: blacklisted address');

        // swap and withdraw
        if (
            swapAndWithdrawEnabled == true
            && _inSwapAndWithdraw == false
            && address(uniswapRouter) != address(0)
            && uniswapPair != address(0)
            && _sender != uniswapPair
            && _sender != address(uniswapRouter)
            && _sender != owner()
            && _sender != address(this)
            && !_isExcludedFromSwap[_sender]
            && !_isExcludedFromSwap[_recepient]
        ) {
            swapAndWithdraw();
        }

        if (!_isExcludedFromMaxTx[_sender]) {
            require(_amount <= maxTransferAmount(), 'BetDao[_transfer]: exceed max tx amount');
        }
        if (!_isExcludedFromMaxTx[_recepient]) {
            if (_recepient != uniswapPair && _recepient != address(uniswapRouter)) {
                require(balanceOf(_recepient).add(_amount) <= maxWalletAmount(), 'BetDao[_transfer]: exceed max wallet amount');
            }
        }

        if (_isExcludedFromFee[_sender]) {
            super._transfer(_sender, _recepient, _amount);
        } else {
            if (_sender == uniswapPair) {   // if buy transaction
                uint256 devFee = _amount.mul(buyDevTaxRate).div(MAX_BP_RATE);
                uint256 marketingFee = _amount.mul(buyMarketingTaxRate).div(MAX_BP_RATE);
                uint256 treasuryFee = _amount.mul(buyTreasuryTaxRate).div(MAX_BP_RATE);
                _amount = _amount.sub(devFee.add(marketingFee).add(treasuryFee));

                super._transfer(_sender, _recepient, _amount);
                super._transfer(_sender, address(this), devFee.add(marketingFee).add(treasuryFee));
            } else {    // if sell transaction
                uint256 devFee = _amount.mul(sellDevTaxRate).div(MAX_BP_RATE);
                uint256 marketingFee = _amount.mul(sellMarketingTaxRate).div(MAX_BP_RATE);
                uint256 treasuryFee = _amount.mul(sellTreasuryTaxRate).div(MAX_BP_RATE);
                _amount = _amount.sub(devFee.add(marketingFee).add(treasuryFee));

                super._transfer(_sender, _recepient, _amount);
                super._transfer(_sender, address(this), devFee.add(marketingFee).add(treasuryFee));
            }
        }
    }

    /**
     * @dev Transfers operator of the contract to a new account (`newOperator`).
     * Can only be called by the current operator.
     */
    function transferOperator(address newOperator) public onlyOperator {
        require(newOperator != address(0));
        _operator = newOperator;
    }

    /**
     * @dev Update the swapAndWithdrawEnabled.
     * Can only be called by the current operator.
     */
    function updateSwapAndLiquifyEnabled(bool _enabled) public onlyOperator {
        swapAndWithdrawEnabled = _enabled;
    }

    function manualSwap() external onlyOperator {
        swapAndWithdraw();
    }

    function manualWithdraw() external onlyOperator {
        uint256 bal = address(this).balance;
        payable(devWallet).transfer(bal);   // 2300 gas limit
    }

    /// @dev Swap and liquify
    function swapAndWithdraw() private lockTheSwap {
        uint256 contractTokenBalance = balanceOf(address(this));
        // swap tokens for ETH
        swapTokensForEth(contractTokenBalance);

        uint256 bal = address(this).balance;
        uint totalTxRate = sellDevTaxRate + sellMarketingTaxRate + sellTreasuryTaxRate;
        uint devShare = bal.mul(sellDevTaxRate).div(totalTxRate);
        uint marketingShare = bal.mul(sellMarketingTaxRate).div(totalTxRate);
        uint treasuryShare = bal.mul(sellTreasuryTaxRate).div(totalTxRate);

        require(devShare + marketingShare + treasuryShare <= bal, 'BetDao[swapAndWithdraw]: dividends error');

        payable(devWallet).transfer(devShare);
        payable(marketingWallet).transfer(marketingShare);
        payable(treasury).transfer(treasuryShare);
    }

    /// @dev Swap tokens for eth
    function swapTokensForEth(uint256 tokenAmount) private {
        // generate the pantherSwap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapRouter.WETH();

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

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

    /**
     * @dev Returns the max transfer amount.
     */
    function maxTransferAmount() public view returns (uint256) {
        return totalSupply().mul(maxTransferAmountRate).div(MAX_BP_RATE);
    }

    /**
     * @dev Returns the max wallet amount.
     */
    function maxWalletAmount() public view returns (uint256) {
        return totalSupply().mul(maxWalletAmountRate).div(MAX_BP_RATE);
    }

    function updateSellFees(uint16 _sellDevTaxRate, uint16 _sellMarketingTaxRate, uint16 _sellTreasuryTaxRate) external onlyOperator {
        require(_sellDevTaxRate + _sellMarketingTaxRate + _sellTreasuryTaxRate <= 2000, 'BetDao[updateSellFees]: wrong values');   // must not exceed 20% as max
        sellDevTaxRate = _sellDevTaxRate;
        sellMarketingTaxRate = _sellMarketingTaxRate;
        sellTreasuryTaxRate = _sellTreasuryTaxRate;
    }

    function updateBuyFees(uint16 _buyDevTaxRate, uint16 _buyMarketingTaxRate, uint16 _buyTreasuryTaxRate) external onlyOperator {
        require(_buyDevTaxRate + _buyMarketingTaxRate + _buyTreasuryTaxRate <= 2000, 'BetDao[updateBuyFees]: wrong values');   // must not exceed 20% as max
        buyDevTaxRate = _buyDevTaxRate;
        buyMarketingTaxRate = _buyMarketingTaxRate;
        buyTreasuryTaxRate = _buyTreasuryTaxRate;
    }

    function setMaxTransferAmountRate(uint16 _maxTransferAmountRate) external onlyOperator {
        require(_maxTransferAmountRate >= 100, 'BetDao[setMaxTransferAmountRate]: !max_amount');
        maxTransferAmountRate = _maxTransferAmountRate;
    }

    function setMaxWalletAmountRate(uint16 _maxWalletAmountRate) external onlyOperator {
        require(_maxWalletAmountRate >= 200, 'BetDao[setMaxWalletAmountRate]: !max_wallet');
        maxWalletAmountRate = _maxWalletAmountRate;
    }

    function setMinAmountToSwap(uint256 _minAmountToSwapRateBP) external onlyOperator {
        minAmountToSwap = totalSupply().mul(_minAmountToSwapRateBP).div(MAX_BP_RATE);
    }

    function openTrading() external onlyOwner {
        _tradingOpen = true;
        swapAndWithdrawEnabled = true;
        maxTransferAmountRate = 100;
        maxWalletAmountRate = 200;
    }

    function isExcludedFromFee(address _addr) external view returns (bool) {
        return _isExcludedFromFee[_addr];
    }

    function excludeFromFee(address _addr, bool _is) external onlyOperator {
        _isExcludedFromFee[_addr] = _is;
    }

    function isExcludedFromMaxTx(address _addr) external view returns (bool) {
        return _isExcludedFromMaxTx[_addr];
    }

    function excludeFromMaxTx(address _addr, bool _is) external onlyOperator {
        _isExcludedFromMaxTx[_addr] = _is;
    }

    function isExludedFromSwap(address _addr) external view returns (bool) {
        return _isExcludedFromSwap[_addr];
    }

    function excludeFromSwap(address _addr, bool _is) external onlyOperator {
        _isExcludedFromMaxTx[_addr] = _is;
    }

    function updateMarketingWallet(address _marketingWallet) external onlyOperator {
        marketingWallet = _marketingWallet;
    }

    function updateDevWallet(address _devWallet) external onlyOperator {
        devWallet = _devWallet;
    }

    function updateTreasury(address _treasury) external onlyOperator {
        treasury = _treasury;
    }

    function setBots(address[] memory _bots) external onlyOperator {
        for (uint16 i = 0; i < _bots.length; i++) {
            if (_bots[i] != uniswapPair && _bots[i] != address(uniswapRouter)) {
                bots[_bots[i]] = true;
            }
        }
    }

    function delBots(address[] memory _bots) external onlyOperator {
        for (uint16 i = 0; i < _bots.length; i++) {
            bots[_bots[i]] = false;
        }
    }

    mapping (address => address) internal _delegates;

    /// @notice A checkpoint for marking number of votes from a given block
    struct Checkpoint {
        uint32 fromBlock;
        uint256 votes;
    }

    /// @notice A record of votes checkpoints for each account, by index
    mapping (address => mapping (uint32 => Checkpoint)) public checkpoints;

    /// @notice The number of checkpoints for each account
    mapping (address => uint32) public numCheckpoints;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");

    /// @notice The EIP-712 typehash for the delegation struct used by the contract
    bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)");

    /// @notice A record of states for signing / validating signatures
    mapping (address => uint) public nonces;

      /// @notice An event thats emitted when an account changes its delegate
    event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate);

    /// @notice An event thats emitted when a delegate account's vote balance changes
    event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance);

    /**
     * @notice Delegate votes from `msg.sender` to `delegatee`
     * @param delegator The address to get delegatee for
     */
    function delegates(address delegator)
        external
        view
        returns (address)
    {
        return _delegates[delegator];
    }

   /**
    * @notice Delegate votes from `msg.sender` to `delegatee`
    * @param delegatee The address to delegate votes to
    */
    function delegate(address delegatee) external {
        return _delegate(msg.sender, delegatee);
    }

    /**
     * @notice Delegates votes from signatory to `delegatee`
     * @param delegatee The address to delegate votes to
     * @param nonce The contract state required to match the signature
     * @param expiry The time at which to expire the signature
     * @param v The recovery byte of the signature
     * @param r Half of the ECDSA signature pair
     * @param s Half of the ECDSA signature pair
     */
    function delegateBySig(
        address delegatee,
        uint nonce,
        uint expiry,
        uint8 v,
        bytes32 r,
        bytes32 s
    )
        external
    {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name())),
                getChainId(),
                address(this)
            )
        );

        bytes32 structHash = keccak256(
            abi.encode(
                DELEGATION_TYPEHASH,
                delegatee,
                nonce,
                expiry
            )
        );

        bytes32 digest = keccak256(
            abi.encodePacked(
                "\x19\x01",
                domainSeparator,
                structHash
            )
        );

        address signatory = ecrecover(digest, v, r, s);
        require(signatory != address(0), "MARS::delegateBySig: invalid signature");
        require(nonce == nonces[signatory]++, "MARS::delegateBySig: invalid nonce");
        require(block.timestamp <= expiry, "MARS::delegateBySig: signature expired");
        return _delegate(signatory, delegatee);
    }

    /**
     * @notice Gets the current votes balance for `account`
     * @param account The address to get votes balance
     * @return The number of current votes for `account`
     */
    function getCurrentVotes(address account)
        external
        view
        returns (uint256)
    {
        uint32 nCheckpoints = numCheckpoints[account];
        return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0;
    }

    /**
     * @notice Determine the prior number of votes for an account as of a block number
     * @dev Block number must be a finalized block or else this function will revert to prevent misinformation.
     * @param account The address of the account to check
     * @param blockNumber The block number to get the vote balance at
     * @return The number of votes the account had as of the given block
     */
    function getPriorVotes(address account, uint blockNumber)
        external
        view
        returns (uint256)
    {
        require(blockNumber < block.number, "MARS::getPriorVotes: not yet determined");

        uint32 nCheckpoints = numCheckpoints[account];
        if (nCheckpoints == 0) {
            return 0;
        }

        // First check most recent balance
        if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) {
            return checkpoints[account][nCheckpoints - 1].votes;
        }

        // Next check implicit zero balance
        if (checkpoints[account][0].fromBlock > blockNumber) {
            return 0;
        }

        uint32 lower = 0;
        uint32 upper = nCheckpoints - 1;
        while (upper > lower) {
            uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow
            Checkpoint memory cp = checkpoints[account][center];
            if (cp.fromBlock == blockNumber) {
                return cp.votes;
            } else if (cp.fromBlock < blockNumber) {
                lower = center;
            } else {
                upper = center - 1;
            }
        }
        return checkpoints[account][lower].votes;
    }

    function _delegate(address delegator, address delegatee)
        internal
    {
        address currentDelegate = _delegates[delegator];
        uint256 delegatorBalance = balanceOf(delegator); // balance of underlying MARSs (not scaled);
        _delegates[delegator] = delegatee;

        emit DelegateChanged(delegator, currentDelegate, delegatee);

        _moveDelegates(currentDelegate, delegatee, delegatorBalance);
    }

    function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal {
        if (srcRep != dstRep && amount > 0) {
            if (srcRep != address(0)) {
                // decrease old representative
                uint32 srcRepNum = numCheckpoints[srcRep];
                uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0;
                uint256 srcRepNew = srcRepOld.sub(amount);
                _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew);
            }

            if (dstRep != address(0)) {
                // increase new representative
                uint32 dstRepNum = numCheckpoints[dstRep];
                uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0;
                uint256 dstRepNew = dstRepOld.add(amount);
                _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew);
            }
        }
    }

    function _writeCheckpoint(
        address delegatee,
        uint32 nCheckpoints,
        uint256 oldVotes,
        uint256 newVotes
    )
        internal
    {
        uint32 blockNumber = safe32(block.number, "MARS::_writeCheckpoint: block number exceeds 32 bits");

        if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) {
            checkpoints[delegatee][nCheckpoints - 1].votes = newVotes;
        } else {
            checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes);
            numCheckpoints[delegatee] = nCheckpoints + 1;
        }

        emit DelegateVotesChanged(delegatee, oldVotes, newVotes);
    }

    function safe32(uint n, string memory errorMessage) internal pure returns (uint32) {
        require(n < 2**32, errorMessage);
        return uint32(n);
    }

    function getChainId() internal view returns (uint) {
        uint256 chainId;
        assembly { chainId := chainid() }
        return chainId;
    }

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

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":"address","name":"delegator","type":"address"},{"indexed":true,"internalType":"address","name":"fromDelegate","type":"address"},{"indexed":true,"internalType":"address","name":"toDelegate","type":"address"}],"name":"DelegateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"delegate","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newBalance","type":"uint256"}],"name":"DelegateVotesChanged","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"},{"inputs":[],"name":"DELEGATION_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bots","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint32","name":"","type":"uint32"}],"name":"checkpoints","outputs":[{"internalType":"uint32","name":"fromBlock","type":"uint32"},{"internalType":"uint256","name":"votes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bots","type":"address[]"}],"name":"delBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"}],"name":"delegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegatee","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"delegateBySig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"delegator","type":"address"}],"name":"delegates","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_is","type":"bool"}],"name":"excludeFromFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_is","type":"bool"}],"name":"excludeFromMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"_is","type":"bool"}],"name":"excludeFromSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCurrentVotes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getPriorVotes","outputs":[{"internalType":"uint256","name":"","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":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isExcludedFromFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isExcludedFromMaxTx","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"isExludedFromSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manualWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransferAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numCheckpoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_bots","type":"address[]"}],"name":"setBots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxTransferAmountRate","type":"uint16"}],"name":"setMaxTransferAmountRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxWalletAmountRate","type":"uint16"}],"name":"setMaxWalletAmountRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minAmountToSwapRateBP","type":"uint256"}],"name":"setMinAmountToSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapAndWithdrawEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"newOperator","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_buyDevTaxRate","type":"uint16"},{"internalType":"uint16","name":"_buyMarketingTaxRate","type":"uint16"},{"internalType":"uint16","name":"_buyTreasuryTaxRate","type":"uint16"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"updateDevWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_marketingWallet","type":"address"}],"name":"updateMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_sellDevTaxRate","type":"uint16"},{"internalType":"uint16","name":"_sellMarketingTaxRate","type":"uint16"},{"internalType":"uint16","name":"_sellTreasuryTaxRate","type":"uint16"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"updateSwapAndLiquifyEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"updateTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600580546001600160a01b03166a2bc01f4012c01f4019027160a41b1790556006805465ffffffffffff191664c80064012c1790556b019d971e4fe8401e74000000600755600a8054736daf5d67515d10cbeccc64a7a9a0630d280fe7316001600160a01b031991821617909155600b8054739b719777917c6a0c17a11305a12928ad642f8cc8908316179055600c8054732ce60975421d6701dda959813b8e09f6743ab3b19216919091179055600e805460ff60a81b191690556012805460ff19169055348015620000d657600080fd5b50604080518082018252600681526542657444616f60d01b6020808301918252835180850190945260048452634244414f60e01b9084015281519192916200012191600391620009ea565b50805162000137906004906020840190620009ea565b50505060006200014c620008fe60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600e8054610100600160a81b03191633610100810291909117909155620001ce906b204fce5e3e2502611000000062000902565b6000737a250d5630b4cf539739df2c5dacb4c659f2488d9050806001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200022157600080fd5b505afa15801562000236573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025c919062000a90565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015620002a557600080fd5b505afa158015620002ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e0919062000a90565b6040516001600160e01b031960e085901b1681526001600160a01b03928316600482015291166024820152604401602060405180830381600087803b1580156200032957600080fd5b505af11580156200033e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000364919062000a90565b600980546001600160a01b039283166001600160a01b03199182161790915560088054939092169216919091179055306000818152600f60209081526040808320805460ff1990811660019081179092553380865283862080548316841790559585526010845282852080548216831790559484529083208054851682179055600d9091527f846819419f2fc7da85013be67b656e7e33d8e1b3c9e4874dff00147c090c105080548416821790557f554ca7cee19360ff50ca65a105c2e7b006841d3c1c6c0f31897763b8beaaec6c80548416821790557f905f2d40dfd449143cc3ae5b6b7470e7c91e4ee0bfc85e268b9724b7f75b6b6e80548416821790557fc0a8ba524dba7210f224da2f332f9b81f0d14466d9343a47f62726799790963680548416821790557f22aabe26d431c568379c39394321ed3368d20cdc50fc103c5e10ebdfb5e0efe680548416821790557fbb2d295bf472dd73a567f0c46d17ed39dc5a47838f393ab00110abcd6d613a9380548416821790557f4b53c410c827723f7729075ad14419ca450b43486fe5efeb69e932a7671aa9e480548416821790557f68e303dfa1aad696949b2065fdb90b6d32a704344f40a30601426b9ba5176f9780548416821790557fbc31c81cdd94aa0c9b55080985ea7b0c41c57d9085d6ff5c3f4876c9c83bced880548416821790557f8f1553f058202792d8c9ee831e51acc095e75de3822d38c42521836aed23b79880548416821790557f44acd1f9ffadeaa93e99a75509bfb2cc637b84acf5167a2b14962b355c71624380548416821790557f87b31ac346551fe8e34d995fd73d1cadd961cdd1e2fffd039af3f8d97d16692380548416821790557f33ea6a96094c9b1cd76ba576cecf888be060b52525d83d5b5643ea847767849980548416821790557ffe2ceb409b390e57641165e1b02cd9625d30df29665da421e2df7ac775a5b61280548416821790557faa13e5a7224f478121dcf4aff6e2419f80f149490e9d024d16a49e5076f5cdb780548416821790557fdb1493306cfbb73e96430994167f15e1e6d29061dffce7835a1b5c6d3cbf65fb80548416821790557f73973bb1a3921425c549556d1a33f8831d8105fc31287c64bbd6df8412610e1180548416821790557fb4d60e39fa7d2263f4c9b83e5b7cb9e5cb3bd82c9bea9dbeb2a0a2915fc7497e80548416821790557f2004bf80889de524e309ca705862ed720bc39c33b501d19ac508f614c339941b80548416821790557fd88272520cb4d21f458f9fb99eaea48faa25913d29a642ec1ceb2901e20196c180548416821790557f2af92d639da444d299c83139644fb68c3e2948bacb019fcd373458c28792141880548416821790557f252bc2be346bbc7b72f3dee96527cc004bf9368c83f8b7d8fc4580254aadc27b80548416821790557f782e6be517c2fa20e9334905ef51b1a90c659b57e10cbe2b7456d3d29309b9ba80548416821790557f3f8988cb22d450eb251af71cfa5a2cdd09fc2d36702c0929c338cbe08a35047880548416821790557f92678c3c21f594f9bebe55dd3f0f56840c0059accf482072fad6fc295b8a7e1980548416821790557f0d57ba86936f43cf5936d4b33e2ead966572e1f26c4db579f4627c394c7ec68580548416821790557f83dbbc89bc64fd8a62b2807b94824a48fe1aea66b4f2e27c74eb462f705daf6780548416821790557ff3c7e73bf95a43ea75fb11cda0b7c773c650a6853399dda7e75259c7a1fe296d80548416821790557f441c65298d26b66c0260ec386a29c0849e78d532e52828ff20106dee6b5229aa80548416821790557fc159f117f41b15ad42d9ac32b2a95ef8abcf5b7bcf95cdc3a5f57e9e580ba33080548416821790557397da67882b3f727c2fab876660785a6fba3fb3b59091527f2e817be62101fa26dcda93c865b643d2e887176d3bfeba77835c1f87d001ddb0805490921617905562000b26565b3390565b6001600160a01b0382166200095d5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b806002600082825462000971919062000ac2565b90915550506001600160a01b03821660009081526020819052604081208054839290620009a090849062000ac2565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b828054620009f89062000ae9565b90600052602060002090601f01602090048101928262000a1c576000855562000a67565b82601f1062000a3757805160ff191683800117855562000a67565b8280016001018555821562000a67579182015b8281111562000a6757825182559160200191906001019062000a4a565b5062000a7592915062000a79565b5090565b5b8082111562000a75576000815560010162000a7a565b60006020828403121562000aa357600080fd5b81516001600160a01b038116811462000abb57600080fd5b9392505050565b6000821982111562000ae457634e487b7160e01b600052601160045260246000fd5b500190565b600181811c9082168062000afe57607f821691505b6020821081141562000b2057634e487b7160e01b600052602260045260246000fd5b50919050565b6134338062000b366000396000f3fe60806040526004361061036e5760003560e01c8063715018a6116101c6578063aa4bde28116100f7578063c9567bf911610095578063df8408fe1161006f578063df8408fe14610ab0578063e7a324dc14610ad0578063f1127ed814610b04578063f2fde38b14610b6857600080fd5b8063c9567bf914610a55578063d4c989d31461070f578063dd62ed3e14610a6a57600080fd5b8063b515566a116100d1578063b515566a146109c5578063bfd79284146109e5578063c3cda52014610a15578063c816841b14610a3557600080fd5b8063aa4bde2814610970578063aacebbe314610985578063b4b5ea57146109a557600080fd5b80638da5cb5b116101645780639f9a4e7f1161013e5780639f9a4e7f146108fb578063a457c2d71461091b578063a9059cbb1461093b578063a9e757231461095b57600080fd5b80638da5cb5b146108a85780638ea5220f146108c657806395d89b41146108e657600080fd5b8063782d6fe1116101a0578063782d6fe1146108025780637ecebe00146108225780637f51bb1f1461084f5780638c39970b1461086f57600080fd5b8063715018a6146107ad578063735de9f7146107c257806375f0a874146107e257600080fd5b80634831f977116102a057806361d027b31161023e578063658c27a911610218578063658c27a9146106d657806369284f161461070f5780636fcfff451461072f57806370a082311461077757600080fd5b806361d027b31461068157806362e546f9146106a157806363f54101146106b657600080fd5b80635342acb41161027a5780635342acb4146105b8578063570ca735146105f1578063587cde1e146106285780635c19a95c1461066157600080fd5b80634831f977146105635780634e8c9f901461058357806351bc3c85146105a357600080fd5b806323b872dd1161030d578063313ce567116102e7578063313ce567146104e757806331c2d8471461050357806332cb6b0c14610523578063395093511461054357600080fd5b806323b872dd1461048757806329605e77146104a75780632b0a696d146104c757600080fd5b8063095ea7b311610349578063095ea7b3146103f457806318160ddd146104145780631816467f1461043357806320606b701461045357600080fd5b8062dc12971461037a57806306d8eb1a146103b057806306fdde03146103d257600080fd5b3661037557005b600080fd5b34801561038657600080fd5b50600e5461039b90600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103d06103cb36600461307b565b610b88565b005b3480156103de57600080fd5b506103e7610c83565b6040516103a791906130d7565b34801561040057600080fd5b5061039b61040f366004612eb4565b610d15565b34801561042057600080fd5b506002545b6040519081526020016103a7565b34801561043f57600080fd5b506103d061044e366004612dcb565b610d2c565b34801561045f57600080fd5b506104257f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049357600080fd5b5061039b6104a2366004612e3e565b610d7d565b3480156104b357600080fd5b506103d06104c2366004612dcb565b610e2e565b3480156104d357600080fd5b506103d06104e23660046130be565b610e98565b3480156104f357600080fd5b50604051601281526020016103a7565b34801561050f57600080fd5b506103d061051e366004612f79565b610ef9565b34801561052f57600080fd5b506104256b204fce5e3e2502611000000081565b34801561054f57600080fd5b5061039b61055e366004612eb4565b610f9c565b34801561056f57600080fd5b506103d061057e366004613060565b610fd3565b34801561058f57600080fd5b506103d061059e366004613060565b61108f565b3480156105af57600080fd5b506103d0611149565b3480156105c457600080fd5b5061039b6105d3366004612dcb565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156105fd57600080fd5b50600e5461010090046001600160a01b03165b6040516001600160a01b0390911681526020016103a7565b34801561063457600080fd5b50610610610643366004612dcb565b6001600160a01b039081166000908152601360205260409020541690565b34801561066d57600080fd5b506103d061067c366004612dcb565b611182565b34801561068d57600080fd5b50600c54610610906001600160a01b031681565b3480156106ad57600080fd5b506103d061118f565b3480156106c257600080fd5b506103d06106d136600461307b565b6111f8565b3480156106e257600080fd5b5061039b6106f1366004612dcb565b6001600160a01b031660009081526010602052604090205460ff1690565b34801561071b57600080fd5b506103d061072a366004612e7f565b6112e5565b34801561073b57600080fd5b5061076261074a366004612dcb565b60156020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016103a7565b34801561078357600080fd5b50610425610792366004612dcb565b6001600160a01b031660009081526020819052604090205490565b3480156107b957600080fd5b506103d061133f565b3480156107ce57600080fd5b50600854610610906001600160a01b031681565b3480156107ee57600080fd5b50600a54610610906001600160a01b031681565b34801561080e57600080fd5b5061042561081d366004612eb4565b6113b3565b34801561082e57600080fd5b5061042561083d366004612dcb565b60166020526000908152604090205481565b34801561085b57600080fd5b506103d061086a366004612dcb565b611618565b34801561087b57600080fd5b5061039b61088a366004612dcb565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156108b457600080fd5b506005546001600160a01b0316610610565b3480156108d257600080fd5b50600b54610610906001600160a01b031681565b3480156108f257600080fd5b506103e7611669565b34801561090757600080fd5b506103d0610916366004613045565b611678565b34801561092757600080fd5b5061039b610936366004612eb4565b6116c5565b34801561094757600080fd5b5061039b610956366004612eb4565b611760565b34801561096757600080fd5b5061042561176d565b34801561097c57600080fd5b506104256117a1565b34801561099157600080fd5b506103d06109a0366004612dcb565b6117d2565b3480156109b157600080fd5b506104256109c0366004612dcb565b611823565b3480156109d157600080fd5b506103d06109e0366004612f79565b611898565b3480156109f157600080fd5b5061039b610a00366004612dcb565b600d6020526000908152604090205460ff1681565b348015610a2157600080fd5b506103d0610a30366004612ee0565b6119c6565b348015610a4157600080fd5b50600954610610906001600160a01b031681565b348015610a6157600080fd5b506103d0611c94565b348015610a7657600080fd5b50610425610a85366004612e05565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610abc57600080fd5b506103d0610acb366004612e7f565b611cf8565b348015610adc57600080fd5b506104257fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610b1057600080fd5b50610b4c610b1f366004612f42565b60146020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016103a7565b348015610b7457600080fd5b506103d0610b83366004612dcb565b611d52565b600e5461010090046001600160a01b03163314610bc05760405162461bcd60e51b8152600401610bb79061312c565b60405180910390fd5b6107d081610bce84866131f5565b610bd891906131f5565b61ffff161115610c365760405162461bcd60e51b815260206004820152602360248201527f42657444616f5b757064617465427579466565735d3a2077726f6e672076616c60448201526275657360e81b6064820152608401610bb7565b6005805463ffffffff60b01b1916600160b01b61ffff9586160261ffff60c01b191617600160c01b938516939093029290921761ffff60d01b1916600160d01b9190931602919091179055565b606060038054610c92906132e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe906132e4565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b5050505050905090565b6000610d22338484611e3d565b5060015b92915050565b600e5461010090046001600160a01b03163314610d5b5760405162461bcd60e51b8152600401610bb79061312c565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d8a848484611f61565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e0f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610bb7565b610e238533610e1e86856132a8565b611e3d565b506001949350505050565b600e5461010090046001600160a01b03163314610e5d5760405162461bcd60e51b8152600401610bb79061312c565b6001600160a01b038116610e7057600080fd5b600e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600e5461010090046001600160a01b03163314610ec75760405162461bcd60e51b8152600401610bb79061312c565b600554610ef39061ffff600160a01b90910416610eed83610ee760025490565b90612475565b90612481565b60075550565b600e5461010090046001600160a01b03163314610f285760405162461bcd60e51b8152600401610bb79061312c565b60005b81518161ffff161015610f98576000600d6000848461ffff1681518110610f5457610f54613388565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f908161331f565b915050610f2b565b5050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d22918590610e1e90869061321b565b600e5461010090046001600160a01b031633146110025760405162461bcd60e51b8152600401610bb79061312c565b60c88161ffff16101561106b5760405162461bcd60e51b815260206004820152602b60248201527f42657444616f5b7365744d617857616c6c6574416d6f756e74526174655d3a2060448201526a085b585e17ddd85b1b195d60aa1b6064820152608401610bb7565b6006805461ffff9092166401000000000265ffff0000000019909216919091179055565b600e5461010090046001600160a01b031633146110be5760405162461bcd60e51b8152600401610bb79061312c565b60648161ffff1610156111295760405162461bcd60e51b815260206004820152602d60248201527f42657444616f5b7365744d61785472616e73666572416d6f756e74526174655d60448201526c0e88085b585e17d85b5bdd5b9d609a1b6064820152608401610bb7565b6006805461ffff909216620100000263ffff000019909216919091179055565b600e5461010090046001600160a01b031633146111785760405162461bcd60e51b8152600401610bb79061312c565b61118061248d565b565b61118c3382612692565b50565b600e5461010090046001600160a01b031633146111be5760405162461bcd60e51b8152600401610bb79061312c565b600b5460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610f98573d6000803e3d6000fd5b600e5461010090046001600160a01b031633146112275760405162461bcd60e51b8152600401610bb79061312c565b6107d08161123584866131f5565b61123f91906131f5565b61ffff16111561129d5760405162461bcd60e51b8152602060048201526024808201527f42657444616f5b75706461746553656c6c466565735d3a2077726f6e672076616044820152636c75657360e01b6064820152608401610bb7565b600580546001600160e01b0316600160e01b61ffff958616026001600160f01b031617600160f01b93851693909302929092179091556006805461ffff191691909216179055565b600e5461010090046001600160a01b031633146113145760405162461bcd60e51b8152600401610bb79061312c565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146113695760405162461bcd60e51b8152600401610bb79061314f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60004382106114145760405162461bcd60e51b815260206004820152602760248201527f4d4152533a3a6765745072696f72566f7465733a206e6f742079657420646574604482015266195c9b5a5b995960ca1b6064820152608401610bb7565b6001600160a01b03831660009081526015602052604090205463ffffffff1680611442576000915050610d26565b6001600160a01b038416600090815260146020526040812084916114676001856132bf565b63ffffffff908116825260208201929092526040016000205416116114d0576001600160a01b0384166000908152601460205260408120906114aa6001846132bf565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610d26565b6001600160a01b038416600090815260146020908152604080832083805290915290205463ffffffff1683101561150b576000915050610d26565b6000806115196001846132bf565b90505b8163ffffffff168163ffffffff1611156115e1576000600261153e84846132bf565b6115489190613266565b61155290836132bf565b6001600160a01b038816600090815260146020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156115b557602001519450610d269350505050565b805163ffffffff168711156115cc578193506115da565b6115d76001836132bf565b92505b505061151c565b506001600160a01b038516600090815260146020908152604080832063ffffffff9094168352929052206001015491505092915050565b600e5461010090046001600160a01b031633146116475760405162461bcd60e51b8152600401610bb79061312c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610c92906132e4565b600e5461010090046001600160a01b031633146116a75760405162461bcd60e51b8152600401610bb79061312c565b600e8054911515600160a81b0260ff60a81b19909216919091179055565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156117475760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610bb7565b6117563385610e1e86856132a8565b5060019392505050565b6000610d22338484611f61565b60055460065460009161179c9161ffff600160a01b909204821691610eed9162010000900416610ee760025490565b905090565b60055460065460009161179c9161ffff600160a01b909204821691610eed91640100000000900416610ee760025490565b600e5461010090046001600160a01b031633146118015760405162461bcd60e51b8152600401610bb79061312c565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526015602052604081205463ffffffff168061184e576000611891565b6001600160a01b0383166000908152601460205260408120906118726001846132bf565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b600e5461010090046001600160a01b031633146118c75760405162461bcd60e51b8152600401610bb79061312c565b60005b81518161ffff161015610f985760095482516001600160a01b0390911690839061ffff84169081106118fe576118fe613388565b60200260200101516001600160a01b031614158015611953575060085482516001600160a01b0390911690839061ffff841690811061193f5761193f613388565b60200260200101516001600160a01b031614155b156119b4576001600d6000848461ffff168151811061197457611974613388565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806119be8161331f565b9150506118ca565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666119f1610c83565b805190602001206119ff4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611b2b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611b9d5760405162461bcd60e51b815260206004820152602660248201527f4d4152533a3a64656c656761746542795369673a20696e76616c6964207369676044820152656e617475726560d01b6064820152608401610bb7565b6001600160a01b0381166000908152601660205260408120805491611bc183613341565b919050558914611c1e5760405162461bcd60e51b815260206004820152602260248201527f4d4152533a3a64656c656761746542795369673a20696e76616c6964206e6f6e604482015261636560f01b6064820152608401610bb7565b87421115611c7d5760405162461bcd60e51b815260206004820152602660248201527f4d4152533a3a64656c656761746542795369673a207369676e617475726520656044820152651e1c1a5c995960d21b6064820152608401610bb7565b611c87818b612692565b505050505b505050505050565b6005546001600160a01b03163314611cbe5760405162461bcd60e51b8152600401610bb79061314f565b6012805460ff19166001179055600e805460ff60a81b1916600160a81b1790556006805464c80064000065ffffffff000019909116179055565b600e5461010090046001600160a01b03163314611d275760405162461bcd60e51b8152600401610bb79061312c565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611d7c5760405162461bcd60e51b8152600401610bb79061314f565b6001600160a01b038116611de15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bb7565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611e9f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bb7565b6001600160a01b038216611f005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bb7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60125460ff16158015611f8257506005546001600160a01b03848116911614155b8015611f9c57506005546001600160a01b03838116911614155b8015611fb657506008546001600160a01b03848116911614155b15611fdf576001600160a01b0383166000908152600d60205260409020805460ff191660011790555b6001600160a01b0383166000908152600d602052604090205460ff1615801561202157506001600160a01b0382166000908152600d602052604090205460ff16155b61207c5760405162461bcd60e51b815260206004820152602660248201527f42657444616f5b5f7472616e736665725d3a20626c61636b6c6973746564206160448201526564647265737360d01b6064820152608401610bb7565b600e54600160a81b900460ff161515600114801561209d5750600e5460ff16155b80156120b357506008546001600160a01b031615155b80156120c957506009546001600160a01b031615155b80156120e357506009546001600160a01b03848116911614155b80156120fd57506008546001600160a01b03848116911614155b801561211757506005546001600160a01b03848116911614155b801561212c57506001600160a01b0383163014155b801561215157506001600160a01b03831660009081526011602052604090205460ff16155b801561217657506001600160a01b03821660009081526011602052604090205460ff16155b156121835761218361248d565b6001600160a01b03831660009081526010602052604090205460ff1661220a576121ab61176d565b81111561220a5760405162461bcd60e51b815260206004820152602760248201527f42657444616f5b5f7472616e736665725d3a20657863656564206d617820747860448201526608185b5bdd5b9d60ca1b6064820152608401610bb7565b6001600160a01b03821660009081526010602052604090205460ff166122ee576009546001600160a01b0383811691161480159061225657506008546001600160a01b03838116911614155b156122ee576122636117a1565b61228c82612286856001600160a01b031660009081526020819052604090205490565b90612711565b11156122ee5760405162461bcd60e51b815260206004820152602b60248201527f42657444616f5b5f7472616e736665725d3a20657863656564206d617820776160448201526a1b1b195d08185b5bdd5b9d60aa1b6064820152608401610bb7565b6001600160a01b0383166000908152600f602052604090205460ff161561231f5761231a83838361271d565b505050565b6009546001600160a01b03848116911614156123f85760055460009061235f9061ffff600160a01b8204811691610eed918691600160b01b900416612475565b60055490915060009061238c9061ffff600160a01b8204811691610eed918791600160c01b900416612475565b6005549091506000906123b99061ffff600160a01b8204811691610eed918891600160d01b900416612475565b90506123d36123cc826122868686612711565b85906128f5565b93506123e086868661271d565b611c8c86306123f3846122868888612711565b61271d565b6005546000906124229061ffff600160a01b8204811691610eed918691600160e01b900416612475565b60055490915060009061244f9061ffff600160a01b8204811691610eed918791600160f01b900416612475565b6005546006549192506000916123b99161ffff600160a01b909104811691610eed918891165b60006118918284613289565b60006118918284613252565b600e805460ff191660011790553060009081526020819052604081205490506124b581612901565b600654600554479160009161ffff918216916124e391600160f01b8104821691600160e01b909104166131f5565b6124ed91906131f5565b60055461ffff9182169250600091612515918491610eed918791600160e01b90910416612475565b60055490915060009061253a908490610eed908790600160f01b900461ffff16612475565b600654909150600090612558908590610eed90889061ffff16612475565b90508481612566848661321b565b612570919061321b565b11156125cf5760405162461bcd60e51b815260206004820152602860248201527f42657444616f5b73776170416e6457697468647261775d3a206469766964656e60448201526732399032b93937b960c11b6064820152608401610bb7565b600b546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015612609573d6000803e3d6000fd5b50600a546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612644573d6000803e3d6000fd5b50600c546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561267f573d6000803e3d6000fd5b5050600e805460ff191690555050505050565b6001600160a01b038281166000818152601360208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461270b828483612a6c565b50505050565b6000611891828461321b565b6001600160a01b0383166127815760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610bb7565b6001600160a01b0382166127e35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610bb7565b6001600160a01b0383166000908152602081905260409020548181101561285b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610bb7565b61286582826132a8565b6001600160a01b03808616600090815260208190526040808220939093559085168152908120805484929061289b90849061321b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128e791815260200190565b60405180910390a350505050565b600061189182846132a8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061293657612936613388565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561298a57600080fd5b505afa15801561299e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c29190612de8565b816001815181106129d5576129d5613388565b6001600160a01b0392831660209182029290920101526008546129fb9130911684611e3d565b6008546001600160a01b031663791ac9478360008430612a1e426201518061321b565b6040518663ffffffff1660e01b8152600401612a3e959493929190613184565b600060405180830381600087803b158015612a5857600080fd5b505af1158015611c8c573d6000803e3d6000fd5b816001600160a01b0316836001600160a01b031614158015612a8e5750600081115b1561231a576001600160a01b03831615612b31576001600160a01b03831660009081526015602052604081205463ffffffff169081612ace576000612b11565b6001600160a01b038516600090815260146020526040812090612af26001856132bf565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612b1f82856128f5565b9050612b2d86848484612bc7565b5050505b6001600160a01b0382161561231a576001600160a01b03821660009081526015602052604081205463ffffffff169081612b6c576000612baf565b6001600160a01b038416600090815260146020526040812090612b906001856132bf565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612bbd8285612711565b9050611c8c858484845b6000612beb436040518060600160405280603481526020016133ca60349139612d69565b905060008463ffffffff16118015612c4557506001600160a01b038516600090815260146020526040812063ffffffff831691612c296001886132bf565b63ffffffff908116825260208201929092526040016000205416145b15612c8e576001600160a01b03851660009081526014602052604081208391612c6f6001886132bf565b63ffffffff168152602081019190915260400160002060010155612d1e565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152601483528581208a851682529092529390209151825463ffffffff191691161781559051600191820155612ced908590613233565b6001600160a01b0386166000908152601560205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410612d915760405162461bcd60e51b8152600401610bb791906130d7565b509192915050565b8035612da4816133b4565b919050565b80358015158114612da457600080fd5b803561ffff81168114612da457600080fd5b600060208284031215612ddd57600080fd5b8135611891816133b4565b600060208284031215612dfa57600080fd5b8151611891816133b4565b60008060408385031215612e1857600080fd5b8235612e23816133b4565b91506020830135612e33816133b4565b809150509250929050565b600080600060608486031215612e5357600080fd5b8335612e5e816133b4565b92506020840135612e6e816133b4565b929592945050506040919091013590565b60008060408385031215612e9257600080fd5b8235612e9d816133b4565b9150612eab60208401612da9565b90509250929050565b60008060408385031215612ec757600080fd5b8235612ed2816133b4565b946020939093013593505050565b60008060008060008060c08789031215612ef957600080fd5b8635612f04816133b4565b95506020870135945060408701359350606087013560ff81168114612f2857600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215612f5557600080fd5b8235612f60816133b4565b9150602083013563ffffffff81168114612e3357600080fd5b60006020808385031215612f8c57600080fd5b823567ffffffffffffffff80821115612fa457600080fd5b818501915085601f830112612fb857600080fd5b813581811115612fca57612fca61339e565b8060051b604051601f19603f83011681018181108582111715612fef57612fef61339e565b604052828152858101935084860182860187018a101561300e57600080fd5b600095505b838610156130385761302481612d99565b855260019590950194938601938601613013565b5098975050505050505050565b60006020828403121561305757600080fd5b61189182612da9565b60006020828403121561307257600080fd5b61189182612db9565b60008060006060848603121561309057600080fd5b61309984612db9565b92506130a760208501612db9565b91506130b560408501612db9565b90509250925092565b6000602082840312156130d057600080fd5b5035919050565b600060208083528351808285015260005b81811015613104578581018301518582016040015282016130e8565b81811115613116576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526009908201526810b7b832b930ba37b960b91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156131d45784516001600160a01b0316835293830193918301916001016131af565b50506001600160a01b03969096166060850152505050608001529392505050565b600061ffff8083168185168083038211156132125761321261335c565b01949350505050565b6000821982111561322e5761322e61335c565b500190565b600063ffffffff8083168185168083038211156132125761321261335c565b60008261326157613261613372565b500490565b600063ffffffff8084168061327d5761327d613372565b92169190910492915050565b60008160001904831182151516156132a3576132a361335c565b500290565b6000828210156132ba576132ba61335c565b500390565b600063ffffffff838116908316818110156132dc576132dc61335c565b039392505050565b600181811c908216806132f857607f821691505b6020821081141561331957634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff808316818114156133375761333761335c565b6001019392505050565b60006000198214156133555761335561335c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461118c57600080fdfe4d4152533a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a264697066735822122019b642a7c9aac6865eca004eed60cdf54cd5a2ce5a8cec0071b18a7ad349c8c164736f6c63430008070033

Deployed Bytecode

0x60806040526004361061036e5760003560e01c8063715018a6116101c6578063aa4bde28116100f7578063c9567bf911610095578063df8408fe1161006f578063df8408fe14610ab0578063e7a324dc14610ad0578063f1127ed814610b04578063f2fde38b14610b6857600080fd5b8063c9567bf914610a55578063d4c989d31461070f578063dd62ed3e14610a6a57600080fd5b8063b515566a116100d1578063b515566a146109c5578063bfd79284146109e5578063c3cda52014610a15578063c816841b14610a3557600080fd5b8063aa4bde2814610970578063aacebbe314610985578063b4b5ea57146109a557600080fd5b80638da5cb5b116101645780639f9a4e7f1161013e5780639f9a4e7f146108fb578063a457c2d71461091b578063a9059cbb1461093b578063a9e757231461095b57600080fd5b80638da5cb5b146108a85780638ea5220f146108c657806395d89b41146108e657600080fd5b8063782d6fe1116101a0578063782d6fe1146108025780637ecebe00146108225780637f51bb1f1461084f5780638c39970b1461086f57600080fd5b8063715018a6146107ad578063735de9f7146107c257806375f0a874146107e257600080fd5b80634831f977116102a057806361d027b31161023e578063658c27a911610218578063658c27a9146106d657806369284f161461070f5780636fcfff451461072f57806370a082311461077757600080fd5b806361d027b31461068157806362e546f9146106a157806363f54101146106b657600080fd5b80635342acb41161027a5780635342acb4146105b8578063570ca735146105f1578063587cde1e146106285780635c19a95c1461066157600080fd5b80634831f977146105635780634e8c9f901461058357806351bc3c85146105a357600080fd5b806323b872dd1161030d578063313ce567116102e7578063313ce567146104e757806331c2d8471461050357806332cb6b0c14610523578063395093511461054357600080fd5b806323b872dd1461048757806329605e77146104a75780632b0a696d146104c757600080fd5b8063095ea7b311610349578063095ea7b3146103f457806318160ddd146104145780631816467f1461043357806320606b701461045357600080fd5b8062dc12971461037a57806306d8eb1a146103b057806306fdde03146103d257600080fd5b3661037557005b600080fd5b34801561038657600080fd5b50600e5461039b90600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103d06103cb36600461307b565b610b88565b005b3480156103de57600080fd5b506103e7610c83565b6040516103a791906130d7565b34801561040057600080fd5b5061039b61040f366004612eb4565b610d15565b34801561042057600080fd5b506002545b6040519081526020016103a7565b34801561043f57600080fd5b506103d061044e366004612dcb565b610d2c565b34801561045f57600080fd5b506104257f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b34801561049357600080fd5b5061039b6104a2366004612e3e565b610d7d565b3480156104b357600080fd5b506103d06104c2366004612dcb565b610e2e565b3480156104d357600080fd5b506103d06104e23660046130be565b610e98565b3480156104f357600080fd5b50604051601281526020016103a7565b34801561050f57600080fd5b506103d061051e366004612f79565b610ef9565b34801561052f57600080fd5b506104256b204fce5e3e2502611000000081565b34801561054f57600080fd5b5061039b61055e366004612eb4565b610f9c565b34801561056f57600080fd5b506103d061057e366004613060565b610fd3565b34801561058f57600080fd5b506103d061059e366004613060565b61108f565b3480156105af57600080fd5b506103d0611149565b3480156105c457600080fd5b5061039b6105d3366004612dcb565b6001600160a01b03166000908152600f602052604090205460ff1690565b3480156105fd57600080fd5b50600e5461010090046001600160a01b03165b6040516001600160a01b0390911681526020016103a7565b34801561063457600080fd5b50610610610643366004612dcb565b6001600160a01b039081166000908152601360205260409020541690565b34801561066d57600080fd5b506103d061067c366004612dcb565b611182565b34801561068d57600080fd5b50600c54610610906001600160a01b031681565b3480156106ad57600080fd5b506103d061118f565b3480156106c257600080fd5b506103d06106d136600461307b565b6111f8565b3480156106e257600080fd5b5061039b6106f1366004612dcb565b6001600160a01b031660009081526010602052604090205460ff1690565b34801561071b57600080fd5b506103d061072a366004612e7f565b6112e5565b34801561073b57600080fd5b5061076261074a366004612dcb565b60156020526000908152604090205463ffffffff1681565b60405163ffffffff90911681526020016103a7565b34801561078357600080fd5b50610425610792366004612dcb565b6001600160a01b031660009081526020819052604090205490565b3480156107b957600080fd5b506103d061133f565b3480156107ce57600080fd5b50600854610610906001600160a01b031681565b3480156107ee57600080fd5b50600a54610610906001600160a01b031681565b34801561080e57600080fd5b5061042561081d366004612eb4565b6113b3565b34801561082e57600080fd5b5061042561083d366004612dcb565b60166020526000908152604090205481565b34801561085b57600080fd5b506103d061086a366004612dcb565b611618565b34801561087b57600080fd5b5061039b61088a366004612dcb565b6001600160a01b031660009081526011602052604090205460ff1690565b3480156108b457600080fd5b506005546001600160a01b0316610610565b3480156108d257600080fd5b50600b54610610906001600160a01b031681565b3480156108f257600080fd5b506103e7611669565b34801561090757600080fd5b506103d0610916366004613045565b611678565b34801561092757600080fd5b5061039b610936366004612eb4565b6116c5565b34801561094757600080fd5b5061039b610956366004612eb4565b611760565b34801561096757600080fd5b5061042561176d565b34801561097c57600080fd5b506104256117a1565b34801561099157600080fd5b506103d06109a0366004612dcb565b6117d2565b3480156109b157600080fd5b506104256109c0366004612dcb565b611823565b3480156109d157600080fd5b506103d06109e0366004612f79565b611898565b3480156109f157600080fd5b5061039b610a00366004612dcb565b600d6020526000908152604090205460ff1681565b348015610a2157600080fd5b506103d0610a30366004612ee0565b6119c6565b348015610a4157600080fd5b50600954610610906001600160a01b031681565b348015610a6157600080fd5b506103d0611c94565b348015610a7657600080fd5b50610425610a85366004612e05565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b348015610abc57600080fd5b506103d0610acb366004612e7f565b611cf8565b348015610adc57600080fd5b506104257fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf81565b348015610b1057600080fd5b50610b4c610b1f366004612f42565b60146020908152600092835260408084209091529082529020805460019091015463ffffffff9091169082565b6040805163ffffffff90931683526020830191909152016103a7565b348015610b7457600080fd5b506103d0610b83366004612dcb565b611d52565b600e5461010090046001600160a01b03163314610bc05760405162461bcd60e51b8152600401610bb79061312c565b60405180910390fd5b6107d081610bce84866131f5565b610bd891906131f5565b61ffff161115610c365760405162461bcd60e51b815260206004820152602360248201527f42657444616f5b757064617465427579466565735d3a2077726f6e672076616c60448201526275657360e81b6064820152608401610bb7565b6005805463ffffffff60b01b1916600160b01b61ffff9586160261ffff60c01b191617600160c01b938516939093029290921761ffff60d01b1916600160d01b9190931602919091179055565b606060038054610c92906132e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe906132e4565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b5050505050905090565b6000610d22338484611e3d565b5060015b92915050565b600e5461010090046001600160a01b03163314610d5b5760405162461bcd60e51b8152600401610bb79061312c565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000610d8a848484611f61565b6001600160a01b038416600090815260016020908152604080832033845290915290205482811015610e0f5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610bb7565b610e238533610e1e86856132a8565b611e3d565b506001949350505050565b600e5461010090046001600160a01b03163314610e5d5760405162461bcd60e51b8152600401610bb79061312c565b6001600160a01b038116610e7057600080fd5b600e80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b600e5461010090046001600160a01b03163314610ec75760405162461bcd60e51b8152600401610bb79061312c565b600554610ef39061ffff600160a01b90910416610eed83610ee760025490565b90612475565b90612481565b60075550565b600e5461010090046001600160a01b03163314610f285760405162461bcd60e51b8152600401610bb79061312c565b60005b81518161ffff161015610f98576000600d6000848461ffff1681518110610f5457610f54613388565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f908161331f565b915050610f2b565b5050565b3360008181526001602090815260408083206001600160a01b03871684529091528120549091610d22918590610e1e90869061321b565b600e5461010090046001600160a01b031633146110025760405162461bcd60e51b8152600401610bb79061312c565b60c88161ffff16101561106b5760405162461bcd60e51b815260206004820152602b60248201527f42657444616f5b7365744d617857616c6c6574416d6f756e74526174655d3a2060448201526a085b585e17ddd85b1b195d60aa1b6064820152608401610bb7565b6006805461ffff9092166401000000000265ffff0000000019909216919091179055565b600e5461010090046001600160a01b031633146110be5760405162461bcd60e51b8152600401610bb79061312c565b60648161ffff1610156111295760405162461bcd60e51b815260206004820152602d60248201527f42657444616f5b7365744d61785472616e73666572416d6f756e74526174655d60448201526c0e88085b585e17d85b5bdd5b9d609a1b6064820152608401610bb7565b6006805461ffff909216620100000263ffff000019909216919091179055565b600e5461010090046001600160a01b031633146111785760405162461bcd60e51b8152600401610bb79061312c565b61118061248d565b565b61118c3382612692565b50565b600e5461010090046001600160a01b031633146111be5760405162461bcd60e51b8152600401610bb79061312c565b600b5460405147916001600160a01b03169082156108fc029083906000818181858888f19350505050158015610f98573d6000803e3d6000fd5b600e5461010090046001600160a01b031633146112275760405162461bcd60e51b8152600401610bb79061312c565b6107d08161123584866131f5565b61123f91906131f5565b61ffff16111561129d5760405162461bcd60e51b8152602060048201526024808201527f42657444616f5b75706461746553656c6c466565735d3a2077726f6e672076616044820152636c75657360e01b6064820152608401610bb7565b600580546001600160e01b0316600160e01b61ffff958616026001600160f01b031617600160f01b93851693909302929092179091556006805461ffff191691909216179055565b600e5461010090046001600160a01b031633146113145760405162461bcd60e51b8152600401610bb79061312c565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6005546001600160a01b031633146113695760405162461bcd60e51b8152600401610bb79061314f565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b60004382106114145760405162461bcd60e51b815260206004820152602760248201527f4d4152533a3a6765745072696f72566f7465733a206e6f742079657420646574604482015266195c9b5a5b995960ca1b6064820152608401610bb7565b6001600160a01b03831660009081526015602052604090205463ffffffff1680611442576000915050610d26565b6001600160a01b038416600090815260146020526040812084916114676001856132bf565b63ffffffff908116825260208201929092526040016000205416116114d0576001600160a01b0384166000908152601460205260408120906114aa6001846132bf565b63ffffffff1663ffffffff16815260200190815260200160002060010154915050610d26565b6001600160a01b038416600090815260146020908152604080832083805290915290205463ffffffff1683101561150b576000915050610d26565b6000806115196001846132bf565b90505b8163ffffffff168163ffffffff1611156115e1576000600261153e84846132bf565b6115489190613266565b61155290836132bf565b6001600160a01b038816600090815260146020908152604080832063ffffffff80861685529083529281902081518083019092528054909316808252600190930154918101919091529192508714156115b557602001519450610d269350505050565b805163ffffffff168711156115cc578193506115da565b6115d76001836132bf565b92505b505061151c565b506001600160a01b038516600090815260146020908152604080832063ffffffff9094168352929052206001015491505092915050565b600e5461010090046001600160a01b031633146116475760405162461bcd60e51b8152600401610bb79061312c565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b606060048054610c92906132e4565b600e5461010090046001600160a01b031633146116a75760405162461bcd60e51b8152600401610bb79061312c565b600e8054911515600160a81b0260ff60a81b19909216919091179055565b3360009081526001602090815260408083206001600160a01b0386168452909152812054828110156117475760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610bb7565b6117563385610e1e86856132a8565b5060019392505050565b6000610d22338484611f61565b60055460065460009161179c9161ffff600160a01b909204821691610eed9162010000900416610ee760025490565b905090565b60055460065460009161179c9161ffff600160a01b909204821691610eed91640100000000900416610ee760025490565b600e5461010090046001600160a01b031633146118015760405162461bcd60e51b8152600401610bb79061312c565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811660009081526015602052604081205463ffffffff168061184e576000611891565b6001600160a01b0383166000908152601460205260408120906118726001846132bf565b63ffffffff1663ffffffff168152602001908152602001600020600101545b9392505050565b600e5461010090046001600160a01b031633146118c75760405162461bcd60e51b8152600401610bb79061312c565b60005b81518161ffff161015610f985760095482516001600160a01b0390911690839061ffff84169081106118fe576118fe613388565b60200260200101516001600160a01b031614158015611953575060085482516001600160a01b0390911690839061ffff841690811061193f5761193f613388565b60200260200101516001600160a01b031614155b156119b4576001600d6000848461ffff168151811061197457611974613388565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055505b806119be8161331f565b9150506118ca565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666119f1610c83565b805190602001206119ff4690565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207fe48329057bfd03d55e49b547132e39cffd9c1820ad7b9d4c5307691425d15adf60c08401526001600160a01b038b1660e084015261010083018a90526101208084018a90528251808503909101815261014084019092528151919093012061190160f01b610160830152610162820183905261018282018190529192506000906101a20160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611b2b573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611b9d5760405162461bcd60e51b815260206004820152602660248201527f4d4152533a3a64656c656761746542795369673a20696e76616c6964207369676044820152656e617475726560d01b6064820152608401610bb7565b6001600160a01b0381166000908152601660205260408120805491611bc183613341565b919050558914611c1e5760405162461bcd60e51b815260206004820152602260248201527f4d4152533a3a64656c656761746542795369673a20696e76616c6964206e6f6e604482015261636560f01b6064820152608401610bb7565b87421115611c7d5760405162461bcd60e51b815260206004820152602660248201527f4d4152533a3a64656c656761746542795369673a207369676e617475726520656044820152651e1c1a5c995960d21b6064820152608401610bb7565b611c87818b612692565b505050505b505050505050565b6005546001600160a01b03163314611cbe5760405162461bcd60e51b8152600401610bb79061314f565b6012805460ff19166001179055600e805460ff60a81b1916600160a81b1790556006805464c80064000065ffffffff000019909116179055565b600e5461010090046001600160a01b03163314611d275760405162461bcd60e51b8152600401610bb79061312c565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611d7c5760405162461bcd60e51b8152600401610bb79061314f565b6001600160a01b038116611de15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bb7565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611e9f5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bb7565b6001600160a01b038216611f005760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bb7565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60125460ff16158015611f8257506005546001600160a01b03848116911614155b8015611f9c57506005546001600160a01b03838116911614155b8015611fb657506008546001600160a01b03848116911614155b15611fdf576001600160a01b0383166000908152600d60205260409020805460ff191660011790555b6001600160a01b0383166000908152600d602052604090205460ff1615801561202157506001600160a01b0382166000908152600d602052604090205460ff16155b61207c5760405162461bcd60e51b815260206004820152602660248201527f42657444616f5b5f7472616e736665725d3a20626c61636b6c6973746564206160448201526564647265737360d01b6064820152608401610bb7565b600e54600160a81b900460ff161515600114801561209d5750600e5460ff16155b80156120b357506008546001600160a01b031615155b80156120c957506009546001600160a01b031615155b80156120e357506009546001600160a01b03848116911614155b80156120fd57506008546001600160a01b03848116911614155b801561211757506005546001600160a01b03848116911614155b801561212c57506001600160a01b0383163014155b801561215157506001600160a01b03831660009081526011602052604090205460ff16155b801561217657506001600160a01b03821660009081526011602052604090205460ff16155b156121835761218361248d565b6001600160a01b03831660009081526010602052604090205460ff1661220a576121ab61176d565b81111561220a5760405162461bcd60e51b815260206004820152602760248201527f42657444616f5b5f7472616e736665725d3a20657863656564206d617820747860448201526608185b5bdd5b9d60ca1b6064820152608401610bb7565b6001600160a01b03821660009081526010602052604090205460ff166122ee576009546001600160a01b0383811691161480159061225657506008546001600160a01b03838116911614155b156122ee576122636117a1565b61228c82612286856001600160a01b031660009081526020819052604090205490565b90612711565b11156122ee5760405162461bcd60e51b815260206004820152602b60248201527f42657444616f5b5f7472616e736665725d3a20657863656564206d617820776160448201526a1b1b195d08185b5bdd5b9d60aa1b6064820152608401610bb7565b6001600160a01b0383166000908152600f602052604090205460ff161561231f5761231a83838361271d565b505050565b6009546001600160a01b03848116911614156123f85760055460009061235f9061ffff600160a01b8204811691610eed918691600160b01b900416612475565b60055490915060009061238c9061ffff600160a01b8204811691610eed918791600160c01b900416612475565b6005549091506000906123b99061ffff600160a01b8204811691610eed918891600160d01b900416612475565b90506123d36123cc826122868686612711565b85906128f5565b93506123e086868661271d565b611c8c86306123f3846122868888612711565b61271d565b6005546000906124229061ffff600160a01b8204811691610eed918691600160e01b900416612475565b60055490915060009061244f9061ffff600160a01b8204811691610eed918791600160f01b900416612475565b6005546006549192506000916123b99161ffff600160a01b909104811691610eed918891165b60006118918284613289565b60006118918284613252565b600e805460ff191660011790553060009081526020819052604081205490506124b581612901565b600654600554479160009161ffff918216916124e391600160f01b8104821691600160e01b909104166131f5565b6124ed91906131f5565b60055461ffff9182169250600091612515918491610eed918791600160e01b90910416612475565b60055490915060009061253a908490610eed908790600160f01b900461ffff16612475565b600654909150600090612558908590610eed90889061ffff16612475565b90508481612566848661321b565b612570919061321b565b11156125cf5760405162461bcd60e51b815260206004820152602860248201527f42657444616f5b73776170416e6457697468647261775d3a206469766964656e60448201526732399032b93937b960c11b6064820152608401610bb7565b600b546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015612609573d6000803e3d6000fd5b50600a546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015612644573d6000803e3d6000fd5b50600c546040516001600160a01b039091169082156108fc029083906000818181858888f1935050505015801561267f573d6000803e3d6000fd5b5050600e805460ff191690555050505050565b6001600160a01b038281166000818152601360208181526040808420805485845282862054949093528787166001600160a01b03198416811790915590519190951694919391928592917f3134e8a2e6d97e929a7e54011ea5485d7d196dd5f0ba4d4ef95803e8e3fc257f9190a461270b828483612a6c565b50505050565b6000611891828461321b565b6001600160a01b0383166127815760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610bb7565b6001600160a01b0382166127e35760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610bb7565b6001600160a01b0383166000908152602081905260409020548181101561285b5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610bb7565b61286582826132a8565b6001600160a01b03808616600090815260208190526040808220939093559085168152908120805484929061289b90849061321b565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516128e791815260200190565b60405180910390a350505050565b600061189182846132a8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061293657612936613388565b6001600160a01b03928316602091820292909201810191909152600854604080516315ab88c960e31b81529051919093169263ad5c4648926004808301939192829003018186803b15801561298a57600080fd5b505afa15801561299e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c29190612de8565b816001815181106129d5576129d5613388565b6001600160a01b0392831660209182029290920101526008546129fb9130911684611e3d565b6008546001600160a01b031663791ac9478360008430612a1e426201518061321b565b6040518663ffffffff1660e01b8152600401612a3e959493929190613184565b600060405180830381600087803b158015612a5857600080fd5b505af1158015611c8c573d6000803e3d6000fd5b816001600160a01b0316836001600160a01b031614158015612a8e5750600081115b1561231a576001600160a01b03831615612b31576001600160a01b03831660009081526015602052604081205463ffffffff169081612ace576000612b11565b6001600160a01b038516600090815260146020526040812090612af26001856132bf565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612b1f82856128f5565b9050612b2d86848484612bc7565b5050505b6001600160a01b0382161561231a576001600160a01b03821660009081526015602052604081205463ffffffff169081612b6c576000612baf565b6001600160a01b038416600090815260146020526040812090612b906001856132bf565b63ffffffff1663ffffffff168152602001908152602001600020600101545b90506000612bbd8285612711565b9050611c8c858484845b6000612beb436040518060600160405280603481526020016133ca60349139612d69565b905060008463ffffffff16118015612c4557506001600160a01b038516600090815260146020526040812063ffffffff831691612c296001886132bf565b63ffffffff908116825260208201929092526040016000205416145b15612c8e576001600160a01b03851660009081526014602052604081208391612c6f6001886132bf565b63ffffffff168152602081019190915260400160002060010155612d1e565b60408051808201825263ffffffff838116825260208083018681526001600160a01b038a166000908152601483528581208a851682529092529390209151825463ffffffff191691161781559051600191820155612ced908590613233565b6001600160a01b0386166000908152601560205260409020805463ffffffff191663ffffffff929092169190911790555b60408051848152602081018490526001600160a01b038716917fdec2bacdd2f05b59de34da9b523dff8be42e5e38e818c82fdb0bae774387a724910160405180910390a25050505050565b6000816401000000008410612d915760405162461bcd60e51b8152600401610bb791906130d7565b509192915050565b8035612da4816133b4565b919050565b80358015158114612da457600080fd5b803561ffff81168114612da457600080fd5b600060208284031215612ddd57600080fd5b8135611891816133b4565b600060208284031215612dfa57600080fd5b8151611891816133b4565b60008060408385031215612e1857600080fd5b8235612e23816133b4565b91506020830135612e33816133b4565b809150509250929050565b600080600060608486031215612e5357600080fd5b8335612e5e816133b4565b92506020840135612e6e816133b4565b929592945050506040919091013590565b60008060408385031215612e9257600080fd5b8235612e9d816133b4565b9150612eab60208401612da9565b90509250929050565b60008060408385031215612ec757600080fd5b8235612ed2816133b4565b946020939093013593505050565b60008060008060008060c08789031215612ef957600080fd5b8635612f04816133b4565b95506020870135945060408701359350606087013560ff81168114612f2857600080fd5b9598949750929560808101359460a0909101359350915050565b60008060408385031215612f5557600080fd5b8235612f60816133b4565b9150602083013563ffffffff81168114612e3357600080fd5b60006020808385031215612f8c57600080fd5b823567ffffffffffffffff80821115612fa457600080fd5b818501915085601f830112612fb857600080fd5b813581811115612fca57612fca61339e565b8060051b604051601f19603f83011681018181108582111715612fef57612fef61339e565b604052828152858101935084860182860187018a101561300e57600080fd5b600095505b838610156130385761302481612d99565b855260019590950194938601938601613013565b5098975050505050505050565b60006020828403121561305757600080fd5b61189182612da9565b60006020828403121561307257600080fd5b61189182612db9565b60008060006060848603121561309057600080fd5b61309984612db9565b92506130a760208501612db9565b91506130b560408501612db9565b90509250925092565b6000602082840312156130d057600080fd5b5035919050565b600060208083528351808285015260005b81811015613104578581018301518582016040015282016130e8565b81811115613116576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526009908201526810b7b832b930ba37b960b91b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156131d45784516001600160a01b0316835293830193918301916001016131af565b50506001600160a01b03969096166060850152505050608001529392505050565b600061ffff8083168185168083038211156132125761321261335c565b01949350505050565b6000821982111561322e5761322e61335c565b500190565b600063ffffffff8083168185168083038211156132125761321261335c565b60008261326157613261613372565b500490565b600063ffffffff8084168061327d5761327d613372565b92169190910492915050565b60008160001904831182151516156132a3576132a361335c565b500290565b6000828210156132ba576132ba61335c565b500390565b600063ffffffff838116908316818110156132dc576132dc61335c565b039392505050565b600181811c908216806132f857607f821691505b6020821081141561331957634e487b7160e01b600052602260045260246000fd5b50919050565b600061ffff808316818114156133375761333761335c565b6001019392505050565b60006000198214156133555761335561335c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461118c57600080fdfe4d4152533a3a5f7772697465436865636b706f696e743a20626c6f636b206e756d62657220657863656564732033322062697473a264697066735822122019b642a7c9aac6865eca004eed60cdf54cd5a2ce5a8cec0071b18a7ad349c8c164736f6c63430008070033

Deployed Bytecode Sourcemap

43445:21970:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44738:42;;;;;;;;;;-1:-1:-1;44738:42:0;;;;-1:-1:-1;;;44738:42:0;;;;;;;;;6399:14:1;;6392:22;6374:41;;6362:2;6347:18;44738:42:0;;;;;;;;54220:436;;;;;;;;;;-1:-1:-1;54220:436:0;;;;;:::i;:::-;;:::i;:::-;;16039:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;18206:169::-;;;;;;;;;;-1:-1:-1;18206:169:0;;;;;:::i;:::-;;:::i;17159:108::-;;;;;;;;;;-1:-1:-1;17247:12:0;;17159:108;;;6572:25:1;;;6560:2;6545:18;17159:108:0;6426:177:1;56484:108:0;;;;;;;;;;-1:-1:-1;56484:108:0;;;;;:::i;:::-;;:::i;57726:122::-;;;;;;;;;;;;57768:80;57726:122;;18857:422;;;;;;;;;;-1:-1:-1;18857:422:0;;;;;:::i;:::-;;:::i;51152:154::-;;;;;;;;;;-1:-1:-1;51152:154:0;;;;;:::i;:::-;;:::i;55168:177::-;;;;;;;;;;-1:-1:-1;55168:177:0;;;;;:::i;:::-;;:::i;17001:93::-;;;;;;;;;;-1:-1:-1;17001:93:0;;17084:2;19560:36:1;;19548:2;19533:18;17001:93:0;19418:184:1;56992:172:0;;;;;;;;;;-1:-1:-1;56992:172:0;;;;;:::i;:::-;;:::i;43572:55::-;;;;;;;;;;;;43609:18;43572:55;;19688:215;;;;;;;;;;-1:-1:-1;19688:215:0;;;;;:::i;:::-;;:::i;54922:238::-;;;;;;;;;;-1:-1:-1;54922:238:0;;;;;:::i;:::-;;:::i;54664:250::-;;;;;;;;;;-1:-1:-1;54664:250:0;;;;;:::i;:::-;;:::i;51564:80::-;;;;;;;;;;;;;:::i;55555:122::-;;;;;;;;;;-1:-1:-1;55555:122:0;;;;;:::i;:::-;-1:-1:-1;;;;;55644:25:0;55620:4;55644:25;;;:18;:25;;;;;;;;;55555:122;48099:85;;;;;;;;;;-1:-1:-1;48167:9:0;;;;;-1:-1:-1;;;;;48167:9:0;48099:85;;;-1:-1:-1;;;;;6190:32:1;;;6172:51;;6160:2;6145:18;48099:85:0;6026:203:1;58709:149:0;;;;;;;;;;-1:-1:-1;58709:149:0;;;;;:::i;:::-;-1:-1:-1;;;;;58829:21:0;;;58797:7;58829:21;;;:10;:21;;;;;;;;58709:149;59002:104;;;;;;;;;;-1:-1:-1;59002:104:0;;;;;:::i;:::-;;:::i;44415:68::-;;;;;;;;;;-1:-1:-1;44415:68:0;;;;-1:-1:-1;;;;;44415:68:0;;;51652:165;;;;;;;;;;;;;:::i;53762:450::-;;;;;;;;;;-1:-1:-1;53762:450:0;;;;;:::i;:::-;;:::i;55814:126::-;;;;;;;;;;-1:-1:-1;55814:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;55905:27:0;55881:4;55905:27;;;:20;:27;;;;;;;;;55814:126;56212:124;;;;;;;;;;-1:-1:-1;56212:124:0;;;;;:::i;:::-;;:::i;57604:49::-;;;;;;;;;;-1:-1:-1;57604:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;19127:10:1;19115:23;;;19097:42;;19085:2;19070:18;57604:49:0;18953:192:1;17330:127:0;;;;;;;;;;-1:-1:-1;17330:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;17431:18:0;17404:7;17431:18;;;;;;;;;;;;17330:127;2850:148;;;;;;;;;;;;;:::i;44151:39::-;;;;;;;;;;-1:-1:-1;44151:39:0;;;;-1:-1:-1;;;;;44151:39:0;;;44257:75;;;;;;;;;;-1:-1:-1;44257:75:0;;;;-1:-1:-1;;;;;44257:75:0;;;61617:1253;;;;;;;;;;-1:-1:-1;61617:1253:0;;;;;:::i;:::-;;:::i;58140:39::-;;;;;;;;;;-1:-1:-1;58140:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;56600:104;;;;;;;;;;-1:-1:-1;56600:104:0;;;;;:::i;:::-;;:::i;56081:123::-;;;;;;;;;;-1:-1:-1;56081:123:0;;;;;:::i;:::-;-1:-1:-1;;;;;56170:26:0;56146:4;56170:26;;;:19;:26;;;;;;;;;56081:123;2199:87;;;;;;;;;;-1:-1:-1;2272:6:0;;-1:-1:-1;;;;;2272:6:0;2199:87;;44339:69;;;;;;;;;;-1:-1:-1;44339:69:0;;;;-1:-1:-1;;;;;44339:69:0;;;16258:104;;;;;;;;;;;;;:::i;51432:124::-;;;;;;;;;;-1:-1:-1;51432:124:0;;;;;:::i;:::-;;:::i;20406:377::-;;;;;;;;;;-1:-1:-1;20406:377:0;;;;;:::i;:::-;;:::i;17670:175::-;;;;;;;;;;-1:-1:-1;17670:175:0;;;;;:::i;:::-;;:::i;53404:142::-;;;;;;;;;;;;;:::i;53616:138::-;;;;;;;;;;;;;:::i;56344:132::-;;;;;;;;;;-1:-1:-1;56344:132:0;;;;;:::i;:::-;;:::i;60931:255::-;;;;;;;;;;-1:-1:-1;60931:255:0;;;;;:::i;:::-;;:::i;56712:272::-;;;;;;;;;;-1:-1:-1;56712:272:0;;;;;:::i;:::-;;:::i;44492:36::-;;;;;;;;;;-1:-1:-1;44492:36:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;59540:1190;;;;;;;;;;-1:-1:-1;59540:1190:0;;;;;:::i;:::-;;:::i;44222:26::-;;;;;;;;;;-1:-1:-1;44222:26:0;;;;-1:-1:-1;;;;;44222:26:0;;;55353:194;;;;;;;;;;;;;:::i;17908:151::-;;;;;;;;;;-1:-1:-1;17908:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;18024:18:0;;;17997:7;18024:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17908:151;55685:121;;;;;;;;;;-1:-1:-1;55685:121:0;;;;;:::i;:::-;;:::i;57942:117::-;;;;;;;;;;;;57988:71;57942:117;;57465:70;;;;;;;;;;-1:-1:-1;57465:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19352:10:1;19340:23;;;19322:42;;19395:2;19380:18;;19373:34;;;;19295:18;57465:70:0;19150:263:1;3153:244:0;;;;;;;;;;-1:-1:-1;3153:244:0;;;;;:::i;:::-;;:::i;54220:436::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;;;;;;;;;54427:4:::1;54404:19:::0;54364:37:::1;54381:20:::0;54364:14;:37:::1;:::i;:::-;:59;;;;:::i;:::-;:67;;;;54356:115;;;::::0;-1:-1:-1;;;54356:115:0;;17331:2:1;54356:115:0::1;::::0;::::1;17313:21:1::0;17370:2;17350:18;;;17343:30;17409:34;17389:18;;;17382:62;-1:-1:-1;;;17460:18:1;;;17453:33;17503:19;;54356:115:0::1;17129:399:1::0;54356:115:0::1;54514:13;:30:::0;;-1:-1:-1;;;;54555:42:0;-1:-1:-1;;;54514:30:0::1;::::0;;::::1;;-1:-1:-1::0;;;;54555:42:0;;-1:-1:-1;;;54555:42:0;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;54608:40:0::1;-1:-1:-1::0;;;54608:40:0;;;::::1;;::::0;;;::::1;::::0;;54220:436::o;16039:100::-;16093:13;16126:5;16119:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16039:100;:::o;18206:169::-;18289:4;18306:39;829:10;18329:7;18338:6;18306:8;:39::i;:::-;-1:-1:-1;18363:4:0;18206:169;;;;;:::o;56484:108::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;56562:9:::1;:22:::0;;-1:-1:-1;;;;;;56562:22:0::1;-1:-1:-1::0;;;;;56562:22:0;;;::::1;::::0;;;::::1;::::0;;56484:108::o;18857:422::-;18963:4;18980:36;18990:6;18998:9;19009:6;18980:9;:36::i;:::-;-1:-1:-1;;;;;19056:19:0;;19029:24;19056:19;;;:11;:19;;;;;;;;829:10;19056:33;;;;;;;;19108:26;;;;19100:79;;;;-1:-1:-1;;;19100:79:0;;13709:2:1;19100:79:0;;;13691:21:1;13748:2;13728:18;;;13721:30;13787:34;13767:18;;;13760:62;-1:-1:-1;;;13838:18:1;;;13831:38;13886:19;;19100:79:0;13507:404:1;19100:79:0;19190:57;19199:6;829:10;19221:25;19240:6;19221:16;:25;:::i;:::-;19190:8;:57::i;:::-;-1:-1:-1;19267:4:0;;18857:422;-1:-1:-1;;;;18857:422:0:o;51152:154::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;51238:25:0;::::1;51230:34;;;::::0;::::1;;51275:9;:23:::0;;-1:-1:-1;;;;;51275:23:0;;::::1;;;-1:-1:-1::0;;;;;;51275:23:0;;::::1;::::0;;;::::1;::::0;;51152:154::o;55168:177::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;55325:11:::1;::::0;55279:58:::1;::::0;55325:11:::1;-1:-1:-1::0;;;55325:11:0;;::::1;;55279:41;55297:22:::0;55279:13:::1;17247:12:::0;;;17159:108;55279:13:::1;:17:::0;::::1;:41::i;:::-;:45:::0;::::1;:58::i;:::-;55261:15;:76:::0;-1:-1:-1;55168:177:0:o;56992:172::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;57071:8:::1;57066:91;57089:5;:12;57085:1;:16;;;57066:91;;;57140:5;57123:4;:14;57128:5;57134:1;57128:8;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;57123:14:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;57123:14:0;:22;;-1:-1:-1;;57123:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;57103:3;::::1;::::0;::::1;:::i;:::-;;;;57066:91;;;;56992:172:::0;:::o;19688:215::-;829:10;19776:4;19825:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;19825:34:0;;;;;;;;;;19776:4;;19793:80;;19816:7;;19825:47;;19862:10;;19825:47;:::i;54922:238::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;55048:3:::1;55024:20;:27;;;;55016:83;;;::::0;-1:-1:-1;;;55016:83:0;;15701:2:1;55016:83:0::1;::::0;::::1;15683:21:1::0;15740:2;15720:18;;;15713:30;15779:34;15759:18;;;15752:62;-1:-1:-1;;;15830:18:1;;;15823:41;15881:19;;55016:83:0::1;15499:407:1::0;55016:83:0::1;55110:19;:42:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;55110:42:0;;::::1;::::0;;;::::1;::::0;;54922:238::o;54664:250::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;54796:3:::1;54770:22;:29;;;;54762:87;;;::::0;-1:-1:-1;;;54762:87:0;;9705:2:1;54762:87:0::1;::::0;::::1;9687:21:1::0;9744:2;9724:18;;;9717:30;9783:34;9763:18;;;9756:62;-1:-1:-1;;;9834:18:1;;;9827:43;9887:19;;54762:87:0::1;9503:409:1::0;54762:87:0::1;54860:21;:46:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;54860:46:0;;::::1;::::0;;;::::1;::::0;;54664:250::o;51564:80::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;51619:17:::1;:15;:17::i;:::-;51564:80::o:0;59002:104::-;59066:32;59076:10;59088:9;59066;:32::i;:::-;59002:104;:::o;51652:165::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;51765:9:::1;::::0;51757:32:::1;::::0;51725:21:::1;::::0;-1:-1:-1;;;;;51765:9:0::1;::::0;51757:32;::::1;;;::::0;51725:21;;51711:11:::1;51757:32:::0;51711:11;51757:32;51725:21;51765:9;51757:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;53762:450:::0;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;53976:4:::1;53952:20:::0;53910:39:::1;53928:21:::0;53910:15;:39:::1;:::i;:::-;:62;;;;:::i;:::-;:70;;;;53902:119;;;::::0;-1:-1:-1;;;53902:119:0;;12082:2:1;53902:119:0::1;::::0;::::1;12064:21:1::0;12121:2;12101:18;;;12094:30;12160:34;12140:18;;;12133:62;-1:-1:-1;;;12211:18:1;;;12204:34;12255:19;;53902:119:0::1;11880:400:1::0;53902:119:0::1;54064:14;:32:::0;;-1:-1:-1;;;;;54107:44:0;-1:-1:-1;;;54064:32:0::1;::::0;;::::1;;-1:-1:-1::0;;;;;54107:44:0;;-1:-1:-1;;;54107:44:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;54162:19:::1;:42:::0;;-1:-1:-1;;54162:42:0::1;::::0;;;::::1;;::::0;;53762:450::o;56212:124::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56295:27:0;;;::::1;;::::0;;;:20:::1;:27;::::0;;;;:33;;-1:-1:-1;;56295:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;56212:124::o;2850:148::-;2272:6;;-1:-1:-1;;;;;2272:6:0;829:10;2419:23;2411:68;;;;-1:-1:-1;;;2411:68:0;;;;;;;:::i;:::-;2941:6:::1;::::0;2920:40:::1;::::0;2957:1:::1;::::0;-1:-1:-1;;;;;2941:6:0::1;::::0;2920:40:::1;::::0;2957:1;;2920:40:::1;2971:6;:19:::0;;-1:-1:-1;;;;;;2971:19:0::1;::::0;;2850:148::o;61617:1253::-;61725:7;61772:12;61758:11;:26;61750:78;;;;-1:-1:-1;;;61750:78:0;;11266:2:1;61750:78:0;;;11248:21:1;11305:2;11285:18;;;11278:30;11344:34;11324:18;;;11317:62;-1:-1:-1;;;11395:18:1;;;11388:37;11442:19;;61750:78:0;11064:403:1;61750:78:0;-1:-1:-1;;;;;61863:23:0;;61841:19;61863:23;;;:14;:23;;;;;;;;61901:17;61897:58;;61942:1;61935:8;;;;;61897:58;-1:-1:-1;;;;;62015:20:0;;;;;;:11;:20;;;;;62067:11;;62036:16;62051:1;62036:12;:16;:::i;:::-;62015:38;;;;;;;;;;;;;;;-1:-1:-1;62015:38:0;:48;;:63;62011:147;;-1:-1:-1;;;;;62102:20:0;;;;;;:11;:20;;;;;;62123:16;62138:1;62123:12;:16;:::i;:::-;62102:38;;;;;;;;;;;;;;;:44;;;62095:51;;;;;62011:147;-1:-1:-1;;;;;62219:20:0;;;;;;:11;:20;;;;;;;;:23;;;;;;;;:33;:23;:33;:47;-1:-1:-1;62215:88:0;;;62290:1;62283:8;;;;;62215:88;62315:12;;62357:16;62372:1;62357:12;:16;:::i;:::-;62342:31;;62384:428;62399:5;62391:13;;:5;:13;;;62384:428;;;62421:13;62463:1;62446:13;62454:5;62446;:13;:::i;:::-;62445:19;;;;:::i;:::-;62437:27;;:5;:27;:::i;:::-;-1:-1:-1;;;;;62529:20:0;;62506;62529;;;:11;:20;;;;;;;;:28;;;;;;;;;;;;;62506:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;62421:43;;-1:-1:-1;62576:27:0;;62572:229;;;62631:8;;;;-1:-1:-1;62624:15:0;;-1:-1:-1;;;;62624:15:0;62572:229;62665:12;;:26;;;-1:-1:-1;62661:140:0;;;62720:6;62712:14;;62661:140;;;62775:10;62784:1;62775:6;:10;:::i;:::-;62767:18;;62661:140;62406:406;;62384:428;;;-1:-1:-1;;;;;;62829:20:0;;;;;;:11;:20;;;;;;;;:27;;;;;;;;;;:33;;;;-1:-1:-1;;61617:1253:0;;;;:::o;56600:104::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;56676:8:::1;:20:::0;;-1:-1:-1;;;;;;56676:20:0::1;-1:-1:-1::0;;;;;56676:20:0;;;::::1;::::0;;;::::1;::::0;;56600:104::o;16258:::-;16314:13;16347:7;16340:14;;;;;:::i;51432:124::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;51515:22:::1;:33:::0;;;::::1;;-1:-1:-1::0;;;51515:33:0::1;-1:-1:-1::0;;;;51515:33:0;;::::1;::::0;;;::::1;::::0;;51432:124::o;20406:377::-;829:10;20499:4;20543:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;20543:34:0;;;;;;;;;;20596:35;;;;20588:85;;;;-1:-1:-1;;;20588:85:0;;16925:2:1;20588:85:0;;;16907:21:1;16964:2;16944:18;;;16937:30;17003:34;16983:18;;;16976:62;-1:-1:-1;;;17054:18:1;;;17047:35;17099:19;;20588:85:0;16723:401:1;20588:85:0;20684:67;829:10;20707:7;20716:34;20735:15;20716:16;:34;:::i;20684:67::-;-1:-1:-1;20771:4:0;;20406:377;-1:-1:-1;;;20406:377:0:o;17670:175::-;17756:4;17773:42;829:10;17797:9;17808:6;17773:9;:42::i;53404:142::-;53526:11;;53499:21;;53454:7;;53481:57;;53526:11;-1:-1:-1;;;53526:11:0;;;;;;53481:40;;53499:21;;;;53481:13;17247:12;;;17159:108;53481:57;53474:64;;53404:142;:::o;53616:138::-;53734:11;;53709:19;;53664:7;;53691:55;;53734:11;-1:-1:-1;;;53734:11:0;;;;;;53691:38;;53709:19;;;;53691:13;17247:12;;;17159:108;56344:132;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;56434:15:::1;:34:::0;;-1:-1:-1;;;;;;56434:34:0::1;-1:-1:-1::0;;;;;56434:34:0;;;::::1;::::0;;;::::1;::::0;;56344:132::o;60931:255::-;-1:-1:-1;;;;;61070:23:0;;61023:7;61070:23;;;:14;:23;;;;;;;;61111:16;:67;;61177:1;61111:67;;;-1:-1:-1;;;;;61130:20:0;;;;;;:11;:20;;;;;;61151:16;61166:1;61151:12;:16;:::i;:::-;61130:38;;;;;;;;;;;;;;;:44;;;61111:67;61104:74;60931:255;-1:-1:-1;;;60931:255:0:o;56712:272::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;56791:8:::1;56786:191;56809:5;:12;56805:1;:16;;;56786:191;;;56859:11;::::0;56847:8;;-1:-1:-1;;;;;56859:11:0;;::::1;::::0;56847:5;;:8:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;56847:23:0::1;;;:61;;;;-1:-1:-1::0;56894:13:0::1;::::0;56874:8;;-1:-1:-1;;;;;56894:13:0;;::::1;::::0;56874:5;;:8:::1;::::0;::::1;::::0;;::::1;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;56874:34:0::1;;;56847:61;56843:123;;;56946:4;56929;:14;56934:5;56940:1;56934:8;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;56929:14:0::1;-1:-1:-1::0;;;;;56929:14:0::1;;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;56843:123;56823:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56786:191;;59540:1190:::0;59733:23;57768:80;59862:6;:4;:6::i;:::-;59846:24;;;;;;59889:12;65270:9;;65160:153;59889:12;59783:165;;;;;;;7261:25:1;;;;7302:18;;;7295:34;;;;7345:18;;;7338:34;;;;59928:4:0;7388:18:1;;;;7381:60;;;;59783:165:0;;;;;;;;;;7233:19:1;;;59783:165:0;;59759:200;;;;;;57988:71;60017:140;;;6839:25:1;-1:-1:-1;;;;;6900:32:1;;6880:18;;;6873:60;6949:18;;;6942:34;;;6992:18;;;;6985:34;;;60017:140:0;;;;;;;;;;6811:19:1;;;60017:140:0;;;59993:175;;;;;;;-1:-1:-1;;;60222:123:0;;;5887:27:1;5930:11;;;5923:27;;;5966:12;;;5959:28;;;59759:200:0;;-1:-1:-1;;;6003:12:1;;60222:123:0;;;-1:-1:-1;;60222:123:0;;;;;;;;;60198:158;;60222:123;60198:158;;;;60369:17;60389:26;;;;;;;;;7679:25:1;;;7752:4;7740:17;;7720:18;;;7713:45;;;;7774:18;;;7767:34;;;7817:18;;;7810:34;;;60198:158:0;;-1:-1:-1;60369:17:0;60389:26;;7651:19:1;;60389:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60389:26:0;;-1:-1:-1;;60389:26:0;;;-1:-1:-1;;;;;;;60434:23:0;;60426:74;;;;-1:-1:-1;;;60426:74:0;;15294:2:1;60426:74:0;;;15276:21:1;15333:2;15313:18;;;15306:30;15372:34;15352:18;;;15345:62;-1:-1:-1;;;15423:18:1;;;15416:36;15469:19;;60426:74:0;15092:402:1;60426:74:0;-1:-1:-1;;;;;60528:17:0;;;;;;:6;:17;;;;;:19;;;;;;:::i;:::-;;;;;60519:5;:28;60511:75;;;;-1:-1:-1;;;60511:75:0;;13306:2:1;60511:75:0;;;13288:21:1;13345:2;13325:18;;;13318:30;13384:34;13364:18;;;13357:62;-1:-1:-1;;;13435:18:1;;;13428:32;13477:19;;60511:75:0;13104:398:1;60511:75:0;60624:6;60605:15;:25;;60597:76;;;;-1:-1:-1;;;60597:76:0;;9298:2:1;60597:76:0;;;9280:21:1;9337:2;9317:18;;;9310:30;9376:34;9356:18;;;9349:62;-1:-1:-1;;;9427:18:1;;;9420:36;9473:19;;60597:76:0;9096:402:1;60597:76:0;60691:31;60701:9;60712;60691;:31::i;:::-;60684:38;;;;59540:1190;;;;;;;:::o;55353:194::-;2272:6;;-1:-1:-1;;;;;2272:6:0;829:10;2419:23;2411:68;;;;-1:-1:-1;;;2411:68:0;;;;;;;:::i;:::-;55406:12:::1;:19:::0;;-1:-1:-1;;55406:19:0::1;55421:4;55406:19;::::0;;55436:22:::1;:29:::0;;-1:-1:-1;;;;55436:29:0::1;-1:-1:-1::0;;;55436:29:0::1;::::0;;55476:21:::1;:27:::0;;55514:25;-1:-1:-1;;55514:25:0;;;;;;55353:194::o;55685:121::-;45053:9;;;;;-1:-1:-1;;;;;45053:9:0;45066:10;45053:23;45045:45;;;;-1:-1:-1;;;45045:45:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;55767:25:0;;;::::1;;::::0;;;:18:::1;:25;::::0;;;;:31;;-1:-1:-1;;55767:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;55685:121::o;3153:244::-;2272:6;;-1:-1:-1;;;;;2272:6:0;829:10;2419:23;2411:68;;;;-1:-1:-1;;;2411:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3242:22:0;::::1;3234:73;;;::::0;-1:-1:-1;;;3234:73:0;;10456:2:1;3234:73:0::1;::::0;::::1;10438:21:1::0;10495:2;10475:18;;;10468:30;10534:34;10514:18;;;10507:62;-1:-1:-1;;;10585:18:1;;;10578:36;10631:19;;3234:73:0::1;10254:402:1::0;3234:73:0::1;3344:6;::::0;3323:38:::1;::::0;-1:-1:-1;;;;;3323:38:0;;::::1;::::0;3344:6:::1;::::0;3323:38:::1;::::0;3344:6:::1;::::0;3323:38:::1;3372:6;:17:::0;;-1:-1:-1;;;;;;3372:17:0::1;-1:-1:-1::0;;;;;3372:17:0;;;::::1;::::0;;;::::1;::::0;;3153:244::o;23762:346::-;-1:-1:-1;;;;;23864:19:0;;23856:68;;;;-1:-1:-1;;;23856:68:0;;16520:2:1;23856:68:0;;;16502:21:1;16559:2;16539:18;;;16532:30;16598:34;16578:18;;;16571:62;-1:-1:-1;;;16649:18:1;;;16642:34;16693:19;;23856:68:0;16318:400:1;23856:68:0;-1:-1:-1;;;;;23943:21:0;;23935:68;;;;-1:-1:-1;;;23935:68:0;;10863:2:1;23935:68:0;;;10845:21:1;10902:2;10882:18;;;10875:30;10941:34;10921:18;;;10914:62;-1:-1:-1;;;10992:18:1;;;10985:32;11034:19;;23935:68:0;10661:398:1;23935:68:0;-1:-1:-1;;;;;24016:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24068:32;;6572:25:1;;;24068:32:0;;6545:18:1;24068:32:0;;;;;;;23762:346;;;:::o;48192:2800::-;48299:12;;;;48298:13;:35;;;;-1:-1:-1;2272:6:0;;-1:-1:-1;;;;;48315:18:0;;;2272:6;;48315:18;;48298:35;:60;;;;-1:-1:-1;2272:6:0;;-1:-1:-1;;;;;48337:21:0;;;2272:6;;48337:21;;48298:60;:97;;;;-1:-1:-1;48381:13:0;;-1:-1:-1;;;;;48362:33:0;;;48381:13;;48362:33;;48298:97;48294:182;;;-1:-1:-1;;;;;48444:13:0;;;;;;:4;:13;;;;;:20;;-1:-1:-1;;48444:20:0;48460:4;48444:20;;;48294:182;-1:-1:-1;;;;;48627:13:0;;;;;;:4;:13;;;;;;;;48626:14;:35;;;;-1:-1:-1;;;;;;48645:16:0;;;;;;:4;:16;;;;;;;;48644:17;48626:35;48618:86;;;;-1:-1:-1;;;48618:86:0;;16113:2:1;48618:86:0;;;16095:21:1;16152:2;16132:18;;;16125:30;16191:34;16171:18;;;16164:62;-1:-1:-1;;;16242:18:1;;;16235:36;16288:19;;48618:86:0;15911:402:1;48618:86:0;48765:22;;-1:-1:-1;;;48765:22:0;;;;:30;;48791:4;48765:30;:74;;;;-1:-1:-1;48812:18:0;;;;:27;48765:74;:127;;;;-1:-1:-1;48864:13:0;;-1:-1:-1;;;;;48864:13:0;48856:36;;48765:127;:169;;;;-1:-1:-1;48909:11:0;;-1:-1:-1;;;;;48909:11:0;:25;;48765:169;:208;;;;-1:-1:-1;48962:11:0;;-1:-1:-1;;;;;48951:22:0;;;48962:11;;48951:22;;48765:208;:258;;;;-1:-1:-1;49009:13:0;;-1:-1:-1;;;;;48990:33:0;;;49009:13;;48990:33;;48765:258;:293;;;;-1:-1:-1;2272:6:0;;-1:-1:-1;;;;;49040:18:0;;;2272:6;;49040:18;;48765:293;:334;;;;-1:-1:-1;;;;;;49075:24:0;;49094:4;49075:24;;48765:334;:380;;;;-1:-1:-1;;;;;;49117:28:0;;;;;;:19;:28;;;;;;;;49116:29;48765:380;:429;;;;-1:-1:-1;;;;;;49163:31:0;;;;;;:19;:31;;;;;;;;49162:32;48765:429;48747:503;;;49221:17;:15;:17::i;:::-;-1:-1:-1;;;;;49267:29:0;;;;;;:20;:29;;;;;;;;49262:145;;49332:19;:17;:19::i;:::-;49321:7;:30;;49313:82;;;;-1:-1:-1;;;49313:82:0;;11674:2:1;49313:82:0;;;11656:21:1;11713:2;11693:18;;;11686:30;11752:34;11732:18;;;11725:62;-1:-1:-1;;;11803:18:1;;;11796:37;11850:19;;49313:82:0;11472:403:1;49313:82:0;-1:-1:-1;;;;;49422:32:0;;;;;;:20;:32;;;;;;;;49417:282;;49489:11;;-1:-1:-1;;;;;49475:25:0;;;49489:11;;49475:25;;;;:65;;-1:-1:-1;49526:13:0;;-1:-1:-1;;;;;49504:36:0;;;49526:13;;49504:36;;49475:65;49471:217;;;49607:17;:15;:17::i;:::-;49569:34;49595:7;49569:21;49579:10;-1:-1:-1;;;;;17431:18:0;17404:7;17431:18;;;;;;;;;;;;17330:127;49569:21;:25;;:34::i;:::-;:55;;49561:111;;;;-1:-1:-1;;;49561:111:0;;12894:2:1;49561:111:0;;;12876:21:1;12933:2;12913:18;;;12906:30;12972:34;12952:18;;;12945:62;-1:-1:-1;;;13023:18:1;;;13016:41;13074:19;;49561:111:0;12692:407:1;49561:111:0;-1:-1:-1;;;;;49715:27:0;;;;;;:18;:27;;;;;;;;49711:1274;;;49759:45;49775:7;49784:10;49796:7;49759:15;:45::i;:::-;48192:2800;;;:::o;49711:1274::-;49852:11;;-1:-1:-1;;;;;49841:22:0;;;49852:11;;49841:22;49837:1137;;;49956:11;;49908:14;;49925:43;;49956:11;-1:-1:-1;;;49956:11:0;;;;;49925:26;;:7;;-1:-1:-1;;;49937:13:0;;;49925:11;:26::i;:43::-;50047:11;;49908:60;;-1:-1:-1;49987:20:0;;50010:49;;50047:11;-1:-1:-1;;;50047:11:0;;;;;50010:32;;:7;;-1:-1:-1;;;50022:19:0;;;50010:11;:32::i;:49::-;50136:11;;49987:72;;-1:-1:-1;50078:19:0;;50100:48;;50136:11;-1:-1:-1;;;50136:11:0;;;;;50100:31;;:7;;-1:-1:-1;;;50112:18:0;;;50100:11;:31::i;:48::-;50078:70;-1:-1:-1;50177:54:0;50189:41;50078:70;50189:24;:6;50200:12;50189:10;:24::i;:41::-;50177:7;;:11;:54::i;:::-;50167:64;;50252:45;50268:7;50277:10;50289:7;50252:15;:45::i;:::-;50316:82;50332:7;50349:4;50356:41;50385:11;50356:24;:6;50367:12;50356:10;:24::i;:41::-;50316:15;:82::i;49837:1137::-;50514:11;;50465:14;;50482:44;;50514:11;-1:-1:-1;;;50514:11:0;;;;;50482:27;;:7;;-1:-1:-1;;;50494:14:0;;;50482:11;:27::i;:44::-;50606:11;;50465:61;;-1:-1:-1;50545:20:0;;50568:50;;50606:11;-1:-1:-1;;;50606:11:0;;;;;50568:33;;:7;;-1:-1:-1;;;50580:20:0;;;50568:11;:33::i;:50::-;50696:11;;50671:19;;50545:73;;-1:-1:-1;50637:19:0;;50659:49;;50696:11;-1:-1:-1;;;50696:11:0;;;;;;50659:32;;:7;;50671:19;6942:98;7000:7;7027:5;7031:1;7027;:5;:::i;7341:98::-;7399:7;7426:5;7430:1;7426;:5;:::i;51856:838::-;45150:18;:25;;-1:-1:-1;;45150:25:0;45171:4;45150:25;;;51963:4:::1;-1:-1:-1::0;17431:18:0;;;;;;;;;;;51914:55:::1;;52012:38;52029:20;52012:16;:38::i;:::-;52168:19;::::0;52145:20:::1;::::0;52077:21:::1;::::0;52063:11:::1;::::0;52168:19:::1;::::0;;::::1;::::0;52128:37:::1;::::0;-1:-1:-1;;;52145:20:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;52128:14:0;;::::1;;:37;:::i;:::-;:59;;;;:::i;:::-;52222:14;::::0;52109:78:::1;::::0;;::::1;::::0;-1:-1:-1;52198:13:0::1;::::0;52214:40:::1;::::0;52109:78;;52214:23:::1;::::0;:3;;-1:-1:-1;;;52222:14:0;;::::1;;52214:7;:23::i;:40::-;52295:20;::::0;52198:56;;-1:-1:-1;52265:19:0::1;::::0;52287:46:::1;::::0;52321:11;;52287:29:::1;::::0;:3;;-1:-1:-1;;;52295:20:0;::::1;;;52287:7;:29::i;:46::-;52373:19;::::0;52265:68;;-1:-1:-1;52344:18:0::1;::::0;52365:45:::1;::::0;52398:11;;52365:28:::1;::::0;:3;;52373:19:::1;;52365:7;:28::i;:45::-;52344:66:::0;-1:-1:-1;52476:3:0;52344:66;52431:25:::1;52442:14:::0;52431:8;:25:::1;:::i;:::-;:41;;;;:::i;:::-;:48;;52423:101;;;::::0;-1:-1:-1;;;52423:101:0;;14479:2:1;52423:101:0::1;::::0;::::1;14461:21:1::0;14518:2;14498:18;;;14491:30;14557:34;14537:18;;;14530:62;-1:-1:-1;;;14608:18:1;;;14601:38;14656:19;;52423:101:0::1;14277:404:1::0;52423:101:0::1;52545:9;::::0;52537:37:::1;::::0;-1:-1:-1;;;;;52545:9:0;;::::1;::::0;52537:37;::::1;;;::::0;52565:8;;52545:9:::1;52537:37:::0;52545:9;52537:37;52565:8;52545:9;52537:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;52593:15:0::1;::::0;52585:49:::1;::::0;-1:-1:-1;;;;;52593:15:0;;::::1;::::0;52585:49;::::1;;;::::0;52619:14;;52593:15:::1;52585:49:::0;52593:15;52585:49;52619:14;52593:15;52585:49;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;52653:8:0::1;::::0;52645:41:::1;::::0;-1:-1:-1;;;;;52653:8:0;;::::1;::::0;52645:41;::::1;;;::::0;52672:13;;52653:8:::1;52645:41:::0;52653:8;52645:41;52672:13;52653:8;52645:41;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;45198:18:0;:26;;-1:-1:-1;;45198:26:0;;;-1:-1:-1;;;;;51856:838:0:o;62878:438::-;-1:-1:-1;;;;;62995:21:0;;;62969:23;62995:21;;;:10;:21;;;;;;;;;;17431:18;;;;;;;63130:21;;;;:33;;;-1:-1:-1;;;;;;63130:33:0;;;;;;;63181:54;;62995:21;;;;;17431:18;;63130:33;;62995:21;;;63181:54;;62969:23;63181:54;63248:60;63263:15;63280:9;63291:16;63248:14;:60::i;:::-;62958:358;;62878:438;;:::o;6204:98::-;6262:7;6289:5;6293:1;6289;:5;:::i;21273:604::-;-1:-1:-1;;;;;21379:20:0;;21371:70;;;;-1:-1:-1;;;21371:70:0;;14888:2:1;21371:70:0;;;14870:21:1;14927:2;14907:18;;;14900:30;14966:34;14946:18;;;14939:62;-1:-1:-1;;;15017:18:1;;;15010:35;15062:19;;21371:70:0;14686:401:1;21371:70:0;-1:-1:-1;;;;;21460:23:0;;21452:71;;;;-1:-1:-1;;;21452:71:0;;8894:2:1;21452:71:0;;;8876:21:1;8933:2;8913:18;;;8906:30;8972:34;8952:18;;;8945:62;-1:-1:-1;;;9023:18:1;;;9016:33;9066:19;;21452:71:0;8692:399:1;21452:71:0;-1:-1:-1;;;;;21620:17:0;;21596:21;21620:17;;;;;;;;;;;21656:23;;;;21648:74;;;;-1:-1:-1;;;21648:74:0;;12487:2:1;21648:74:0;;;12469:21:1;12526:2;12506:18;;;12499:30;12565:34;12545:18;;;12538:62;-1:-1:-1;;;12616:18:1;;;12609:36;12662:19;;21648:74:0;12285:402:1;21648:74:0;21753:22;21769:6;21753:13;:22;:::i;:::-;-1:-1:-1;;;;;21733:17:0;;;:9;:17;;;;;;;;;;;:42;;;;21786:20;;;;;;;;:30;;21810:6;;21733:9;21786:30;;21810:6;;21786:30;:::i;:::-;;;;;;;;21851:9;-1:-1:-1;;;;;21834:35:0;21843:6;-1:-1:-1;;;;;21834:35:0;;21862:6;21834:35;;;;6572:25:1;;6560:2;6545:18;;6426:177;21834:35:0;;;;;;;;21360:517;21273:604;;;:::o;6585:98::-;6643:7;6670:5;6674:1;6670;:5;:::i;52736:596::-;52890:16;;;52904:1;52890:16;;;;;;;;52866:21;;52890:16;;;;;;;;;;-1:-1:-1;52890:16:0;52866:40;;52935:4;52917;52922:1;52917:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52917:23:0;;;:7;;;;;;;;;;:23;;;;52961:13;;:20;;;-1:-1:-1;;;52961:20:0;;;;:13;;;;;:18;;:20;;;;;52917:7;;52961:20;;;;;:13;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52951:4;52956:1;52951:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;52951:30:0;;;:7;;;;;;;;;:30;53026:13;;52994:60;;53011:4;;53026:13;53042:11;52994:8;:60::i;:::-;53093:13;;-1:-1:-1;;;;;53093:13:0;:64;53172:11;53093:13;53242:4;53269;53289:24;:15;53307:6;53289:24;:::i;:::-;53093:231;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63324:947;63430:6;-1:-1:-1;;;;;63420:16:0;:6;-1:-1:-1;;;;;63420:16:0;;;:30;;;;;63449:1;63440:6;:10;63420:30;63416:848;;;-1:-1:-1;;;;;63471:20:0;;;63467:385;;-1:-1:-1;;;;;63579:22:0;;63560:16;63579:22;;;:14;:22;;;;;;;;;63640:13;:60;;63699:1;63640:60;;;-1:-1:-1;;;;;63656:19:0;;;;;;:11;:19;;;;;;63676:13;63688:1;63676:9;:13;:::i;:::-;63656:34;;;;;;;;;;;;;;;:40;;;63640:60;63620:80;-1:-1:-1;63719:17:0;63739:21;63620:80;63753:6;63739:13;:21::i;:::-;63719:41;;63779:57;63796:6;63804:9;63815;63826;63779:16;:57::i;:::-;63493:359;;;63467:385;-1:-1:-1;;;;;63872:20:0;;;63868:385;;-1:-1:-1;;;;;63980:22:0;;63961:16;63980:22;;;:14;:22;;;;;;;;;64041:13;:60;;64100:1;64041:60;;;-1:-1:-1;;;;;64057:19:0;;;;;;:11;:19;;;;;;64077:13;64089:1;64077:9;:13;:::i;:::-;64057:34;;;;;;;;;;;;;;;:40;;;64041:60;64021:80;-1:-1:-1;64120:17:0;64140:21;64021:80;64154:6;64140:13;:21::i;:::-;64120:41;;64180:57;64197:6;64205:9;64216;64227;64279:704;64458:18;64479:76;64486:12;64479:76;;;;;;;;;;;;;;;;;:6;:76::i;:::-;64458:97;;64587:1;64572:12;:16;;;:85;;;;-1:-1:-1;;;;;;64592:22:0;;;;;;:11;:22;;;;;:65;;;;64615:16;64630:1;64615:12;:16;:::i;:::-;64592:40;;;;;;;;;;;;;;;-1:-1:-1;64592:40:0;:50;;:65;64572:85;64568:339;;;-1:-1:-1;;;;;64674:22:0;;;;;;:11;:22;;;;;64723:8;;64697:16;64712:1;64697:12;:16;:::i;:::-;64674:40;;;;;;;;;;;;;-1:-1:-1;64674:40:0;:46;;:57;64568:339;;;64803:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;64764:22:0;;-1:-1:-1;64764:22:0;;;:11;:22;;;;;:36;;;;;;;;;;;:72;;;;-1:-1:-1;;64764:72:0;;;;;;;;-1:-1:-1;64764:72:0;;;;64879:16;;64764:36;;64879:16;:::i;:::-;-1:-1:-1;;;;;64851:25:0;;;;;;:14;:25;;;;;:44;;-1:-1:-1;;64851:44:0;;;;;;;;;;;;64568:339;64924:51;;;18874:25:1;;;18930:2;18915:18;;18908:34;;;-1:-1:-1;;;;;64924:51:0;;;;;18847:18:1;64924:51:0;;;;;;;64447:536;64279:704;;;;:::o;64991:161::-;65066:6;65104:12;65097:5;65093:9;;65085:32;;;;-1:-1:-1;;;65085:32:0;;;;;;;;:::i;:::-;-1:-1:-1;65142:1:0;;64991:161;-1:-1:-1;;64991:161:0:o;14:134:1:-;82:20;;111:31;82:20;111:31;:::i;:::-;14:134;;;:::o;153:160::-;218:20;;274:13;;267:21;257:32;;247:60;;303:1;300;293:12;318:159;385:20;;445:6;434:18;;424:29;;414:57;;467:1;464;457:12;482:247;541:6;594:2;582:9;573:7;569:23;565:32;562:52;;;610:1;607;600:12;562:52;649:9;636:23;668:31;693:5;668:31;:::i;734:251::-;804:6;857:2;845:9;836:7;832:23;828:32;825:52;;;873:1;870;863:12;825:52;905:9;899:16;924:31;949:5;924:31;:::i;990:388::-;1058:6;1066;1119:2;1107:9;1098:7;1094:23;1090:32;1087:52;;;1135:1;1132;1125:12;1087:52;1174:9;1161:23;1193:31;1218:5;1193:31;:::i;:::-;1243:5;-1:-1:-1;1300:2:1;1285:18;;1272:32;1313:33;1272:32;1313:33;:::i;:::-;1365:7;1355:17;;;990:388;;;;;:::o;1383:456::-;1460:6;1468;1476;1529:2;1517:9;1508:7;1504:23;1500:32;1497:52;;;1545:1;1542;1535:12;1497:52;1584:9;1571:23;1603:31;1628:5;1603:31;:::i;:::-;1653:5;-1:-1:-1;1710:2:1;1695:18;;1682:32;1723:33;1682:32;1723:33;:::i;:::-;1383:456;;1775:7;;-1:-1:-1;;;1829:2:1;1814:18;;;;1801:32;;1383:456::o;1844:315::-;1909:6;1917;1970:2;1958:9;1949:7;1945:23;1941:32;1938:52;;;1986:1;1983;1976:12;1938:52;2025:9;2012:23;2044:31;2069:5;2044:31;:::i;:::-;2094:5;-1:-1:-1;2118:35:1;2149:2;2134:18;;2118:35;:::i;:::-;2108:45;;1844:315;;;;;:::o;2164:::-;2232:6;2240;2293:2;2281:9;2272:7;2268:23;2264:32;2261:52;;;2309:1;2306;2299:12;2261:52;2348:9;2335:23;2367:31;2392:5;2367:31;:::i;:::-;2417:5;2469:2;2454:18;;;;2441:32;;-1:-1:-1;;;2164:315:1:o;2484:687::-;2586:6;2594;2602;2610;2618;2626;2679:3;2667:9;2658:7;2654:23;2650:33;2647:53;;;2696:1;2693;2686:12;2647:53;2735:9;2722:23;2754:31;2779:5;2754:31;:::i;:::-;2804:5;-1:-1:-1;2856:2:1;2841:18;;2828:32;;-1:-1:-1;2907:2:1;2892:18;;2879:32;;-1:-1:-1;2963:2:1;2948:18;;2935:32;3011:4;2998:18;;2986:31;;2976:59;;3031:1;3028;3021:12;2976:59;2484:687;;;;-1:-1:-1;2484:687:1;;3108:3;3093:19;;3080:33;;3160:3;3145:19;;;3132:33;;-1:-1:-1;2484:687:1;-1:-1:-1;;2484:687:1:o;3176:419::-;3243:6;3251;3304:2;3292:9;3283:7;3279:23;3275:32;3272:52;;;3320:1;3317;3310:12;3272:52;3359:9;3346:23;3378:31;3403:5;3378:31;:::i;:::-;3428:5;-1:-1:-1;3485:2:1;3470:18;;3457:32;3533:10;3520:24;;3508:37;;3498:65;;3559:1;3556;3549:12;3600:1132;3684:6;3715:2;3758;3746:9;3737:7;3733:23;3729:32;3726:52;;;3774:1;3771;3764:12;3726:52;3814:9;3801:23;3843:18;3884:2;3876:6;3873:14;3870:34;;;3900:1;3897;3890:12;3870:34;3938:6;3927:9;3923:22;3913:32;;3983:7;3976:4;3972:2;3968:13;3964:27;3954:55;;4005:1;4002;3995:12;3954:55;4041:2;4028:16;4063:2;4059;4056:10;4053:36;;;4069:18;;:::i;:::-;4115:2;4112:1;4108:10;4147:2;4141:9;4210:2;4206:7;4201:2;4197;4193:11;4189:25;4181:6;4177:38;4265:6;4253:10;4250:22;4245:2;4233:10;4230:18;4227:46;4224:72;;;4276:18;;:::i;:::-;4312:2;4305:22;4362:18;;;4396:15;;;;-1:-1:-1;4431:11:1;;;4461;;;4457:20;;4454:33;-1:-1:-1;4451:53:1;;;4500:1;4497;4490:12;4451:53;4522:1;4513:10;;4532:169;4546:2;4543:1;4540:9;4532:169;;;4603:23;4622:3;4603:23;:::i;:::-;4591:36;;4564:1;4557:9;;;;;4647:12;;;;4679;;4532:169;;;-1:-1:-1;4720:6:1;3600:1132;-1:-1:-1;;;;;;;;3600:1132:1:o;4737:180::-;4793:6;4846:2;4834:9;4825:7;4821:23;4817:32;4814:52;;;4862:1;4859;4852:12;4814:52;4885:26;4901:9;4885:26;:::i;4922:184::-;4980:6;5033:2;5021:9;5012:7;5008:23;5004:32;5001:52;;;5049:1;5046;5039:12;5001:52;5072:28;5090:9;5072:28;:::i;5111:328::-;5185:6;5193;5201;5254:2;5242:9;5233:7;5229:23;5225:32;5222:52;;;5270:1;5267;5260:12;5222:52;5293:28;5311:9;5293:28;:::i;:::-;5283:38;;5340:37;5373:2;5362:9;5358:18;5340:37;:::i;:::-;5330:47;;5396:37;5429:2;5418:9;5414:18;5396:37;:::i;:::-;5386:47;;5111:328;;;;;:::o;5444:180::-;5503:6;5556:2;5544:9;5535:7;5531:23;5527:32;5524:52;;;5572:1;5569;5562:12;5524:52;-1:-1:-1;5595:23:1;;5444:180;-1:-1:-1;5444:180:1:o;8090:597::-;8202:4;8231:2;8260;8249:9;8242:21;8292:6;8286:13;8335:6;8330:2;8319:9;8315:18;8308:34;8360:1;8370:140;8384:6;8381:1;8378:13;8370:140;;;8479:14;;;8475:23;;8469:30;8445:17;;;8464:2;8441:26;8434:66;8399:10;;8370:140;;;8528:6;8525:1;8522:13;8519:91;;;8598:1;8593:2;8584:6;8573:9;8569:22;8565:31;8558:42;8519:91;-1:-1:-1;8671:2:1;8650:15;-1:-1:-1;;8646:29:1;8631:45;;;;8678:2;8627:54;;8090:597;-1:-1:-1;;;8090:597:1:o;9917:332::-;10119:2;10101:21;;;10158:1;10138:18;;;10131:29;-1:-1:-1;;;10191:2:1;10176:18;;10169:39;10240:2;10225:18;;9917:332::o;13916:356::-;14118:2;14100:21;;;14137:18;;;14130:30;14196:34;14191:2;14176:18;;14169:62;14263:2;14248:18;;13916:356::o;17715:980::-;17977:4;18025:3;18014:9;18010:19;18056:6;18045:9;18038:25;18082:2;18120:6;18115:2;18104:9;18100:18;18093:34;18163:3;18158:2;18147:9;18143:18;18136:31;18187:6;18222;18216:13;18253:6;18245;18238:22;18291:3;18280:9;18276:19;18269:26;;18330:2;18322:6;18318:15;18304:29;;18351:1;18361:195;18375:6;18372:1;18369:13;18361:195;;;18440:13;;-1:-1:-1;;;;;18436:39:1;18424:52;;18531:15;;;;18496:12;;;;18472:1;18390:9;18361:195;;;-1:-1:-1;;;;;;;18612:32:1;;;;18607:2;18592:18;;18585:60;-1:-1:-1;;;18676:3:1;18661:19;18654:35;18573:3;17715:980;-1:-1:-1;;;17715:980:1:o;19607:224::-;19646:3;19674:6;19707:2;19704:1;19700:10;19737:2;19734:1;19730:10;19768:3;19764:2;19760:12;19755:3;19752:21;19749:47;;;19776:18;;:::i;:::-;19812:13;;19607:224;-1:-1:-1;;;;19607:224:1:o;19836:128::-;19876:3;19907:1;19903:6;19900:1;19897:13;19894:39;;;19913:18;;:::i;:::-;-1:-1:-1;19949:9:1;;19836:128::o;19969:228::-;20008:3;20036:10;20073:2;20070:1;20066:10;20103:2;20100:1;20096:10;20134:3;20130:2;20126:12;20121:3;20118:21;20115:47;;;20142:18;;:::i;20202:120::-;20242:1;20268;20258:35;;20273:18;;:::i;:::-;-1:-1:-1;20307:9:1;;20202:120::o;20327:191::-;20366:1;20392:10;20429:2;20426:1;20422:10;20451:3;20441:37;;20458:18;;:::i;:::-;20496:10;;20492:20;;;;;20327:191;-1:-1:-1;;20327:191:1:o;20523:168::-;20563:7;20629:1;20625;20621:6;20617:14;20614:1;20611:21;20606:1;20599:9;20592:17;20588:45;20585:71;;;20636:18;;:::i;:::-;-1:-1:-1;20676:9:1;;20523:168::o;20696:125::-;20736:4;20764:1;20761;20758:8;20755:34;;;20769:18;;:::i;:::-;-1:-1:-1;20806:9:1;;20696:125::o;20826:221::-;20865:4;20894:10;20954;;;;20924;;20976:12;;;20973:38;;;20991:18;;:::i;:::-;21028:13;;20826:221;-1:-1:-1;;;20826:221:1:o;21052:380::-;21131:1;21127:12;;;;21174;;;21195:61;;21249:4;21241:6;21237:17;21227:27;;21195:61;21302:2;21294:6;21291:14;21271:18;21268:38;21265:161;;;21348:10;21343:3;21339:20;21336:1;21329:31;21383:4;21380:1;21373:15;21411:4;21408:1;21401:15;21265:161;;21052:380;;;:::o;21437:197::-;21475:3;21503:6;21544:2;21537:5;21533:14;21571:2;21562:7;21559:15;21556:41;;;21577:18;;:::i;:::-;21626:1;21613:15;;21437:197;-1:-1:-1;;;21437:197:1:o;21639:135::-;21678:3;-1:-1:-1;;21699:17:1;;21696:43;;;21719:18;;:::i;:::-;-1:-1:-1;21766:1:1;21755:13;;21639:135::o;21779:127::-;21840:10;21835:3;21831:20;21828:1;21821:31;21871:4;21868:1;21861:15;21895:4;21892:1;21885:15;21911:127;21972:10;21967:3;21963:20;21960:1;21953:31;22003:4;22000:1;21993:15;22027:4;22024:1;22017:15;22043:127;22104:10;22099:3;22095:20;22092:1;22085:31;22135:4;22132:1;22125:15;22159:4;22156:1;22149:15;22175:127;22236:10;22231:3;22227:20;22224:1;22217:31;22267:4;22264:1;22257:15;22291:4;22288:1;22281:15;22307:131;-1:-1:-1;;;;;22382:31:1;;22372:42;;22362:70;;22428:1;22425;22418:12

Swarm Source

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