ETH Price: $3,316.52 (+0.27%)
Gas: 20 Gwei

Token

Optix (OPTIX)
 

Overview

Max Total Supply

1,026,558.00000000000000285 OPTIX

Holders

33

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
hongkonggoosefund.eth
Balance
10,000 OPTIX

Value
$0.00
0xf76b5fdc6113afaea736c681d86211b823282a81
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:
Optix

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-06-06
*/

// 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/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: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

// 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/token/ERC20/ERC20.sol


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

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

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

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

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

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

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `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:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

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

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

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

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

    /**
     * @dev 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/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// 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 (last updated v4.6.0) (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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/Optix.sol


pragma solidity ^0.8.4;






/*************************************************
* OPTIX by The Blinkless: The Official Currency of New Cornea
* "Soft" stake your favorite NFTs
* code by @digitalkemical
*************************************************/

contract Optix is ERC20, ERC20Burnable, Ownable {
    //define a stake structure
    struct Stake{
        address contractAddress;
        address ownerAddress;
        uint startTime;
        uint tokenId;
        uint hourlyReward;
        uint fee;
    }

    //define a collection structure
    struct Collection{
        address contractAddress;
        uint hourlyReward;
        string name;
        uint fee;
    }

    //define variables
    mapping( address => mapping(uint => Stake ) ) public openStakes; //mapping of all open stakes by collection address
    mapping( address => mapping( address => uint[] ) ) public myActiveCollections; //mapping of wallet address to all active collections
    Collection[] public collections; //array of NFT collections that can be staked
    address payoutWallet;

    //run on deploy
    constructor() ERC20("Optix", "OPTIX") {
        //mint initial tokens to contract owner
        _mint(msg.sender, toWei(1000000));
    }

    /**
    * Convert value to Wei equivalent
    */
    function toWei(uint256 _amount) public view returns(uint256 _a) {
        return _amount * 10 ** decimals();
    }

    /**
    * Owner can mint more tokens
    */
    function mint(address to, uint256 amount) public onlyOwner {
        _mint(to, amount);
    }

    /**
    * Update the payout wallet address
    */
    function updatePayoutWallet(address _payoutWallet) public onlyOwner{
        payoutWallet = _payoutWallet;
    }

    /**
    * Add a collection to the staking options
    */
    function addCollection(string memory _name, address _contractAddress,uint _hourlyReward, uint _fee) public onlyOwner{
        collections.push(
            Collection(
                _contractAddress,
                _hourlyReward, 
                _name, 
                _fee 
                )
        );
    }

    /**
    * Remove a collection from the staking options
    */
    function removeCollection(address _contractAddress) public onlyOwner{
        uint i = 0;
        while(i < collections.length){
            if(collections[i].contractAddress == _contractAddress){
                collections[i] = collections[collections.length-1];
                collections.pop();
            }
            i++;
        }
    }

    /**
    * Get all available collections
    */
    function getCollections() public view returns(Collection[] memory _collections){
        return collections;
    }

    /**
    * Get a collections
    */
    function getCollection(address _contractAddress) public view returns(Collection memory _collections){
        uint i = 0;
        while(i < collections.length){
            if(collections[i].contractAddress == _contractAddress){
                return collections[i];
            }
            i++;
        }
    }

    /**
    * Open a new soft stake (tokens are never locked)
    */
    function openStake(address _contractAddress, uint _tokenId) public payable {
        //ensure sender is owner of token and collection is approved
        require(collectionIsApproved(_contractAddress),"This collection has not been approved.");
        require(IERC721(_contractAddress).ownerOf(_tokenId) == msg.sender,"Could not verify ownership!");

        //if trying to open a stake previously owned, update the stake owner
        if(openStakes[_contractAddress][_tokenId].ownerAddress != msg.sender){
            updateOwnership( _contractAddress, _tokenId );
        }
        //make sure stake doesn't already exist
        if(!checkForStake(_contractAddress,_tokenId)){
        
            //charge a withdrawal fee for 3rd party collections - Blinkless NFTs will be zero
            if(openStakes[_contractAddress][_tokenId].fee > 0){
                require(msg.value >= openStakes[_contractAddress][_tokenId].fee, "Insufficient funds to open 3rd-party stake.");
            }

            Collection memory stakeCollection = getCollection(_contractAddress);

            //create a new stake
            openStakes[_contractAddress][_tokenId]=
                Stake(
                    _contractAddress,
                    msg.sender,
                    block.timestamp,
                    _tokenId,
                    stakeCollection.hourlyReward,
                    stakeCollection.fee
                )
            ;
                
            //add collection to active list
            addToActiveList(_contractAddress, _tokenId);
        }
        
    }

    /**
    * Add an active collection to a wallet
    */
    function addToActiveList(address _contractAddress, uint _tokenId) public {
        uint i = 0;
        bool exists = false;
        while(i < myActiveCollections[msg.sender][_contractAddress].length){
            if(myActiveCollections[msg.sender][_contractAddress][i] == _tokenId){
                exists = true;
            }
            i++;
        }
        //if it doesnt already exist, add it
        if(!exists){
            myActiveCollections[msg.sender][_contractAddress].push(_tokenId);
        }
    }

    /**
    * Get the active list for the wallet by collection contract address
    */
    function getActiveList(address _contractAddress) external view returns(uint[] memory _activeList){
        //get list of active collections for sender
        return myActiveCollections[msg.sender][_contractAddress];
        
    }

    /**
    * Verify that a collection being staked has been approved
    */
    function collectionIsApproved(address _contractAddress) public view returns(bool _approved){
        uint i = 0;
        while(i < collections.length){
            if(collections[i].contractAddress == _contractAddress){
                return true;
            }
            i++;
        }

        return false;
    }

    /**
    * Check if a stake exists already
    */
    function checkForStake(address _contractAddress, uint _tokenId) public view returns(bool _exists){
       
            
            if(openStakes[_contractAddress][_tokenId].startTime > 0){
                return true;
            }

        return false;
    }

    /**
    * Get a stake
    */
    function getStake(address _contractAddress, uint _tokenId) public view returns(Stake memory _exists){
        return openStakes[_contractAddress][_tokenId];
    }

    /**
    * Calculate stake reward for a token
    */
    function calculateStakeReward(address _contractAddress, uint _tokenId) public view returns(uint _totalReward){
        //get the stake
        Stake memory closingStake = getStake( _contractAddress, _tokenId );
        //calc hours in between start and now
        uint hoursDiff = (block.timestamp - closingStake.startTime) / 60 / 60;
        //calc total reward
        uint totalReward = hoursDiff * closingStake.hourlyReward;

        return totalReward;
    }

    /**
    * Close a stake and claim reward
    */
    function closeStake(address _contractAddress, uint _tokenId) public payable returns(uint _totalReward){
        //ensure sender is owner of token and stake exists
        require(checkForStake(_contractAddress,_tokenId),"Stake does not exist!");
        require(IERC721(_contractAddress).ownerOf(_tokenId) == msg.sender,"Could not verify ownership!");
        
       
        //charge a withdrawal fee for 3rd party collections - Blinkless NFTs will be zero
        if(openStakes[_contractAddress][_tokenId].fee > 0){
            require(msg.value >= openStakes[_contractAddress][_tokenId].fee, "Insufficient funds for withdrawal");
        }

        //calculate end of stake reward
        uint totalReward = calculateStakeReward(_contractAddress, _tokenId);

        //stake has been identified, remove stake
        delete(openStakes[_contractAddress][_tokenId]);

        //remove from active list
        uint i = 0;
        while(i < myActiveCollections[msg.sender][_contractAddress].length){
            if(myActiveCollections[msg.sender][_contractAddress][i] == _tokenId){
                myActiveCollections[msg.sender][_contractAddress][i] = myActiveCollections[msg.sender][_contractAddress][myActiveCollections[msg.sender][_contractAddress].length-1];
                myActiveCollections[msg.sender][_contractAddress].pop();
            }
            i++;
        }

        //award tokens
        _mint(msg.sender, totalReward);

        return totalReward;
      

    }

    /**
    * Update the ownership of a stake to match the NFT owner
    */
    function updateOwnership(address _contractAddress, uint _tokenId) public{
        //get the NFT owner
        address tokenOwner = IERC721(_contractAddress).ownerOf(_tokenId);
        if(openStakes[_contractAddress][_tokenId].ownerAddress != address(0) &&
            openStakes[_contractAddress][_tokenId].ownerAddress != tokenOwner
        ){
            //stake exists, update owner
            uint i = 0;
            while(i < myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress].length){
                if(myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress][i] == _tokenId){
                    //delete active collection
                    myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress][i] = myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress][myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress].length-1];
                    myActiveCollections[openStakes[_contractAddress][_tokenId].ownerAddress][_contractAddress].pop();
                }
                i++;
            }
            //update stake ownership
            myActiveCollections[tokenOwner][_contractAddress].push(_tokenId);
            openStakes[_contractAddress][_tokenId].ownerAddress = tokenOwner;
        }
        
    }

    /**
    * Passive Viral Minting transfer hook
    */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual override {
        super._afterTokenTransfer(from, to, amount);

        if (from != address(0) && to != block.coinbase && block.coinbase != address(0)) {
            
            //check balances - only existing holders transferring to a new holder get PVM
            if(balanceOf(to) == amount){
                
                //Passive Viral Minting (PVM)
                uint256 rewardAmount = amount * 150 / 100;
                
                //cap reward amount
                if(rewardAmount > 150){
                    rewardAmount = 150;
                }
                //issue reward
                _mint(from,rewardAmount);
            }
        }

    }

    /*
    * In case someone accidentally sends their NFT to the contract, we can send it back 
    * and save everyone some headache
    */
    function ejectNFT(address _contractAddress, uint _tokenId, address _to) public {
        //send ERC721 token to _to address
        IERC721(_contractAddress).transferFrom( address(this), _to, _tokenId);
    }

    /*
    * Withdraw by owner
    */
    function withdraw() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(payoutWallet).balance}("");
        require(success, "Transfer failed.");
    }


    /*
    * These are here to receive ETH sent to the contract address
    */
    receive() external payable {}

    fallback() external payable {}

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_hourlyReward","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"addCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"addToActiveList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"calculateStakeReward","outputs":[{"internalType":"uint256","name":"_totalReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"checkForStake","outputs":[{"internalType":"bool","name":"_exists","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"closeStake","outputs":[{"internalType":"uint256","name":"_totalReward","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"collectionIsApproved","outputs":[{"internalType":"bool","name":"_approved","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collections","outputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"hourlyReward","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"ejectNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"getActiveList","outputs":[{"internalType":"uint256[]","name":"_activeList","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"getCollection","outputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"hourlyReward","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"fee","type":"uint256"}],"internalType":"struct Optix.Collection","name":"_collections","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCollections","outputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"hourlyReward","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"fee","type":"uint256"}],"internalType":"struct Optix.Collection[]","name":"_collections","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getStake","outputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"hourlyReward","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"internalType":"struct Optix.Stake","name":"_exists","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"myActiveCollections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"openStake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"openStakes","outputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"hourlyReward","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"removeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"toWei","outputs":[{"internalType":"uint256","name":"_a","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"updateOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_payoutWallet","type":"address"}],"name":"updatePayoutWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040518060400160405280600581526020017f4f707469780000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4f50544958000000000000000000000000000000000000000000000000000000815250816003908051906020019062000096929190620004f8565b508060049080519060200190620000af929190620004f8565b505050620000d2620000c6620000fd60201b60201c565b6200010560201b60201c565b620000f733620000eb620f4240620001cb60201b60201c565b620001ff60201b60201c565b620009ce565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000620001dd6200037860201b60201c565b600a620001eb919062000720565b82620001f891906200085d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000272576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026990620005e0565b60405180910390fd5b62000286600083836200038160201b60201c565b80600260008282546200029a919062000630565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620002f1919062000630565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000358919062000602565b60405180910390a362000374600083836200038660201b60201c565b5050565b60006012905090565b505050565b6200039e838383620004ab60201b6200348d1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156200040857504173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015620004425750600073ffffffffffffffffffffffffffffffffffffffff164173ffffffffffffffffffffffffffffffffffffffff1614155b15620004a657806200045a83620004b060201b60201c565b1415620004a557600060646096836200047491906200085d565b6200048091906200068d565b905060968111156200049157609690505b620004a38482620001ff60201b60201c565b505b5b505050565b505050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b8280546200050690620008d5565b90600052602060002090601f0160209004810192826200052a576000855562000576565b82601f106200054557805160ff191683800117855562000576565b8280016001018555821562000576579182015b828111156200057557825182559160200191906001019062000558565b5b50905062000585919062000589565b5090565b5b80821115620005a45760008160009055506001016200058a565b5090565b6000620005b7601f836200061f565b9150620005c482620009a5565b602082019050919050565b620005da81620008be565b82525050565b60006020820190508181036000830152620005fb81620005a8565b9050919050565b6000602082019050620006196000830184620005cf565b92915050565b600082825260208201905092915050565b60006200063d82620008be565b91506200064a83620008be565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200068257620006816200090b565b5b828201905092915050565b60006200069a82620008be565b9150620006a783620008be565b925082620006ba57620006b96200093a565b5b828204905092915050565b6000808291508390505b60018511156200071757808604811115620006ef57620006ee6200090b565b5b6001851615620006ff5780820291505b80810290506200070f8562000998565b9450620006cf565b94509492505050565b60006200072d82620008be565b91506200073a83620008c8565b9250620007697fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000771565b905092915050565b60008262000783576001905062000856565b8162000793576000905062000856565b8160018114620007ac5760028114620007b757620007ed565b600191505062000856565b60ff841115620007cc57620007cb6200090b565b5b8360020a915084821115620007e657620007e56200090b565b5b5062000856565b5060208310610133831016604e8410600b8410161715620008275782820a9050838111156200082157620008206200090b565b5b62000856565b620008368484846001620006c5565b9250905081840481111562000850576200084f6200090b565b5b81810290505b9392505050565b60006200086a82620008be565b91506200087783620008be565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620008b357620008b26200090b565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b60006002820490506001821680620008ee57607f821691505b6020821081141562000905576200090462000969565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61587580620009de6000396000f3fe60806040526004361061021e5760003560e01c806360391c9211610123578063a9059cbb116100ab578063dd62ed3e1161006f578063dd62ed3e1461082d578063e40de8871461086a578063f2fde38b146108a7578063fdbda0ec146108d0578063ff26bbac1461091057610225565b8063a9059cbb1461071d578063aef786311461075a578063c5ce113814610797578063cfd47663146107c0578063d11906b7146107fd57610225565b8063715018a6116100f2578063715018a61461064a57806379cc6790146106615780638da5cb5b1461068a57806395d89b41146106b5578063a457c2d7146106e057610225565b806360391c921461056a578063669dafe8146105a757806370a08231146105e4578063712c70ba1461062157610225565b806339509351116101a657806343851ffc1161017557806343851ffc1461048757806346e63586146104b05780634ab2e523146104db5780635028d05a146105185780635c3d25ca1461054157610225565b806339509351146103e15780633ccfd60b1461041e57806340c10f191461043557806342966c681461045e57610225565b8063175d2024116101ed578063175d2024146102f557806318160ddd1461033257806323b872dd1461035d578063313ce5671461039a578063341f7656146103c557610225565b806306fdde0314610227578063095ea7b3146102525780630da4540f1461028f5780631084d469146102cc57610225565b3661022557005b005b34801561023357600080fd5b5061023c610952565b6040516102499190614a7a565b60405180910390f35b34801561025e57600080fd5b506102796004803603810190610274919061421f565b6109e4565b6040516102869190614a5f565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190614132565b610a07565b6040516102c39190614a5f565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee919061421f565b610abd565b005b34801561030157600080fd5b5061031c6004803603810190610317919061421f565b610caf565b6040516103299190614a5f565b60405180910390f35b34801561033e57600080fd5b50610347610d20565b6040516103549190614d19565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f91906141cc565b610d2a565b6040516103919190614a5f565b60405180910390f35b3480156103a657600080fd5b506103af610d59565b6040516103bc9190614d34565b60405180910390f35b6103df60048036038101906103da919061421f565b610d62565b005b3480156103ed57600080fd5b506104086004803603810190610403919061421f565b6111d9565b6040516104159190614a5f565b60405180910390f35b34801561042a57600080fd5b50610433611210565b005b34801561044157600080fd5b5061045c6004803603810190610457919061421f565b611374565b005b34801561046a57600080fd5b5061048560048036038101906104809190614335565b6113fe565b005b34801561049357600080fd5b506104ae60048036038101906104a991906142b2565b611412565b005b3480156104bc57600080fd5b506104c5611570565b6040516104d29190614a1b565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190614132565b6116cb565b60405161050f9190614a3d565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190614132565b61179f565b005b34801561054d57600080fd5b5061056860048036038101906105639190614132565b611a21565b005b34801561057657600080fd5b50610591600480360381019061058c919061421f565b611ae1565b60405161059e9190614d19565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190614335565b611b3b565b6040516105db9190614d19565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190614132565b611b63565b6040516106189190614d19565b60405180910390f35b34801561062d57600080fd5b506106486004803603810190610643919061421f565b611bab565b005b34801561065657600080fd5b5061065f61251a565b005b34801561066d57600080fd5b506106886004803603810190610683919061421f565b6125a2565b005b34801561069657600080fd5b5061069f6125c2565b6040516106ac919061491c565b60405180910390f35b3480156106c157600080fd5b506106ca6125ec565b6040516106d79190614a7a565b60405180910390f35b3480156106ec57600080fd5b506107076004803603810190610702919061421f565b61267e565b6040516107149190614a5f565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f919061421f565b6126f5565b6040516107519190614a5f565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c91906141cc565b612718565b60405161078e9190614d19565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b9919061425f565b612756565b005b3480156107cc57600080fd5b506107e760048036038101906107e2919061421f565b6127ca565b6040516107f49190614cfe565b60405180910390f35b6108176004803603810190610812919061421f565b612909565b6040516108249190614d19565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f919061418c565b612fc1565b6040516108619190614d19565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190614132565b613048565b60405161089e9190614cdc565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190614132565b613224565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190614335565b61331c565b60405161090794939291906149cf565b60405180910390f35b34801561091c57600080fd5b506109376004803603810190610932919061421f565b613404565b6040516109499695949392919061496e565b60405180910390f35b6060600380546109619061516c565b80601f016020809104026020016040519081016040528092919081815260200182805461098d9061516c565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b5050505050905090565b6000806109ef613492565b90506109fc81858561349a565b600191505092915050565b600080600090505b600880549050811015610ab2578273ffffffffffffffffffffffffffffffffffffffff1660088281548110610a4757610a466152d4565b5b906000526020600020906004020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a9f576001915050610ab8565b8080610aaa906151cf565b915050610a0f565b60009150505b919050565b6000805b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050821015610c005782600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610bd757610bd66152d4565b5b90600052602060002001541415610bed57600190505b8180610bf8906151cf565b925050610ac1565b80610ca957600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150555b50505050565b600080600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600201541115610d155760019050610d1a565b600090505b92915050565b6000600254905090565b600080610d35613492565b9050610d42858285613665565b610d4d8585856136f1565b60019150509392505050565b60006012905090565b610d6b82610a07565b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190614bbc565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610dfa9190614d19565b60206040518083038186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4a919061415f565b73ffffffffffffffffffffffffffffffffffffffff1614610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9790614c7c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f5157610f508282611bab565b5b610f5b8282610caf565b6111d5576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060050154111561105257600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060050154341015611051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104890614adc565b60405180910390fd5b5b600061105d83613048565b90506040518060c001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001428152602001838152602001826020015181526020018260600151815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a082015181600501559050506111d38383610abd565b505b5050565b6000806111e4613492565b90506112058185856111f68589612fc1565b6112009190614e4f565b61349a565b600191505092915050565b611218613492565b73ffffffffffffffffffffffffffffffffffffffff166112366125c2565b73ffffffffffffffffffffffffffffffffffffffff161461128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614bdc565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16316040516112eb90614907565b60006040518083038185875af1925050503d8060008114611328576040519150601f19603f3d011682016040523d82523d6000602084013e61132d565b606091505b5050905080611371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136890614c3c565b60405180910390fd5b50565b61137c613492565b73ffffffffffffffffffffffffffffffffffffffff1661139a6125c2565b73ffffffffffffffffffffffffffffffffffffffff16146113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e790614bdc565b60405180910390fd5b6113fa8282613972565b5050565b61140f611409613492565b82613ad2565b50565b61141a613492565b73ffffffffffffffffffffffffffffffffffffffff166114386125c2565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590614bdc565b60405180910390fd5b600860405180608001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200186815260200183815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201908051906020019061155d929190613e73565b5060608201518160030155505050505050565b60606008805480602002602001604051908101604052809291908181526020016000905b828210156116c257838290600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820180546116279061516c565b80601f01602080910402602001604051908101604052809291908181526020018280546116539061516c565b80156116a05780601f10611675576101008083540402835291602001916116a0565b820191906000526020600020905b81548152906001019060200180831161168357829003601f168201915b5050505050815260200160038201548152505081526020019060010190611594565b50505050905090565b6060600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561179357602002820191906000526020600020905b81548152602001906001019080831161177f575b50505050509050919050565b6117a7613492565b73ffffffffffffffffffffffffffffffffffffffff166117c56125c2565b73ffffffffffffffffffffffffffffffffffffffff161461181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290614bdc565b60405180910390fd5b60005b600880549050811015611a1d578173ffffffffffffffffffffffffffffffffffffffff1660088281548110611856576118556152d4565b5b906000526020600020906004020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a0a57600860016008805490506118b891906150a1565b815481106118c9576118c86152d4565b5b9060005260206000209060040201600882815481106118eb576118ea6152d4565b5b90600052602060002090600402016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018201548160010155600282018160020190805461197e9061516c565b611989929190613ef9565b506003820154816003015590505060088054806119a9576119a86152a5565b5b6001900381819060005260206000209060040201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160006119fd9190613f86565b6003820160009055505090555b8080611a15906151cf565b91505061181e565b5050565b611a29613492565b73ffffffffffffffffffffffffffffffffffffffff16611a476125c2565b73ffffffffffffffffffffffffffffffffffffffff1614611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490614bdc565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611aee84846127ca565b90506000603c80836040015142611b0591906150a1565b611b0f9190614ea5565b611b199190614ea5565b90506000826080015182611b2d9190615047565b905080935050505092915050565b6000611b45610d59565b600a611b519190614f29565b82611b5c9190615047565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611be69190614d19565b60206040518083038186803b158015611bfe57600080fd5b505afa158015611c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c36919061415f565b9050600073ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611d8757508073ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156125155760005b60076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156123de578260076000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611f8b57611f8a6152d4565b5b906000526020600020015414156123cb5760076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160076000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061218a91906150a1565b8154811061219b5761219a6152d4565b5b906000526020600020015460076000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106122a7576122a66152d4565b5b906000526020600020018190555060076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806123b4576123b36152a5565b5b600190038181906000526020600020016000905590555b80806123d6906151cf565b915050611d8f565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083908060018154018082558091505060019003906000526020600020016000909190919091505581600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b505050565b612522613492565b73ffffffffffffffffffffffffffffffffffffffff166125406125c2565b73ffffffffffffffffffffffffffffffffffffffff1614612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d90614bdc565b60405180910390fd5b6125a06000613ca9565b565b6125b4826125ae613492565b83613665565b6125be8282613ad2565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546125fb9061516c565b80601f01602080910402602001604051908101604052809291908181526020018280546126279061516c565b80156126745780601f1061264957610100808354040283529160200191612674565b820191906000526020600020905b81548152906001019060200180831161265757829003601f168201915b5050505050905090565b600080612689613492565b905060006126978286612fc1565b9050838110156126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d390614c9c565b60405180910390fd5b6126e9828686840361349a565b60019250505092915050565b600080612700613492565b905061270d8185856136f1565b600191505092915050565b6007602052826000526040600020602052816000526040600020818154811061274057600080fd5b9060005260206000200160009250925050505481565b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3083856040518463ffffffff1660e01b815260040161279393929190614937565b600060405180830381600087803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b50505050505050565b6127d2613fc6565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905092915050565b60006129158383610caf565b612954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294b90614b9c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016129a49190614d19565b60206040518083038186803b1580156129bc57600080fd5b505afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f4919061415f565b73ffffffffffffffffffffffffffffffffffffffff1614612a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4190614c7c565b60405180910390fd5b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600501541115612b3d57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060050154341015612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390614b7c565b60405180910390fd5b5b6000612b498484611ae1565b9050600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160009055600382016000905560048201600090556005820160009055505060005b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015612fac5783600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612d2557612d246152d4565b5b90600052602060002001541415612f9957600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612e3e91906150a1565b81548110612e4f57612e4e6152d4565b5b9060005260206000200154600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612ee857612ee76152d4565b5b9060005260206000200181905550600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480612f8257612f816152a5565b5b600190038181906000526020600020016000905590555b8080612fa4906151cf565b915050612c0f565b612fb63383613972565b819250505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b613050614028565b60005b60088054905081101561321d578273ffffffffffffffffffffffffffffffffffffffff166008828154811061308b5761308a6152d4565b5b906000526020600020906004020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561320a57600881815481106130ed576130ec6152d4565b5b90600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820180546131769061516c565b80601f01602080910402602001604051908101604052809291908181526020018280546131a29061516c565b80156131ef5780601f106131c4576101008083540402835291602001916131ef565b820191906000526020600020905b8154815290600101906020018083116131d257829003601f168201915b5050505050815260200160038201548152505091505061321f565b8080613215906151cf565b915050613053565b505b919050565b61322c613492565b73ffffffffffffffffffffffffffffffffffffffff1661324a6125c2565b73ffffffffffffffffffffffffffffffffffffffff16146132a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329790614bdc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330790614afc565b60405180910390fd5b61331981613ca9565b50565b6008818154811061332c57600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201805461337b9061516c565b80601f01602080910402602001604051908101604052809291908181526020018280546133a79061516c565b80156133f45780601f106133c9576101008083540402835291602001916133f4565b820191906000526020600020905b8154815290600101906020018083116133d757829003601f168201915b5050505050908060030154905084565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154905086565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561350a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350190614c5c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561357a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357190614b1c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516136589190614d19565b60405180910390a3505050565b60006136718484612fc1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146136eb57818110156136dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d490614b3c565b60405180910390fd5b6136ea848484840361349a565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375890614c1c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c890614a9c565b60405180910390fd5b6137dc838383613d6f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385990614b5c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138f59190614e4f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139599190614d19565b60405180910390a361396c848484613d74565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d990614cbc565b60405180910390fd5b6139ee60008383613d6f565b8060026000828254613a009190614e4f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a559190614e4f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613aba9190614d19565b60405180910390a3613ace60008383613d74565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3990614bfc565b60405180910390fd5b613b4e82600083613d6f565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bcb90614abc565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613c2b91906150a1565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613c909190614d19565b60405180910390a3613ca483600084613d74565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b613d7f83838361348d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613de857504173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613e215750600073ffffffffffffffffffffffffffffffffffffffff164173ffffffffffffffffffffffffffffffffffffffff1614155b15613e6e5780613e3083611b63565b1415613e6d5760006064609683613e479190615047565b613e519190614ea5565b90506096811115613e6157609690505b613e6b8482613972565b505b5b505050565b828054613e7f9061516c565b90600052602060002090601f016020900481019282613ea15760008555613ee8565b82601f10613eba57805160ff1916838001178555613ee8565b82800160010185558215613ee8579182015b82811115613ee7578251825591602001919060010190613ecc565b5b509050613ef59190614066565b5090565b828054613f059061516c565b90600052602060002090601f016020900481019282613f275760008555613f75565b82601f10613f385780548555613f75565b82800160010185558215613f7557600052602060002091601f016020900482015b82811115613f74578254825591600101919060010190613f59565b5b509050613f829190614066565b5090565b508054613f929061516c565b6000825580601f10613fa45750613fc3565b601f016020900490600052602060002090810190613fc29190614066565b5b50565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160608152602001600081525090565b5b8082111561407f576000816000905550600101614067565b5090565b600061409661409184614d74565b614d4f565b9050828152602081018484840111156140b2576140b1615337565b5b6140bd84828561512a565b509392505050565b6000813590506140d481615811565b92915050565b6000815190506140e981615811565b92915050565b600082601f83011261410457614103615332565b5b8135614114848260208601614083565b91505092915050565b60008135905061412c81615828565b92915050565b60006020828403121561414857614147615341565b5b6000614156848285016140c5565b91505092915050565b60006020828403121561417557614174615341565b5b6000614183848285016140da565b91505092915050565b600080604083850312156141a3576141a2615341565b5b60006141b1858286016140c5565b92505060206141c2858286016140c5565b9150509250929050565b6000806000606084860312156141e5576141e4615341565b5b60006141f3868287016140c5565b9350506020614204868287016140c5565b92505060406142158682870161411d565b9150509250925092565b6000806040838503121561423657614235615341565b5b6000614244858286016140c5565b92505060206142558582860161411d565b9150509250929050565b60008060006060848603121561427857614277615341565b5b6000614286868287016140c5565b93505060206142978682870161411d565b92505060406142a8868287016140c5565b9150509250925092565b600080600080608085870312156142cc576142cb615341565b5b600085013567ffffffffffffffff8111156142ea576142e961533c565b5b6142f6878288016140ef565b9450506020614307878288016140c5565b93505060406143188782880161411d565b92505060606143298782880161411d565b91505092959194509250565b60006020828403121561434b5761434a615341565b5b60006143598482850161411d565b91505092915050565b600061436e8383614799565b905092915050565b600061438283836148da565b60208301905092915050565b614397816150d5565b82525050565b6143a6816150d5565b82525050565b60006143b782614dc5565b6143c18185614e00565b9350836020820285016143d385614da5565b8060005b8581101561440f57848403895281516143f08582614362565b94506143fb83614de6565b925060208a019950506001810190506143d7565b50829750879550505050505092915050565b600061442c82614dd0565b6144368185614e11565b935061444183614db5565b8060005b838110156144725781516144598882614376565b975061446483614df3565b925050600181019050614445565b5085935050505092915050565b614488816150e7565b82525050565b600061449982614ddb565b6144a38185614e2d565b93506144b3818560208601615139565b6144bc81615346565b840191505092915050565b60006144d282614ddb565b6144dc8185614e3e565b93506144ec818560208601615139565b6144f581615346565b840191505092915050565b600061450d602383614e3e565b915061451882615364565b604082019050919050565b6000614530602283614e3e565b915061453b826153b3565b604082019050919050565b6000614553602b83614e3e565b915061455e82615402565b604082019050919050565b6000614576602683614e3e565b915061458182615451565b604082019050919050565b6000614599602283614e3e565b91506145a4826154a0565b604082019050919050565b60006145bc601d83614e3e565b91506145c7826154ef565b602082019050919050565b60006145df602683614e3e565b91506145ea82615518565b604082019050919050565b6000614602602183614e3e565b915061460d82615567565b604082019050919050565b6000614625601583614e3e565b9150614630826155b6565b602082019050919050565b6000614648602683614e3e565b9150614653826155df565b604082019050919050565b600061466b602083614e3e565b91506146768261562e565b602082019050919050565b600061468e602183614e3e565b915061469982615657565b604082019050919050565b60006146b1602583614e3e565b91506146bc826156a6565b604082019050919050565b60006146d4600083614e22565b91506146df826156f5565b600082019050919050565b60006146f7601083614e3e565b9150614702826156f8565b602082019050919050565b600061471a602483614e3e565b915061472582615721565b604082019050919050565b600061473d601b83614e3e565b915061474882615770565b602082019050919050565b6000614760602583614e3e565b915061476b82615799565b604082019050919050565b6000614783601f83614e3e565b915061478e826157e8565b602082019050919050565b60006080830160008301516147b1600086018261438e565b5060208301516147c460208601826148da565b50604083015184820360408601526147dc828261448e565b91505060608301516147f160608601826148da565b508091505092915050565b6000608083016000830151614814600086018261438e565b50602083015161482760208601826148da565b506040830151848203604086015261483f828261448e565b915050606083015161485460608601826148da565b508091505092915050565b60c082016000820151614875600085018261438e565b506020820151614888602085018261438e565b50604082015161489b60408501826148da565b5060608201516148ae60608501826148da565b5060808201516148c160808501826148da565b5060a08201516148d460a08501826148da565b50505050565b6148e381615113565b82525050565b6148f281615113565b82525050565b6149018161511d565b82525050565b6000614912826146c7565b9150819050919050565b6000602082019050614931600083018461439d565b92915050565b600060608201905061494c600083018661439d565b614959602083018561439d565b61496660408301846148e9565b949350505050565b600060c082019050614983600083018961439d565b614990602083018861439d565b61499d60408301876148e9565b6149aa60608301866148e9565b6149b760808301856148e9565b6149c460a08301846148e9565b979650505050505050565b60006080820190506149e4600083018761439d565b6149f160208301866148e9565b8181036040830152614a0381856144c7565b9050614a1260608301846148e9565b95945050505050565b60006020820190508181036000830152614a3581846143ac565b905092915050565b60006020820190508181036000830152614a578184614421565b905092915050565b6000602082019050614a74600083018461447f565b92915050565b60006020820190508181036000830152614a9481846144c7565b905092915050565b60006020820190508181036000830152614ab581614500565b9050919050565b60006020820190508181036000830152614ad581614523565b9050919050565b60006020820190508181036000830152614af581614546565b9050919050565b60006020820190508181036000830152614b1581614569565b9050919050565b60006020820190508181036000830152614b358161458c565b9050919050565b60006020820190508181036000830152614b55816145af565b9050919050565b60006020820190508181036000830152614b75816145d2565b9050919050565b60006020820190508181036000830152614b95816145f5565b9050919050565b60006020820190508181036000830152614bb581614618565b9050919050565b60006020820190508181036000830152614bd58161463b565b9050919050565b60006020820190508181036000830152614bf58161465e565b9050919050565b60006020820190508181036000830152614c1581614681565b9050919050565b60006020820190508181036000830152614c35816146a4565b9050919050565b60006020820190508181036000830152614c55816146ea565b9050919050565b60006020820190508181036000830152614c758161470d565b9050919050565b60006020820190508181036000830152614c9581614730565b9050919050565b60006020820190508181036000830152614cb581614753565b9050919050565b60006020820190508181036000830152614cd581614776565b9050919050565b60006020820190508181036000830152614cf681846147fc565b905092915050565b600060c082019050614d13600083018461485f565b92915050565b6000602082019050614d2e60008301846148e9565b92915050565b6000602082019050614d4960008301846148f8565b92915050565b6000614d59614d6a565b9050614d65828261519e565b919050565b6000604051905090565b600067ffffffffffffffff821115614d8f57614d8e615303565b5b614d9882615346565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614e5a82615113565b9150614e6583615113565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e9a57614e99615218565b5b828201905092915050565b6000614eb082615113565b9150614ebb83615113565b925082614ecb57614eca615247565b5b828204905092915050565b6000808291508390505b6001851115614f2057808604811115614efc57614efb615218565b5b6001851615614f0b5780820291505b8081029050614f1985615357565b9450614ee0565b94509492505050565b6000614f3482615113565b9150614f3f8361511d565b9250614f6c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614f74565b905092915050565b600082614f845760019050615040565b81614f925760009050615040565b8160018114614fa85760028114614fb257614fe1565b6001915050615040565b60ff841115614fc457614fc3615218565b5b8360020a915084821115614fdb57614fda615218565b5b50615040565b5060208310610133831016604e8410600b84101617156150165782820a90508381111561501157615010615218565b5b615040565b6150238484846001614ed6565b9250905081840481111561503a57615039615218565b5b81810290505b9392505050565b600061505282615113565b915061505d83615113565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561509657615095615218565b5b828202905092915050565b60006150ac82615113565b91506150b783615113565b9250828210156150ca576150c9615218565b5b828203905092915050565b60006150e0826150f3565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561515757808201518184015260208101905061513c565b83811115615166576000848401525b50505050565b6000600282049050600182168061518457607f821691505b6020821081141561519857615197615276565b5b50919050565b6151a782615346565b810181811067ffffffffffffffff821117156151c6576151c5615303565b5b80604052505050565b60006151da82615113565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561520d5761520c615218565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320746f206f70656e203372642d7060008201527f61727479207374616b652e000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320666f722077697468647261776160008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374616b6520646f6573206e6f74206578697374210000000000000000000000600082015250565b7f5468697320636f6c6c656374696f6e20686173206e6f74206265656e2061707060008201527f726f7665642e0000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f436f756c64206e6f7420766572696679206f776e657273686970210000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61581a816150d5565b811461582557600080fd5b50565b61583181615113565b811461583c57600080fd5b5056fea26469706673582212201e36bbe9d6496d70d1f62cefb171e51968b8ceaf436e2d5ad4e4dc8d3e00861264736f6c63430008070033

Deployed Bytecode

0x60806040526004361061021e5760003560e01c806360391c9211610123578063a9059cbb116100ab578063dd62ed3e1161006f578063dd62ed3e1461082d578063e40de8871461086a578063f2fde38b146108a7578063fdbda0ec146108d0578063ff26bbac1461091057610225565b8063a9059cbb1461071d578063aef786311461075a578063c5ce113814610797578063cfd47663146107c0578063d11906b7146107fd57610225565b8063715018a6116100f2578063715018a61461064a57806379cc6790146106615780638da5cb5b1461068a57806395d89b41146106b5578063a457c2d7146106e057610225565b806360391c921461056a578063669dafe8146105a757806370a08231146105e4578063712c70ba1461062157610225565b806339509351116101a657806343851ffc1161017557806343851ffc1461048757806346e63586146104b05780634ab2e523146104db5780635028d05a146105185780635c3d25ca1461054157610225565b806339509351146103e15780633ccfd60b1461041e57806340c10f191461043557806342966c681461045e57610225565b8063175d2024116101ed578063175d2024146102f557806318160ddd1461033257806323b872dd1461035d578063313ce5671461039a578063341f7656146103c557610225565b806306fdde0314610227578063095ea7b3146102525780630da4540f1461028f5780631084d469146102cc57610225565b3661022557005b005b34801561023357600080fd5b5061023c610952565b6040516102499190614a7a565b60405180910390f35b34801561025e57600080fd5b506102796004803603810190610274919061421f565b6109e4565b6040516102869190614a5f565b60405180910390f35b34801561029b57600080fd5b506102b660048036038101906102b19190614132565b610a07565b6040516102c39190614a5f565b60405180910390f35b3480156102d857600080fd5b506102f360048036038101906102ee919061421f565b610abd565b005b34801561030157600080fd5b5061031c6004803603810190610317919061421f565b610caf565b6040516103299190614a5f565b60405180910390f35b34801561033e57600080fd5b50610347610d20565b6040516103549190614d19565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f91906141cc565b610d2a565b6040516103919190614a5f565b60405180910390f35b3480156103a657600080fd5b506103af610d59565b6040516103bc9190614d34565b60405180910390f35b6103df60048036038101906103da919061421f565b610d62565b005b3480156103ed57600080fd5b506104086004803603810190610403919061421f565b6111d9565b6040516104159190614a5f565b60405180910390f35b34801561042a57600080fd5b50610433611210565b005b34801561044157600080fd5b5061045c6004803603810190610457919061421f565b611374565b005b34801561046a57600080fd5b5061048560048036038101906104809190614335565b6113fe565b005b34801561049357600080fd5b506104ae60048036038101906104a991906142b2565b611412565b005b3480156104bc57600080fd5b506104c5611570565b6040516104d29190614a1b565b60405180910390f35b3480156104e757600080fd5b5061050260048036038101906104fd9190614132565b6116cb565b60405161050f9190614a3d565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190614132565b61179f565b005b34801561054d57600080fd5b5061056860048036038101906105639190614132565b611a21565b005b34801561057657600080fd5b50610591600480360381019061058c919061421f565b611ae1565b60405161059e9190614d19565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190614335565b611b3b565b6040516105db9190614d19565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190614132565b611b63565b6040516106189190614d19565b60405180910390f35b34801561062d57600080fd5b506106486004803603810190610643919061421f565b611bab565b005b34801561065657600080fd5b5061065f61251a565b005b34801561066d57600080fd5b506106886004803603810190610683919061421f565b6125a2565b005b34801561069657600080fd5b5061069f6125c2565b6040516106ac919061491c565b60405180910390f35b3480156106c157600080fd5b506106ca6125ec565b6040516106d79190614a7a565b60405180910390f35b3480156106ec57600080fd5b506107076004803603810190610702919061421f565b61267e565b6040516107149190614a5f565b60405180910390f35b34801561072957600080fd5b50610744600480360381019061073f919061421f565b6126f5565b6040516107519190614a5f565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c91906141cc565b612718565b60405161078e9190614d19565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b9919061425f565b612756565b005b3480156107cc57600080fd5b506107e760048036038101906107e2919061421f565b6127ca565b6040516107f49190614cfe565b60405180910390f35b6108176004803603810190610812919061421f565b612909565b6040516108249190614d19565b60405180910390f35b34801561083957600080fd5b50610854600480360381019061084f919061418c565b612fc1565b6040516108619190614d19565b60405180910390f35b34801561087657600080fd5b50610891600480360381019061088c9190614132565b613048565b60405161089e9190614cdc565b60405180910390f35b3480156108b357600080fd5b506108ce60048036038101906108c99190614132565b613224565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190614335565b61331c565b60405161090794939291906149cf565b60405180910390f35b34801561091c57600080fd5b506109376004803603810190610932919061421f565b613404565b6040516109499695949392919061496e565b60405180910390f35b6060600380546109619061516c565b80601f016020809104026020016040519081016040528092919081815260200182805461098d9061516c565b80156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b5050505050905090565b6000806109ef613492565b90506109fc81858561349a565b600191505092915050565b600080600090505b600880549050811015610ab2578273ffffffffffffffffffffffffffffffffffffffff1660088281548110610a4757610a466152d4565b5b906000526020600020906004020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610a9f576001915050610ab8565b8080610aaa906151cf565b915050610a0f565b60009150505b919050565b6000805b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050821015610c005782600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110610bd757610bd66152d4565b5b90600052602060002001541415610bed57600190505b8180610bf8906151cf565b925050610ac1565b80610ca957600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208390806001815401808255809150506001900390600052602060002001600090919091909150555b50505050565b600080600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600201541115610d155760019050610d1a565b600090505b92915050565b6000600254905090565b600080610d35613492565b9050610d42858285613665565b610d4d8585856136f1565b60019150509392505050565b60006012905090565b610d6b82610a07565b610daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da190614bbc565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610dfa9190614d19565b60206040518083038186803b158015610e1257600080fd5b505afa158015610e26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e4a919061415f565b73ffffffffffffffffffffffffffffffffffffffff1614610ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9790614c7c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f5157610f508282611bab565b5b610f5b8282610caf565b6111d5576000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060050154111561105257600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082815260200190815260200160002060050154341015611051576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104890614adc565b60405180910390fd5b5b600061105d83613048565b90506040518060c001604052808473ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff168152602001428152602001838152602001826020015181526020018260600151815250600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020155606082015181600301556080820151816004015560a082015181600501559050506111d38383610abd565b505b5050565b6000806111e4613492565b90506112058185856111f68589612fc1565b6112009190614e4f565b61349a565b600191505092915050565b611218613492565b73ffffffffffffffffffffffffffffffffffffffff166112366125c2565b73ffffffffffffffffffffffffffffffffffffffff161461128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614bdc565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16316040516112eb90614907565b60006040518083038185875af1925050503d8060008114611328576040519150601f19603f3d011682016040523d82523d6000602084013e61132d565b606091505b5050905080611371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136890614c3c565b60405180910390fd5b50565b61137c613492565b73ffffffffffffffffffffffffffffffffffffffff1661139a6125c2565b73ffffffffffffffffffffffffffffffffffffffff16146113f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e790614bdc565b60405180910390fd5b6113fa8282613972565b5050565b61140f611409613492565b82613ad2565b50565b61141a613492565b73ffffffffffffffffffffffffffffffffffffffff166114386125c2565b73ffffffffffffffffffffffffffffffffffffffff161461148e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148590614bdc565b60405180910390fd5b600860405180608001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200186815260200183815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201908051906020019061155d929190613e73565b5060608201518160030155505050505050565b60606008805480602002602001604051908101604052809291908181526020016000905b828210156116c257838290600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820180546116279061516c565b80601f01602080910402602001604051908101604052809291908181526020018280546116539061516c565b80156116a05780601f10611675576101008083540402835291602001916116a0565b820191906000526020600020905b81548152906001019060200180831161168357829003601f168201915b5050505050815260200160038201548152505081526020019060010190611594565b50505050905090565b6060600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561179357602002820191906000526020600020905b81548152602001906001019080831161177f575b50505050509050919050565b6117a7613492565b73ffffffffffffffffffffffffffffffffffffffff166117c56125c2565b73ffffffffffffffffffffffffffffffffffffffff161461181b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181290614bdc565b60405180910390fd5b60005b600880549050811015611a1d578173ffffffffffffffffffffffffffffffffffffffff1660088281548110611856576118556152d4565b5b906000526020600020906004020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a0a57600860016008805490506118b891906150a1565b815481106118c9576118c86152d4565b5b9060005260206000209060040201600882815481106118eb576118ea6152d4565b5b90600052602060002090600402016000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018201548160010155600282018160020190805461197e9061516c565b611989929190613ef9565b506003820154816003015590505060088054806119a9576119a86152a5565b5b6001900381819060005260206000209060040201600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560018201600090556002820160006119fd9190613f86565b6003820160009055505090555b8080611a15906151cf565b91505061181e565b5050565b611a29613492565b73ffffffffffffffffffffffffffffffffffffffff16611a476125c2565b73ffffffffffffffffffffffffffffffffffffffff1614611a9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9490614bdc565b60405180910390fd5b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080611aee84846127ca565b90506000603c80836040015142611b0591906150a1565b611b0f9190614ea5565b611b199190614ea5565b90506000826080015182611b2d9190615047565b905080935050505092915050565b6000611b45610d59565b600a611b519190614f29565b82611b5c9190615047565b9050919050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611be69190614d19565b60206040518083038186803b158015611bfe57600080fd5b505afa158015611c12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c36919061415f565b9050600073ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611d8757508073ffffffffffffffffffffffffffffffffffffffff16600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156125155760005b60076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156123de578260076000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110611f8b57611f8a6152d4565b5b906000526020600020015414156123cb5760076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600160076000600660008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600088815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061218a91906150a1565b8154811061219b5761219a6152d4565b5b906000526020600020015460076000600660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600087815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002082815481106122a7576122a66152d4565b5b906000526020600020018190555060076000600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600086815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806123b4576123b36152a5565b5b600190038181906000526020600020016000905590555b80806123d6906151cf565b915050611d8f565b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083908060018154018082558091505060019003906000526020600020016000909190919091505581600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002060010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b505050565b612522613492565b73ffffffffffffffffffffffffffffffffffffffff166125406125c2565b73ffffffffffffffffffffffffffffffffffffffff1614612596576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258d90614bdc565b60405180910390fd5b6125a06000613ca9565b565b6125b4826125ae613492565b83613665565b6125be8282613ad2565b5050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546125fb9061516c565b80601f01602080910402602001604051908101604052809291908181526020018280546126279061516c565b80156126745780601f1061264957610100808354040283529160200191612674565b820191906000526020600020905b81548152906001019060200180831161265757829003601f168201915b5050505050905090565b600080612689613492565b905060006126978286612fc1565b9050838110156126dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126d390614c9c565b60405180910390fd5b6126e9828686840361349a565b60019250505092915050565b600080612700613492565b905061270d8185856136f1565b600191505092915050565b6007602052826000526040600020602052816000526040600020818154811061274057600080fd5b9060005260206000200160009250925050505481565b8273ffffffffffffffffffffffffffffffffffffffff166323b872dd3083856040518463ffffffff1660e01b815260040161279393929190614937565b600060405180830381600087803b1580156127ad57600080fd5b505af11580156127c1573d6000803e3d6000fd5b50505050505050565b6127d2613fc6565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905092915050565b60006129158383610caf565b612954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294b90614b9c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016129a49190614d19565b60206040518083038186803b1580156129bc57600080fd5b505afa1580156129d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129f4919061415f565b73ffffffffffffffffffffffffffffffffffffffff1614612a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4190614c7c565b60405180910390fd5b6000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600501541115612b3d57600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002060050154341015612b3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3390614b7c565b60405180910390fd5b5b6000612b498484611ae1565b9050600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000848152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160009055600382016000905560048201600090556005820160009055505060005b600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050811015612fac5783600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612d2557612d246152d4565b5b90600052602060002001541415612f9957600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050612e3e91906150a1565b81548110612e4f57612e4e6152d4565b5b9060005260206000200154600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110612ee857612ee76152d4565b5b9060005260206000200181905550600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480612f8257612f816152a5565b5b600190038181906000526020600020016000905590555b8080612fa4906151cf565b915050612c0f565b612fb63383613972565b819250505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b613050614028565b60005b60088054905081101561321d578273ffffffffffffffffffffffffffffffffffffffff166008828154811061308b5761308a6152d4565b5b906000526020600020906004020160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561320a57600881815481106130ed576130ec6152d4565b5b90600052602060002090600402016040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820180546131769061516c565b80601f01602080910402602001604051908101604052809291908181526020018280546131a29061516c565b80156131ef5780601f106131c4576101008083540402835291602001916131ef565b820191906000526020600020905b8154815290600101906020018083116131d257829003601f168201915b5050505050815260200160038201548152505091505061321f565b8080613215906151cf565b915050613053565b505b919050565b61322c613492565b73ffffffffffffffffffffffffffffffffffffffff1661324a6125c2565b73ffffffffffffffffffffffffffffffffffffffff16146132a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161329790614bdc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613310576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330790614afc565b60405180910390fd5b61331981613ca9565b50565b6008818154811061332c57600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600101549080600201805461337b9061516c565b80601f01602080910402602001604051908101604052809291908181526020018280546133a79061516c565b80156133f45780601f106133c9576101008083540402835291602001916133f4565b820191906000526020600020905b8154815290600101906020018083116133d757829003601f168201915b5050505050908060030154905084565b6006602052816000526040600020602052806000526040600020600091509150508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020154908060030154908060040154908060050154905086565b505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561350a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350190614c5c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561357a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161357190614b1c565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516136589190614d19565b60405180910390a3505050565b60006136718484612fc1565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146136eb57818110156136dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136d490614b3c565b60405180910390fd5b6136ea848484840361349a565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613761576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375890614c1c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c890614a9c565b60405180910390fd5b6137dc838383613d6f565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161385990614b5c565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546138f59190614e4f565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516139599190614d19565b60405180910390a361396c848484613d74565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156139e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139d990614cbc565b60405180910390fd5b6139ee60008383613d6f565b8060026000828254613a009190614e4f565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613a559190614e4f565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051613aba9190614d19565b60405180910390a3613ace60008383613d74565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b3990614bfc565b60405180910390fd5b613b4e82600083613d6f565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613bcb90614abc565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160026000828254613c2b91906150a1565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613c909190614d19565b60405180910390a3613ca483600084613d74565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b613d7f83838361348d565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613de857504173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015613e215750600073ffffffffffffffffffffffffffffffffffffffff164173ffffffffffffffffffffffffffffffffffffffff1614155b15613e6e5780613e3083611b63565b1415613e6d5760006064609683613e479190615047565b613e519190614ea5565b90506096811115613e6157609690505b613e6b8482613972565b505b5b505050565b828054613e7f9061516c565b90600052602060002090601f016020900481019282613ea15760008555613ee8565b82601f10613eba57805160ff1916838001178555613ee8565b82800160010185558215613ee8579182015b82811115613ee7578251825591602001919060010190613ecc565b5b509050613ef59190614066565b5090565b828054613f059061516c565b90600052602060002090601f016020900481019282613f275760008555613f75565b82601f10613f385780548555613f75565b82800160010185558215613f7557600052602060002091601f016020900482015b82811115613f74578254825591600101919060010190613f59565b5b509050613f829190614066565b5090565b508054613f929061516c565b6000825580601f10613fa45750613fc3565b601f016020900490600052602060002090810190613fc29190614066565b5b50565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152602001600081525090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160608152602001600081525090565b5b8082111561407f576000816000905550600101614067565b5090565b600061409661409184614d74565b614d4f565b9050828152602081018484840111156140b2576140b1615337565b5b6140bd84828561512a565b509392505050565b6000813590506140d481615811565b92915050565b6000815190506140e981615811565b92915050565b600082601f83011261410457614103615332565b5b8135614114848260208601614083565b91505092915050565b60008135905061412c81615828565b92915050565b60006020828403121561414857614147615341565b5b6000614156848285016140c5565b91505092915050565b60006020828403121561417557614174615341565b5b6000614183848285016140da565b91505092915050565b600080604083850312156141a3576141a2615341565b5b60006141b1858286016140c5565b92505060206141c2858286016140c5565b9150509250929050565b6000806000606084860312156141e5576141e4615341565b5b60006141f3868287016140c5565b9350506020614204868287016140c5565b92505060406142158682870161411d565b9150509250925092565b6000806040838503121561423657614235615341565b5b6000614244858286016140c5565b92505060206142558582860161411d565b9150509250929050565b60008060006060848603121561427857614277615341565b5b6000614286868287016140c5565b93505060206142978682870161411d565b92505060406142a8868287016140c5565b9150509250925092565b600080600080608085870312156142cc576142cb615341565b5b600085013567ffffffffffffffff8111156142ea576142e961533c565b5b6142f6878288016140ef565b9450506020614307878288016140c5565b93505060406143188782880161411d565b92505060606143298782880161411d565b91505092959194509250565b60006020828403121561434b5761434a615341565b5b60006143598482850161411d565b91505092915050565b600061436e8383614799565b905092915050565b600061438283836148da565b60208301905092915050565b614397816150d5565b82525050565b6143a6816150d5565b82525050565b60006143b782614dc5565b6143c18185614e00565b9350836020820285016143d385614da5565b8060005b8581101561440f57848403895281516143f08582614362565b94506143fb83614de6565b925060208a019950506001810190506143d7565b50829750879550505050505092915050565b600061442c82614dd0565b6144368185614e11565b935061444183614db5565b8060005b838110156144725781516144598882614376565b975061446483614df3565b925050600181019050614445565b5085935050505092915050565b614488816150e7565b82525050565b600061449982614ddb565b6144a38185614e2d565b93506144b3818560208601615139565b6144bc81615346565b840191505092915050565b60006144d282614ddb565b6144dc8185614e3e565b93506144ec818560208601615139565b6144f581615346565b840191505092915050565b600061450d602383614e3e565b915061451882615364565b604082019050919050565b6000614530602283614e3e565b915061453b826153b3565b604082019050919050565b6000614553602b83614e3e565b915061455e82615402565b604082019050919050565b6000614576602683614e3e565b915061458182615451565b604082019050919050565b6000614599602283614e3e565b91506145a4826154a0565b604082019050919050565b60006145bc601d83614e3e565b91506145c7826154ef565b602082019050919050565b60006145df602683614e3e565b91506145ea82615518565b604082019050919050565b6000614602602183614e3e565b915061460d82615567565b604082019050919050565b6000614625601583614e3e565b9150614630826155b6565b602082019050919050565b6000614648602683614e3e565b9150614653826155df565b604082019050919050565b600061466b602083614e3e565b91506146768261562e565b602082019050919050565b600061468e602183614e3e565b915061469982615657565b604082019050919050565b60006146b1602583614e3e565b91506146bc826156a6565b604082019050919050565b60006146d4600083614e22565b91506146df826156f5565b600082019050919050565b60006146f7601083614e3e565b9150614702826156f8565b602082019050919050565b600061471a602483614e3e565b915061472582615721565b604082019050919050565b600061473d601b83614e3e565b915061474882615770565b602082019050919050565b6000614760602583614e3e565b915061476b82615799565b604082019050919050565b6000614783601f83614e3e565b915061478e826157e8565b602082019050919050565b60006080830160008301516147b1600086018261438e565b5060208301516147c460208601826148da565b50604083015184820360408601526147dc828261448e565b91505060608301516147f160608601826148da565b508091505092915050565b6000608083016000830151614814600086018261438e565b50602083015161482760208601826148da565b506040830151848203604086015261483f828261448e565b915050606083015161485460608601826148da565b508091505092915050565b60c082016000820151614875600085018261438e565b506020820151614888602085018261438e565b50604082015161489b60408501826148da565b5060608201516148ae60608501826148da565b5060808201516148c160808501826148da565b5060a08201516148d460a08501826148da565b50505050565b6148e381615113565b82525050565b6148f281615113565b82525050565b6149018161511d565b82525050565b6000614912826146c7565b9150819050919050565b6000602082019050614931600083018461439d565b92915050565b600060608201905061494c600083018661439d565b614959602083018561439d565b61496660408301846148e9565b949350505050565b600060c082019050614983600083018961439d565b614990602083018861439d565b61499d60408301876148e9565b6149aa60608301866148e9565b6149b760808301856148e9565b6149c460a08301846148e9565b979650505050505050565b60006080820190506149e4600083018761439d565b6149f160208301866148e9565b8181036040830152614a0381856144c7565b9050614a1260608301846148e9565b95945050505050565b60006020820190508181036000830152614a3581846143ac565b905092915050565b60006020820190508181036000830152614a578184614421565b905092915050565b6000602082019050614a74600083018461447f565b92915050565b60006020820190508181036000830152614a9481846144c7565b905092915050565b60006020820190508181036000830152614ab581614500565b9050919050565b60006020820190508181036000830152614ad581614523565b9050919050565b60006020820190508181036000830152614af581614546565b9050919050565b60006020820190508181036000830152614b1581614569565b9050919050565b60006020820190508181036000830152614b358161458c565b9050919050565b60006020820190508181036000830152614b55816145af565b9050919050565b60006020820190508181036000830152614b75816145d2565b9050919050565b60006020820190508181036000830152614b95816145f5565b9050919050565b60006020820190508181036000830152614bb581614618565b9050919050565b60006020820190508181036000830152614bd58161463b565b9050919050565b60006020820190508181036000830152614bf58161465e565b9050919050565b60006020820190508181036000830152614c1581614681565b9050919050565b60006020820190508181036000830152614c35816146a4565b9050919050565b60006020820190508181036000830152614c55816146ea565b9050919050565b60006020820190508181036000830152614c758161470d565b9050919050565b60006020820190508181036000830152614c9581614730565b9050919050565b60006020820190508181036000830152614cb581614753565b9050919050565b60006020820190508181036000830152614cd581614776565b9050919050565b60006020820190508181036000830152614cf681846147fc565b905092915050565b600060c082019050614d13600083018461485f565b92915050565b6000602082019050614d2e60008301846148e9565b92915050565b6000602082019050614d4960008301846148f8565b92915050565b6000614d59614d6a565b9050614d65828261519e565b919050565b6000604051905090565b600067ffffffffffffffff821115614d8f57614d8e615303565b5b614d9882615346565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614e5a82615113565b9150614e6583615113565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614e9a57614e99615218565b5b828201905092915050565b6000614eb082615113565b9150614ebb83615113565b925082614ecb57614eca615247565b5b828204905092915050565b6000808291508390505b6001851115614f2057808604811115614efc57614efb615218565b5b6001851615614f0b5780820291505b8081029050614f1985615357565b9450614ee0565b94509492505050565b6000614f3482615113565b9150614f3f8361511d565b9250614f6c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614f74565b905092915050565b600082614f845760019050615040565b81614f925760009050615040565b8160018114614fa85760028114614fb257614fe1565b6001915050615040565b60ff841115614fc457614fc3615218565b5b8360020a915084821115614fdb57614fda615218565b5b50615040565b5060208310610133831016604e8410600b84101617156150165782820a90508381111561501157615010615218565b5b615040565b6150238484846001614ed6565b9250905081840481111561503a57615039615218565b5b81810290505b9392505050565b600061505282615113565b915061505d83615113565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561509657615095615218565b5b828202905092915050565b60006150ac82615113565b91506150b783615113565b9250828210156150ca576150c9615218565b5b828203905092915050565b60006150e0826150f3565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561515757808201518184015260208101905061513c565b83811115615166576000848401525b50505050565b6000600282049050600182168061518457607f821691505b6020821081141561519857615197615276565b5b50919050565b6151a782615346565b810181811067ffffffffffffffff821117156151c6576151c5615303565b5b80604052505050565b60006151da82615113565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561520d5761520c615218565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320746f206f70656e203372642d7060008201527f61727479207374616b652e000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e647320666f722077697468647261776160008201527f6c00000000000000000000000000000000000000000000000000000000000000602082015250565b7f5374616b6520646f6573206e6f74206578697374210000000000000000000000600082015250565b7f5468697320636f6c6c656374696f6e20686173206e6f74206265656e2061707060008201527f726f7665642e0000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f436f756c64206e6f7420766572696679206f776e657273686970210000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b61581a816150d5565b811461582557600080fd5b50565b61583181615113565b811461583c57600080fd5b5056fea26469706673582212201e36bbe9d6496d70d1f62cefb171e51968b8ceaf436e2d5ad4e4dc8d3e00861264736f6c63430008070033

Deployed Bytecode Sourcemap

28051:11717:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9183:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11534:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33658:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32710:527;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34050:269;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10303:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12315:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10145:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31025:1616;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13019:238;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39423:181;;;;;;;;;;;;;:::i;:::-;;29294:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20561:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29640:323;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30457:116;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33335:235;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30040:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29454:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34594:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29119:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10474:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36735:1424;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2606:103;;;;;;;;;;;;;:::i;:::-;;20971:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1955:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9402:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13760:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10807:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28644:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39163:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34363:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35130:1518;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11063:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30623:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2864:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28782:31;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;28523:63;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;9183:100;9237:13;9270:5;9263:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9183:100;:::o;11534:201::-;11617:4;11634:13;11650:12;:10;:12::i;:::-;11634:28;;11673:32;11682:5;11689:7;11698:6;11673:8;:32::i;:::-;11723:4;11716:11;;;11534:201;;;;:::o;33658:328::-;33734:14;33760:6;33769:1;33760:10;;33781:173;33791:11;:18;;;;33787:1;:22;33781:173;;;33862:16;33828:50;;:11;33840:1;33828:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;:50;;;33825:100;;;33905:4;33898:11;;;;;33825:100;33939:3;;;;;:::i;:::-;;;;33781:173;;;33973:5;33966:12;;;33658:328;;;;:::o;32710:527::-;32794:6;32815:11;32845:227;32855:19;:31;32875:10;32855:31;;;;;;;;;;;;;;;:49;32887:16;32855:49;;;;;;;;;;;;;;;:56;;;;32851:1;:60;32845:227;;;32986:8;32930:19;:31;32950:10;32930:31;;;;;;;;;;;;;;;:49;32962:16;32930:49;;;;;;;;;;;;;;;32980:1;32930:52;;;;;;;;:::i;:::-;;;;;;;;;;:64;32927:116;;;33023:4;33014:13;;32927:116;33057:3;;;;;:::i;:::-;;;;32845:227;;;33132:6;33128:102;;33154:19;:31;33174:10;33154:31;;;;;;;;;;;;;;;:49;33186:16;33154:49;;;;;;;;;;;;;;;33209:8;33154:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33128:102;32783:454;;32710:527;;:::o;34050:269::-;34134:12;34239:1;34188:10;:28;34199:16;34188:28;;;;;;;;;;;;;;;:38;34217:8;34188:38;;;;;;;;;;;:48;;;:52;34185:102;;;34267:4;34260:11;;;;34185:102;34306:5;34299:12;;34050:269;;;;;:::o;10303:108::-;10364:7;10391:12;;10384:19;;10303:108;:::o;12315:295::-;12446:4;12463:15;12481:12;:10;:12::i;:::-;12463:30;;12504:38;12520:4;12526:7;12535:6;12504:15;:38::i;:::-;12553:27;12563:4;12569:2;12573:6;12553:9;:27::i;:::-;12598:4;12591:11;;;12315:295;;;;;:::o;10145:93::-;10203:5;10228:2;10221:9;;10145:93;:::o;31025:1616::-;31189:38;31210:16;31189:20;:38::i;:::-;31181:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;31335:10;31288:57;;31296:16;31288:33;;;31322:8;31288:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;31280:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;31525:10;31470:65;;:10;:28;31481:16;31470:28;;;;;;;;;;;;;;;:38;31499:8;31470:38;;;;;;;;;;;:51;;;;;;;;;;;;:65;;;31467:141;;31551:45;31568:16;31586:8;31551:15;:45::i;:::-;31467:141;31671:40;31685:16;31702:8;31671:13;:40::i;:::-;31667:957;;31880:1;31835:10;:28;31846:16;31835:28;;;;;;;;;;;;;;;:38;31864:8;31835:38;;;;;;;;;;;:42;;;:46;31832:196;;;31922:10;:28;31933:16;31922:28;;;;;;;;;;;;;;;:38;31951:8;31922:38;;;;;;;;;;;:42;;;31909:9;:55;;31901:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31832:196;32044:33;32080:31;32094:16;32080:13;:31::i;:::-;32044:67;;32219:258;;;;;;;;32247:16;32219:258;;;;;;32286:10;32219:258;;;;;;32319:15;32219:258;;;;32357:8;32219:258;;;;32388:15;:28;;;32219:258;;;;32439:15;:19;;;32219:258;;;32162:10;:28;32173:16;32162:28;;;;;;;;;;;;;;;:38;32191:8;32162:38;;;;;;;;;;;:315;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32569:43;32585:16;32603:8;32569:15;:43::i;:::-;31712:912;31667:957;31025:1616;;:::o;13019:238::-;13107:4;13124:13;13140:12;:10;:12::i;:::-;13124:28;;13163:64;13172:5;13179:7;13216:10;13188:25;13198:5;13205:7;13188:9;:25::i;:::-;:38;;;;:::i;:::-;13163:8;:64::i;:::-;13245:4;13238:11;;;13019:238;;;;:::o;39423:181::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39474:12:::1;39492:10;:15;;39523:12;;;;;;;;;;;39515:29;;;39492:57;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39473:76;;;39568:7;39560:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;39462:142;39423:181::o:0;29294:95::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29364:17:::1;29370:2;29374:6;29364:5;:17::i;:::-;29294:95:::0;;:::o;20561:91::-;20617:27;20623:12;:10;:12::i;:::-;20637:6;20617:5;:27::i;:::-;20561:91;:::o;29640:323::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29767:11:::1;29798:146;;;;;;;;29827:16;29798:146;;;;;;29862:13;29798:146;;;;29895:5;29798:146;;;;29920:4;29798:146;;::::0;29767:188:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;29640:323:::0;;;;:::o;30457:116::-;30503:32;30554:11;30547:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30457:116;:::o;33335:235::-;33406:25;33503:19;:31;33523:10;33503:31;;;;;;;;;;;;;;;:49;33535:16;33503:49;;;;;;;;;;;;;;;33496:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33335:235;;;:::o;30040:355::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;30119:6:::1;30140:248;30150:11;:18;;;;30146:1;:22;30140:248;;;30221:16;30187:50;;:11;30199:1;30187:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;:50;;;30184:175;;;30274:11;30305:1;30286:11;:18;;;;:20;;;;:::i;:::-;30274:33;;;;;;;;:::i;:::-;;;;;;;;;;;;30257:11;30269:1;30257:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;30326:11;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;30184:175;30373:3;;;;;:::i;:::-;;;;30140:248;;;30108:287;30040:355:::0;:::o;29454:114::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29547:13:::1;29532:12;;:28;;;;;;;;;;;;;;;;;;29454:114:::0;:::o;34594:473::-;34685:17;34739:25;34767:38;34777:16;34795:8;34767;:38::i;:::-;34739:66;;34863:14;34930:2;34925;34899:12;:22;;;34881:15;:40;;;;:::i;:::-;34880:47;;;;:::i;:::-;:52;;;;:::i;:::-;34863:69;;34972:16;35003:12;:25;;;34991:9;:37;;;;:::i;:::-;34972:56;;35048:11;35041:18;;;;;34594:473;;;;:::o;29119:116::-;29171:10;29217;:8;:10::i;:::-;29211:2;:16;;;;:::i;:::-;29201:7;:26;;;;:::i;:::-;29194:33;;29119:116;;;:::o;10474:127::-;10548:7;10575:9;:18;10585:7;10575:18;;;;;;;;;;;;;;;;10568:25;;10474:127;;;:::o;36735:1424::-;36847:18;36876:16;36868:33;;;36902:8;36868:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36847:64;;36988:1;36925:65;;:10;:28;36936:16;36925:28;;;;;;;;;;;;;;;:38;36954:8;36925:38;;;;;;;;;;;:51;;;;;;;;;;;;:65;;;;:147;;;;;37062:10;37007:65;;:10;:28;37018:16;37007:28;;;;;;;;;;;;;;;:38;37036:8;37007:38;;;;;;;;;;;:51;;;;;;;;;;;;:65;;;;36925:147;36922:1220;;;37140:6;37165:770;37175:19;:72;37195:10;:28;37206:16;37195:28;;;;;;;;;;;;;;;:38;37224:8;37195:38;;;;;;;;;;;:51;;;;;;;;;;;;37175:72;;;;;;;;;;;;;;;:90;37248:16;37175:90;;;;;;;;;;;;;;;:97;;;;37171:1;:101;37165:770;;;37392:8;37295:19;:72;37315:10;:28;37326:16;37315:28;;;;;;;;;;;;;;;:38;37344:8;37315:38;;;;;;;;;;;:51;;;;;;;;;;;;37295:72;;;;;;;;;;;;;;;:90;37368:16;37295:90;;;;;;;;;;;;;;;37386:1;37295:93;;;;;;;;:::i;:::-;;;;;;;;;;:105;37292:606;;;37568:19;:72;37588:10;:28;37599:16;37588:28;;;;;;;;;;;;;;;:38;37617:8;37588:38;;;;;;;;;;;:51;;;;;;;;;;;;37568:72;;;;;;;;;;;;;;;:90;37641:16;37568:90;;;;;;;;;;;;;;;37757:1;37659:19;:72;37679:10;:28;37690:16;37679:28;;;;;;;;;;;;;;;:38;37708:8;37679:38;;;;;;;;;;;:51;;;;;;;;;;;;37659:72;;;;;;;;;;;;;;;:90;37732:16;37659:90;;;;;;;;;;;;;;;:97;;;;:99;;;;:::i;:::-;37568:191;;;;;;;;:::i;:::-;;;;;;;;;;37472:19;:72;37492:10;:28;37503:16;37492:28;;;;;;;;;;;;;;;:38;37521:8;37492:38;;;;;;;;;;;:51;;;;;;;;;;;;37472:72;;;;;;;;;;;;;;;:90;37545:16;37472:90;;;;;;;;;;;;;;;37563:1;37472:93;;;;;;;;:::i;:::-;;;;;;;;;:287;;;;37782:19;:72;37802:10;:28;37813:16;37802:28;;;;;;;;;;;;;;;:38;37831:8;37802:38;;;;;;;;;;;:51;;;;;;;;;;;;37782:72;;;;;;;;;;;;;;;:90;37855:16;37782:90;;;;;;;;;;;;;;;:96;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37292:606;37916:3;;;;;:::i;:::-;;;;37165:770;;;37987:19;:31;38007:10;37987:31;;;;;;;;;;;;;;;:49;38019:16;37987:49;;;;;;;;;;;;;;;38042:8;37987:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38120:10;38066;:28;38077:16;38066:28;;;;;;;;;;;;;;;:38;38095:8;38066:38;;;;;;;;;;;:51;;;:64;;;;;;;;;;;;;;;;;;37083:1059;36922:1220;36807:1352;36735:1424;;:::o;2606:103::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2671:30:::1;2698:1;2671:18;:30::i;:::-;2606:103::o:0;20971:164::-;21048:46;21064:7;21073:12;:10;:12::i;:::-;21087:6;21048:15;:46::i;:::-;21105:22;21111:7;21120:6;21105:5;:22::i;:::-;20971:164;;:::o;1955:87::-;2001:7;2028:6;;;;;;;;;;;2021:13;;1955:87;:::o;9402:104::-;9458:13;9491:7;9484:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9402:104;:::o;13760:436::-;13853:4;13870:13;13886:12;:10;:12::i;:::-;13870:28;;13909:24;13936:25;13946:5;13953:7;13936:9;:25::i;:::-;13909:52;;14000:15;13980:16;:35;;13972:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;14093:60;14102:5;14109:7;14137:15;14118:16;:34;14093:8;:60::i;:::-;14184:4;14177:11;;;;13760:436;;;;:::o;10807:193::-;10886:4;10903:13;10919:12;:10;:12::i;:::-;10903:28;;10942;10952:5;10959:2;10963:6;10942:9;:28::i;:::-;10988:4;10981:11;;;10807:193;;;;:::o;28644:77::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39163:211::-;39305:16;39297:38;;;39345:4;39352:3;39357:8;39297:69;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39163:211;;;:::o;34363:164::-;34442:20;;:::i;:::-;34481:10;:28;34492:16;34481:28;;;;;;;;;;;;;;;:38;34510:8;34481:38;;;;;;;;;;;34474:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34363:164;;;;:::o;35130:1518::-;35214:17;35311:40;35325:16;35342:8;35311:13;:40::i;:::-;35303:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;35442:10;35395:57;;35403:16;35395:33;;;35429:8;35395:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;;35387:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;35652:1;35607:10;:28;35618:16;35607:28;;;;;;;;;;;;;;;:38;35636:8;35607:38;;;;;;;;;;;:42;;;:46;35604:178;;;35690:10;:28;35701:16;35690:28;;;;;;;;;;;;;;;:38;35719:8;35690:38;;;;;;;;;;;:42;;;35677:9;:55;;35669:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;35604:178;35835:16;35854:48;35875:16;35893:8;35854:20;:48::i;:::-;35835:67;;35973:10;:28;35984:16;35973:28;;;;;;;;;;;;;;;:38;36002:8;35973:38;;;;;;;;;;;;35966:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36060:6;36081:452;36091:19;:31;36111:10;36091:31;;;;;;;;;;;;;;;:49;36123:16;36091:49;;;;;;;;;;;;;;;:56;;;;36087:1;:60;36081:452;;;36222:8;36166:19;:31;36186:10;36166:31;;;;;;;;;;;;;;;:49;36198:16;36166:49;;;;;;;;;;;;;;;36216:1;36166:52;;;;;;;;:::i;:::-;;;;;;;;;;:64;36163:341;;;36305:19;:31;36325:10;36305:31;;;;;;;;;;;;;;;:49;36337:16;36305:49;;;;;;;;;;;;;;;36412:1;36355:19;:31;36375:10;36355:31;;;;;;;;;;;;;;;:49;36387:16;36355:49;;;;;;;;;;;;;;;:56;;;;:58;;;;:::i;:::-;36305:109;;;;;;;;:::i;:::-;;;;;;;;;;36250:19;:31;36270:10;36250:31;;;;;;;;;;;;;;;:49;36282:16;36250:49;;;;;;;;;;;;;;;36300:1;36250:52;;;;;;;;:::i;:::-;;;;;;;;;:164;;;;36433:19;:31;36453:10;36433:31;;;;;;;;;;;;;;;:49;36465:16;36433:49;;;;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36163:341;36518:3;;;;;:::i;:::-;;;;36081:452;;;36569:30;36575:10;36587:11;36569:5;:30::i;:::-;36619:11;36612:18;;;;35130:1518;;;;:::o;11063:151::-;11152:7;11179:11;:18;11191:5;11179:18;;;;;;;;;;;;;;;:27;11198:7;11179:27;;;;;;;;;;;;;;;;11172:34;;11063:151;;;;:::o;30623:322::-;30692:30;;:::i;:::-;30734:6;30755:183;30765:11;:18;;;;30761:1;:22;30755:183;;;30836:16;30802:50;;:11;30814:1;30802:14;;;;;;;;:::i;:::-;;;;;;;;;;;;:30;;;;;;;;;;;;:50;;;30799:110;;;30879:11;30891:1;30879:14;;;;;;;;:::i;:::-;;;;;;;;;;;;30872:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30799:110;30923:3;;;;;:::i;:::-;;;;30755:183;;;30723:222;30623:322;;;;:::o;2864:201::-;2186:12;:10;:12::i;:::-;2175:23;;:7;:5;:7::i;:::-;:23;;;2167:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2973:1:::1;2953:22;;:8;:22;;;;2945:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3029:28;3048:8;3029:18;:28::i;:::-;2864:201:::0;:::o;28782:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28523:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19847:124::-;;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;17394:380::-;17547:1;17530:19;;:5;:19;;;;17522:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17628:1;17609:21;;:7;:21;;;;17601:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17712:6;17682:11;:18;17694:5;17682:18;;;;;;;;;;;;;;;:27;17701:7;17682:27;;;;;;;;;;;;;;;:36;;;;17750:7;17734:32;;17743:5;17734:32;;;17759:6;17734:32;;;;;;:::i;:::-;;;;;;;;17394:380;;;:::o;18065:453::-;18200:24;18227:25;18237:5;18244:7;18227:9;:25::i;:::-;18200:52;;18287:17;18267:16;:37;18263:248;;18349:6;18329:16;:26;;18321:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;18433:51;18442:5;18449:7;18477:6;18458:16;:25;18433:8;:51::i;:::-;18263:248;18189:329;18065:453;;;:::o;14675:671::-;14822:1;14806:18;;:4;:18;;;;14798:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14899:1;14885:16;;:2;:16;;;;14877:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;14954:38;14975:4;14981:2;14985:6;14954:20;:38::i;:::-;15005:19;15027:9;:15;15037:4;15027:15;;;;;;;;;;;;;;;;15005:37;;15076:6;15061:11;:21;;15053:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;15193:6;15179:11;:20;15161:9;:15;15171:4;15161:15;;;;;;;;;;;;;;;:38;;;;15238:6;15221:9;:13;15231:2;15221:13;;;;;;;;;;;;;;;;:23;;;;;;;:::i;:::-;;;;;;;;15277:2;15262:26;;15271:4;15262:26;;;15281:6;15262:26;;;;;;:::i;:::-;;;;;;;;15301:37;15321:4;15327:2;15331:6;15301:19;:37::i;:::-;14787:559;14675:671;;;:::o;15633:399::-;15736:1;15717:21;;:7;:21;;;;15709:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15787:49;15816:1;15820:7;15829:6;15787:20;:49::i;:::-;15865:6;15849:12;;:22;;;;;;;:::i;:::-;;;;;;;;15904:6;15882:9;:18;15892:7;15882:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15947:7;15926:37;;15943:1;15926:37;;;15956:6;15926:37;;;;;;:::i;:::-;;;;;;;;15976:48;16004:1;16008:7;16017:6;15976:19;:48::i;:::-;15633:399;;:::o;16365:591::-;16468:1;16449:21;;:7;:21;;;;16441:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;16521:49;16542:7;16559:1;16563:6;16521:20;:49::i;:::-;16583:22;16608:9;:18;16618:7;16608:18;;;;;;;;;;;;;;;;16583:43;;16663:6;16645:14;:24;;16637:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;16782:6;16765:14;:23;16744:9;:18;16754:7;16744:18;;;;;;;;;;;;;;;:44;;;;16826:6;16810:12;;:22;;;;;;;:::i;:::-;;;;;;;;16876:1;16850:37;;16859:7;16850:37;;;16880:6;16850:37;;;;;;:::i;:::-;;;;;;;;16900:48;16920:7;16937:1;16941:6;16900:19;:48::i;:::-;16430:526;16365:591;;:::o;3225:191::-;3299:16;3318:6;;;;;;;;;;;3299:25;;3344:8;3335:6;;:17;;;;;;;;;;;;;;;;;;3399:8;3368:40;;3389:8;3368:40;;;;;;;;;;;;3288:128;3225:191;:::o;19118:125::-;;;;:::o;38227:783::-;38335:43;38361:4;38367:2;38371:6;38335:25;:43::i;:::-;38411:1;38395:18;;:4;:18;;;;:42;;;;;38423:14;38417:20;;:2;:20;;;;38395:42;:74;;;;;38467:1;38441:28;;:14;:28;;;;38395:74;38391:610;;;38611:6;38594:13;38604:2;38594:9;:13::i;:::-;:23;38591:399;;;38702:20;38740:3;38734;38725:6;:12;;;;:::i;:::-;:18;;;;:::i;:::-;38702:41;;38835:3;38820:12;:18;38817:83;;;38877:3;38862:18;;38817:83;38950:24;38956:4;38961:12;38950:5;:24::i;:::-;38618:372;38591:399;38391:610;38227:783;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:412:1:-;85:5;110:66;126:49;168:6;126:49;:::i;:::-;110:66;:::i;:::-;101:75;;199:6;192:5;185:21;237:4;230:5;226:16;275:3;266:6;261:3;257:16;254:25;251:112;;;282:79;;:::i;:::-;251:112;372:41;406:6;401:3;396;372:41;:::i;:::-;91:328;7:412;;;;;:::o;425:139::-;471:5;509:6;496:20;487:29;;525:33;552:5;525:33;:::i;:::-;425:139;;;;:::o;570:143::-;627:5;658:6;652:13;643:22;;674:33;701:5;674:33;:::i;:::-;570:143;;;;:::o;733:340::-;789:5;838:3;831:4;823:6;819:17;815:27;805:122;;846:79;;:::i;:::-;805:122;963:6;950:20;988:79;1063:3;1055:6;1048:4;1040:6;1036:17;988:79;:::i;:::-;979:88;;795:278;733:340;;;;:::o;1079:139::-;1125:5;1163:6;1150:20;1141:29;;1179:33;1206:5;1179:33;:::i;:::-;1079:139;;;;:::o;1224:329::-;1283:6;1332:2;1320:9;1311:7;1307:23;1303:32;1300:119;;;1338:79;;:::i;:::-;1300:119;1458:1;1483:53;1528:7;1519:6;1508:9;1504:22;1483:53;:::i;:::-;1473:63;;1429:117;1224:329;;;;:::o;1559:351::-;1629:6;1678:2;1666:9;1657:7;1653:23;1649:32;1646:119;;;1684:79;;:::i;:::-;1646:119;1804:1;1829:64;1885:7;1876:6;1865:9;1861:22;1829:64;:::i;:::-;1819:74;;1775:128;1559:351;;;;:::o;1916:474::-;1984:6;1992;2041:2;2029:9;2020:7;2016:23;2012:32;2009:119;;;2047:79;;:::i;:::-;2009:119;2167:1;2192:53;2237:7;2228:6;2217:9;2213:22;2192:53;:::i;:::-;2182:63;;2138:117;2294:2;2320:53;2365:7;2356:6;2345:9;2341:22;2320:53;:::i;:::-;2310:63;;2265:118;1916:474;;;;;:::o;2396:619::-;2473:6;2481;2489;2538:2;2526:9;2517:7;2513:23;2509:32;2506:119;;;2544:79;;:::i;:::-;2506:119;2664:1;2689:53;2734:7;2725:6;2714:9;2710:22;2689:53;:::i;:::-;2679:63;;2635:117;2791:2;2817:53;2862:7;2853:6;2842:9;2838:22;2817:53;:::i;:::-;2807:63;;2762:118;2919:2;2945:53;2990:7;2981:6;2970:9;2966:22;2945:53;:::i;:::-;2935:63;;2890:118;2396:619;;;;;:::o;3021:474::-;3089:6;3097;3146:2;3134:9;3125:7;3121:23;3117:32;3114:119;;;3152:79;;:::i;:::-;3114:119;3272:1;3297:53;3342:7;3333:6;3322:9;3318:22;3297:53;:::i;:::-;3287:63;;3243:117;3399:2;3425:53;3470:7;3461:6;3450:9;3446:22;3425:53;:::i;:::-;3415:63;;3370:118;3021:474;;;;;:::o;3501:619::-;3578:6;3586;3594;3643:2;3631:9;3622:7;3618:23;3614:32;3611:119;;;3649:79;;:::i;:::-;3611:119;3769:1;3794:53;3839:7;3830:6;3819:9;3815:22;3794:53;:::i;:::-;3784:63;;3740:117;3896:2;3922:53;3967:7;3958:6;3947:9;3943:22;3922:53;:::i;:::-;3912:63;;3867:118;4024:2;4050:53;4095:7;4086:6;4075:9;4071:22;4050:53;:::i;:::-;4040:63;;3995:118;3501:619;;;;;:::o;4126:945::-;4222:6;4230;4238;4246;4295:3;4283:9;4274:7;4270:23;4266:33;4263:120;;;4302:79;;:::i;:::-;4263:120;4450:1;4439:9;4435:17;4422:31;4480:18;4472:6;4469:30;4466:117;;;4502:79;;:::i;:::-;4466:117;4607:63;4662:7;4653:6;4642:9;4638:22;4607:63;:::i;:::-;4597:73;;4393:287;4719:2;4745:53;4790:7;4781:6;4770:9;4766:22;4745:53;:::i;:::-;4735:63;;4690:118;4847:2;4873:53;4918:7;4909:6;4898:9;4894:22;4873:53;:::i;:::-;4863:63;;4818:118;4975:2;5001:53;5046:7;5037:6;5026:9;5022:22;5001:53;:::i;:::-;4991:63;;4946:118;4126:945;;;;;;;:::o;5077:329::-;5136:6;5185:2;5173:9;5164:7;5160:23;5156:32;5153:119;;;5191:79;;:::i;:::-;5153:119;5311:1;5336:53;5381:7;5372:6;5361:9;5357:22;5336:53;:::i;:::-;5326:63;;5282:117;5077:329;;;;:::o;5412:268::-;5537:10;5572:102;5670:3;5662:6;5572:102;:::i;:::-;5558:116;;5412:268;;;;:::o;5686:179::-;5755:10;5776:46;5818:3;5810:6;5776:46;:::i;:::-;5854:4;5849:3;5845:14;5831:28;;5686:179;;;;:::o;5871:108::-;5948:24;5966:5;5948:24;:::i;:::-;5943:3;5936:37;5871:108;;:::o;5985:118::-;6072:24;6090:5;6072:24;:::i;:::-;6067:3;6060:37;5985:118;;:::o;6171:1135::-;6346:3;6375:82;6451:5;6375:82;:::i;:::-;6473:114;6580:6;6575:3;6473:114;:::i;:::-;6466:121;;6613:3;6658:4;6650:6;6646:17;6641:3;6637:27;6688:84;6766:5;6688:84;:::i;:::-;6795:7;6826:1;6811:450;6836:6;6833:1;6830:13;6811:450;;;6907:9;6901:4;6897:20;6892:3;6885:33;6958:6;6952:13;6986:120;7101:4;7086:13;6986:120;:::i;:::-;6978:128;;7129:88;7210:6;7129:88;:::i;:::-;7119:98;;7246:4;7241:3;7237:14;7230:21;;6871:390;6858:1;6855;6851:9;6846:14;;6811:450;;;6815:14;7277:4;7270:11;;7297:3;7290:10;;6351:955;;;;;6171:1135;;;;:::o;7342:732::-;7461:3;7490:54;7538:5;7490:54;:::i;:::-;7560:86;7639:6;7634:3;7560:86;:::i;:::-;7553:93;;7670:56;7720:5;7670:56;:::i;:::-;7749:7;7780:1;7765:284;7790:6;7787:1;7784:13;7765:284;;;7866:6;7860:13;7893:63;7952:3;7937:13;7893:63;:::i;:::-;7886:70;;7979:60;8032:6;7979:60;:::i;:::-;7969:70;;7825:224;7812:1;7809;7805:9;7800:14;;7765:284;;;7769:14;8065:3;8058:10;;7466:608;;;7342:732;;;;:::o;8080:109::-;8161:21;8176:5;8161:21;:::i;:::-;8156:3;8149:34;8080:109;;:::o;8195:344::-;8273:3;8301:39;8334:5;8301:39;:::i;:::-;8356:61;8410:6;8405:3;8356:61;:::i;:::-;8349:68;;8426:52;8471:6;8466:3;8459:4;8452:5;8448:16;8426:52;:::i;:::-;8503:29;8525:6;8503:29;:::i;:::-;8498:3;8494:39;8487:46;;8277:262;8195:344;;;;:::o;8545:364::-;8633:3;8661:39;8694:5;8661:39;:::i;:::-;8716:71;8780:6;8775:3;8716:71;:::i;:::-;8709:78;;8796:52;8841:6;8836:3;8829:4;8822:5;8818:16;8796:52;:::i;:::-;8873:29;8895:6;8873:29;:::i;:::-;8868:3;8864:39;8857:46;;8637:272;8545:364;;;;:::o;8915:366::-;9057:3;9078:67;9142:2;9137:3;9078:67;:::i;:::-;9071:74;;9154:93;9243:3;9154:93;:::i;:::-;9272:2;9267:3;9263:12;9256:19;;8915:366;;;:::o;9287:::-;9429:3;9450:67;9514:2;9509:3;9450:67;:::i;:::-;9443:74;;9526:93;9615:3;9526:93;:::i;:::-;9644:2;9639:3;9635:12;9628:19;;9287:366;;;:::o;9659:::-;9801:3;9822:67;9886:2;9881:3;9822:67;:::i;:::-;9815:74;;9898:93;9987:3;9898:93;:::i;:::-;10016:2;10011:3;10007:12;10000:19;;9659:366;;;:::o;10031:::-;10173:3;10194:67;10258:2;10253:3;10194:67;:::i;:::-;10187:74;;10270:93;10359:3;10270:93;:::i;:::-;10388:2;10383:3;10379:12;10372:19;;10031:366;;;:::o;10403:::-;10545:3;10566:67;10630:2;10625:3;10566:67;:::i;:::-;10559:74;;10642:93;10731:3;10642:93;:::i;:::-;10760:2;10755:3;10751:12;10744:19;;10403:366;;;:::o;10775:::-;10917:3;10938:67;11002:2;10997:3;10938:67;:::i;:::-;10931:74;;11014:93;11103:3;11014:93;:::i;:::-;11132:2;11127:3;11123:12;11116:19;;10775:366;;;:::o;11147:::-;11289:3;11310:67;11374:2;11369:3;11310:67;:::i;:::-;11303:74;;11386:93;11475:3;11386:93;:::i;:::-;11504:2;11499:3;11495:12;11488:19;;11147:366;;;:::o;11519:::-;11661:3;11682:67;11746:2;11741:3;11682:67;:::i;:::-;11675:74;;11758:93;11847:3;11758:93;:::i;:::-;11876:2;11871:3;11867:12;11860:19;;11519:366;;;:::o;11891:::-;12033:3;12054:67;12118:2;12113:3;12054:67;:::i;:::-;12047:74;;12130:93;12219:3;12130:93;:::i;:::-;12248:2;12243:3;12239:12;12232:19;;11891:366;;;:::o;12263:::-;12405:3;12426:67;12490:2;12485:3;12426:67;:::i;:::-;12419:74;;12502:93;12591:3;12502:93;:::i;:::-;12620:2;12615:3;12611:12;12604:19;;12263:366;;;:::o;12635:::-;12777:3;12798:67;12862:2;12857:3;12798:67;:::i;:::-;12791:74;;12874:93;12963:3;12874:93;:::i;:::-;12992:2;12987:3;12983:12;12976:19;;12635:366;;;:::o;13007:::-;13149:3;13170:67;13234:2;13229:3;13170:67;:::i;:::-;13163:74;;13246:93;13335:3;13246:93;:::i;:::-;13364:2;13359:3;13355:12;13348:19;;13007:366;;;:::o;13379:::-;13521:3;13542:67;13606:2;13601:3;13542:67;:::i;:::-;13535:74;;13618:93;13707:3;13618:93;:::i;:::-;13736:2;13731:3;13727:12;13720:19;;13379:366;;;:::o;13751:398::-;13910:3;13931:83;14012:1;14007:3;13931:83;:::i;:::-;13924:90;;14023:93;14112:3;14023:93;:::i;:::-;14141:1;14136:3;14132:11;14125:18;;13751:398;;;:::o;14155:366::-;14297:3;14318:67;14382:2;14377:3;14318:67;:::i;:::-;14311:74;;14394:93;14483:3;14394:93;:::i;:::-;14512:2;14507:3;14503:12;14496:19;;14155:366;;;:::o;14527:::-;14669:3;14690:67;14754:2;14749:3;14690:67;:::i;:::-;14683:74;;14766:93;14855:3;14766:93;:::i;:::-;14884:2;14879:3;14875:12;14868:19;;14527:366;;;:::o;14899:::-;15041:3;15062:67;15126:2;15121:3;15062:67;:::i;:::-;15055:74;;15138:93;15227:3;15138:93;:::i;:::-;15256:2;15251:3;15247:12;15240:19;;14899:366;;;:::o;15271:::-;15413:3;15434:67;15498:2;15493:3;15434:67;:::i;:::-;15427:74;;15510:93;15599:3;15510:93;:::i;:::-;15628:2;15623:3;15619:12;15612:19;;15271:366;;;:::o;15643:::-;15785:3;15806:67;15870:2;15865:3;15806:67;:::i;:::-;15799:74;;15882:93;15971:3;15882:93;:::i;:::-;16000:2;15995:3;15991:12;15984:19;;15643:366;;;:::o;16073:968::-;16188:3;16224:4;16219:3;16215:14;16322:4;16315:5;16311:16;16305:23;16341:63;16398:4;16393:3;16389:14;16375:12;16341:63;:::i;:::-;16239:175;16504:4;16497:5;16493:16;16487:23;16523:63;16580:4;16575:3;16571:14;16557:12;16523:63;:::i;:::-;16424:172;16678:4;16671:5;16667:16;16661:23;16731:3;16725:4;16721:14;16714:4;16709:3;16705:14;16698:38;16757:73;16825:4;16811:12;16757:73;:::i;:::-;16749:81;;16606:235;16922:4;16915:5;16911:16;16905:23;16941:63;16998:4;16993:3;16989:14;16975:12;16941:63;:::i;:::-;16851:163;17031:4;17024:11;;16193:848;16073:968;;;;:::o;17105:978::-;17230:3;17266:4;17261:3;17257:14;17364:4;17357:5;17353:16;17347:23;17383:63;17440:4;17435:3;17431:14;17417:12;17383:63;:::i;:::-;17281:175;17546:4;17539:5;17535:16;17529:23;17565:63;17622:4;17617:3;17613:14;17599:12;17565:63;:::i;:::-;17466:172;17720:4;17713:5;17709:16;17703:23;17773:3;17767:4;17763:14;17756:4;17751:3;17747:14;17740:38;17799:73;17867:4;17853:12;17799:73;:::i;:::-;17791:81;;17648:235;17964:4;17957:5;17953:16;17947:23;17983:63;18040:4;18035:3;18031:14;18017:12;17983:63;:::i;:::-;17893:163;18073:4;18066:11;;17235:848;17105:978;;;;:::o;18137:1233::-;18280:4;18275:3;18271:14;18378:4;18371:5;18367:16;18361:23;18397:63;18454:4;18449:3;18445:14;18431:12;18397:63;:::i;:::-;18295:175;18560:4;18553:5;18549:16;18543:23;18579:63;18636:4;18631:3;18627:14;18613:12;18579:63;:::i;:::-;18480:172;18739:4;18732:5;18728:16;18722:23;18758:63;18815:4;18810:3;18806:14;18792:12;18758:63;:::i;:::-;18662:169;18916:4;18909:5;18905:16;18899:23;18935:63;18992:4;18987:3;18983:14;18969:12;18935:63;:::i;:::-;18841:167;19098:4;19091:5;19087:16;19081:23;19117:63;19174:4;19169:3;19165:14;19151:12;19117:63;:::i;:::-;19018:172;19271:4;19264:5;19260:16;19254:23;19290:63;19347:4;19342:3;19338:14;19324:12;19290:63;:::i;:::-;19200:163;18249:1121;18137:1233;;:::o;19376:108::-;19453:24;19471:5;19453:24;:::i;:::-;19448:3;19441:37;19376:108;;:::o;19490:118::-;19577:24;19595:5;19577:24;:::i;:::-;19572:3;19565:37;19490:118;;:::o;19614:112::-;19697:22;19713:5;19697:22;:::i;:::-;19692:3;19685:35;19614:112;;:::o;19732:379::-;19916:3;19938:147;20081:3;19938:147;:::i;:::-;19931:154;;20102:3;20095:10;;19732:379;;;:::o;20117:222::-;20210:4;20248:2;20237:9;20233:18;20225:26;;20261:71;20329:1;20318:9;20314:17;20305:6;20261:71;:::i;:::-;20117:222;;;;:::o;20345:442::-;20494:4;20532:2;20521:9;20517:18;20509:26;;20545:71;20613:1;20602:9;20598:17;20589:6;20545:71;:::i;:::-;20626:72;20694:2;20683:9;20679:18;20670:6;20626:72;:::i;:::-;20708;20776:2;20765:9;20761:18;20752:6;20708:72;:::i;:::-;20345:442;;;;;;:::o;20793:775::-;21026:4;21064:3;21053:9;21049:19;21041:27;;21078:71;21146:1;21135:9;21131:17;21122:6;21078:71;:::i;:::-;21159:72;21227:2;21216:9;21212:18;21203:6;21159:72;:::i;:::-;21241;21309:2;21298:9;21294:18;21285:6;21241:72;:::i;:::-;21323;21391:2;21380:9;21376:18;21367:6;21323:72;:::i;:::-;21405:73;21473:3;21462:9;21458:19;21449:6;21405:73;:::i;:::-;21488;21556:3;21545:9;21541:19;21532:6;21488:73;:::i;:::-;20793:775;;;;;;;;;:::o;21574:644::-;21771:4;21809:3;21798:9;21794:19;21786:27;;21823:71;21891:1;21880:9;21876:17;21867:6;21823:71;:::i;:::-;21904:72;21972:2;21961:9;21957:18;21948:6;21904:72;:::i;:::-;22023:9;22017:4;22013:20;22008:2;21997:9;21993:18;21986:48;22051:78;22124:4;22115:6;22051:78;:::i;:::-;22043:86;;22139:72;22207:2;22196:9;22192:18;22183:6;22139:72;:::i;:::-;21574:644;;;;;;;:::o;22224:485::-;22423:4;22461:2;22450:9;22446:18;22438:26;;22510:9;22504:4;22500:20;22496:1;22485:9;22481:17;22474:47;22538:164;22697:4;22688:6;22538:164;:::i;:::-;22530:172;;22224:485;;;;:::o;22715:373::-;22858:4;22896:2;22885:9;22881:18;22873:26;;22945:9;22939:4;22935:20;22931:1;22920:9;22916:17;22909:47;22973:108;23076:4;23067:6;22973:108;:::i;:::-;22965:116;;22715:373;;;;:::o;23094:210::-;23181:4;23219:2;23208:9;23204:18;23196:26;;23232:65;23294:1;23283:9;23279:17;23270:6;23232:65;:::i;:::-;23094:210;;;;:::o;23310:313::-;23423:4;23461:2;23450:9;23446:18;23438:26;;23510:9;23504:4;23500:20;23496:1;23485:9;23481:17;23474:47;23538:78;23611:4;23602:6;23538:78;:::i;:::-;23530:86;;23310:313;;;;:::o;23629:419::-;23795:4;23833:2;23822:9;23818:18;23810:26;;23882:9;23876:4;23872:20;23868:1;23857:9;23853:17;23846:47;23910:131;24036:4;23910:131;:::i;:::-;23902:139;;23629:419;;;:::o;24054:::-;24220:4;24258:2;24247:9;24243:18;24235:26;;24307:9;24301:4;24297:20;24293:1;24282:9;24278:17;24271:47;24335:131;24461:4;24335:131;:::i;:::-;24327:139;;24054:419;;;:::o;24479:::-;24645:4;24683:2;24672:9;24668:18;24660:26;;24732:9;24726:4;24722:20;24718:1;24707:9;24703:17;24696:47;24760:131;24886:4;24760:131;:::i;:::-;24752:139;;24479:419;;;:::o;24904:::-;25070:4;25108:2;25097:9;25093:18;25085:26;;25157:9;25151:4;25147:20;25143:1;25132:9;25128:17;25121:47;25185:131;25311:4;25185:131;:::i;:::-;25177:139;;24904:419;;;:::o;25329:::-;25495:4;25533:2;25522:9;25518:18;25510:26;;25582:9;25576:4;25572:20;25568:1;25557:9;25553:17;25546:47;25610:131;25736:4;25610:131;:::i;:::-;25602:139;;25329:419;;;:::o;25754:::-;25920:4;25958:2;25947:9;25943:18;25935:26;;26007:9;26001:4;25997:20;25993:1;25982:9;25978:17;25971:47;26035:131;26161:4;26035:131;:::i;:::-;26027:139;;25754:419;;;:::o;26179:::-;26345:4;26383:2;26372:9;26368:18;26360:26;;26432:9;26426:4;26422:20;26418:1;26407:9;26403:17;26396:47;26460:131;26586:4;26460:131;:::i;:::-;26452:139;;26179:419;;;:::o;26604:::-;26770:4;26808:2;26797:9;26793:18;26785:26;;26857:9;26851:4;26847:20;26843:1;26832:9;26828:17;26821:47;26885:131;27011:4;26885:131;:::i;:::-;26877:139;;26604:419;;;:::o;27029:::-;27195:4;27233:2;27222:9;27218:18;27210:26;;27282:9;27276:4;27272:20;27268:1;27257:9;27253:17;27246:47;27310:131;27436:4;27310:131;:::i;:::-;27302:139;;27029:419;;;:::o;27454:::-;27620:4;27658:2;27647:9;27643:18;27635:26;;27707:9;27701:4;27697:20;27693:1;27682:9;27678:17;27671:47;27735:131;27861:4;27735:131;:::i;:::-;27727:139;;27454:419;;;:::o;27879:::-;28045:4;28083:2;28072:9;28068:18;28060:26;;28132:9;28126:4;28122:20;28118:1;28107:9;28103:17;28096:47;28160:131;28286:4;28160:131;:::i;:::-;28152:139;;27879:419;;;:::o;28304:::-;28470:4;28508:2;28497:9;28493:18;28485:26;;28557:9;28551:4;28547:20;28543:1;28532:9;28528:17;28521:47;28585:131;28711:4;28585:131;:::i;:::-;28577:139;;28304:419;;;:::o;28729:::-;28895:4;28933:2;28922:9;28918:18;28910:26;;28982:9;28976:4;28972:20;28968:1;28957:9;28953:17;28946:47;29010:131;29136:4;29010:131;:::i;:::-;29002:139;;28729:419;;;:::o;29154:::-;29320:4;29358:2;29347:9;29343:18;29335:26;;29407:9;29401:4;29397:20;29393:1;29382:9;29378:17;29371:47;29435:131;29561:4;29435:131;:::i;:::-;29427:139;;29154:419;;;:::o;29579:::-;29745:4;29783:2;29772:9;29768:18;29760:26;;29832:9;29826:4;29822:20;29818:1;29807:9;29803:17;29796:47;29860:131;29986:4;29860:131;:::i;:::-;29852:139;;29579:419;;;:::o;30004:::-;30170:4;30208:2;30197:9;30193:18;30185:26;;30257:9;30251:4;30247:20;30243:1;30232:9;30228:17;30221:47;30285:131;30411:4;30285:131;:::i;:::-;30277:139;;30004:419;;;:::o;30429:::-;30595:4;30633:2;30622:9;30618:18;30610:26;;30682:9;30676:4;30672:20;30668:1;30657:9;30653:17;30646:47;30710:131;30836:4;30710:131;:::i;:::-;30702:139;;30429:419;;;:::o;30854:::-;31020:4;31058:2;31047:9;31043:18;31035:26;;31107:9;31101:4;31097:20;31093:1;31082:9;31078:17;31071:47;31135:131;31261:4;31135:131;:::i;:::-;31127:139;;30854:419;;;:::o;31279:385::-;31428:4;31466:2;31455:9;31451:18;31443:26;;31515:9;31509:4;31505:20;31501:1;31490:9;31486:17;31479:47;31543:114;31652:4;31643:6;31543:114;:::i;:::-;31535:122;;31279:385;;;;:::o;31670:315::-;31809:4;31847:3;31836:9;31832:19;31824:27;;31861:117;31975:1;31964:9;31960:17;31951:6;31861:117;:::i;:::-;31670:315;;;;:::o;31991:222::-;32084:4;32122:2;32111:9;32107:18;32099:26;;32135:71;32203:1;32192:9;32188:17;32179:6;32135:71;:::i;:::-;31991:222;;;;:::o;32219:214::-;32308:4;32346:2;32335:9;32331:18;32323:26;;32359:67;32423:1;32412:9;32408:17;32399:6;32359:67;:::i;:::-;32219:214;;;;:::o;32439:129::-;32473:6;32500:20;;:::i;:::-;32490:30;;32529:33;32557:4;32549:6;32529:33;:::i;:::-;32439:129;;;:::o;32574:75::-;32607:6;32640:2;32634:9;32624:19;;32574:75;:::o;32655:308::-;32717:4;32807:18;32799:6;32796:30;32793:56;;;32829:18;;:::i;:::-;32793:56;32867:29;32889:6;32867:29;:::i;:::-;32859:37;;32951:4;32945;32941:15;32933:23;;32655:308;;;:::o;32969:160::-;33064:4;33087:3;33079:11;;33117:4;33112:3;33108:14;33100:22;;32969:160;;;:::o;33135:132::-;33202:4;33225:3;33217:11;;33255:4;33250:3;33246:14;33238:22;;33135:132;;;:::o;33273:142::-;33368:6;33402:5;33396:12;33386:22;;33273:142;;;:::o;33421:114::-;33488:6;33522:5;33516:12;33506:22;;33421:114;;;:::o;33541:99::-;33593:6;33627:5;33621:12;33611:22;;33541:99;;;:::o;33646:141::-;33744:4;33776;33771:3;33767:14;33759:22;;33646:141;;;:::o;33793:113::-;33863:4;33895;33890:3;33886:14;33878:22;;33793:113;;;:::o;33912:212::-;34039:11;34073:6;34068:3;34061:19;34113:4;34108:3;34104:14;34089:29;;33912:212;;;;:::o;34130:184::-;34229:11;34263:6;34258:3;34251:19;34303:4;34298:3;34294:14;34279:29;;34130:184;;;;:::o;34320:147::-;34421:11;34458:3;34443:18;;34320:147;;;;:::o;34473:159::-;34547:11;34581:6;34576:3;34569:19;34621:4;34616:3;34612:14;34597:29;;34473:159;;;;:::o;34638:169::-;34722:11;34756:6;34751:3;34744:19;34796:4;34791:3;34787:14;34772:29;;34638:169;;;;:::o;34813:305::-;34853:3;34872:20;34890:1;34872:20;:::i;:::-;34867:25;;34906:20;34924:1;34906:20;:::i;:::-;34901:25;;35060:1;34992:66;34988:74;34985:1;34982:81;34979:107;;;35066:18;;:::i;:::-;34979:107;35110:1;35107;35103:9;35096:16;;34813:305;;;;:::o;35124:185::-;35164:1;35181:20;35199:1;35181:20;:::i;:::-;35176:25;;35215:20;35233:1;35215:20;:::i;:::-;35210:25;;35254:1;35244:35;;35259:18;;:::i;:::-;35244:35;35301:1;35298;35294:9;35289:14;;35124:185;;;;:::o;35315:848::-;35376:5;35383:4;35407:6;35398:15;;35431:5;35422:14;;35445:712;35466:1;35456:8;35453:15;35445:712;;;35561:4;35556:3;35552:14;35546:4;35543:24;35540:50;;;35570:18;;:::i;:::-;35540:50;35620:1;35610:8;35606:16;35603:451;;;36035:4;36028:5;36024:16;36015:25;;35603:451;36085:4;36079;36075:15;36067:23;;36115:32;36138:8;36115:32;:::i;:::-;36103:44;;35445:712;;;35315:848;;;;;;;:::o;36169:281::-;36227:5;36251:23;36269:4;36251:23;:::i;:::-;36243:31;;36295:25;36311:8;36295:25;:::i;:::-;36283:37;;36339:104;36376:66;36366:8;36360:4;36339:104;:::i;:::-;36330:113;;36169:281;;;;:::o;36456:1073::-;36510:5;36701:8;36691:40;;36722:1;36713:10;;36724:5;;36691:40;36750:4;36740:36;;36767:1;36758:10;;36769:5;;36740:36;36836:4;36884:1;36879:27;;;;36920:1;36915:191;;;;36829:277;;36879:27;36897:1;36888:10;;36899:5;;;36915:191;36960:3;36950:8;36947:17;36944:43;;;36967:18;;:::i;:::-;36944:43;37016:8;37013:1;37009:16;37000:25;;37051:3;37044:5;37041:14;37038:40;;;37058:18;;:::i;:::-;37038:40;37091:5;;;36829:277;;37215:2;37205:8;37202:16;37196:3;37190:4;37187:13;37183:36;37165:2;37155:8;37152:16;37147:2;37141:4;37138:12;37134:35;37118:111;37115:246;;;37271:8;37265:4;37261:19;37252:28;;37306:3;37299:5;37296:14;37293:40;;;37313:18;;:::i;:::-;37293:40;37346:5;;37115:246;37386:42;37424:3;37414:8;37408:4;37405:1;37386:42;:::i;:::-;37371:57;;;;37460:4;37455:3;37451:14;37444:5;37441:25;37438:51;;;37469:18;;:::i;:::-;37438:51;37518:4;37511:5;37507:16;37498:25;;36456:1073;;;;;;:::o;37535:348::-;37575:7;37598:20;37616:1;37598:20;:::i;:::-;37593:25;;37632:20;37650:1;37632:20;:::i;:::-;37627:25;;37820:1;37752:66;37748:74;37745:1;37742:81;37737:1;37730:9;37723:17;37719:105;37716:131;;;37827:18;;:::i;:::-;37716:131;37875:1;37872;37868:9;37857:20;;37535:348;;;;:::o;37889:191::-;37929:4;37949:20;37967:1;37949:20;:::i;:::-;37944:25;;37983:20;38001:1;37983:20;:::i;:::-;37978:25;;38022:1;38019;38016:8;38013:34;;;38027:18;;:::i;:::-;38013:34;38072:1;38069;38065:9;38057:17;;37889:191;;;;:::o;38086:96::-;38123:7;38152:24;38170:5;38152:24;:::i;:::-;38141:35;;38086:96;;;:::o;38188:90::-;38222:7;38265:5;38258:13;38251:21;38240:32;;38188:90;;;:::o;38284:126::-;38321:7;38361:42;38354:5;38350:54;38339:65;;38284:126;;;:::o;38416:77::-;38453:7;38482:5;38471:16;;38416:77;;;:::o;38499:86::-;38534:7;38574:4;38567:5;38563:16;38552:27;;38499:86;;;:::o;38591:154::-;38675:6;38670:3;38665;38652:30;38737:1;38728:6;38723:3;38719:16;38712:27;38591:154;;;:::o;38751:307::-;38819:1;38829:113;38843:6;38840:1;38837:13;38829:113;;;38928:1;38923:3;38919:11;38913:18;38909:1;38904:3;38900:11;38893:39;38865:2;38862:1;38858:10;38853:15;;38829:113;;;38960:6;38957:1;38954:13;38951:101;;;39040:1;39031:6;39026:3;39022:16;39015:27;38951:101;38800:258;38751:307;;;:::o;39064:320::-;39108:6;39145:1;39139:4;39135:12;39125:22;;39192:1;39186:4;39182:12;39213:18;39203:81;;39269:4;39261:6;39257:17;39247:27;;39203:81;39331:2;39323:6;39320:14;39300:18;39297:38;39294:84;;;39350:18;;:::i;:::-;39294:84;39115:269;39064:320;;;:::o;39390:281::-;39473:27;39495:4;39473:27;:::i;:::-;39465:6;39461:40;39603:6;39591:10;39588:22;39567:18;39555:10;39552:34;39549:62;39546:88;;;39614:18;;:::i;:::-;39546:88;39654:10;39650:2;39643:22;39433:238;39390:281;;:::o;39677:233::-;39716:3;39739:24;39757:5;39739:24;:::i;:::-;39730:33;;39785:66;39778:5;39775:77;39772:103;;;39855:18;;:::i;:::-;39772:103;39902:1;39895:5;39891:13;39884:20;;39677:233;;;:::o;39916:180::-;39964:77;39961:1;39954:88;40061:4;40058:1;40051:15;40085:4;40082:1;40075:15;40102:180;40150:77;40147:1;40140:88;40247:4;40244:1;40237:15;40271:4;40268:1;40261:15;40288:180;40336:77;40333:1;40326:88;40433:4;40430:1;40423:15;40457:4;40454:1;40447:15;40474:180;40522:77;40519:1;40512:88;40619:4;40616:1;40609:15;40643:4;40640:1;40633:15;40660:180;40708:77;40705:1;40698:88;40805:4;40802:1;40795:15;40829:4;40826:1;40819:15;40846:180;40894:77;40891:1;40884:88;40991:4;40988:1;40981:15;41015:4;41012:1;41005:15;41032:117;41141:1;41138;41131:12;41155:117;41264:1;41261;41254:12;41278:117;41387:1;41384;41377:12;41401:117;41510:1;41507;41500:12;41524:102;41565:6;41616:2;41612:7;41607:2;41600:5;41596:14;41592:28;41582:38;;41524:102;;;:::o;41632:::-;41674:8;41721:5;41718:1;41714:13;41693:34;;41632:102;;;:::o;41740:222::-;41880:34;41876:1;41868:6;41864:14;41857:58;41949:5;41944:2;41936:6;41932:15;41925:30;41740:222;:::o;41968:221::-;42108:34;42104:1;42096:6;42092:14;42085:58;42177:4;42172:2;42164:6;42160:15;42153:29;41968:221;:::o;42195:230::-;42335:34;42331:1;42323:6;42319:14;42312:58;42404:13;42399:2;42391:6;42387:15;42380:38;42195:230;:::o;42431:225::-;42571:34;42567:1;42559:6;42555:14;42548:58;42640:8;42635:2;42627:6;42623:15;42616:33;42431:225;:::o;42662:221::-;42802:34;42798:1;42790:6;42786:14;42779:58;42871:4;42866:2;42858:6;42854:15;42847:29;42662:221;:::o;42889:179::-;43029:31;43025:1;43017:6;43013:14;43006:55;42889:179;:::o;43074:225::-;43214:34;43210:1;43202:6;43198:14;43191:58;43283:8;43278:2;43270:6;43266:15;43259:33;43074:225;:::o;43305:220::-;43445:34;43441:1;43433:6;43429:14;43422:58;43514:3;43509:2;43501:6;43497:15;43490:28;43305:220;:::o;43531:171::-;43671:23;43667:1;43659:6;43655:14;43648:47;43531:171;:::o;43708:225::-;43848:34;43844:1;43836:6;43832:14;43825:58;43917:8;43912:2;43904:6;43900:15;43893:33;43708:225;:::o;43939:182::-;44079:34;44075:1;44067:6;44063:14;44056:58;43939:182;:::o;44127:220::-;44267:34;44263:1;44255:6;44251:14;44244:58;44336:3;44331:2;44323:6;44319:15;44312:28;44127:220;:::o;44353:224::-;44493:34;44489:1;44481:6;44477:14;44470:58;44562:7;44557:2;44549:6;44545:15;44538:32;44353:224;:::o;44583:114::-;;:::o;44703:166::-;44843:18;44839:1;44831:6;44827:14;44820:42;44703:166;:::o;44875:223::-;45015:34;45011:1;45003:6;44999:14;44992:58;45084:6;45079:2;45071:6;45067:15;45060:31;44875:223;:::o;45104:177::-;45244:29;45240:1;45232:6;45228:14;45221:53;45104:177;:::o;45287:224::-;45427:34;45423:1;45415:6;45411:14;45404:58;45496:7;45491:2;45483:6;45479:15;45472:32;45287:224;:::o;45517:181::-;45657:33;45653:1;45645:6;45641:14;45634:57;45517:181;:::o;45704:122::-;45777:24;45795:5;45777:24;:::i;:::-;45770:5;45767:35;45757:63;;45816:1;45813;45806:12;45757:63;45704:122;:::o;45832:::-;45905:24;45923:5;45905:24;:::i;:::-;45898:5;45895:35;45885:63;;45944:1;45941;45934:12;45885:63;45832:122;:::o

Swarm Source

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