ETH Price: $3,174.87 (+4.55%)

Token

TheLandDAO Rent (RENT)
 

Overview

Max Total Supply

632,332.297974537037035337 RENT

Holders

1,048

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
jameschr.eth
Balance
92.330462962962962962 RENT

Value
$0.00
0x0934e8e0310cc440f16b2543b2e22068d849a145
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RentToken

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-24
*/

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

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

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/RentToken.sol


pragma solidity ^0.8.0;






contract RentToken is ERC20, Ownable, Pausable {
    using MerkleProof for bytes32[];

    uint256 constant public MAX_SUPPLY = 132407400 ether; 
	uint256 constant public INTERVAL = 86400; 

    bytes32 public merkleOne; // merkle tree roots to prove tier information
    bytes32 public merkleTwo;
    bytes32 public merkleThree;
    bool public stateLocked = false;

	mapping(address => uint256) private lastUpdate; // record when user interacts with contract
    mapping(uint256 => uint256) private NFTReward; // maps token id to daily reward

	IERC721Enumerable public NFTContract;  

	event RewardPaid(address indexed user, uint256 reward); 
 
    constructor(address NFTContractAddress) ERC20("TheLandDAO Rent", "RENT") {

        setNFTContractAddress(NFTContractAddress);
        setMerkleRoots(
            0x20601687dba511bb55c7117c2eaf5da3f978ff2092794b653fcd503928548dd8,
            0x62eabcc3369785536a90efb26ad0f463cd7d14a92b1ea53d6bfbe502cbf0097f,
            0xd4efe9e8d38c0bd881d7788a174a1e0b0c1e38bd4c0b6960299d8a7fe46e70e7
        );
        pause();
    }

    /* * * * * * * * * * * * * * * OWNER ONLY FUNCTIONS * * * * * * * * * * * * * * */

    // prevents vital data from being altered
    function lockState() public onlyOwner {
        require(address(NFTContract) != address(0));
        require(merkleOne != 0 && merkleTwo != 0 && merkleThree != 0);

        stateLocked = true;
    }

    // stop users from interacting with the contract
    function pause() public onlyOwner { 

        _pause(); 
    }
 
    // Set the address for the NFT contract
    function setNFTContractAddress(address _NFTContract) public onlyOwner {
        require(!stateLocked, "Contract can no longer be changed");

        NFTContract = IERC721Enumerable(_NFTContract);
    }

    // record the root hashes of merkle trees storing tier reward information
    function setMerkleRoots(bytes32 _tierOne, bytes32 _tierTwo, bytes32 _tierThree) public onlyOwner {
        require(!stateLocked, "Contract can no longer be changed");

        merkleOne = _tierOne;
        merkleTwo = _tierTwo;
        merkleThree = _tierThree;
    }

    // allow users to interact with contract
    function unpause() public onlyOwner { 
        require(address(NFTContract) != address(0));
        require(merkleOne != 0 && merkleTwo != 0 && merkleThree != 0);

        _unpause(); 
    } 

    /* * * * * * * * * * * * * * * GASLESS GET FUNCTIONS * * * * * * * * * * * * * * */

    // return the tier based reward of a token ID
    // can only be called after token reward has been recorded onchain (call startEarningRent or proveTier)
    function getDailyReward(uint256 tokenId) external view returns(uint256) {
        require(isProved(tokenId), "Tier has not yet been proved.");

        return NFTReward[tokenId];
    }

    // returns the last timestamp user interacted with the contract
    // needs to be non zero in order to claimReward (call startEarningRent)
    function getLastUpdate(address user) external view returns(uint256) {
        
        return lastUpdate[user];
    }

    // return the number of LandDao NFTs user owns
    function getNFTBalance(address user) public view returns (uint256) {

        return NFTContract.balanceOf(user);
    }

    // returns the LandDao NFT token IDs user owns
    function getNFTIds(address user) public view returns (uint256[] memory _tokensOfOwner) {
        _tokensOfOwner = new uint256[](getNFTBalance(user));

        for (uint256 i = 0; i < getNFTBalance(user); i++) { 
            _tokensOfOwner[i] = NFTContract.tokenOfOwnerByIndex(user, i);
        }
    }

    // return true if NFT at token ID has been recorded onchain
    // user token ID's need to be proved before claimReward (call startEarningRent or proveTier)
    function isProved(uint256 tokenId) public view returns (bool proved) {
        
        if (NFTReward[tokenId] > 0) {
            proved = true;
        } else {
            proved = false;
        }

        return proved;
    }
    
    // return the rewards user could claim at current timestamp
    // can only be called after lastUpdate[user] > 0, and NFT token IDs have been proved (call startEarningRent)
    function getPendingReward(address user) public view returns(uint256) { 
        uint256 dailyReward = 0;
        uint256[] memory NFTIds = getNFTIds(user);
        
        // sum each daily NFT reward owned by user
        for (uint256 i = 0; i < getNFTBalance(user); i++) { 
            require(isProved(NFTIds[i]), "Make sure your NFTs have been initalized by calling isProved(ID)");

            dailyReward = dailyReward + (NFTReward[NFTIds[i]]); 
        }

        // (block.timestamp - lastUpdate[user]) / INTERVAL = number of days
        // dailyReward = sum of each NFT daily reward
        // 1 ether = 1000000000000000000
        return (dailyReward * 1 ether * (block.timestamp - lastUpdate[user])) / INTERVAL;
    }

    /* * * * * * * * * * * * * * * USER GAS FUNCTIONS * * * * * * * * * * * * * * */

    // Pay out the holder
    // can only be called after lastUpdate[user] > 0, and NFT token IDs have been proved (call startEarningRent)
    function claimReward() external whenNotPaused { 
        require(totalSupply() < MAX_SUPPLY, "RENT collection is over"); // RENT earned will not be claimable after max RENT has been minted
        require(lastUpdate[msg.sender] != 0, "If you have a LAND token, call startEarningRent"); 
 
        uint256 currentReward = getPendingReward(msg.sender);

        pay(msg.sender, currentReward);

        lastUpdate[msg.sender] = block.timestamp; 
    }

    // check each merkle tree for NFT id, and record result onchain
    // user calls this when they have already startEarningRent, but have a new NFT so that isProved(NFT) = false
    function proveTier(bytes32[] calldata _merkleProof, bytes32 tokenHash, uint256 tokenId) public whenNotPaused {
        require(tokenId <= 8888, "Invalid token ID.");
        require(msg.sender == NFTContract.ownerOf(tokenId) || msg.sender == address(this)); // make sure this function is only called by owner of token ID

        if (tokenId <= 1500) { // is genesis
            NFTReward[tokenId] = 10;
        } else if (MerkleProof.verify(_merkleProof, merkleOne, tokenHash)) { // is tier 1
            NFTReward[tokenId] = 4;
        } else if (MerkleProof.verify(_merkleProof, merkleTwo, tokenHash)) { // is tier 2
            NFTReward[tokenId] = 3;
        } else if (MerkleProof.verify(_merkleProof, merkleThree, tokenHash)) { // is tier 3
            NFTReward[tokenId] = 2;
        } else {
            revert();
        }
    }

    // user is added to lastUpdate before rewards can be calculated 
    // prove and record nft tier information
    // merkle proofs sent from frontend 
    function startEarningRent(
        bytes32[][] calldata _merkleProofs, // array of proofs (each proof is array)
        bytes32[] calldata _tokenHashes 
    ) external whenNotPaused {
        require(getNFTBalance(msg.sender) > 0, "Buy a LandDao NFT to start earning RENT");

        uint256[] memory tokenIds = getNFTIds(msg.sender);
        
        // prove tiers, mint airdrop to users who prove tiers
        for (uint256 i = 0; i < tokenIds.length; i++) {
            if (!isProved(tokenIds[i])) {
                proveTier(_merkleProofs[i], _tokenHashes[i], tokenIds[i]);
                mintAirdrop(msg.sender, tokenIds[i]);
            }
        }

        lastUpdate[msg.sender] = block.timestamp;
    }

    /* * * * * * * * * * * * * * * INTERNAL HELPER FUNCTIONS * * * * * * * * * * * * * * */

    // when a token is proved during startEarningRent, payout airdrop to holder
    function mintAirdrop(address user, uint256 tokenId) internal whenNotPaused {
        require(totalSupply() < MAX_SUPPLY, "RENT collection is over"); // RENT earned will not be claimable after max RENT has been minted.
 
        uint256 startBlock;
        if (tokenId <= 1500) { 
            startBlock = 1640995200; // jan 1 2022
        } else {
            startBlock = 1642291200; // jan 16 2022
        }
        uint256 currentReward = (NFTReward[tokenId] * 1 ether * (block.timestamp - startBlock)) / INTERVAL;

        pay(user, currentReward);
    }
    
    // mints the user appropriate amount of tokens
    function pay(address user, uint256 reward) internal whenNotPaused {

        if (totalSupply() + reward <= MAX_SUPPLY) { // make sure claim does not exceed total supply

            _mint(user, reward); // erc20 mint updates totalSupply

        } else { // supply + rewards > max supply, so give claimer less rewards 
            reward = MAX_SUPPLY - totalSupply();
            _mint(user, reward);
        }

        emit RewardPaid(user, reward);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"NFTContractAddress","type":"address"}],"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":"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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFTContract","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","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":"uint256","name":"tokenId","type":"uint256"}],"name":"getDailyReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getLastUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNFTBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNFTIds","outputs":[{"internalType":"uint256[]","name":"_tokensOfOwner","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getPendingReward","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":"uint256","name":"tokenId","type":"uint256"}],"name":"isProved","outputs":[{"internalType":"bool","name":"proved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merkleOne","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleThree","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleTwo","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"bytes32","name":"tokenHash","type":"bytes32"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"proveTier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_tierOne","type":"bytes32"},{"internalType":"bytes32","name":"_tierTwo","type":"bytes32"},{"internalType":"bytes32","name":"_tierThree","type":"bytes32"}],"name":"setMerkleRoots","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_NFTContract","type":"address"}],"name":"setNFTContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[][]","name":"_merkleProofs","type":"bytes32[][]"},{"internalType":"bytes32[]","name":"_tokenHashes","type":"bytes32[]"}],"name":"startEarningRent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stateLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600960006101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040516200466b3803806200466b833981810160405281019062000052919062000722565b6040518060400160405280600f81526020017f5468654c616e6444414f2052656e7400000000000000000000000000000000008152506040518060400160405280600481526020017f52454e54000000000000000000000000000000000000000000000000000000008152508160039080519060200190620000d69291906200065b565b508060049080519060200190620000ef9291906200065b565b5050506200011262000106620001d160201b60201c565b620001d960201b60201c565b6000600560146101000a81548160ff0219169083151502179055506200013e816200029f60201b60201c565b620001ba7f20601687dba511bb55c7117c2eaf5da3f978ff2092794b653fcd503928548dd860001b7f62eabcc3369785536a90efb26ad0f463cd7d14a92b1ea53d6bfbe502cbf0097f60001b7fd4efe9e8d38c0bd881d7788a174a1e0b0c1e38bd4c0b6960299d8a7fe46e70e760001b620003c560201b60201c565b620001ca620004c160201b60201c565b50620009c7565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002af620001d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002d56200056260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200032e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003259062000819565b60405180910390fd5b600960009054906101000a900460ff161562000381576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000378906200083b565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620003d5620001d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003fb6200056260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000454576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200044b9062000819565b60405180910390fd5b600960009054906101000a900460ff1615620004a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049e906200083b565b60405180910390fd5b826006819055508160078190555080600881905550505050565b620004d1620001d160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004f76200056260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000550576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005479062000819565b60405180910390fd5b620005606200058c60201b60201c565b565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200059c6200064460201b60201c565b15620005df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005d690620007f7565b60405180910390fd5b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586200062b620001d160201b60201c565b6040516200063a9190620007da565b60405180910390a1565b6000600560149054906101000a900460ff16905090565b8280546200066990620008a2565b90600052602060002090601f0160209004810192826200068d5760008555620006d9565b82601f10620006a857805160ff1916838001178555620006d9565b82800160010185558215620006d9579182015b82811115620006d8578251825591602001919060010190620006bb565b5b509050620006e89190620006ec565b5090565b5b8082111562000707576000816000905550600101620006ed565b5090565b6000815190506200071c81620009ad565b92915050565b6000602082840312156200073b576200073a62000907565b5b60006200074b848285016200070b565b91505092915050565b6200075f816200086e565b82525050565b6000620007746010836200085d565b915062000781826200090c565b602082019050919050565b60006200079b6020836200085d565b9150620007a88262000935565b602082019050919050565b6000620007c26021836200085d565b9150620007cf826200095e565b604082019050919050565b6000602082019050620007f1600083018462000754565b92915050565b60006020820190508181036000830152620008128162000765565b9050919050565b6000602082019050818103600083015262000834816200078c565b9050919050565b600060208201905081810360008301526200085681620007b3565b9050919050565b600082825260208201905092915050565b60006200087b8262000882565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620008bb57607f821691505b60208210811415620008d257620008d1620008d8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f436f6e74726163742063616e206e6f206c6f6e676572206265206368616e676560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b620009b8816200086e565b8114620009c457600080fd5b50565b613c9480620009d76000396000f3fe608060405234801561001057600080fd5b506004361061021b5760003560e01c806370a0823111610125578063a9059cbb116100ad578063bf8ebd851161007c578063bf8ebd851461060a578063d3cca9cb1461063a578063d88d200014610658578063dd62ed3e14610688578063f2fde38b146106b85761021b565b8063a9059cbb14610584578063b88a802f146105b4578063b91f2b28146105be578063bf3c8b7b146105da5761021b565b80638da5cb5b116100f45780638da5cb5b146104ca57806395d89b41146104e857806397e1196a14610506578063a457c2d714610536578063a757d5c8146105665761021b565b806370a0823114610468578063715018a6146104985780638456cb59146104a257806389facb20146104ac5761021b565b806332cb6b0c116101a85780634df9d6ba116101775780634df9d6ba146103ae5780635a7e1989146103de5780635c975abb1461040e5780635e18c9381461042c5780636e7df5c71461044a5761021b565b806332cb6b0c1461034c578063395093511461036a5780633f4ba83a1461039a57806346be9c48146103a45761021b565b80631bb4dff0116101ef5780631bb4dff0146102a857806323949cd1146102c457806323b872dd146102e0578063313ce5671461031057806331c2273b1461032e5761021b565b8062f9ae541461022057806306fdde031461023c578063095ea7b31461025a57806318160ddd1461028a575b600080fd5b61023a60048036038101906102359190612af8565b6106d4565b005b6102446107ba565b6040516102519190613050565b60405180910390f35b610274600480360381019061026f91906129c3565b61084c565b6040516102819190612fff565b60405180910390f35b61029261086a565b60405161029f91906132d2565b60405180910390f35b6102c260048036038101906102bd9190612a03565b610874565b005b6102de60048036038101906102d991906128d6565b610a2d565b005b6102fa60048036038101906102f59190612970565b610b3d565b6040516103079190612fff565b60405180910390f35b610318610c35565b60405161032591906132ed565b60405180910390f35b610336610c3e565b6040516103439190613035565b60405180910390f35b610354610c64565b60405161036191906132d2565b60405180910390f35b610384600480360381019061037f91906129c3565b610c73565b6040516103919190612fff565b60405180910390f35b6103a2610d1f565b005b6103ac610e35565b005b6103c860048036038101906103c391906128d6565b610f5e565b6040516103d591906132d2565b60405180910390f35b6103f860048036038101906103f391906128d6565b6110b6565b60405161040591906132d2565b60405180910390f35b6104166110ff565b6040516104239190612fff565b60405180910390f35b610434611116565b6040516104419190612fff565b60405180910390f35b610452611129565b60405161045f919061301a565b60405180910390f35b610482600480360381019061047d91906128d6565b61112f565b60405161048f91906132d2565b60405180910390f35b6104a0611177565b005b6104aa6111ff565b005b6104b4611285565b6040516104c191906132d2565b60405180910390f35b6104d261128c565b6040516104df9190612f99565b60405180910390f35b6104f06112b6565b6040516104fd9190613050565b60405180910390f35b610520600480360381019061051b9190612b4b565b611348565b60405161052d9190612fff565b60405180910390f35b610550600480360381019061054b91906129c3565b611378565b60405161055d9190612fff565b60405180910390f35b61056e611463565b60405161057b919061301a565b60405180910390f35b61059e600480360381019061059991906129c3565b611469565b6040516105ab9190612fff565b60405180910390f35b6105bc611487565b005b6105d860048036038101906105d39190612a84565b611604565b005b6105f460048036038101906105ef91906128d6565b611931565b6040516106019190612fdd565b60405180910390f35b610624600480360381019061061f91906128d6565b611a7e565b60405161063191906132d2565b60405180910390f35b610642611b32565b60405161064f919061301a565b60405180910390f35b610672600480360381019061066d9190612b4b565b611b38565b60405161067f91906132d2565b60405180910390f35b6106a2600480360381019061069d9190612930565b611b9d565b6040516106af91906132d2565b60405180910390f35b6106d260048036038101906106cd91906128d6565b611c24565b005b6106dc611d1c565b73ffffffffffffffffffffffffffffffffffffffff166106fa61128c565b73ffffffffffffffffffffffffffffffffffffffff1614610750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610747906131f2565b60405180910390fd5b600960009054906101000a900460ff16156107a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079790613272565b60405180910390fd5b826006819055508160078190555080600881905550505050565b6060600380546107c99061359d565b80601f01602080910402602001604051908101604052809291908181526020018280546107f59061359d565b80156108425780601f1061081757610100808354040283529160200191610842565b820191906000526020600020905b81548152906001019060200180831161082557829003601f168201915b5050505050905090565b6000610860610859611d1c565b8484611d24565b6001905092915050565b6000600254905090565b61087c6110ff565b156108bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b390613152565b60405180910390fd5b60006108c733611a7e565b11610907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fe90613172565b60405180910390fd5b600061091233611931565b905060005b81518110156109e157610943828281518110610936576109356136af565b5b6020026020010151611348565b6109ce576109a986868381811061095d5761095c6136af565b5b905060200281019061096f9190613308565b868685818110610982576109816136af565b5b9050602002013585858151811061099c5761099b6136af565b5b6020026020010151611604565b6109cd338383815181106109c0576109bf6136af565b5b6020026020010151611eef565b5b80806109d9906135cf565b915050610917565b5042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b610a35611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610a5361128c565b73ffffffffffffffffffffffffffffffffffffffff1614610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa0906131f2565b60405180910390fd5b600960009054906101000a900460ff1615610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090613272565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610b4a848484612009565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b95611d1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c906131b2565b60405180910390fd5b610c2985610c21611d1c565b858403611d24565b60019150509392505050565b60006012905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6a6d865b896268d180a0000081565b6000610d15610c80611d1c565b848460016000610c8e611d1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d1091906133c0565b611d24565b6001905092915050565b610d27611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610d4561128c565b73ffffffffffffffffffffffffffffffffffffffff1614610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d92906131f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610df757600080fd5b6000801b60065414158015610e1157506000801b60075414155b8015610e2257506000801b60085414155b610e2b57600080fd5b610e3361228a565b565b610e3d611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610e5b61128c565b73ffffffffffffffffffffffffffffffffffffffff1614610eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea8906131f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f0d57600080fd5b6000801b60065414158015610f2757506000801b60075414155b8015610f3857506000801b60085414155b610f4157600080fd5b6001600960006101000a81548160ff021916908315150217905550565b600080600090506000610f7084611931565b905060005b610f7e85611a7e565b81101561103557610fa8828281518110610f9b57610f9a6136af565b5b6020026020010151611348565b610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90613212565b60405180910390fd5b600b6000838381518110610ffe57610ffd6136af565b5b60200260200101518152602001908152602001600020548361102091906133c0565b9250808061102d906135cf565b915050610f75565b5062015180600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261108591906134a1565b670de0b6b3a7640000846110999190613447565b6110a39190613447565b6110ad9190613416565b92505050919050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560149054906101000a900460ff16905090565b600960009054906101000a900460ff1681565b60065481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61117f611d1c565b73ffffffffffffffffffffffffffffffffffffffff1661119d61128c565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea906131f2565b60405180910390fd5b6111fd600061232c565b565b611207611d1c565b73ffffffffffffffffffffffffffffffffffffffff1661122561128c565b73ffffffffffffffffffffffffffffffffffffffff161461127b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611272906131f2565b60405180910390fd5b6112836123f2565b565b6201518081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112c59061359d565b80601f01602080910402602001604051908101604052809291908181526020018280546112f19061359d565b801561133e5780601f106113135761010080835404028352916020019161133e565b820191906000526020600020905b81548152906001019060200180831161132157829003601f168201915b5050505050905090565b600080600b600084815260200190815260200160002054111561136e5760019050611373565b600090505b919050565b60008060016000611387611d1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613292565b60405180910390fd5b61145861144f611d1c565b85858403611d24565b600191505092915050565b60085481565b600061147d611476611d1c565b8484612009565b6001905092915050565b61148f6110ff565b156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690613152565b60405180910390fd5b6a6d865b896268d180a000006114e361086a565b10611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a90613192565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d906130f2565b60405180910390fd5b60006115b133610f5e565b90506115bd3382612495565b42600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b61160c6110ff565b1561164c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164390613152565b60405180910390fd5b6122b8811115611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890613132565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b81526004016116ec91906132d2565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190612903565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117a057503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6117a957600080fd5b6105dc81116117d057600a600b60008381526020019081526020016000208190555061192b565b61181e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506006548461258d565b15611841576004600b60008381526020019081526020016000208190555061192a565b61188f848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506007548461258d565b156118b2576003600b600083815260200190815260200160002081905550611929565b611900848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506008548461258d565b15611923576002600b600083815260200190815260200160002081905550611928565b600080fd5b5b5b5b50505050565b606061193c82611a7e565b67ffffffffffffffff811115611955576119546136de565b5b6040519080825280602002602001820160405280156119835781602001602082028036833780820191505090505b50905060005b61199283611a7e565b811015611a7857600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5984836040518363ffffffff1660e01b81526004016119f6929190612fb4565b60206040518083038186803b158015611a0e57600080fd5b505afa158015611a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a469190612b78565b828281518110611a5957611a586136af565b5b6020026020010181815250508080611a70906135cf565b915050611989565b50919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611adb9190612f99565b60206040518083038186803b158015611af357600080fd5b505afa158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190612b78565b9050919050565b60075481565b6000611b4382611348565b611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b79906131d2565b60405180910390fd5b600b6000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611c2c611d1c565b73ffffffffffffffffffffffffffffffffffffffff16611c4a61128c565b73ffffffffffffffffffffffffffffffffffffffff1614611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c97906131f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d07906130b2565b60405180910390fd5b611d198161232c565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b90613252565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb906130d2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ee291906132d2565b60405180910390a3505050565b611ef76110ff565b15611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90613152565b60405180910390fd5b6a6d865b896268d180a00000611f4b61086a565b10611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290613192565b60405180910390fd5b60006105dc8211611fa2576361cf99809050611faa565b6361e3600090505b6000620151808242611fbc91906134a1565b670de0b6b3a7640000600b600087815260200190815260200160002054611fe39190613447565b611fed9190613447565b611ff79190613416565b90506120038482612495565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207090613232565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e090613072565b60405180910390fd5b6120f48383836125a4565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561217a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217190613112565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220d91906133c0565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161227191906132d2565b60405180910390a36122848484846125a9565b50505050565b6122926110ff565b6122d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c890613092565b60405180910390fd5b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612315611d1c565b6040516123229190612f99565b60405180910390a1565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123fa6110ff565b1561243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190613152565b60405180910390fd5b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861247e611d1c565b60405161248b9190612f99565b60405180910390a1565b61249d6110ff565b156124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d490613152565b60405180910390fd5b6a6d865b896268d180a00000816124f261086a565b6124fc91906133c0565b116125105761250b82826125ae565b61253b565b61251861086a565b6a6d865b896268d180a0000061252e91906134a1565b905061253a82826125ae565b5b8173ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04868260405161258191906132d2565b60405180910390a25050565b60008261259a858461270e565b1490509392505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561261e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612615906132b2565b60405180910390fd5b61262a600083836125a4565b806002600082825461263c91906133c0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269191906133c0565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126f691906132d2565b60405180910390a361270a600083836125a9565b5050565b60008082905060005b84518110156127b6576000858281518110612735576127346136af565b5b60200260200101519050808311612776578281604051602001612759929190612f6d565b6040516020818303038152906040528051906020012092506127a2565b8083604051602001612789929190612f6d565b6040516020818303038152906040528051906020012092505b5080806127ae906135cf565b915050612717565b508091505092915050565b6000813590506127d081613c19565b92915050565b6000815190506127e581613c19565b92915050565b60008083601f84011261280157612800613712565b5b8235905067ffffffffffffffff81111561281e5761281d61370d565b5b60208301915083602082028301111561283a57612839613721565b5b9250929050565b60008083601f84011261285757612856613712565b5b8235905067ffffffffffffffff8111156128745761287361370d565b5b6020830191508360208202830111156128905761288f613721565b5b9250929050565b6000813590506128a681613c30565b92915050565b6000813590506128bb81613c47565b92915050565b6000815190506128d081613c47565b92915050565b6000602082840312156128ec576128eb613730565b5b60006128fa848285016127c1565b91505092915050565b60006020828403121561291957612918613730565b5b6000612927848285016127d6565b91505092915050565b6000806040838503121561294757612946613730565b5b6000612955858286016127c1565b9250506020612966858286016127c1565b9150509250929050565b60008060006060848603121561298957612988613730565b5b6000612997868287016127c1565b93505060206129a8868287016127c1565b92505060406129b9868287016128ac565b9150509250925092565b600080604083850312156129da576129d9613730565b5b60006129e8858286016127c1565b92505060206129f9858286016128ac565b9150509250929050565b60008060008060408587031215612a1d57612a1c613730565b5b600085013567ffffffffffffffff811115612a3b57612a3a61372b565b5b612a47878288016127eb565b9450945050602085013567ffffffffffffffff811115612a6a57612a6961372b565b5b612a7687828801612841565b925092505092959194509250565b60008060008060608587031215612a9e57612a9d613730565b5b600085013567ffffffffffffffff811115612abc57612abb61372b565b5b612ac887828801612841565b94509450506020612adb87828801612897565b9250506040612aec878288016128ac565b91505092959194509250565b600080600060608486031215612b1157612b10613730565b5b6000612b1f86828701612897565b9350506020612b3086828701612897565b9250506040612b4186828701612897565b9150509250925092565b600060208284031215612b6157612b60613730565b5b6000612b6f848285016128ac565b91505092915050565b600060208284031215612b8e57612b8d613730565b5b6000612b9c848285016128c1565b91505092915050565b6000612bb18383612f40565b60208301905092915050565b612bc6816134d5565b82525050565b6000612bd78261337b565b612be1818561339e565b9350612bec8361336b565b8060005b83811015612c1d578151612c048882612ba5565b9750612c0f83613391565b925050600181019050612bf0565b5085935050505092915050565b612c33816134e7565b82525050565b612c42816134f3565b82525050565b612c59612c54826134f3565b613618565b82525050565b612c6881613534565b82525050565b6000612c7982613386565b612c8381856133af565b9350612c9381856020860161356a565b612c9c81613735565b840191505092915050565b6000612cb46023836133af565b9150612cbf82613746565b604082019050919050565b6000612cd76014836133af565b9150612ce282613795565b602082019050919050565b6000612cfa6026836133af565b9150612d05826137be565b604082019050919050565b6000612d1d6022836133af565b9150612d288261380d565b604082019050919050565b6000612d40602f836133af565b9150612d4b8261385c565b604082019050919050565b6000612d636026836133af565b9150612d6e826138ab565b604082019050919050565b6000612d866011836133af565b9150612d91826138fa565b602082019050919050565b6000612da96010836133af565b9150612db482613923565b602082019050919050565b6000612dcc6027836133af565b9150612dd78261394c565b604082019050919050565b6000612def6017836133af565b9150612dfa8261399b565b602082019050919050565b6000612e126028836133af565b9150612e1d826139c4565b604082019050919050565b6000612e35601d836133af565b9150612e4082613a13565b602082019050919050565b6000612e586020836133af565b9150612e6382613a3c565b602082019050919050565b6000612e7b6040836133af565b9150612e8682613a65565b604082019050919050565b6000612e9e6025836133af565b9150612ea982613ab4565b604082019050919050565b6000612ec16024836133af565b9150612ecc82613b03565b604082019050919050565b6000612ee46021836133af565b9150612eef82613b52565b604082019050919050565b6000612f076025836133af565b9150612f1282613ba1565b604082019050919050565b6000612f2a601f836133af565b9150612f3582613bf0565b602082019050919050565b612f498161351d565b82525050565b612f588161351d565b82525050565b612f6781613527565b82525050565b6000612f798285612c48565b602082019150612f898284612c48565b6020820191508190509392505050565b6000602082019050612fae6000830184612bbd565b92915050565b6000604082019050612fc96000830185612bbd565b612fd66020830184612f4f565b9392505050565b60006020820190508181036000830152612ff78184612bcc565b905092915050565b60006020820190506130146000830184612c2a565b92915050565b600060208201905061302f6000830184612c39565b92915050565b600060208201905061304a6000830184612c5f565b92915050565b6000602082019050818103600083015261306a8184612c6e565b905092915050565b6000602082019050818103600083015261308b81612ca7565b9050919050565b600060208201905081810360008301526130ab81612cca565b9050919050565b600060208201905081810360008301526130cb81612ced565b9050919050565b600060208201905081810360008301526130eb81612d10565b9050919050565b6000602082019050818103600083015261310b81612d33565b9050919050565b6000602082019050818103600083015261312b81612d56565b9050919050565b6000602082019050818103600083015261314b81612d79565b9050919050565b6000602082019050818103600083015261316b81612d9c565b9050919050565b6000602082019050818103600083015261318b81612dbf565b9050919050565b600060208201905081810360008301526131ab81612de2565b9050919050565b600060208201905081810360008301526131cb81612e05565b9050919050565b600060208201905081810360008301526131eb81612e28565b9050919050565b6000602082019050818103600083015261320b81612e4b565b9050919050565b6000602082019050818103600083015261322b81612e6e565b9050919050565b6000602082019050818103600083015261324b81612e91565b9050919050565b6000602082019050818103600083015261326b81612eb4565b9050919050565b6000602082019050818103600083015261328b81612ed7565b9050919050565b600060208201905081810360008301526132ab81612efa565b9050919050565b600060208201905081810360008301526132cb81612f1d565b9050919050565b60006020820190506132e76000830184612f4f565b92915050565b60006020820190506133026000830184612f5e565b92915050565b600080833560016020038436030381126133255761332461371c565b5b80840192508235915067ffffffffffffffff82111561334757613346613717565b5b60208301925060208202360383131561336357613362613726565b5b509250929050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006133cb8261351d565b91506133d68361351d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561340b5761340a613622565b5b828201905092915050565b60006134218261351d565b915061342c8361351d565b92508261343c5761343b613651565b5b828204905092915050565b60006134528261351d565b915061345d8361351d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561349657613495613622565b5b828202905092915050565b60006134ac8261351d565b91506134b78361351d565b9250828210156134ca576134c9613622565b5b828203905092915050565b60006134e0826134fd565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061353f82613546565b9050919050565b600061355182613558565b9050919050565b6000613563826134fd565b9050919050565b60005b8381101561358857808201518184015260208101905061356d565b83811115613597576000848401525b50505050565b600060028204905060018216806135b557607f821691505b602082108114156135c9576135c8613680565b5b50919050565b60006135da8261351d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561360d5761360c613622565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f496620796f7520686176652061204c414e4420746f6b656e2c2063616c6c207360008201527f746172744561726e696e6752656e740000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420746f6b656e2049442e000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4275792061204c616e6444616f204e465420746f207374617274206561726e6960008201527f6e672052454e5400000000000000000000000000000000000000000000000000602082015250565b7f52454e5420636f6c6c656374696f6e206973206f766572000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f5469657220686173206e6f7420796574206265656e2070726f7665642e000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d616b65207375726520796f7572204e4654732068617665206265656e20696e60008201527f6974616c697a65642062792063616c6c696e6720697350726f76656428494429602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f436f6e74726163742063616e206e6f206c6f6e676572206265206368616e676560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613c22816134d5565b8114613c2d57600080fd5b50565b613c39816134f3565b8114613c4457600080fd5b50565b613c508161351d565b8114613c5b57600080fd5b5056fea26469706673582212208c3658dffb81b7dabe783c7a79eb8ca9118280937f9dea42c446bb9880c4141264736f6c63430008070033000000000000000000000000ea25e2b3e35c67876957ee00a28cd912ff113f54

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021b5760003560e01c806370a0823111610125578063a9059cbb116100ad578063bf8ebd851161007c578063bf8ebd851461060a578063d3cca9cb1461063a578063d88d200014610658578063dd62ed3e14610688578063f2fde38b146106b85761021b565b8063a9059cbb14610584578063b88a802f146105b4578063b91f2b28146105be578063bf3c8b7b146105da5761021b565b80638da5cb5b116100f45780638da5cb5b146104ca57806395d89b41146104e857806397e1196a14610506578063a457c2d714610536578063a757d5c8146105665761021b565b806370a0823114610468578063715018a6146104985780638456cb59146104a257806389facb20146104ac5761021b565b806332cb6b0c116101a85780634df9d6ba116101775780634df9d6ba146103ae5780635a7e1989146103de5780635c975abb1461040e5780635e18c9381461042c5780636e7df5c71461044a5761021b565b806332cb6b0c1461034c578063395093511461036a5780633f4ba83a1461039a57806346be9c48146103a45761021b565b80631bb4dff0116101ef5780631bb4dff0146102a857806323949cd1146102c457806323b872dd146102e0578063313ce5671461031057806331c2273b1461032e5761021b565b8062f9ae541461022057806306fdde031461023c578063095ea7b31461025a57806318160ddd1461028a575b600080fd5b61023a60048036038101906102359190612af8565b6106d4565b005b6102446107ba565b6040516102519190613050565b60405180910390f35b610274600480360381019061026f91906129c3565b61084c565b6040516102819190612fff565b60405180910390f35b61029261086a565b60405161029f91906132d2565b60405180910390f35b6102c260048036038101906102bd9190612a03565b610874565b005b6102de60048036038101906102d991906128d6565b610a2d565b005b6102fa60048036038101906102f59190612970565b610b3d565b6040516103079190612fff565b60405180910390f35b610318610c35565b60405161032591906132ed565b60405180910390f35b610336610c3e565b6040516103439190613035565b60405180910390f35b610354610c64565b60405161036191906132d2565b60405180910390f35b610384600480360381019061037f91906129c3565b610c73565b6040516103919190612fff565b60405180910390f35b6103a2610d1f565b005b6103ac610e35565b005b6103c860048036038101906103c391906128d6565b610f5e565b6040516103d591906132d2565b60405180910390f35b6103f860048036038101906103f391906128d6565b6110b6565b60405161040591906132d2565b60405180910390f35b6104166110ff565b6040516104239190612fff565b60405180910390f35b610434611116565b6040516104419190612fff565b60405180910390f35b610452611129565b60405161045f919061301a565b60405180910390f35b610482600480360381019061047d91906128d6565b61112f565b60405161048f91906132d2565b60405180910390f35b6104a0611177565b005b6104aa6111ff565b005b6104b4611285565b6040516104c191906132d2565b60405180910390f35b6104d261128c565b6040516104df9190612f99565b60405180910390f35b6104f06112b6565b6040516104fd9190613050565b60405180910390f35b610520600480360381019061051b9190612b4b565b611348565b60405161052d9190612fff565b60405180910390f35b610550600480360381019061054b91906129c3565b611378565b60405161055d9190612fff565b60405180910390f35b61056e611463565b60405161057b919061301a565b60405180910390f35b61059e600480360381019061059991906129c3565b611469565b6040516105ab9190612fff565b60405180910390f35b6105bc611487565b005b6105d860048036038101906105d39190612a84565b611604565b005b6105f460048036038101906105ef91906128d6565b611931565b6040516106019190612fdd565b60405180910390f35b610624600480360381019061061f91906128d6565b611a7e565b60405161063191906132d2565b60405180910390f35b610642611b32565b60405161064f919061301a565b60405180910390f35b610672600480360381019061066d9190612b4b565b611b38565b60405161067f91906132d2565b60405180910390f35b6106a2600480360381019061069d9190612930565b611b9d565b6040516106af91906132d2565b60405180910390f35b6106d260048036038101906106cd91906128d6565b611c24565b005b6106dc611d1c565b73ffffffffffffffffffffffffffffffffffffffff166106fa61128c565b73ffffffffffffffffffffffffffffffffffffffff1614610750576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610747906131f2565b60405180910390fd5b600960009054906101000a900460ff16156107a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079790613272565b60405180910390fd5b826006819055508160078190555080600881905550505050565b6060600380546107c99061359d565b80601f01602080910402602001604051908101604052809291908181526020018280546107f59061359d565b80156108425780601f1061081757610100808354040283529160200191610842565b820191906000526020600020905b81548152906001019060200180831161082557829003601f168201915b5050505050905090565b6000610860610859611d1c565b8484611d24565b6001905092915050565b6000600254905090565b61087c6110ff565b156108bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b390613152565b60405180910390fd5b60006108c733611a7e565b11610907576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fe90613172565b60405180910390fd5b600061091233611931565b905060005b81518110156109e157610943828281518110610936576109356136af565b5b6020026020010151611348565b6109ce576109a986868381811061095d5761095c6136af565b5b905060200281019061096f9190613308565b868685818110610982576109816136af565b5b9050602002013585858151811061099c5761099b6136af565b5b6020026020010151611604565b6109cd338383815181106109c0576109bf6136af565b5b6020026020010151611eef565b5b80806109d9906135cf565b915050610917565b5042600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050505050565b610a35611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610a5361128c565b73ffffffffffffffffffffffffffffffffffffffff1614610aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa0906131f2565b60405180910390fd5b600960009054906101000a900460ff1615610af9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af090613272565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000610b4a848484612009565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610b95611d1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0c906131b2565b60405180910390fd5b610c2985610c21611d1c565b858403611d24565b60019150509392505050565b60006012905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6a6d865b896268d180a0000081565b6000610d15610c80611d1c565b848460016000610c8e611d1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610d1091906133c0565b611d24565b6001905092915050565b610d27611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610d4561128c565b73ffffffffffffffffffffffffffffffffffffffff1614610d9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d92906131f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610df757600080fd5b6000801b60065414158015610e1157506000801b60075414155b8015610e2257506000801b60085414155b610e2b57600080fd5b610e3361228a565b565b610e3d611d1c565b73ffffffffffffffffffffffffffffffffffffffff16610e5b61128c565b73ffffffffffffffffffffffffffffffffffffffff1614610eb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea8906131f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610f0d57600080fd5b6000801b60065414158015610f2757506000801b60075414155b8015610f3857506000801b60085414155b610f4157600080fd5b6001600960006101000a81548160ff021916908315150217905550565b600080600090506000610f7084611931565b905060005b610f7e85611a7e565b81101561103557610fa8828281518110610f9b57610f9a6136af565b5b6020026020010151611348565b610fe7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fde90613212565b60405180910390fd5b600b6000838381518110610ffe57610ffd6136af565b5b60200260200101518152602001908152602001600020548361102091906133c0565b9250808061102d906135cf565b915050610f75565b5062015180600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020544261108591906134a1565b670de0b6b3a7640000846110999190613447565b6110a39190613447565b6110ad9190613416565b92505050919050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600560149054906101000a900460ff16905090565b600960009054906101000a900460ff1681565b60065481565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61117f611d1c565b73ffffffffffffffffffffffffffffffffffffffff1661119d61128c565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea906131f2565b60405180910390fd5b6111fd600061232c565b565b611207611d1c565b73ffffffffffffffffffffffffffffffffffffffff1661122561128c565b73ffffffffffffffffffffffffffffffffffffffff161461127b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611272906131f2565b60405180910390fd5b6112836123f2565b565b6201518081565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546112c59061359d565b80601f01602080910402602001604051908101604052809291908181526020018280546112f19061359d565b801561133e5780601f106113135761010080835404028352916020019161133e565b820191906000526020600020905b81548152906001019060200180831161132157829003601f168201915b5050505050905090565b600080600b600084815260200190815260200160002054111561136e5760019050611373565b600090505b919050565b60008060016000611387611d1c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143b90613292565b60405180910390fd5b61145861144f611d1c565b85858403611d24565b600191505092915050565b60085481565b600061147d611476611d1c565b8484612009565b6001905092915050565b61148f6110ff565b156114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690613152565b60405180910390fd5b6a6d865b896268d180a000006114e361086a565b10611523576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151a90613192565b60405180910390fd5b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d906130f2565b60405180910390fd5b60006115b133610f5e565b90506115bd3382612495565b42600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b61160c6110ff565b1561164c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164390613152565b60405180910390fd5b6122b8811115611691576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168890613132565b60405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b81526004016116ec91906132d2565b60206040518083038186803b15801561170457600080fd5b505afa158015611718573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173c9190612903565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117a057503073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6117a957600080fd5b6105dc81116117d057600a600b60008381526020019081526020016000208190555061192b565b61181e848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506006548461258d565b15611841576004600b60008381526020019081526020016000208190555061192a565b61188f848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506007548461258d565b156118b2576003600b600083815260200190815260200160002081905550611929565b611900848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506008548461258d565b15611923576002600b600083815260200190815260200160002081905550611928565b600080fd5b5b5b5b50505050565b606061193c82611a7e565b67ffffffffffffffff811115611955576119546136de565b5b6040519080825280602002602001820160405280156119835781602001602082028036833780820191505090505b50905060005b61199283611a7e565b811015611a7857600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5984836040518363ffffffff1660e01b81526004016119f6929190612fb4565b60206040518083038186803b158015611a0e57600080fd5b505afa158015611a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a469190612b78565b828281518110611a5957611a586136af565b5b6020026020010181815250508080611a70906135cf565b915050611989565b50919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401611adb9190612f99565b60206040518083038186803b158015611af357600080fd5b505afa158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190612b78565b9050919050565b60075481565b6000611b4382611348565b611b82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b79906131d2565b60405180910390fd5b600b6000838152602001908152602001600020549050919050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b611c2c611d1c565b73ffffffffffffffffffffffffffffffffffffffff16611c4a61128c565b73ffffffffffffffffffffffffffffffffffffffff1614611ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c97906131f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d07906130b2565b60405180910390fd5b611d198161232c565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611d94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8b90613252565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb906130d2565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051611ee291906132d2565b60405180910390a3505050565b611ef76110ff565b15611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e90613152565b60405180910390fd5b6a6d865b896268d180a00000611f4b61086a565b10611f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8290613192565b60405180910390fd5b60006105dc8211611fa2576361cf99809050611faa565b6361e3600090505b6000620151808242611fbc91906134a1565b670de0b6b3a7640000600b600087815260200190815260200160002054611fe39190613447565b611fed9190613447565b611ff79190613416565b90506120038482612495565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207090613232565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e090613072565b60405180910390fd5b6120f48383836125a4565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561217a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217190613112565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461220d91906133c0565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161227191906132d2565b60405180910390a36122848484846125a9565b50505050565b6122926110ff565b6122d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c890613092565b60405180910390fd5b6000600560146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612315611d1c565b6040516123229190612f99565b60405180910390a1565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123fa6110ff565b1561243a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243190613152565b60405180910390fd5b6001600560146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861247e611d1c565b60405161248b9190612f99565b60405180910390a1565b61249d6110ff565b156124dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d490613152565b60405180910390fd5b6a6d865b896268d180a00000816124f261086a565b6124fc91906133c0565b116125105761250b82826125ae565b61253b565b61251861086a565b6a6d865b896268d180a0000061252e91906134a1565b905061253a82826125ae565b5b8173ffffffffffffffffffffffffffffffffffffffff167fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e04868260405161258191906132d2565b60405180910390a25050565b60008261259a858461270e565b1490509392505050565b505050565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561261e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612615906132b2565b60405180910390fd5b61262a600083836125a4565b806002600082825461263c91906133c0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461269191906133c0565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516126f691906132d2565b60405180910390a361270a600083836125a9565b5050565b60008082905060005b84518110156127b6576000858281518110612735576127346136af565b5b60200260200101519050808311612776578281604051602001612759929190612f6d565b6040516020818303038152906040528051906020012092506127a2565b8083604051602001612789929190612f6d565b6040516020818303038152906040528051906020012092505b5080806127ae906135cf565b915050612717565b508091505092915050565b6000813590506127d081613c19565b92915050565b6000815190506127e581613c19565b92915050565b60008083601f84011261280157612800613712565b5b8235905067ffffffffffffffff81111561281e5761281d61370d565b5b60208301915083602082028301111561283a57612839613721565b5b9250929050565b60008083601f84011261285757612856613712565b5b8235905067ffffffffffffffff8111156128745761287361370d565b5b6020830191508360208202830111156128905761288f613721565b5b9250929050565b6000813590506128a681613c30565b92915050565b6000813590506128bb81613c47565b92915050565b6000815190506128d081613c47565b92915050565b6000602082840312156128ec576128eb613730565b5b60006128fa848285016127c1565b91505092915050565b60006020828403121561291957612918613730565b5b6000612927848285016127d6565b91505092915050565b6000806040838503121561294757612946613730565b5b6000612955858286016127c1565b9250506020612966858286016127c1565b9150509250929050565b60008060006060848603121561298957612988613730565b5b6000612997868287016127c1565b93505060206129a8868287016127c1565b92505060406129b9868287016128ac565b9150509250925092565b600080604083850312156129da576129d9613730565b5b60006129e8858286016127c1565b92505060206129f9858286016128ac565b9150509250929050565b60008060008060408587031215612a1d57612a1c613730565b5b600085013567ffffffffffffffff811115612a3b57612a3a61372b565b5b612a47878288016127eb565b9450945050602085013567ffffffffffffffff811115612a6a57612a6961372b565b5b612a7687828801612841565b925092505092959194509250565b60008060008060608587031215612a9e57612a9d613730565b5b600085013567ffffffffffffffff811115612abc57612abb61372b565b5b612ac887828801612841565b94509450506020612adb87828801612897565b9250506040612aec878288016128ac565b91505092959194509250565b600080600060608486031215612b1157612b10613730565b5b6000612b1f86828701612897565b9350506020612b3086828701612897565b9250506040612b4186828701612897565b9150509250925092565b600060208284031215612b6157612b60613730565b5b6000612b6f848285016128ac565b91505092915050565b600060208284031215612b8e57612b8d613730565b5b6000612b9c848285016128c1565b91505092915050565b6000612bb18383612f40565b60208301905092915050565b612bc6816134d5565b82525050565b6000612bd78261337b565b612be1818561339e565b9350612bec8361336b565b8060005b83811015612c1d578151612c048882612ba5565b9750612c0f83613391565b925050600181019050612bf0565b5085935050505092915050565b612c33816134e7565b82525050565b612c42816134f3565b82525050565b612c59612c54826134f3565b613618565b82525050565b612c6881613534565b82525050565b6000612c7982613386565b612c8381856133af565b9350612c9381856020860161356a565b612c9c81613735565b840191505092915050565b6000612cb46023836133af565b9150612cbf82613746565b604082019050919050565b6000612cd76014836133af565b9150612ce282613795565b602082019050919050565b6000612cfa6026836133af565b9150612d05826137be565b604082019050919050565b6000612d1d6022836133af565b9150612d288261380d565b604082019050919050565b6000612d40602f836133af565b9150612d4b8261385c565b604082019050919050565b6000612d636026836133af565b9150612d6e826138ab565b604082019050919050565b6000612d866011836133af565b9150612d91826138fa565b602082019050919050565b6000612da96010836133af565b9150612db482613923565b602082019050919050565b6000612dcc6027836133af565b9150612dd78261394c565b604082019050919050565b6000612def6017836133af565b9150612dfa8261399b565b602082019050919050565b6000612e126028836133af565b9150612e1d826139c4565b604082019050919050565b6000612e35601d836133af565b9150612e4082613a13565b602082019050919050565b6000612e586020836133af565b9150612e6382613a3c565b602082019050919050565b6000612e7b6040836133af565b9150612e8682613a65565b604082019050919050565b6000612e9e6025836133af565b9150612ea982613ab4565b604082019050919050565b6000612ec16024836133af565b9150612ecc82613b03565b604082019050919050565b6000612ee46021836133af565b9150612eef82613b52565b604082019050919050565b6000612f076025836133af565b9150612f1282613ba1565b604082019050919050565b6000612f2a601f836133af565b9150612f3582613bf0565b602082019050919050565b612f498161351d565b82525050565b612f588161351d565b82525050565b612f6781613527565b82525050565b6000612f798285612c48565b602082019150612f898284612c48565b6020820191508190509392505050565b6000602082019050612fae6000830184612bbd565b92915050565b6000604082019050612fc96000830185612bbd565b612fd66020830184612f4f565b9392505050565b60006020820190508181036000830152612ff78184612bcc565b905092915050565b60006020820190506130146000830184612c2a565b92915050565b600060208201905061302f6000830184612c39565b92915050565b600060208201905061304a6000830184612c5f565b92915050565b6000602082019050818103600083015261306a8184612c6e565b905092915050565b6000602082019050818103600083015261308b81612ca7565b9050919050565b600060208201905081810360008301526130ab81612cca565b9050919050565b600060208201905081810360008301526130cb81612ced565b9050919050565b600060208201905081810360008301526130eb81612d10565b9050919050565b6000602082019050818103600083015261310b81612d33565b9050919050565b6000602082019050818103600083015261312b81612d56565b9050919050565b6000602082019050818103600083015261314b81612d79565b9050919050565b6000602082019050818103600083015261316b81612d9c565b9050919050565b6000602082019050818103600083015261318b81612dbf565b9050919050565b600060208201905081810360008301526131ab81612de2565b9050919050565b600060208201905081810360008301526131cb81612e05565b9050919050565b600060208201905081810360008301526131eb81612e28565b9050919050565b6000602082019050818103600083015261320b81612e4b565b9050919050565b6000602082019050818103600083015261322b81612e6e565b9050919050565b6000602082019050818103600083015261324b81612e91565b9050919050565b6000602082019050818103600083015261326b81612eb4565b9050919050565b6000602082019050818103600083015261328b81612ed7565b9050919050565b600060208201905081810360008301526132ab81612efa565b9050919050565b600060208201905081810360008301526132cb81612f1d565b9050919050565b60006020820190506132e76000830184612f4f565b92915050565b60006020820190506133026000830184612f5e565b92915050565b600080833560016020038436030381126133255761332461371c565b5b80840192508235915067ffffffffffffffff82111561334757613346613717565b5b60208301925060208202360383131561336357613362613726565b5b509250929050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006133cb8261351d565b91506133d68361351d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561340b5761340a613622565b5b828201905092915050565b60006134218261351d565b915061342c8361351d565b92508261343c5761343b613651565b5b828204905092915050565b60006134528261351d565b915061345d8361351d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561349657613495613622565b5b828202905092915050565b60006134ac8261351d565b91506134b78361351d565b9250828210156134ca576134c9613622565b5b828203905092915050565b60006134e0826134fd565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061353f82613546565b9050919050565b600061355182613558565b9050919050565b6000613563826134fd565b9050919050565b60005b8381101561358857808201518184015260208101905061356d565b83811115613597576000848401525b50505050565b600060028204905060018216806135b557607f821691505b602082108114156135c9576135c8613680565b5b50919050565b60006135da8261351d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561360d5761360c613622565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f496620796f7520686176652061204c414e4420746f6b656e2c2063616c6c207360008201527f746172744561726e696e6752656e740000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420746f6b656e2049442e000000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4275792061204c616e6444616f204e465420746f207374617274206561726e6960008201527f6e672052454e5400000000000000000000000000000000000000000000000000602082015250565b7f52454e5420636f6c6c656374696f6e206973206f766572000000000000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f5469657220686173206e6f7420796574206265656e2070726f7665642e000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d616b65207375726520796f7572204e4654732068617665206265656e20696e60008201527f6974616c697a65642062792063616c6c696e6720697350726f76656428494429602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f436f6e74726163742063616e206e6f206c6f6e676572206265206368616e676560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b613c22816134d5565b8114613c2d57600080fd5b50565b613c39816134f3565b8114613c4457600080fd5b50565b613c508161351d565b8114613c5b57600080fd5b5056fea26469706673582212208c3658dffb81b7dabe783c7a79eb8ca9118280937f9dea42c446bb9880c4141264736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000ea25e2b3e35c67876957ee00a28cd912ff113f54

-----Decoded View---------------
Arg [0] : NFTContractAddress (address): 0xEa25e2b3E35c67876957EE00a28Cd912ff113F54

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ea25e2b3e35c67876957ee00a28cd912ff113f54


Deployed Bytecode Sourcemap

30559:8985:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32482:273;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15675:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17842:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16795:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37525:730;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32190:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18493:492;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16637:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31120:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30653:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19394:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32809:195;;;:::i;:::-;;31806:203;;;:::i;:::-;;34875:745;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33606:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26768:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30902:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30760:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16966:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29667:103;;;:::i;:::-;;32071:65;;;:::i;:::-;;30710:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29016:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15894:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34446:238;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20112:413;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30869:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17306:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35857:458;;;:::i;:::-;;36506:853;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33968:307;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33786:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30838:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33264:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17544:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29925:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32482:273;29247:12;:10;:12::i;:::-;29236:23;;:7;:5;:7::i;:::-;:23;;;29228:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32599:11:::1;;;;;;;;;;;32598:12;32590:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32673:8;32661:9;:20;;;;32704:8;32692:9;:20;;;;32737:10;32723:11;:24;;;;32482:273:::0;;;:::o;15675:100::-;15729:13;15762:5;15755:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15675:100;:::o;17842:169::-;17925:4;17942:39;17951:12;:10;:12::i;:::-;17965:7;17974:6;17942:8;:39::i;:::-;17999:4;17992:11;;17842:169;;;;:::o;16795:108::-;16856:7;16883:12;;16876:19;;16795:108;:::o;37525:730::-;27094:8;:6;:8::i;:::-;27093:9;27085:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;37757:1:::1;37729:25;37743:10;37729:13;:25::i;:::-;:29;37721:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37815:25;37843:21;37853:10;37843:9;:21::i;:::-;37815:49;;37953:9;37948:247;37972:8;:15;37968:1;:19;37948:247;;;38014:21;38023:8;38032:1;38023:11;;;;;;;;:::i;:::-;;;;;;;;38014:8;:21::i;:::-;38009:175;;38056:57;38066:13;;38080:1;38066:16;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;38084:12;;38097:1;38084:15;;;;;;;:::i;:::-;;;;;;;;38101:8;38110:1;38101:11;;;;;;;;:::i;:::-;;;;;;;;38056:9;:57::i;:::-;38132:36;38144:10;38156:8;38165:1;38156:11;;;;;;;;:::i;:::-;;;;;;;;38132;:36::i;:::-;38009:175;37989:3;;;;;:::i;:::-;;;;37948:247;;;;38232:15;38207:10;:22;38218:10;38207:22;;;;;;;;;;;;;;;:40;;;;37710:545;37525:730:::0;;;;:::o;32190:205::-;29247:12;:10;:12::i;:::-;29236:23;;:7;:5;:7::i;:::-;:23;;;29228:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32280:11:::1;;;;;;;;;;;32279:12;32271:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32374:12;32342:11;;:45;;;;;;;;;;;;;;;;;;32190:205:::0;:::o;18493:492::-;18633:4;18650:36;18660:6;18668:9;18679:6;18650:9;:36::i;:::-;18699:24;18726:11;:19;18738:6;18726:19;;;;;;;;;;;;;;;:33;18746:12;:10;:12::i;:::-;18726:33;;;;;;;;;;;;;;;;18699:60;;18798:6;18778:16;:26;;18770:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;18885:57;18894:6;18902:12;:10;:12::i;:::-;18935:6;18916:16;:25;18885:8;:57::i;:::-;18973:4;18966:11;;;18493:492;;;;;:::o;16637:93::-;16695:5;16720:2;16713:9;;16637:93;:::o;31120:36::-;;;;;;;;;;;;;:::o;30653:52::-;30690:15;30653:52;:::o;19394:215::-;19482:4;19499:80;19508:12;:10;:12::i;:::-;19522:7;19568:10;19531:11;:25;19543:12;:10;:12::i;:::-;19531:25;;;;;;;;;;;;;;;:34;19557:7;19531:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;19499:8;:80::i;:::-;19597:4;19590:11;;19394:215;;;;:::o;32809:195::-;29247:12;:10;:12::i;:::-;29236:23;;:7;:5;:7::i;:::-;:23;;;29228:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32897:1:::1;32865:34;;32873:11;;;;;;;;;;;32865:34;;;;32857:43;;;::::0;::::1;;32932:1;32919:14:::0;::::1;:9;;:14;;:32;;;;;32950:1;32937:14:::0;::::1;:9;;:14;;32919:32;:52;;;;;32970:1;32955:16:::0;::::1;:11;;:16;;32919:52;32911:61;;;::::0;::::1;;32985:10;:8;:10::i;:::-;32809:195::o:0;31806:203::-;29247:12;:10;:12::i;:::-;29236:23;;:7;:5;:7::i;:::-;:23;;;29228:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31895:1:::1;31863:34;;31871:11;;;;;;;;;;;31863:34;;;;31855:43;;;::::0;::::1;;31930:1;31917:14:::0;::::1;:9;;:14;;:32;;;;;31948:1;31935:14:::0;::::1;:9;;:14;;31917:32;:52;;;;;31968:1;31953:16:::0;::::1;:11;;:16;;31917:52;31909:61;;;::::0;::::1;;31997:4;31983:11;;:18;;;;;;;;;;;;;;;;;;31806:203::o:0;34875:745::-;34935:7;34956:19;34978:1;34956:23;;34990;35016:15;35026:4;35016:9;:15::i;:::-;34990:41;;35109:9;35104:242;35128:19;35142:4;35128:13;:19::i;:::-;35124:1;:23;35104:242;;;35178:19;35187:6;35194:1;35187:9;;;;;;;;:::i;:::-;;;;;;;;35178:8;:19::i;:::-;35170:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;35312:9;:20;35322:6;35329:1;35322:9;;;;;;;;:::i;:::-;;;;;;;;35312:20;;;;;;;;;;;;35297:11;:36;;;;:::i;:::-;35283:50;;35149:3;;;;;:::i;:::-;;;;35104:242;;;;30745:5;35583:10;:16;35594:4;35583:16;;;;;;;;;;;;;;;;35565:15;:34;;;;:::i;:::-;35554:7;35540:11;:21;;;;:::i;:::-;:60;;;;:::i;:::-;35539:73;;;;:::i;:::-;35532:80;;;;34875:745;;;:::o;33606:120::-;33665:7;33702:10;:16;33713:4;33702:16;;;;;;;;;;;;;;;;33695:23;;33606:120;;;:::o;26768:86::-;26815:4;26839:7;;;;;;;;;;;26832:14;;26768:86;:::o;30902:31::-;;;;;;;;;;;;;:::o;30760:24::-;;;;:::o;16966:127::-;17040:7;17067:9;:18;17077:7;17067:18;;;;;;;;;;;;;;;;17060:25;;16966:127;;;:::o;29667:103::-;29247:12;:10;:12::i;:::-;29236:23;;:7;:5;:7::i;:::-;:23;;;29228:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29732:30:::1;29759:1;29732:18;:30::i;:::-;29667:103::o:0;32071:65::-;29247:12;:10;:12::i;:::-;29236:23;;:7;:5;:7::i;:::-;:23;;;29228:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32119:8:::1;:6;:8::i;:::-;32071:65::o:0;30710:40::-;30745:5;30710:40;:::o;29016:87::-;29062:7;29089:6;;;;;;;;;;;29082:13;;29016:87;:::o;15894:104::-;15950:13;15983:7;15976:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15894:104;:::o;34446:238::-;34502:11;34561:1;34540:9;:18;34550:7;34540:18;;;;;;;;;;;;:22;34536:115;;;34588:4;34579:13;;34536:115;;;34634:5;34625:14;;34536:115;34446:238;;;:::o;20112:413::-;20205:4;20222:24;20249:11;:25;20261:12;:10;:12::i;:::-;20249:25;;;;;;;;;;;;;;;:34;20275:7;20249:34;;;;;;;;;;;;;;;;20222:61;;20322:15;20302:16;:35;;20294:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;20415:67;20424:12;:10;:12::i;:::-;20438:7;20466:15;20447:16;:34;20415:8;:67::i;:::-;20513:4;20506:11;;;20112:413;;;;:::o;30869:26::-;;;;:::o;17306:175::-;17392:4;17409:42;17419:12;:10;:12::i;:::-;17433:9;17444:6;17409:9;:42::i;:::-;17469:4;17462:11;;17306:175;;;;:::o;35857:458::-;27094:8;:6;:8::i;:::-;27093:9;27085:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;30690:15:::1;35923:13;:11;:13::i;:::-;:26;35915:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36090:1;36064:10;:22;36075:10;36064:22;;;;;;;;;;;;;;;;:27;;36056:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;36158:21;36182:28;36199:10;36182:16;:28::i;:::-;36158:52;;36223:30;36227:10;36239:13;36223:3;:30::i;:::-;36291:15;36266:10;:22;36277:10;36266:22;;;;;;;;;;;;;;;:40;;;;35903:412;35857:458::o:0;36506:853::-;27094:8;:6;:8::i;:::-;27093:9;27085:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;36645:4:::1;36634:7;:15;;36626:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;36704:11;;;;;;;;;;;:19;;;36724:7;36704:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36690:42;;:10;:42;;;:73;;;;36758:4;36736:27;;:10;:27;;;36690:73;36682:82;;;::::0;::::1;;36855:4;36844:7;:15;36840:512;;36911:2;36890:9;:18;36900:7;36890:18;;;;;;;;;;;:23;;;;36840:512;;;36935:54;36954:12;;36935:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36968:9;;36979;36935:18;:54::i;:::-;36931:421;;;37040:1;37019:9;:18;37029:7;37019:18;;;;;;;;;;;:22;;;;36931:421;;;37063:54;37082:12;;37063:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37096:9;;37107;37063:18;:54::i;:::-;37059:293;;;37168:1;37147:9;:18;37157:7;37147:18;;;;;;;;;;;:22;;;;37059:293;;;37191:56;37210:12;;37191:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37224:11;;37237:9;37191:18;:56::i;:::-;37187:165;;;37298:1;37277:9;:18;37287:7;37277:18;;;;;;;;;;;:22;;;;37187:165;;;37332:8;::::0;::::1;37187:165;37059:293;36931:421;36840:512;36506:853:::0;;;;:::o;33968:307::-;34022:31;34097:19;34111:4;34097:13;:19::i;:::-;34083:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34066:51;;34135:9;34130:138;34154:19;34168:4;34154:13;:19::i;:::-;34150:1;:23;34130:138;;;34216:11;;;;;;;;;;;:31;;;34248:4;34254:1;34216:40;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34196:14;34211:1;34196:17;;;;;;;;:::i;:::-;;;;;;;:60;;;;;34175:3;;;;;:::i;:::-;;;;34130:138;;;;33968:307;;;:::o;33786:122::-;33844:7;33873:11;;;;;;;;;;;:21;;;33895:4;33873:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33866:34;;33786:122;;;:::o;30838:24::-;;;;:::o;33264:188::-;33327:7;33355:17;33364:7;33355:8;:17::i;:::-;33347:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;33426:9;:18;33436:7;33426:18;;;;;;;;;;;;33419:25;;33264:188;;;:::o;17544:151::-;17633:7;17660:11;:18;17672:5;17660:18;;;;;;;;;;;;;;;:27;17679:7;17660:27;;;;;;;;;;;;;;;;17653:34;;17544:151;;;;:::o;29925:201::-;29247:12;:10;:12::i;:::-;29236:23;;:7;:5;:7::i;:::-;:23;;;29228:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30034:1:::1;30014:22;;:8;:22;;;;30006:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30090:28;30109:8;30090:18;:28::i;:::-;29925:201:::0;:::o;13330:98::-;13383:7;13410:10;13403:17;;13330:98;:::o;23796:380::-;23949:1;23932:19;;:5;:19;;;;23924:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24030:1;24011:21;;:7;:21;;;;24003:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24114:6;24084:11;:18;24096:5;24084:18;;;;;;;;;;;;;;;:27;24103:7;24084:27;;;;;;;;;;;;;;;:36;;;;24152:7;24136:32;;24145:5;24136:32;;;24161:6;24136:32;;;;;;:::i;:::-;;;;;;;;23796:380;;;:::o;38439:570::-;27094:8;:6;:8::i;:::-;27093:9;27085:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;30690:15:::1;38533:13;:11;:13::i;:::-;:26;38525:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;38670:18;38714:4;38703:7;:15;38699:157;;38749:10;38736:23;;38699:157;;;38819:10;38806:23;;38699:157;38866:21;30745:5;38941:10;38923:15;:28;;;;:::i;:::-;38912:7;38891:9;:18;38901:7;38891:18;;;;;;;;;;;;:28;;;;:::i;:::-;:61;;;;:::i;:::-;38890:74;;;;:::i;:::-;38866:98;;38977:24;38981:4;38987:13;38977:3;:24::i;:::-;38514:495;;38439:570:::0;;:::o;21015:733::-;21173:1;21155:20;;:6;:20;;;;21147:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;21257:1;21236:23;;:9;:23;;;;21228:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;21312:47;21333:6;21341:9;21352:6;21312:20;:47::i;:::-;21372:21;21396:9;:17;21406:6;21396:17;;;;;;;;;;;;;;;;21372:41;;21449:6;21432:13;:23;;21424:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21570:6;21554:13;:22;21534:9;:17;21544:6;21534:17;;;;;;;;;;;;;;;:42;;;;21622:6;21598:9;:20;21608:9;21598:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;21663:9;21646:35;;21655:6;21646:35;;;21674:6;21646:35;;;;;;:::i;:::-;;;;;;;;21694:46;21714:6;21722:9;21733:6;21694:19;:46::i;:::-;21136:612;21015:733;;;:::o;27827:120::-;27371:8;:6;:8::i;:::-;27363:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;27896:5:::1;27886:7;;:15;;;;;;;;;;;;;;;;;;27917:22;27926:12;:10;:12::i;:::-;27917:22;;;;;;:::i;:::-;;;;;;;;27827:120::o:0;30286:191::-;30360:16;30379:6;;;;;;;;;;;30360:25;;30405:8;30396:6;;:17;;;;;;;;;;;;;;;;;;30460:8;30429:40;;30450:8;30429:40;;;;;;;;;;;;30349:128;30286:191;:::o;27568:118::-;27094:8;:6;:8::i;:::-;27093:9;27085:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;27638:4:::1;27628:7;;:14;;;;;;;;;;;;;;;;;;27658:20;27665:12;:10;:12::i;:::-;27658:20;;;;;;:::i;:::-;;;;;;;;27568:118::o:0;39073:468::-;27094:8;:6;:8::i;:::-;27093:9;27085:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;30690:15:::1;39172:6;39156:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;39152:340;;39259:19;39265:4;39271:6;39259:5;:19::i;:::-;39152:340;;;39433:13;:11;:13::i;:::-;30690:15;39420:26;;;;:::i;:::-;39411:35;;39461:19;39467:4;39473:6;39461:5;:19::i;:::-;39152:340;39520:4;39509:24;;;39526:6;39509:24;;;;;;:::i;:::-;;;;;;;;39073:468:::0;;:::o;908:190::-;1033:4;1086;1057:25;1070:5;1077:4;1057:12;:25::i;:::-;:33;1050:40;;908:190;;;;;:::o;24776:125::-;;;;:::o;25505:124::-;;;;:::o;22035:399::-;22138:1;22119:21;;:7;:21;;;;22111:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;22189:49;22218:1;22222:7;22231:6;22189:20;:49::i;:::-;22267:6;22251:12;;:22;;;;;;;:::i;:::-;;;;;;;;22306:6;22284:9;:18;22294:7;22284:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;22349:7;22328:37;;22345:1;22328:37;;;22358:6;22328:37;;;;;;:::i;:::-;;;;;;;;22378:48;22406:1;22410:7;22419:6;22378:19;:48::i;:::-;22035:399;;:::o;1460:701::-;1543:7;1563:20;1586:4;1563:27;;1606:9;1601:523;1625:5;:12;1621:1;:16;1601:523;;;1659:20;1682:5;1688:1;1682:8;;;;;;;;:::i;:::-;;;;;;;;1659:31;;1725:12;1709;:28;1705:408;;1879:12;1893;1862:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1852:55;;;;;;1837:70;;1705:408;;;2069:12;2083;2052:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2042:55;;;;;;2027:70;;1705:408;1644:480;1639:3;;;;;:::i;:::-;;;;1601:523;;;;2141:12;2134:19;;;1460:701;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;7:139;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;152:143;;;;:::o;320:595::-;420:8;430:6;480:3;473:4;465:6;461:17;457:27;447:122;;488:79;;:::i;:::-;447:122;601:6;588:20;578:30;;631:18;623:6;620:30;617:117;;;653:79;;:::i;:::-;617:117;767:4;759:6;755:17;743:29;;821:3;813:4;805:6;801:17;791:8;787:32;784:41;781:128;;;828:79;;:::i;:::-;781:128;320:595;;;;;:::o;938:568::-;1011:8;1021:6;1071:3;1064:4;1056:6;1052:17;1048:27;1038:122;;1079:79;;:::i;:::-;1038:122;1192:6;1179:20;1169:30;;1222:18;1214:6;1211:30;1208:117;;;1244:79;;:::i;:::-;1208:117;1358:4;1350:6;1346:17;1334:29;;1412:3;1404:4;1396:6;1392:17;1382:8;1378:32;1375:41;1372:128;;;1419:79;;:::i;:::-;1372:128;938:568;;;;;:::o;1512:139::-;1558:5;1596:6;1583:20;1574:29;;1612:33;1639:5;1612:33;:::i;:::-;1512:139;;;;:::o;1657:::-;1703:5;1741:6;1728:20;1719:29;;1757:33;1784:5;1757:33;:::i;:::-;1657:139;;;;:::o;1802:143::-;1859:5;1890:6;1884:13;1875:22;;1906:33;1933:5;1906:33;:::i;:::-;1802:143;;;;:::o;1951:329::-;2010:6;2059:2;2047:9;2038:7;2034:23;2030:32;2027:119;;;2065:79;;:::i;:::-;2027:119;2185:1;2210:53;2255:7;2246:6;2235:9;2231:22;2210:53;:::i;:::-;2200:63;;2156:117;1951:329;;;;:::o;2286:351::-;2356:6;2405:2;2393:9;2384:7;2380:23;2376:32;2373:119;;;2411:79;;:::i;:::-;2373:119;2531:1;2556:64;2612:7;2603:6;2592:9;2588:22;2556:64;:::i;:::-;2546:74;;2502:128;2286:351;;;;:::o;2643:474::-;2711:6;2719;2768:2;2756:9;2747:7;2743:23;2739:32;2736:119;;;2774:79;;:::i;:::-;2736:119;2894:1;2919:53;2964:7;2955:6;2944:9;2940:22;2919:53;:::i;:::-;2909:63;;2865:117;3021:2;3047:53;3092:7;3083:6;3072:9;3068:22;3047:53;:::i;:::-;3037:63;;2992:118;2643:474;;;;;:::o;3123:619::-;3200:6;3208;3216;3265:2;3253:9;3244:7;3240:23;3236:32;3233:119;;;3271:79;;:::i;:::-;3233:119;3391:1;3416:53;3461:7;3452:6;3441:9;3437:22;3416:53;:::i;:::-;3406:63;;3362:117;3518:2;3544:53;3589:7;3580:6;3569:9;3565:22;3544:53;:::i;:::-;3534:63;;3489:118;3646:2;3672:53;3717:7;3708:6;3697:9;3693:22;3672:53;:::i;:::-;3662:63;;3617:118;3123:619;;;;;:::o;3748:474::-;3816:6;3824;3873:2;3861:9;3852:7;3848:23;3844:32;3841:119;;;3879:79;;:::i;:::-;3841:119;3999:1;4024:53;4069:7;4060:6;4049:9;4045:22;4024:53;:::i;:::-;4014:63;;3970:117;4126:2;4152:53;4197:7;4188:6;4177:9;4173:22;4152:53;:::i;:::-;4142:63;;4097:118;3748:474;;;;;:::o;4228:988::-;4377:6;4385;4393;4401;4450:2;4438:9;4429:7;4425:23;4421:32;4418:119;;;4456:79;;:::i;:::-;4418:119;4604:1;4593:9;4589:17;4576:31;4634:18;4626:6;4623:30;4620:117;;;4656:79;;:::i;:::-;4620:117;4769:107;4868:7;4859:6;4848:9;4844:22;4769:107;:::i;:::-;4751:125;;;;4547:339;4953:2;4942:9;4938:18;4925:32;4984:18;4976:6;4973:30;4970:117;;;5006:79;;:::i;:::-;4970:117;5119:80;5191:7;5182:6;5171:9;5167:22;5119:80;:::i;:::-;5101:98;;;;4896:313;4228:988;;;;;;;:::o;5222:849::-;5326:6;5334;5342;5350;5399:2;5387:9;5378:7;5374:23;5370:32;5367:119;;;5405:79;;:::i;:::-;5367:119;5553:1;5542:9;5538:17;5525:31;5583:18;5575:6;5572:30;5569:117;;;5605:79;;:::i;:::-;5569:117;5718:80;5790:7;5781:6;5770:9;5766:22;5718:80;:::i;:::-;5700:98;;;;5496:312;5847:2;5873:53;5918:7;5909:6;5898:9;5894:22;5873:53;:::i;:::-;5863:63;;5818:118;5975:2;6001:53;6046:7;6037:6;6026:9;6022:22;6001:53;:::i;:::-;5991:63;;5946:118;5222:849;;;;;;;:::o;6077:619::-;6154:6;6162;6170;6219:2;6207:9;6198:7;6194:23;6190:32;6187:119;;;6225:79;;:::i;:::-;6187:119;6345:1;6370:53;6415:7;6406:6;6395:9;6391:22;6370:53;:::i;:::-;6360:63;;6316:117;6472:2;6498:53;6543:7;6534:6;6523:9;6519:22;6498:53;:::i;:::-;6488:63;;6443:118;6600:2;6626:53;6671:7;6662:6;6651:9;6647:22;6626:53;:::i;:::-;6616:63;;6571:118;6077:619;;;;;:::o;6702:329::-;6761:6;6810:2;6798:9;6789:7;6785:23;6781:32;6778:119;;;6816:79;;:::i;:::-;6778:119;6936:1;6961:53;7006:7;6997:6;6986:9;6982:22;6961:53;:::i;:::-;6951:63;;6907:117;6702:329;;;;:::o;7037:351::-;7107:6;7156:2;7144:9;7135:7;7131:23;7127:32;7124:119;;;7162:79;;:::i;:::-;7124:119;7282:1;7307:64;7363:7;7354:6;7343:9;7339:22;7307:64;:::i;:::-;7297:74;;7253:128;7037:351;;;;:::o;7394:179::-;7463:10;7484:46;7526:3;7518:6;7484:46;:::i;:::-;7562:4;7557:3;7553:14;7539:28;;7394:179;;;;:::o;7579:118::-;7666:24;7684:5;7666:24;:::i;:::-;7661:3;7654:37;7579:118;;:::o;7733:732::-;7852:3;7881:54;7929:5;7881:54;:::i;:::-;7951:86;8030:6;8025:3;7951:86;:::i;:::-;7944:93;;8061:56;8111:5;8061:56;:::i;:::-;8140:7;8171:1;8156:284;8181:6;8178:1;8175:13;8156:284;;;8257:6;8251:13;8284:63;8343:3;8328:13;8284:63;:::i;:::-;8277:70;;8370:60;8423:6;8370:60;:::i;:::-;8360:70;;8216:224;8203:1;8200;8196:9;8191:14;;8156:284;;;8160:14;8456:3;8449:10;;7857:608;;;7733:732;;;;:::o;8471:109::-;8552:21;8567:5;8552:21;:::i;:::-;8547:3;8540:34;8471:109;;:::o;8586:118::-;8673:24;8691:5;8673:24;:::i;:::-;8668:3;8661:37;8586:118;;:::o;8710:157::-;8815:45;8835:24;8853:5;8835:24;:::i;:::-;8815:45;:::i;:::-;8810:3;8803:58;8710:157;;:::o;8873:181::-;8985:62;9041:5;8985:62;:::i;:::-;8980:3;8973:75;8873:181;;:::o;9060:364::-;9148:3;9176:39;9209:5;9176:39;:::i;:::-;9231:71;9295:6;9290:3;9231:71;:::i;:::-;9224:78;;9311:52;9356:6;9351:3;9344:4;9337:5;9333:16;9311:52;:::i;:::-;9388:29;9410:6;9388:29;:::i;:::-;9383:3;9379:39;9372:46;;9152:272;9060:364;;;;:::o;9430:366::-;9572:3;9593:67;9657:2;9652:3;9593:67;:::i;:::-;9586:74;;9669:93;9758:3;9669:93;:::i;:::-;9787:2;9782:3;9778:12;9771:19;;9430:366;;;:::o;9802:::-;9944:3;9965:67;10029:2;10024:3;9965:67;:::i;:::-;9958:74;;10041:93;10130:3;10041:93;:::i;:::-;10159:2;10154:3;10150:12;10143:19;;9802:366;;;:::o;10174:::-;10316:3;10337:67;10401:2;10396:3;10337:67;:::i;:::-;10330:74;;10413:93;10502:3;10413:93;:::i;:::-;10531:2;10526:3;10522:12;10515:19;;10174:366;;;:::o;10546:::-;10688:3;10709:67;10773:2;10768:3;10709:67;:::i;:::-;10702:74;;10785:93;10874:3;10785:93;:::i;:::-;10903:2;10898:3;10894:12;10887:19;;10546:366;;;:::o;10918:::-;11060:3;11081:67;11145:2;11140:3;11081:67;:::i;:::-;11074:74;;11157:93;11246:3;11157:93;:::i;:::-;11275:2;11270:3;11266:12;11259:19;;10918:366;;;:::o;11290:::-;11432:3;11453:67;11517:2;11512:3;11453:67;:::i;:::-;11446:74;;11529:93;11618:3;11529:93;:::i;:::-;11647:2;11642:3;11638:12;11631:19;;11290:366;;;:::o;11662:::-;11804:3;11825:67;11889:2;11884:3;11825:67;:::i;:::-;11818:74;;11901:93;11990:3;11901:93;:::i;:::-;12019:2;12014:3;12010:12;12003:19;;11662:366;;;:::o;12034:::-;12176:3;12197:67;12261:2;12256:3;12197:67;:::i;:::-;12190:74;;12273:93;12362:3;12273:93;:::i;:::-;12391:2;12386:3;12382:12;12375:19;;12034:366;;;:::o;12406:::-;12548:3;12569:67;12633:2;12628:3;12569:67;:::i;:::-;12562:74;;12645:93;12734:3;12645:93;:::i;:::-;12763:2;12758:3;12754:12;12747:19;;12406:366;;;:::o;12778:::-;12920:3;12941:67;13005:2;13000:3;12941:67;:::i;:::-;12934:74;;13017:93;13106:3;13017:93;:::i;:::-;13135:2;13130:3;13126:12;13119:19;;12778:366;;;:::o;13150:::-;13292:3;13313:67;13377:2;13372:3;13313:67;:::i;:::-;13306:74;;13389:93;13478:3;13389:93;:::i;:::-;13507:2;13502:3;13498:12;13491:19;;13150:366;;;:::o;13522:::-;13664:3;13685:67;13749:2;13744:3;13685:67;:::i;:::-;13678:74;;13761:93;13850:3;13761:93;:::i;:::-;13879:2;13874:3;13870:12;13863:19;;13522:366;;;:::o;13894:::-;14036:3;14057:67;14121:2;14116:3;14057:67;:::i;:::-;14050:74;;14133:93;14222:3;14133:93;:::i;:::-;14251:2;14246:3;14242:12;14235:19;;13894:366;;;:::o;14266:::-;14408:3;14429:67;14493:2;14488:3;14429:67;:::i;:::-;14422:74;;14505:93;14594:3;14505:93;:::i;:::-;14623:2;14618:3;14614:12;14607:19;;14266:366;;;:::o;14638:::-;14780:3;14801:67;14865:2;14860:3;14801:67;:::i;:::-;14794:74;;14877:93;14966:3;14877:93;:::i;:::-;14995:2;14990:3;14986:12;14979:19;;14638:366;;;:::o;15010:::-;15152:3;15173:67;15237:2;15232:3;15173:67;:::i;:::-;15166:74;;15249:93;15338:3;15249:93;:::i;:::-;15367:2;15362:3;15358:12;15351:19;;15010:366;;;:::o;15382:::-;15524:3;15545:67;15609:2;15604:3;15545:67;:::i;:::-;15538:74;;15621:93;15710:3;15621:93;:::i;:::-;15739:2;15734:3;15730:12;15723:19;;15382:366;;;:::o;15754:::-;15896:3;15917:67;15981:2;15976:3;15917:67;:::i;:::-;15910:74;;15993:93;16082:3;15993:93;:::i;:::-;16111:2;16106:3;16102:12;16095:19;;15754:366;;;:::o;16126:::-;16268:3;16289:67;16353:2;16348:3;16289:67;:::i;:::-;16282:74;;16365:93;16454:3;16365:93;:::i;:::-;16483:2;16478:3;16474:12;16467:19;;16126:366;;;:::o;16498:108::-;16575:24;16593:5;16575:24;:::i;:::-;16570:3;16563:37;16498:108;;:::o;16612:118::-;16699:24;16717:5;16699:24;:::i;:::-;16694:3;16687:37;16612:118;;:::o;16736:112::-;16819:22;16835:5;16819:22;:::i;:::-;16814:3;16807:35;16736:112;;:::o;16854:397::-;16994:3;17009:75;17080:3;17071:6;17009:75;:::i;:::-;17109:2;17104:3;17100:12;17093:19;;17122:75;17193:3;17184:6;17122:75;:::i;:::-;17222:2;17217:3;17213:12;17206:19;;17242:3;17235:10;;16854:397;;;;;:::o;17257:222::-;17350:4;17388:2;17377:9;17373:18;17365:26;;17401:71;17469:1;17458:9;17454:17;17445:6;17401:71;:::i;:::-;17257:222;;;;:::o;17485:332::-;17606:4;17644:2;17633:9;17629:18;17621:26;;17657:71;17725:1;17714:9;17710:17;17701:6;17657:71;:::i;:::-;17738:72;17806:2;17795:9;17791:18;17782:6;17738:72;:::i;:::-;17485:332;;;;;:::o;17823:373::-;17966:4;18004:2;17993:9;17989:18;17981:26;;18053:9;18047:4;18043:20;18039:1;18028:9;18024:17;18017:47;18081:108;18184:4;18175:6;18081:108;:::i;:::-;18073:116;;17823:373;;;;:::o;18202:210::-;18289:4;18327:2;18316:9;18312:18;18304:26;;18340:65;18402:1;18391:9;18387:17;18378:6;18340:65;:::i;:::-;18202:210;;;;:::o;18418:222::-;18511:4;18549:2;18538:9;18534:18;18526:26;;18562:71;18630:1;18619:9;18615:17;18606:6;18562:71;:::i;:::-;18418:222;;;;:::o;18646:272::-;18764:4;18802:2;18791:9;18787:18;18779:26;;18815:96;18908:1;18897:9;18893:17;18884:6;18815:96;:::i;:::-;18646:272;;;;:::o;18924:313::-;19037:4;19075:2;19064:9;19060:18;19052:26;;19124:9;19118:4;19114:20;19110:1;19099:9;19095:17;19088:47;19152:78;19225:4;19216:6;19152:78;:::i;:::-;19144:86;;18924:313;;;;:::o;19243:419::-;19409:4;19447:2;19436:9;19432:18;19424:26;;19496:9;19490:4;19486:20;19482:1;19471:9;19467:17;19460:47;19524:131;19650:4;19524:131;:::i;:::-;19516:139;;19243:419;;;:::o;19668:::-;19834:4;19872:2;19861:9;19857:18;19849:26;;19921:9;19915:4;19911:20;19907:1;19896:9;19892:17;19885:47;19949:131;20075:4;19949:131;:::i;:::-;19941:139;;19668:419;;;:::o;20093:::-;20259:4;20297:2;20286:9;20282:18;20274:26;;20346:9;20340:4;20336:20;20332:1;20321:9;20317:17;20310:47;20374:131;20500:4;20374:131;:::i;:::-;20366:139;;20093:419;;;:::o;20518:::-;20684:4;20722:2;20711:9;20707:18;20699:26;;20771:9;20765:4;20761:20;20757:1;20746:9;20742:17;20735:47;20799:131;20925:4;20799:131;:::i;:::-;20791:139;;20518:419;;;:::o;20943:::-;21109:4;21147:2;21136:9;21132:18;21124:26;;21196:9;21190:4;21186:20;21182:1;21171:9;21167:17;21160:47;21224:131;21350:4;21224:131;:::i;:::-;21216:139;;20943:419;;;:::o;21368:::-;21534:4;21572:2;21561:9;21557:18;21549:26;;21621:9;21615:4;21611:20;21607:1;21596:9;21592:17;21585:47;21649:131;21775:4;21649:131;:::i;:::-;21641:139;;21368:419;;;:::o;21793:::-;21959:4;21997:2;21986:9;21982:18;21974:26;;22046:9;22040:4;22036:20;22032:1;22021:9;22017:17;22010:47;22074:131;22200:4;22074:131;:::i;:::-;22066:139;;21793:419;;;:::o;22218:::-;22384:4;22422:2;22411:9;22407:18;22399:26;;22471:9;22465:4;22461:20;22457:1;22446:9;22442:17;22435:47;22499:131;22625:4;22499:131;:::i;:::-;22491:139;;22218:419;;;:::o;22643:::-;22809:4;22847:2;22836:9;22832:18;22824:26;;22896:9;22890:4;22886:20;22882:1;22871:9;22867:17;22860:47;22924:131;23050:4;22924:131;:::i;:::-;22916:139;;22643:419;;;:::o;23068:::-;23234:4;23272:2;23261:9;23257:18;23249:26;;23321:9;23315:4;23311:20;23307:1;23296:9;23292:17;23285:47;23349:131;23475:4;23349:131;:::i;:::-;23341:139;;23068:419;;;:::o;23493:::-;23659:4;23697:2;23686:9;23682:18;23674:26;;23746:9;23740:4;23736:20;23732:1;23721:9;23717:17;23710:47;23774:131;23900:4;23774:131;:::i;:::-;23766:139;;23493:419;;;:::o;23918:::-;24084:4;24122:2;24111:9;24107:18;24099:26;;24171:9;24165:4;24161:20;24157:1;24146:9;24142:17;24135:47;24199:131;24325:4;24199:131;:::i;:::-;24191:139;;23918:419;;;:::o;24343:::-;24509:4;24547:2;24536:9;24532:18;24524:26;;24596:9;24590:4;24586:20;24582:1;24571:9;24567:17;24560:47;24624:131;24750:4;24624:131;:::i;:::-;24616:139;;24343:419;;;:::o;24768:::-;24934:4;24972:2;24961:9;24957:18;24949:26;;25021:9;25015:4;25011:20;25007:1;24996:9;24992:17;24985:47;25049:131;25175:4;25049:131;:::i;:::-;25041:139;;24768:419;;;:::o;25193:::-;25359:4;25397:2;25386:9;25382:18;25374:26;;25446:9;25440:4;25436:20;25432:1;25421:9;25417:17;25410:47;25474:131;25600:4;25474:131;:::i;:::-;25466:139;;25193:419;;;:::o;25618:::-;25784:4;25822:2;25811:9;25807:18;25799:26;;25871:9;25865:4;25861:20;25857:1;25846:9;25842:17;25835:47;25899:131;26025:4;25899:131;:::i;:::-;25891:139;;25618:419;;;:::o;26043:::-;26209:4;26247:2;26236:9;26232:18;26224:26;;26296:9;26290:4;26286:20;26282:1;26271:9;26267:17;26260:47;26324:131;26450:4;26324:131;:::i;:::-;26316:139;;26043:419;;;:::o;26468:::-;26634:4;26672:2;26661:9;26657:18;26649:26;;26721:9;26715:4;26711:20;26707:1;26696:9;26692:17;26685:47;26749:131;26875:4;26749:131;:::i;:::-;26741:139;;26468:419;;;:::o;26893:::-;27059:4;27097:2;27086:9;27082:18;27074:26;;27146:9;27140:4;27136:20;27132:1;27121:9;27117:17;27110:47;27174:131;27300:4;27174:131;:::i;:::-;27166:139;;26893:419;;;:::o;27318:222::-;27411:4;27449:2;27438:9;27434:18;27426:26;;27462:71;27530:1;27519:9;27515:17;27506:6;27462:71;:::i;:::-;27318:222;;;;:::o;27546:214::-;27635:4;27673:2;27662:9;27658:18;27650:26;;27686:67;27750:1;27739:9;27735:17;27726:6;27686:67;:::i;:::-;27546:214;;;;:::o;27766:740::-;27859:4;27865:6;27921:11;27908:25;28021:1;28015:4;28011:12;28000:8;27984:14;27980:29;27976:48;27956:18;27952:73;27942:168;;28029:79;;:::i;:::-;27942:168;28141:18;28131:8;28127:33;28119:41;;28193:4;28180:18;28170:28;;28221:18;28213:6;28210:30;28207:117;;;28243:79;;:::i;:::-;28207:117;28351:2;28345:4;28341:13;28333:21;;28408:4;28400:6;28396:17;28380:14;28376:38;28370:4;28366:49;28363:136;;;28418:79;;:::i;:::-;28363:136;27872:634;27766:740;;;;;:::o;28593:132::-;28660:4;28683:3;28675:11;;28713:4;28708:3;28704:14;28696:22;;28593:132;;;:::o;28731:114::-;28798:6;28832:5;28826:12;28816:22;;28731:114;;;:::o;28851:99::-;28903:6;28937:5;28931:12;28921:22;;28851:99;;;:::o;28956:113::-;29026:4;29058;29053:3;29049:14;29041:22;;28956:113;;;:::o;29075:184::-;29174:11;29208:6;29203:3;29196:19;29248:4;29243:3;29239:14;29224:29;;29075:184;;;;:::o;29265:169::-;29349:11;29383:6;29378:3;29371:19;29423:4;29418:3;29414:14;29399:29;;29265:169;;;;:::o;29440:305::-;29480:3;29499:20;29517:1;29499:20;:::i;:::-;29494:25;;29533:20;29551:1;29533:20;:::i;:::-;29528:25;;29687:1;29619:66;29615:74;29612:1;29609:81;29606:107;;;29693:18;;:::i;:::-;29606:107;29737:1;29734;29730:9;29723:16;;29440:305;;;;:::o;29751:185::-;29791:1;29808:20;29826:1;29808:20;:::i;:::-;29803:25;;29842:20;29860:1;29842:20;:::i;:::-;29837:25;;29881:1;29871:35;;29886:18;;:::i;:::-;29871:35;29928:1;29925;29921:9;29916:14;;29751:185;;;;:::o;29942:348::-;29982:7;30005:20;30023:1;30005:20;:::i;:::-;30000:25;;30039:20;30057:1;30039:20;:::i;:::-;30034:25;;30227:1;30159:66;30155:74;30152:1;30149:81;30144:1;30137:9;30130:17;30126:105;30123:131;;;30234:18;;:::i;:::-;30123:131;30282:1;30279;30275:9;30264:20;;29942:348;;;;:::o;30296:191::-;30336:4;30356:20;30374:1;30356:20;:::i;:::-;30351:25;;30390:20;30408:1;30390:20;:::i;:::-;30385:25;;30429:1;30426;30423:8;30420:34;;;30434:18;;:::i;:::-;30420:34;30479:1;30476;30472:9;30464:17;;30296:191;;;;:::o;30493:96::-;30530:7;30559:24;30577:5;30559:24;:::i;:::-;30548:35;;30493:96;;;:::o;30595:90::-;30629:7;30672:5;30665:13;30658:21;30647:32;;30595:90;;;:::o;30691:77::-;30728:7;30757:5;30746:16;;30691:77;;;:::o;30774:126::-;30811:7;30851:42;30844:5;30840:54;30829:65;;30774:126;;;:::o;30906:77::-;30943:7;30972:5;30961:16;;30906:77;;;:::o;30989:86::-;31024:7;31064:4;31057:5;31053:16;31042:27;;30989:86;;;:::o;31081:151::-;31156:9;31189:37;31220:5;31189:37;:::i;:::-;31176:50;;31081:151;;;:::o;31238:126::-;31288:9;31321:37;31352:5;31321:37;:::i;:::-;31308:50;;31238:126;;;:::o;31370:113::-;31420:9;31453:24;31471:5;31453:24;:::i;:::-;31440:37;;31370:113;;;:::o;31489:307::-;31557:1;31567:113;31581:6;31578:1;31575:13;31567:113;;;31666:1;31661:3;31657:11;31651:18;31647:1;31642:3;31638:11;31631:39;31603:2;31600:1;31596:10;31591:15;;31567:113;;;31698:6;31695:1;31692:13;31689:101;;;31778:1;31769:6;31764:3;31760:16;31753:27;31689:101;31538:258;31489:307;;;:::o;31802:320::-;31846:6;31883:1;31877:4;31873:12;31863:22;;31930:1;31924:4;31920:12;31951:18;31941:81;;32007:4;31999:6;31995:17;31985:27;;31941:81;32069:2;32061:6;32058:14;32038:18;32035:38;32032:84;;;32088:18;;:::i;:::-;32032:84;31853:269;31802:320;;;:::o;32128:233::-;32167:3;32190:24;32208:5;32190:24;:::i;:::-;32181:33;;32236:66;32229:5;32226:77;32223:103;;;32306:18;;:::i;:::-;32223:103;32353:1;32346:5;32342:13;32335:20;;32128:233;;;:::o;32367:79::-;32406:7;32435:5;32424:16;;32367:79;;;:::o;32452:180::-;32500:77;32497:1;32490:88;32597:4;32594:1;32587:15;32621:4;32618:1;32611:15;32638:180;32686:77;32683:1;32676:88;32783:4;32780:1;32773:15;32807:4;32804:1;32797:15;32824:180;32872:77;32869:1;32862:88;32969:4;32966:1;32959:15;32993:4;32990:1;32983:15;33010:180;33058:77;33055:1;33048:88;33155:4;33152:1;33145:15;33179:4;33176:1;33169:15;33196:180;33244:77;33241:1;33234:88;33341:4;33338:1;33331:15;33365:4;33362:1;33355:15;33382:117;33491:1;33488;33481:12;33505:117;33614:1;33611;33604:12;33628:117;33737:1;33734;33727:12;33751:117;33860:1;33857;33850:12;33874:117;33983:1;33980;33973:12;33997:117;34106:1;34103;34096:12;34120:117;34229:1;34226;34219:12;34243:117;34352:1;34349;34342:12;34366:102;34407:6;34458:2;34454:7;34449:2;34442:5;34438:14;34434:28;34424:38;;34366:102;;;:::o;34474:222::-;34614:34;34610:1;34602:6;34598:14;34591:58;34683:5;34678:2;34670:6;34666:15;34659:30;34474:222;:::o;34702:170::-;34842:22;34838:1;34830:6;34826:14;34819:46;34702:170;:::o;34878:225::-;35018:34;35014:1;35006:6;35002:14;34995:58;35087:8;35082:2;35074:6;35070:15;35063:33;34878:225;:::o;35109:221::-;35249:34;35245:1;35237:6;35233:14;35226:58;35318:4;35313:2;35305:6;35301:15;35294:29;35109:221;:::o;35336:234::-;35476:34;35472:1;35464:6;35460:14;35453:58;35545:17;35540:2;35532:6;35528:15;35521:42;35336:234;:::o;35576:225::-;35716:34;35712:1;35704:6;35700:14;35693:58;35785:8;35780:2;35772:6;35768:15;35761:33;35576:225;:::o;35807:167::-;35947:19;35943:1;35935:6;35931:14;35924:43;35807:167;:::o;35980:166::-;36120:18;36116:1;36108:6;36104:14;36097:42;35980:166;:::o;36152:226::-;36292:34;36288:1;36280:6;36276:14;36269:58;36361:9;36356:2;36348:6;36344:15;36337:34;36152:226;:::o;36384:173::-;36524:25;36520:1;36512:6;36508:14;36501:49;36384:173;:::o;36563:227::-;36703:34;36699:1;36691:6;36687:14;36680:58;36772:10;36767:2;36759:6;36755:15;36748:35;36563:227;:::o;36796:179::-;36936:31;36932:1;36924:6;36920:14;36913:55;36796:179;:::o;36981:182::-;37121:34;37117:1;37109:6;37105:14;37098:58;36981:182;:::o;37169:251::-;37309:34;37305:1;37297:6;37293:14;37286:58;37378:34;37373:2;37365:6;37361:15;37354:59;37169:251;:::o;37426:224::-;37566:34;37562:1;37554:6;37550:14;37543:58;37635:7;37630:2;37622:6;37618:15;37611:32;37426:224;:::o;37656:223::-;37796:34;37792:1;37784:6;37780:14;37773:58;37865:6;37860:2;37852:6;37848:15;37841:31;37656:223;:::o;37885:220::-;38025:34;38021:1;38013:6;38009:14;38002:58;38094:3;38089:2;38081:6;38077:15;38070:28;37885:220;:::o;38111:224::-;38251:34;38247:1;38239:6;38235:14;38228:58;38320:7;38315:2;38307:6;38303:15;38296:32;38111:224;:::o;38341:181::-;38481:33;38477:1;38469:6;38465:14;38458:57;38341:181;:::o;38528:122::-;38601:24;38619:5;38601:24;:::i;:::-;38594:5;38591:35;38581:63;;38640:1;38637;38630:12;38581:63;38528:122;:::o;38656:::-;38729:24;38747:5;38729:24;:::i;:::-;38722:5;38719:35;38709:63;;38768:1;38765;38758:12;38709:63;38656:122;:::o;38784:::-;38857:24;38875:5;38857:24;:::i;:::-;38850:5;38847:35;38837:63;;38896:1;38893;38886:12;38837:63;38784:122;:::o

Swarm Source

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