ETH Price: $2,894.97 (+1.07%)
 

Overview

Max Total Supply

5,000,000,000 MOI

Holders

4,062 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
40 MOI

Value
$0.00
0x7667a4b32510575d6b75ed3d14f4a6d87c063063
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

MOI is a marketplace for NFT assets. Users can mint, purchase, and sell assets freely within the platform. MOI community is a social media space which allows users to display and share their own NFT items.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MOI

Compiler Version
v0.8.14+commit.80d49f37

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-27
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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

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

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

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

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

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

/**
 * @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:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);
    }

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

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

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

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

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

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

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

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

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

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

    event SupervisorOwnershipTransferred(address indexed previouSupervisor, address indexed newSupervisor);

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

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

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

    /**
     * @dev Transfers supervisor ownership of the contract to a new account (`newSupervisor`).
     * Internal function without access restriction.
     */
    function _transferSupervisorOwnership(address newSupervisor) internal virtual {
        address oldSupervisor = _supervisor;
        _supervisor = newSupervisor;
        emit SupervisorOwnershipTransferred(oldSupervisor, newSupervisor);
    }
}

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract Burnable is Context {
    mapping(address => bool) private _burners;

    event BurnerAdded(address indexed account);
    event BurnerRemoved(address indexed account);

    /**
     * @dev Returns whether the address is burner.
     */
    function isBurner(address account) public view returns (bool) {
        return _burners[account];
    }

    /**
     * @dev Throws if called by any account other than the burner.
     */
    modifier onlyBurner() {
        require(_burners[_msgSender()], "Burnable: caller is not the burner");
        _;
    }

    /**
     * @dev Add burner, only owner can add burner.
     */
    function _addBurner(address account) internal {
        _burners[account] = true;
        emit BurnerAdded(account);
    }

    /**
     * @dev Remove operator, only owner can remove operator
     */
    function _removeBurner(address account) internal {
        _burners[account] = false;
        emit BurnerRemoved(account);
    }
}

/**
 * @dev Contract for freezing mechanism.
 * Owner can add freezed account.
 * Supervisor can remove freezed account.
 */
contract Freezable is Context {
    mapping(address => bool) private _freezes;

    event Freezed(address indexed account);
    event Unfreezed(address indexed account);

    /**
     * @dev Freeze account, only owner can freeze
     */
    function _freeze(address account) internal {
        _freezes[account] = true;
        emit Freezed(account);
    }

    /**
     * @dev Unfreeze account, only supervisor can unfreeze
     */
    function _unfreeze(address account) internal {
        _freezes[account] = false;
        emit Unfreezed(account);
    }

    /**
     * @dev Returns whether the address is freezed.
     */
    function isFreezed(address account) public view returns (bool) {
        return _freezes[account];
    }
}

/**
 * @dev Contract for locking mechanism.
 * Locker can add locked account.
 * Supervisor can remove locked account.
 */
contract Lockable is Context {
    struct TimeLock {
        uint256 amount;
        uint256 expiresAt;
    }

    struct VestingLock {
        uint256 amount;
        uint256 startsAt;
        uint256 period;
        uint256 count;
    }

    mapping(address => bool) private _lockers;
    mapping(address => TimeLock[]) private _timeLocks;
    mapping(address => VestingLock) private _vestingLocks;

    event LockerAdded(address indexed account);
    event LockerRemoved(address indexed account);
    event TimeLocked(address indexed account);
    event TimeUnlocked(address indexed account);
    event VestingLocked(address indexed account);
    event VestingUnlocked(address indexed account);

    /**
     * @dev Throws if called by any account other than the locker.
     */
    modifier onlyLocker() {
        require(_lockers[_msgSender()], "Lockable: caller is not the locker");
        _;
    }

    /**
     * @dev Returns whether the address is locker.
     */
    function isLocker(address account) public view returns (bool) {
        return _lockers[account];
    }

    /**
     * @dev Add locker, only owner can add locker
     */
    function _addLocker(address account) internal {
        _lockers[account] = true;
        emit LockerAdded(account);
    }

    /**
     * @dev Remove locker, only owner can remove locker
     */
    function _removeLocker(address account) internal {
        _lockers[account] = false;
        emit LockerRemoved(account);
    }

    /**
     * @dev Add time lock, only locker can add
     */
    function _addTimeLock(
        address account,
        uint256 amount,
        uint256 expiresAt
    ) internal {
        require(amount > 0, "TimeLock: lock amount is 0");
        require(expiresAt > block.timestamp, "TimeLock: invalid expire date");
        _timeLocks[account].push(TimeLock(amount, expiresAt));
        emit TimeLocked(account);
    }

    /**
     * @dev Remove time lock, only supervisor can remove
     * @param account The address want to remove time lock
     * @param index Time lock index
     */
    function _removeTimeLock(address account, uint8 index) internal {
        require(_timeLocks[account].length > index && index >= 0, "TimeLock: invalid index");

        uint256 len = _timeLocks[account].length;
        if (len - 1 != index) {
            // if it is not last item, swap it
            _timeLocks[account][index] = _timeLocks[account][len - 1];
        }
        _timeLocks[account].pop();
        emit TimeUnlocked(account);
    }

    /**
     * @dev Get time lock array length
     * @param account The address want to know the time lock length.
     * @return time lock length
     */
    function getTimeLockLength(address account) public view returns (uint256) {
        return _timeLocks[account].length;
    }

    /**
     * @dev Get time lock info
     * @param account The address want to know the time lock state.
     * @param index Time lock index
     * @return time lock info
     */
    function getTimeLock(address account, uint8 index) public view returns (uint256, uint256) {
        require(_timeLocks[account].length > index && index >= 0, "TimeLock: invalid index");
        return (_timeLocks[account][index].amount, _timeLocks[account][index].expiresAt);
    }

    /**
     * @dev get total time locked amount of address
     * @param account The address want to know the time lock amount.
     * @return time locked amount
     */
    function getTimeLockedAmount(address account) public view returns (uint256) {
        uint256 timeLockedAmount = 0;

        uint256 len = _timeLocks[account].length;
        for (uint256 i = 0; i < len; i++) {
            if (block.timestamp < _timeLocks[account][i].expiresAt) {
                timeLockedAmount = timeLockedAmount + _timeLocks[account][i].amount;
            }
        }
        return timeLockedAmount;
    }

    /**
     * @dev Add vesting lock, only locker can add
     * @param account vesting lock account.
     * @param amount vesting lock amount.
     * @param startsAt vesting lock release start date.
     * @param period vesting lock period. End date is startsAt + (period - 1) * count
     * @param count vesting lock count. If count is 1, it works like a time lock
     */
    function _addVestingLock(
        address account,
        uint256 amount,
        uint256 startsAt,
        uint256 period,
        uint256 count
    ) internal {
        require(account != address(0), "VestingLock: lock from the zero address");
        require(startsAt > block.timestamp, "VestingLock: must set after now");
        require(amount > 0, "VestingLock: amount is 0");
        require(period > 0, "VestingLock: period is 0");
        require(count > 0, "VestingLock: count is 0");
        _vestingLocks[account] = VestingLock(amount, startsAt, period, count);
        emit VestingLocked(account);
    }

    /**
     * @dev Remove vesting lock, only supervisor can remove
     * @param account The address want to remove the vesting lock
     */
    function _removeVestingLock(address account) internal {
        _vestingLocks[account] = VestingLock(0, 0, 0, 0);
        emit VestingUnlocked(account);
    }

    /**
     * @dev Get vesting lock info
     * @param account The address want to know the vesting lock state.
     * @return vesting lock info
     */
    function getVestingLock(address account)
        public
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return (_vestingLocks[account].amount, _vestingLocks[account].startsAt, _vestingLocks[account].period, _vestingLocks[account].count);
    }

    /**
     * @dev Get total vesting locked amount of address, locked amount will be released by 100%/months
     * If months is 5, locked amount released 20% per 1 month.
     * @param account The address want to know the vesting lock amount.
     * @return vesting locked amount
     */
    function getVestingLockedAmount(address account) public view returns (uint256) {
        uint256 vestingLockedAmount = 0;
        uint256 amount = _vestingLocks[account].amount;
        if (amount > 0) {
            uint256 startsAt = _vestingLocks[account].startsAt;
            uint256 period = _vestingLocks[account].period;
            uint256 count = _vestingLocks[account].count;
            uint256 expiresAt = startsAt + period * (count - 1);
            uint256 timestamp = block.timestamp;
            if (timestamp < startsAt) {
                vestingLockedAmount = amount;
            } else if (timestamp < expiresAt) {
                vestingLockedAmount = (amount * ((expiresAt - timestamp) / period + 1)) / count;
            }
        }
        return vestingLockedAmount;
    }

    /**
     * @dev Get all locked amount
     * @param account The address want to know the all locked amount
     * @return all locked amount
     */
    function getAllLockedAmount(address account) public view returns (uint256) {
        return getTimeLockedAmount(account) + getVestingLockedAmount(account);
    }
}

/**
 * @dev Contract for MyOwnItem Coin
 */
contract MOI is Pausable, Ownable, Supervisable, Burnable, Freezable, Lockable, ERC20 {
    uint256 private constant _initialSupply = 5_000_000_000e18;

    constructor() ERC20("MyOwnItem", "MOI") {
        _mint(_msgSender(), _initialSupply);
    }

    /**
     * @dev Recover ERC20 coin in contract address.
     * @param tokenAddress The token contract address
     * @param tokenAmount Number of tokens to be sent
     */
    function recoverERC20(address tokenAddress, uint256 tokenAmount) public onlyOwner {
        IERC20(tokenAddress).transfer(owner(), tokenAmount);
    }

    /**
     * @dev lock and pause before transfer token
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override(ERC20) {
        super._beforeTokenTransfer(from, to, amount);

        require(!isFreezed(from), "Freezable: token transfer from freezed account");
        require(!isFreezed(to), "Freezable: token transfer to freezed account");
        require(!isFreezed(_msgSender()), "Freezable: token transfer called from freezed account");
        require(!paused(), "Pausable: token transfer while paused");
        require(balanceOf(from) - getAllLockedAmount(from) >= amount, "Lockable: insufficient transfer amount");
    }

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

    /**
     * @dev only supervisor can renounce supervisor ownership
     */
    function renounceSupervisorOwnership() public onlySupervisor whenNotPaused {
        _transferSupervisorOwnership(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 onlyOwner whenNotPaused {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev only supervisor can transfer supervisor ownership
     */
    function transferSupervisorOwnership(address newSupervisor) public onlySupervisor whenNotPaused {
        require(newSupervisor != address(0), "Supervisable: new supervisor is the zero address");
        _transferSupervisorOwnership(newSupervisor);
    }

    /**
     * @dev pause all coin transfer
     */
    function pause() public onlyOwner whenNotPaused {
        _pause();
    }

    /**
     * @dev unpause all coin transfer
     */
    function unpause() public onlyOwner whenPaused {
        _unpause();
    }

    /**
     * @dev only owner can lock account
     */
    function freeze(address account) public onlyOwner whenNotPaused {
        _freeze(account);
    }

    /**
     * @dev only supervisor can unfreeze account
     */
    function unfreeze(address account) public onlySupervisor whenNotPaused {
        _unfreeze(account);
    }

    /**
     * @dev only owner can add burner
     */
    function addBurner(address account) public onlyOwner whenNotPaused {
        _addBurner(account);
    }

    /**
     * @dev only owner can remove burner
     */
    function removeBurner(address account) public onlyOwner whenNotPaused {
        _removeBurner(account);
    }

    /**
     * @dev burn burner's coin
     */
    function burn(uint256 amount) public onlyBurner whenNotPaused {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev only owner can add locker
     */
    function addLocker(address account) public onlyOwner whenNotPaused {
        _addLocker(account);
    }

    /**
     * @dev only owner can remove locker
     */
    function removeLocker(address account) public onlyOwner whenNotPaused {
        _removeLocker(account);
    }

    /**
     * @dev only locker can add time lock
     */
    function addTimeLock(
        address account,
        uint256 amount,
        uint256 expiresAt
    ) public onlyLocker whenNotPaused {
        _addTimeLock(account, amount, expiresAt);
    }

    /**
     * @dev only supervisor can remove time lock
     */
    function removeTimeLock(address account, uint8 index) public onlySupervisor whenNotPaused {
        _removeTimeLock(account, index);
    }

    /**
     * @dev only locker can add vesting lock
     */
    function addVestingLock(
        address account,
        uint256 startsAt,
        uint256 period,
        uint256 count
    ) public onlyLocker whenNotPaused {
        _addVestingLock(account, balanceOf(account), startsAt, period, count);
    }

    /**
     * @dev only supervisor can remove vesting lock
     */
    function removeVestingLock(address account) public onlySupervisor whenNotPaused {
        _removeVestingLock(account);
    }
}

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"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Freezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previouSupervisor","type":"address"},{"indexed":true,"internalType":"address","name":"newSupervisor","type":"address"}],"name":"SupervisorOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeUnlocked","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":"account","type":"address"}],"name":"Unfreezed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"VestingLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"VestingUnlocked","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"addTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"addVestingLock","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"freeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVestingLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getVestingLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isFreezed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"removeTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeVestingLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceSupervisorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"supervisor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","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":[{"internalType":"address","name":"newSupervisor","type":"address"}],"name":"transferSupervisorOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unfreeze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060408051808201825260098152684d794f776e4974656d60b81b602080830191909152825180840190935260038352624d4f4960e81b908301526000805460ff19169055906200006233620000cc565b6200006d3362000125565b81516200008290600a9060208501906200025f565b5080516200009890600b9060208401906200025f565b505050620000c2620000af620000c860201b60201c565b6b1027e72f1f1281308800000062000177565b62000368565b3390565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907facf6a327286171e5ce7f9bf15425ff49aab0fd07752fec84b2bd232c9f480c1790600090a35050565b6001600160a01b038216620001d25760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060096000828254620001e6919062000305565b90915550506001600160a01b038216600090815260076020526040812080548392906200021590849062000305565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200026d906200032c565b90600052602060002090601f016020900481019282620002915760008555620002dc565b82601f10620002ac57805160ff1916838001178555620002dc565b82800160010185558215620002dc579182015b82811115620002dc578251825591602001919060010190620002bf565b50620002ea929150620002ee565b5090565b5b80821115620002ea5760008155600101620002ef565b600082198211156200032757634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200034157607f821691505b6020821081036200036257634e487b7160e01b600052602260045260246000fd5b50919050565b6126db80620003786000396000f3fe608060405234801561001057600080fd5b50600436106102535760003560e01c806370a0823111610146578063a9059cbb116100c3578063c47a784c11610087578063c47a784c146105b7578063ce62cd4a146105ca578063dd62ed3e146105dd578063f2fde38b146105f0578063f44637ba14610603578063f99a2ca01461061657600080fd5b8063a9059cbb1461054d578063ab0de0fe14610560578063b0a087c514610573578063ba40c71a1461057b578063be4329f4146105a457600080fd5b80638980f11f1161010a5780638980f11f146104f65780638d1fdf2f146105095780638da5cb5b1461051c57806395d89b4114610532578063a457c2d71461053a57600080fd5b806370a082311461047e578063715018a6146104a75780638111f24e146104af5780638456cb59146104db578063854d9ffe146104e357600080fd5b806339509351116101d457806345cc58901161019857806345cc5890146104005780634ca47ad11461041357806356e4b68b1461043b5780635c975abb146104605780636f395c831461046b57600080fd5b806339509351146103935780633f4ba83a146103a657806342966c68146103ae5780634334614a146103c157806345c8b1a6146103ed57600080fd5b806319651dbf1161021b57806319651dbf146102d357806323b872dd146103325780632ec63d7c14610345578063313ce56714610371578063363b3c151461038057600080fd5b8063028468581461025857806306fdde031461026d578063095ea7b31461028b5780630d605482146102ae57806318160ddd146102c1575b600080fd5b61026b6102663660046122c1565b610629565b005b610275610691565b60405161028291906122e3565b60405180910390f35b61029e610299366004612338565b610723565b6040519015158152602001610282565b61026b6102bc366004612362565b61073b565b6009545b604051908152602001610282565b6103126102e13660046122c1565b6001600160a01b03166000908152600660205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610282565b61029e610340366004612395565b61079d565b61029e6103533660046122c1565b6001600160a01b031660009081526004602052604090205460ff1690565b60405160128152602001610282565b61026b61038e3660046122c1565b6107c1565b61029e6103a1366004612338565b610886565b61026b6108a8565b61026b6103bc3660046123d1565b61092b565b61029e6103cf3660046122c1565b6001600160a01b031660009081526002602052604090205460ff1690565b61026b6103fb3660046122c1565b6109c2565b61026b61040e3660046122c1565b610a18565b6104266104213660046123ea565b610a74565b60408051928352602083019190915201610282565b6001546001600160a01b03165b6040516001600160a01b039091168152602001610282565b60005460ff1661029e565b61026b6104793660046123ea565b610b6c565b6102c561048c3660046122c1565b6001600160a01b031660009081526007602052604090205490565b61026b610bc7565b61029e6104bd3660046122c1565b6001600160a01b031660009081526003602052604090205460ff1690565b61026b610c24565b6102c56104f13660046122c1565b610c7f565b61026b610504366004612338565b610ca3565b61026b6105173660046122c1565b610d6b565b60005461010090046001600160a01b0316610448565b610275610dc7565b61029e610548366004612338565b610dd6565b61029e61055b366004612338565b610e51565b6102c561056e3660046122c1565b610e5f565b61026b610f2b565b6102c56105893660046122c1565b6001600160a01b031660009081526005602052604090205490565b6102c56105b23660046122c1565b610f82565b61026b6105c5366004612427565b61104f565b61026b6105d83660046122c1565b6110d2565b6102c56105eb366004612460565b61112e565b61026b6105fe3660046122c1565b611159565b61026b6106113660046122c1565b61121a565b61026b6106243660046122c1565b611276565b6000546001600160a01b036101009091041633146106625760405162461bcd60e51b815260040161065990612493565b60405180910390fd5b60005460ff16156106855760405162461bcd60e51b8152600401610659906124c8565b61068e816112cc565b50565b6060600a80546106a0906124f2565b80601f01602080910402602001604051908101604052809291908181526020018280546106cc906124f2565b80156107195780601f106106ee57610100808354040283529160200191610719565b820191906000526020600020905b8154815290600101906020018083116106fc57829003601f168201915b5050505050905090565b600033610731818585611315565b5060019392505050565b3360009081526004602052604090205460ff1661076a5760405162461bcd60e51b81526004016106599061252c565b60005460ff161561078d5760405162461bcd60e51b8152600401610659906124c8565b61079883838361143a565b505050565b6000336107ab858285611551565b6107b68585856115c5565b506001949350505050565b6001546001600160a01b031633146107eb5760405162461bcd60e51b81526004016106599061256e565b60005460ff161561080e5760405162461bcd60e51b8152600401610659906124c8565b6001600160a01b03811661087d5760405162461bcd60e51b815260206004820152603060248201527f537570657276697361626c653a206e65772073757065727669736f722069732060448201526f746865207a65726f206164647265737360801b6064820152608401610659565b61068e8161179f565b600033610731818585610899838361112e565b6108a391906125ce565b611315565b6000546001600160a01b036101009091041633146108d85760405162461bcd60e51b815260040161065990612493565b60005460ff166109215760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610659565b6109296117f1565b565b3360009081526002602052604090205460ff166109955760405162461bcd60e51b815260206004820152602260248201527f4275726e61626c653a2063616c6c6572206973206e6f7420746865206275726e60448201526132b960f11b6064820152608401610659565b60005460ff16156109b85760405162461bcd60e51b8152600401610659906124c8565b61068e3382611884565b6001546001600160a01b031633146109ec5760405162461bcd60e51b81526004016106599061256e565b60005460ff1615610a0f5760405162461bcd60e51b8152600401610659906124c8565b61068e816119ca565b6000546001600160a01b03610100909104163314610a485760405162461bcd60e51b815260040161065990612493565b60005460ff1615610a6b5760405162461bcd60e51b8152600401610659906124c8565b61068e81611a13565b6001600160a01b038216600090815260056020526040812054819060ff8416108015610a9e575060015b610ae45760405162461bcd60e51b81526020600482015260176024820152760a8d2daca98dec6d67440d2dcecc2d8d2c840d2dcc8caf604b1b6044820152606401610659565b6001600160a01b0384166000908152600560205260409020805460ff8516908110610b1157610b116125e6565b600091825260208083206002909202909101546001600160a01b038716835260059091526040909120805460ff8616908110610b4f57610b4f6125e6565b906000526020600020906002020160010154915091509250929050565b6001546001600160a01b03163314610b965760405162461bcd60e51b81526004016106599061256e565b60005460ff1615610bb95760405162461bcd60e51b8152600401610659906124c8565b610bc38282611a5f565b5050565b6000546001600160a01b03610100909104163314610bf75760405162461bcd60e51b815260040161065990612493565b60005460ff1615610c1a5760405162461bcd60e51b8152600401610659906124c8565b6109296000611c10565b6000546001600160a01b03610100909104163314610c545760405162461bcd60e51b815260040161065990612493565b60005460ff1615610c775760405162461bcd60e51b8152600401610659906124c8565b610929611c69565b6000610c8a82610e5f565b610c9383610f82565b610c9d91906125ce565b92915050565b6000546001600160a01b03610100909104163314610cd35760405162461bcd60e51b815260040161065990612493565b816001600160a01b031663a9059cbb610cfa6000546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079891906125fc565b6000546001600160a01b03610100909104163314610d9b5760405162461bcd60e51b815260040161065990612493565b60005460ff1615610dbe5760405162461bcd60e51b8152600401610659906124c8565b61068e81611cc1565b6060600b80546106a0906124f2565b60003381610de4828661112e565b905083811015610e445760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610659565b6107b68286868403611315565b6000336107318185856115c5565b6001600160a01b03811660009081526006602052604081205481908015610f24576001600160a01b0384166000908152600660205260408120600180820154600283015460039093015490939091610eb7908361261e565b610ec19084612635565b610ecb90856125ce565b90504284811015610ede57859650610f1e565b81811015610f1e578284610ef2838561261e565b610efc9190612654565b610f079060016125ce565b610f119088612635565b610f1b9190612654565b96505b50505050505b5092915050565b6001546001600160a01b03163314610f555760405162461bcd60e51b81526004016106599061256e565b60005460ff1615610f785760405162461bcd60e51b8152600401610659906124c8565b610929600061179f565b6001600160a01b0381166000908152600560205260408120548190815b81811015611046576001600160a01b0385166000908152600560205260409020805482908110610fd157610fd16125e6565b906000526020600020906002020160010154421015611034576001600160a01b0385166000908152600560205260409020805482908110611014576110146125e6565b9060005260206000209060020201600001548361103191906125ce565b92505b8061103e81612676565b915050610f9f565b50909392505050565b3360009081526004602052604090205460ff1661107e5760405162461bcd60e51b81526004016106599061252c565b60005460ff16156110a15760405162461bcd60e51b8152600401610659906124c8565b6110cc846110c4866001600160a01b031660009081526007602052604090205490565b858585611d0d565b50505050565b6000546001600160a01b036101009091041633146111025760405162461bcd60e51b815260040161065990612493565b60005460ff16156111255760405162461bcd60e51b8152600401610659906124c8565b61068e81611f35565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6000546001600160a01b036101009091041633146111895760405162461bcd60e51b815260040161065990612493565b60005460ff16156111ac5760405162461bcd60e51b8152600401610659906124c8565b6001600160a01b0381166112115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61068e81611c10565b6000546001600160a01b0361010090910416331461124a5760405162461bcd60e51b815260040161065990612493565b60005460ff161561126d5760405162461bcd60e51b8152600401610659906124c8565b61068e81611f7e565b6001546001600160a01b031633146112a05760405162461bcd60e51b81526004016106599061256e565b60005460ff16156112c35760405162461bcd60e51b8152600401610659906124c8565b61068e81611fca565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b0383166113775760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610659565b6001600160a01b0382166113d85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610659565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000821161148a5760405162461bcd60e51b815260206004820152601a60248201527f54696d654c6f636b3a206c6f636b20616d6f756e7420697320300000000000006044820152606401610659565b4281116114d95760405162461bcd60e51b815260206004820152601d60248201527f54696d654c6f636b3a20696e76616c69642065787069726520646174650000006044820152606401610659565b6001600160a01b0383166000818152600560209081526040808320815180830183528781528084018781528254600181810185559387529486209151600290950290910193845551920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b600061155d848461112e565b905060001981146110cc57818110156115b85760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610659565b6110cc8484848403611315565b6001600160a01b0383166116295760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610659565b6001600160a01b03821661168b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610659565b611696838383612048565b6001600160a01b0383166000908152600760205260409020548181101561170e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610659565b6001600160a01b038085166000908152600760205260408082208585039055918516815290812080548492906117459084906125ce565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161179191815260200190565b60405180910390a350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907facf6a327286171e5ce7f9bf15425ff49aab0fd07752fec84b2bd232c9f480c1790600090a35050565b60005460ff1661183a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610659565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166118e45760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610659565b6001600160a01b038216600090815260076020526040902054818110156119585760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610659565b6001600160a01b038316600090815260076020526040812083830390556009805484929061198790849061261e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161142d565b6001600160a01b038116600081815260036020526040808220805460ff19169055517f4d1fe3cc0f516ce2cfc5e83d52ee28af7f55376b18f58e7081c5fd25d8eeb1df9190a250565b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b6001600160a01b03821660009081526005602052604090205460ff8216108015611a87575060015b611acd5760405162461bcd60e51b81526020600482015260176024820152760a8d2daca98dec6d67440d2dcecc2d8d2c840d2dcc8caf604b1b6044820152606401610659565b6001600160a01b03821660009081526005602052604090205460ff8216611af560018361261e565b14611b93576001600160a01b0383166000908152600560205260409020611b1d60018361261e565b81548110611b2d57611b2d6125e6565b906000526020600020906002020160056000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff1681548110611b7457611b746125e6565b6000918252602090912082546002909202019081556001918201549101555b6001600160a01b0383166000908152600560205260409020805480611bba57611bba61268f565b60008281526020812060026000199093019283020181815560010181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005460ff1615611c8c5760405162461bcd60e51b8152600401610659906124c8565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118673390565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f0de8364a528e5ca2869160b20c375fe85b4e98d24a9cb48b4dc49c5f76d05b249190a250565b6001600160a01b038516611d735760405162461bcd60e51b815260206004820152602760248201527f56657374696e674c6f636b3a206c6f636b2066726f6d20746865207a65726f206044820152666164647265737360c81b6064820152608401610659565b428311611dc25760405162461bcd60e51b815260206004820152601f60248201527f56657374696e674c6f636b3a206d75737420736574206166746572206e6f77006044820152606401610659565b60008411611e125760405162461bcd60e51b815260206004820152601860248201527f56657374696e674c6f636b3a20616d6f756e74206973203000000000000000006044820152606401610659565b60008211611e625760405162461bcd60e51b815260206004820152601860248201527f56657374696e674c6f636b3a20706572696f64206973203000000000000000006044820152606401610659565b60008111611eb25760405162461bcd60e51b815260206004820152601760248201527f56657374696e674c6f636b3a20636f756e7420697320300000000000000000006044820152606401610659565b604080516080810182528581526020808201868152828401868152606084018681526001600160a01b038b166000818152600690955286852095518655925160018601559051600285015551600390930192909255915190917f04a72c810da52db1f0e22421438d411667cd0c1559e9ae7c638f1aed4bfa066d91a25050505050565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6040805160808101825260008082526020808301828152838501838152606085018481526001600160a01b0388168086526006909452868520955186559151600186015551600285015551600390930192909255915190917ff71e9d23ff58e708ca92807894c580d899e97ab5bacc17df3543475e0e439f8491a250565b6001600160a01b03831660009081526003602052604090205460ff16156120c85760405162461bcd60e51b815260206004820152602e60248201527f467265657a61626c653a20746f6b656e207472616e736665722066726f6d206660448201526d1c99595e9959081858d8dbdd5b9d60921b6064820152608401610659565b6001600160a01b03821660009081526003602052604090205460ff16156121465760405162461bcd60e51b815260206004820152602c60248201527f467265657a61626c653a20746f6b656e207472616e7366657220746f2066726560448201526b195e9959081858d8dbdd5b9d60a21b6064820152608401610659565b61214f336104bd565b156121ba5760405162461bcd60e51b815260206004820152603560248201527f467265657a61626c653a20746f6b656e207472616e736665722063616c6c656460448201527408199c9bdb48199c99595e9959081858d8dbdd5b9d605a1b6064820152608401610659565b60005460ff161561221b5760405162461bcd60e51b815260206004820152602560248201527f5061757361626c653a20746f6b656e207472616e73666572207768696c652070604482015264185d5cd95960da1b6064820152608401610659565b8061222584610c7f565b6001600160a01b038516600090815260076020526040902054612248919061261e565b10156107985760405162461bcd60e51b815260206004820152602660248201527f4c6f636b61626c653a20696e73756666696369656e74207472616e7366657220604482015265185b5bdd5b9d60d21b6064820152608401610659565b80356001600160a01b03811681146122bc57600080fd5b919050565b6000602082840312156122d357600080fd5b6122dc826122a5565b9392505050565b600060208083528351808285015260005b81811015612310578581018301518582016040015282016122f4565b81811115612322576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561234b57600080fd5b612354836122a5565b946020939093013593505050565b60008060006060848603121561237757600080fd5b612380846122a5565b95602085013595506040909401359392505050565b6000806000606084860312156123aa57600080fd5b6123b3846122a5565b92506123c1602085016122a5565b9150604084013590509250925092565b6000602082840312156123e357600080fd5b5035919050565b600080604083850312156123fd57600080fd5b612406836122a5565b9150602083013560ff8116811461241c57600080fd5b809150509250929050565b6000806000806080858703121561243d57600080fd5b612446856122a5565b966020860135965060408601359560600135945092505050565b6000806040838503121561247357600080fd5b61247c836122a5565b915061248a602084016122a5565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b600181811c9082168061250657607f821691505b60208210810361252657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f4c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b60408201526132b960f11b606082015260800190565b6020808252602a908201527f537570657276697361626c653a2063616c6c6572206973206e6f74207468652060408201526939bab832b93b34b9b7b960b11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125e1576125e16125b8565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561260e57600080fd5b815180151581146122dc57600080fd5b600082821015612630576126306125b8565b500390565b600081600019048311821515161561264f5761264f6125b8565b500290565b60008261267157634e487b7160e01b600052601260045260246000fd5b500490565b600060018201612688576126886125b8565b5060010190565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220be95e1f0aa279a4339cc4c06b01afcaea4a9ee47578294eb63ec0a34e9e7227564736f6c634300080e0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102535760003560e01c806370a0823111610146578063a9059cbb116100c3578063c47a784c11610087578063c47a784c146105b7578063ce62cd4a146105ca578063dd62ed3e146105dd578063f2fde38b146105f0578063f44637ba14610603578063f99a2ca01461061657600080fd5b8063a9059cbb1461054d578063ab0de0fe14610560578063b0a087c514610573578063ba40c71a1461057b578063be4329f4146105a457600080fd5b80638980f11f1161010a5780638980f11f146104f65780638d1fdf2f146105095780638da5cb5b1461051c57806395d89b4114610532578063a457c2d71461053a57600080fd5b806370a082311461047e578063715018a6146104a75780638111f24e146104af5780638456cb59146104db578063854d9ffe146104e357600080fd5b806339509351116101d457806345cc58901161019857806345cc5890146104005780634ca47ad11461041357806356e4b68b1461043b5780635c975abb146104605780636f395c831461046b57600080fd5b806339509351146103935780633f4ba83a146103a657806342966c68146103ae5780634334614a146103c157806345c8b1a6146103ed57600080fd5b806319651dbf1161021b57806319651dbf146102d357806323b872dd146103325780632ec63d7c14610345578063313ce56714610371578063363b3c151461038057600080fd5b8063028468581461025857806306fdde031461026d578063095ea7b31461028b5780630d605482146102ae57806318160ddd146102c1575b600080fd5b61026b6102663660046122c1565b610629565b005b610275610691565b60405161028291906122e3565b60405180910390f35b61029e610299366004612338565b610723565b6040519015158152602001610282565b61026b6102bc366004612362565b61073b565b6009545b604051908152602001610282565b6103126102e13660046122c1565b6001600160a01b03166000908152600660205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610282565b61029e610340366004612395565b61079d565b61029e6103533660046122c1565b6001600160a01b031660009081526004602052604090205460ff1690565b60405160128152602001610282565b61026b61038e3660046122c1565b6107c1565b61029e6103a1366004612338565b610886565b61026b6108a8565b61026b6103bc3660046123d1565b61092b565b61029e6103cf3660046122c1565b6001600160a01b031660009081526002602052604090205460ff1690565b61026b6103fb3660046122c1565b6109c2565b61026b61040e3660046122c1565b610a18565b6104266104213660046123ea565b610a74565b60408051928352602083019190915201610282565b6001546001600160a01b03165b6040516001600160a01b039091168152602001610282565b60005460ff1661029e565b61026b6104793660046123ea565b610b6c565b6102c561048c3660046122c1565b6001600160a01b031660009081526007602052604090205490565b61026b610bc7565b61029e6104bd3660046122c1565b6001600160a01b031660009081526003602052604090205460ff1690565b61026b610c24565b6102c56104f13660046122c1565b610c7f565b61026b610504366004612338565b610ca3565b61026b6105173660046122c1565b610d6b565b60005461010090046001600160a01b0316610448565b610275610dc7565b61029e610548366004612338565b610dd6565b61029e61055b366004612338565b610e51565b6102c561056e3660046122c1565b610e5f565b61026b610f2b565b6102c56105893660046122c1565b6001600160a01b031660009081526005602052604090205490565b6102c56105b23660046122c1565b610f82565b61026b6105c5366004612427565b61104f565b61026b6105d83660046122c1565b6110d2565b6102c56105eb366004612460565b61112e565b61026b6105fe3660046122c1565b611159565b61026b6106113660046122c1565b61121a565b61026b6106243660046122c1565b611276565b6000546001600160a01b036101009091041633146106625760405162461bcd60e51b815260040161065990612493565b60405180910390fd5b60005460ff16156106855760405162461bcd60e51b8152600401610659906124c8565b61068e816112cc565b50565b6060600a80546106a0906124f2565b80601f01602080910402602001604051908101604052809291908181526020018280546106cc906124f2565b80156107195780601f106106ee57610100808354040283529160200191610719565b820191906000526020600020905b8154815290600101906020018083116106fc57829003601f168201915b5050505050905090565b600033610731818585611315565b5060019392505050565b3360009081526004602052604090205460ff1661076a5760405162461bcd60e51b81526004016106599061252c565b60005460ff161561078d5760405162461bcd60e51b8152600401610659906124c8565b61079883838361143a565b505050565b6000336107ab858285611551565b6107b68585856115c5565b506001949350505050565b6001546001600160a01b031633146107eb5760405162461bcd60e51b81526004016106599061256e565b60005460ff161561080e5760405162461bcd60e51b8152600401610659906124c8565b6001600160a01b03811661087d5760405162461bcd60e51b815260206004820152603060248201527f537570657276697361626c653a206e65772073757065727669736f722069732060448201526f746865207a65726f206164647265737360801b6064820152608401610659565b61068e8161179f565b600033610731818585610899838361112e565b6108a391906125ce565b611315565b6000546001600160a01b036101009091041633146108d85760405162461bcd60e51b815260040161065990612493565b60005460ff166109215760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610659565b6109296117f1565b565b3360009081526002602052604090205460ff166109955760405162461bcd60e51b815260206004820152602260248201527f4275726e61626c653a2063616c6c6572206973206e6f7420746865206275726e60448201526132b960f11b6064820152608401610659565b60005460ff16156109b85760405162461bcd60e51b8152600401610659906124c8565b61068e3382611884565b6001546001600160a01b031633146109ec5760405162461bcd60e51b81526004016106599061256e565b60005460ff1615610a0f5760405162461bcd60e51b8152600401610659906124c8565b61068e816119ca565b6000546001600160a01b03610100909104163314610a485760405162461bcd60e51b815260040161065990612493565b60005460ff1615610a6b5760405162461bcd60e51b8152600401610659906124c8565b61068e81611a13565b6001600160a01b038216600090815260056020526040812054819060ff8416108015610a9e575060015b610ae45760405162461bcd60e51b81526020600482015260176024820152760a8d2daca98dec6d67440d2dcecc2d8d2c840d2dcc8caf604b1b6044820152606401610659565b6001600160a01b0384166000908152600560205260409020805460ff8516908110610b1157610b116125e6565b600091825260208083206002909202909101546001600160a01b038716835260059091526040909120805460ff8616908110610b4f57610b4f6125e6565b906000526020600020906002020160010154915091509250929050565b6001546001600160a01b03163314610b965760405162461bcd60e51b81526004016106599061256e565b60005460ff1615610bb95760405162461bcd60e51b8152600401610659906124c8565b610bc38282611a5f565b5050565b6000546001600160a01b03610100909104163314610bf75760405162461bcd60e51b815260040161065990612493565b60005460ff1615610c1a5760405162461bcd60e51b8152600401610659906124c8565b6109296000611c10565b6000546001600160a01b03610100909104163314610c545760405162461bcd60e51b815260040161065990612493565b60005460ff1615610c775760405162461bcd60e51b8152600401610659906124c8565b610929611c69565b6000610c8a82610e5f565b610c9383610f82565b610c9d91906125ce565b92915050565b6000546001600160a01b03610100909104163314610cd35760405162461bcd60e51b815260040161065990612493565b816001600160a01b031663a9059cbb610cfa6000546001600160a01b036101009091041690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015610d47573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079891906125fc565b6000546001600160a01b03610100909104163314610d9b5760405162461bcd60e51b815260040161065990612493565b60005460ff1615610dbe5760405162461bcd60e51b8152600401610659906124c8565b61068e81611cc1565b6060600b80546106a0906124f2565b60003381610de4828661112e565b905083811015610e445760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610659565b6107b68286868403611315565b6000336107318185856115c5565b6001600160a01b03811660009081526006602052604081205481908015610f24576001600160a01b0384166000908152600660205260408120600180820154600283015460039093015490939091610eb7908361261e565b610ec19084612635565b610ecb90856125ce565b90504284811015610ede57859650610f1e565b81811015610f1e578284610ef2838561261e565b610efc9190612654565b610f079060016125ce565b610f119088612635565b610f1b9190612654565b96505b50505050505b5092915050565b6001546001600160a01b03163314610f555760405162461bcd60e51b81526004016106599061256e565b60005460ff1615610f785760405162461bcd60e51b8152600401610659906124c8565b610929600061179f565b6001600160a01b0381166000908152600560205260408120548190815b81811015611046576001600160a01b0385166000908152600560205260409020805482908110610fd157610fd16125e6565b906000526020600020906002020160010154421015611034576001600160a01b0385166000908152600560205260409020805482908110611014576110146125e6565b9060005260206000209060020201600001548361103191906125ce565b92505b8061103e81612676565b915050610f9f565b50909392505050565b3360009081526004602052604090205460ff1661107e5760405162461bcd60e51b81526004016106599061252c565b60005460ff16156110a15760405162461bcd60e51b8152600401610659906124c8565b6110cc846110c4866001600160a01b031660009081526007602052604090205490565b858585611d0d565b50505050565b6000546001600160a01b036101009091041633146111025760405162461bcd60e51b815260040161065990612493565b60005460ff16156111255760405162461bcd60e51b8152600401610659906124c8565b61068e81611f35565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6000546001600160a01b036101009091041633146111895760405162461bcd60e51b815260040161065990612493565b60005460ff16156111ac5760405162461bcd60e51b8152600401610659906124c8565b6001600160a01b0381166112115760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610659565b61068e81611c10565b6000546001600160a01b0361010090910416331461124a5760405162461bcd60e51b815260040161065990612493565b60005460ff161561126d5760405162461bcd60e51b8152600401610659906124c8565b61068e81611f7e565b6001546001600160a01b031633146112a05760405162461bcd60e51b81526004016106599061256e565b60005460ff16156112c35760405162461bcd60e51b8152600401610659906124c8565b61068e81611fca565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b0383166113775760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610659565b6001600160a01b0382166113d85760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610659565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000821161148a5760405162461bcd60e51b815260206004820152601a60248201527f54696d654c6f636b3a206c6f636b20616d6f756e7420697320300000000000006044820152606401610659565b4281116114d95760405162461bcd60e51b815260206004820152601d60248201527f54696d654c6f636b3a20696e76616c69642065787069726520646174650000006044820152606401610659565b6001600160a01b0383166000818152600560209081526040808320815180830183528781528084018781528254600181810185559387529486209151600290950290910193845551920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b600061155d848461112e565b905060001981146110cc57818110156115b85760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610659565b6110cc8484848403611315565b6001600160a01b0383166116295760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610659565b6001600160a01b03821661168b5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610659565b611696838383612048565b6001600160a01b0383166000908152600760205260409020548181101561170e5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610659565b6001600160a01b038085166000908152600760205260408082208585039055918516815290812080548492906117459084906125ce565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161179191815260200190565b60405180910390a350505050565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907facf6a327286171e5ce7f9bf15425ff49aab0fd07752fec84b2bd232c9f480c1790600090a35050565b60005460ff1661183a5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610659565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166118e45760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610659565b6001600160a01b038216600090815260076020526040902054818110156119585760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610659565b6001600160a01b038316600090815260076020526040812083830390556009805484929061198790849061261e565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200161142d565b6001600160a01b038116600081815260036020526040808220805460ff19169055517f4d1fe3cc0f516ce2cfc5e83d52ee28af7f55376b18f58e7081c5fd25d8eeb1df9190a250565b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b6001600160a01b03821660009081526005602052604090205460ff8216108015611a87575060015b611acd5760405162461bcd60e51b81526020600482015260176024820152760a8d2daca98dec6d67440d2dcecc2d8d2c840d2dcc8caf604b1b6044820152606401610659565b6001600160a01b03821660009081526005602052604090205460ff8216611af560018361261e565b14611b93576001600160a01b0383166000908152600560205260409020611b1d60018361261e565b81548110611b2d57611b2d6125e6565b906000526020600020906002020160056000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff1681548110611b7457611b746125e6565b6000918252602090912082546002909202019081556001918201549101555b6001600160a01b0383166000908152600560205260409020805480611bba57611bba61268f565b60008281526020812060026000199093019283020181815560010181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b600080546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b60005460ff1615611c8c5760405162461bcd60e51b8152600401610659906124c8565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118673390565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f0de8364a528e5ca2869160b20c375fe85b4e98d24a9cb48b4dc49c5f76d05b249190a250565b6001600160a01b038516611d735760405162461bcd60e51b815260206004820152602760248201527f56657374696e674c6f636b3a206c6f636b2066726f6d20746865207a65726f206044820152666164647265737360c81b6064820152608401610659565b428311611dc25760405162461bcd60e51b815260206004820152601f60248201527f56657374696e674c6f636b3a206d75737420736574206166746572206e6f77006044820152606401610659565b60008411611e125760405162461bcd60e51b815260206004820152601860248201527f56657374696e674c6f636b3a20616d6f756e74206973203000000000000000006044820152606401610659565b60008211611e625760405162461bcd60e51b815260206004820152601860248201527f56657374696e674c6f636b3a20706572696f64206973203000000000000000006044820152606401610659565b60008111611eb25760405162461bcd60e51b815260206004820152601760248201527f56657374696e674c6f636b3a20636f756e7420697320300000000000000000006044820152606401610659565b604080516080810182528581526020808201868152828401868152606084018681526001600160a01b038b166000818152600690955286852095518655925160018601559051600285015551600390930192909255915190917f04a72c810da52db1f0e22421438d411667cd0c1559e9ae7c638f1aed4bfa066d91a25050505050565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6040805160808101825260008082526020808301828152838501838152606085018481526001600160a01b0388168086526006909452868520955186559151600186015551600285015551600390930192909255915190917ff71e9d23ff58e708ca92807894c580d899e97ab5bacc17df3543475e0e439f8491a250565b6001600160a01b03831660009081526003602052604090205460ff16156120c85760405162461bcd60e51b815260206004820152602e60248201527f467265657a61626c653a20746f6b656e207472616e736665722066726f6d206660448201526d1c99595e9959081858d8dbdd5b9d60921b6064820152608401610659565b6001600160a01b03821660009081526003602052604090205460ff16156121465760405162461bcd60e51b815260206004820152602c60248201527f467265657a61626c653a20746f6b656e207472616e7366657220746f2066726560448201526b195e9959081858d8dbdd5b9d60a21b6064820152608401610659565b61214f336104bd565b156121ba5760405162461bcd60e51b815260206004820152603560248201527f467265657a61626c653a20746f6b656e207472616e736665722063616c6c656460448201527408199c9bdb48199c99595e9959081858d8dbdd5b9d605a1b6064820152608401610659565b60005460ff161561221b5760405162461bcd60e51b815260206004820152602560248201527f5061757361626c653a20746f6b656e207472616e73666572207768696c652070604482015264185d5cd95960da1b6064820152608401610659565b8061222584610c7f565b6001600160a01b038516600090815260076020526040902054612248919061261e565b10156107985760405162461bcd60e51b815260206004820152602660248201527f4c6f636b61626c653a20696e73756666696369656e74207472616e7366657220604482015265185b5bdd5b9d60d21b6064820152608401610659565b80356001600160a01b03811681146122bc57600080fd5b919050565b6000602082840312156122d357600080fd5b6122dc826122a5565b9392505050565b600060208083528351808285015260005b81811015612310578581018301518582016040015282016122f4565b81811115612322576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561234b57600080fd5b612354836122a5565b946020939093013593505050565b60008060006060848603121561237757600080fd5b612380846122a5565b95602085013595506040909401359392505050565b6000806000606084860312156123aa57600080fd5b6123b3846122a5565b92506123c1602085016122a5565b9150604084013590509250925092565b6000602082840312156123e357600080fd5b5035919050565b600080604083850312156123fd57600080fd5b612406836122a5565b9150602083013560ff8116811461241c57600080fd5b809150509250929050565b6000806000806080858703121561243d57600080fd5b612446856122a5565b966020860135965060408601359560600135945092505050565b6000806040838503121561247357600080fd5b61247c836122a5565b915061248a602084016122a5565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b600181811c9082168061250657607f821691505b60208210810361252657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526022908201527f4c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b60408201526132b960f11b606082015260800190565b6020808252602a908201527f537570657276697361626c653a2063616c6c6572206973206e6f74207468652060408201526939bab832b93b34b9b7b960b11b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b600082198211156125e1576125e16125b8565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561260e57600080fd5b815180151581146122dc57600080fd5b600082821015612630576126306125b8565b500390565b600081600019048311821515161561264f5761264f6125b8565b500290565b60008261267157634e487b7160e01b600052601260045260246000fd5b500490565b600060018201612688576126886125b8565b5060010190565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220be95e1f0aa279a4339cc4c06b01afcaea4a9ee47578294eb63ec0a34e9e7227564736f6c634300080e0033

Deployed Bytecode Sourcemap

30824:5220:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34402:111;;;;;;:::i;:::-;;:::i;:::-;;8115:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10466:201;;;;;;:::i;:::-;;:::i;:::-;;;1409:14:1;;1402:22;1384:41;;1372:2;1357:18;10466:201:0;1244:187:1;35097:198:0;;;;;;:::i;:::-;;:::i;9235:108::-;9323:12;;9235:108;;;1909:25:1;;;1897:2;1882:18;9235:108:0;1763:177:1;28982:344:0;;;;;;:::i;:::-;-1:-1:-1;;;;;29194:22:0;29085:7;29194:22;;;:13;:22;;;;;:29;;29225:31;;;;29258:29;;;;29289:28;;;;;29194:29;;29225:31;;29258:29;29289:28;28982:344;;;;;2176:25:1;;;2232:2;2217:18;;2210:34;;;;2260:18;;;2253:34;2318:2;2303:18;;2296:34;2163:3;2148:19;28982:344:0;1945:391:1;11247:295:0;;;;;;:::i;:::-;;:::i;24485:105::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24565:17:0;24541:4;24565:17;;;:8;:17;;;;;;;;;24485:105;9077:93;;;9160:2;2816:36:1;;2804:2;2789:18;9077:93:0;2674:184:1;33278:257:0;;;;;;:::i;:::-;;:::i;11951:238::-;;;;;;:::i;:::-;;:::i;33738:76::-;;;:::i;34571:108::-;;;;;;:::i;:::-;;:::i;21696:105::-;;;;;;:::i;:::-;-1:-1:-1;;;;;21776:17:0;21752:4;21776:17;;;:8;:17;;;;;;;;;21696:105;34056:108;;;;;;:::i;:::-;;:::i;34744:105::-;;;;;;:::i;:::-;;:::i;26572:284::-;;;;;;:::i;:::-;;:::i;:::-;;;;3570:25:1;;;3626:2;3611:18;;3604:34;;;;3543:18;26572:284:0;3396:248:1;20451:97:0;20529:11;;-1:-1:-1;;;;;20529:11:0;20451:97;;;-1:-1:-1;;;;;3813:32:1;;;3795:51;;3783:2;3768:18;20451:97:0;3649:203:1;1690:86:0;1737:4;1761:7;;;1690:86;;35371:140;;;;;;:::i;:::-;;:::i;9406:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9507:18:0;9480:7;9507:18;;;:9;:18;;;;;;;9406:127;32495:109;;;:::i;23231:106::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23312:17:0;23288:4;23312:17;;;:8;:17;;;;;;;;;23231:106;33598:75;;;:::i;30607:163::-;;;;;;:::i;:::-;;:::i;31267:152::-;;;;;;:::i;:::-;;:::i;33881:99::-;;;;;;:::i;:::-;;:::i;18796:87::-;18842:7;18869:6;;;;-1:-1:-1;;;;;18869:6:0;18796:87;;8334:104;;;:::i;12692:436::-;;;;;;:::i;:::-;;:::i;9739:193::-;;;;;;:::i;:::-;;:::i;29630:812::-;;;;;;:::i;:::-;;:::i;32693:134::-;;;:::i;26251:126::-;;;;;;:::i;:::-;-1:-1:-1;;;;;26343:19:0;26316:7;26343:19;;;:10;:19;;;;;:26;;26251:126;27040:438;;;;;;:::i;:::-;;:::i;35583:253::-;;;;;;:::i;:::-;;:::i;34917:111::-;;;;;;:::i;:::-;;:::i;9995:151::-;;;;;;:::i;:::-;;:::i;32982:207::-;;;;;;:::i;:::-;;:::i;34229:105::-;;;;;;:::i;:::-;;:::i;35915:126::-;;;;;;:::i;:::-;;:::i;34402:111::-;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;;;;;;;;;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34483:22:::2;34497:7;34483:13;:22::i;:::-;34402:111:::0;:::o;8115:100::-;8169:13;8202:5;8195:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8115:100;:::o;10466:201::-;10549:4;682:10;10605:32;682:10;10621:7;10630:6;10605:8;:32::i;:::-;-1:-1:-1;10655:4:0;;10466:201;-1:-1:-1;;;10466:201:0:o;35097:198::-;682:10;24326:22;;;;:8;:22;;;;;;;;24318:69;;;;-1:-1:-1;;;24318:69:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;35247:40:::2;35260:7;35269:6;35277:9;35247:12;:40::i;:::-;35097:198:::0;;;:::o;11247:295::-;11378:4;682:10;11436:38;11452:4;682:10;11467:6;11436:15;:38::i;:::-;11485:27;11495:4;11501:2;11505:6;11485:9;:27::i;:::-;-1:-1:-1;11530:4:0;;11247:295;-1:-1:-1;;;;11247:295:0:o;33278:257::-;20529:11;;-1:-1:-1;;;;;20529:11:0;682:10;20691:28;20683:83;;;;-1:-1:-1;;;20683:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33393:27:0;::::2;33385:88;;;::::0;-1:-1:-1;;;33385:88:0;;6625:2:1;33385:88:0::2;::::0;::::2;6607:21:1::0;6664:2;6644:18;;;6637:30;6703:34;6683:18;;;6676:62;-1:-1:-1;;;6754:18:1;;;6747:46;6810:19;;33385:88:0::2;6423:412:1::0;33385:88:0::2;33484:43;33513:13;33484:28;:43::i;11951:238::-:0;12039:4;682:10;12095:64;682:10;12111:7;12148:10;12120:25;682:10;12111:7;12120:9;:25::i;:::-;:38;;;;:::i;:::-;12095:8;:64::i;33738:76::-;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2285:41:::1;;;::::0;-1:-1:-1;;;2285:41:0;;7307:2:1;2285:41:0::1;::::0;::::1;7289:21:1::0;7346:2;7326:18;;;7319:30;-1:-1:-1;;;7365:18:1;;;7358:50;7425:18;;2285:41:0::1;7105:344:1::0;2285:41:0::1;33796:10:::2;:8;:10::i;:::-;33738:76::o:0;34571:108::-;682:10;21936:22;;;;:8;:22;;;;;;;;21928:69;;;;-1:-1:-1;;;21928:69:0;;7656:2:1;21928:69:0;;;7638:21:1;7695:2;7675:18;;;7668:30;7734:34;7714:18;;;7707:62;-1:-1:-1;;;7785:18:1;;;7778:32;7827:19;;21928:69:0;7454:398:1;21928:69:0;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34644:27:::2;682:10:::0;34664:6:::2;34644:5;:27::i;34056:108::-:0;20529:11;;-1:-1:-1;;;;;20529:11:0;682:10;20691:28;20683:83;;;;-1:-1:-1;;;20683:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34138:18:::2;34148:7;34138:9;:18::i;34744:105::-:0;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34822:19:::2;34833:7;34822:10;:19::i;26572:284::-:0;-1:-1:-1;;;;;26681:19:0;;26644:7;26681:19;;;:10;:19;;;;;:26;26644:7;;26681:34;;;-1:-1:-1;26681:48:0;;;;-1:-1:-1;26719:10:0;26681:48;26673:84;;;;-1:-1:-1;;;26673:84:0;;8059:2:1;26673:84:0;;;8041:21:1;8098:2;8078:18;;;8071:30;-1:-1:-1;;;8117:18:1;;;8110:53;8180:18;;26673:84:0;7857:347:1;26673:84:0;-1:-1:-1;;;;;26776:19:0;;;;;;:10;:19;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;:33;-1:-1:-1;;;;;26811:19:0;;;;:10;:19;;;;;;;:26;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;;26768:80;;;;26572:284;;;;;:::o;35371:140::-;20529:11;;-1:-1:-1;;;;;20529:11:0;682:10;20691:28;20683:83;;;;-1:-1:-1;;;20683:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;35472:31:::2;35488:7;35497:5;35472:15;:31::i;:::-;35371:140:::0;;:::o;32495:109::-;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;32566:30:::2;32593:1;32566:18;:30::i;33598:75::-:0;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;33657:8:::2;:6;:8::i;30607:163::-:0;30673:7;30731:31;30754:7;30731:22;:31::i;:::-;30700:28;30720:7;30700:19;:28::i;:::-;:62;;;;:::i;:::-;30693:69;30607:163;-1:-1:-1;;30607:163:0:o;31267:152::-;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;31367:12:::1;-1:-1:-1::0;;;;;31360:29:0::1;;31390:7;18842::::0;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;;18796:87;31390:7:::1;31360:51;::::0;-1:-1:-1;;;;;;31360:51:0::1;::::0;;;;;;-1:-1:-1;;;;;8533:32:1;;;31360:51:0::1;::::0;::::1;8515::1::0;8582:18;;;8575:34;;;8488:18;;31360:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33881:99::-:0;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;33956:16:::2;33964:7;33956;:16::i;8334:104::-:0;8390:13;8423:7;8416:14;;;;;:::i;12692:436::-;12785:4;682:10;12785:4;12868:25;682:10;12885:7;12868:9;:25::i;:::-;12841:52;;12932:15;12912:16;:35;;12904:85;;;;-1:-1:-1;;;12904:85:0;;9104:2:1;12904:85:0;;;9086:21:1;9143:2;9123:18;;;9116:30;9182:34;9162:18;;;9155:62;-1:-1:-1;;;9233:18:1;;;9226:35;9278:19;;12904:85:0;8902:401:1;12904:85:0;13025:60;13034:5;13041:7;13069:15;13050:16;:34;13025:8;:60::i;9739:193::-;9818:4;682:10;9874:28;682:10;9891:2;9895:6;9874:9;:28::i;29630:812::-;-1:-1:-1;;;;;29779:22:0;;29700:7;29779:22;;;:13;:22;;;;;:29;29700:7;;29823:10;;29819:579;;-1:-1:-1;;;;;29869:22:0;;29850:16;29869:22;;;:13;:22;;;;;:31;;;;;29932:29;;;;29992:28;;;;;29869:31;;29992:28;;30076:9;;29992:28;30076:9;:::i;:::-;30066:20;;:6;:20;:::i;:::-;30055:31;;:8;:31;:::i;:::-;30035:51;-1:-1:-1;30121:15:0;30155:20;;;30151:236;;;30218:6;30196:28;;30151:236;;;30262:9;30250;:21;30246:141;;;30366:5;30351:6;30326:21;30338:9;30326;:21;:::i;:::-;30325:32;;;;:::i;:::-;:36;;30360:1;30325:36;:::i;:::-;30315:47;;:6;:47;:::i;:::-;30314:57;;;;:::i;:::-;30292:79;;30246:141;29835:563;;;;;29819:579;-1:-1:-1;30415:19:0;29630:812;-1:-1:-1;;29630:812:0:o;32693:134::-;20529:11;;-1:-1:-1;;;;;20529:11:0;682:10;20691:28;20683:83;;;;-1:-1:-1;;;20683:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;32779:40:::2;32816:1;32779:28;:40::i;27040:438::-:0;-1:-1:-1;;;;;27182:19:0;;27107:7;27182:19;;;:10;:19;;;;;:26;27107:7;;;27219:218;27243:3;27239:1;:7;27219:218;;;-1:-1:-1;;;;;27290:19:0;;;;;;:10;:19;;;;;:22;;27310:1;;27290:22;;;;;;:::i;:::-;;;;;;;;;;;:32;;;27272:15;:50;27268:158;;;-1:-1:-1;;;;;27381:19:0;;;;;;:10;:19;;;;;:22;;27401:1;;27381:22;;;;;;:::i;:::-;;;;;;;;;;;:29;;;27362:16;:48;;;;:::i;:::-;27343:67;;27268:158;27248:3;;;;:::i;:::-;;;;27219:218;;;-1:-1:-1;27454:16:0;;27040:438;-1:-1:-1;;;27040:438:0:o;35583:253::-;682:10;24326:22;;;;:8;:22;;;;;;;;24318:69;;;;-1:-1:-1;;;24318:69:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;35759:69:::2;35775:7;35784:18;35794:7;-1:-1:-1::0;;;;;9507:18:0;9480:7;9507:18;;;:9;:18;;;;;;;9406:127;35784:18:::2;35804:8;35814:6;35822:5;35759:15;:69::i;:::-;35583:253:::0;;;;:::o;34917:111::-;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34998:22:::2;35012:7;34998:13;:22::i;9995:151::-:0;-1:-1:-1;;;;;10111:18:0;;;10084:7;10111:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9995:151::o;32982:207::-;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33077:22:0;::::2;33069:73;;;::::0;-1:-1:-1;;;33069:73:0;;10175:2:1;33069:73:0::2;::::0;::::2;10157:21:1::0;10214:2;10194:18;;;10187:30;10253:34;10233:18;;;10226:62;-1:-1:-1;;;10304:18:1;;;10297:36;10350:19;;33069:73:0::2;9973:402:1::0;33069:73:0::2;33153:28;33172:8;33153:18;:28::i;34229:105::-:0;18842:7;18869:6;-1:-1:-1;;;;;18869:6:0;;;;;682:10;19016:23;19008:68;;;;-1:-1:-1;;;19008:68:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;34307:19:::2;34318:7;34307:10;:19::i;35915:126::-:0;20529:11;;-1:-1:-1;;;;;20529:11:0;682:10;20691:28;20683:83;;;;-1:-1:-1;;;20683:83:0;;;;;;;:::i;:::-;1737:4;1761:7;;;2015:9:::1;2007:38;;;;-1:-1:-1::0;;;2007:38:0::1;;;;;;;:::i;:::-;36006:27:::2;36025:7;36006:18;:27::i;22307:131::-:0;-1:-1:-1;;;;;22367:17:0;;22387:5;22367:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;22367:25:0;;;22408:22;;;22387:5;22408:22;22307:131;:::o;16021:380::-;-1:-1:-1;;;;;16157:19:0;;16149:68;;;;-1:-1:-1;;;16149:68:0;;10582:2:1;16149:68:0;;;10564:21:1;10621:2;10601:18;;;10594:30;10660:34;10640:18;;;10633:62;-1:-1:-1;;;10711:18:1;;;10704:34;10755:19;;16149:68:0;10380:400:1;16149:68:0;-1:-1:-1;;;;;16236:21:0;;16228:68;;;;-1:-1:-1;;;16228:68:0;;10987:2:1;16228:68:0;;;10969:21:1;11026:2;11006:18;;;10999:30;11065:34;11045:18;;;11038:62;-1:-1:-1;;;11116:18:1;;;11109:32;11158:19;;16228:68:0;10785:398:1;16228:68:0;-1:-1:-1;;;;;16309:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16361:32;;1909:25:1;;;16361:32:0;;1882:18:1;16361:32:0;;;;;;;;16021:380;;;:::o;25080:364::-;25225:1;25216:6;:10;25208:49;;;;-1:-1:-1;;;25208:49:0;;11390:2:1;25208:49:0;;;11372:21:1;11429:2;11409:18;;;11402:30;11468:28;11448:18;;;11441:56;11514:18;;25208:49:0;11188:350:1;25208:49:0;25288:15;25276:9;:27;25268:69;;;;-1:-1:-1;;;25268:69:0;;11745:2:1;25268:69:0;;;11727:21:1;11784:2;11764:18;;;11757:30;11823:31;11803:18;;;11796:59;11872:18;;25268:69:0;11543:353:1;25268:69:0;-1:-1:-1;;;;;25348:19:0;;;;;;:10;:19;;;;;;;;25373:27;;;;;;;;;;;;;;;;25348:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25417:19;;;25348;25417;25080:364;;;:::o;16692:453::-;16827:24;16854:25;16864:5;16871:7;16854:9;:25::i;:::-;16827:52;;-1:-1:-1;;16894:16:0;:37;16890:248;;16976:6;16956:16;:26;;16948:68;;;;-1:-1:-1;;;16948:68:0;;12103:2:1;16948:68:0;;;12085:21:1;12142:2;12122:18;;;12115:30;12181:31;12161:18;;;12154:59;12230:18;;16948:68:0;11901:353:1;16948:68:0;17060:51;17069:5;17076:7;17104:6;17085:16;:25;17060:8;:51::i;13598:621::-;-1:-1:-1;;;;;13729:18:0;;13721:68;;;;-1:-1:-1;;;13721:68:0;;12461:2:1;13721:68:0;;;12443:21:1;12500:2;12480:18;;;12473:30;12539:34;12519:18;;;12512:62;-1:-1:-1;;;12590:18:1;;;12583:35;12635:19;;13721:68:0;12259:401:1;13721:68:0;-1:-1:-1;;;;;13808:16:0;;13800:64;;;;-1:-1:-1;;;13800:64:0;;12867:2:1;13800:64:0;;;12849:21:1;12906:2;12886:18;;;12879:30;12945:34;12925:18;;;12918:62;-1:-1:-1;;;12996:18:1;;;12989:33;13039:19;;13800:64:0;12665:399:1;13800:64:0;13877:38;13898:4;13904:2;13908:6;13877:20;:38::i;:::-;-1:-1:-1;;;;;13950:15:0;;13928:19;13950:15;;;:9;:15;;;;;;13984:21;;;;13976:72;;;;-1:-1:-1;;;13976:72:0;;13271:2:1;13976:72:0;;;13253:21:1;13310:2;13290:18;;;13283:30;13349:34;13329:18;;;13322:62;-1:-1:-1;;;13400:18:1;;;13393:36;13446:19;;13976:72:0;13069:402:1;13976:72:0;-1:-1:-1;;;;;14084:15:0;;;;;;;:9;:15;;;;;;14102:20;;;14084:38;;14144:13;;;;;;;;:23;;14116:6;;14084:15;14144:23;;14116:6;;14144:23;:::i;:::-;;;;;;;;14200:2;-1:-1:-1;;;;;14185:26:0;14194:4;-1:-1:-1;;;;;14185:26:0;;14204:6;14185:26;;;;1909:25:1;;1897:2;1882:18;;1763:177;14185:26:0;;;;;;;;13710:509;13598:621;;;:::o;20962:246::-;21075:11;;;-1:-1:-1;;;;;21097:27:0;;;-1:-1:-1;;;;;;21097:27:0;;;;;;;21140:60;;21075:11;;;21097:27;21075:11;;21140:60;;21051:21;;21140:60;21040:168;20962:246;:::o;2749:120::-;1737:4;1761:7;;;2285:41;;;;-1:-1:-1;;;2285:41:0;;7307:2:1;2285:41:0;;;7289:21:1;7346:2;7326:18;;;7319:30;-1:-1:-1;;;7365:18:1;;;7358:50;7425:18;;2285:41:0;7105:344:1;2285:41:0;2818:5:::1;2808:15:::0;;-1:-1:-1;;2808:15:0::1;::::0;;2839:22:::1;682:10:::0;2848:12:::1;2839:22;::::0;-1:-1:-1;;;;;3813:32:1;;;3795:51;;3783:2;3768:18;2839:22:0::1;;;;;;;2749:120::o:0;15115:468::-;-1:-1:-1;;;;;15199:21:0;;15191:67;;;;-1:-1:-1;;;15191:67:0;;13678:2:1;15191:67:0;;;13660:21:1;13717:2;13697:18;;;13690:30;13756:34;13736:18;;;13729:62;-1:-1:-1;;;13807:18:1;;;13800:31;13848:19;;15191:67:0;13476:397:1;15191:67:0;-1:-1:-1;;;;;15296:18:0;;15271:22;15296:18;;;:9;:18;;;;;;15333:24;;;;15325:71;;;;-1:-1:-1;;;15325:71:0;;14080:2:1;15325:71:0;;;14062:21:1;14119:2;14099:18;;;14092:30;14158:34;14138:18;;;14131:62;-1:-1:-1;;;14209:18:1;;;14202:32;14251:19;;15325:71:0;13878:398:1;15325:71:0;-1:-1:-1;;;;;15432:18:0;;;;;;:9;:18;;;;;15453:23;;;15432:44;;15498:12;:22;;15470:6;;15432:18;15498:22;;15470:6;;15498:22;:::i;:::-;;;;-1:-1:-1;;15538:37:0;;1909:25:1;;;15564:1:0;;-1:-1:-1;;;;;15538:37:0;;;;;1897:2:1;1882:18;15538:37:0;1763:177:1;23029:123:0;-1:-1:-1;;;;;23085:17:0;;23105:5;23085:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;23085:25:0;;;23126:18;;;23105:5;23126:18;23029:123;:::o;24667:125::-;-1:-1:-1;;;;;24724:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;24724:24:0;24744:4;24724:24;;;24764:20;;;24724:17;24764:20;24667:125;:::o;25625:457::-;-1:-1:-1;;;;;25708:19:0;;;;;;:10;:19;;;;;:26;:34;;;-1:-1:-1;25708:48:0;;;;-1:-1:-1;25746:10:0;25708:48;25700:84;;;;-1:-1:-1;;;25700:84:0;;8059:2:1;25700:84:0;;;8041:21:1;8098:2;8078:18;;;8071:30;-1:-1:-1;;;8117:18:1;;;8110:53;8180:18;;25700:84:0;7857:347:1;25700:84:0;-1:-1:-1;;;;;25811:19:0;;25797:11;25811:19;;;:10;:19;;;;;:26;25852:16;;;:7;25858:1;25811:26;25852:7;:::i;:::-;:16;25848:154;;-1:-1:-1;;;;;25962:19:0;;;;;;:10;:19;;;;;25982:7;25988:1;25982:3;:7;:::i;:::-;25962:28;;;;;;;;:::i;:::-;;;;;;;;;;;25933:10;:19;25944:7;-1:-1:-1;;;;;25933:19:0;-1:-1:-1;;;;;25933:19:0;;;;;;;;;;;;25953:5;25933:26;;;;;;;;;;:::i;:::-;;;;;;;;;:57;;:26;;;;;:57;;;;;;;;;;;25848:154;-1:-1:-1;;;;;26012:19:0;;;;;;:10;:19;;;;;:25;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;26012:25:0;;;;;;;;;;;;;;;;;26053:21;;-1:-1:-1;;;;;26053:21:0;;;;;;25689:393;25625:457;;:::o;19256:191::-;19330:16;19349:6;;-1:-1:-1;;;;;19366:17:0;;;19349:6;19366:17;;;-1:-1:-1;;;;;;19366:17:0;;;;;19399:40;;19349:6;;;;;;;19366:17;;19349:6;;19399:40;;;19319:128;19256:191;:::o;2490:118::-;1737:4;1761:7;;;2015:9;2007:38;;;;-1:-1:-1;;;2007:38:0;;;;;;;:::i;:::-;2550:7:::1;:14:::0;;-1:-1:-1;;2550:14:0::1;2560:4;2550:14;::::0;;2580:20:::1;2587:12;682:10:::0;;602:98;22825:118;-1:-1:-1;;;;;22879:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;22879:24:0;22899:4;22879:24;;;22919:16;;;22879:17;22919:16;22825:118;:::o;27869:631::-;-1:-1:-1;;;;;28056:21:0;;28048:73;;;;-1:-1:-1;;;28048:73:0;;14615:2:1;28048:73:0;;;14597:21:1;14654:2;14634:18;;;14627:30;14693:34;14673:18;;;14666:62;-1:-1:-1;;;14744:18:1;;;14737:37;14791:19;;28048:73:0;14413:403:1;28048:73:0;28151:15;28140:8;:26;28132:70;;;;-1:-1:-1;;;28132:70:0;;15023:2:1;28132:70:0;;;15005:21:1;15062:2;15042:18;;;15035:30;15101:33;15081:18;;;15074:61;15152:18;;28132:70:0;14821:355:1;28132:70:0;28230:1;28221:6;:10;28213:47;;;;-1:-1:-1;;;28213:47:0;;15383:2:1;28213:47:0;;;15365:21:1;15422:2;15402:18;;;15395:30;15461:26;15441:18;;;15434:54;15505:18;;28213:47:0;15181:348:1;28213:47:0;28288:1;28279:6;:10;28271:47;;;;-1:-1:-1;;;28271:47:0;;15736:2:1;28271:47:0;;;15718:21:1;15775:2;15755:18;;;15748:30;15814:26;15794:18;;;15787:54;15858:18;;28271:47:0;15534:348:1;28271:47:0;28345:1;28337:5;:9;28329:45;;;;-1:-1:-1;;;28329:45:0;;16089:2:1;28329:45:0;;;16071:21:1;16128:2;16108:18;;;16101:30;16167:25;16147:18;;;16140:53;16210:18;;28329:45:0;15887:347:1;28329:45:0;28410:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28385:22:0;;-1:-1:-1;28385:22:0;;;:13;:22;;;;;;:69;;;;;;;;;;;;;;;;;;;;;;;;;28470:22;;28385;;28470;;;27869:631;;;;;:::o;24875:131::-;-1:-1:-1;;;;;24935:17:0;;24955:5;24935:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;24935:25:0;;;24976:22;;;24955:5;24976:22;24875:131;:::o;22095:125::-;-1:-1:-1;;;;;22152:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;22152:24:0;22172:4;22152:24;;;22192:20;;;22152:17;22192:20;22095:125;:::o;28654:161::-;28744:23;;;;;;;;-1:-1:-1;28744:23:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;28719:22:0;;;;;:13;:22;;;;;;:48;;;;;;;;;;;;;;;;;;;;;;;;28783:24;;28719:22;;28783:24;;;28654:161;:::o;31495:649::-;-1:-1:-1;;;;;23312:17:0;;23288:4;23312:17;;;:8;:17;;;;;;;;31702:16;31694:75;;;;-1:-1:-1;;;31694:75:0;;16441:2:1;31694:75:0;;;16423:21:1;16480:2;16460:18;;;16453:30;16519:34;16499:18;;;16492:62;-1:-1:-1;;;16570:18:1;;;16563:44;16624:19;;31694:75:0;16239:410:1;31694:75:0;-1:-1:-1;;;;;23312:17:0;;23288:4;23312:17;;;:8;:17;;;;;;;;31788:14;31780:71;;;;-1:-1:-1;;;31780:71:0;;16856:2:1;31780:71:0;;;16838:21:1;16895:2;16875:18;;;16868:30;16934:34;16914:18;;;16907:62;-1:-1:-1;;;16985:18:1;;;16978:42;17037:19;;31780:71:0;16654:408:1;31780:71:0;31871:23;682:10;31881:12;602:98;31871:23;31870:24;31862:90;;;;-1:-1:-1;;;31862:90:0;;17269:2:1;31862:90:0;;;17251:21:1;17308:2;17288:18;;;17281:30;17347:34;17327:18;;;17320:62;-1:-1:-1;;;17398:18:1;;;17391:51;17459:19;;31862:90:0;17067:417:1;31862:90:0;1737:4;1761:7;;;31971:9;31963:59;;;;-1:-1:-1;;;31963:59:0;;17691:2:1;31963:59:0;;;17673:21:1;17730:2;17710:18;;;17703:30;17769:34;17749:18;;;17742:62;-1:-1:-1;;;17820:18:1;;;17813:35;17865:19;;31963:59:0;17489:401:1;31963:59:0;32087:6;32059:24;32078:4;32059:18;:24::i;:::-;-1:-1:-1;;;;;9507:18:0;;9480:7;9507:18;;;:9;:18;;;;;;32041:42;;;;:::i;:::-;:52;;32033:103;;;;-1:-1:-1;;;32033:103:0;;18097:2:1;32033:103:0;;;18079:21:1;18136:2;18116:18;;;18109:30;18175:34;18155:18;;;18148:62;-1:-1:-1;;;18226:18:1;;;18219:36;18272:19;;32033:103:0;17895:402:1;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;:::-;333:39;192:186;-1:-1:-1;;;192:186:1:o;383:597::-;495:4;524:2;553;542:9;535:21;585:6;579:13;628:6;623:2;612:9;608:18;601:34;653:1;663:140;677:6;674:1;671:13;663:140;;;772:14;;;768:23;;762:30;738:17;;;757:2;734:26;727:66;692:10;;663:140;;;821:6;818:1;815:13;812:91;;;891:1;886:2;877:6;866:9;862:22;858:31;851:42;812:91;-1:-1:-1;964:2:1;943:15;-1:-1:-1;;939:29:1;924:45;;;;971:2;920:54;;383:597;-1:-1:-1;;;383:597:1:o;985:254::-;1053:6;1061;1114:2;1102:9;1093:7;1089:23;1085:32;1082:52;;;1130:1;1127;1120:12;1082:52;1153:29;1172:9;1153:29;:::i;:::-;1143:39;1229:2;1214:18;;;;1201:32;;-1:-1:-1;;;985:254:1:o;1436:322::-;1513:6;1521;1529;1582:2;1570:9;1561:7;1557:23;1553:32;1550:52;;;1598:1;1595;1588:12;1550:52;1621:29;1640:9;1621:29;:::i;:::-;1611:39;1697:2;1682:18;;1669:32;;-1:-1:-1;1748:2:1;1733:18;;;1720:32;;1436:322;-1:-1:-1;;;1436:322:1:o;2341:328::-;2418:6;2426;2434;2487:2;2475:9;2466:7;2462:23;2458:32;2455:52;;;2503:1;2500;2493:12;2455:52;2526:29;2545:9;2526:29;:::i;:::-;2516:39;;2574:38;2608:2;2597:9;2593:18;2574:38;:::i;:::-;2564:48;;2659:2;2648:9;2644:18;2631:32;2621:42;;2341:328;;;;;:::o;2863:180::-;2922:6;2975:2;2963:9;2954:7;2950:23;2946:32;2943:52;;;2991:1;2988;2981:12;2943:52;-1:-1:-1;3014:23:1;;2863:180;-1:-1:-1;2863:180:1:o;3048:343::-;3114:6;3122;3175:2;3163:9;3154:7;3150:23;3146:32;3143:52;;;3191:1;3188;3181:12;3143:52;3214:29;3233:9;3214:29;:::i;:::-;3204:39;;3293:2;3282:9;3278:18;3265:32;3337:4;3330:5;3326:16;3319:5;3316:27;3306:55;;3357:1;3354;3347:12;3306:55;3380:5;3370:15;;;3048:343;;;;;:::o;3857:391::-;3943:6;3951;3959;3967;4020:3;4008:9;3999:7;3995:23;3991:33;3988:53;;;4037:1;4034;4027:12;3988:53;4060:29;4079:9;4060:29;:::i;:::-;4050:39;4136:2;4121:18;;4108:32;;-1:-1:-1;4187:2:1;4172:18;;4159:32;;4238:2;4223:18;4210:32;;-1:-1:-1;3857:391:1;-1:-1:-1;;;3857:391:1:o;4253:260::-;4321:6;4329;4382:2;4370:9;4361:7;4357:23;4353:32;4350:52;;;4398:1;4395;4388:12;4350:52;4421:29;4440:9;4421:29;:::i;:::-;4411:39;;4469:38;4503:2;4492:9;4488:18;4469:38;:::i;:::-;4459:48;;4253:260;;;;;:::o;4518:356::-;4720:2;4702:21;;;4739:18;;;4732:30;4798:34;4793:2;4778:18;;4771:62;4865:2;4850:18;;4518:356::o;4879:340::-;5081:2;5063:21;;;5120:2;5100:18;;;5093:30;-1:-1:-1;;;5154:2:1;5139:18;;5132:46;5210:2;5195:18;;4879:340::o;5224:380::-;5303:1;5299:12;;;;5346;;;5367:61;;5421:4;5413:6;5409:17;5399:27;;5367:61;5474:2;5466:6;5463:14;5443:18;5440:38;5437:161;;5520:10;5515:3;5511:20;5508:1;5501:31;5555:4;5552:1;5545:15;5583:4;5580:1;5573:15;5437:161;;5224:380;;;:::o;5609:398::-;5811:2;5793:21;;;5850:2;5830:18;;;5823:30;5889:34;5884:2;5869:18;;5862:62;-1:-1:-1;;;5955:2:1;5940:18;;5933:32;5997:3;5982:19;;5609:398::o;6012:406::-;6214:2;6196:21;;;6253:2;6233:18;;;6226:30;6292:34;6287:2;6272:18;;6265:62;-1:-1:-1;;;6358:2:1;6343:18;;6336:40;6408:3;6393:19;;6012:406::o;6840:127::-;6901:10;6896:3;6892:20;6889:1;6882:31;6932:4;6929:1;6922:15;6956:4;6953:1;6946:15;6972:128;7012:3;7043:1;7039:6;7036:1;7033:13;7030:39;;;7049:18;;:::i;:::-;-1:-1:-1;7085:9:1;;6972:128::o;8209:127::-;8270:10;8265:3;8261:20;8258:1;8251:31;8301:4;8298:1;8291:15;8325:4;8322:1;8315:15;8620:277;8687:6;8740:2;8728:9;8719:7;8715:23;8711:32;8708:52;;;8756:1;8753;8746:12;8708:52;8788:9;8782:16;8841:5;8834:13;8827:21;8820:5;8817:32;8807:60;;8863:1;8860;8853:12;9308:125;9348:4;9376:1;9373;9370:8;9367:34;;;9381:18;;:::i;:::-;-1:-1:-1;9418:9:1;;9308:125::o;9438:168::-;9478:7;9544:1;9540;9536:6;9532:14;9529:1;9526:21;9521:1;9514:9;9507:17;9503:45;9500:71;;;9551:18;;:::i;:::-;-1:-1:-1;9591:9:1;;9438:168::o;9611:217::-;9651:1;9677;9667:132;;9721:10;9716:3;9712:20;9709:1;9702:31;9756:4;9753:1;9746:15;9784:4;9781:1;9774:15;9667:132;-1:-1:-1;9813:9:1;;9611:217::o;9833:135::-;9872:3;9893:17;;;9890:43;;9913:18;;:::i;:::-;-1:-1:-1;9960:1:1;9949:13;;9833:135::o;14281:127::-;14342:10;14337:3;14333:20;14330:1;14323:31;14373:4;14370:1;14363:15;14397:4;14394:1;14387:15

Swarm Source

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