ETH Price: $3,148.42 (+0.93%)
Gas: 3 Gwei

Token

Distributed Nodes Network (SAROS)
 

Overview

Max Total Supply

1,000,000,000 SAROS

Holders

56

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
2,774,665.349165283074555741 SAROS

Value
$0.00
0xbF02724bB3868116402Bda6eD4a7FBaCeCFBaE68
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:
SAROS

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-04-13
*/

/**


Saros: Where privacy meets innovation for ultimate online protection.

Discover the future of online privacy with Saros Node – the decentralized VPN 
redefining security. With advanced features like Proof-of-Bandwidth Consensus 
and Built-in Tor Integration keep your data secure and your browsing anonymous. 

                                         ,----..               
  .--.--.      ,---,       ,-.----.     /   /   \   .--.--.    
 /  /    '.   '  .' \      \    /  \   /   .     : /  /    '.  
|  :  /`. /  /  ;    '.    ;   :    \ .   /   ;.  \  :  /`. /  
;  |  |--`  :  :       \   |   | .\ :.   ;   /  ` ;  |  |--`   
|  :  ;_    :  |   /\   \  .   : |: |;   |  ; \ ; |  :  ;_     
 \  \    `. |  :  ' ;.   : |   |  \ :|   :  | ; | '\  \    `.  
  `----.   \|  |  ;/  \   \|   : .  /.   |  ' ' ' : `----.   \ 
  __ \  \  |'  :  | \  \ ,';   | |  \'   ;  \; /  | __ \  \  | 
 /  /`--'  /|  |  '  '--'  |   | ;\  \\   \  ',  / /  /`--'  / 
'--'.     / |  :  :        :   ' | \.' ;   :    / '--'.     /  
  `--'---'  |  | ,'        :   : :-'    \   \ .'    `--'---'   
            `--''          |   |.'       `---`                 
                           `---'                               

    Website: https://saros.network
    Telegram: https://t.me/SAROS_DNP
    Twitter:  https://twitter.com/SAROS_DNP
    Gitbook : https://saros.gitbook.io/saros-docs/

**/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
pragma experimental ABIEncoderV2;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev 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 {
        _transferOwnership(address(0));
    }

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

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

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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");
        unchecked {
            _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");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

        _afterTokenTransfer(address(0), account, amount);
    }

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

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

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

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

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

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

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

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

    /**
     * @dev Returns the 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. 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;
        }
    }
}

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 setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

////// src/IUniswapV2Pair.sol
/* pragma solidity 0.8.10; */
/* pragma experimental ABIEncoderV2; */

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

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

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

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(
        address indexed sender,
        uint256 amount0,
        uint256 amount1,
        address indexed to
    );
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to)
        external
        returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

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

contract SAROS is ERC20, Ownable {
    using SafeMath for uint256;

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);

    bool private swapping;

    address public LPStakingRewardsWallet;
    address public LPStakingRewards1Wallet;
    address public endpointWallet;
    address public FreeendpointWallet;
    address public marketingWT;
    address public treasuryWT;

    uint256 public maxTransactionAmount;
    uint256 public swapTokensAtAmount;
    uint256 public maxWallet;

    bool public limitsInEffect = true;
    bool public tradingActive = false;
    bool public swapEnabled = false;

    uint256 public buyTotalFees;
    uint256 public buyLPStakingRewardsFee;
    uint256 public buyLPStakingRewards1Fee;
    uint256 public buyendpointFee;
    uint256 public buyFreeendpointFee;
    uint256 public buymarketingWTFee;
    uint256 public buyLiquidityFee;
    uint256 public buytreasuryWTFee;

    uint256 public sellTotalFees;
    uint256 public sellLPStakingRewardsFee;
    uint256 public sellLPStakingRewards1Fee;
    uint256 public sellendpointFee;
    uint256 public sellFreeendpointFee;
    uint256 public sellmarketingWTFee;
    uint256 public sellLiquidityFee;
    uint256 public selltreasuryWTFee;

    uint256 public tokensForLPStakingRewards;
    uint256 public tokensForLPStakingRewards1;
    uint256 public tokensForendpoint;
    uint256 public tokensForFreeendpoint;
    uint256 public tokensFormarketingWT;
    uint256 public tokensForLiquidity;
    uint256 public tokensFortreasuryWT;

    mapping(address => bool) public whitelist;

    /******************/

    // exclude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    // store addresses that a automatic market maker pairs. Any transfer *to* these addresses
    // could be subject to a maximum transfer amount
    mapping(address => bool) public automatedMarketMakerPairs;

    bool public preMigrationPhase = true;
    mapping(address => bool) public preMigrationTransferrable;

    event UpdateUniswapV2Router(
        address indexed newAddress,
        address indexed oldAddress
    );

    event ExcludeFromFees(address indexed account, bool isExcluded);

    event SetAutomatedMarketMakerPair(address indexed pair, bool indexed value);

    event LPStakingRewardsWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event LPStakingRewards1WalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event endpointWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event FreeendpointWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event marketingWTUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event treasuryWTUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    event SwapAndLiquify(
        uint256 tokensSwapped,
        uint256 ethReceived,
        uint256 tokensIntoLiquidity
    );

    constructor() ERC20("Distributed Nodes Network", "SAROS") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), _uniswapV2Router.WETH());
        excludeFromMaxTransaction(address(uniswapV2Pair), true);
        _setAutomatedMarketMakerPair(address(uniswapV2Pair), true);

        uint256 _buyLPStakingRewardsFee = 0;
        uint256 _buyLPStakingRewards1Fee = 0;
        uint256 _buyendpointFee = 0;
        uint256 _buyFreeendpointFee = 0;
        uint256 _buymarketingWTFee = 15;
        uint256 _buyLiquidityFee = 0;
        uint256 _buytreasuryWTFee = 15;

        uint256 _sellLPStakingRewardsFee = 0;
        uint256 _sellLPStakingRewards1Fee = 0;
        uint256 _sellendpointFee = 0;
        uint256 _sellFreeendpointFee = 0;
        uint256 _sellmarketingWTFee = 15;
        uint256 _sellLiquidityFee = 0;
        uint256 _selltreasuryWTFee = 15;

        uint256 totalSupply = 1_000_000_000 * 1e18;

        maxTransactionAmount = 10_000_000 * 1e18; // 1%
        maxWallet = 10_000_000 * 1e18; // 1% 
        swapTokensAtAmount = (totalSupply * 5) / 10000; // 0.05% 

        buyLPStakingRewardsFee = _buyLPStakingRewardsFee;
        buyLPStakingRewards1Fee = _buyLPStakingRewards1Fee;
        buyendpointFee = _buyendpointFee;
        buyFreeendpointFee = _buyFreeendpointFee;
        buymarketingWTFee = _buymarketingWTFee;
        buyLiquidityFee = _buyLiquidityFee;
        buytreasuryWTFee = _buytreasuryWTFee;
        buyTotalFees = buyLPStakingRewardsFee + buyLPStakingRewards1Fee + buyendpointFee + buyFreeendpointFee + buymarketingWTFee + buyLiquidityFee + buytreasuryWTFee;

        sellLPStakingRewardsFee = _sellLPStakingRewardsFee;
        sellLPStakingRewards1Fee = _sellLPStakingRewards1Fee;
        sellendpointFee = _sellendpointFee;
        sellFreeendpointFee = _sellFreeendpointFee;
        sellmarketingWTFee = _sellmarketingWTFee;
        sellLiquidityFee = _sellLiquidityFee;
        selltreasuryWTFee = _selltreasuryWTFee;
        sellTotalFees = sellLPStakingRewardsFee + sellLPStakingRewards1Fee + sellendpointFee + sellFreeendpointFee + sellmarketingWTFee + sellLiquidityFee + selltreasuryWTFee;

        LPStakingRewardsWallet = address(0x985D670B1Aebdd298685A0f26F135B8bdDd7d575);
        LPStakingRewards1Wallet = address(0x985D670B1Aebdd298685A0f26F135B8bdDd7d575);
        endpointWallet = address(0x52354B7DcAaebdaace35cb2D5c11e83BB917bD09);
        FreeendpointWallet = address(msg.sender);
        marketingWT = address(0x6d7AeD612ad5B97Be18386828e01b14Ac0A5D31A); // set as LPStakingRewards wallet
        treasuryWT = address(0xc591f5A4D2612b6EdB7F58Ebb9c2c85f73332723); // set as treasuryWT wallet

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);

        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);

        preMigrationTransferrable[owner()] = true;

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
    }

    receive() external payable {}

    // once enabled, can never be turned off
    function enableTrading() external onlyOwner {
        tradingActive = true;
        swapEnabled = true;
        preMigrationPhase = false;
    }

    // remove limits after token is stable
    function removeLimits() external onlyOwner returns (bool) {
        limitsInEffect = false;
        return true;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwner
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function updateMaxTxnAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 999) / 1000) / 1e18,
            "Cannot set maxTransactionAmount lower than 0.5%"
        );
        maxTransactionAmount = newNum * (10**18);
    }

    function updateMaxWalletAmount(uint256 newNum) external onlyOwner {
        require(
            newNum >= ((totalSupply() * 999) / 1000) / 1e18,
            "Cannot set maxWallet lower than 1.0%"
        );
        maxWallet = newNum * (10**18);
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwner
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwner {
        swapEnabled = enabled;
    }

    function updateBuyFees(
        uint256 _LPStakingRewardsFee,
        uint256 _LPStakingRewards1Fee,
        uint256 _endpointFee,
        uint256 _FreeendpointFee,
        uint256 _marketingWTFee,
        uint256 _liquidityFee,
        uint256 _treasuryWTFee
    ) external onlyOwner {
        buyLPStakingRewardsFee = _LPStakingRewardsFee;
        buyLPStakingRewards1Fee = _LPStakingRewards1Fee;
        buyendpointFee = _endpointFee;
        buyFreeendpointFee = _FreeendpointFee;
        buymarketingWTFee = _marketingWTFee;
        buyLiquidityFee = _liquidityFee;
        buytreasuryWTFee = _treasuryWTFee;
        buyTotalFees = buyLPStakingRewardsFee + buyLPStakingRewardsFee + buyendpointFee + buyFreeendpointFee + buymarketingWTFee + buyLiquidityFee + buytreasuryWTFee;
        require(buyTotalFees <= 20, "Buy fees must be <= 20.");
    }

    function updateSellFees(
        uint256 _LPStakingRewardsFee,
        uint256 _LPStakingRewards1Fee,
        uint256 _endpointFee,
        uint256 _FreeendpointFee,
        uint256 _marketingWTFee,
        uint256 _liquidityFee,
        uint256 _treasuryWTFee
    ) external onlyOwner {
        sellLPStakingRewardsFee = _LPStakingRewardsFee;
        sellLPStakingRewards1Fee = _LPStakingRewards1Fee;
        sellendpointFee = _endpointFee;
        sellFreeendpointFee = _FreeendpointFee;
        sellmarketingWTFee = _marketingWTFee;
        sellLiquidityFee = _liquidityFee;
        selltreasuryWTFee = _treasuryWTFee;
        sellTotalFees = sellLPStakingRewardsFee + sellLPStakingRewards1Fee + sellendpointFee + sellFreeendpointFee + sellmarketingWTFee + sellLiquidityFee + selltreasuryWTFee;
        require(sellTotalFees <= 20, "Sell fees must be <= 20.");
    }

    function excludeFromFees(address account, bool excluded) public onlyOwner {
        _isExcludedFromFees[account] = excluded;
        emit ExcludeFromFees(account, excluded);
    }

    function setAutomatedMarketMakerPair(address pair, bool value)
        public
        onlyOwner
    {
        require(
            pair != uniswapV2Pair,
            "The pair cannot be removed from automatedMarketMakerPairs"
        );

        _setAutomatedMarketMakerPair(pair, value);
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        automatedMarketMakerPairs[pair] = value;

        emit SetAutomatedMarketMakerPair(pair, value);
    }

    function updateLPStakingRewardsWallet(address newLPStakingRewardsWallet) external onlyOwner {
        emit LPStakingRewardsWalletUpdated(newLPStakingRewardsWallet, LPStakingRewardsWallet);
        LPStakingRewardsWallet = newLPStakingRewardsWallet;
    }

    function updateLPStakingRewards1Wallet(address newLPStakingRewards1Wallet) external onlyOwner {
        emit LPStakingRewards1WalletUpdated(newLPStakingRewards1Wallet, LPStakingRewards1Wallet);
        LPStakingRewards1Wallet = newLPStakingRewards1Wallet;
    }

    function updateendpointWallet(address newendpointWallet) external onlyOwner {
        emit endpointWalletUpdated(newendpointWallet, endpointWallet);
        endpointWallet = newendpointWallet;
    }

    function updateFreeendpointWallet(address newFreeendpointWallet) external onlyOwner {
        emit FreeendpointWalletUpdated(newFreeendpointWallet, FreeendpointWallet);
        FreeendpointWallet = newFreeendpointWallet;
    }

    function updatemarketingWT(address newmarketingWT) external onlyOwner {
        emit marketingWTUpdated(newmarketingWT, marketingWT);
        marketingWT = newmarketingWT;
    }

    function updatetreasuryWT(address newWallet) external onlyOwner {
        emit treasuryWTUpdated(newWallet, treasuryWT);
        treasuryWT = newWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function addToWhitelist(address[] memory addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = true;
        }
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (preMigrationPhase) {
            require(preMigrationTransferrable[from], "Not authorized to transfer pre-migration.");
        }

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (limitsInEffect) {
            if (
                from != owner() &&
                to != owner() &&
                to != address(0) &&
                to != address(0xdead) &&
                !swapping
            ) {
                if (!tradingActive) {
                    require(
                        _isExcludedFromFees[from] || _isExcludedFromFees[to],
                        "Trading is not active."
                    );
                }

                //when buy
                if (
                    automatedMarketMakerPairs[from] &&
                    !_isExcludedMaxTransactionAmount[to]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Buy transfer amount exceeds the maxTransactionAmount."
                    );
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
                //when sell
                else if (
                    automatedMarketMakerPairs[to] &&
                    !_isExcludedMaxTransactionAmount[from]
                ) {
                    require(
                        amount <= maxTransactionAmount,
                        "Sell transfer amount exceeds the maxTransactionAmount."
                    );
                } else if (!_isExcludedMaxTransactionAmount[to]) {
                    require(
                        amount + balanceOf(to) <= maxWallet,
                        "Max wallet exceeded"
                    );
                }
            }
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            !automatedMarketMakerPairs[from] &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

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

        uint256 fees = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (automatedMarketMakerPairs[to] && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity += (fees * sellLiquidityFee) / sellTotalFees;
                tokensFortreasuryWT += (fees * selltreasuryWTFee) / sellTotalFees;
                tokensForLPStakingRewards += (fees * sellLPStakingRewardsFee) / sellTotalFees;
                tokensForendpoint += (fees * sellendpointFee) / sellTotalFees;
                tokensForFreeendpoint += (fees * sellFreeendpointFee) / sellTotalFees;
                tokensFormarketingWT += (fees * sellmarketingWTFee) / sellTotalFees;
            }
            // on buy
            else if (automatedMarketMakerPairs[from] && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity += (fees * buyLiquidityFee) / buyTotalFees;
                tokensFortreasuryWT += (fees * buytreasuryWTFee) / buyTotalFees;
                tokensForLPStakingRewards += (fees * buyLPStakingRewardsFee) / buyTotalFees;
                tokensForendpoint += (fees * buyendpointFee) / buyTotalFees;
                tokensForFreeendpoint += (fees * buyFreeendpointFee) / buyTotalFees;
                tokensFormarketingWT += (fees * buymarketingWTFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }

            amount -= fees;
        }

        super._transfer(from, to, amount);
    }

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

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

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

    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // add the liquidity
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            owner(),
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 totalTokensToSwap = tokensForLiquidity +
            tokensForLPStakingRewards +
            tokensForendpoint +
            tokensForFreeendpoint +
            tokensFormarketingWT +
            tokensFortreasuryWT;
        bool success;

        if (contractBalance == 0 || totalTokensToSwap == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        // Halve the amount of liquidity tokens
        uint256 liquidityTokens = (contractBalance * tokensForLiquidity) /
            totalTokensToSwap /
            2;
        uint256 amountToSwapForETH = contractBalance.sub(liquidityTokens);

        uint256 initialETHBalance = address(this).balance;

        swapTokensForEth(amountToSwapForETH);

        uint256 ethBalance = address(this).balance.sub(initialETHBalance);

        uint256 ethForLPStakingRewards = ethBalance.mul(tokensForLPStakingRewards).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethForLPStakingRewards1 = ethBalance.mul(tokensForLPStakingRewards1).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethForendpoint = ethBalance.mul(tokensForendpoint).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethFormarketingWT = ethBalance.mul(tokensFormarketingWT).div(totalTokensToSwap - (tokensForLiquidity / 2));
        
        uint256 ethFortreasuryWT = ethBalance.mul(tokensFortreasuryWT).div(totalTokensToSwap - (tokensForLiquidity / 2));

        uint256 ethForLiquidity = ethBalance - ethForLPStakingRewards - ethForLPStakingRewards1 - ethForendpoint - ethForendpoint - ethFormarketingWT - ethFortreasuryWT;

        tokensForLiquidity = 0;
        tokensForLPStakingRewards = 0;
        tokensForLPStakingRewards1 = 0;
        tokensForendpoint = 0;
        tokensForFreeendpoint = 0;
        tokensFormarketingWT = 0;
        tokensFortreasuryWT = 0;

        (success, ) = address(treasuryWT).call{value: ethFortreasuryWT}("");

        if (liquidityTokens > 0 && ethForLiquidity > 0) {
            addLiquidity(liquidityTokens, ethForLiquidity);
            emit SwapAndLiquify(
                amountToSwapForETH,
                ethForLiquidity,
                tokensForLiquidity
            );
        }

        (success, ) = address(LPStakingRewardsWallet).call{value: address(this).balance}("");
        
    }

    function withdrawStuckNODIFI() external onlyOwner {
        uint256 balance = IERC20(address(this)).balanceOf(address(this));
        IERC20(address(this)).transfer(msg.sender, balance);
        payable(msg.sender).transfer(address(this).balance);
    }

    function withdrawStuckToken(address _token, address _to) external onlyOwner {
        require(_token != address(0), "_token address cannot be 0");
        uint256 _contractBalance = IERC20(_token).balanceOf(address(this));
        IERC20(_token).transfer(_to, _contractBalance);
    }

    function sendStuckTokens() external onlyOwner {
        bool success;
        (success,) = address(treasuryWT).call{value : address(this).balance}("");
    }
    
    function withdrawStuckEth(address toAddr) external onlyOwner {
        (bool success, ) = toAddr.call{
            value: address(this).balance
        } ("");
        require(success);
    }

    function disableHoldingLimit() external onlyOwner {
        maxWallet = 0;
    }

    function setPreMigrationTransferable(address _addr, bool isAuthorized) public onlyOwner {
        preMigrationTransferrable[_addr] = isAuthorized;
        excludeFromFees(_addr, isAuthorized);
        excludeFromMaxTransaction(_addr, isAuthorized);
    }
}

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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"FreeendpointWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"LPStakingRewards1WalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"LPStakingRewardsWalletUpdated","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":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"SetAutomatedMarketMakerPair","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiquidity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UpdateUniswapV2Router","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"endpointWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"marketingWTUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"treasuryWTUpdated","type":"event"},{"inputs":[],"name":"FreeendpointWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LPStakingRewards1Wallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LPStakingRewardsWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFreeendpointFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLPStakingRewards1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLPStakingRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyendpointFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buymarketingWTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buytreasuryWTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"disableHoldingLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endpointWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitsInEffect","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preMigrationPhase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"preMigrationTransferrable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellFreeendpointFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLPStakingRewards1Fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLPStakingRewardsFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellendpointFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellmarketingWTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"selltreasuryWTFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sendStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAutomatedMarketMakerPair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"bool","name":"isAuthorized","type":"bool"}],"name":"setPreMigrationTransferable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForFreeendpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLPStakingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLPStakingRewards1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForLiquidity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForendpoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensFormarketingWT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensFortreasuryWT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LPStakingRewardsFee","type":"uint256"},{"internalType":"uint256","name":"_LPStakingRewards1Fee","type":"uint256"},{"internalType":"uint256","name":"_endpointFee","type":"uint256"},{"internalType":"uint256","name":"_FreeendpointFee","type":"uint256"},{"internalType":"uint256","name":"_marketingWTFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryWTFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFreeendpointWallet","type":"address"}],"name":"updateFreeendpointWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLPStakingRewards1Wallet","type":"address"}],"name":"updateLPStakingRewards1Wallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLPStakingRewardsWallet","type":"address"}],"name":"updateLPStakingRewardsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxTxnAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newNum","type":"uint256"}],"name":"updateMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_LPStakingRewardsFee","type":"uint256"},{"internalType":"uint256","name":"_LPStakingRewards1Fee","type":"uint256"},{"internalType":"uint256","name":"_endpointFee","type":"uint256"},{"internalType":"uint256","name":"_FreeendpointFee","type":"uint256"},{"internalType":"uint256","name":"_marketingWTFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"},{"internalType":"uint256","name":"_treasuryWTFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newendpointWallet","type":"address"}],"name":"updateendpointWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newmarketingWT","type":"address"}],"name":"updatemarketingWT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWallet","type":"address"}],"name":"updatetreasuryWT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toAddr","type":"address"}],"name":"withdrawStuckEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawStuckNODIFI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"withdrawStuckToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c0604052600f805462ffffff19166001908117909155602b805460ff1916909117905534801561002e575f80fd5b506040518060400160405280601981526020017f4469737472696275746564204e6f646573204e6574776f726b00000000000000815250604051806040016040528060058152602001645341524f5360d81b8152508160039081610092919061081e565b50600461009f828261081e565b5050506100b86100b36104e360201b60201c565b6104e7565b737a250d5630b4cf539739df2c5dacb4c659f2488d6100d8816001610538565b6001600160a01b03811660808190526040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015610120573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061014491906108dd565b6001600160a01b031663c9c6539630836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801561018f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101b391906108dd565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303815f875af11580156101fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061022191906108dd565b6001600160a01b031660a081905261023a906001610538565b60a0516102489060016105ae565b6a084595161401484a000000600c819055600e555f808080600f8181818080808481816b033b2e3c9fd0803ce800000061271061028682600561091e565b610290919061093b565b600d819055508e6011819055508d6012819055508c6013819055508b6014819055508a60158190555089601681905550886017819055506017546016546015546014546013546012546011546102e6919061095a565b6102f0919061095a565b6102fa919061095a565b610304919061095a565b61030e919061095a565b610318919061095a565b6010556019889055601a879055601b869055601c859055601d849055601e839055601f829055818385878961034d8c8e61095a565b610357919061095a565b610361919061095a565b61036b919061095a565b610375919061095a565b61037f919061095a565b601855600680546001600160a01b031990811673985d670b1aebdd298685a0f26f135b8bddd7d5759081179092556007805482169092179091556008805482167352354b7dcaaebdaace35cb2d5c11e83bb917bd0917905560098054821633179055600a80548216736d7aed612ad5b97be18386828e01b14ac0a5d31a179055600b805490911673c591f5a4d2612b6edb7f58ebb9c2c85f7333272317905561043a6104336005546001600160a01b031690565b6001610601565b610445306001610601565b61045261dead6001610601565b61046e6104676005546001600160a01b031690565b6001610538565b610479306001610538565b61048661dead6001610538565b6001602c5f61049d6005546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f20805460ff19169115159190911790556104ce33826106a6565b5050505050505050505050505050505061096d565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6005546001600160a01b031633146105845760405162461bcd60e51b815260206004820181905260248201525f805160206140bb83398151915260448201526064015b60405180910390fd5b6001600160a01b03919091165f908152602960205260409020805460ff1916911515919091179055565b6001600160a01b0382165f818152602a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6005546001600160a01b031633146106485760405162461bcd60e51b815260206004820181905260248201525f805160206140bb833981519152604482015260640161057b565b6001600160a01b0382165f81815260286020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6001600160a01b0382166106fc5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161057b565b8060025f82825461070d919061095a565b90915550506001600160a01b0382165f908152602081905260408120805483929061073990849061095a565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806107af57607f821691505b6020821081036107cd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561078257805f5260205f20601f840160051c810160208510156107f85750805b601f840160051c820191505b81811015610817575f8155600101610804565b5050505050565b81516001600160401b0381111561083757610837610787565b61084b81610845845461079b565b846107d3565b602080601f83116001811461087e575f84156108675750858301515b5f19600386901b1c1916600185901b1785556108d5565b5f85815260208120601f198616915b828110156108ac5788860151825594840194600190910190840161088d565b50858210156108c957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156108ed575f80fd5b81516001600160a01b0381168114610903575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176109355761093561090a565b92915050565b5f8261095557634e487b7160e01b5f52601260045260245ffd5b500490565b808201808211156109355761093561090a565b60805160a0516137036109b85f395f818161072d015261174801525f818161059101528181612f730152818161302a01528181613066015281816130da015261310101526137035ff3fe60806040526004361061047c575f3560e01c80637f6497831161024c578063bc205ad31161013f578063e8563f6c116100be578063f2fde38b11610083578063f2fde38b14610d59578063f430b2a414610d78578063f537b33414610d97578063f637434214610dac578063f80673bc14610dc1578063f8b45b0514610de0575f80fd5b8063e8563f6c14610cdc578063ed1cd43514610cfb578063eea3251914610d10578063efeaf78414610d25578063f11a24d314610d44575f80fd5b8063c8c8ebe411610104578063c8c8ebe414610c3a578063d257b34f14610c4f578063d85ba06314610c6e578063dd62ed3e14610c83578063e2f4560514610cc7575f80fd5b8063bc205ad314610ba9578063bc5d0ec714610bc8578063c024666814610bdd578063c18bc19514610bfc578063c75a68c314610c1b575f80fd5b80639b19251a116101cb578063aa0e438811610190578063aa0e438814610b0a578063ae8f6b8f14610b29578063b62496f514610b3e578063bb3bb20214610b6c578063bbc0c74214610b8b575f80fd5b80639b19251a14610a6a5780639ccb408d14610a98578063a457c2d714610ab7578063a9059cbb14610ad6578063a9f1611a14610af5575f80fd5b8063907918a111610211578063907918a1146109e4578063924de9b714610a035780639527b74e14610a2257806395d89b4114610a375780639a7a23d614610a4b575f80fd5b80637f6497831461096057806387fbd2ce1461097f5780638a8c523c1461099e5780638bc22014146109b25780638da5cb5b146109c7575f80fd5b8063417dacea1161036f578063608db202116102ee57806370a08231116102b357806370a08231146108b1578063715018a6146108e5578063751039fc146108f95780637571336a1461090d57806376ece5a11461092c5780637ca8448a14610941575f80fd5b8063608db2021461082057806365892a771461083f5780636891e6e41461085e5780636a486a8e1461087d5780636ddd171314610892575f80fd5b80634fbee193116103345780634fbee1931461079657806354b2a8d9146107cd5780635564ad71146107e257806356ca7d66146107f657806359e4fe881461080b575f80fd5b8063417dacea146106f2578063426855441461070757806349bd5a5e1461071c5780634a62bb651461074f5780634e29e52314610768575f80fd5b8063203e727e116103fb578063313ce567116103c0578063313ce5671461067b578063333edd981461069657806339509351146106aa5780633c248783146106c95780634013fc88146106de575f80fd5b8063203e727e146105f457806323b872dd1461061357806327c8f835146106325780632daf36b5146106475780632e6668561461065c575f80fd5b806310d5de531161044157806310d5de531461053d57806315d716eb1461056b5780631694505e1461058057806318160ddd146105cb5780631a8145bb146105df575f80fd5b806306fdde0314610487578063095ea7b3146104b15780630b623f30146104e05780630e922ca7146105015780630f835e6d1461051a575f80fd5b3661048357005b5f80fd5b348015610492575f80fd5b5061049b610df5565b6040516104a891906131d7565b60405180910390f35b3480156104bc575f80fd5b506104d06104cb36600461322b565b610e85565b60405190151581526020016104a8565b3480156104eb575f80fd5b506104ff6104fa366004613255565b610e9b565b005b34801561050c575f80fd5b50602b546104d09060ff1681565b348015610525575f80fd5b5061052f60225481565b6040519081526020016104a8565b348015610548575f80fd5b506104d061055736600461329c565b60296020525f908152604090205460ff1681565b348015610576575f80fd5b5061052f601b5481565b34801561058b575f80fd5b506105b37f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016104a8565b3480156105d6575f80fd5b5060025461052f565b3480156105ea575f80fd5b5061052f60255481565b3480156105ff575f80fd5b506104ff61060e3660046132b7565b610f90565b34801561061e575f80fd5b506104d061062d3660046132ce565b61106e565b34801561063d575f80fd5b506105b361dead81565b348015610652575f80fd5b5061052f60175481565b348015610667575f80fd5b50600a546105b3906001600160a01b031681565b348015610686575f80fd5b50604051601281526020016104a8565b3480156106a1575f80fd5b506104ff611116565b3480156106b5575f80fd5b506104d06106c436600461322b565b611235565b3480156106d4575f80fd5b5061052f601f5481565b3480156106e9575f80fd5b506104ff611270565b3480156106fd575f80fd5b5061052f60195481565b348015610712575f80fd5b5061052f60215481565b348015610727575f80fd5b506105b37f000000000000000000000000000000000000000000000000000000000000000081565b34801561075a575f80fd5b50600f546104d09060ff1681565b348015610773575f80fd5b506104d061078236600461329c565b602c6020525f908152604090205460ff1681565b3480156107a1575f80fd5b506104d06107b036600461329c565b6001600160a01b03165f9081526028602052604090205460ff1690565b3480156107d8575f80fd5b5061052f60155481565b3480156107ed575f80fd5b506104ff6112ef565b348015610801575f80fd5b5061052f60265481565b348015610816575f80fd5b5061052f601c5481565b34801561082b575f80fd5b506006546105b3906001600160a01b031681565b34801561084a575f80fd5b506104ff61085936600461329c565b61131f565b348015610869575f80fd5b506104ff61087836600461329c565b6113a5565b348015610888575f80fd5b5061052f60185481565b34801561089d575f80fd5b50600f546104d09062010000900460ff1681565b3480156108bc575f80fd5b5061052f6108cb36600461329c565b6001600160a01b03165f9081526020819052604090205490565b3480156108f0575f80fd5b506104ff61142b565b348015610904575f80fd5b506104d0611460565b348015610918575f80fd5b506104ff610927366004613319565b61149c565b348015610937575f80fd5b5061052f60235481565b34801561094c575f80fd5b506104ff61095b36600461329c565b6114f0565b34801561096b575f80fd5b506104ff61097a366004613364565b611575565b34801561098a575f80fd5b506104ff61099936600461329c565b6115fa565b3480156109a9575f80fd5b506104ff611680565b3480156109bd575f80fd5b5061052f601a5481565b3480156109d2575f80fd5b506005546001600160a01b03166105b3565b3480156109ef575f80fd5b506009546105b3906001600160a01b031681565b348015610a0e575f80fd5b506104ff610a1d366004613424565b6116c7565b348015610a2d575f80fd5b5061052f60205481565b348015610a42575f80fd5b5061049b61170d565b348015610a56575f80fd5b506104ff610a65366004613319565b61171c565b348015610a75575f80fd5b506104d0610a8436600461329c565b60276020525f908152604090205460ff1681565b348015610aa3575f80fd5b506007546105b3906001600160a01b031681565b348015610ac2575f80fd5b506104d0610ad136600461322b565b6117f7565b348015610ae1575f80fd5b506104d0610af036600461322b565b61188f565b348015610b00575f80fd5b5061052f60125481565b348015610b15575f80fd5b506104ff610b24366004613319565b61189b565b348015610b34575f80fd5b5061052f60245481565b348015610b49575f80fd5b506104d0610b5836600461329c565b602a6020525f908152604090205460ff1681565b348015610b77575f80fd5b506104ff610b8636600461329c565b6118fc565b348015610b96575f80fd5b50600f546104d090610100900460ff1681565b348015610bb4575f80fd5b506104ff610bc336600461343f565b611982565b348015610bd3575f80fd5b5061052f60145481565b348015610be8575f80fd5b506104ff610bf7366004613319565b611ade565b348015610c07575f80fd5b506104ff610c163660046132b7565b611b66565b348015610c26575f80fd5b506008546105b3906001600160a01b031681565b348015610c45575f80fd5b5061052f600c5481565b348015610c5a575f80fd5b506104d0610c693660046132b7565b611c38565b348015610c79575f80fd5b5061052f60105481565b348015610c8e575f80fd5b5061052f610c9d36600461343f565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610cd2575f80fd5b5061052f600d5481565b348015610ce7575f80fd5b506104ff610cf636600461329c565b611d8e565b348015610d06575f80fd5b5061052f60115481565b348015610d1b575f80fd5b5061052f60135481565b348015610d30575f80fd5b506104ff610d3f366004613255565b611e14565b348015610d4f575f80fd5b5061052f60165481565b348015610d64575f80fd5b506104ff610d7336600461329c565b611ef7565b348015610d83575f80fd5b506104ff610d9236600461329c565b611f92565b348015610da2575f80fd5b5061052f601d5481565b348015610db7575f80fd5b5061052f601e5481565b348015610dcc575f80fd5b50600b546105b3906001600160a01b031681565b348015610deb575f80fd5b5061052f600e5481565b606060038054610e049061346b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e309061346b565b8015610e7b5780601f10610e5257610100808354040283529160200191610e7b565b820191905f5260205f20905b815481529060010190602001808311610e5e57829003601f168201915b5050505050905090565b5f610e91338484612018565b5060015b92915050565b6005546001600160a01b03163314610ece5760405162461bcd60e51b8152600401610ec5906134a3565b60405180910390fd5b60118790556012869055601385905560148490556015839055601682905560178190558082848688610f008c806134ec565b610f0a91906134ec565b610f1491906134ec565b610f1e91906134ec565b610f2891906134ec565b610f3291906134ec565b601081905560141015610f875760405162461bcd60e51b815260206004820152601760248201527f4275792066656573206d757374206265203c3d2032302e0000000000000000006044820152606401610ec5565b50505050505050565b6005546001600160a01b03163314610fba5760405162461bcd60e51b8152600401610ec5906134a3565b670de0b6b3a76400006103e8610fcf60025490565b610fdb906103e76134ff565b610fe59190613516565b610fef9190613516565b8110156110565760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610ec5565b61106881670de0b6b3a76400006134ff565b600c5550565b5f61107a84848461213b565b6001600160a01b0384165f908152600160209081526040808320338452909152902054828110156110fe5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ec5565b61110b8533858403612018565b506001949350505050565b6005546001600160a01b031633146111405760405162461bcd60e51b8152600401610ec5906134a3565b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa15801561117b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119f9190613535565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303815f875af11580156111e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611207919061354c565b5060405133904780156108fc02915f818181858888f19350505050158015611231573d5f803e3d5ffd5b5050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610e9191859061126b9086906134ec565b612018565b6005546001600160a01b0316331461129a5760405162461bcd60e51b8152600401610ec5906134a3565b600b546040515f916001600160a01b03169047908381818185875af1925050503d805f81146112e4576040519150601f19603f3d011682016040523d82523d5f602084013e6112e9565b606091505b50505050565b6005546001600160a01b031633146113195760405162461bcd60e51b8152600401610ec5906134a3565b5f600e55565b6005546001600160a01b031633146113495760405162461bcd60e51b8152600401610ec5906134a3565b600a546040516001600160a01b03918216918316907fe6c986c969c47fedf8aa8c5b9a9ca06fe4413e9634c5ae7d8162d1d33eca7b4d905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113cf5760405162461bcd60e51b8152600401610ec5906134a3565b6008546040516001600160a01b03918216918316907f2b2f30a37b26d24ef777d86950b8fe610baac3b87fcc2d366b7d09747feba3ce905f90a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146114555760405162461bcd60e51b8152600401610ec5906134a3565b61145e5f6129c3565b565b6005545f906001600160a01b0316331461148c5760405162461bcd60e51b8152600401610ec5906134a3565b50600f805460ff19169055600190565b6005546001600160a01b031633146114c65760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b03919091165f908152602960205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461151a5760405162461bcd60e51b8152600401610ec5906134a3565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611563576040519150601f19603f3d011682016040523d82523d5f602084013e611568565b606091505b5050905080611231575f80fd5b6005546001600160a01b0316331461159f5760405162461bcd60e51b8152600401610ec5906134a3565b5f5b815181101561123157600160275f8484815181106115c1576115c1613567565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016115a1565b6005546001600160a01b031633146116245760405162461bcd60e51b8152600401610ec5906134a3565b6006546040516001600160a01b03918216918316907f2ed657b9e098b39fe768a04fe159bf8bee096bccb2bc9049c1bc41c61c216b52905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116aa5760405162461bcd60e51b8152600401610ec5906134a3565b600f805462ffff00191662010100179055602b805460ff19169055565b6005546001600160a01b031633146116f15760405162461bcd60e51b8152600401610ec5906134a3565b600f8054911515620100000262ff000019909216919091179055565b606060048054610e049061346b565b6005546001600160a01b031633146117465760405162461bcd60e51b8152600401610ec5906134a3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036117ed5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ec5565b6112318282612a14565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156118785760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ec5565b6118853385858403612018565b5060019392505050565b5f610e9133848461213b565b6005546001600160a01b031633146118c55760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b0382165f908152602c60205260409020805460ff19168215151790556118f28282611ade565b611231828261149c565b6005546001600160a01b031633146119265760405162461bcd60e51b8152600401610ec5906134a3565b6007546040516001600160a01b03918216918316907f227dd696d6339efe587eaaf3a385c412461b5c720f686bbefddb225e0b7727a9905f90a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146119ac5760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b038216611a025760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ec5565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611a46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a6a9190613535565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af1158015611aba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e9919061354c565b6005546001600160a01b03163314611b085760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b0382165f81815260286020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611b905760405162461bcd60e51b8152600401610ec5906134a3565b670de0b6b3a76400006103e8611ba560025490565b611bb1906103e76134ff565b611bbb9190613516565b611bc59190613516565b811015611c205760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263312e302560e01b6064820152608401610ec5565b611c3281670de0b6b3a76400006134ff565b600e5550565b6005545f906001600160a01b03163314611c645760405162461bcd60e51b8152600401610ec5906134a3565b620186a0611c7160025490565b611c7c9060016134ff565b611c869190613516565b821015611cf35760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ec5565b6103e8611cff60025490565b611d0a9060056134ff565b611d149190613516565b821115611d805760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610ec5565b50600d81905560015b919050565b6005546001600160a01b03163314611db85760405162461bcd60e51b8152600401610ec5906134a3565b600b546040516001600160a01b03918216918316907fdaffe08b1da3577c7f57a32763946465392b21aa031757acc8c0bdf6d779e2bc905f90a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611e3e5760405162461bcd60e51b8152600401610ec5906134a3565b6019879055601a869055601b859055601c849055601d839055601e829055601f8190558082848688611e708b8d6134ec565b611e7a91906134ec565b611e8491906134ec565b611e8e91906134ec565b611e9891906134ec565b611ea291906134ec565b601881905560141015610f875760405162461bcd60e51b815260206004820152601860248201527f53656c6c2066656573206d757374206265203c3d2032302e00000000000000006044820152606401610ec5565b6005546001600160a01b03163314611f215760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b038116611f865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ec5565b611f8f816129c3565b50565b6005546001600160a01b03163314611fbc5760405162461bcd60e51b8152600401610ec5906134a3565b6009546040516001600160a01b03918216918316907f93884468df594eaa3c1cc7758e830743e10539dd4d29ebab67f3d519e49abae7905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661207a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ec5565b6001600160a01b0382166120db5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ec5565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121615760405162461bcd60e51b8152600401610ec59061357b565b6001600160a01b0382166121875760405162461bcd60e51b8152600401610ec5906135c0565b602b5460ff161561220b576001600160a01b0383165f908152602c602052604090205460ff1661220b5760405162461bcd60e51b815260206004820152602960248201527f4e6f7420617574686f72697a656420746f207472616e73666572207072652d6d60448201526834b3b930ba34b7b71760b91b6064820152608401610ec5565b805f036122225761221d83835f612a67565b505050565b600f5460ff161561258f576005546001600160a01b0384811691161480159061225957506005546001600160a01b03838116911614155b801561226d57506001600160a01b03821615155b801561228457506001600160a01b03821661dead14155b801561229a5750600554600160a01b900460ff16155b1561258f57600f54610100900460ff16612330576001600160a01b0383165f9081526028602052604090205460ff16806122eb57506001600160a01b0382165f9081526028602052604090205460ff165b6123305760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ec5565b6001600160a01b0383165f908152602a602052604090205460ff16801561236f57506001600160a01b0382165f9081526029602052604090205460ff16155b1561245257600c548111156123e45760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610ec5565b600e546001600160a01b0383165f9081526020819052604090205461240990836134ec565b111561244d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610ec5565b61258f565b6001600160a01b0382165f908152602a602052604090205460ff16801561249157506001600160a01b0383165f9081526029602052604090205460ff16155b1561250757600c5481111561244d5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610ec5565b6001600160a01b0382165f9081526029602052604090205460ff1661258f57600e546001600160a01b0383165f9081526020819052604090205461254b90836134ec565b111561258f5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610ec5565b305f90815260208190526040902054600d54811080159081906125ba5750600f5462010000900460ff165b80156125d05750600554600160a01b900460ff16155b80156125f457506001600160a01b0385165f908152602a602052604090205460ff16155b801561261857506001600160a01b0385165f9081526028602052604090205460ff16155b801561263c57506001600160a01b0384165f9081526028602052604090205460ff16155b1561266a576005805460ff60a01b1916600160a01b17905561265c612bb9565b6005805460ff60a01b191690555b6005546001600160a01b0386165f9081526028602052604090205460ff600160a01b9092048216159116806126b657506001600160a01b0385165f9081526028602052604090205460ff165b156126be57505f5b5f81156129b8576001600160a01b0386165f908152602a602052604090205460ff1680156126ed57505f601854115b1561283557612712606461270c60185488612ef690919063ffffffff16565b90612f08565b9050601854601e548261272591906134ff565b61272f9190613516565b60255f82825461273f91906134ec565b9091555050601854601f5461275490836134ff565b61275e9190613516565b60265f82825461276e91906134ec565b909155505060185460195461278390836134ff565b61278d9190613516565b60205f82825461279d91906134ec565b9091555050601854601b546127b290836134ff565b6127bc9190613516565b60225f8282546127cc91906134ec565b9091555050601854601c546127e190836134ff565b6127eb9190613516565b60235f8282546127fb91906134ec565b9091555050601854601d5461281090836134ff565b61281a9190613516565b60245f82825461282a91906134ec565b9091555061299a9050565b6001600160a01b0387165f908152602a602052604090205460ff16801561285d57505f601054115b1561299a5761287c606461270c60105488612ef690919063ffffffff16565b90506010546016548261288f91906134ff565b6128999190613516565b60255f8282546128a991906134ec565b90915550506010546017546128be90836134ff565b6128c89190613516565b60265f8282546128d891906134ec565b90915550506010546011546128ed90836134ff565b6128f79190613516565b60205f82825461290791906134ec565b909155505060105460135461291c90836134ff565b6129269190613516565b60225f82825461293691906134ec565b909155505060105460145461294b90836134ff565b6129559190613516565b60235f82825461296591906134ec565b909155505060105460155461297a90836134ff565b6129849190613516565b60245f82825461299491906134ec565b90915550505b80156129ab576129ab873083612a67565b6129b58186613603565b94505b610f87878787612a67565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f818152602a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316612a8d5760405162461bcd60e51b8152600401610ec59061357b565b6001600160a01b038216612ab35760405162461bcd60e51b8152600401610ec5906135c0565b6001600160a01b0383165f9081526020819052604090205481811015612b2a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ec5565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612b609084906134ec565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612bac91815260200190565b60405180910390a36112e9565b305f9081526020819052604081205490505f602654602454602354602254602054602554612be791906134ec565b612bf191906134ec565b612bfb91906134ec565b612c0591906134ec565b612c0f91906134ec565b90505f821580612c1d575081155b15612c2757505050565b600d54612c359060146134ff565b831115612c4d57600d54612c4a9060146134ff565b92505b5f60028360255486612c5f91906134ff565b612c699190613516565b612c739190613516565b90505f612c808583612f13565b905047612c8c82612f1e565b5f612c974783612f13565b90505f612cc46002602554612cac9190613516565b612cb69089613603565b60205461270c908590612ef6565b90505f612cf16002602554612cd99190613516565b612ce3908a613603565b60215461270c908690612ef6565b90505f612d1e6002602554612d069190613516565b612d10908b613603565b60225461270c908790612ef6565b90505f612d4b6002602554612d339190613516565b612d3d908c613603565b60245461270c908890612ef6565b90505f612d786002602554612d609190613516565b612d6a908d613603565b60265461270c908990612ef6565b90505f8183858088612d8a8b8d613603565b612d949190613603565b612d9e9190613603565b612da89190613603565b612db29190613603565b612dbc9190613603565b5f6025819055602081905560218190556022819055602381905560248190556026819055600b546040519293506001600160a01b031691849181818185875af1925050503d805f8114612e2a576040519150601f19603f3d011682016040523d82523d5f602084013e612e2f565b606091505b50909b50508915801590612e4257505f81115b15612e9557612e518a826130d4565b602554604080518b81526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b039091169047905f81818185875af1925050503d805f8114612edf576040519150601f19603f3d011682016040523d82523d5f602084013e612ee4565b606091505b50505050505050505050505050505050565b5f612f0182846134ff565b9392505050565b5f612f018284613516565b5f612f018284613603565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612f5157612f51613567565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff19190613616565b8160018151811061300457613004613567565b60200260200101906001600160a01b031690816001600160a01b03168152505061304f307f000000000000000000000000000000000000000000000000000000000000000084612018565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791ac947906130a39085905f90869030904290600401613631565b5f604051808303815f87803b1580156130ba575f80fd5b505af11580156130cc573d5f803e3d5ffd5b505050505050565b6130ff307f000000000000000000000000000000000000000000000000000000000000000084612018565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f305d7198230855f806131456005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156131ab573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906131d091906136a2565b5050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611f8f575f80fd5b8035611d898161320c565b5f806040838503121561323c575f80fd5b82356132478161320c565b946020939093013593505050565b5f805f805f805f60e0888a03121561326b575f80fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b5f602082840312156132ac575f80fd5b8135612f018161320c565b5f602082840312156132c7575f80fd5b5035919050565b5f805f606084860312156132e0575f80fd5b83356132eb8161320c565b925060208401356132fb8161320c565b929592945050506040919091013590565b8015158114611f8f575f80fd5b5f806040838503121561332a575f80fd5b82356133358161320c565b915060208301356133458161330c565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215613375575f80fd5b823567ffffffffffffffff8082111561338c575f80fd5b818501915085601f83011261339f575f80fd5b8135818111156133b1576133b1613350565b8060051b604051601f19603f830116810181811085821117156133d6576133d6613350565b6040529182528482019250838101850191888311156133f3575f80fd5b938501935b828510156134185761340985613220565b845293850193928501926133f8565b98975050505050505050565b5f60208284031215613434575f80fd5b8135612f018161330c565b5f8060408385031215613450575f80fd5b823561345b8161320c565b915060208301356133458161320c565b600181811c9082168061347f57607f821691505b60208210810361349d57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e9557610e956134d8565b8082028115828204841417610e9557610e956134d8565b5f8261353057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215613545575f80fd5b5051919050565b5f6020828403121561355c575f80fd5b8151612f018161330c565b634e487b7160e01b5f52603260045260245ffd5b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610e9557610e956134d8565b5f60208284031215613626575f80fd5b8151612f018161320c565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156136815784516001600160a01b03168352938301939183019160010161365c565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156136b4575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212202be9b20a1465d2d99d2d7bc451446015c05f807a199daa407f106e298929aaa164736f6c634300081900334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572

Deployed Bytecode

0x60806040526004361061047c575f3560e01c80637f6497831161024c578063bc205ad31161013f578063e8563f6c116100be578063f2fde38b11610083578063f2fde38b14610d59578063f430b2a414610d78578063f537b33414610d97578063f637434214610dac578063f80673bc14610dc1578063f8b45b0514610de0575f80fd5b8063e8563f6c14610cdc578063ed1cd43514610cfb578063eea3251914610d10578063efeaf78414610d25578063f11a24d314610d44575f80fd5b8063c8c8ebe411610104578063c8c8ebe414610c3a578063d257b34f14610c4f578063d85ba06314610c6e578063dd62ed3e14610c83578063e2f4560514610cc7575f80fd5b8063bc205ad314610ba9578063bc5d0ec714610bc8578063c024666814610bdd578063c18bc19514610bfc578063c75a68c314610c1b575f80fd5b80639b19251a116101cb578063aa0e438811610190578063aa0e438814610b0a578063ae8f6b8f14610b29578063b62496f514610b3e578063bb3bb20214610b6c578063bbc0c74214610b8b575f80fd5b80639b19251a14610a6a5780639ccb408d14610a98578063a457c2d714610ab7578063a9059cbb14610ad6578063a9f1611a14610af5575f80fd5b8063907918a111610211578063907918a1146109e4578063924de9b714610a035780639527b74e14610a2257806395d89b4114610a375780639a7a23d614610a4b575f80fd5b80637f6497831461096057806387fbd2ce1461097f5780638a8c523c1461099e5780638bc22014146109b25780638da5cb5b146109c7575f80fd5b8063417dacea1161036f578063608db202116102ee57806370a08231116102b357806370a08231146108b1578063715018a6146108e5578063751039fc146108f95780637571336a1461090d57806376ece5a11461092c5780637ca8448a14610941575f80fd5b8063608db2021461082057806365892a771461083f5780636891e6e41461085e5780636a486a8e1461087d5780636ddd171314610892575f80fd5b80634fbee193116103345780634fbee1931461079657806354b2a8d9146107cd5780635564ad71146107e257806356ca7d66146107f657806359e4fe881461080b575f80fd5b8063417dacea146106f2578063426855441461070757806349bd5a5e1461071c5780634a62bb651461074f5780634e29e52314610768575f80fd5b8063203e727e116103fb578063313ce567116103c0578063313ce5671461067b578063333edd981461069657806339509351146106aa5780633c248783146106c95780634013fc88146106de575f80fd5b8063203e727e146105f457806323b872dd1461061357806327c8f835146106325780632daf36b5146106475780632e6668561461065c575f80fd5b806310d5de531161044157806310d5de531461053d57806315d716eb1461056b5780631694505e1461058057806318160ddd146105cb5780631a8145bb146105df575f80fd5b806306fdde0314610487578063095ea7b3146104b15780630b623f30146104e05780630e922ca7146105015780630f835e6d1461051a575f80fd5b3661048357005b5f80fd5b348015610492575f80fd5b5061049b610df5565b6040516104a891906131d7565b60405180910390f35b3480156104bc575f80fd5b506104d06104cb36600461322b565b610e85565b60405190151581526020016104a8565b3480156104eb575f80fd5b506104ff6104fa366004613255565b610e9b565b005b34801561050c575f80fd5b50602b546104d09060ff1681565b348015610525575f80fd5b5061052f60225481565b6040519081526020016104a8565b348015610548575f80fd5b506104d061055736600461329c565b60296020525f908152604090205460ff1681565b348015610576575f80fd5b5061052f601b5481565b34801561058b575f80fd5b506105b37f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b6040516001600160a01b0390911681526020016104a8565b3480156105d6575f80fd5b5060025461052f565b3480156105ea575f80fd5b5061052f60255481565b3480156105ff575f80fd5b506104ff61060e3660046132b7565b610f90565b34801561061e575f80fd5b506104d061062d3660046132ce565b61106e565b34801561063d575f80fd5b506105b361dead81565b348015610652575f80fd5b5061052f60175481565b348015610667575f80fd5b50600a546105b3906001600160a01b031681565b348015610686575f80fd5b50604051601281526020016104a8565b3480156106a1575f80fd5b506104ff611116565b3480156106b5575f80fd5b506104d06106c436600461322b565b611235565b3480156106d4575f80fd5b5061052f601f5481565b3480156106e9575f80fd5b506104ff611270565b3480156106fd575f80fd5b5061052f60195481565b348015610712575f80fd5b5061052f60215481565b348015610727575f80fd5b506105b37f000000000000000000000000dd08146a2c44766bda8c7c7f9cd861f5e6fda5bd81565b34801561075a575f80fd5b50600f546104d09060ff1681565b348015610773575f80fd5b506104d061078236600461329c565b602c6020525f908152604090205460ff1681565b3480156107a1575f80fd5b506104d06107b036600461329c565b6001600160a01b03165f9081526028602052604090205460ff1690565b3480156107d8575f80fd5b5061052f60155481565b3480156107ed575f80fd5b506104ff6112ef565b348015610801575f80fd5b5061052f60265481565b348015610816575f80fd5b5061052f601c5481565b34801561082b575f80fd5b506006546105b3906001600160a01b031681565b34801561084a575f80fd5b506104ff61085936600461329c565b61131f565b348015610869575f80fd5b506104ff61087836600461329c565b6113a5565b348015610888575f80fd5b5061052f60185481565b34801561089d575f80fd5b50600f546104d09062010000900460ff1681565b3480156108bc575f80fd5b5061052f6108cb36600461329c565b6001600160a01b03165f9081526020819052604090205490565b3480156108f0575f80fd5b506104ff61142b565b348015610904575f80fd5b506104d0611460565b348015610918575f80fd5b506104ff610927366004613319565b61149c565b348015610937575f80fd5b5061052f60235481565b34801561094c575f80fd5b506104ff61095b36600461329c565b6114f0565b34801561096b575f80fd5b506104ff61097a366004613364565b611575565b34801561098a575f80fd5b506104ff61099936600461329c565b6115fa565b3480156109a9575f80fd5b506104ff611680565b3480156109bd575f80fd5b5061052f601a5481565b3480156109d2575f80fd5b506005546001600160a01b03166105b3565b3480156109ef575f80fd5b506009546105b3906001600160a01b031681565b348015610a0e575f80fd5b506104ff610a1d366004613424565b6116c7565b348015610a2d575f80fd5b5061052f60205481565b348015610a42575f80fd5b5061049b61170d565b348015610a56575f80fd5b506104ff610a65366004613319565b61171c565b348015610a75575f80fd5b506104d0610a8436600461329c565b60276020525f908152604090205460ff1681565b348015610aa3575f80fd5b506007546105b3906001600160a01b031681565b348015610ac2575f80fd5b506104d0610ad136600461322b565b6117f7565b348015610ae1575f80fd5b506104d0610af036600461322b565b61188f565b348015610b00575f80fd5b5061052f60125481565b348015610b15575f80fd5b506104ff610b24366004613319565b61189b565b348015610b34575f80fd5b5061052f60245481565b348015610b49575f80fd5b506104d0610b5836600461329c565b602a6020525f908152604090205460ff1681565b348015610b77575f80fd5b506104ff610b8636600461329c565b6118fc565b348015610b96575f80fd5b50600f546104d090610100900460ff1681565b348015610bb4575f80fd5b506104ff610bc336600461343f565b611982565b348015610bd3575f80fd5b5061052f60145481565b348015610be8575f80fd5b506104ff610bf7366004613319565b611ade565b348015610c07575f80fd5b506104ff610c163660046132b7565b611b66565b348015610c26575f80fd5b506008546105b3906001600160a01b031681565b348015610c45575f80fd5b5061052f600c5481565b348015610c5a575f80fd5b506104d0610c693660046132b7565b611c38565b348015610c79575f80fd5b5061052f60105481565b348015610c8e575f80fd5b5061052f610c9d36600461343f565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610cd2575f80fd5b5061052f600d5481565b348015610ce7575f80fd5b506104ff610cf636600461329c565b611d8e565b348015610d06575f80fd5b5061052f60115481565b348015610d1b575f80fd5b5061052f60135481565b348015610d30575f80fd5b506104ff610d3f366004613255565b611e14565b348015610d4f575f80fd5b5061052f60165481565b348015610d64575f80fd5b506104ff610d7336600461329c565b611ef7565b348015610d83575f80fd5b506104ff610d9236600461329c565b611f92565b348015610da2575f80fd5b5061052f601d5481565b348015610db7575f80fd5b5061052f601e5481565b348015610dcc575f80fd5b50600b546105b3906001600160a01b031681565b348015610deb575f80fd5b5061052f600e5481565b606060038054610e049061346b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e309061346b565b8015610e7b5780601f10610e5257610100808354040283529160200191610e7b565b820191905f5260205f20905b815481529060010190602001808311610e5e57829003601f168201915b5050505050905090565b5f610e91338484612018565b5060015b92915050565b6005546001600160a01b03163314610ece5760405162461bcd60e51b8152600401610ec5906134a3565b60405180910390fd5b60118790556012869055601385905560148490556015839055601682905560178190558082848688610f008c806134ec565b610f0a91906134ec565b610f1491906134ec565b610f1e91906134ec565b610f2891906134ec565b610f3291906134ec565b601081905560141015610f875760405162461bcd60e51b815260206004820152601760248201527f4275792066656573206d757374206265203c3d2032302e0000000000000000006044820152606401610ec5565b50505050505050565b6005546001600160a01b03163314610fba5760405162461bcd60e51b8152600401610ec5906134a3565b670de0b6b3a76400006103e8610fcf60025490565b610fdb906103e76134ff565b610fe59190613516565b610fef9190613516565b8110156110565760405162461bcd60e51b815260206004820152602f60248201527f43616e6e6f7420736574206d61785472616e73616374696f6e416d6f756e742060448201526e6c6f776572207468616e20302e352560881b6064820152608401610ec5565b61106881670de0b6b3a76400006134ff565b600c5550565b5f61107a84848461213b565b6001600160a01b0384165f908152600160209081526040808320338452909152902054828110156110fe5760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b6064820152608401610ec5565b61110b8533858403612018565b506001949350505050565b6005546001600160a01b031633146111405760405162461bcd60e51b8152600401610ec5906134a3565b6040516370a0823160e01b815230600482018190525f916370a0823190602401602060405180830381865afa15801561117b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119f9190613535565b60405163a9059cbb60e01b815233600482015260248101829052909150309063a9059cbb906044016020604051808303815f875af11580156111e3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611207919061354c565b5060405133904780156108fc02915f818181858888f19350505050158015611231573d5f803e3d5ffd5b5050565b335f8181526001602090815260408083206001600160a01b03871684529091528120549091610e9191859061126b9086906134ec565b612018565b6005546001600160a01b0316331461129a5760405162461bcd60e51b8152600401610ec5906134a3565b600b546040515f916001600160a01b03169047908381818185875af1925050503d805f81146112e4576040519150601f19603f3d011682016040523d82523d5f602084013e6112e9565b606091505b50505050565b6005546001600160a01b031633146113195760405162461bcd60e51b8152600401610ec5906134a3565b5f600e55565b6005546001600160a01b031633146113495760405162461bcd60e51b8152600401610ec5906134a3565b600a546040516001600160a01b03918216918316907fe6c986c969c47fedf8aa8c5b9a9ca06fe4413e9634c5ae7d8162d1d33eca7b4d905f90a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146113cf5760405162461bcd60e51b8152600401610ec5906134a3565b6008546040516001600160a01b03918216918316907f2b2f30a37b26d24ef777d86950b8fe610baac3b87fcc2d366b7d09747feba3ce905f90a3600880546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146114555760405162461bcd60e51b8152600401610ec5906134a3565b61145e5f6129c3565b565b6005545f906001600160a01b0316331461148c5760405162461bcd60e51b8152600401610ec5906134a3565b50600f805460ff19169055600190565b6005546001600160a01b031633146114c65760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b03919091165f908152602960205260409020805460ff1916911515919091179055565b6005546001600160a01b0316331461151a5760405162461bcd60e51b8152600401610ec5906134a3565b5f816001600160a01b0316476040515f6040518083038185875af1925050503d805f8114611563576040519150601f19603f3d011682016040523d82523d5f602084013e611568565b606091505b5050905080611231575f80fd5b6005546001600160a01b0316331461159f5760405162461bcd60e51b8152600401610ec5906134a3565b5f5b815181101561123157600160275f8484815181106115c1576115c1613567565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff19169115159190911790556001016115a1565b6005546001600160a01b031633146116245760405162461bcd60e51b8152600401610ec5906134a3565b6006546040516001600160a01b03918216918316907f2ed657b9e098b39fe768a04fe159bf8bee096bccb2bc9049c1bc41c61c216b52905f90a3600680546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146116aa5760405162461bcd60e51b8152600401610ec5906134a3565b600f805462ffff00191662010100179055602b805460ff19169055565b6005546001600160a01b031633146116f15760405162461bcd60e51b8152600401610ec5906134a3565b600f8054911515620100000262ff000019909216919091179055565b606060048054610e049061346b565b6005546001600160a01b031633146117465760405162461bcd60e51b8152600401610ec5906134a3565b7f000000000000000000000000dd08146a2c44766bda8c7c7f9cd861f5e6fda5bd6001600160a01b0316826001600160a01b0316036117ed5760405162461bcd60e51b815260206004820152603960248201527f54686520706169722063616e6e6f742062652072656d6f7665642066726f6d2060448201527f6175746f6d617465644d61726b65744d616b65725061697273000000000000006064820152608401610ec5565b6112318282612a14565b335f9081526001602090815260408083206001600160a01b0386168452909152812054828110156118785760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610ec5565b6118853385858403612018565b5060019392505050565b5f610e9133848461213b565b6005546001600160a01b031633146118c55760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b0382165f908152602c60205260409020805460ff19168215151790556118f28282611ade565b611231828261149c565b6005546001600160a01b031633146119265760405162461bcd60e51b8152600401610ec5906134a3565b6007546040516001600160a01b03918216918316907f227dd696d6339efe587eaaf3a385c412461b5c720f686bbefddb225e0b7727a9905f90a3600780546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b031633146119ac5760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b038216611a025760405162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e20616464726573732063616e6e6f7420626520300000000000006044820152606401610ec5565b6040516370a0823160e01b81523060048201525f906001600160a01b038416906370a0823190602401602060405180830381865afa158015611a46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a6a9190613535565b60405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390529192509084169063a9059cbb906044016020604051808303815f875af1158015611aba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e9919061354c565b6005546001600160a01b03163314611b085760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b0382165f81815260286020908152604091829020805460ff191685151590811790915591519182527f9d8f7706ea1113d1a167b526eca956215946dd36cc7df39eb16180222d8b5df7910160405180910390a25050565b6005546001600160a01b03163314611b905760405162461bcd60e51b8152600401610ec5906134a3565b670de0b6b3a76400006103e8611ba560025490565b611bb1906103e76134ff565b611bbb9190613516565b611bc59190613516565b811015611c205760405162461bcd60e51b8152602060048201526024808201527f43616e6e6f7420736574206d617857616c6c6574206c6f776572207468616e20604482015263312e302560e01b6064820152608401610ec5565b611c3281670de0b6b3a76400006134ff565b600e5550565b6005545f906001600160a01b03163314611c645760405162461bcd60e51b8152600401610ec5906134a3565b620186a0611c7160025490565b611c7c9060016134ff565b611c869190613516565b821015611cf35760405162461bcd60e51b815260206004820152603560248201527f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e60448201527410181718181892903a37ba30b61039bab838363c9760591b6064820152608401610ec5565b6103e8611cff60025490565b611d0a9060056134ff565b611d149190613516565b821115611d805760405162461bcd60e51b815260206004820152603460248201527f5377617020616d6f756e742063616e6e6f742062652068696768657220746861604482015273371018171a92903a37ba30b61039bab838363c9760611b6064820152608401610ec5565b50600d81905560015b919050565b6005546001600160a01b03163314611db85760405162461bcd60e51b8152600401610ec5906134a3565b600b546040516001600160a01b03918216918316907fdaffe08b1da3577c7f57a32763946465392b21aa031757acc8c0bdf6d779e2bc905f90a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314611e3e5760405162461bcd60e51b8152600401610ec5906134a3565b6019879055601a869055601b859055601c849055601d839055601e829055601f8190558082848688611e708b8d6134ec565b611e7a91906134ec565b611e8491906134ec565b611e8e91906134ec565b611e9891906134ec565b611ea291906134ec565b601881905560141015610f875760405162461bcd60e51b815260206004820152601860248201527f53656c6c2066656573206d757374206265203c3d2032302e00000000000000006044820152606401610ec5565b6005546001600160a01b03163314611f215760405162461bcd60e51b8152600401610ec5906134a3565b6001600160a01b038116611f865760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610ec5565b611f8f816129c3565b50565b6005546001600160a01b03163314611fbc5760405162461bcd60e51b8152600401610ec5906134a3565b6009546040516001600160a01b03918216918316907f93884468df594eaa3c1cc7758e830743e10539dd4d29ebab67f3d519e49abae7905f90a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03831661207a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610ec5565b6001600160a01b0382166120db5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610ec5565b6001600160a01b038381165f8181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166121615760405162461bcd60e51b8152600401610ec59061357b565b6001600160a01b0382166121875760405162461bcd60e51b8152600401610ec5906135c0565b602b5460ff161561220b576001600160a01b0383165f908152602c602052604090205460ff1661220b5760405162461bcd60e51b815260206004820152602960248201527f4e6f7420617574686f72697a656420746f207472616e73666572207072652d6d60448201526834b3b930ba34b7b71760b91b6064820152608401610ec5565b805f036122225761221d83835f612a67565b505050565b600f5460ff161561258f576005546001600160a01b0384811691161480159061225957506005546001600160a01b03838116911614155b801561226d57506001600160a01b03821615155b801561228457506001600160a01b03821661dead14155b801561229a5750600554600160a01b900460ff16155b1561258f57600f54610100900460ff16612330576001600160a01b0383165f9081526028602052604090205460ff16806122eb57506001600160a01b0382165f9081526028602052604090205460ff165b6123305760405162461bcd60e51b81526020600482015260166024820152752a3930b234b7339034b9903737ba1030b1ba34bb329760511b6044820152606401610ec5565b6001600160a01b0383165f908152602a602052604090205460ff16801561236f57506001600160a01b0382165f9081526029602052604090205460ff16155b1561245257600c548111156123e45760405162461bcd60e51b815260206004820152603560248201527f427579207472616e7366657220616d6f756e742065786365656473207468652060448201527436b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760591b6064820152608401610ec5565b600e546001600160a01b0383165f9081526020819052604090205461240990836134ec565b111561244d5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610ec5565b61258f565b6001600160a01b0382165f908152602a602052604090205460ff16801561249157506001600160a01b0383165f9081526029602052604090205460ff16155b1561250757600c5481111561244d5760405162461bcd60e51b815260206004820152603660248201527f53656c6c207472616e7366657220616d6f756e742065786365656473207468656044820152751036b0bc2a3930b739b0b1ba34b7b720b6b7bab73a1760511b6064820152608401610ec5565b6001600160a01b0382165f9081526029602052604090205460ff1661258f57600e546001600160a01b0383165f9081526020819052604090205461254b90836134ec565b111561258f5760405162461bcd60e51b815260206004820152601360248201527213585e081dd85b1b195d08195e18d959591959606a1b6044820152606401610ec5565b305f90815260208190526040902054600d54811080159081906125ba5750600f5462010000900460ff165b80156125d05750600554600160a01b900460ff16155b80156125f457506001600160a01b0385165f908152602a602052604090205460ff16155b801561261857506001600160a01b0385165f9081526028602052604090205460ff16155b801561263c57506001600160a01b0384165f9081526028602052604090205460ff16155b1561266a576005805460ff60a01b1916600160a01b17905561265c612bb9565b6005805460ff60a01b191690555b6005546001600160a01b0386165f9081526028602052604090205460ff600160a01b9092048216159116806126b657506001600160a01b0385165f9081526028602052604090205460ff165b156126be57505f5b5f81156129b8576001600160a01b0386165f908152602a602052604090205460ff1680156126ed57505f601854115b1561283557612712606461270c60185488612ef690919063ffffffff16565b90612f08565b9050601854601e548261272591906134ff565b61272f9190613516565b60255f82825461273f91906134ec565b9091555050601854601f5461275490836134ff565b61275e9190613516565b60265f82825461276e91906134ec565b909155505060185460195461278390836134ff565b61278d9190613516565b60205f82825461279d91906134ec565b9091555050601854601b546127b290836134ff565b6127bc9190613516565b60225f8282546127cc91906134ec565b9091555050601854601c546127e190836134ff565b6127eb9190613516565b60235f8282546127fb91906134ec565b9091555050601854601d5461281090836134ff565b61281a9190613516565b60245f82825461282a91906134ec565b9091555061299a9050565b6001600160a01b0387165f908152602a602052604090205460ff16801561285d57505f601054115b1561299a5761287c606461270c60105488612ef690919063ffffffff16565b90506010546016548261288f91906134ff565b6128999190613516565b60255f8282546128a991906134ec565b90915550506010546017546128be90836134ff565b6128c89190613516565b60265f8282546128d891906134ec565b90915550506010546011546128ed90836134ff565b6128f79190613516565b60205f82825461290791906134ec565b909155505060105460135461291c90836134ff565b6129269190613516565b60225f82825461293691906134ec565b909155505060105460145461294b90836134ff565b6129559190613516565b60235f82825461296591906134ec565b909155505060105460155461297a90836134ff565b6129849190613516565b60245f82825461299491906134ec565b90915550505b80156129ab576129ab873083612a67565b6129b58186613603565b94505b610f87878787612a67565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382165f818152602a6020526040808220805460ff191685151590811790915590519092917fffa9187bf1f18bf477bd0ea1bcbb64e93b6a98132473929edfce215cd9b16fab91a35050565b6001600160a01b038316612a8d5760405162461bcd60e51b8152600401610ec59061357b565b6001600160a01b038216612ab35760405162461bcd60e51b8152600401610ec5906135c0565b6001600160a01b0383165f9081526020819052604090205481811015612b2a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610ec5565b6001600160a01b038085165f90815260208190526040808220858503905591851681529081208054849290612b609084906134ec565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612bac91815260200190565b60405180910390a36112e9565b305f9081526020819052604081205490505f602654602454602354602254602054602554612be791906134ec565b612bf191906134ec565b612bfb91906134ec565b612c0591906134ec565b612c0f91906134ec565b90505f821580612c1d575081155b15612c2757505050565b600d54612c359060146134ff565b831115612c4d57600d54612c4a9060146134ff565b92505b5f60028360255486612c5f91906134ff565b612c699190613516565b612c739190613516565b90505f612c808583612f13565b905047612c8c82612f1e565b5f612c974783612f13565b90505f612cc46002602554612cac9190613516565b612cb69089613603565b60205461270c908590612ef6565b90505f612cf16002602554612cd99190613516565b612ce3908a613603565b60215461270c908690612ef6565b90505f612d1e6002602554612d069190613516565b612d10908b613603565b60225461270c908790612ef6565b90505f612d4b6002602554612d339190613516565b612d3d908c613603565b60245461270c908890612ef6565b90505f612d786002602554612d609190613516565b612d6a908d613603565b60265461270c908990612ef6565b90505f8183858088612d8a8b8d613603565b612d949190613603565b612d9e9190613603565b612da89190613603565b612db29190613603565b612dbc9190613603565b5f6025819055602081905560218190556022819055602381905560248190556026819055600b546040519293506001600160a01b031691849181818185875af1925050503d805f8114612e2a576040519150601f19603f3d011682016040523d82523d5f602084013e612e2f565b606091505b50909b50508915801590612e4257505f81115b15612e9557612e518a826130d4565b602554604080518b81526020810184905280820192909252517f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619181900360600190a15b6006546040516001600160a01b039091169047905f81818185875af1925050503d805f8114612edf576040519150601f19603f3d011682016040523d82523d5f602084013e612ee4565b606091505b50505050505050505050505050505050565b5f612f0182846134ff565b9392505050565b5f612f018284613516565b5f612f018284613603565b6040805160028082526060820183525f9260208301908036833701905050905030815f81518110612f5157612f51613567565b60200260200101906001600160a01b031690816001600160a01b0316815250507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff19190613616565b8160018151811061300457613004613567565b60200260200101906001600160a01b031690816001600160a01b03168152505061304f307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612018565b60405163791ac94760e01b81526001600160a01b037f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d169063791ac947906130a39085905f90869030904290600401613631565b5f604051808303815f87803b1580156130ba575f80fd5b505af11580156130cc573d5f803e3d5ffd5b505050505050565b6130ff307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612018565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663f305d7198230855f806131456005546001600160a01b031690565b60405160e088901b6001600160e01b03191681526001600160a01b03958616600482015260248101949094526044840192909252606483015290911660848201524260a482015260c40160606040518083038185885af11580156131ab573d5f803e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906131d091906136a2565b5050505050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6001600160a01b0381168114611f8f575f80fd5b8035611d898161320c565b5f806040838503121561323c575f80fd5b82356132478161320c565b946020939093013593505050565b5f805f805f805f60e0888a03121561326b575f80fd5b505085359760208701359750604087013596606081013596506080810135955060a0810135945060c0013592509050565b5f602082840312156132ac575f80fd5b8135612f018161320c565b5f602082840312156132c7575f80fd5b5035919050565b5f805f606084860312156132e0575f80fd5b83356132eb8161320c565b925060208401356132fb8161320c565b929592945050506040919091013590565b8015158114611f8f575f80fd5b5f806040838503121561332a575f80fd5b82356133358161320c565b915060208301356133458161330c565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f6020808385031215613375575f80fd5b823567ffffffffffffffff8082111561338c575f80fd5b818501915085601f83011261339f575f80fd5b8135818111156133b1576133b1613350565b8060051b604051601f19603f830116810181811085821117156133d6576133d6613350565b6040529182528482019250838101850191888311156133f3575f80fd5b938501935b828510156134185761340985613220565b845293850193928501926133f8565b98975050505050505050565b5f60208284031215613434575f80fd5b8135612f018161330c565b5f8060408385031215613450575f80fd5b823561345b8161320c565b915060208301356133458161320c565b600181811c9082168061347f57607f821691505b60208210810361349d57634e487b7160e01b5f52602260045260245ffd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610e9557610e956134d8565b8082028115828204841417610e9557610e956134d8565b5f8261353057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215613545575f80fd5b5051919050565b5f6020828403121561355c575f80fd5b8151612f018161330c565b634e487b7160e01b5f52603260045260245ffd5b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b81810381811115610e9557610e956134d8565b5f60208284031215613626575f80fd5b8151612f018161320c565b5f60a08201878352602087602085015260a0604085015281875180845260c0860191506020890193505f5b818110156136815784516001600160a01b03168352938301939183019160010161365c565b50506001600160a01b03969096166060850152505050608001529392505050565b5f805f606084860312156136b4575f80fd5b835192506020840151915060408401519050925092509256fea26469706673582212202be9b20a1465d2d99d2d7bc451446015c05f807a199daa407f106e298929aaa164736f6c63430008190033

Deployed Bytecode Sourcemap

32364:22704:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10323:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12490:169;;;;;;;;;;-1:-1:-1;12490:169:0;;;;;:::i;:::-;;:::i;:::-;;;1197:14:1;;1190:22;1172:41;;1160:2;1145:18;12490:169:0;1032:187:1;41289:868:0;;;;;;;;;;-1:-1:-1;41289:868:0;;;;;:::i;:::-;;:::i;:::-;;34518:36;;;;;;;;;;-1:-1:-1;34518:36:0;;;;;;;;33834:32;;;;;;;;;;;;;;;;;;;1967:25:1;;;1955:2;1940:18;33834:32:0;1821:177:1;34231:63:0;;;;;;;;;;-1:-1:-1;34231:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33542:30;;;;;;;;;;;;;;;;32439:51;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2446:32:1;;;2428:51;;2416:2;2401:18;32439:51:0;2255:230:1;11443:108:0;;;;;;;;;;-1:-1:-1;11531:12:0;;11443:108;;33958:33;;;;;;;;;;;;;;;;40367:277;;;;;;;;;;-1:-1:-1;40367:277:0;;;;;:::i;:::-;;:::i;13141:492::-;;;;;;;;;;-1:-1:-1;13141:492:0;;;;;:::i;:::-;;:::i;32542:53::-;;;;;;;;;;;;32588:6;32542:53;;33376:31;;;;;;;;;;;;;;;;32799:26;;;;;;;;;;-1:-1:-1;32799:26:0;;;;-1:-1:-1;;;;;32799:26:0;;;11285:93;;;;;;;;;;-1:-1:-1;11285:93:0;;11368:2;3486:36:1;;3474:2;3459:18;11285:93:0;3344:184:1;53780:257:0;;;;;;;;;;;;;:::i;14042:215::-;;;;;;;;;;-1:-1:-1;14042:215:0;;;;;:::i;:::-;;:::i;33698:32::-;;;;;;;;;;;;;;;;54341:160;;;;;;;;;;;;;:::i;33451:38::-;;;;;;;;;;;;;;;;33786:41;;;;;;;;;;;;;;;;32497:38;;;;;;;;;;;;;;;32981:33;;;;;;;;;;-1:-1:-1;32981:33:0;;;;;;;;34561:57;;;;;;;;;;-1:-1:-1;34561:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45098:126;;;;;;;;;;-1:-1:-1;45098:126:0;;;;;:::i;:::-;-1:-1:-1;;;;;45188:28:0;45164:4;45188:28;;;:19;:28;;;;;;;;;45098:126;33300:32;;;;;;;;;;;;;;;;54717:82;;;;;;;;;;;;;:::i;33998:34::-;;;;;;;;;;;;;;;;33579;;;;;;;;;;;;;;;;32634:37;;;;;;;;;;-1:-1:-1;32634:37:0;;;;-1:-1:-1;;;;;32634:37:0;;;44741:180;;;;;;;;;;-1:-1:-1;44741:180:0;;;;;:::i;:::-;;:::i;44295:201::-;;;;;;;;;;-1:-1:-1;44295:201:0;;;;;:::i;:::-;;:::i;33416:28::-;;;;;;;;;;;;;;;;33061:31;;;;;;;;;;-1:-1:-1;33061:31:0;;;;;;;;;;;11614:127;;;;;;;;;;-1:-1:-1;11614:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;11715:18:0;11688:7;11715:18;;;;;;;;;;;;11614:127;3840:103;;;;;;;;;;;;;:::i;39671:121::-;;;;;;;;;;;;;:::i;40918:167::-;;;;;;;;;;-1:-1:-1;40918:167:0;;;;;:::i;:::-;;:::i;33873:36::-;;;;;;;;;;;;;;;;54513:196;;;;;;;;;;-1:-1:-1;54513:196:0;;;;;:::i;:::-;;:::i;45232:193::-;;;;;;;;;;-1:-1:-1;45232:193:0;;;;;:::i;:::-;;:::i;43758:257::-;;;;;;;;;;-1:-1:-1;43758:257:0;;;;;:::i;:::-;;:::i;39471:148::-;;;;;;;;;;;;;:::i;33496:39::-;;;;;;;;;;;;;;;;3189:87;;;;;;;;;;-1:-1:-1;3262:6:0;;-1:-1:-1;;;;;3262:6:0;3189:87;;32759:33;;;;;;;;;;-1:-1:-1;32759:33:0;;;;-1:-1:-1;;;;;32759:33:0;;;41181:100;;;;;;;;;;-1:-1:-1;41181:100:0;;;;;:::i;:::-;;:::i;33739:40::-;;;;;;;;;;;;;;;;10542:104;;;;;;;;;;;;;:::i;43250:304::-;;;;;;;;;;-1:-1:-1;43250:304:0;;;;;:::i;:::-;;:::i;34041:41::-;;;;;;;;;;-1:-1:-1;34041:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32678:38;;;;;;;;;;-1:-1:-1;32678:38:0;;;;-1:-1:-1;;;;;32678:38:0;;;14760:413;;;;;;;;;;-1:-1:-1;14760:413:0;;;;;:::i;:::-;;:::i;11954:175::-;;;;;;;;;;-1:-1:-1;11954:175:0;;;;;:::i;:::-;;:::i;33179:38::-;;;;;;;;;;;;;;;;54807:258;;;;;;;;;;-1:-1:-1;54807:258:0;;;;;:::i;:::-;;:::i;33916:35::-;;;;;;;;;;;;;;;;34452:57;;;;;;;;;;-1:-1:-1;34452:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;44023:264;;;;;;;;;;-1:-1:-1;44023:264:0;;;;;:::i;:::-;;:::i;33021:33::-;;;;;;;;;;-1:-1:-1;33021:33:0;;;;;;;;;;;54045:288;;;;;;;;;;-1:-1:-1;54045:288:0;;;;;:::i;:::-;;:::i;33260:33::-;;;;;;;;;;;;;;;;43060:182;;;;;;;;;;-1:-1:-1;43060:182:0;;;;;:::i;:::-;;:::i;40652:258::-;;;;;;;;;;-1:-1:-1;40652:258:0;;;;;:::i;:::-;;:::i;32723:29::-;;;;;;;;;;-1:-1:-1;32723:29:0;;;;-1:-1:-1;;;;;32723:29:0;;;32866:35;;;;;;;;;;;;;;;;39862:497;;;;;;;;;;-1:-1:-1;39862:497:0;;;;;:::i;:::-;;:::i;33101:27::-;;;;;;;;;;;;;;;;12192:151;;;;;;;;;;-1:-1:-1;12192:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;12308:18:0;;;12281:7;12308:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12192:151;32908:33;;;;;;;;;;;;;;;;44929:161;;;;;;;;;;-1:-1:-1;44929:161:0;;;;;:::i;:::-;;:::i;33135:37::-;;;;;;;;;;;;;;;;33224:29;;;;;;;;;;;;;;;;42165:887;;;;;;;;;;-1:-1:-1;42165:887:0;;;;;:::i;:::-;;:::i;33339:30::-;;;;;;;;;;;;;;;;4098:201;;;;;;;;;;-1:-1:-1;4098:201:0;;;;;:::i;:::-;;:::i;44504:229::-;;;;;;;;;;-1:-1:-1;44504:229:0;;;;;:::i;:::-;;:::i;33620:33::-;;;;;;;;;;;;;;;;33660:31;;;;;;;;;;;;;;;;32832:25;;;;;;;;;;-1:-1:-1;32832:25:0;;;;-1:-1:-1;;;;;32832:25:0;;;32948:24;;;;;;;;;;;;;;;;10323:100;10377:13;10410:5;10403:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10323:100;:::o;12490:169::-;12573:4;12590:39;2136:10;12613:7;12622:6;12590:8;:39::i;:::-;-1:-1:-1;12647:4:0;12490:169;;;;;:::o;41289:868::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;;;;;;;;;41593:22:::1;:45:::0;;;41649:23:::1;:47:::0;;;41707:14:::1;:29:::0;;;41747:18:::1;:37:::0;;;41795:17:::1;:35:::0;;;41841:15:::1;:31:::0;;;41883:16:::1;:33:::0;;;41902:14;41859:13;41815:15;41768:16;41724:12;41942:47:::1;41618:20:::0;;41942:47:::1;:::i;:::-;:64;;;;:::i;:::-;:85;;;;:::i;:::-;:105;;;;:::i;:::-;:123;;;;:::i;:::-;:142;;;;:::i;:::-;41927:12;:157:::0;;;42119:2:::1;-1:-1:-1::0;42103:18:0::1;42095:54;;;::::0;-1:-1:-1;;;42095:54:0;;7150:2:1;42095:54:0::1;::::0;::::1;7132:21:1::0;7189:2;7169:18;;;7162:30;7228:25;7208:18;;;7201:53;7271:18;;42095:54:0::1;6948:347:1::0;42095:54:0::1;41289:868:::0;;;;;;;:::o;40367:277::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;40506:4:::1;40498;40475:13;11531:12:::0;;;11443:108;40475:13:::1;:19;::::0;40491:3:::1;40475:19;:::i;:::-;40474:28;;;;:::i;:::-;40473:37;;;;:::i;:::-;40463:6;:47;;40441:144;;;::::0;-1:-1:-1;;;40441:144:0;;7897:2:1;40441:144:0::1;::::0;::::1;7879:21:1::0;7936:2;7916:18;;;7909:30;7975:34;7955:18;;;7948:62;-1:-1:-1;;;8026:18:1;;;8019:45;8081:19;;40441:144:0::1;7695:411:1::0;40441:144:0::1;40619:17;:6:::0;40629::::1;40619:17;:::i;:::-;40596:20;:40:::0;-1:-1:-1;40367:277:0:o;13141:492::-;13281:4;13298:36;13308:6;13316:9;13327:6;13298:9;:36::i;:::-;-1:-1:-1;;;;;13374:19:0;;13347:24;13374:19;;;:11;:19;;;;;;;;2136:10;13374:33;;;;;;;;13426:26;;;;13418:79;;;;-1:-1:-1;;;13418:79:0;;8313:2:1;13418:79:0;;;8295:21:1;8352:2;8332:18;;;8325:30;8391:34;8371:18;;;8364:62;-1:-1:-1;;;8442:18:1;;;8435:38;8490:19;;13418:79:0;8111:404:1;13418:79:0;13533:57;13542:6;2136:10;13583:6;13564:16;:25;13533:8;:57::i;:::-;-1:-1:-1;13621:4:0;;13141:492;-1:-1:-1;;;;13141:492:0:o;53780:257::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;53859:46:::1;::::0;-1:-1:-1;;;53859:46:0;;53874:4:::1;53859:46;::::0;::::1;2428:51:1::0;;;53841:15:0::1;::::0;53859:31:::1;::::0;2401:18:1;;53859:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53916:51;::::0;-1:-1:-1;;;53916:51:0;;53947:10:::1;53916:51;::::0;::::1;8883::1::0;8950:18;;;8943:34;;;53841:64:0;;-1:-1:-1;53931:4:0::1;::::0;53916:30:::1;::::0;8856:18:1;;53916:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;53978:51:0::1;::::0;53986:10:::1;::::0;54007:21:::1;53978:51:::0;::::1;;;::::0;::::1;::::0;;;54007:21;53986:10;53978:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;53830:207;53780:257::o:0;14042:215::-;2136:10;14130:4;14179:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14179:34:0;;;;;;;;;;14130:4;;14147:80;;14170:7;;14179:47;;14216:10;;14179:47;:::i;:::-;14147:8;:80::i;54341:160::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;54442:10:::1;::::0;54434:59:::1;::::0;54398:12:::1;::::0;-1:-1:-1;;;;;54442:10:0::1;::::0;54467:21:::1;::::0;54398:12;54434:59;54398:12;54434:59;54467:21;54442:10;54434:59:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;54341:160:0:o;54717:82::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;54790:1:::1;54778:9;:13:::0;54717:82::o;44741:180::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;44862:11:::1;::::0;44827:47:::1;::::0;-1:-1:-1;;;;;44862:11:0;;::::1;::::0;44827:47;::::1;::::0;::::1;::::0;44862:11:::1;::::0;44827:47:::1;44885:11;:28:::0;;-1:-1:-1;;;;;;44885:28:0::1;-1:-1:-1::0;;;;;44885:28:0;;;::::1;::::0;;;::::1;::::0;;44741:180::o;44295:201::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;44428:14:::1;::::0;44387:56:::1;::::0;-1:-1:-1;;;;;44428:14:0;;::::1;::::0;44387:56;::::1;::::0;::::1;::::0;44428:14:::1;::::0;44387:56:::1;44454:14;:34:::0;;-1:-1:-1;;;;;;44454:34:0::1;-1:-1:-1::0;;;;;44454:34:0;;;::::1;::::0;;;::::1;::::0;;44295:201::o;3840:103::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;3905:30:::1;3932:1;3905:18;:30::i;:::-;3840:103::o:0;39671:121::-;3262:6;;39723:4;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;-1:-1:-1;39740:14:0::1;:22:::0;;-1:-1:-1;;39740:22:0::1;::::0;;;39671:121;:::o;40918:167::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41031:39:0;;;::::1;;::::0;;;:31:::1;:39;::::0;;;;:46;;-1:-1:-1;;41031:46:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40918:167::o;54513:196::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;54586:12:::1;54604:6;-1:-1:-1::0;;;;;54604:11:0::1;54637:21;54604:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54585:89;;;54693:7;54685:16;;;::::0;::::1;45232:193:::0;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;45319:9:::1;45314:104;45338:9;:16;45334:1;:20;45314:104;;;45402:4;45376:9;:23;45386:9;45396:1;45386:12;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;45376:23:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;45376:23:0;:30;;-1:-1:-1;;45376:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;45356:3:0::1;45314:104;;43758:257:::0;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;43923:22:::1;::::0;43866:80:::1;::::0;-1:-1:-1;;;;;43923:22:0;;::::1;::::0;43866:80;::::1;::::0;::::1;::::0;43923:22:::1;::::0;43866:80:::1;43957:22;:50:::0;;-1:-1:-1;;;;;;43957:50:0::1;-1:-1:-1::0;;;;;43957:50:0;;;::::1;::::0;;;::::1;::::0;;43758:257::o;39471:148::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;39526:13:::1;:20:::0;;-1:-1:-1;;39557:18:0;;;;;39586:17:::1;:25:::0;;-1:-1:-1;;39586:25:0::1;::::0;;39471:148::o;41181:100::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;41252:11:::1;:21:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;41252:21:0;;::::1;::::0;;;::::1;::::0;;41181:100::o;10542:104::-;10598:13;10631:7;10624:14;;;;;:::i;43250:304::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;43394:13:::1;-1:-1:-1::0;;;;;43386:21:0::1;:4;-1:-1:-1::0;;;;;43386:21:0::1;::::0;43364:128:::1;;;::::0;-1:-1:-1;;;43364:128:0;;9782:2:1;43364:128:0::1;::::0;::::1;9764:21:1::0;9821:2;9801:18;;;9794:30;9860:34;9840:18;;;9833:62;9931:27;9911:18;;;9904:55;9976:19;;43364:128:0::1;9580:421:1::0;43364:128:0::1;43505:41;43534:4;43540:5;43505:28;:41::i;14760:413::-:0;2136:10;14853:4;14897:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14897:34:0;;;;;;;;;;14950:35;;;;14942:85;;;;-1:-1:-1;;;14942:85:0;;10208:2:1;14942:85:0;;;10190:21:1;10247:2;10227:18;;;10220:30;10286:34;10266:18;;;10259:62;-1:-1:-1;;;10337:18:1;;;10330:35;10382:19;;14942:85:0;10006:401:1;14942:85:0;15063:67;2136:10;15086:7;15114:15;15095:16;:34;15063:8;:67::i;:::-;-1:-1:-1;15161:4:0;;14760:413;-1:-1:-1;;;14760:413:0:o;11954:175::-;12040:4;12057:42;2136:10;12081:9;12092:6;12057:9;:42::i;54807:258::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54906:32:0;::::1;;::::0;;;:25:::1;:32;::::0;;;;:47;;-1:-1:-1;;54906:47:0::1;::::0;::::1;;;::::0;;54964:36:::1;54906:32:::0;:47;54964:15:::1;:36::i;:::-;55011:46;55037:5;55044:12;55011:25;:46::i;44023:264::-:0;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;44192:23:::1;::::0;44133:83:::1;::::0;-1:-1:-1;;;;;44192:23:0;;::::1;::::0;44133:83;::::1;::::0;::::1;::::0;44192:23:::1;::::0;44133:83:::1;44227:23;:52:::0;;-1:-1:-1;;;;;;44227:52:0::1;-1:-1:-1::0;;;;;44227:52:0;;;::::1;::::0;;;::::1;::::0;;44023:264::o;54045:288::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;54140:20:0;::::1;54132:59;;;::::0;-1:-1:-1;;;54132:59:0;;10614:2:1;54132:59:0::1;::::0;::::1;10596:21:1::0;10653:2;10633:18;;;10626:30;10692:28;10672:18;;;10665:56;10738:18;;54132:59:0::1;10412:350:1::0;54132:59:0::1;54229:39;::::0;-1:-1:-1;;;54229:39:0;;54262:4:::1;54229:39;::::0;::::1;2428:51:1::0;54202:24:0::1;::::0;-1:-1:-1;;;;;54229:24:0;::::1;::::0;::::1;::::0;2401:18:1;;54229:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54279:46;::::0;-1:-1:-1;;;54279:46:0;;-1:-1:-1;;;;;8901:32:1;;;54279:46:0::1;::::0;::::1;8883:51:1::0;8950:18;;;8943:34;;;54202:66:0;;-1:-1:-1;54279:23:0;;::::1;::::0;::::1;::::0;8856:18:1;;54279:46:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43060:182::-:0;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;43145:28:0;::::1;;::::0;;;:19:::1;:28;::::0;;;;;;;;:39;;-1:-1:-1;;43145:39:0::1;::::0;::::1;;::::0;;::::1;::::0;;;43200:34;;1172:41:1;;;43200:34:0::1;::::0;1145:18:1;43200:34:0::1;;;;;;;43060:182:::0;;:::o;40652:258::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;40794:4:::1;40786;40763:13;11531:12:::0;;;11443:108;40763:13:::1;:19;::::0;40779:3:::1;40763:19;:::i;:::-;40762:28;;;;:::i;:::-;40761:37;;;;:::i;:::-;40751:6;:47;;40729:133;;;::::0;-1:-1:-1;;;40729:133:0;;10969:2:1;40729:133:0::1;::::0;::::1;10951:21:1::0;11008:2;10988:18;;;10981:30;11047:34;11027:18;;;11020:62;-1:-1:-1;;;11098:18:1;;;11091:34;11142:19;;40729:133:0::1;10767:400:1::0;40729:133:0::1;40885:17;:6:::0;40895::::1;40885:17;:::i;:::-;40873:9;:29:::0;-1:-1:-1;40652:258:0:o;39862:497::-;3262:6;;39970:4;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;40049:6:::1;40028:13;11531:12:::0;;;11443:108;40028:13:::1;:17;::::0;40044:1:::1;40028:17;:::i;:::-;40027:28;;;;:::i;:::-;40014:9;:41;;39992:144;;;::::0;-1:-1:-1;;;39992:144:0;;11374:2:1;39992:144:0::1;::::0;::::1;11356:21:1::0;11413:2;11393:18;;;11386:30;11452:34;11432:18;;;11425:62;-1:-1:-1;;;11503:18:1;;;11496:51;11564:19;;39992:144:0::1;11172:417:1::0;39992:144:0::1;40204:4;40183:13;11531:12:::0;;;11443:108;40183:13:::1;:17;::::0;40199:1:::1;40183:17;:::i;:::-;40182:26;;;;:::i;:::-;40169:9;:39;;40147:141;;;::::0;-1:-1:-1;;;40147:141:0;;11796:2:1;40147:141:0::1;::::0;::::1;11778:21:1::0;11835:2;11815:18;;;11808:30;11874:34;11854:18;;;11847:62;-1:-1:-1;;;11925:18:1;;;11918:50;11985:19;;40147:141:0::1;11594:416:1::0;40147:141:0::1;-1:-1:-1::0;40299:18:0::1;:30:::0;;;40347:4:::1;3480:1;39862:497:::0;;;:::o;44929:161::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;45038:10:::1;::::0;45009:40:::1;::::0;-1:-1:-1;;;;;45038:10:0;;::::1;::::0;45009:40;::::1;::::0;::::1;::::0;45038:10:::1;::::0;45009:40:::1;45060:10;:22:::0;;-1:-1:-1;;;;;;45060:22:0::1;-1:-1:-1::0;;;;;45060:22:0;;;::::1;::::0;;;::::1;::::0;;44929:161::o;42165:887::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;42470:23:::1;:46:::0;;;42527:24:::1;:48:::0;;;42586:15:::1;:30:::0;;;42627:19:::1;:38:::0;;;42676:18:::1;:36:::0;;;42723:16:::1;:32:::0;;;42766:17:::1;:34:::0;;;42786:14;42742:13;42697:15;42649:16;42604:12;42827:50:::1;42554:21:::0;42496:20;42827:50:::1;:::i;:::-;:68;;;;:::i;:::-;:90;;;;:::i;:::-;:111;;;;:::i;:::-;:130;;;;:::i;:::-;:150;;;;:::i;:::-;42811:13;:166:::0;;;43013:2:::1;-1:-1:-1::0;42996:19:0::1;42988:56;;;::::0;-1:-1:-1;;;42988:56:0;;12217:2:1;42988:56:0::1;::::0;::::1;12199:21:1::0;12256:2;12236:18;;;12229:30;12295:26;12275:18;;;12268:54;12339:18;;42988:56:0::1;12015:348:1::0;4098:201:0;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4187:22:0;::::1;4179:73;;;::::0;-1:-1:-1;;;4179:73:0;;12570:2:1;4179:73:0::1;::::0;::::1;12552:21:1::0;12609:2;12589:18;;;12582:30;12648:34;12628:18;;;12621:62;-1:-1:-1;;;12699:18:1;;;12692:36;12745:19;;4179:73:0::1;12368:402:1::0;4179:73:0::1;4263:28;4282:8;4263:18;:28::i;:::-;4098:201:::0;:::o;44504:229::-;3262:6;;-1:-1:-1;;;;;3262:6:0;2136:10;3409:23;3401:68;;;;-1:-1:-1;;;3401:68:0;;;;;;;:::i;:::-;44653:18:::1;::::0;44604:68:::1;::::0;-1:-1:-1;;;;;44653:18:0;;::::1;::::0;44604:68;::::1;::::0;::::1;::::0;44653:18:::1;::::0;44604:68:::1;44683:18;:42:::0;;-1:-1:-1;;;;;;44683:42:0::1;-1:-1:-1::0;;;;;44683:42:0;;;::::1;::::0;;;::::1;::::0;;44504:229::o;18444:380::-;-1:-1:-1;;;;;18580:19:0;;18572:68;;;;-1:-1:-1;;;18572:68:0;;12977:2:1;18572:68:0;;;12959:21:1;13016:2;12996:18;;;12989:30;13055:34;13035:18;;;13028:62;-1:-1:-1;;;13106:18:1;;;13099:34;13150:19;;18572:68:0;12775:400:1;18572:68:0;-1:-1:-1;;;;;18659:21:0;;18651:68;;;;-1:-1:-1;;;18651:68:0;;13382:2:1;18651:68:0;;;13364:21:1;13421:2;13401:18;;;13394:30;13460:34;13440:18;;;13433:62;-1:-1:-1;;;13511:18:1;;;13504:32;13553:19;;18651:68:0;13180:398:1;18651:68:0;-1:-1:-1;;;;;18732:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;18784:32;;1967:25:1;;;18784:32:0;;1940:18:1;18784:32:0;;;;;;;18444:380;;;:::o;45433:4629::-;-1:-1:-1;;;;;45565:18:0;;45557:68;;;;-1:-1:-1;;;45557:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45644:16:0;;45636:64;;;;-1:-1:-1;;;45636:64:0;;;;;;;:::i;:::-;45717:17;;;;45713:135;;;-1:-1:-1;;;;;45759:31:0;;;;;;:25;:31;;;;;;;;45751:85;;;;-1:-1:-1;;;45751:85:0;;14595:2:1;45751:85:0;;;14577:21:1;14634:2;14614:18;;;14607:30;14673:34;14653:18;;;14646:62;-1:-1:-1;;;14724:18:1;;;14717:39;14773:19;;45751:85:0;14393:405:1;45751:85:0;45864:6;45874:1;45864:11;45860:93;;45892:28;45908:4;45914:2;45918:1;45892:15;:28::i;:::-;45433:4629;;;:::o;45860:93::-;45969:14;;;;45965:1694;;;3262:6;;-1:-1:-1;;;;;46022:15:0;;;3262:6;;46022:15;;;;:49;;-1:-1:-1;3262:6:0;;-1:-1:-1;;;;;46058:13:0;;;3262:6;;46058:13;;46022:49;:86;;;;-1:-1:-1;;;;;;46092:16:0;;;;46022:86;:128;;;;-1:-1:-1;;;;;;46129:21:0;;46143:6;46129:21;;46022:128;:158;;;;-1:-1:-1;46172:8:0;;-1:-1:-1;;;46172:8:0;;;;46171:9;46022:158;46000:1648;;;46220:13;;;;;;;46215:223;;-1:-1:-1;;;;;46292:25:0;;;;;;:19;:25;;;;;;;;;:52;;-1:-1:-1;;;;;;46321:23:0;;;;;;:19;:23;;;;;;;;46292:52;46258:160;;;;-1:-1:-1;;;46258:160:0;;15005:2:1;46258:160:0;;;14987:21:1;15044:2;15024:18;;;15017:30;-1:-1:-1;;;15063:18:1;;;15056:52;15125:18;;46258:160:0;14803:346:1;46258:160:0;-1:-1:-1;;;;;46512:31:0;;;;;;:25;:31;;;;;;;;:92;;;;-1:-1:-1;;;;;;46569:35:0;;;;;;:31;:35;;;;;;;;46568:36;46512:92;46486:1147;;;46691:20;;46681:6;:30;;46647:169;;;;-1:-1:-1;;;46647:169:0;;15356:2:1;46647:169:0;;;15338:21:1;15395:2;15375:18;;;15368:30;15434:34;15414:18;;;15407:62;-1:-1:-1;;;15485:18:1;;;15478:51;15546:19;;46647:169:0;15154:417:1;46647:169:0;46899:9;;-1:-1:-1;;;;;11715:18:0;;11688:7;11715:18;;;;;;;;;;;46873:22;;:6;:22;:::i;:::-;:35;;46839:140;;;;-1:-1:-1;;;46839:140:0;;15778:2:1;46839:140:0;;;15760:21:1;15817:2;15797:18;;;15790:30;-1:-1:-1;;;15836:18:1;;;15829:49;15895:18;;46839:140:0;15576:343:1;46839:140:0;46486:1147;;;-1:-1:-1;;;;;47077:29:0;;;;;;:25;:29;;;;;;;;:92;;;;-1:-1:-1;;;;;;47132:37:0;;;;;;:31;:37;;;;;;;;47131:38;47077:92;47051:582;;;47256:20;;47246:6;:30;;47212:170;;;;-1:-1:-1;;;47212:170:0;;16126:2:1;47212:170:0;;;16108:21:1;16165:2;16145:18;;;16138:30;16204:34;16184:18;;;16177:62;-1:-1:-1;;;16255:18:1;;;16248:52;16317:19;;47212:170:0;15924:418:1;47051:582:0;-1:-1:-1;;;;;47413:35:0;;;;;;:31;:35;;;;;;;;47408:225;;47533:9;;-1:-1:-1;;;;;11715:18:0;;11688:7;11715:18;;;;;;;;;;;47507:22;;:6;:22;:::i;:::-;:35;;47473:140;;;;-1:-1:-1;;;47473:140:0;;15778:2:1;47473:140:0;;;15760:21:1;15817:2;15797:18;;;15790:30;-1:-1:-1;;;15836:18:1;;;15829:49;15895:18;;47473:140:0;15576:343:1;47473:140:0;47720:4;47671:28;11715:18;;;;;;;;;;;47778;;47754:42;;;;;;;47827:35;;-1:-1:-1;47851:11:0;;;;;;;47827:35;:61;;;;-1:-1:-1;47880:8:0;;-1:-1:-1;;;47880:8:0;;;;47879:9;47827:61;:110;;;;-1:-1:-1;;;;;;47906:31:0;;;;;;:25;:31;;;;;;;;47905:32;47827:110;:153;;;;-1:-1:-1;;;;;;47955:25:0;;;;;;:19;:25;;;;;;;;47954:26;47827:153;:194;;;;-1:-1:-1;;;;;;47998:23:0;;;;;;:19;:23;;;;;;;;47997:24;47827:194;47809:326;;;48048:8;:15;;-1:-1:-1;;;;48048:15:0;-1:-1:-1;;;48048:15:0;;;48080:10;:8;:10::i;:::-;48107:8;:16;;-1:-1:-1;;;;48107:16:0;;;47809:326;48163:8;;-1:-1:-1;;;;;48273:25:0;;48147:12;48273:25;;;:19;:25;;;;;;48163:8;-1:-1:-1;;;48163:8:0;;;;;48162:9;;48273:25;;:52;;-1:-1:-1;;;;;;48302:23:0;;;;;;:19;:23;;;;;;;;48273:52;48269:100;;;-1:-1:-1;48352:5:0;48269:100;48381:12;48486:7;48482:1527;;;-1:-1:-1;;;;;48538:29:0;;;;;;:25;:29;;;;;;;;:50;;;;;48587:1;48571:13;;:17;48538:50;48534:1326;;;48616:34;48646:3;48616:25;48627:13;;48616:6;:10;;:25;;;;:::i;:::-;:29;;:34::i;:::-;48609:41;;48719:13;;48699:16;;48692:4;:23;;;;:::i;:::-;48691:41;;;;:::i;:::-;48669:18;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;48803:13:0;;48782:17;;48775:24;;:4;:24;:::i;:::-;48774:42;;;;:::i;:::-;48751:19;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;48899:13:0;;48872:23;;48865:30;;:4;:30;:::i;:::-;48864:48;;;;:::i;:::-;48835:25;;:77;;;;;;;:::i;:::-;;;;-1:-1:-1;;48979:13:0;;48960:15;;48953:22;;:4;:22;:::i;:::-;48952:40;;;;:::i;:::-;48931:17;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;49067:13:0;;49044:19;;49037:26;;:4;:26;:::i;:::-;49036:44;;;;:::i;:::-;49011:21;;:69;;;;;;;:::i;:::-;;;;-1:-1:-1;;49153:13:0;;49131:18;;49124:25;;:4;:25;:::i;:::-;49123:43;;;;:::i;:::-;49099:20;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;48534:1326:0;;-1:-1:-1;48534:1326:0;;-1:-1:-1;;;;;49228:31:0;;;;;;:25;:31;;;;;;;;:51;;;;;49278:1;49263:12;;:16;49228:51;49224:636;;;49307:33;49336:3;49307:24;49318:12;;49307:6;:10;;:24;;;;:::i;:33::-;49300:40;;49408:12;;49389:15;;49382:4;:22;;;;:::i;:::-;49381:39;;;;:::i;:::-;49359:18;;:61;;;;;;;:::i;:::-;;;;-1:-1:-1;;49490:12:0;;49470:16;;49463:23;;:4;:23;:::i;:::-;49462:40;;;;:::i;:::-;49439:19;;:63;;;;;;;:::i;:::-;;;;-1:-1:-1;;49584:12:0;;49558:22;;49551:29;;:4;:29;:::i;:::-;49550:46;;;;:::i;:::-;49521:25;;:75;;;;;;;:::i;:::-;;;;-1:-1:-1;;49662:12:0;;49644:14;;49637:21;;:4;:21;:::i;:::-;49636:38;;;;:::i;:::-;49615:17;;:59;;;;;;;:::i;:::-;;;;-1:-1:-1;;49748:12:0;;49726:18;;49719:25;;:4;:25;:::i;:::-;49718:42;;;;:::i;:::-;49693:21;;:67;;;;;;;:::i;:::-;;;;-1:-1:-1;;49832:12:0;;49811:17;;49804:24;;:4;:24;:::i;:::-;49803:41;;;;:::i;:::-;49779:20;;:65;;;;;;;:::i;:::-;;;;-1:-1:-1;;49224:636:0;49880:8;;49876:91;;49909:42;49925:4;49939;49946;49909:15;:42::i;:::-;49983:14;49993:4;49983:14;;:::i;:::-;;;48482:1527;50021:33;50037:4;50043:2;50047:6;50021:15;:33::i;4459:191::-;4552:6;;;-1:-1:-1;;;;;4569:17:0;;;-1:-1:-1;;;;;;4569:17:0;;;;;;;4602:40;;4552:6;;;4569:17;4552:6;;4602:40;;4533:16;;4602:40;4522:128;4459:191;:::o;43562:188::-;-1:-1:-1;;;;;43645:31:0;;;;;;:25;:31;;;;;;:39;;-1:-1:-1;;43645:39:0;;;;;;;;;;43702:40;;43645:39;;:31;43702:40;;;43562:188;;:::o;15663:733::-;-1:-1:-1;;;;;15803:20:0;;15795:70;;;;-1:-1:-1;;;15795:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15884:23:0;;15876:71;;;;-1:-1:-1;;;15876:71:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;16044:17:0;;16020:21;16044:17;;;;;;;;;;;16080:23;;;;16072:74;;;;-1:-1:-1;;;16072:74:0;;16682:2:1;16072:74:0;;;16664:21:1;16721:2;16701:18;;;16694:30;16760:34;16740:18;;;16733:62;-1:-1:-1;;;16811:18:1;;;16804:36;16857:19;;16072:74:0;16480:402:1;16072:74:0;-1:-1:-1;;;;;16182:17:0;;;:9;:17;;;;;;;;;;;16202:22;;;16182:42;;16246:20;;;;;;;;:30;;16218:6;;16182:9;16246:30;;16218:6;;16246:30;:::i;:::-;;;;;;;;16311:9;-1:-1:-1;;;;;16294:35:0;16303:6;-1:-1:-1;;;;;16294:35:0;;16322:6;16294:35;;;;1967:25:1;;1955:2;1940:18;;1821:177;16294:35:0;;;;;;;;16342:46;45433:4629;51188:2584;51271:4;51227:23;11715:18;;;;;;;;;;;51227:50;;51288:25;51497:19;;51461:20;;51424:21;;51391:17;;51350:25;;51316:18;;:59;;;;:::i;:::-;:92;;;;:::i;:::-;:129;;;;:::i;:::-;:165;;;;:::i;:::-;:200;;;;:::i;:::-;51288:228;-1:-1:-1;51527:12:0;51556:20;;;:46;;-1:-1:-1;51580:22:0;;51556:46;51552:85;;;51619:7;;;51188:2584::o;51552:85::-;51671:18;;:23;;51692:2;51671:23;:::i;:::-;51653:15;:41;51649:115;;;51729:18;;:23;;51750:2;51729:23;:::i;:::-;51711:41;;51649:115;51825:23;51938:1;51905:17;51870:18;;51852:15;:36;;;;:::i;:::-;51851:71;;;;:::i;:::-;:88;;;;:::i;:::-;51825:114;-1:-1:-1;51950:26:0;51979:36;:15;51825:114;51979:19;:36::i;:::-;51950:65;-1:-1:-1;52056:21:0;52090:36;51950:65;52090:16;:36::i;:::-;52139:18;52160:44;:21;52186:17;52160:25;:44::i;:::-;52139:65;;52217:30;52250:91;52338:1;52317:18;;:22;;;;:::i;:::-;52296:44;;:17;:44;:::i;:::-;52265:25;;52250:41;;:10;;:14;:41::i;:91::-;52217:124;;52354:31;52388:92;52477:1;52456:18;;:22;;;;:::i;:::-;52435:44;;:17;:44;:::i;:::-;52403:26;;52388:42;;:10;;:14;:42::i;:92::-;52354:126;;52493:22;52518:83;52598:1;52577:18;;:22;;;;:::i;:::-;52556:44;;:17;:44;:::i;:::-;52533:17;;52518:33;;:10;;:14;:33::i;:83::-;52493:108;;52614:25;52642:86;52725:1;52704:18;;:22;;;;:::i;:::-;52683:44;;:17;:44;:::i;:::-;52657:20;;52642:36;;:10;;:14;:36::i;:86::-;52614:114;;52749:24;52776:85;52858:1;52837:18;;:22;;;;:::i;:::-;52816:44;;:17;:44;:::i;:::-;52791:19;;52776:35;;:10;;:14;:35::i;:85::-;52749:112;-1:-1:-1;52874:23:0;52749:112;52998:17;52981:14;;52938:23;52900:35;52913:22;52900:10;:35;:::i;:::-;:61;;;;:::i;:::-;:78;;;;:::i;:::-;:95;;;;:::i;:::-;:115;;;;:::i;:::-;:134;;;;:::i;:::-;53068:1;53047:18;:22;;;53080:25;:29;;;53120:26;:30;;;53161:17;:21;;;53193;:25;;;53229:20;:24;;;53264:19;:23;;;53322:10;;53314:53;;52874:160;;-1:-1:-1;;;;;;53322:10:0;;53346:16;;53314:53;53068:1;53314:53;53346:16;53322:10;53314:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53300:67:0;;-1:-1:-1;;53384:19:0;;;;;:42;;;53425:1;53407:15;:19;53384:42;53380:278;;;53443:46;53456:15;53473;53443:12;:46::i;:::-;53613:18;;53509:137;;;17089:25:1;;;17145:2;17130:18;;17123:34;;;17173:18;;;17166:34;;;;53509:137:0;;;;;;17077:2:1;53509:137:0;;;53380:278;53692:22;;53684:70;;-1:-1:-1;;;;;53692:22:0;;;;53728:21;;53684:70;;;;53728:21;53692:22;53684:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;51188:2584:0:o;23576:98::-;23634:7;23661:5;23665:1;23661;:5;:::i;:::-;23654:12;23576:98;-1:-1:-1;;;23576:98:0:o;23975:::-;24033:7;24060:5;24064:1;24060;:5;:::i;23219:98::-;23277:7;23304:5;23308:1;23304;:5;:::i;50070:589::-;50220:16;;;50234:1;50220:16;;;;;;;;50196:21;;50220:16;;;;;;;;;;-1:-1:-1;50220:16:0;50196:40;;50265:4;50247;50252:1;50247:7;;;;;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;50247:23:0;;;-1:-1:-1;;;;;50247:23:0;;;;;50291:15;-1:-1:-1;;;;;50291:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50281:4;50286:1;50281:7;;;;;;;;:::i;:::-;;;;;;:32;-1:-1:-1;;;;;50281:32:0;;;-1:-1:-1;;;;;50281:32:0;;;;;50326:62;50343:4;50358:15;50376:11;50326:8;:62::i;:::-;50427:224;;-1:-1:-1;;;50427:224:0;;-1:-1:-1;;;;;50427:15:0;:66;;;;:224;;50508:11;;50534:1;;50578:4;;50605;;50625:15;;50427:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50125:534;50070:589;:::o;50667:513::-;50815:62;50832:4;50847:15;50865:11;50815:8;:62::i;:::-;50920:15;-1:-1:-1;;;;;50920:31:0;;50959:9;50992:4;51012:11;51038:1;51081;51124:7;3262:6;;-1:-1:-1;;;;;3262:6:0;;3189:87;51124:7;50920:252;;;;;;-1:-1:-1;;;;;;50920:252:0;;;-1:-1:-1;;;;;18811:15:1;;;50920:252:0;;;18793:34:1;18843:18;;;18836:34;;;;18886:18;;;18879:34;;;;18929:18;;;18922:34;18993:15;;;18972:19;;;18965:44;51146:15:0;19025:19:1;;;19018:35;18727:19;;50920:252:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;50667:513;;:::o;14:418:1:-;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:131::-;-1:-1:-1;;;;;512:31:1;;502:42;;492:70;;558:1;555;548:12;573:134;641:20;;670:31;641:20;670:31;:::i;712:315::-;780:6;788;841:2;829:9;820:7;816:23;812:32;809:52;;;857:1;854;847:12;809:52;896:9;883:23;915:31;940:5;915:31;:::i;:::-;965:5;1017:2;1002:18;;;;989:32;;-1:-1:-1;;;712:315:1:o;1224:592::-;1337:6;1345;1353;1361;1369;1377;1385;1438:3;1426:9;1417:7;1413:23;1409:33;1406:53;;;1455:1;1452;1445:12;1406:53;-1:-1:-1;;1478:23:1;;;1548:2;1533:18;;1520:32;;-1:-1:-1;1599:2:1;1584:18;;1571:32;;1650:2;1635:18;;1622:32;;-1:-1:-1;1701:3:1;1686:19;;1673:33;;-1:-1:-1;1753:3:1;1738:19;;1725:33;;-1:-1:-1;1805:3:1;1790:19;1777:33;;-1:-1:-1;1224:592:1;-1:-1:-1;1224:592:1:o;2003:247::-;2062:6;2115:2;2103:9;2094:7;2090:23;2086:32;2083:52;;;2131:1;2128;2121:12;2083:52;2170:9;2157:23;2189:31;2214:5;2189:31;:::i;2490:180::-;2549:6;2602:2;2590:9;2581:7;2577:23;2573:32;2570:52;;;2618:1;2615;2608:12;2570:52;-1:-1:-1;2641:23:1;;2490:180;-1:-1:-1;2490:180:1:o;2675:456::-;2752:6;2760;2768;2821:2;2809:9;2800:7;2796:23;2792:32;2789:52;;;2837:1;2834;2827:12;2789:52;2876:9;2863:23;2895:31;2920:5;2895:31;:::i;:::-;2945:5;-1:-1:-1;3002:2:1;2987:18;;2974:32;3015:33;2974:32;3015:33;:::i;:::-;2675:456;;3067:7;;-1:-1:-1;;;3121:2:1;3106:18;;;;3093:32;;2675:456::o;3533:118::-;3619:5;3612:13;3605:21;3598:5;3595:32;3585:60;;3641:1;3638;3631:12;3656:382;3721:6;3729;3782:2;3770:9;3761:7;3757:23;3753:32;3750:52;;;3798:1;3795;3788:12;3750:52;3837:9;3824:23;3856:31;3881:5;3856:31;:::i;:::-;3906:5;-1:-1:-1;3963:2:1;3948:18;;3935:32;3976:30;3935:32;3976:30;:::i;:::-;4025:7;4015:17;;;3656:382;;;;;:::o;4043:127::-;4104:10;4099:3;4095:20;4092:1;4085:31;4135:4;4132:1;4125:15;4159:4;4156:1;4149:15;4175:1121;4259:6;4290:2;4333;4321:9;4312:7;4308:23;4304:32;4301:52;;;4349:1;4346;4339:12;4301:52;4389:9;4376:23;4418:18;4459:2;4451:6;4448:14;4445:34;;;4475:1;4472;4465:12;4445:34;4513:6;4502:9;4498:22;4488:32;;4558:7;4551:4;4547:2;4543:13;4539:27;4529:55;;4580:1;4577;4570:12;4529:55;4616:2;4603:16;4638:2;4634;4631:10;4628:36;;;4644:18;;:::i;:::-;4690:2;4687:1;4683:10;4722:2;4716:9;4785:2;4781:7;4776:2;4772;4768:11;4764:25;4756:6;4752:38;4840:6;4828:10;4825:22;4820:2;4808:10;4805:18;4802:46;4799:72;;;4851:18;;:::i;:::-;4887:2;4880:22;4937:18;;;4971:15;;;;-1:-1:-1;5013:11:1;;;5009:20;;;5041:19;;;5038:39;;;5073:1;5070;5063:12;5038:39;5097:11;;;;5117:148;5133:6;5128:3;5125:15;5117:148;;;5199:23;5218:3;5199:23;:::i;:::-;5187:36;;5150:12;;;;5243;;;;5117:148;;;5284:6;4175:1121;-1:-1:-1;;;;;;;;4175:1121:1:o;5301:241::-;5357:6;5410:2;5398:9;5389:7;5385:23;5381:32;5378:52;;;5426:1;5423;5416:12;5378:52;5465:9;5452:23;5484:28;5506:5;5484:28;:::i;5547:388::-;5615:6;5623;5676:2;5664:9;5655:7;5651:23;5647:32;5644:52;;;5692:1;5689;5682:12;5644:52;5731:9;5718:23;5750:31;5775:5;5750:31;:::i;:::-;5800:5;-1:-1:-1;5857:2:1;5842:18;;5829:32;5870:33;5829:32;5870:33;:::i;5940:380::-;6019:1;6015:12;;;;6062;;;6083:61;;6137:4;6129:6;6125:17;6115:27;;6083:61;6190:2;6182:6;6179:14;6159:18;6156:38;6153:161;;6236:10;6231:3;6227:20;6224:1;6217:31;6271:4;6268:1;6261:15;6299:4;6296:1;6289:15;6153:161;;5940:380;;;:::o;6325:356::-;6527:2;6509:21;;;6546:18;;;6539:30;6605:34;6600:2;6585:18;;6578:62;6672:2;6657:18;;6325:356::o;6686:127::-;6747:10;6742:3;6738:20;6735:1;6728:31;6778:4;6775:1;6768:15;6802:4;6799:1;6792:15;6818:125;6883:9;;;6904:10;;;6901:36;;;6917:18;;:::i;7300:168::-;7373:9;;;7404;;7421:15;;;7415:22;;7401:37;7391:71;;7442:18;;:::i;7473:217::-;7513:1;7539;7529:132;;7583:10;7578:3;7574:20;7571:1;7564:31;7618:4;7615:1;7608:15;7646:4;7643:1;7636:15;7529:132;-1:-1:-1;7675:9:1;;7473:217::o;8520:184::-;8590:6;8643:2;8631:9;8622:7;8618:23;8614:32;8611:52;;;8659:1;8656;8649:12;8611:52;-1:-1:-1;8682:16:1;;8520:184;-1:-1:-1;8520:184:1:o;8988:245::-;9055:6;9108:2;9096:9;9087:7;9083:23;9079:32;9076:52;;;9124:1;9121;9114:12;9076:52;9156:9;9150:16;9175:28;9197:5;9175:28;:::i;9448:127::-;9509:10;9504:3;9500:20;9497:1;9490:31;9540:4;9537:1;9530:15;9564:4;9561:1;9554:15;13583:401;13785:2;13767:21;;;13824:2;13804:18;;;13797:30;13863:34;13858:2;13843:18;;13836:62;-1:-1:-1;;;13929:2:1;13914:18;;13907:35;13974:3;13959:19;;13583:401::o;13989:399::-;14191:2;14173:21;;;14230:2;14210:18;;;14203:30;14269:34;14264:2;14249:18;;14242:62;-1:-1:-1;;;14335:2:1;14320:18;;14313:33;14378:3;14363:19;;13989:399::o;16347:128::-;16414:9;;;16435:11;;;16432:37;;;16449:18;;:::i;17211:251::-;17281:6;17334:2;17322:9;17313:7;17309:23;17305:32;17302:52;;;17350:1;17347;17340:12;17302:52;17382:9;17376:16;17401:31;17426:5;17401:31;:::i;17467:980::-;17729:4;17777:3;17766:9;17762:19;17808:6;17797:9;17790:25;17834:2;17872:6;17867:2;17856:9;17852:18;17845:34;17915:3;17910:2;17899:9;17895:18;17888:31;17939:6;17974;17968:13;18005:6;17997;17990:22;18043:3;18032:9;18028:19;18021:26;;18082:2;18074:6;18070:15;18056:29;;18103:1;18113:195;18127:6;18124:1;18121:13;18113:195;;;18192:13;;-1:-1:-1;;;;;18188:39:1;18176:52;;18283:15;;;;18248:12;;;;18224:1;18142:9;18113:195;;;-1:-1:-1;;;;;;;18364:32:1;;;;18359:2;18344:18;;18337:60;-1:-1:-1;;;18428:3:1;18413:19;18406:35;18325:3;17467:980;-1:-1:-1;;;17467:980:1:o;19064:306::-;19152:6;19160;19168;19221:2;19209:9;19200:7;19196:23;19192:32;19189:52;;;19237:1;19234;19227:12;19189:52;19266:9;19260:16;19250:26;;19316:2;19305:9;19301:18;19295:25;19285:35;;19360:2;19349:9;19345:18;19339:25;19329:35;;19064:306;;;;;:::o

Swarm Source

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