ETH Price: $2,334.99 (-0.31%)

Token

Creatures (CRT)
 

Overview

Max Total Supply

241 CRT

Holders

182

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Null: 0x000...000
Balance
0 CRT
0x0000000000000000000000000000000000000000
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:
Creatures

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

//SPDX-License-Identifier: MIT

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}

pragma solidity ^0.8.0;

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

pragma solidity ^0.8.2;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 (max value of uint128) of supply
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex = 0;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert('ERC721A: unable to get token of owner by index');
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), 'ERC721A: balance query for the zero address');
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        for (uint256 curr = tokenId; ; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), 'ERC721Metadata: URI query for nonexistent token');

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, 'ERC721A: approval to current owner');

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            'ERC721A: approve caller is not owner nor approved for all'
        );

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), 'ERC721A: approved query for nonexistent token');

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        require(operator != _msgSender(), 'ERC721A: approve to caller');

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` cannot be larger than the max batch size.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
        require(!_exists(startTokenId), 'ERC721A: token already minted');
        require(quantity > 0, 'ERC721A: quantity must be greater 0');

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                'ERC721A: transfer to non ERC721Receiver implementer'
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, prevOwnership.addr);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;
        }

        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

        // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
        // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(prevOwnership.addr, prevOwnership.startTimestamp);
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert('ERC721A: transfer to non ERC721Receiver implementer');
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

contract Creatures is ERC721A, Ownable {
    using Strings for uint;
    using ECDSA for bytes32;

    constructor() ERC721A("Creatures", "CRT") {}
    
    uint256 public constant maxSupply = 1500;
    uint256 maxMintPerCall = 2;
    uint256 presaleMaxMint = 1500;

    struct mintTracker {
        uint256 amount;
    }

    bool public blacklistedSaleStatus = false;

    string private _baseTokenURI;

    address private signer = 0x4557674Ea101C7594a68263D735BacD0Ae57E569;

    mapping(address => mintTracker) private _minttracker;
    mapping(address => bool) public _twomintsAddress;
    mapping(address => uint) devMintsTo;

    modifier mintChecks(uint numNFTs) {
        unchecked {
            require(tx.origin == msg.sender);
            require(numNFTs <= maxMintPerCall, "Number to mint exceeds maximum per tx");
            require(numNFTs + totalSupply() <= maxSupply, "Mint would exceed supply");
        }
        _;
    }

    // MINTING ------------------------------------------------------------------------

    function whitelistMint(uint256 numNFTs, bytes calldata signature) public payable mintChecks(numNFTs) {
        unchecked {
            require(blacklistedSaleStatus, "Sale has not started");
            require(verifySignature(abi.encodePacked(msg.sender), signature), "Invalid signature provided");
            require(totalSupply() + numNFTs - devMintsTo[msg.sender] <= presaleMaxMint, "Can't mint that many in pre-sale");
            if(_twomintsAddress[msg.sender] == true){
                require(_minttracker[msg.sender].amount + numNFTs <= 2, "Can't mint more than 2 NFTs.");
            }else{
                require(_minttracker[msg.sender].amount + numNFTs <= 1, "Can't mint more than 1 NFT.");
            }
        }
        _minttracker[msg.sender].amount = _minttracker[msg.sender].amount + numNFTs;
        _safeMint(msg.sender, numNFTs);
    }

    //GETS ---------------------------------------------------------------------------

    function tokenURI(uint tokenId) public view override returns(string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(_baseTokenURI, tokenId.toString(), ".json"));
    }

    function getMintedAmountForAddress(address _address) public view returns(uint256){
        return _minttracker[_address].amount;
    }

    function getMintedAmountForMyself() public view returns(uint256){
        return _minttracker[msg.sender].amount;
    }

    function getOwnershipData(uint256 tokenId) external view returns (TokenOwnership memory) {
        return ownershipOf(tokenId);
    }

    function verifySignature(bytes memory data, bytes calldata signature) internal view returns(bool) {
        return (keccak256(data).toEthSignedMessageHash().recover(signature) == signer);
    }

    function getSigner() public view returns(address){
        return signer;
    }

    function getTwoMintsWhitelistForAddress(address _address) public view returns (bool){
        if(_twomintsAddress[_address] == true){
            return true;
        }else{
            return false;
        }
    }

    //SETS --------------------------------------------------------------------------
    function setBaseURI(string calldata new_baseURI) external onlyOwner {
        _baseTokenURI = new_baseURI;
    }
        
    function setSaleStates(bool new_blacklistedSaleStatus) external onlyOwner{
        blacklistedSaleStatus = new_blacklistedSaleStatus;
    }

    function setSigner(address new_signer) external onlyOwner {
        signer = new_signer;
    }

    function addTo2MintsWhitelist(address _address) external onlyOwner {
        require(!_twomintsAddress[_address], "Address is already whitelisted for 2 mints.");
        _twomintsAddress[_address] = true;
    }

    function addTo2MintsWhitelist2(address[] memory _addresses) external onlyOwner {
        for(uint i = 0; i < _addresses.length; i++){
            _twomintsAddress[_addresses[i]] = true;
        }
    }

}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_twomintsAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addTo2MintsWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addTo2MintsWhitelist2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blacklistedSaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintedAmountForAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintedAmountForMyself","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getTwoMintsWhitelistForAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"new_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"new_blacklistedSaleStatus","type":"bool"}],"name":"setSaleStates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"new_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numNFTs","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000805560026008556105dc6009556000600a60006101000a81548160ff021916908315150217905550734557674ea101c7594a68263d735bacd0ae57e569600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200009057600080fd5b506040518060400160405280600981526020017f43726561747572657300000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f435254000000000000000000000000000000000000000000000000000000000081525081600190805190602001906200011592919062000225565b5080600290805190602001906200012e92919062000225565b50505062000151620001456200015760201b60201c565b6200015f60201b60201c565b6200033a565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023390620002d5565b90600052602060002090601f016020900481019282620002575760008555620002a3565b82601f106200027257805160ff1916838001178555620002a3565b82800160010185558215620002a3579182015b82811115620002a257825182559160200191906001019062000285565b5b509050620002b29190620002b6565b5090565b5b80821115620002d1576000816000905550600101620002b7565b5090565b60006002820490506001821680620002ee57607f821691505b602082108114156200030557620003046200030b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61559a806200034a6000396000f3fe6080604052600436106101ee5760003560e01c806370a082311161010d578063b88d4fde116100a0578063df74a9981161006f578063df74a99814610728578063e985e9c514610751578063ece0a9501461078e578063f2fde38b146107b7578063f9edfdb3146107e0576101ee565b8063b88d4fde1461066e578063c859fd1714610697578063c87b56dd146106c0578063d5abeb01146106fd576101ee565b80639231ab2a116100dc5780639231ab2a146105c157806395d89b41146105fe5780639e852f7514610629578063a22cb46514610645576101ee565b806370a0823114610517578063715018a6146105545780637ac3c02f1461056b5780638da5cb5b14610596576101ee565b80632b3a01151161018557806355f804b31161015457806355f804b31461045d57806359c819d3146104865780636352211e146104b15780636c19e783146104ee576101ee565b80632b3a01151461037d5780632f745c59146103ba57806342842e0e146103f75780634f6ccce714610420576101ee565b8063095ea7b3116101c1578063095ea7b3146102c357806318160ddd146102ec5780631c26c0641461031757806323b872dd14610354576101ee565b806301ffc9a7146101f3578063040786e11461023057806306fdde031461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613aee565b61081d565b6040516102279190614348565b60405180910390f35b34801561023c57600080fd5b50610245610967565b6040516102529190614348565b60405180910390f35b34801561026757600080fd5b5061027061097a565b60405161027d91906143a8565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190613b85565b610a0c565b6040516102ba91906142e1565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190613a48565b610a91565b005b3480156102f857600080fd5b50610301610baa565b60405161030e91906147c5565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906138dd565b610bb3565b60405161034b91906147c5565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190613942565b610bff565b005b34801561038957600080fd5b506103a4600480360381019061039f91906138dd565b610c0f565b6040516103b19190614348565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190613a48565b610c2f565b6040516103ee91906147c5565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613942565b610e2d565b005b34801561042c57600080fd5b5061044760048036038101906104429190613b85565b610e4d565b60405161045491906147c5565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613b40565b610ea0565b005b34801561049257600080fd5b5061049b610f32565b6040516104a891906147c5565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613b85565b610f7c565b6040516104e591906142e1565b60405180910390f35b3480156104fa57600080fd5b50610515600480360381019061051091906138dd565b610f92565b005b34801561052357600080fd5b5061053e600480360381019061053991906138dd565b611052565b60405161054b91906147c5565b60405180910390f35b34801561056057600080fd5b5061056961113b565b005b34801561057757600080fd5b506105806111c3565b60405161058d91906142e1565b60405180910390f35b3480156105a257600080fd5b506105ab6111ed565b6040516105b891906142e1565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e39190613b85565b611217565b6040516105f591906147aa565b60405180910390f35b34801561060a57600080fd5b5061061361122f565b60405161062091906143a8565b60405180910390f35b610643600480360381019061063e9190613bae565b6112c1565b005b34801561065157600080fd5b5061066c60048036038101906106679190613a0c565b6116e7565b005b34801561067a57600080fd5b5061069560048036038101906106909190613991565b611868565b005b3480156106a357600080fd5b506106be60048036038101906106b991906138dd565b6118c4565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613b85565b611a28565b6040516106f491906143a8565b60405180910390f35b34801561070957600080fd5b50610712611aa4565b60405161071f91906147c5565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190613ac5565b611aaa565b005b34801561075d57600080fd5b5061077860048036038101906107739190613906565b611b43565b6040516107859190614348565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190613a84565b611bd7565b005b3480156107c357600080fd5b506107de60048036038101906107d991906138dd565b611d0e565b005b3480156107ec57600080fd5b50610807600480360381019061080291906138dd565b611e06565b6040516108149190614348565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610960575061095f82611e74565b5b9050919050565b600a60009054906101000a900460ff1681565b60606001805461098990614ae2565b80601f01602080910402602001604051908101604052809291908181526020018280546109b590614ae2565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b5050505050905090565b6000610a1782611ede565b610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d9061476a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9c82610f7c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b049061464a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b2c611eeb565b73ffffffffffffffffffffffffffffffffffffffff161480610b5b5750610b5a81610b55611eeb565b611b43565b5b610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b919061452a565b60405180910390fd5b610ba5838383611ef3565b505050565b60008054905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b610c0a838383611fa5565b505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000610c3a83611052565b8210610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c72906143ea565b60405180910390fd5b6000610c85610baa565b905060008060005b83811015610deb576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d7f57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd75786841415610dc8578195505050505050610e27565b8380610dd390614b45565b9450505b508080610de390614b45565b915050610c8d565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e9061470a565b60405180910390fd5b92915050565b610e4883838360405180602001604052806000815250611868565b505050565b6000610e57610baa565b8210610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f9061448a565b60405180910390fd5b819050919050565b610ea8611eeb565b73ffffffffffffffffffffffffffffffffffffffff16610ec66111ed565b73ffffffffffffffffffffffffffffffffffffffff1614610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f13906145aa565b60405180910390fd5b8181600b9190610f2d929190613605565b505050565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905090565b6000610f878261254c565b600001519050919050565b610f9a611eeb565b73ffffffffffffffffffffffffffffffffffffffff16610fb86111ed565b73ffffffffffffffffffffffffffffffffffffffff161461100e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611005906145aa565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ba9061454a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611143611eeb565b73ffffffffffffffffffffffffffffffffffffffff166111616111ed565b73ffffffffffffffffffffffffffffffffffffffff16146111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae906145aa565b60405180910390fd5b6111c160006126a7565b565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61121f61368b565b6112288261254c565b9050919050565b60606002805461123e90614ae2565b80601f016020809104026020016040519081016040528092919081815260200182805461126a90614ae2565b80156112b75780601f1061128c576101008083540402835291602001916112b7565b820191906000526020600020905b81548152906001019060200180831161129a57829003601f168201915b5050505050905090565b823373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112fa57600080fd5b60085481111561133f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113369061474a565b60405180910390fd5b6105dc61134a610baa565b8201111561138d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611384906145ea565b60405180910390fd5b600a60009054906101000a900460ff166113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d39061472a565b60405180910390fd5b611406336040516020016113f09190614271565b604051602081830303815290604052848461276d565b611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906146ca565b60405180910390fd5b600954600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485611491610baa565b010311156114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb9061478a565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156115ba57600284600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001540111156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac9061450a565b60405180910390fd5b611643565b600184600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154011115611642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611639906144aa565b60405180910390fd5b5b83600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546116919190614900565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506116e1338561282e565b50505050565b6116ef611eeb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117549061460a565b60405180910390fd5b806006600061176a611eeb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611817611eeb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161185c9190614348565b60405180910390a35050565b611873848484611fa5565b61187f8484848461284c565b6118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59061468a565b60405180910390fd5b50505050565b6118cc611eeb565b73ffffffffffffffffffffffffffffffffffffffff166118ea6111ed565b73ffffffffffffffffffffffffffffffffffffffff1614611940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611937906145aa565b60405180910390fd5b600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c49061440a565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060611a3382611ede565b611a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a69906145ca565b60405180910390fd5b600b611a7d836129e3565b604051602001611a8e92919061428c565b6040516020818303038152906040529050919050565b6105dc81565b611ab2611eeb565b73ffffffffffffffffffffffffffffffffffffffff16611ad06111ed565b73ffffffffffffffffffffffffffffffffffffffff1614611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d906145aa565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bdf611eeb565b73ffffffffffffffffffffffffffffffffffffffff16611bfd6111ed565b73ffffffffffffffffffffffffffffffffffffffff1614611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a906145aa565b60405180910390fd5b60005b8151811015611d0a576001600e6000848481518110611c9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611d0290614b45565b915050611c56565b5050565b611d16611eeb565b73ffffffffffffffffffffffffffffffffffffffff16611d346111ed565b73ffffffffffffffffffffffffffffffffffffffff1614611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d81906145aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df19061444a565b60405180910390fd5b611e03816126a7565b50565b600060011515600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611e6a5760019050611e6f565b600090505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611fb08261254c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611fd7611eeb565b73ffffffffffffffffffffffffffffffffffffffff1614806120335750611ffc611eeb565b73ffffffffffffffffffffffffffffffffffffffff1661201b84610a0c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061204f575061204e8260000151612049611eeb565b611b43565b5b905080612091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120889061462a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa9061458a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a906144ca565b60405180910390fd5b6121808585856001612b90565b6121906000848460000151611ef3565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846123969190614900565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124dc5761240c81611ede565b156124db576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125448686866001612b96565b505050505050565b61255461368b565b61255d82611ede565b61259c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125939061446a565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461268e5780925050506126a2565b50808061269a90614ab8565b9150506125a2565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661280e84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128008780519060200120612b9c565b612bcc90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161490509392505050565b612848828260405180602001604052806000815250612bf3565b5050565b600061286d8473ffffffffffffffffffffffffffffffffffffffff166130b2565b156129d6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612896611eeb565b8786866040518563ffffffff1660e01b81526004016128b894939291906142fc565b602060405180830381600087803b1580156128d257600080fd5b505af192505050801561290357506040513d601f19601f820116820180604052508101906129009190613b17565b60015b612986573d8060008114612933576040519150601f19603f3d011682016040523d82523d6000602084013e612938565b606091505b5060008151141561297e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129759061468a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129db565b600190505b949350505050565b60606000821415612a2b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b8b565b600082905060005b60008214612a5d578080612a4690614b45565b915050600a82612a569190614956565b9150612a33565b60008167ffffffffffffffff811115612a9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ad15781602001600182028036833780820191505090505b5090505b60008514612b8457600182612aea9190614987565b9150600a85612af99190614bbc565b6030612b059190614900565b60f81b818381518110612b41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b7d9190614956565b9450612ad5565b8093505050505b919050565b50505050565b50505050565b600081604051602001612baf91906142bb565b604051602081830303815290604052805190602001209050919050565b6000806000612bdb85856130c5565b91509150612be881613148565b819250505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c60906146ea565b60405180910390fd5b612c7281611ede565b15612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca9906146aa565b60405180910390fd5b60008311612cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cec9061466a565b60405180910390fd5b612d026000858386612b90565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612dff91906148ba565b6fffffffffffffffffffffffffffffffff168152602001858360200151612e2691906148ba565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561309557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613035600088848861284c565b613074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306b9061468a565b60405180910390fd5b818061307f90614b45565b925050808061308d90614b45565b915050612fc4565b50806000819055506130aa6000878588612b96565b505050505050565b600080823b905060008111915050919050565b6000806041835114156131075760008060006020860151925060408601519150606086015160001a90506130fb87828585613499565b94509450505050613141565b60408351141561313857600080602085015191506040850151905061312d8683836135a6565b935093505050613141565b60006002915091505b9250929050565b60006004811115613182577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156131bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156131c657613496565b60016004811115613200577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613239577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561327a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613271906143ca565b60405180910390fd5b600260048111156132b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156132ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561332e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133259061442a565b60405180910390fd5b60036004811115613368577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156133a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156133e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d9906144ea565b60405180910390fd5b60048081111561341b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613454577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348c9061456a565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134d457600060039150915061359d565b601b8560ff16141580156134ec5750601c8560ff1614155b156134fe57600060049150915061359d565b6000600187878787604051600081526020016040526040516135239493929190614363565b6020604051602081039080840390855afa158015613545573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135945760006001925092505061359d565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135e99190614900565b90506135f787828885613499565b935093505050935093915050565b82805461361190614ae2565b90600052602060002090601f016020900481019282613633576000855561367a565b82601f1061364c57803560ff191683800117855561367a565b8280016001018555821561367a579182015b8281111561367957823582559160200191906001019061365e565b5b50905061368791906136c5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156136de5760008160009055506001016136c6565b5090565b60006136f56136f084614805565b6147e0565b9050808382526020820190508285602086028201111561371457600080fd5b60005b85811015613744578161372a888261378c565b845260208401935060208301925050600181019050613717565b5050509392505050565b600061376161375c84614831565b6147e0565b90508281526020810184848401111561377957600080fd5b613784848285614a76565b509392505050565b60008135905061379b81615508565b92915050565b600082601f8301126137b257600080fd5b81356137c28482602086016136e2565b91505092915050565b6000813590506137da8161551f565b92915050565b6000813590506137ef81615536565b92915050565b60008151905061380481615536565b92915050565b60008083601f84011261381c57600080fd5b8235905067ffffffffffffffff81111561383557600080fd5b60208301915083600182028301111561384d57600080fd5b9250929050565b600082601f83011261386557600080fd5b813561387584826020860161374e565b91505092915050565b60008083601f84011261389057600080fd5b8235905067ffffffffffffffff8111156138a957600080fd5b6020830191508360018202830111156138c157600080fd5b9250929050565b6000813590506138d78161554d565b92915050565b6000602082840312156138ef57600080fd5b60006138fd8482850161378c565b91505092915050565b6000806040838503121561391957600080fd5b60006139278582860161378c565b92505060206139388582860161378c565b9150509250929050565b60008060006060848603121561395757600080fd5b60006139658682870161378c565b93505060206139768682870161378c565b9250506040613987868287016138c8565b9150509250925092565b600080600080608085870312156139a757600080fd5b60006139b58782880161378c565b94505060206139c68782880161378c565b93505060406139d7878288016138c8565b925050606085013567ffffffffffffffff8111156139f457600080fd5b613a0087828801613854565b91505092959194509250565b60008060408385031215613a1f57600080fd5b6000613a2d8582860161378c565b9250506020613a3e858286016137cb565b9150509250929050565b60008060408385031215613a5b57600080fd5b6000613a698582860161378c565b9250506020613a7a858286016138c8565b9150509250929050565b600060208284031215613a9657600080fd5b600082013567ffffffffffffffff811115613ab057600080fd5b613abc848285016137a1565b91505092915050565b600060208284031215613ad757600080fd5b6000613ae5848285016137cb565b91505092915050565b600060208284031215613b0057600080fd5b6000613b0e848285016137e0565b91505092915050565b600060208284031215613b2957600080fd5b6000613b37848285016137f5565b91505092915050565b60008060208385031215613b5357600080fd5b600083013567ffffffffffffffff811115613b6d57600080fd5b613b798582860161387e565b92509250509250929050565b600060208284031215613b9757600080fd5b6000613ba5848285016138c8565b91505092915050565b600080600060408486031215613bc357600080fd5b6000613bd1868287016138c8565b935050602084013567ffffffffffffffff811115613bee57600080fd5b613bfa8682870161380a565b92509250509250925092565b613c0f816149bb565b82525050565b613c1e816149bb565b82525050565b613c35613c30826149bb565b614b8e565b82525050565b613c44816149cd565b82525050565b613c53816149d9565b82525050565b613c6a613c65826149d9565b614ba0565b82525050565b6000613c7b82614877565b613c85818561488d565b9350613c95818560208601614a85565b613c9e81614ca9565b840191505092915050565b6000613cb482614882565b613cbe818561489e565b9350613cce818560208601614a85565b613cd781614ca9565b840191505092915050565b6000613ced82614882565b613cf781856148af565b9350613d07818560208601614a85565b80840191505092915050565b60008154613d2081614ae2565b613d2a81866148af565b94506001821660008114613d455760018114613d5657613d89565b60ff19831686528186019350613d89565b613d5f85614862565b60005b83811015613d8157815481890152600182019150602081019050613d62565b838801955050505b50505092915050565b6000613d9f60188361489e565b9150613daa82614cc7565b602082019050919050565b6000613dc260228361489e565b9150613dcd82614cf0565b604082019050919050565b6000613de5602b8361489e565b9150613df082614d3f565b604082019050919050565b6000613e08601f8361489e565b9150613e1382614d8e565b602082019050919050565b6000613e2b601c836148af565b9150613e3682614db7565b601c82019050919050565b6000613e4e60268361489e565b9150613e5982614de0565b604082019050919050565b6000613e71602a8361489e565b9150613e7c82614e2f565b604082019050919050565b6000613e9460238361489e565b9150613e9f82614e7e565b604082019050919050565b6000613eb7601b8361489e565b9150613ec282614ecd565b602082019050919050565b6000613eda60258361489e565b9150613ee582614ef6565b604082019050919050565b6000613efd60228361489e565b9150613f0882614f45565b604082019050919050565b6000613f20601c8361489e565b9150613f2b82614f94565b602082019050919050565b6000613f4360398361489e565b9150613f4e82614fbd565b604082019050919050565b6000613f66602b8361489e565b9150613f718261500c565b604082019050919050565b6000613f8960228361489e565b9150613f948261505b565b604082019050919050565b6000613fac60268361489e565b9150613fb7826150aa565b604082019050919050565b6000613fcf6005836148af565b9150613fda826150f9565b600582019050919050565b6000613ff260208361489e565b9150613ffd82615122565b602082019050919050565b6000614015602f8361489e565b91506140208261514b565b604082019050919050565b600061403860188361489e565b91506140438261519a565b602082019050919050565b600061405b601a8361489e565b9150614066826151c3565b602082019050919050565b600061407e60328361489e565b9150614089826151ec565b604082019050919050565b60006140a160228361489e565b91506140ac8261523b565b604082019050919050565b60006140c460238361489e565b91506140cf8261528a565b604082019050919050565b60006140e760338361489e565b91506140f2826152d9565b604082019050919050565b600061410a601d8361489e565b915061411582615328565b602082019050919050565b600061412d601a8361489e565b915061413882615351565b602082019050919050565b600061415060218361489e565b915061415b8261537a565b604082019050919050565b6000614173602e8361489e565b915061417e826153c9565b604082019050919050565b600061419660148361489e565b91506141a182615418565b602082019050919050565b60006141b960258361489e565b91506141c482615441565b604082019050919050565b60006141dc602d8361489e565b91506141e782615490565b604082019050919050565b60006141ff60208361489e565b915061420a826154df565b602082019050919050565b60408201600082015161422b6000850182613c06565b50602082015161423e6020850182614253565b50505050565b61424d81614a4b565b82525050565b61425c81614a55565b82525050565b61426b81614a69565b82525050565b600061427d8284613c24565b60148201915081905092915050565b60006142988285613d13565b91506142a48284613ce2565b91506142af82613fc2565b91508190509392505050565b60006142c682613e1e565b91506142d28284613c59565b60208201915081905092915050565b60006020820190506142f66000830184613c15565b92915050565b60006080820190506143116000830187613c15565b61431e6020830186613c15565b61432b6040830185614244565b818103606083015261433d8184613c70565b905095945050505050565b600060208201905061435d6000830184613c3b565b92915050565b60006080820190506143786000830187613c4a565b6143856020830186614262565b6143926040830185613c4a565b61439f6060830184613c4a565b95945050505050565b600060208201905081810360008301526143c28184613ca9565b905092915050565b600060208201905081810360008301526143e381613d92565b9050919050565b6000602082019050818103600083015261440381613db5565b9050919050565b6000602082019050818103600083015261442381613dd8565b9050919050565b6000602082019050818103600083015261444381613dfb565b9050919050565b6000602082019050818103600083015261446381613e41565b9050919050565b6000602082019050818103600083015261448381613e64565b9050919050565b600060208201905081810360008301526144a381613e87565b9050919050565b600060208201905081810360008301526144c381613eaa565b9050919050565b600060208201905081810360008301526144e381613ecd565b9050919050565b6000602082019050818103600083015261450381613ef0565b9050919050565b6000602082019050818103600083015261452381613f13565b9050919050565b6000602082019050818103600083015261454381613f36565b9050919050565b6000602082019050818103600083015261456381613f59565b9050919050565b6000602082019050818103600083015261458381613f7c565b9050919050565b600060208201905081810360008301526145a381613f9f565b9050919050565b600060208201905081810360008301526145c381613fe5565b9050919050565b600060208201905081810360008301526145e381614008565b9050919050565b600060208201905081810360008301526146038161402b565b9050919050565b600060208201905081810360008301526146238161404e565b9050919050565b6000602082019050818103600083015261464381614071565b9050919050565b6000602082019050818103600083015261466381614094565b9050919050565b60006020820190508181036000830152614683816140b7565b9050919050565b600060208201905081810360008301526146a3816140da565b9050919050565b600060208201905081810360008301526146c3816140fd565b9050919050565b600060208201905081810360008301526146e381614120565b9050919050565b6000602082019050818103600083015261470381614143565b9050919050565b6000602082019050818103600083015261472381614166565b9050919050565b6000602082019050818103600083015261474381614189565b9050919050565b60006020820190508181036000830152614763816141ac565b9050919050565b60006020820190508181036000830152614783816141cf565b9050919050565b600060208201905081810360008301526147a3816141f2565b9050919050565b60006040820190506147bf6000830184614215565b92915050565b60006020820190506147da6000830184614244565b92915050565b60006147ea6147fb565b90506147f68282614b14565b919050565b6000604051905090565b600067ffffffffffffffff8211156148205761481f614c7a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561484c5761484b614c7a565b5b61485582614ca9565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148c582614a0f565b91506148d083614a0f565b9250826fffffffffffffffffffffffffffffffff038211156148f5576148f4614bed565b5b828201905092915050565b600061490b82614a4b565b915061491683614a4b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561494b5761494a614bed565b5b828201905092915050565b600061496182614a4b565b915061496c83614a4b565b92508261497c5761497b614c1c565b5b828204905092915050565b600061499282614a4b565b915061499d83614a4b565b9250828210156149b0576149af614bed565b5b828203905092915050565b60006149c682614a2b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614aa3578082015181840152602081019050614a88565b83811115614ab2576000848401525b50505050565b6000614ac382614a4b565b91506000821415614ad757614ad6614bed565b5b600182039050919050565b60006002820490506001821680614afa57607f821691505b60208210811415614b0e57614b0d614c4b565b5b50919050565b614b1d82614ca9565b810181811067ffffffffffffffff82111715614b3c57614b3b614c7a565b5b80604052505050565b6000614b5082614a4b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b8357614b82614bed565b5b600182019050919050565b6000614b9982614baa565b9050919050565b6000819050919050565b6000614bb582614cba565b9050919050565b6000614bc782614a4b565b9150614bd283614a4b565b925082614be257614be1614c1c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4164647265737320697320616c72656164792077686974656c6973746564206660008201527f6f722032206d696e74732e000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2031204e46542e0000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2032204e4654732e00000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420776f756c642065786365656420737570706c790000000000000000600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f496e76616c6964207369676e61747572652070726f7669646564000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b7f4e756d62657220746f206d696e742065786365656473206d6178696d756d207060008201527f6572207478000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f43616e2774206d696e742074686174206d616e7920696e207072652d73616c65600082015250565b615511816149bb565b811461551c57600080fd5b50565b615528816149cd565b811461553357600080fd5b50565b61553f816149e3565b811461554a57600080fd5b50565b61555681614a4b565b811461556157600080fd5b5056fea264697066735822122065e45794ff4f3ad7bba610e7d0e793834817312673d2f8797fab2477082926d464736f6c63430008020033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c806370a082311161010d578063b88d4fde116100a0578063df74a9981161006f578063df74a99814610728578063e985e9c514610751578063ece0a9501461078e578063f2fde38b146107b7578063f9edfdb3146107e0576101ee565b8063b88d4fde1461066e578063c859fd1714610697578063c87b56dd146106c0578063d5abeb01146106fd576101ee565b80639231ab2a116100dc5780639231ab2a146105c157806395d89b41146105fe5780639e852f7514610629578063a22cb46514610645576101ee565b806370a0823114610517578063715018a6146105545780637ac3c02f1461056b5780638da5cb5b14610596576101ee565b80632b3a01151161018557806355f804b31161015457806355f804b31461045d57806359c819d3146104865780636352211e146104b15780636c19e783146104ee576101ee565b80632b3a01151461037d5780632f745c59146103ba57806342842e0e146103f75780634f6ccce714610420576101ee565b8063095ea7b3116101c1578063095ea7b3146102c357806318160ddd146102ec5780631c26c0641461031757806323b872dd14610354576101ee565b806301ffc9a7146101f3578063040786e11461023057806306fdde031461025b578063081812fc14610286575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190613aee565b61081d565b6040516102279190614348565b60405180910390f35b34801561023c57600080fd5b50610245610967565b6040516102529190614348565b60405180910390f35b34801561026757600080fd5b5061027061097a565b60405161027d91906143a8565b60405180910390f35b34801561029257600080fd5b506102ad60048036038101906102a89190613b85565b610a0c565b6040516102ba91906142e1565b60405180910390f35b3480156102cf57600080fd5b506102ea60048036038101906102e59190613a48565b610a91565b005b3480156102f857600080fd5b50610301610baa565b60405161030e91906147c5565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906138dd565b610bb3565b60405161034b91906147c5565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190613942565b610bff565b005b34801561038957600080fd5b506103a4600480360381019061039f91906138dd565b610c0f565b6040516103b19190614348565b60405180910390f35b3480156103c657600080fd5b506103e160048036038101906103dc9190613a48565b610c2f565b6040516103ee91906147c5565b60405180910390f35b34801561040357600080fd5b5061041e60048036038101906104199190613942565b610e2d565b005b34801561042c57600080fd5b5061044760048036038101906104429190613b85565b610e4d565b60405161045491906147c5565b60405180910390f35b34801561046957600080fd5b50610484600480360381019061047f9190613b40565b610ea0565b005b34801561049257600080fd5b5061049b610f32565b6040516104a891906147c5565b60405180910390f35b3480156104bd57600080fd5b506104d860048036038101906104d39190613b85565b610f7c565b6040516104e591906142e1565b60405180910390f35b3480156104fa57600080fd5b50610515600480360381019061051091906138dd565b610f92565b005b34801561052357600080fd5b5061053e600480360381019061053991906138dd565b611052565b60405161054b91906147c5565b60405180910390f35b34801561056057600080fd5b5061056961113b565b005b34801561057757600080fd5b506105806111c3565b60405161058d91906142e1565b60405180910390f35b3480156105a257600080fd5b506105ab6111ed565b6040516105b891906142e1565b60405180910390f35b3480156105cd57600080fd5b506105e860048036038101906105e39190613b85565b611217565b6040516105f591906147aa565b60405180910390f35b34801561060a57600080fd5b5061061361122f565b60405161062091906143a8565b60405180910390f35b610643600480360381019061063e9190613bae565b6112c1565b005b34801561065157600080fd5b5061066c60048036038101906106679190613a0c565b6116e7565b005b34801561067a57600080fd5b5061069560048036038101906106909190613991565b611868565b005b3480156106a357600080fd5b506106be60048036038101906106b991906138dd565b6118c4565b005b3480156106cc57600080fd5b506106e760048036038101906106e29190613b85565b611a28565b6040516106f491906143a8565b60405180910390f35b34801561070957600080fd5b50610712611aa4565b60405161071f91906147c5565b60405180910390f35b34801561073457600080fd5b5061074f600480360381019061074a9190613ac5565b611aaa565b005b34801561075d57600080fd5b5061077860048036038101906107739190613906565b611b43565b6040516107859190614348565b60405180910390f35b34801561079a57600080fd5b506107b560048036038101906107b09190613a84565b611bd7565b005b3480156107c357600080fd5b506107de60048036038101906107d991906138dd565b611d0e565b005b3480156107ec57600080fd5b50610807600480360381019061080291906138dd565b611e06565b6040516108149190614348565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108e857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061095057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610960575061095f82611e74565b5b9050919050565b600a60009054906101000a900460ff1681565b60606001805461098990614ae2565b80601f01602080910402602001604051908101604052809291908181526020018280546109b590614ae2565b8015610a025780601f106109d757610100808354040283529160200191610a02565b820191906000526020600020905b8154815290600101906020018083116109e557829003601f168201915b5050505050905090565b6000610a1782611ede565b610a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4d9061476a565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9c82610f7c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b049061464a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b2c611eeb565b73ffffffffffffffffffffffffffffffffffffffff161480610b5b5750610b5a81610b55611eeb565b611b43565b5b610b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b919061452a565b60405180910390fd5b610ba5838383611ef3565b505050565b60008054905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b610c0a838383611fa5565b505050565b600e6020528060005260406000206000915054906101000a900460ff1681565b6000610c3a83611052565b8210610c7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c72906143ea565b60405180910390fd5b6000610c85610baa565b905060008060005b83811015610deb576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610d7f57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610dd75786841415610dc8578195505050505050610e27565b8380610dd390614b45565b9450505b508080610de390614b45565b915050610c8d565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1e9061470a565b60405180910390fd5b92915050565b610e4883838360405180602001604052806000815250611868565b505050565b6000610e57610baa565b8210610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f9061448a565b60405180910390fd5b819050919050565b610ea8611eeb565b73ffffffffffffffffffffffffffffffffffffffff16610ec66111ed565b73ffffffffffffffffffffffffffffffffffffffff1614610f1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f13906145aa565b60405180910390fd5b8181600b9190610f2d929190613605565b505050565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905090565b6000610f878261254c565b600001519050919050565b610f9a611eeb565b73ffffffffffffffffffffffffffffffffffffffff16610fb86111ed565b73ffffffffffffffffffffffffffffffffffffffff161461100e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611005906145aa565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ba9061454a565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611143611eeb565b73ffffffffffffffffffffffffffffffffffffffff166111616111ed565b73ffffffffffffffffffffffffffffffffffffffff16146111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae906145aa565b60405180910390fd5b6111c160006126a7565b565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61121f61368b565b6112288261254c565b9050919050565b60606002805461123e90614ae2565b80601f016020809104026020016040519081016040528092919081815260200182805461126a90614ae2565b80156112b75780601f1061128c576101008083540402835291602001916112b7565b820191906000526020600020905b81548152906001019060200180831161129a57829003601f168201915b5050505050905090565b823373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146112fa57600080fd5b60085481111561133f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113369061474a565b60405180910390fd5b6105dc61134a610baa565b8201111561138d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611384906145ea565b60405180910390fd5b600a60009054906101000a900460ff166113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d39061472a565b60405180910390fd5b611406336040516020016113f09190614271565b604051602081830303815290604052848461276d565b611445576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143c906146ca565b60405180910390fd5b600954600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485611491610baa565b010311156114d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114cb9061478a565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514156115ba57600284600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001540111156115b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ac9061450a565b60405180910390fd5b611643565b600184600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154011115611642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611639906144aa565b60405180910390fd5b5b83600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546116919190614900565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506116e1338561282e565b50505050565b6116ef611eeb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561175d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117549061460a565b60405180910390fd5b806006600061176a611eeb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611817611eeb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161185c9190614348565b60405180910390a35050565b611873848484611fa5565b61187f8484848461284c565b6118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b59061468a565b60405180910390fd5b50505050565b6118cc611eeb565b73ffffffffffffffffffffffffffffffffffffffff166118ea6111ed565b73ffffffffffffffffffffffffffffffffffffffff1614611940576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611937906145aa565b60405180910390fd5b600e60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156119cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c49061440a565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6060611a3382611ede565b611a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a69906145ca565b60405180910390fd5b600b611a7d836129e3565b604051602001611a8e92919061428c565b6040516020818303038152906040529050919050565b6105dc81565b611ab2611eeb565b73ffffffffffffffffffffffffffffffffffffffff16611ad06111ed565b73ffffffffffffffffffffffffffffffffffffffff1614611b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1d906145aa565b60405180910390fd5b80600a60006101000a81548160ff02191690831515021790555050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611bdf611eeb565b73ffffffffffffffffffffffffffffffffffffffff16611bfd6111ed565b73ffffffffffffffffffffffffffffffffffffffff1614611c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4a906145aa565b60405180910390fd5b60005b8151811015611d0a576001600e6000848481518110611c9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611d0290614b45565b915050611c56565b5050565b611d16611eeb565b73ffffffffffffffffffffffffffffffffffffffff16611d346111ed565b73ffffffffffffffffffffffffffffffffffffffff1614611d8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d81906145aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df19061444a565b60405180910390fd5b611e03816126a7565b50565b600060011515600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151415611e6a5760019050611e6f565b600090505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611fb08261254c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611fd7611eeb565b73ffffffffffffffffffffffffffffffffffffffff1614806120335750611ffc611eeb565b73ffffffffffffffffffffffffffffffffffffffff1661201b84610a0c565b73ffffffffffffffffffffffffffffffffffffffff16145b8061204f575061204e8260000151612049611eeb565b611b43565b5b905080612091576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120889061462a565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612103576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120fa9061458a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216a906144ca565b60405180910390fd5b6121808585856001612b90565b6121906000848460000151611ef3565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846123969190614900565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124dc5761240c81611ede565b156124db576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125448686866001612b96565b505050505050565b61255461368b565b61255d82611ede565b61259c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125939061446a565b60405180910390fd5b60008290505b6000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461268e5780925050506126a2565b50808061269a90614ab8565b9150506125a2565b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661280e84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506128008780519060200120612b9c565b612bcc90919063ffffffff16565b73ffffffffffffffffffffffffffffffffffffffff161490509392505050565b612848828260405180602001604052806000815250612bf3565b5050565b600061286d8473ffffffffffffffffffffffffffffffffffffffff166130b2565b156129d6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612896611eeb565b8786866040518563ffffffff1660e01b81526004016128b894939291906142fc565b602060405180830381600087803b1580156128d257600080fd5b505af192505050801561290357506040513d601f19601f820116820180604052508101906129009190613b17565b60015b612986573d8060008114612933576040519150601f19603f3d011682016040523d82523d6000602084013e612938565b606091505b5060008151141561297e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129759061468a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129db565b600190505b949350505050565b60606000821415612a2b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b8b565b600082905060005b60008214612a5d578080612a4690614b45565b915050600a82612a569190614956565b9150612a33565b60008167ffffffffffffffff811115612a9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612ad15781602001600182028036833780820191505090505b5090505b60008514612b8457600182612aea9190614987565b9150600a85612af99190614bbc565b6030612b059190614900565b60f81b818381518110612b41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b7d9190614956565b9450612ad5565b8093505050505b919050565b50505050565b50505050565b600081604051602001612baf91906142bb565b604051602081830303815290604052805190602001209050919050565b6000806000612bdb85856130c5565b91509150612be881613148565b819250505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c60906146ea565b60405180910390fd5b612c7281611ede565b15612cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ca9906146aa565b60405180910390fd5b60008311612cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cec9061466a565b60405180910390fd5b612d026000858386612b90565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612dff91906148ba565b6fffffffffffffffffffffffffffffffff168152602001858360200151612e2691906148ba565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b8581101561309557818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613035600088848861284c565b613074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306b9061468a565b60405180910390fd5b818061307f90614b45565b925050808061308d90614b45565b915050612fc4565b50806000819055506130aa6000878588612b96565b505050505050565b600080823b905060008111915050919050565b6000806041835114156131075760008060006020860151925060408601519150606086015160001a90506130fb87828585613499565b94509450505050613141565b60408351141561313857600080602085015191506040850151905061312d8683836135a6565b935093505050613141565b60006002915091505b9250929050565b60006004811115613182577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156131bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156131c657613496565b60016004811115613200577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613239577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561327a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613271906143ca565b60405180910390fd5b600260048111156132b4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156132ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b141561332e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133259061442a565b60405180910390fd5b60036004811115613368577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b8160048111156133a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14156133e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133d9906144ea565b60405180910390fd5b60048081111561341b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115613454577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415613495576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348c9061456a565b60405180910390fd5b5b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134d457600060039150915061359d565b601b8560ff16141580156134ec5750601c8560ff1614155b156134fe57600060049150915061359d565b6000600187878787604051600081526020016040526040516135239493929190614363565b6020604051602081039080840390855afa158015613545573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135945760006001925092505061359d565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135e99190614900565b90506135f787828885613499565b935093505050935093915050565b82805461361190614ae2565b90600052602060002090601f016020900481019282613633576000855561367a565b82601f1061364c57803560ff191683800117855561367a565b8280016001018555821561367a579182015b8281111561367957823582559160200191906001019061365e565b5b50905061368791906136c5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156136de5760008160009055506001016136c6565b5090565b60006136f56136f084614805565b6147e0565b9050808382526020820190508285602086028201111561371457600080fd5b60005b85811015613744578161372a888261378c565b845260208401935060208301925050600181019050613717565b5050509392505050565b600061376161375c84614831565b6147e0565b90508281526020810184848401111561377957600080fd5b613784848285614a76565b509392505050565b60008135905061379b81615508565b92915050565b600082601f8301126137b257600080fd5b81356137c28482602086016136e2565b91505092915050565b6000813590506137da8161551f565b92915050565b6000813590506137ef81615536565b92915050565b60008151905061380481615536565b92915050565b60008083601f84011261381c57600080fd5b8235905067ffffffffffffffff81111561383557600080fd5b60208301915083600182028301111561384d57600080fd5b9250929050565b600082601f83011261386557600080fd5b813561387584826020860161374e565b91505092915050565b60008083601f84011261389057600080fd5b8235905067ffffffffffffffff8111156138a957600080fd5b6020830191508360018202830111156138c157600080fd5b9250929050565b6000813590506138d78161554d565b92915050565b6000602082840312156138ef57600080fd5b60006138fd8482850161378c565b91505092915050565b6000806040838503121561391957600080fd5b60006139278582860161378c565b92505060206139388582860161378c565b9150509250929050565b60008060006060848603121561395757600080fd5b60006139658682870161378c565b93505060206139768682870161378c565b9250506040613987868287016138c8565b9150509250925092565b600080600080608085870312156139a757600080fd5b60006139b58782880161378c565b94505060206139c68782880161378c565b93505060406139d7878288016138c8565b925050606085013567ffffffffffffffff8111156139f457600080fd5b613a0087828801613854565b91505092959194509250565b60008060408385031215613a1f57600080fd5b6000613a2d8582860161378c565b9250506020613a3e858286016137cb565b9150509250929050565b60008060408385031215613a5b57600080fd5b6000613a698582860161378c565b9250506020613a7a858286016138c8565b9150509250929050565b600060208284031215613a9657600080fd5b600082013567ffffffffffffffff811115613ab057600080fd5b613abc848285016137a1565b91505092915050565b600060208284031215613ad757600080fd5b6000613ae5848285016137cb565b91505092915050565b600060208284031215613b0057600080fd5b6000613b0e848285016137e0565b91505092915050565b600060208284031215613b2957600080fd5b6000613b37848285016137f5565b91505092915050565b60008060208385031215613b5357600080fd5b600083013567ffffffffffffffff811115613b6d57600080fd5b613b798582860161387e565b92509250509250929050565b600060208284031215613b9757600080fd5b6000613ba5848285016138c8565b91505092915050565b600080600060408486031215613bc357600080fd5b6000613bd1868287016138c8565b935050602084013567ffffffffffffffff811115613bee57600080fd5b613bfa8682870161380a565b92509250509250925092565b613c0f816149bb565b82525050565b613c1e816149bb565b82525050565b613c35613c30826149bb565b614b8e565b82525050565b613c44816149cd565b82525050565b613c53816149d9565b82525050565b613c6a613c65826149d9565b614ba0565b82525050565b6000613c7b82614877565b613c85818561488d565b9350613c95818560208601614a85565b613c9e81614ca9565b840191505092915050565b6000613cb482614882565b613cbe818561489e565b9350613cce818560208601614a85565b613cd781614ca9565b840191505092915050565b6000613ced82614882565b613cf781856148af565b9350613d07818560208601614a85565b80840191505092915050565b60008154613d2081614ae2565b613d2a81866148af565b94506001821660008114613d455760018114613d5657613d89565b60ff19831686528186019350613d89565b613d5f85614862565b60005b83811015613d8157815481890152600182019150602081019050613d62565b838801955050505b50505092915050565b6000613d9f60188361489e565b9150613daa82614cc7565b602082019050919050565b6000613dc260228361489e565b9150613dcd82614cf0565b604082019050919050565b6000613de5602b8361489e565b9150613df082614d3f565b604082019050919050565b6000613e08601f8361489e565b9150613e1382614d8e565b602082019050919050565b6000613e2b601c836148af565b9150613e3682614db7565b601c82019050919050565b6000613e4e60268361489e565b9150613e5982614de0565b604082019050919050565b6000613e71602a8361489e565b9150613e7c82614e2f565b604082019050919050565b6000613e9460238361489e565b9150613e9f82614e7e565b604082019050919050565b6000613eb7601b8361489e565b9150613ec282614ecd565b602082019050919050565b6000613eda60258361489e565b9150613ee582614ef6565b604082019050919050565b6000613efd60228361489e565b9150613f0882614f45565b604082019050919050565b6000613f20601c8361489e565b9150613f2b82614f94565b602082019050919050565b6000613f4360398361489e565b9150613f4e82614fbd565b604082019050919050565b6000613f66602b8361489e565b9150613f718261500c565b604082019050919050565b6000613f8960228361489e565b9150613f948261505b565b604082019050919050565b6000613fac60268361489e565b9150613fb7826150aa565b604082019050919050565b6000613fcf6005836148af565b9150613fda826150f9565b600582019050919050565b6000613ff260208361489e565b9150613ffd82615122565b602082019050919050565b6000614015602f8361489e565b91506140208261514b565b604082019050919050565b600061403860188361489e565b91506140438261519a565b602082019050919050565b600061405b601a8361489e565b9150614066826151c3565b602082019050919050565b600061407e60328361489e565b9150614089826151ec565b604082019050919050565b60006140a160228361489e565b91506140ac8261523b565b604082019050919050565b60006140c460238361489e565b91506140cf8261528a565b604082019050919050565b60006140e760338361489e565b91506140f2826152d9565b604082019050919050565b600061410a601d8361489e565b915061411582615328565b602082019050919050565b600061412d601a8361489e565b915061413882615351565b602082019050919050565b600061415060218361489e565b915061415b8261537a565b604082019050919050565b6000614173602e8361489e565b915061417e826153c9565b604082019050919050565b600061419660148361489e565b91506141a182615418565b602082019050919050565b60006141b960258361489e565b91506141c482615441565b604082019050919050565b60006141dc602d8361489e565b91506141e782615490565b604082019050919050565b60006141ff60208361489e565b915061420a826154df565b602082019050919050565b60408201600082015161422b6000850182613c06565b50602082015161423e6020850182614253565b50505050565b61424d81614a4b565b82525050565b61425c81614a55565b82525050565b61426b81614a69565b82525050565b600061427d8284613c24565b60148201915081905092915050565b60006142988285613d13565b91506142a48284613ce2565b91506142af82613fc2565b91508190509392505050565b60006142c682613e1e565b91506142d28284613c59565b60208201915081905092915050565b60006020820190506142f66000830184613c15565b92915050565b60006080820190506143116000830187613c15565b61431e6020830186613c15565b61432b6040830185614244565b818103606083015261433d8184613c70565b905095945050505050565b600060208201905061435d6000830184613c3b565b92915050565b60006080820190506143786000830187613c4a565b6143856020830186614262565b6143926040830185613c4a565b61439f6060830184613c4a565b95945050505050565b600060208201905081810360008301526143c28184613ca9565b905092915050565b600060208201905081810360008301526143e381613d92565b9050919050565b6000602082019050818103600083015261440381613db5565b9050919050565b6000602082019050818103600083015261442381613dd8565b9050919050565b6000602082019050818103600083015261444381613dfb565b9050919050565b6000602082019050818103600083015261446381613e41565b9050919050565b6000602082019050818103600083015261448381613e64565b9050919050565b600060208201905081810360008301526144a381613e87565b9050919050565b600060208201905081810360008301526144c381613eaa565b9050919050565b600060208201905081810360008301526144e381613ecd565b9050919050565b6000602082019050818103600083015261450381613ef0565b9050919050565b6000602082019050818103600083015261452381613f13565b9050919050565b6000602082019050818103600083015261454381613f36565b9050919050565b6000602082019050818103600083015261456381613f59565b9050919050565b6000602082019050818103600083015261458381613f7c565b9050919050565b600060208201905081810360008301526145a381613f9f565b9050919050565b600060208201905081810360008301526145c381613fe5565b9050919050565b600060208201905081810360008301526145e381614008565b9050919050565b600060208201905081810360008301526146038161402b565b9050919050565b600060208201905081810360008301526146238161404e565b9050919050565b6000602082019050818103600083015261464381614071565b9050919050565b6000602082019050818103600083015261466381614094565b9050919050565b60006020820190508181036000830152614683816140b7565b9050919050565b600060208201905081810360008301526146a3816140da565b9050919050565b600060208201905081810360008301526146c3816140fd565b9050919050565b600060208201905081810360008301526146e381614120565b9050919050565b6000602082019050818103600083015261470381614143565b9050919050565b6000602082019050818103600083015261472381614166565b9050919050565b6000602082019050818103600083015261474381614189565b9050919050565b60006020820190508181036000830152614763816141ac565b9050919050565b60006020820190508181036000830152614783816141cf565b9050919050565b600060208201905081810360008301526147a3816141f2565b9050919050565b60006040820190506147bf6000830184614215565b92915050565b60006020820190506147da6000830184614244565b92915050565b60006147ea6147fb565b90506147f68282614b14565b919050565b6000604051905090565b600067ffffffffffffffff8211156148205761481f614c7a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561484c5761484b614c7a565b5b61485582614ca9565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006148c582614a0f565b91506148d083614a0f565b9250826fffffffffffffffffffffffffffffffff038211156148f5576148f4614bed565b5b828201905092915050565b600061490b82614a4b565b915061491683614a4b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561494b5761494a614bed565b5b828201905092915050565b600061496182614a4b565b915061496c83614a4b565b92508261497c5761497b614c1c565b5b828204905092915050565b600061499282614a4b565b915061499d83614a4b565b9250828210156149b0576149af614bed565b5b828203905092915050565b60006149c682614a2b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614aa3578082015181840152602081019050614a88565b83811115614ab2576000848401525b50505050565b6000614ac382614a4b565b91506000821415614ad757614ad6614bed565b5b600182039050919050565b60006002820490506001821680614afa57607f821691505b60208210811415614b0e57614b0d614c4b565b5b50919050565b614b1d82614ca9565b810181811067ffffffffffffffff82111715614b3c57614b3b614c7a565b5b80604052505050565b6000614b5082614a4b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b8357614b82614bed565b5b600182019050919050565b6000614b9982614baa565b9050919050565b6000819050919050565b6000614bb582614cba565b9050919050565b6000614bc782614a4b565b9150614bd283614a4b565b925082614be257614be1614c1c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4164647265737320697320616c72656164792077686974656c6973746564206660008201527f6f722032206d696e74732e000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2031204e46542e0000000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e2774206d696e74206d6f7265207468616e2032204e4654732e00000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d696e7420776f756c642065786365656420737570706c790000000000000000600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f7220300000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f496e76616c6964207369676e61747572652070726f7669646564000000000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f53616c6520686173206e6f742073746172746564000000000000000000000000600082015250565b7f4e756d62657220746f206d696e742065786365656473206d6178696d756d207060008201527f6572207478000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f43616e2774206d696e742074686174206d616e7920696e207072652d73616c65600082015250565b615511816149bb565b811461551c57600080fd5b50565b615528816149cd565b811461553357600080fd5b50565b61553f816149e3565b811461554a57600080fd5b50565b61555681614a4b565b811461556157600080fd5b5056fea264697066735822122065e45794ff4f3ad7bba610e7d0e793834817312673d2f8797fab2477082926d464736f6c63430008020033

Deployed Bytecode Sourcemap

66702:4147:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45331:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67043:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46958:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48519:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48040:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43772:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69011:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49395:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67265:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44436:823;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49628:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43949:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70035:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69155:121;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46767:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70314:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45767:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41222:103;;;;;;;;;;;;;:::i;:::-;;69630:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40571:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69284:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47127:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67774:874;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48805:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49876:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70418:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68746:257;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66865:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70165:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49164:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70639:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41480:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69719:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45331:372;45433:4;45485:25;45470:40;;;:11;:40;;;;:105;;;;45542:33;45527:48;;;:11;:48;;;;45470:105;:172;;;;45607:35;45592:50;;;:11;:50;;;;45470:172;:225;;;;45659:36;45683:11;45659:23;:36::i;:::-;45470:225;45450:245;;45331:372;;;:::o;67043:41::-;;;;;;;;;;;;;:::o;46958:100::-;47012:13;47045:5;47038:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46958:100;:::o;48519:214::-;48587:7;48615:16;48623:7;48615;:16::i;:::-;48607:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;48701:15;:24;48717:7;48701:24;;;;;;;;;;;;;;;;;;;;;48694:31;;48519:214;;;:::o;48040:413::-;48113:13;48129:24;48145:7;48129:15;:24::i;:::-;48113:40;;48178:5;48172:11;;:2;:11;;;;48164:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48273:5;48257:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;48282:37;48299:5;48306:12;:10;:12::i;:::-;48282:16;:37::i;:::-;48257:62;48235:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;48417:28;48426:2;48430:7;48439:5;48417:8;:28::i;:::-;48040:413;;;:::o;43772:100::-;43825:7;43852:12;;43845:19;;43772:100;:::o;69011:136::-;69084:7;69110:12;:22;69123:8;69110:22;;;;;;;;;;;;;;;:29;;;69103:36;;69011:136;;;:::o;49395:162::-;49521:28;49531:4;49537:2;49541:7;49521:9;:28::i;:::-;49395:162;;;:::o;67265:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;44436:823::-;44525:7;44561:16;44571:5;44561:9;:16::i;:::-;44553:5;:24;44545:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44627:22;44652:13;:11;:13::i;:::-;44627:38;;44676:19;44710:25;44764:9;44759:426;44783:14;44779:1;:18;44759:426;;;44819:31;44853:11;:14;44865:1;44853:14;;;;;;;;;;;44819:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44912:1;44886:28;;:9;:14;;;:28;;;44882:103;;44955:9;:14;;;44935:34;;44882:103;45024:5;45003:26;;:17;:26;;;44999:175;;;45069:5;45054:11;:20;45050:77;;;45106:1;45099:8;;;;;;;;;45050:77;45145:13;;;;;:::i;:::-;;;;44999:175;44759:426;44799:3;;;;;:::i;:::-;;;;44759:426;;;;45195:56;;;;;;;;;;:::i;:::-;;;;;;;;44436:823;;;;;:::o;49628:177::-;49758:39;49775:4;49781:2;49785:7;49758:39;;;;;;;;;;;;:16;:39::i;:::-;49628:177;;;:::o;43949:187::-;44016:7;44052:13;:11;:13::i;:::-;44044:5;:21;44036:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44123:5;44116:12;;43949:187;;;:::o;70035:114::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70130:11:::1;;70114:13;:27;;;;;;;:::i;:::-;;70035:114:::0;;:::o;69155:121::-;69211:7;69237:12;:24;69250:10;69237:24;;;;;;;;;;;;;;;:31;;;69230:38;;69155:121;:::o;46767:124::-;46831:7;46858:20;46870:7;46858:11;:20::i;:::-;:25;;;46851:32;;46767:124;;;:::o;70314:96::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70392:10:::1;70383:6;;:19;;;;;;;;;;;;;;;;;;70314:96:::0;:::o;45767:221::-;45831:7;45876:1;45859:19;;:5;:19;;;;45851:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;45952:12;:19;45965:5;45952:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;45944:36;;45937:43;;45767:221;;;:::o;41222:103::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41287:30:::1;41314:1;41287:18;:30::i;:::-;41222:103::o:0;69630:81::-;69671:7;69697:6;;;;;;;;;;;69690:13;;69630:81;:::o;40571:87::-;40617:7;40644:6;;;;;;;;;;;40637:13;;40571:87;:::o;69284:135::-;69350:21;;:::i;:::-;69391:20;69403:7;69391:11;:20::i;:::-;69384:27;;69284:135;;;:::o;47127:104::-;47183:13;47216:7;47209:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47127:104;:::o;67774:874::-;67866:7;67455:10;67442:23;;:9;:23;;;67434:32;;;;;;67500:14;;67489:7;:25;;67481:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;66901:4;67589:13;:11;:13::i;:::-;67579:7;:23;:36;;67571:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;67919:21:::1;;;;;;;;;;;67911:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;67988:56;68021:10;68004:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;68034:9;;67988:15;:56::i;:::-;67980:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;68150:14;;68124:10;:22;68135:10;68124:22;;;;;;;;;;;;;;;;68114:7;68098:13;:11;:13::i;:::-;:23;:48;:66;;68090:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;68251:4;68219:36;;:16;:28;68236:10;68219:28;;;;;;;;;;;;;;;;;;;;;;;;;:36;;;68216:287;;;68328:1;68317:7;68283:12;:24;68296:10;68283:24;;;;;;;;;;;;;;;:31;;;:41;:46;;68275:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;68216:287;;;68454:1;68443:7;68409:12;:24;68422:10;68409:24;;;;;;;;;;;;;;;:31;;;:41;:46;;68401:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;68216:287;68592:7;68558:12;:24;68571:10;68558:24;;;;;;;;;;;;;;;:31;;;:41;;;;:::i;:::-;68524:12;:24;68537:10;68524:24;;;;;;;;;;;;;;;:31;;:75;;;;68610:30;68620:10;68632:7;68610:9;:30::i;:::-;67774:874:::0;;;;:::o;48805:288::-;48912:12;:10;:12::i;:::-;48900:24;;:8;:24;;;;48892:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49013:8;48968:18;:32;48987:12;:10;:12::i;:::-;48968:32;;;;;;;;;;;;;;;:42;49001:8;48968:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;49066:8;49037:48;;49052:12;:10;:12::i;:::-;49037:48;;;49076:8;49037:48;;;;;;:::i;:::-;;;;;;;;48805:288;;:::o;49876:355::-;50035:28;50045:4;50051:2;50055:7;50035:9;:28::i;:::-;50096:48;50119:4;50125:2;50129:7;50138:5;50096:22;:48::i;:::-;50074:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;49876:355;;;;:::o;70418:213::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70505:16:::1;:26;70522:8;70505:26;;;;;;;;;;;;;;;;;;;;;;;;;70504:27;70496:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;70619:4;70590:16;:26;70607:8;70590:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;70418:213:::0;:::o;68746:257::-;68807:13;68841:16;68849:7;68841;:16::i;:::-;68833:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;68951:13;68966:18;:7;:16;:18::i;:::-;68934:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;68920:75;;68746:257;;;:::o;66865:40::-;66901:4;66865:40;:::o;70165:141::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70273:25:::1;70249:21;;:49;;;;;;;;;;;;;;;;;;70165:141:::0;:::o;49164:164::-;49261:4;49285:18;:25;49304:5;49285:25;;;;;;;;;;;;;;;:35;49311:8;49285:35;;;;;;;;;;;;;;;;;;;;;;;;;49278:42;;49164:164;;;;:::o;70639:205::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70733:6:::1;70729:108;70749:10;:17;70745:1;:21;70729:108;;;70821:4;70787:16;:31;70804:10;70815:1;70804:13;;;;;;;;;;;;;;;;;;;;;;70787:31;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;70768:3;;;;;:::i;:::-;;;;70729:108;;;;70639:205:::0;:::o;41480:201::-;40802:12;:10;:12::i;:::-;40791:23;;:7;:5;:7::i;:::-;:23;;;40783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41589:1:::1;41569:22;;:8;:22;;;;41561:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41645:28;41664:8;41645:18;:28::i;:::-;41480:201:::0;:::o;69719:221::-;69798:4;69847;69817:34;;:16;:26;69834:8;69817:26;;;;;;;;;;;;;;;;;;;;;;;;;:34;;;69814:119;;;69874:4;69867:11;;;;69814:119;69916:5;69909:12;;69719:221;;;;:::o;918:157::-;1003:4;1042:25;1027:40;;;:11;:40;;;;1020:47;;918:157;;;:::o;50486:111::-;50543:4;50577:12;;50567:7;:22;50560:29;;50486:111;;;:::o;1648:98::-;1701:7;1728:10;1721:17;;1648:98;:::o;54530:196::-;54672:2;54645:15;:24;54661:7;54645:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54710:7;54706:2;54690:28;;54699:5;54690:28;;;;;;;;;;;;54530:196;;;:::o;52629:1783::-;52744:35;52782:20;52794:7;52782:11;:20::i;:::-;52744:58;;52815:22;52857:13;:18;;;52841:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;52916:12;:10;:12::i;:::-;52892:36;;:20;52904:7;52892:11;:20::i;:::-;:36;;;52841:87;:154;;;;52945:50;52962:13;:18;;;52982:12;:10;:12::i;:::-;52945:16;:50::i;:::-;52841:154;52815:181;;53017:17;53009:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;53132:4;53110:26;;:13;:18;;;:26;;;53102:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53212:1;53198:16;;:2;:16;;;;53190:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;53269:43;53291:4;53297:2;53301:7;53310:1;53269:21;:43::i;:::-;53377:49;53394:1;53398:7;53407:13;:18;;;53377:8;:49::i;:::-;53661:1;53631:12;:18;53644:4;53631:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53705:1;53677:12;:16;53690:2;53677:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53753:43;;;;;;;;53768:2;53753:43;;;;;;53779:15;53753:43;;;;;53730:11;:20;53742:7;53730:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54036:19;54068:1;54058:7;:11;;;;:::i;:::-;54036:33;;54125:1;54084:43;;:11;:24;54096:11;54084:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;54080:227;;;54148:20;54156:11;54148:7;:20::i;:::-;54144:152;;;54216:64;;;;;;;;54231:13;:18;;;54216:64;;;;;;54251:13;:28;;;54216:64;;;;;54189:11;:24;54201:11;54189:24;;;;;;;;;;;:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54144:152;54080:227;54343:7;54339:2;54324:27;;54333:4;54324:27;;;;;;;;;;;;54362:42;54383:4;54389:2;54393:7;54402:1;54362:20;:42::i;:::-;52629:1783;;;;;;:::o;46233:472::-;46294:21;;:::i;:::-;46336:16;46344:7;46336;:16::i;:::-;46328:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;46417:12;46432:7;46417:22;;46412:216;46466:31;46500:11;:17;46512:4;46500:17;;;;;;;;;;;46466:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46562:1;46536:28;;:9;:14;;;:28;;;46532:85;;46592:9;46585:16;;;;;;46532:85;46412:216;46443:6;;;;;:::i;:::-;;;;46412:216;;46233:472;;;;:::o;41841:191::-;41915:16;41934:6;;;;;;;;;;;41915:25;;41960:8;41951:6;;:17;;;;;;;;;;;;;;;;;;42015:8;41984:40;;42005:8;41984:40;;;;;;;;;;;;41841:191;;:::o;69427:195::-;69519:4;69607:6;;;;;;;;;;;69544:69;;:59;69593:9;;69544:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;69554:4;69544:15;;;;;;:38;:40::i;:::-;:48;;:59;;;;:::i;:::-;:69;;;69536:78;;69427:195;;;;;:::o;50605:104::-;50674:27;50684:2;50688:8;50674:27;;;;;;;;;;;;:9;:27::i;:::-;50605:104;;:::o;55291:804::-;55446:4;55467:15;:2;:13;;;:15::i;:::-;55463:625;;;55519:2;55503:36;;;55540:12;:10;:12::i;:::-;55554:4;55560:7;55569:5;55503:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55499:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55766:1;55749:6;:13;:18;55745:273;;;55792:61;;;;;;;;;;:::i;:::-;;;;;;;;55745:273;55968:6;55962:13;55953:6;55949:2;55945:15;55938:38;55499:534;55636:45;;;55626:55;;;:6;:55;;;;55619:62;;;;;55463:625;56072:4;56065:11;;55291:804;;;;;;;:::o;7933:723::-;7989:13;8219:1;8210:5;:10;8206:53;;;8237:10;;;;;;;;;;;;;;;;;;;;;8206:53;8269:12;8284:5;8269:20;;8300:14;8325:78;8340:1;8332:4;:9;8325:78;;8358:8;;;;;:::i;:::-;;;;8389:2;8381:10;;;;;:::i;:::-;;;8325:78;;;8413:19;8445:6;8435:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8413:39;;8463:154;8479:1;8470:5;:10;8463:154;;8507:1;8497:11;;;;;:::i;:::-;;;8574:2;8566:5;:10;;;;:::i;:::-;8553:2;:24;;;;:::i;:::-;8540:39;;8523:6;8530;8523:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;8603:2;8594:11;;;;;:::i;:::-;;;8463:154;;;8641:6;8627:21;;;;;7933:723;;;;:::o;56583:159::-;;;;;:::o;57154:158::-;;;;;:::o;65387:269::-;65456:7;65642:4;65589:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;65579:69;;;;;;65572:76;;65387:269;;;:::o;61585:231::-;61663:7;61684:17;61703:18;61725:27;61736:4;61742:9;61725:10;:27::i;:::-;61683:69;;;;61763:18;61775:5;61763:11;:18::i;:::-;61799:9;61792:16;;;;61585:231;;;;:::o;50986:1389::-;51109:20;51132:12;;51109:35;;51177:1;51163:16;;:2;:16;;;;51155:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51362:21;51370:12;51362:7;:21::i;:::-;51361:22;51353:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;51447:1;51436:8;:12;51428:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;51501:61;51531:1;51535:2;51539:12;51553:8;51501:21;:61::i;:::-;51575:30;51608:12;:16;51621:2;51608:16;;;;;;;;;;;;;;;51575:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51654:135;;;;;;;;51710:8;51680:11;:19;;;:39;;;;:::i;:::-;51654:135;;;;;;51769:8;51734:11;:24;;;:44;;;;:::i;:::-;51654:135;;;;;51635:12;:16;51648:2;51635:16;;;;;;;;;;;;;;;:154;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51828:43;;;;;;;;51843:2;51828:43;;;;;;51854:15;51828:43;;;;;51800:11;:25;51812:12;51800:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51884:20;51907:12;51884:35;;51937:9;51932:325;51956:8;51952:1;:12;51932:325;;;52016:12;52012:2;51991:38;;52008:1;51991:38;;;;;;;;;;;;52070:59;52101:1;52105:2;52109:12;52123:5;52070:22;:59::i;:::-;52044:172;;;;;;;;;;;;:::i;:::-;;;;;;;;;52231:14;;;;;:::i;:::-;;;;51966:3;;;;;:::i;:::-;;;;51932:325;;;;52284:12;52269;:27;;;;52307:60;52336:1;52340:2;52344:12;52358:8;52307:20;:60::i;:::-;50986:1389;;;;;;:::o;31542:387::-;31602:4;31810:12;31877:7;31865:20;31857:28;;31920:1;31913:4;:8;31906:15;;;31542:387;;;:::o;59475:1308::-;59556:7;59565:12;59810:2;59790:9;:16;:22;59786:990;;;59829:9;59853;59877:7;60086:4;60075:9;60071:20;60065:27;60060:32;;60136:4;60125:9;60121:20;60115:27;60110:32;;60194:4;60183:9;60179:20;60173:27;60170:1;60165:36;60160:41;;60237:25;60248:4;60254:1;60257;60260;60237:10;:25::i;:::-;60230:32;;;;;;;;;59786:990;60304:2;60284:9;:16;:22;60280:496;;;60323:9;60347:10;60559:4;60548:9;60544:20;60538:27;60533:32;;60610:4;60599:9;60595:20;60589:27;60583:33;;60652:23;60663:4;60669:1;60672:2;60652:10;:23::i;:::-;60645:30;;;;;;;;60280:496;60724:1;60728:35;60708:56;;;;59475:1308;;;;;;:::o;57746:643::-;57824:20;57815:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;57811:571;;;57861:7;;57811:571;57922:29;57913:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;57909:473;;;57968:34;;;;;;;;;;:::i;:::-;;;;;;;;57909:473;58033:35;58024:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;58020:362;;;58085:41;;;;;;;;;;:::i;:::-;;;;;;;;58020:362;58157:30;58148:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;58144:238;;;58204:44;;;;;;;;;;:::i;:::-;;;;;;;;58144:238;58279:30;58270:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;58266:116;;;58326:44;;;;;;;;;;:::i;:::-;;;;;;;;58266:116;57746:643;;:::o;63037:1632::-;63168:7;63177:12;64102:66;64097:1;64089:10;;:79;64085:163;;;64201:1;64205:30;64185:51;;;;;;64085:163;64267:2;64262:1;:7;;;;:18;;;;;64278:2;64273:1;:7;;;;64262:18;64258:102;;;64313:1;64317:30;64297:51;;;;;;64258:102;64457:14;64474:24;64484:4;64490:1;64493;64496;64474:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64457:41;;64531:1;64513:20;;:6;:20;;;64509:103;;;64566:1;64570:29;64550:50;;;;;;;64509:103;64632:6;64640:20;64624:37;;;;;63037:1632;;;;;;;;:::o;62079:344::-;62193:7;62202:12;62227:9;62252:66;62244:75;;62239:2;:80;62227:92;;62330:7;62369:2;62362:3;62355:2;62347:11;;:18;;62346:25;;;;:::i;:::-;62330:42;;62390:25;62401:4;62407:1;62410;62413;62390:10;:25::i;:::-;62383:32;;;;;;62079:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;653:343::-;;755:65;771:48;812:6;771:48;:::i;:::-;755:65;:::i;:::-;746:74;;843:6;836:5;829:21;881:4;874:5;870:16;919:3;910:6;905:3;901:16;898:25;895:2;;;936:1;933;926:12;895:2;949:41;983:6;978:3;973;949:41;:::i;:::-;736:260;;;;;;:::o;1002:139::-;;1086:6;1073:20;1064:29;;1102:33;1129:5;1102:33;:::i;:::-;1054:87;;;;:::o;1164:303::-;;1284:3;1277:4;1269:6;1265:17;1261:27;1251:2;;1302:1;1299;1292:12;1251:2;1342:6;1329:20;1367:94;1457:3;1449:6;1442:4;1434:6;1430:17;1367:94;:::i;:::-;1358:103;;1241:226;;;;;:::o;1473:133::-;;1554:6;1541:20;1532:29;;1570:30;1594:5;1570:30;:::i;:::-;1522:84;;;;:::o;1612:137::-;;1695:6;1682:20;1673:29;;1711:32;1737:5;1711:32;:::i;:::-;1663:86;;;;:::o;1755:141::-;;1842:6;1836:13;1827:22;;1858:32;1884:5;1858:32;:::i;:::-;1817:79;;;;:::o;1915:351::-;;;2032:3;2025:4;2017:6;2013:17;2009:27;1999:2;;2050:1;2047;2040:12;1999:2;2086:6;2073:20;2063:30;;2116:18;2108:6;2105:30;2102:2;;;2148:1;2145;2138:12;2102:2;2185:4;2177:6;2173:17;2161:29;;2239:3;2231:4;2223:6;2219:17;2209:8;2205:32;2202:41;2199:2;;;2256:1;2253;2246:12;2199:2;1989:277;;;;;:::o;2285:271::-;;2389:3;2382:4;2374:6;2370:17;2366:27;2356:2;;2407:1;2404;2397:12;2356:2;2447:6;2434:20;2472:78;2546:3;2538:6;2531:4;2523:6;2519:17;2472:78;:::i;:::-;2463:87;;2346:210;;;;;:::o;2576:352::-;;;2694:3;2687:4;2679:6;2675:17;2671:27;2661:2;;2712:1;2709;2702:12;2661:2;2748:6;2735:20;2725:30;;2778:18;2770:6;2767:30;2764:2;;;2810:1;2807;2800:12;2764:2;2847:4;2839:6;2835:17;2823:29;;2901:3;2893:4;2885:6;2881:17;2871:8;2867:32;2864:41;2861:2;;;2918:1;2915;2908:12;2861:2;2651:277;;;;;:::o;2934:139::-;;3018:6;3005:20;2996:29;;3034:33;3061:5;3034:33;:::i;:::-;2986:87;;;;:::o;3079:262::-;;3187:2;3175:9;3166:7;3162:23;3158:32;3155:2;;;3203:1;3200;3193:12;3155:2;3246:1;3271:53;3316:7;3307:6;3296:9;3292:22;3271:53;:::i;:::-;3261:63;;3217:117;3145:196;;;;:::o;3347:407::-;;;3472:2;3460:9;3451:7;3447:23;3443:32;3440:2;;;3488:1;3485;3478:12;3440:2;3531:1;3556:53;3601:7;3592:6;3581:9;3577:22;3556:53;:::i;:::-;3546:63;;3502:117;3658:2;3684:53;3729:7;3720:6;3709:9;3705:22;3684:53;:::i;:::-;3674:63;;3629:118;3430:324;;;;;:::o;3760:552::-;;;;3902:2;3890:9;3881:7;3877:23;3873:32;3870:2;;;3918:1;3915;3908:12;3870:2;3961:1;3986:53;4031:7;4022:6;4011:9;4007:22;3986:53;:::i;:::-;3976:63;;3932:117;4088:2;4114:53;4159:7;4150:6;4139:9;4135:22;4114:53;:::i;:::-;4104:63;;4059:118;4216:2;4242:53;4287:7;4278:6;4267:9;4263:22;4242:53;:::i;:::-;4232:63;;4187:118;3860:452;;;;;:::o;4318:809::-;;;;;4486:3;4474:9;4465:7;4461:23;4457:33;4454:2;;;4503:1;4500;4493:12;4454:2;4546:1;4571:53;4616:7;4607:6;4596:9;4592:22;4571:53;:::i;:::-;4561:63;;4517:117;4673:2;4699:53;4744:7;4735:6;4724:9;4720:22;4699:53;:::i;:::-;4689:63;;4644:118;4801:2;4827:53;4872:7;4863:6;4852:9;4848:22;4827:53;:::i;:::-;4817:63;;4772:118;4957:2;4946:9;4942:18;4929:32;4988:18;4980:6;4977:30;4974:2;;;5020:1;5017;5010:12;4974:2;5048:62;5102:7;5093:6;5082:9;5078:22;5048:62;:::i;:::-;5038:72;;4900:220;4444:683;;;;;;;:::o;5133:401::-;;;5255:2;5243:9;5234:7;5230:23;5226:32;5223:2;;;5271:1;5268;5261:12;5223:2;5314:1;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5285:117;5441:2;5467:50;5509:7;5500:6;5489:9;5485:22;5467:50;:::i;:::-;5457:60;;5412:115;5213:321;;;;;:::o;5540:407::-;;;5665:2;5653:9;5644:7;5640:23;5636:32;5633:2;;;5681:1;5678;5671:12;5633:2;5724:1;5749:53;5794:7;5785:6;5774:9;5770:22;5749:53;:::i;:::-;5739:63;;5695:117;5851:2;5877:53;5922:7;5913:6;5902:9;5898:22;5877:53;:::i;:::-;5867:63;;5822:118;5623:324;;;;;:::o;5953:405::-;;6086:2;6074:9;6065:7;6061:23;6057:32;6054:2;;;6102:1;6099;6092:12;6054:2;6173:1;6162:9;6158:17;6145:31;6203:18;6195:6;6192:30;6189:2;;;6235:1;6232;6225:12;6189:2;6263:78;6333:7;6324:6;6313:9;6309:22;6263:78;:::i;:::-;6253:88;;6116:235;6044:314;;;;:::o;6364:256::-;;6469:2;6457:9;6448:7;6444:23;6440:32;6437:2;;;6485:1;6482;6475:12;6437:2;6528:1;6553:50;6595:7;6586:6;6575:9;6571:22;6553:50;:::i;:::-;6543:60;;6499:114;6427:193;;;;:::o;6626:260::-;;6733:2;6721:9;6712:7;6708:23;6704:32;6701:2;;;6749:1;6746;6739:12;6701:2;6792:1;6817:52;6861:7;6852:6;6841:9;6837:22;6817:52;:::i;:::-;6807:62;;6763:116;6691:195;;;;:::o;6892:282::-;;7010:2;6998:9;6989:7;6985:23;6981:32;6978:2;;;7026:1;7023;7016:12;6978:2;7069:1;7094:63;7149:7;7140:6;7129:9;7125:22;7094:63;:::i;:::-;7084:73;;7040:127;6968:206;;;;:::o;7180:395::-;;;7308:2;7296:9;7287:7;7283:23;7279:32;7276:2;;;7324:1;7321;7314:12;7276:2;7395:1;7384:9;7380:17;7367:31;7425:18;7417:6;7414:30;7411:2;;;7457:1;7454;7447:12;7411:2;7493:65;7550:7;7541:6;7530:9;7526:22;7493:65;:::i;:::-;7475:83;;;;7338:230;7266:309;;;;;:::o;7581:262::-;;7689:2;7677:9;7668:7;7664:23;7660:32;7657:2;;;7705:1;7702;7695:12;7657:2;7748:1;7773:53;7818:7;7809:6;7798:9;7794:22;7773:53;:::i;:::-;7763:63;;7719:117;7647:196;;;;:::o;7849:538::-;;;;7993:2;7981:9;7972:7;7968:23;7964:32;7961:2;;;8009:1;8006;7999:12;7961:2;8052:1;8077:53;8122:7;8113:6;8102:9;8098:22;8077:53;:::i;:::-;8067:63;;8023:117;8207:2;8196:9;8192:18;8179:32;8238:18;8230:6;8227:30;8224:2;;;8270:1;8267;8260:12;8224:2;8306:64;8362:7;8353:6;8342:9;8338:22;8306:64;:::i;:::-;8288:82;;;;8150:230;7951:436;;;;;:::o;8393:108::-;8470:24;8488:5;8470:24;:::i;:::-;8465:3;8458:37;8448:53;;:::o;8507:118::-;8594:24;8612:5;8594:24;:::i;:::-;8589:3;8582:37;8572:53;;:::o;8631:157::-;8736:45;8756:24;8774:5;8756:24;:::i;:::-;8736:45;:::i;:::-;8731:3;8724:58;8714:74;;:::o;8794:109::-;8875:21;8890:5;8875:21;:::i;:::-;8870:3;8863:34;8853:50;;:::o;8909:118::-;8996:24;9014:5;8996:24;:::i;:::-;8991:3;8984:37;8974:53;;:::o;9033:157::-;9138:45;9158:24;9176:5;9158:24;:::i;:::-;9138:45;:::i;:::-;9133:3;9126:58;9116:74;;:::o;9196:360::-;;9310:38;9342:5;9310:38;:::i;:::-;9364:70;9427:6;9422:3;9364:70;:::i;:::-;9357:77;;9443:52;9488:6;9483:3;9476:4;9469:5;9465:16;9443:52;:::i;:::-;9520:29;9542:6;9520:29;:::i;:::-;9515:3;9511:39;9504:46;;9286:270;;;;;:::o;9562:364::-;;9678:39;9711:5;9678:39;:::i;:::-;9733:71;9797:6;9792:3;9733:71;:::i;:::-;9726:78;;9813:52;9858:6;9853:3;9846:4;9839:5;9835:16;9813:52;:::i;:::-;9890:29;9912:6;9890:29;:::i;:::-;9885:3;9881:39;9874:46;;9654:272;;;;;:::o;9932:377::-;;10066:39;10099:5;10066:39;:::i;:::-;10121:89;10203:6;10198:3;10121:89;:::i;:::-;10114:96;;10219:52;10264:6;10259:3;10252:4;10245:5;10241:16;10219:52;:::i;:::-;10296:6;10291:3;10287:16;10280:23;;10042:267;;;;;:::o;10339:845::-;;10479:5;10473:12;10508:36;10534:9;10508:36;:::i;:::-;10560:89;10642:6;10637:3;10560:89;:::i;:::-;10553:96;;10680:1;10669:9;10665:17;10696:1;10691:137;;;;10842:1;10837:341;;;;10658:520;;10691:137;10775:4;10771:9;10760;10756:25;10751:3;10744:38;10811:6;10806:3;10802:16;10795:23;;10691:137;;10837:341;10904:38;10936:5;10904:38;:::i;:::-;10964:1;10978:154;10992:6;10989:1;10986:13;10978:154;;;11066:7;11060:14;11056:1;11051:3;11047:11;11040:35;11116:1;11107:7;11103:15;11092:26;;11014:4;11011:1;11007:12;11002:17;;10978:154;;;11161:6;11156:3;11152:16;11145:23;;10844:334;;10658:520;;10446:738;;;;;;:::o;11190:366::-;;11353:67;11417:2;11412:3;11353:67;:::i;:::-;11346:74;;11429:93;11518:3;11429:93;:::i;:::-;11547:2;11542:3;11538:12;11531:19;;11336:220;;;:::o;11562:366::-;;11725:67;11789:2;11784:3;11725:67;:::i;:::-;11718:74;;11801:93;11890:3;11801:93;:::i;:::-;11919:2;11914:3;11910:12;11903:19;;11708:220;;;:::o;11934:366::-;;12097:67;12161:2;12156:3;12097:67;:::i;:::-;12090:74;;12173:93;12262:3;12173:93;:::i;:::-;12291:2;12286:3;12282:12;12275:19;;12080:220;;;:::o;12306:366::-;;12469:67;12533:2;12528:3;12469:67;:::i;:::-;12462:74;;12545:93;12634:3;12545:93;:::i;:::-;12663:2;12658:3;12654:12;12647:19;;12452:220;;;:::o;12678:402::-;;12859:85;12941:2;12936:3;12859:85;:::i;:::-;12852:92;;12953:93;13042:3;12953:93;:::i;:::-;13071:2;13066:3;13062:12;13055:19;;12842:238;;;:::o;13086:366::-;;13249:67;13313:2;13308:3;13249:67;:::i;:::-;13242:74;;13325:93;13414:3;13325:93;:::i;:::-;13443:2;13438:3;13434:12;13427:19;;13232:220;;;:::o;13458:366::-;;13621:67;13685:2;13680:3;13621:67;:::i;:::-;13614:74;;13697:93;13786:3;13697:93;:::i;:::-;13815:2;13810:3;13806:12;13799:19;;13604:220;;;:::o;13830:366::-;;13993:67;14057:2;14052:3;13993:67;:::i;:::-;13986:74;;14069:93;14158:3;14069:93;:::i;:::-;14187:2;14182:3;14178:12;14171:19;;13976:220;;;:::o;14202:366::-;;14365:67;14429:2;14424:3;14365:67;:::i;:::-;14358:74;;14441:93;14530:3;14441:93;:::i;:::-;14559:2;14554:3;14550:12;14543:19;;14348:220;;;:::o;14574:366::-;;14737:67;14801:2;14796:3;14737:67;:::i;:::-;14730:74;;14813:93;14902:3;14813:93;:::i;:::-;14931:2;14926:3;14922:12;14915:19;;14720:220;;;:::o;14946:366::-;;15109:67;15173:2;15168:3;15109:67;:::i;:::-;15102:74;;15185:93;15274:3;15185:93;:::i;:::-;15303:2;15298:3;15294:12;15287:19;;15092:220;;;:::o;15318:366::-;;15481:67;15545:2;15540:3;15481:67;:::i;:::-;15474:74;;15557:93;15646:3;15557:93;:::i;:::-;15675:2;15670:3;15666:12;15659:19;;15464:220;;;:::o;15690:366::-;;15853:67;15917:2;15912:3;15853:67;:::i;:::-;15846:74;;15929:93;16018:3;15929:93;:::i;:::-;16047:2;16042:3;16038:12;16031:19;;15836:220;;;:::o;16062:366::-;;16225:67;16289:2;16284:3;16225:67;:::i;:::-;16218:74;;16301:93;16390:3;16301:93;:::i;:::-;16419:2;16414:3;16410:12;16403:19;;16208:220;;;:::o;16434:366::-;;16597:67;16661:2;16656:3;16597:67;:::i;:::-;16590:74;;16673:93;16762:3;16673:93;:::i;:::-;16791:2;16786:3;16782:12;16775:19;;16580:220;;;:::o;16806:366::-;;16969:67;17033:2;17028:3;16969:67;:::i;:::-;16962:74;;17045:93;17134:3;17045:93;:::i;:::-;17163:2;17158:3;17154:12;17147:19;;16952:220;;;:::o;17178:400::-;;17359:84;17441:1;17436:3;17359:84;:::i;:::-;17352:91;;17452:93;17541:3;17452:93;:::i;:::-;17570:1;17565:3;17561:11;17554:18;;17342:236;;;:::o;17584:366::-;;17747:67;17811:2;17806:3;17747:67;:::i;:::-;17740:74;;17823:93;17912:3;17823:93;:::i;:::-;17941:2;17936:3;17932:12;17925:19;;17730:220;;;:::o;17956:366::-;;18119:67;18183:2;18178:3;18119:67;:::i;:::-;18112:74;;18195:93;18284:3;18195:93;:::i;:::-;18313:2;18308:3;18304:12;18297:19;;18102:220;;;:::o;18328:366::-;;18491:67;18555:2;18550:3;18491:67;:::i;:::-;18484:74;;18567:93;18656:3;18567:93;:::i;:::-;18685:2;18680:3;18676:12;18669:19;;18474:220;;;:::o;18700:366::-;;18863:67;18927:2;18922:3;18863:67;:::i;:::-;18856:74;;18939:93;19028:3;18939:93;:::i;:::-;19057:2;19052:3;19048:12;19041:19;;18846:220;;;:::o;19072:366::-;;19235:67;19299:2;19294:3;19235:67;:::i;:::-;19228:74;;19311:93;19400:3;19311:93;:::i;:::-;19429:2;19424:3;19420:12;19413:19;;19218:220;;;:::o;19444:366::-;;19607:67;19671:2;19666:3;19607:67;:::i;:::-;19600:74;;19683:93;19772:3;19683:93;:::i;:::-;19801:2;19796:3;19792:12;19785:19;;19590:220;;;:::o;19816:366::-;;19979:67;20043:2;20038:3;19979:67;:::i;:::-;19972:74;;20055:93;20144:3;20055:93;:::i;:::-;20173:2;20168:3;20164:12;20157:19;;19962:220;;;:::o;20188:366::-;;20351:67;20415:2;20410:3;20351:67;:::i;:::-;20344:74;;20427:93;20516:3;20427:93;:::i;:::-;20545:2;20540:3;20536:12;20529:19;;20334:220;;;:::o;20560:366::-;;20723:67;20787:2;20782:3;20723:67;:::i;:::-;20716:74;;20799:93;20888:3;20799:93;:::i;:::-;20917:2;20912:3;20908:12;20901:19;;20706:220;;;:::o;20932:366::-;;21095:67;21159:2;21154:3;21095:67;:::i;:::-;21088:74;;21171:93;21260:3;21171:93;:::i;:::-;21289:2;21284:3;21280:12;21273:19;;21078:220;;;:::o;21304:366::-;;21467:67;21531:2;21526:3;21467:67;:::i;:::-;21460:74;;21543:93;21632:3;21543:93;:::i;:::-;21661:2;21656:3;21652:12;21645:19;;21450:220;;;:::o;21676:366::-;;21839:67;21903:2;21898:3;21839:67;:::i;:::-;21832:74;;21915:93;22004:3;21915:93;:::i;:::-;22033:2;22028:3;22024:12;22017:19;;21822:220;;;:::o;22048:366::-;;22211:67;22275:2;22270:3;22211:67;:::i;:::-;22204:74;;22287:93;22376:3;22287:93;:::i;:::-;22405:2;22400:3;22396:12;22389:19;;22194:220;;;:::o;22792:366::-;;22955:67;23019:2;23014:3;22955:67;:::i;:::-;22948:74;;23031:93;23120:3;23031:93;:::i;:::-;23149:2;23144:3;23140:12;23133:19;;22938:220;;;:::o;23164:366::-;;23327:67;23391:2;23386:3;23327:67;:::i;:::-;23320:74;;23403:93;23492:3;23403:93;:::i;:::-;23521:2;23516:3;23512:12;23505:19;;23310:220;;;:::o;23536:366::-;;23699:67;23763:2;23758:3;23699:67;:::i;:::-;23692:74;;23775:93;23864:3;23775:93;:::i;:::-;23893:2;23888:3;23884:12;23877:19;;23682:220;;;:::o;23978:529::-;24139:4;24134:3;24130:14;24226:4;24219:5;24215:16;24209:23;24245:63;24302:4;24297:3;24293:14;24279:12;24245:63;:::i;:::-;24154:164;24410:4;24403:5;24399:16;24393:23;24429:61;24484:4;24479:3;24475:14;24461:12;24429:61;:::i;:::-;24328:172;24108:399;;;:::o;24513:118::-;24600:24;24618:5;24600:24;:::i;:::-;24595:3;24588:37;24578:53;;:::o;24637:105::-;24712:23;24729:5;24712:23;:::i;:::-;24707:3;24700:36;24690:52;;:::o;24748:112::-;24831:22;24847:5;24831:22;:::i;:::-;24826:3;24819:35;24809:51;;:::o;24866:256::-;;24993:75;25064:3;25055:6;24993:75;:::i;:::-;25093:2;25088:3;25084:12;25077:19;;25113:3;25106:10;;24982:140;;;;:::o;25128:695::-;;25428:92;25516:3;25507:6;25428:92;:::i;:::-;25421:99;;25537:95;25628:3;25619:6;25537:95;:::i;:::-;25530:102;;25649:148;25793:3;25649:148;:::i;:::-;25642:155;;25814:3;25807:10;;25410:413;;;;;:::o;25829:522::-;;26064:148;26208:3;26064:148;:::i;:::-;26057:155;;26222:75;26293:3;26284:6;26222:75;:::i;:::-;26322:2;26317:3;26313:12;26306:19;;26342:3;26335:10;;26046:305;;;;:::o;26357:222::-;;26488:2;26477:9;26473:18;26465:26;;26501:71;26569:1;26558:9;26554:17;26545:6;26501:71;:::i;:::-;26455:124;;;;:::o;26585:640::-;;26818:3;26807:9;26803:19;26795:27;;26832:71;26900:1;26889:9;26885:17;26876:6;26832:71;:::i;:::-;26913:72;26981:2;26970:9;26966:18;26957:6;26913:72;:::i;:::-;26995;27063:2;27052:9;27048:18;27039:6;26995:72;:::i;:::-;27114:9;27108:4;27104:20;27099:2;27088:9;27084:18;27077:48;27142:76;27213:4;27204:6;27142:76;:::i;:::-;27134:84;;26785:440;;;;;;;:::o;27231:210::-;;27356:2;27345:9;27341:18;27333:26;;27369:65;27431:1;27420:9;27416:17;27407:6;27369:65;:::i;:::-;27323:118;;;;:::o;27447:545::-;;27658:3;27647:9;27643:19;27635:27;;27672:71;27740:1;27729:9;27725:17;27716:6;27672:71;:::i;:::-;27753:68;27817:2;27806:9;27802:18;27793:6;27753:68;:::i;:::-;27831:72;27899:2;27888:9;27884:18;27875:6;27831:72;:::i;:::-;27913;27981:2;27970:9;27966:18;27957:6;27913:72;:::i;:::-;27625:367;;;;;;;:::o;27998:313::-;;28149:2;28138:9;28134:18;28126:26;;28198:9;28192:4;28188:20;28184:1;28173:9;28169:17;28162:47;28226:78;28299:4;28290:6;28226:78;:::i;:::-;28218:86;;28116:195;;;;:::o;28317:419::-;;28521:2;28510:9;28506:18;28498:26;;28570:9;28564:4;28560:20;28556:1;28545:9;28541:17;28534:47;28598:131;28724:4;28598:131;:::i;:::-;28590:139;;28488:248;;;:::o;28742:419::-;;28946:2;28935:9;28931:18;28923:26;;28995:9;28989:4;28985:20;28981:1;28970:9;28966:17;28959:47;29023:131;29149:4;29023:131;:::i;:::-;29015:139;;28913:248;;;:::o;29167:419::-;;29371:2;29360:9;29356:18;29348:26;;29420:9;29414:4;29410:20;29406:1;29395:9;29391:17;29384:47;29448:131;29574:4;29448:131;:::i;:::-;29440:139;;29338:248;;;:::o;29592:419::-;;29796:2;29785:9;29781:18;29773:26;;29845:9;29839:4;29835:20;29831:1;29820:9;29816:17;29809:47;29873:131;29999:4;29873:131;:::i;:::-;29865:139;;29763:248;;;:::o;30017:419::-;;30221:2;30210:9;30206:18;30198:26;;30270:9;30264:4;30260:20;30256:1;30245:9;30241:17;30234:47;30298:131;30424:4;30298:131;:::i;:::-;30290:139;;30188:248;;;:::o;30442:419::-;;30646:2;30635:9;30631:18;30623:26;;30695:9;30689:4;30685:20;30681:1;30670:9;30666:17;30659:47;30723:131;30849:4;30723:131;:::i;:::-;30715:139;;30613:248;;;:::o;30867:419::-;;31071:2;31060:9;31056:18;31048:26;;31120:9;31114:4;31110:20;31106:1;31095:9;31091:17;31084:47;31148:131;31274:4;31148:131;:::i;:::-;31140:139;;31038:248;;;:::o;31292:419::-;;31496:2;31485:9;31481:18;31473:26;;31545:9;31539:4;31535:20;31531:1;31520:9;31516:17;31509:47;31573:131;31699:4;31573:131;:::i;:::-;31565:139;;31463:248;;;:::o;31717:419::-;;31921:2;31910:9;31906:18;31898:26;;31970:9;31964:4;31960:20;31956:1;31945:9;31941:17;31934:47;31998:131;32124:4;31998:131;:::i;:::-;31990:139;;31888:248;;;:::o;32142:419::-;;32346:2;32335:9;32331:18;32323:26;;32395:9;32389:4;32385:20;32381:1;32370:9;32366:17;32359:47;32423:131;32549:4;32423:131;:::i;:::-;32415:139;;32313:248;;;:::o;32567:419::-;;32771:2;32760:9;32756:18;32748:26;;32820:9;32814:4;32810:20;32806:1;32795:9;32791:17;32784:47;32848:131;32974:4;32848:131;:::i;:::-;32840:139;;32738:248;;;:::o;32992:419::-;;33196:2;33185:9;33181:18;33173:26;;33245:9;33239:4;33235:20;33231:1;33220:9;33216:17;33209:47;33273:131;33399:4;33273:131;:::i;:::-;33265:139;;33163:248;;;:::o;33417:419::-;;33621:2;33610:9;33606:18;33598:26;;33670:9;33664:4;33660:20;33656:1;33645:9;33641:17;33634:47;33698:131;33824:4;33698:131;:::i;:::-;33690:139;;33588:248;;;:::o;33842:419::-;;34046:2;34035:9;34031:18;34023:26;;34095:9;34089:4;34085:20;34081:1;34070:9;34066:17;34059:47;34123:131;34249:4;34123:131;:::i;:::-;34115:139;;34013:248;;;:::o;34267:419::-;;34471:2;34460:9;34456:18;34448:26;;34520:9;34514:4;34510:20;34506:1;34495:9;34491:17;34484:47;34548:131;34674:4;34548:131;:::i;:::-;34540:139;;34438:248;;;:::o;34692:419::-;;34896:2;34885:9;34881:18;34873:26;;34945:9;34939:4;34935:20;34931:1;34920:9;34916:17;34909:47;34973:131;35099:4;34973:131;:::i;:::-;34965:139;;34863:248;;;:::o;35117:419::-;;35321:2;35310:9;35306:18;35298:26;;35370:9;35364:4;35360:20;35356:1;35345:9;35341:17;35334:47;35398:131;35524:4;35398:131;:::i;:::-;35390:139;;35288:248;;;:::o;35542:419::-;;35746:2;35735:9;35731:18;35723:26;;35795:9;35789:4;35785:20;35781:1;35770:9;35766:17;35759:47;35823:131;35949:4;35823:131;:::i;:::-;35815:139;;35713:248;;;:::o;35967:419::-;;36171:2;36160:9;36156:18;36148:26;;36220:9;36214:4;36210:20;36206:1;36195:9;36191:17;36184:47;36248:131;36374:4;36248:131;:::i;:::-;36240:139;;36138:248;;;:::o;36392:419::-;;36596:2;36585:9;36581:18;36573:26;;36645:9;36639:4;36635:20;36631:1;36620:9;36616:17;36609:47;36673:131;36799:4;36673:131;:::i;:::-;36665:139;;36563:248;;;:::o;36817:419::-;;37021:2;37010:9;37006:18;36998:26;;37070:9;37064:4;37060:20;37056:1;37045:9;37041:17;37034:47;37098:131;37224:4;37098:131;:::i;:::-;37090:139;;36988:248;;;:::o;37242:419::-;;37446:2;37435:9;37431:18;37423:26;;37495:9;37489:4;37485:20;37481:1;37470:9;37466:17;37459:47;37523:131;37649:4;37523:131;:::i;:::-;37515:139;;37413:248;;;:::o;37667:419::-;;37871:2;37860:9;37856:18;37848:26;;37920:9;37914:4;37910:20;37906:1;37895:9;37891:17;37884:47;37948:131;38074:4;37948:131;:::i;:::-;37940:139;;37838:248;;;:::o;38092:419::-;;38296:2;38285:9;38281:18;38273:26;;38345:9;38339:4;38335:20;38331:1;38320:9;38316:17;38309:47;38373:131;38499:4;38373:131;:::i;:::-;38365:139;;38263:248;;;:::o;38517:419::-;;38721:2;38710:9;38706:18;38698:26;;38770:9;38764:4;38760:20;38756:1;38745:9;38741:17;38734:47;38798:131;38924:4;38798:131;:::i;:::-;38790:139;;38688:248;;;:::o;38942:419::-;;39146:2;39135:9;39131:18;39123:26;;39195:9;39189:4;39185:20;39181:1;39170:9;39166:17;39159:47;39223:131;39349:4;39223:131;:::i;:::-;39215:139;;39113:248;;;:::o;39367:419::-;;39571:2;39560:9;39556:18;39548:26;;39620:9;39614:4;39610:20;39606:1;39595:9;39591:17;39584:47;39648:131;39774:4;39648:131;:::i;:::-;39640:139;;39538:248;;;:::o;39792:419::-;;39996:2;39985:9;39981:18;39973:26;;40045:9;40039:4;40035:20;40031:1;40020:9;40016:17;40009:47;40073:131;40199:4;40073:131;:::i;:::-;40065:139;;39963:248;;;:::o;40642:419::-;;40846:2;40835:9;40831:18;40823:26;;40895:9;40889:4;40885:20;40881:1;40870:9;40866:17;40859:47;40923:131;41049:4;40923:131;:::i;:::-;40915:139;;40813:248;;;:::o;41067:419::-;;41271:2;41260:9;41256:18;41248:26;;41320:9;41314:4;41310:20;41306:1;41295:9;41291:17;41284:47;41348:131;41474:4;41348:131;:::i;:::-;41340:139;;41238:248;;;:::o;41492:419::-;;41696:2;41685:9;41681:18;41673:26;;41745:9;41739:4;41735:20;41731:1;41720:9;41716:17;41709:47;41773:131;41899:4;41773:131;:::i;:::-;41765:139;;41663:248;;;:::o;41917:350::-;;42112:2;42101:9;42097:18;42089:26;;42125:135;42257:1;42246:9;42242:17;42233:6;42125:135;:::i;:::-;42079:188;;;;:::o;42273:222::-;;42404:2;42393:9;42389:18;42381:26;;42417:71;42485:1;42474:9;42470:17;42461:6;42417:71;:::i;:::-;42371:124;;;;:::o;42501:129::-;;42562:20;;:::i;:::-;42552:30;;42591:33;42619:4;42611:6;42591:33;:::i;:::-;42542:88;;;:::o;42636:75::-;;42702:2;42696:9;42686:19;;42676:35;:::o;42717:311::-;;42884:18;42876:6;42873:30;42870:2;;;42906:18;;:::i;:::-;42870:2;42956:4;42948:6;42944:17;42936:25;;43016:4;43010;43006:15;42998:23;;42799:229;;;:::o;43034:307::-;;43185:18;43177:6;43174:30;43171:2;;;43207:18;;:::i;:::-;43171:2;43245:29;43267:6;43245:29;:::i;:::-;43237:37;;43329:4;43323;43319:15;43311:23;;43100:241;;;:::o;43347:141::-;;43419:3;43411:11;;43442:3;43439:1;43432:14;43476:4;43473:1;43463:18;43455:26;;43401:87;;;:::o;43494:98::-;;43579:5;43573:12;43563:22;;43552:40;;;:::o;43598:99::-;;43684:5;43678:12;43668:22;;43657:40;;;:::o;43703:168::-;;43820:6;43815:3;43808:19;43860:4;43855:3;43851:14;43836:29;;43798:73;;;;:::o;43877:169::-;;43995:6;43990:3;43983:19;44035:4;44030:3;44026:14;44011:29;;43973:73;;;;:::o;44052:148::-;;44191:3;44176:18;;44166:34;;;;:::o;44206:273::-;;44265:20;44283:1;44265:20;:::i;:::-;44260:25;;44299:20;44317:1;44299:20;:::i;:::-;44294:25;;44421:1;44385:34;44381:42;44378:1;44375:49;44372:2;;;44427:18;;:::i;:::-;44372:2;44471:1;44468;44464:9;44457:16;;44250:229;;;;:::o;44485:305::-;;44544:20;44562:1;44544:20;:::i;:::-;44539:25;;44578:20;44596:1;44578:20;:::i;:::-;44573:25;;44732:1;44664:66;44660:74;44657:1;44654:81;44651:2;;;44738:18;;:::i;:::-;44651:2;44782:1;44779;44775:9;44768:16;;44529:261;;;;:::o;44796:185::-;;44853:20;44871:1;44853:20;:::i;:::-;44848:25;;44887:20;44905:1;44887:20;:::i;:::-;44882:25;;44926:1;44916:2;;44931:18;;:::i;:::-;44916:2;44973:1;44970;44966:9;44961:14;;44838:143;;;;:::o;44987:191::-;;45047:20;45065:1;45047:20;:::i;:::-;45042:25;;45081:20;45099:1;45081:20;:::i;:::-;45076:25;;45120:1;45117;45114:8;45111:2;;;45125:18;;:::i;:::-;45111:2;45170:1;45167;45163:9;45155:17;;45032:146;;;;:::o;45184:96::-;;45250:24;45268:5;45250:24;:::i;:::-;45239:35;;45229:51;;;:::o;45286:90::-;;45363:5;45356:13;45349:21;45338:32;;45328:48;;;:::o;45382:77::-;;45448:5;45437:16;;45427:32;;;:::o;45465:149::-;;45541:66;45534:5;45530:78;45519:89;;45509:105;;;:::o;45620:118::-;;45697:34;45690:5;45686:46;45675:57;;45665:73;;;:::o;45744:126::-;;45821:42;45814:5;45810:54;45799:65;;45789:81;;;:::o;45876:77::-;;45942:5;45931:16;;45921:32;;;:::o;45959:101::-;;46035:18;46028:5;46024:30;46013:41;;46003:57;;;:::o;46066:86::-;;46141:4;46134:5;46130:16;46119:27;;46109:43;;;:::o;46158:154::-;46242:6;46237:3;46232;46219:30;46304:1;46295:6;46290:3;46286:16;46279:27;46209:103;;;:::o;46318:307::-;46386:1;46396:113;46410:6;46407:1;46404:13;46396:113;;;46495:1;46490:3;46486:11;46480:18;46476:1;46471:3;46467:11;46460:39;46432:2;46429:1;46425:10;46420:15;;46396:113;;;46527:6;46524:1;46521:13;46518:2;;;46607:1;46598:6;46593:3;46589:16;46582:27;46518:2;46367:258;;;;:::o;46631:171::-;;46693:24;46711:5;46693:24;:::i;:::-;46684:33;;46739:4;46732:5;46729:15;46726:2;;;46747:18;;:::i;:::-;46726:2;46794:1;46787:5;46783:13;46776:20;;46674:128;;;:::o;46808:320::-;;46889:1;46883:4;46879:12;46869:22;;46936:1;46930:4;46926:12;46957:18;46947:2;;47013:4;47005:6;47001:17;46991:27;;46947:2;47075;47067:6;47064:14;47044:18;47041:38;47038:2;;;47094:18;;:::i;:::-;47038:2;46859:269;;;;:::o;47134:281::-;47217:27;47239:4;47217:27;:::i;:::-;47209:6;47205:40;47347:6;47335:10;47332:22;47311:18;47299:10;47296:34;47293:62;47290:2;;;47358:18;;:::i;:::-;47290:2;47398:10;47394:2;47387:22;47177:238;;;:::o;47421:233::-;;47483:24;47501:5;47483:24;:::i;:::-;47474:33;;47529:66;47522:5;47519:77;47516:2;;;47599:18;;:::i;:::-;47516:2;47646:1;47639:5;47635:13;47628:20;;47464:190;;;:::o;47660:100::-;;47728:26;47748:5;47728:26;:::i;:::-;47717:37;;47707:53;;;:::o;47766:79::-;;47834:5;47823:16;;47813:32;;;:::o;47851:94::-;;47919:20;47933:5;47919:20;:::i;:::-;47908:31;;47898:47;;;:::o;47951:176::-;;48000:20;48018:1;48000:20;:::i;:::-;47995:25;;48034:20;48052:1;48034:20;:::i;:::-;48029:25;;48073:1;48063:2;;48078:18;;:::i;:::-;48063:2;48119:1;48116;48112:9;48107:14;;47985:142;;;;:::o;48133:180::-;48181:77;48178:1;48171:88;48278:4;48275:1;48268:15;48302:4;48299:1;48292:15;48319:180;48367:77;48364:1;48357:88;48464:4;48461:1;48454:15;48488:4;48485:1;48478:15;48505:180;48553:77;48550:1;48543:88;48650:4;48647:1;48640:15;48674:4;48671:1;48664:15;48691:180;48739:77;48736:1;48729:88;48836:4;48833:1;48826:15;48860:4;48857:1;48850:15;48877:102;;48969:2;48965:7;48960:2;48953:5;48949:14;48945:28;48935:38;;48925:54;;;:::o;48985:94::-;;49066:5;49062:2;49058:14;49037:35;;49027:52;;;:::o;49085:174::-;49225:26;49221:1;49213:6;49209:14;49202:50;49191:68;:::o;49265:221::-;49405:34;49401:1;49393:6;49389:14;49382:58;49474:4;49469:2;49461:6;49457:15;49450:29;49371:115;:::o;49492:230::-;49632:34;49628:1;49620:6;49616:14;49609:58;49701:13;49696:2;49688:6;49684:15;49677:38;49598:124;:::o;49728:181::-;49868:33;49864:1;49856:6;49852:14;49845:57;49834:75;:::o;49915:214::-;50055:66;50051:1;50043:6;50039:14;50032:90;50021:108;:::o;50135:225::-;50275:34;50271:1;50263:6;50259:14;50252:58;50344:8;50339:2;50331:6;50327:15;50320:33;50241:119;:::o;50366:229::-;50506:34;50502:1;50494:6;50490:14;50483:58;50575:12;50570:2;50562:6;50558:15;50551:37;50472:123;:::o;50601:222::-;50741:34;50737:1;50729:6;50725:14;50718:58;50810:5;50805:2;50797:6;50793:15;50786:30;50707:116;:::o;50829:177::-;50969:29;50965:1;50957:6;50953:14;50946:53;50935:71;:::o;51012:224::-;51152:34;51148:1;51140:6;51136:14;51129:58;51221:7;51216:2;51208:6;51204:15;51197:32;51118:118;:::o;51242:221::-;51382:34;51378:1;51370:6;51366:14;51359:58;51451:4;51446:2;51438:6;51434:15;51427:29;51348:115;:::o;51469:178::-;51609:30;51605:1;51597:6;51593:14;51586:54;51575:72;:::o;51653:244::-;51793:34;51789:1;51781:6;51777:14;51770:58;51862:27;51857:2;51849:6;51845:15;51838:52;51759:138;:::o;51903:230::-;52043:34;52039:1;52031:6;52027:14;52020:58;52112:13;52107:2;52099:6;52095:15;52088:38;52009:124;:::o;52139:221::-;52279:34;52275:1;52267:6;52263:14;52256:58;52348:4;52343:2;52335:6;52331:15;52324:29;52245:115;:::o;52366:225::-;52506:34;52502:1;52494:6;52490:14;52483:58;52575:8;52570:2;52562:6;52558:15;52551:33;52472:119;:::o;52597:155::-;52737:7;52733:1;52725:6;52721:14;52714:31;52703:49;:::o;52758:182::-;52898:34;52894:1;52886:6;52882:14;52875:58;52864:76;:::o;52946:234::-;53086:34;53082:1;53074:6;53070:14;53063:58;53155:17;53150:2;53142:6;53138:15;53131:42;53052:128;:::o;53186:174::-;53326:26;53322:1;53314:6;53310:14;53303:50;53292:68;:::o;53366:176::-;53506:28;53502:1;53494:6;53490:14;53483:52;53472:70;:::o;53548:237::-;53688:34;53684:1;53676:6;53672:14;53665:58;53757:20;53752:2;53744:6;53740:15;53733:45;53654:131;:::o;53791:221::-;53931:34;53927:1;53919:6;53915:14;53908:58;54000:4;53995:2;53987:6;53983:15;53976:29;53897:115;:::o;54018:222::-;54158:34;54154:1;54146:6;54142:14;54135:58;54227:5;54222:2;54214:6;54210:15;54203:30;54124:116;:::o;54246:238::-;54386:34;54382:1;54374:6;54370:14;54363:58;54455:21;54450:2;54442:6;54438:15;54431:46;54352:132;:::o;54490:179::-;54630:31;54626:1;54618:6;54614:14;54607:55;54596:73;:::o;54675:176::-;54815:28;54811:1;54803:6;54799:14;54792:52;54781:70;:::o;54857:220::-;54997:34;54993:1;54985:6;54981:14;54974:58;55066:3;55061:2;55053:6;55049:15;55042:28;54963:114;:::o;55083:233::-;55223:34;55219:1;55211:6;55207:14;55200:58;55292:16;55287:2;55279:6;55275:15;55268:41;55189:127;:::o;55322:170::-;55462:22;55458:1;55450:6;55446:14;55439:46;55428:64;:::o;55738:224::-;55878:34;55874:1;55866:6;55862:14;55855:58;55947:7;55942:2;55934:6;55930:15;55923:32;55844:118;:::o;55968:232::-;56108:34;56104:1;56096:6;56092:14;56085:58;56177:15;56172:2;56164:6;56160:15;56153:40;56074:126;:::o;56206:182::-;56346:34;56342:1;56334:6;56330:14;56323:58;56312:76;:::o;56394:122::-;56467:24;56485:5;56467:24;:::i;:::-;56460:5;56457:35;56447:2;;56506:1;56503;56496:12;56447:2;56437:79;:::o;56522:116::-;56592:21;56607:5;56592:21;:::i;:::-;56585:5;56582:32;56572:2;;56628:1;56625;56618:12;56572:2;56562:76;:::o;56644:120::-;56716:23;56733:5;56716:23;:::i;:::-;56709:5;56706:34;56696:2;;56754:1;56751;56744:12;56696:2;56686:78;:::o;56770:122::-;56843:24;56861:5;56843:24;:::i;:::-;56836:5;56833:35;56823:2;;56882:1;56879;56872:12;56823:2;56813:79;:::o

Swarm Source

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