ETH Price: $3,477.67 (+0.20%)

Chunks (CHUNK)
 

Overview

TokenID

63

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
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:
Chunks

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-11
*/

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

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

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

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

// 
/**
 * @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;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// 
/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// 
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// 
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// 
/**
 * @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}. 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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` 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 { }
}

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

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

// 
/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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

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

    bool private _paused;

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

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

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

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

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

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

// 
/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    function hasRole(bytes32 role, address account) external view returns (bool);
    function getRoleAdmin(bytes32 role) external view returns (bytes32);
    function grantRole(bytes32 role, address account) external;
    function revokeRole(bytes32 role, address account) external;
    function renounceRole(bytes32 role, address account) external;
}

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping (address => bool) members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if(!hasRole(role, account)) {
            revert(string(abi.encodePacked(
                "AccessControl: account ",
                Strings.toHexString(uint160(account), 20),
                " is missing role ",
                Strings.toHexString(uint256(role), 32)
            )));
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
        _roles[role].adminRole = adminRole;
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// 
/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// 
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// 
contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

contract Chunks is
    ERC721,
    ERC721Enumerable,
    ERC721URIStorage,
    Ownable,
    Pausable,
    AccessControl
{
    using SafeMath for uint256;
    mapping(address => bool) whitelist;

    bool public mintingAllowed = false;
    bytes32 public constant GOD_MODE = keccak256("GOD_MODE");
    uint256 public maxSupply = 1000;
    uint256 public mintingFee = 30000000000000000;
    uint256 public launchDate = block.timestamp;
    string private baseURIExtended;
    address proxyRegistryAddress;

    event Received(address indexed account, uint value);
    event ChunkMinted(address indexed account, uint256 tokenId);
    event ChunkReserved(uint256 tokenId);

    constructor(
        string memory name,
        string memory symbol,
        address _proxyRegistryAddress,
        string memory _baseURIExtended
    ) ERC721(name, symbol) {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(GOD_MODE, msg.sender);

        proxyRegistryAddress = _proxyRegistryAddress;
        baseURIExtended = _baseURIExtended;
        launchDate = block.timestamp;
        maxSupply = 1000;
    }

    receive() external payable {
        emit Received(msg.sender, msg.value);
    }

    function mintChunk(uint256 tokenId) public payable {
        require(totalSupply() < _maxSupply(), "All Chunks Have Been Claimed");
        require(tokenId < _maxSupply(), "Token ID More Than Max Supply");
        require(msg.value >= _mintFee(), "Minimum ETH Not Met");
        require(block.timestamp >= _launchDate(), "Not Yet Launched");
        require(mintingAllowed == true, "Public Minting Not Allowed");

        _safeMint(msg.sender, tokenId);
        emit ChunkMinted(msg.sender, tokenId);
    }

    function reserveChunk(uint256 tokenId) public {
        require(hasRole(GOD_MODE, msg.sender));
        require(totalSupply() < _maxSupply(), "All Chunks Have Been Claimed");
        require(tokenId < _maxSupply(), "Token ID More Than Max Supply");
    
        _safeMint(owner(), tokenId);
        emit ChunkReserved(tokenId);
    }

    function setBaseURI(string memory baseURI_) external {
        require(hasRole(GOD_MODE, msg.sender));

        baseURIExtended = baseURI_;
    }
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURIExtended;
    }


    function setMaxSupply(uint256 maxSupply_) external {
        require(hasRole(GOD_MODE, msg.sender));

        maxSupply = maxSupply_;
    }
    function _maxSupply() internal view virtual returns (uint256) {
        return maxSupply;
    }


    function setMintingFee(uint256 mintingFee_) external {
        require(hasRole(GOD_MODE, msg.sender));

        mintingFee = mintingFee_;
    }
    function _mintFee() internal view virtual returns (uint256) {
        return mintingFee;
    }

    function setLaunchDate(uint256 launchDate_) external {
        require(hasRole(GOD_MODE, msg.sender));

        launchDate = launchDate_;
    }

    function _launchDate() internal view virtual returns (uint256) {
        return launchDate;
    }

    function pause() public {
        require(hasRole(GOD_MODE, msg.sender));
    
        _pause();
    }

    function unpause() public {
        require(hasRole(GOD_MODE, msg.sender));
    
        _unpause();
    }

    function allowMinting() public {
        require(hasRole(GOD_MODE, msg.sender));
    
        mintingAllowed = true;
    }

    function pauseMinting() public {
        require(hasRole(GOD_MODE, msg.sender));
    
        mintingAllowed = false;
    }

    function withdrawAll() public payable {
        require(hasRole(GOD_MODE, msg.sender));
        require(payable(msg.sender).send(address(this).balance));
    } 

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) whenNotPaused {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable, AccessControl)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"string","name":"_baseURIExtended","type":"string"}],"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":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ChunkMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ChunkReserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GOD_MODE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowMinting","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","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":"launchDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mintChunk","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintingFee","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"reserveChunk","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"launchDate_","type":"uint256"}],"name":"setLaunchDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSupply_","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintingFee_","type":"uint256"}],"name":"setMintingFee","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526000600e60006101000a81548160ff0219169083151502179055506103e8600f55666a94d74f430000601055426011553480156200004157600080fd5b5060405162005da038038062005da08339818101604052810190620000679190620004d8565b83838160009080519060200190620000819291906200039f565b5080600190805190602001906200009a9291906200039f565b5050506000620000af6200022460201b60201c565b905080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506000600b60146101000a81548160ff0219169083151502179055506200017e6000801b336200022c60201b60201c565b620001b07feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c0336200022c60201b60201c565b81601360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060129080519060200190620002099291906200039f565b50426011819055506103e8600f81905550505050506200074d565b600033905090565b6200023e82826200024260201b60201c565b5050565b6200025482826200033460201b60201c565b62000330576001600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002d56200022460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620003ad9062000658565b90600052602060002090601f016020900481019282620003d157600085556200041d565b82601f10620003ec57805160ff19168380011785556200041d565b828001600101855582156200041d579182015b828111156200041c578251825591602001919060010190620003ff565b5b5090506200042c919062000430565b5090565b5b808211156200044b57600081600090555060010162000431565b5090565b6000620004666200046084620005b8565b6200058f565b9050828152602081018484840111156200047f57600080fd5b6200048c84828562000622565b509392505050565b600081519050620004a58162000733565b92915050565b600082601f830112620004bd57600080fd5b8151620004cf8482602086016200044f565b91505092915050565b60008060008060808587031215620004ef57600080fd5b600085015167ffffffffffffffff8111156200050a57600080fd5b6200051887828801620004ab565b945050602085015167ffffffffffffffff8111156200053657600080fd5b6200054487828801620004ab565b9350506040620005578782880162000494565b925050606085015167ffffffffffffffff8111156200057557600080fd5b6200058387828801620004ab565b91505092959194509250565b60006200059b620005ae565b9050620005a982826200068e565b919050565b6000604051905090565b600067ffffffffffffffff821115620005d657620005d5620006f3565b5b620005e18262000722565b9050602081019050919050565b6000620005fb8262000602565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200064257808201518184015260208101905062000625565b8381111562000652576000848401525b50505050565b600060028204905060018216806200067157607f821691505b60208210811415620006885762000687620006c4565b5b50919050565b620006998262000722565b810181811067ffffffffffffffff82111715620006bb57620006ba620006f3565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200073e81620005ee565b81146200074a57600080fd5b50565b615643806200075d6000396000f3fe6080604052600436106102605760003560e01c806370a0823111610144578063a22cb465116100b6578063d547741f1161007a578063d547741f1461090d578063d5abeb0114610936578063da8fbf2a14610961578063e985e9c514610978578063f2fde38b146109b5578063f8eeed62146109de576102b5565b8063a22cb4651461082c578063ab3f495914610855578063b57441341461087e578063b88d4fde146108a7578063c87b56dd146108d0576102b5565b80638da5cb5b116101085780638da5cb5b1461071857806391d148541461074357806395d89b4114610780578063963df451146107ab57806396532d1c146107d6578063a217fddf14610801576102b5565b806370a0823114610666578063715018a6146106a35780638456cb59146106ba5780638462151c146106d1578063853828b61461070e576102b5565b80632f745c59116101dd57806355f804b3116101a157806355f804b3146105655780635a64ad951461058e5780635c975abb146105b95780636352211e146105e45780636f0cdd30146106215780636f8b44b01461063d576102b5565b80632f745c591461048257806336568abe146104bf5780633f4ba83a146104e857806342842e0e146104ff5780634f6ccce714610528576102b5565b806318160ddd1161022457806318160ddd1461039f578063238a4709146103ca57806323b872dd146103f3578063248a9ca31461041c5780632f2ff15d14610459576102b5565b806301ffc9a7146102ba57806306fdde03146102f7578063081812fc14610322578063095ea7b31461035f5780631602a12414610388576102b5565b366102b5573373ffffffffffffffffffffffffffffffffffffffff167f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874346040516102ab919061497c565b60405180910390a2005b600080fd5b3480156102c657600080fd5b506102e160048036038101906102dc9190613e5a565b610a09565b6040516102ee91906145a4565b60405180910390f35b34801561030357600080fd5b5061030c610a1b565b60405161031991906145da565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613f16565b610aad565b604051610356919061451b565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190613db9565b610b32565b005b34801561039457600080fd5b5061039d610c4a565b005b3480156103ab57600080fd5b506103b4610c9a565b6040516103c1919061497c565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190613f16565b610ca7565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190613cb3565b610ce4565b005b34801561042857600080fd5b50610443600480360381019061043e9190613df5565b610d44565b60405161045091906145bf565b60405180910390f35b34801561046557600080fd5b50610480600480360381019061047b9190613e1e565b610d64565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613db9565b610d8d565b6040516104b6919061497c565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190613e1e565b610e32565b005b3480156104f457600080fd5b506104fd610eb5565b005b34801561050b57600080fd5b5061052660048036038101906105219190613cb3565b610ef2565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613f16565b610f12565b60405161055c919061497c565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190613ed5565b610fa9565b005b34801561059a57600080fd5b506105a3610ff6565b6040516105b0919061497c565b60405180910390f35b3480156105c557600080fd5b506105ce610ffc565b6040516105db91906145a4565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190613f16565b611013565b604051610618919061451b565b60405180910390f35b61063b60048036038101906106369190613f16565b6110c5565b005b34801561064957600080fd5b50610664600480360381019061065f9190613f16565b6112a3565b005b34801561067257600080fd5b5061068d60048036038101906106889190613c4e565b6112e0565b60405161069a919061497c565b60405180910390f35b3480156106af57600080fd5b506106b8611398565b005b3480156106c657600080fd5b506106cf6114d5565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613c4e565b611512565b6040516107059190614582565b60405180910390f35b61071661168e565b005b34801561072457600080fd5b5061072d611701565b60405161073a919061451b565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190613e1e565b61172b565b60405161077791906145a4565b60405180910390f35b34801561078c57600080fd5b50610795611796565b6040516107a291906145da565b60405180910390f35b3480156107b757600080fd5b506107c0611828565b6040516107cd91906145bf565b60405180910390f35b3480156107e257600080fd5b506107eb61184c565b6040516107f891906145a4565b60405180910390f35b34801561080d57600080fd5b5061081661185f565b60405161082391906145bf565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e9190613d7d565b611866565b005b34801561086157600080fd5b5061087c60048036038101906108779190613f16565b6119e7565b005b34801561088a57600080fd5b506108a560048036038101906108a09190613f16565b611afe565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190613d02565b611b3b565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190613f16565b611b9d565b60405161090491906145da565b60405180910390f35b34801561091957600080fd5b50610934600480360381019061092f9190613e1e565b611baf565b005b34801561094257600080fd5b5061094b611bd8565b604051610958919061497c565b60405180910390f35b34801561096d57600080fd5b50610976611bde565b005b34801561098457600080fd5b5061099f600480360381019061099a9190613c77565b611c2e565b6040516109ac91906145a4565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d79190613c4e565b611d30565b005b3480156109ea57600080fd5b506109f3611edc565b604051610a00919061497c565b60405180910390f35b6000610a1482611ee2565b9050919050565b606060008054610a2a90614cab565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5690614cab565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b6000610ab882611f5c565b610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee9061483c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3d82611013565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba5906148bc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bcd611fc8565b73ffffffffffffffffffffffffffffffffffffffff161480610bfc5750610bfb81610bf6611fc8565b611c2e565b5b610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c329061479c565b60405180910390fd5b610c458383611fd0565b505050565b610c747feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b610c7d57600080fd5b6001600e60006101000a81548160ff021916908315150217905550565b6000600880549050905090565b610cd17feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b610cda57600080fd5b8060108190555050565b610cf5610cef611fc8565b82612089565b610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b906148fc565b60405180910390fd5b610d3f838383612167565b505050565b6000600c6000838152602001908152602001600020600101549050919050565b610d6d82610d44565b610d7e81610d79611fc8565b6123c3565b610d888383612460565b505050565b6000610d98836112e0565b8210610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd09061463c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e3a611fc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e9061495c565b60405180910390fd5b610eb18282612541565b5050565b610edf7feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b610ee857600080fd5b610ef0612623565b565b610f0d83838360405180602001604052806000815250611b3b565b505050565b6000610f1c610c9a565b8210610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f549061491c565b60405180910390fd5b60088281548110610f97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610fd37feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b610fdc57600080fd5b8060129080519060200190610ff2929190613a48565b5050565b60105481565b6000600b60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b3906147dc565b60405180910390fd5b80915050919050565b6110cd6126c5565b6110d5610c9a565b10611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c9061493c565b60405180910390fd5b61111d6126c5565b811061115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906148dc565b60405180910390fd5b6111666126cf565b3410156111a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119f9061471c565b60405180910390fd5b6111b06126d9565b4210156111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e99061473c565b60405180910390fd5b60011515600e60009054906101000a900460ff16151514611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f9061475c565b60405180910390fd5b61125233826126e3565b3373ffffffffffffffffffffffffffffffffffffffff167f7f76921b7dc8c6e49c47b65c324e6edde49cc1aa3ef63ad0b49e3f82b1aeedf282604051611298919061497c565b60405180910390a250565b6112cd7feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b6112d657600080fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906147bc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113a0611fc8565b73ffffffffffffffffffffffffffffffffffffffff166113be611701565b73ffffffffffffffffffffffffffffffffffffffff1614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b9061485c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114ff7feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b61150857600080fd5b611510612701565b565b6060600061151f836112e0565b905060008114156115a257600067ffffffffffffffff81111561156b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115995781602001602082028036833780820191505090505b50915050611689565b60008167ffffffffffffffff8111156115e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116125781602001602082028036833780820191505090505b50905060005b828110156116825761162a8582610d8d565b828281518110611663577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061167a90614d0e565b915050611618565b8193505050505b919050565b6116b87feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b6116c157600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506116ff57600080fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546117a590614cab565b80601f01602080910402602001604051908101604052809291908181526020018280546117d190614cab565b801561181e5780601f106117f35761010080835404028352916020019161181e565b820191906000526020600020905b81548152906001019060200180831161180157829003601f168201915b5050505050905090565b7feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c081565b600e60009054906101000a900460ff1681565b6000801b81565b61186e611fc8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d3906146dc565b60405180910390fd5b80600560006118e9611fc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611996611fc8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119db91906145a4565b60405180910390a35050565b611a117feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b611a1a57600080fd5b611a226126c5565b611a2a610c9a565b10611a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a619061493c565b60405180910390fd5b611a726126c5565b8110611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa906148dc565b60405180910390fd5b611ac4611abe611701565b826126e3565b7f7b652a72b03af65b17e2a88b354b8b14098301a5f45c1f430f3b64c7d5bdf3c981604051611af3919061497c565b60405180910390a150565b611b287feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b611b3157600080fd5b8060118190555050565b611b4c611b46611fc8565b83612089565b611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b82906148fc565b60405180910390fd5b611b97848484846127a4565b50505050565b6060611ba882612800565b9050919050565b611bb882610d44565b611bc981611bc4611fc8565b6123c3565b611bd38383612541565b505050565b600f5481565b611c087feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b611c1157600080fd5b6000600e60006101000a81548160ff021916908315150217905550565b600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611ca6919061451b565b60206040518083038186803b158015611cbe57600080fd5b505afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190613eac565b73ffffffffffffffffffffffffffffffffffffffff161415611d1c576001915050611d2a565b611d268484612952565b9150505b92915050565b611d38611fc8565b73ffffffffffffffffffffffffffffffffffffffff16611d56611701565b73ffffffffffffffffffffffffffffffffffffffff1614611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da39061485c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e139061467c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60115481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f555750611f54826129e6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661204383611013565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061209482611f5c565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca906146fc565b60405180910390fd5b60006120de83611013565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061214d57508373ffffffffffffffffffffffffffffffffffffffff1661213584610aad565b73ffffffffffffffffffffffffffffffffffffffff16145b8061215e575061215d8185611c2e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661218782611013565b73ffffffffffffffffffffffffffffffffffffffff16146121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d49061487c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906146bc565b60405180910390fd5b612258838383612a60565b612263600082611fd0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b39190614b7b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230a9190614a9a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6123cd828261172b565b61245c576123f28173ffffffffffffffffffffffffffffffffffffffff166014612ab8565b6124008360001c6020612ab8565b6040516020016124119291906144e1565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245391906145da565b60405180910390fd5b5050565b61246a828261172b565b61253d576001600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124e2611fc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61254b828261172b565b1561261f576000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506125c4611fc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61262b610ffc565b61266a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126619061461c565b60405180910390fd5b6000600b60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126ae611fc8565b6040516126bb919061451b565b60405180910390a1565b6000600f54905090565b6000601054905090565b6000601154905090565b6126fd828260405180602001604052806000815250612db2565b5050565b612709610ffc565b15612749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127409061477c565b60405180910390fd5b6001600b60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861278d611fc8565b60405161279a919061451b565b60405180910390a1565b6127af848484612167565b6127bb84848484612e0d565b6127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f19061465c565b60405180910390fd5b50505050565b606061280b82611f5c565b61284a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128419061481c565b60405180910390fd5b6000600a6000848152602001908152602001600020805461286a90614cab565b80601f016020809104026020016040519081016040528092919081815260200182805461289690614cab565b80156128e35780601f106128b8576101008083540402835291602001916128e3565b820191906000526020600020905b8154815290600101906020018083116128c657829003601f168201915b5050505050905060006128f4612fa4565b905060008151141561290a57819250505061294d565b60008251111561293f5780826040516020016129279291906144bd565b6040516020818303038152906040529250505061294d565b61294884613036565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a595750612a58826130dd565b5b9050919050565b612a68610ffc565b15612aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9f9061477c565b60405180910390fd5b612ab38383836131bf565b505050565b606060006002836002612acb9190614b21565b612ad59190614a9a565b67ffffffffffffffff811115612b14577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b465781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612ba4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612c2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612c6e9190614b21565b612c789190614a9a565b90505b6001811115612d64577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ce0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612d5d90614c81565b9050612c7b565b5060008414612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f906145fc565b60405180910390fd5b8091505092915050565b612dbc83836132d3565b612dc96000848484612e0d565b612e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dff9061465c565b60405180910390fd5b505050565b6000612e2e8473ffffffffffffffffffffffffffffffffffffffff166134a1565b15612f97578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e57611fc8565b8786866040518563ffffffff1660e01b8152600401612e799493929190614536565b602060405180830381600087803b158015612e9357600080fd5b505af1925050508015612ec457506040513d601f19601f82011682018060405250810190612ec19190613e83565b60015b612f47573d8060008114612ef4576040519150601f19603f3d011682016040523d82523d6000602084013e612ef9565b606091505b50600081511415612f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f369061465c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f9c565b600190505b949350505050565b606060128054612fb390614cab565b80601f0160208091040260200160405190810160405280929190818152602001828054612fdf90614cab565b801561302c5780601f106130015761010080835404028352916020019161302c565b820191906000526020600020905b81548152906001019060200180831161300f57829003601f168201915b5050505050905090565b606061304182611f5c565b613080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130779061489c565b60405180910390fd5b600061308a612fa4565b905060008151116130aa57604051806020016040528060008152506130d5565b806130b4846134b4565b6040516020016130c59291906144bd565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131b857506131b782613661565b5b9050919050565b6131ca8383836136cb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561320d57613208816136d0565b61324c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461324b5761324a8382613719565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561328f5761328a81613886565b6132ce565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132cd576132cc82826139c9565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333a906147fc565b60405180910390fd5b61334c81611f5c565b1561338c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133839061469c565b60405180910390fd5b61339860008383612a60565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133e89190614a9a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606060008214156134fc576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061365c565b600082905060005b6000821461352e57808061351790614d0e565b915050600a826135279190614af0565b9150613504565b60008167ffffffffffffffff811115613570577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135a25781602001600182028036833780820191505090505b5090505b60008514613655576001826135bb9190614b7b565b9150600a856135ca9190614d57565b60306135d69190614a9a565b60f81b818381518110613612577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561364e9190614af0565b94506135a6565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613726846112e0565b6137309190614b7b565b9050600060076000848152602001908152602001600020549050818114613815576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061389a9190614b7b565b90506000600960008481526020019081526020016000205490506000600883815481106138f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613938577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006139d4836112e0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613a5490614cab565b90600052602060002090601f016020900481019282613a765760008555613abd565b82601f10613a8f57805160ff1916838001178555613abd565b82800160010185558215613abd579182015b82811115613abc578251825591602001919060010190613aa1565b5b509050613aca9190613ace565b5090565b5b80821115613ae7576000816000905550600101613acf565b5090565b6000613afe613af9846149bc565b614997565b905082815260208101848484011115613b1657600080fd5b613b21848285614c3f565b509392505050565b6000613b3c613b37846149ed565b614997565b905082815260208101848484011115613b5457600080fd5b613b5f848285614c3f565b509392505050565b600081359050613b7681615583565b92915050565b600081359050613b8b8161559a565b92915050565b600081359050613ba0816155b1565b92915050565b600081359050613bb5816155c8565b92915050565b600081519050613bca816155c8565b92915050565b600082601f830112613be157600080fd5b8135613bf1848260208601613aeb565b91505092915050565b600081519050613c09816155df565b92915050565b600082601f830112613c2057600080fd5b8135613c30848260208601613b29565b91505092915050565b600081359050613c48816155f6565b92915050565b600060208284031215613c6057600080fd5b6000613c6e84828501613b67565b91505092915050565b60008060408385031215613c8a57600080fd5b6000613c9885828601613b67565b9250506020613ca985828601613b67565b9150509250929050565b600080600060608486031215613cc857600080fd5b6000613cd686828701613b67565b9350506020613ce786828701613b67565b9250506040613cf886828701613c39565b9150509250925092565b60008060008060808587031215613d1857600080fd5b6000613d2687828801613b67565b9450506020613d3787828801613b67565b9350506040613d4887828801613c39565b925050606085013567ffffffffffffffff811115613d6557600080fd5b613d7187828801613bd0565b91505092959194509250565b60008060408385031215613d9057600080fd5b6000613d9e85828601613b67565b9250506020613daf85828601613b7c565b9150509250929050565b60008060408385031215613dcc57600080fd5b6000613dda85828601613b67565b9250506020613deb85828601613c39565b9150509250929050565b600060208284031215613e0757600080fd5b6000613e1584828501613b91565b91505092915050565b60008060408385031215613e3157600080fd5b6000613e3f85828601613b91565b9250506020613e5085828601613b67565b9150509250929050565b600060208284031215613e6c57600080fd5b6000613e7a84828501613ba6565b91505092915050565b600060208284031215613e9557600080fd5b6000613ea384828501613bbb565b91505092915050565b600060208284031215613ebe57600080fd5b6000613ecc84828501613bfa565b91505092915050565b600060208284031215613ee757600080fd5b600082013567ffffffffffffffff811115613f0157600080fd5b613f0d84828501613c0f565b91505092915050565b600060208284031215613f2857600080fd5b6000613f3684828501613c39565b91505092915050565b6000613f4b838361449f565b60208301905092915050565b613f6081614baf565b82525050565b6000613f7182614a2e565b613f7b8185614a5c565b9350613f8683614a1e565b8060005b83811015613fb7578151613f9e8882613f3f565b9750613fa983614a4f565b925050600181019050613f8a565b5085935050505092915050565b613fcd81614bc1565b82525050565b613fdc81614bcd565b82525050565b6000613fed82614a39565b613ff78185614a6d565b9350614007818560208601614c4e565b61401081614e44565b840191505092915050565b600061402682614a44565b6140308185614a7e565b9350614040818560208601614c4e565b61404981614e44565b840191505092915050565b600061405f82614a44565b6140698185614a8f565b9350614079818560208601614c4e565b80840191505092915050565b6000614092602083614a7e565b915061409d82614e55565b602082019050919050565b60006140b5601483614a7e565b91506140c082614e7e565b602082019050919050565b60006140d8602b83614a7e565b91506140e382614ea7565b604082019050919050565b60006140fb603283614a7e565b915061410682614ef6565b604082019050919050565b600061411e602683614a7e565b915061412982614f45565b604082019050919050565b6000614141601c83614a7e565b915061414c82614f94565b602082019050919050565b6000614164602483614a7e565b915061416f82614fbd565b604082019050919050565b6000614187601983614a7e565b91506141928261500c565b602082019050919050565b60006141aa602c83614a7e565b91506141b582615035565b604082019050919050565b60006141cd601383614a7e565b91506141d882615084565b602082019050919050565b60006141f0601083614a7e565b91506141fb826150ad565b602082019050919050565b6000614213601a83614a7e565b915061421e826150d6565b602082019050919050565b6000614236601083614a7e565b9150614241826150ff565b602082019050919050565b6000614259603883614a7e565b915061426482615128565b604082019050919050565b600061427c602a83614a7e565b915061428782615177565b604082019050919050565b600061429f602983614a7e565b91506142aa826151c6565b604082019050919050565b60006142c2602083614a7e565b91506142cd82615215565b602082019050919050565b60006142e5603183614a7e565b91506142f08261523e565b604082019050919050565b6000614308602c83614a7e565b91506143138261528d565b604082019050919050565b600061432b602083614a7e565b9150614336826152dc565b602082019050919050565b600061434e602983614a7e565b915061435982615305565b604082019050919050565b6000614371602f83614a7e565b915061437c82615354565b604082019050919050565b6000614394602183614a7e565b915061439f826153a3565b604082019050919050565b60006143b7601d83614a7e565b91506143c2826153f2565b602082019050919050565b60006143da603183614a7e565b91506143e58261541b565b604082019050919050565b60006143fd602c83614a7e565b91506144088261546a565b604082019050919050565b6000614420601783614a8f565b915061442b826154b9565b601782019050919050565b6000614443601c83614a7e565b915061444e826154e2565b602082019050919050565b6000614466601183614a8f565b91506144718261550b565b601182019050919050565b6000614489602f83614a7e565b915061449482615534565b604082019050919050565b6144a881614c35565b82525050565b6144b781614c35565b82525050565b60006144c98285614054565b91506144d58284614054565b91508190509392505050565b60006144ec82614413565b91506144f88285614054565b915061450382614459565b915061450f8284614054565b91508190509392505050565b60006020820190506145306000830184613f57565b92915050565b600060808201905061454b6000830187613f57565b6145586020830186613f57565b61456560408301856144ae565b81810360608301526145778184613fe2565b905095945050505050565b6000602082019050818103600083015261459c8184613f66565b905092915050565b60006020820190506145b96000830184613fc4565b92915050565b60006020820190506145d46000830184613fd3565b92915050565b600060208201905081810360008301526145f4818461401b565b905092915050565b6000602082019050818103600083015261461581614085565b9050919050565b60006020820190508181036000830152614635816140a8565b9050919050565b60006020820190508181036000830152614655816140cb565b9050919050565b60006020820190508181036000830152614675816140ee565b9050919050565b6000602082019050818103600083015261469581614111565b9050919050565b600060208201905081810360008301526146b581614134565b9050919050565b600060208201905081810360008301526146d581614157565b9050919050565b600060208201905081810360008301526146f58161417a565b9050919050565b600060208201905081810360008301526147158161419d565b9050919050565b60006020820190508181036000830152614735816141c0565b9050919050565b60006020820190508181036000830152614755816141e3565b9050919050565b6000602082019050818103600083015261477581614206565b9050919050565b6000602082019050818103600083015261479581614229565b9050919050565b600060208201905081810360008301526147b58161424c565b9050919050565b600060208201905081810360008301526147d58161426f565b9050919050565b600060208201905081810360008301526147f581614292565b9050919050565b60006020820190508181036000830152614815816142b5565b9050919050565b60006020820190508181036000830152614835816142d8565b9050919050565b60006020820190508181036000830152614855816142fb565b9050919050565b600060208201905081810360008301526148758161431e565b9050919050565b6000602082019050818103600083015261489581614341565b9050919050565b600060208201905081810360008301526148b581614364565b9050919050565b600060208201905081810360008301526148d581614387565b9050919050565b600060208201905081810360008301526148f5816143aa565b9050919050565b60006020820190508181036000830152614915816143cd565b9050919050565b60006020820190508181036000830152614935816143f0565b9050919050565b6000602082019050818103600083015261495581614436565b9050919050565b600060208201905081810360008301526149758161447c565b9050919050565b600060208201905061499160008301846144ae565b92915050565b60006149a16149b2565b90506149ad8282614cdd565b919050565b6000604051905090565b600067ffffffffffffffff8211156149d7576149d6614e15565b5b6149e082614e44565b9050602081019050919050565b600067ffffffffffffffff821115614a0857614a07614e15565b5b614a1182614e44565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614aa582614c35565b9150614ab083614c35565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ae557614ae4614d88565b5b828201905092915050565b6000614afb82614c35565b9150614b0683614c35565b925082614b1657614b15614db7565b5b828204905092915050565b6000614b2c82614c35565b9150614b3783614c35565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b7057614b6f614d88565b5b828202905092915050565b6000614b8682614c35565b9150614b9183614c35565b925082821015614ba457614ba3614d88565b5b828203905092915050565b6000614bba82614c15565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614c0e82614baf565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c6c578082015181840152602081019050614c51565b83811115614c7b576000848401525b50505050565b6000614c8c82614c35565b91506000821415614ca057614c9f614d88565b5b600182039050919050565b60006002820490506001821680614cc357607f821691505b60208210811415614cd757614cd6614de6565b5b50919050565b614ce682614e44565b810181811067ffffffffffffffff82111715614d0557614d04614e15565b5b80604052505050565b6000614d1982614c35565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d4c57614d4b614d88565b5b600182019050919050565b6000614d6282614c35565b9150614d6d83614c35565b925082614d7d57614d7c614db7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e696d756d20455448204e6f74204d657400000000000000000000000000600082015250565b7f4e6f7420596574204c61756e6368656400000000000000000000000000000000600082015250565b7f5075626c6963204d696e74696e67204e6f7420416c6c6f776564000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e204944204d6f7265205468616e204d617820537570706c79000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f416c6c204368756e6b732048617665204265656e20436c61696d656400000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61558c81614baf565b811461559757600080fd5b50565b6155a381614bc1565b81146155ae57600080fd5b50565b6155ba81614bcd565b81146155c557600080fd5b50565b6155d181614bd7565b81146155dc57600080fd5b50565b6155e881614c03565b81146155f357600080fd5b50565b6155ff81614c35565b811461560a57600080fd5b5056fea26469706673582212205ffb67c2466fe6f915407a934f64acb5b567cd8a21e1668515462fea51e2c63d64736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000064368756e6b73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054348554e4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f6d6574612e6368756e6b732e776f726c642f000000000000

Deployed Bytecode

0x6080604052600436106102605760003560e01c806370a0823111610144578063a22cb465116100b6578063d547741f1161007a578063d547741f1461090d578063d5abeb0114610936578063da8fbf2a14610961578063e985e9c514610978578063f2fde38b146109b5578063f8eeed62146109de576102b5565b8063a22cb4651461082c578063ab3f495914610855578063b57441341461087e578063b88d4fde146108a7578063c87b56dd146108d0576102b5565b80638da5cb5b116101085780638da5cb5b1461071857806391d148541461074357806395d89b4114610780578063963df451146107ab57806396532d1c146107d6578063a217fddf14610801576102b5565b806370a0823114610666578063715018a6146106a35780638456cb59146106ba5780638462151c146106d1578063853828b61461070e576102b5565b80632f745c59116101dd57806355f804b3116101a157806355f804b3146105655780635a64ad951461058e5780635c975abb146105b95780636352211e146105e45780636f0cdd30146106215780636f8b44b01461063d576102b5565b80632f745c591461048257806336568abe146104bf5780633f4ba83a146104e857806342842e0e146104ff5780634f6ccce714610528576102b5565b806318160ddd1161022457806318160ddd1461039f578063238a4709146103ca57806323b872dd146103f3578063248a9ca31461041c5780632f2ff15d14610459576102b5565b806301ffc9a7146102ba57806306fdde03146102f7578063081812fc14610322578063095ea7b31461035f5780631602a12414610388576102b5565b366102b5573373ffffffffffffffffffffffffffffffffffffffff167f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874346040516102ab919061497c565b60405180910390a2005b600080fd5b3480156102c657600080fd5b506102e160048036038101906102dc9190613e5a565b610a09565b6040516102ee91906145a4565b60405180910390f35b34801561030357600080fd5b5061030c610a1b565b60405161031991906145da565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613f16565b610aad565b604051610356919061451b565b60405180910390f35b34801561036b57600080fd5b5061038660048036038101906103819190613db9565b610b32565b005b34801561039457600080fd5b5061039d610c4a565b005b3480156103ab57600080fd5b506103b4610c9a565b6040516103c1919061497c565b60405180910390f35b3480156103d657600080fd5b506103f160048036038101906103ec9190613f16565b610ca7565b005b3480156103ff57600080fd5b5061041a60048036038101906104159190613cb3565b610ce4565b005b34801561042857600080fd5b50610443600480360381019061043e9190613df5565b610d44565b60405161045091906145bf565b60405180910390f35b34801561046557600080fd5b50610480600480360381019061047b9190613e1e565b610d64565b005b34801561048e57600080fd5b506104a960048036038101906104a49190613db9565b610d8d565b6040516104b6919061497c565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e19190613e1e565b610e32565b005b3480156104f457600080fd5b506104fd610eb5565b005b34801561050b57600080fd5b5061052660048036038101906105219190613cb3565b610ef2565b005b34801561053457600080fd5b5061054f600480360381019061054a9190613f16565b610f12565b60405161055c919061497c565b60405180910390f35b34801561057157600080fd5b5061058c60048036038101906105879190613ed5565b610fa9565b005b34801561059a57600080fd5b506105a3610ff6565b6040516105b0919061497c565b60405180910390f35b3480156105c557600080fd5b506105ce610ffc565b6040516105db91906145a4565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190613f16565b611013565b604051610618919061451b565b60405180910390f35b61063b60048036038101906106369190613f16565b6110c5565b005b34801561064957600080fd5b50610664600480360381019061065f9190613f16565b6112a3565b005b34801561067257600080fd5b5061068d60048036038101906106889190613c4e565b6112e0565b60405161069a919061497c565b60405180910390f35b3480156106af57600080fd5b506106b8611398565b005b3480156106c657600080fd5b506106cf6114d5565b005b3480156106dd57600080fd5b506106f860048036038101906106f39190613c4e565b611512565b6040516107059190614582565b60405180910390f35b61071661168e565b005b34801561072457600080fd5b5061072d611701565b60405161073a919061451b565b60405180910390f35b34801561074f57600080fd5b5061076a60048036038101906107659190613e1e565b61172b565b60405161077791906145a4565b60405180910390f35b34801561078c57600080fd5b50610795611796565b6040516107a291906145da565b60405180910390f35b3480156107b757600080fd5b506107c0611828565b6040516107cd91906145bf565b60405180910390f35b3480156107e257600080fd5b506107eb61184c565b6040516107f891906145a4565b60405180910390f35b34801561080d57600080fd5b5061081661185f565b60405161082391906145bf565b60405180910390f35b34801561083857600080fd5b50610853600480360381019061084e9190613d7d565b611866565b005b34801561086157600080fd5b5061087c60048036038101906108779190613f16565b6119e7565b005b34801561088a57600080fd5b506108a560048036038101906108a09190613f16565b611afe565b005b3480156108b357600080fd5b506108ce60048036038101906108c99190613d02565b611b3b565b005b3480156108dc57600080fd5b506108f760048036038101906108f29190613f16565b611b9d565b60405161090491906145da565b60405180910390f35b34801561091957600080fd5b50610934600480360381019061092f9190613e1e565b611baf565b005b34801561094257600080fd5b5061094b611bd8565b604051610958919061497c565b60405180910390f35b34801561096d57600080fd5b50610976611bde565b005b34801561098457600080fd5b5061099f600480360381019061099a9190613c77565b611c2e565b6040516109ac91906145a4565b60405180910390f35b3480156109c157600080fd5b506109dc60048036038101906109d79190613c4e565b611d30565b005b3480156109ea57600080fd5b506109f3611edc565b604051610a00919061497c565b60405180910390f35b6000610a1482611ee2565b9050919050565b606060008054610a2a90614cab565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5690614cab565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b6000610ab882611f5c565b610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee9061483c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3d82611013565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba5906148bc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bcd611fc8565b73ffffffffffffffffffffffffffffffffffffffff161480610bfc5750610bfb81610bf6611fc8565b611c2e565b5b610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c329061479c565b60405180910390fd5b610c458383611fd0565b505050565b610c747feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b610c7d57600080fd5b6001600e60006101000a81548160ff021916908315150217905550565b6000600880549050905090565b610cd17feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b610cda57600080fd5b8060108190555050565b610cf5610cef611fc8565b82612089565b610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2b906148fc565b60405180910390fd5b610d3f838383612167565b505050565b6000600c6000838152602001908152602001600020600101549050919050565b610d6d82610d44565b610d7e81610d79611fc8565b6123c3565b610d888383612460565b505050565b6000610d98836112e0565b8210610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd09061463c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e3a611fc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e9061495c565b60405180910390fd5b610eb18282612541565b5050565b610edf7feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b610ee857600080fd5b610ef0612623565b565b610f0d83838360405180602001604052806000815250611b3b565b505050565b6000610f1c610c9a565b8210610f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f549061491c565b60405180910390fd5b60088281548110610f97577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610fd37feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b610fdc57600080fd5b8060129080519060200190610ff2929190613a48565b5050565b60105481565b6000600b60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b3906147dc565b60405180910390fd5b80915050919050565b6110cd6126c5565b6110d5610c9a565b10611115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110c9061493c565b60405180910390fd5b61111d6126c5565b811061115e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611155906148dc565b60405180910390fd5b6111666126cf565b3410156111a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119f9061471c565b60405180910390fd5b6111b06126d9565b4210156111f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e99061473c565b60405180910390fd5b60011515600e60009054906101000a900460ff16151514611248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123f9061475c565b60405180910390fd5b61125233826126e3565b3373ffffffffffffffffffffffffffffffffffffffff167f7f76921b7dc8c6e49c47b65c324e6edde49cc1aa3ef63ad0b49e3f82b1aeedf282604051611298919061497c565b60405180910390a250565b6112cd7feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b6112d657600080fd5b80600f8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611351576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611348906147bc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113a0611fc8565b73ffffffffffffffffffffffffffffffffffffffff166113be611701565b73ffffffffffffffffffffffffffffffffffffffff1614611414576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140b9061485c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6114ff7feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b61150857600080fd5b611510612701565b565b6060600061151f836112e0565b905060008114156115a257600067ffffffffffffffff81111561156b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156115995781602001602082028036833780820191505090505b50915050611689565b60008167ffffffffffffffff8111156115e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156116125781602001602082028036833780820191505090505b50905060005b828110156116825761162a8582610d8d565b828281518110611663577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061167a90614d0e565b915050611618565b8193505050505b919050565b6116b87feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b6116c157600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506116ff57600080fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546117a590614cab565b80601f01602080910402602001604051908101604052809291908181526020018280546117d190614cab565b801561181e5780601f106117f35761010080835404028352916020019161181e565b820191906000526020600020905b81548152906001019060200180831161180157829003601f168201915b5050505050905090565b7feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c081565b600e60009054906101000a900460ff1681565b6000801b81565b61186e611fc8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d3906146dc565b60405180910390fd5b80600560006118e9611fc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611996611fc8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119db91906145a4565b60405180910390a35050565b611a117feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b611a1a57600080fd5b611a226126c5565b611a2a610c9a565b10611a6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a619061493c565b60405180910390fd5b611a726126c5565b8110611ab3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aaa906148dc565b60405180910390fd5b611ac4611abe611701565b826126e3565b7f7b652a72b03af65b17e2a88b354b8b14098301a5f45c1f430f3b64c7d5bdf3c981604051611af3919061497c565b60405180910390a150565b611b287feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b611b3157600080fd5b8060118190555050565b611b4c611b46611fc8565b83612089565b611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b82906148fc565b60405180910390fd5b611b97848484846127a4565b50505050565b6060611ba882612800565b9050919050565b611bb882610d44565b611bc981611bc4611fc8565b6123c3565b611bd38383612541565b505050565b600f5481565b611c087feece7e5af8578aafb8b9a2e1d532d4a6a32e4fa3c0c2b0391a35df0c0e79c6c03361172b565b611c1157600080fd5b6000600e60006101000a81548160ff021916908315150217905550565b600080601360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611ca6919061451b565b60206040518083038186803b158015611cbe57600080fd5b505afa158015611cd2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf69190613eac565b73ffffffffffffffffffffffffffffffffffffffff161415611d1c576001915050611d2a565b611d268484612952565b9150505b92915050565b611d38611fc8565b73ffffffffffffffffffffffffffffffffffffffff16611d56611701565b73ffffffffffffffffffffffffffffffffffffffff1614611dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da39061485c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e139061467c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60115481565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f555750611f54826129e6565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661204383611013565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061209482611f5c565b6120d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ca906146fc565b60405180910390fd5b60006120de83611013565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061214d57508373ffffffffffffffffffffffffffffffffffffffff1661213584610aad565b73ffffffffffffffffffffffffffffffffffffffff16145b8061215e575061215d8185611c2e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661218782611013565b73ffffffffffffffffffffffffffffffffffffffff16146121dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d49061487c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561224d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612244906146bc565b60405180910390fd5b612258838383612a60565b612263600082611fd0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b39190614b7b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461230a9190614a9a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6123cd828261172b565b61245c576123f28173ffffffffffffffffffffffffffffffffffffffff166014612ab8565b6124008360001c6020612ab8565b6040516020016124119291906144e1565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245391906145da565b60405180910390fd5b5050565b61246a828261172b565b61253d576001600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124e2611fc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61254b828261172b565b1561261f576000600c600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506125c4611fc8565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61262b610ffc565b61266a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126619061461c565b60405180910390fd5b6000600b60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6126ae611fc8565b6040516126bb919061451b565b60405180910390a1565b6000600f54905090565b6000601054905090565b6000601154905090565b6126fd828260405180602001604052806000815250612db2565b5050565b612709610ffc565b15612749576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127409061477c565b60405180910390fd5b6001600b60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861278d611fc8565b60405161279a919061451b565b60405180910390a1565b6127af848484612167565b6127bb84848484612e0d565b6127fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f19061465c565b60405180910390fd5b50505050565b606061280b82611f5c565b61284a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128419061481c565b60405180910390fd5b6000600a6000848152602001908152602001600020805461286a90614cab565b80601f016020809104026020016040519081016040528092919081815260200182805461289690614cab565b80156128e35780601f106128b8576101008083540402835291602001916128e3565b820191906000526020600020905b8154815290600101906020018083116128c657829003601f168201915b5050505050905060006128f4612fa4565b905060008151141561290a57819250505061294d565b60008251111561293f5780826040516020016129279291906144bd565b6040516020818303038152906040529250505061294d565b61294884613036565b925050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612a595750612a58826130dd565b5b9050919050565b612a68610ffc565b15612aa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9f9061477c565b60405180910390fd5b612ab38383836131bf565b505050565b606060006002836002612acb9190614b21565b612ad59190614a9a565b67ffffffffffffffff811115612b14577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612b465781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612ba4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612c2e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612c6e9190614b21565b612c789190614a9a565b90505b6001811115612d64577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612ce0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612d1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612d5d90614c81565b9050612c7b565b5060008414612da8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9f906145fc565b60405180910390fd5b8091505092915050565b612dbc83836132d3565b612dc96000848484612e0d565b612e08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dff9061465c565b60405180910390fd5b505050565b6000612e2e8473ffffffffffffffffffffffffffffffffffffffff166134a1565b15612f97578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e57611fc8565b8786866040518563ffffffff1660e01b8152600401612e799493929190614536565b602060405180830381600087803b158015612e9357600080fd5b505af1925050508015612ec457506040513d601f19601f82011682018060405250810190612ec19190613e83565b60015b612f47573d8060008114612ef4576040519150601f19603f3d011682016040523d82523d6000602084013e612ef9565b606091505b50600081511415612f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f369061465c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f9c565b600190505b949350505050565b606060128054612fb390614cab565b80601f0160208091040260200160405190810160405280929190818152602001828054612fdf90614cab565b801561302c5780601f106130015761010080835404028352916020019161302c565b820191906000526020600020905b81548152906001019060200180831161300f57829003601f168201915b5050505050905090565b606061304182611f5c565b613080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130779061489c565b60405180910390fd5b600061308a612fa4565b905060008151116130aa57604051806020016040528060008152506130d5565b806130b4846134b4565b6040516020016130c59291906144bd565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806131a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806131b857506131b782613661565b5b9050919050565b6131ca8383836136cb565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561320d57613208816136d0565b61324c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461324b5761324a8382613719565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561328f5761328a81613886565b6132ce565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132cd576132cc82826139c9565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333a906147fc565b60405180910390fd5b61334c81611f5c565b1561338c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133839061469c565b60405180910390fd5b61339860008383612a60565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133e89190614a9a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b606060008214156134fc576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061365c565b600082905060005b6000821461352e57808061351790614d0e565b915050600a826135279190614af0565b9150613504565b60008167ffffffffffffffff811115613570577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156135a25781602001600182028036833780820191505090505b5090505b60008514613655576001826135bb9190614b7b565b9150600a856135ca9190614d57565b60306135d69190614a9a565b60f81b818381518110613612577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561364e9190614af0565b94506135a6565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613726846112e0565b6137309190614b7b565b9050600060076000848152602001908152602001600020549050818114613815576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061389a9190614b7b565b90506000600960008481526020019081526020016000205490506000600883815481106138f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613938577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806139ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006139d4836112e0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054613a5490614cab565b90600052602060002090601f016020900481019282613a765760008555613abd565b82601f10613a8f57805160ff1916838001178555613abd565b82800160010185558215613abd579182015b82811115613abc578251825591602001919060010190613aa1565b5b509050613aca9190613ace565b5090565b5b80821115613ae7576000816000905550600101613acf565b5090565b6000613afe613af9846149bc565b614997565b905082815260208101848484011115613b1657600080fd5b613b21848285614c3f565b509392505050565b6000613b3c613b37846149ed565b614997565b905082815260208101848484011115613b5457600080fd5b613b5f848285614c3f565b509392505050565b600081359050613b7681615583565b92915050565b600081359050613b8b8161559a565b92915050565b600081359050613ba0816155b1565b92915050565b600081359050613bb5816155c8565b92915050565b600081519050613bca816155c8565b92915050565b600082601f830112613be157600080fd5b8135613bf1848260208601613aeb565b91505092915050565b600081519050613c09816155df565b92915050565b600082601f830112613c2057600080fd5b8135613c30848260208601613b29565b91505092915050565b600081359050613c48816155f6565b92915050565b600060208284031215613c6057600080fd5b6000613c6e84828501613b67565b91505092915050565b60008060408385031215613c8a57600080fd5b6000613c9885828601613b67565b9250506020613ca985828601613b67565b9150509250929050565b600080600060608486031215613cc857600080fd5b6000613cd686828701613b67565b9350506020613ce786828701613b67565b9250506040613cf886828701613c39565b9150509250925092565b60008060008060808587031215613d1857600080fd5b6000613d2687828801613b67565b9450506020613d3787828801613b67565b9350506040613d4887828801613c39565b925050606085013567ffffffffffffffff811115613d6557600080fd5b613d7187828801613bd0565b91505092959194509250565b60008060408385031215613d9057600080fd5b6000613d9e85828601613b67565b9250506020613daf85828601613b7c565b9150509250929050565b60008060408385031215613dcc57600080fd5b6000613dda85828601613b67565b9250506020613deb85828601613c39565b9150509250929050565b600060208284031215613e0757600080fd5b6000613e1584828501613b91565b91505092915050565b60008060408385031215613e3157600080fd5b6000613e3f85828601613b91565b9250506020613e5085828601613b67565b9150509250929050565b600060208284031215613e6c57600080fd5b6000613e7a84828501613ba6565b91505092915050565b600060208284031215613e9557600080fd5b6000613ea384828501613bbb565b91505092915050565b600060208284031215613ebe57600080fd5b6000613ecc84828501613bfa565b91505092915050565b600060208284031215613ee757600080fd5b600082013567ffffffffffffffff811115613f0157600080fd5b613f0d84828501613c0f565b91505092915050565b600060208284031215613f2857600080fd5b6000613f3684828501613c39565b91505092915050565b6000613f4b838361449f565b60208301905092915050565b613f6081614baf565b82525050565b6000613f7182614a2e565b613f7b8185614a5c565b9350613f8683614a1e565b8060005b83811015613fb7578151613f9e8882613f3f565b9750613fa983614a4f565b925050600181019050613f8a565b5085935050505092915050565b613fcd81614bc1565b82525050565b613fdc81614bcd565b82525050565b6000613fed82614a39565b613ff78185614a6d565b9350614007818560208601614c4e565b61401081614e44565b840191505092915050565b600061402682614a44565b6140308185614a7e565b9350614040818560208601614c4e565b61404981614e44565b840191505092915050565b600061405f82614a44565b6140698185614a8f565b9350614079818560208601614c4e565b80840191505092915050565b6000614092602083614a7e565b915061409d82614e55565b602082019050919050565b60006140b5601483614a7e565b91506140c082614e7e565b602082019050919050565b60006140d8602b83614a7e565b91506140e382614ea7565b604082019050919050565b60006140fb603283614a7e565b915061410682614ef6565b604082019050919050565b600061411e602683614a7e565b915061412982614f45565b604082019050919050565b6000614141601c83614a7e565b915061414c82614f94565b602082019050919050565b6000614164602483614a7e565b915061416f82614fbd565b604082019050919050565b6000614187601983614a7e565b91506141928261500c565b602082019050919050565b60006141aa602c83614a7e565b91506141b582615035565b604082019050919050565b60006141cd601383614a7e565b91506141d882615084565b602082019050919050565b60006141f0601083614a7e565b91506141fb826150ad565b602082019050919050565b6000614213601a83614a7e565b915061421e826150d6565b602082019050919050565b6000614236601083614a7e565b9150614241826150ff565b602082019050919050565b6000614259603883614a7e565b915061426482615128565b604082019050919050565b600061427c602a83614a7e565b915061428782615177565b604082019050919050565b600061429f602983614a7e565b91506142aa826151c6565b604082019050919050565b60006142c2602083614a7e565b91506142cd82615215565b602082019050919050565b60006142e5603183614a7e565b91506142f08261523e565b604082019050919050565b6000614308602c83614a7e565b91506143138261528d565b604082019050919050565b600061432b602083614a7e565b9150614336826152dc565b602082019050919050565b600061434e602983614a7e565b915061435982615305565b604082019050919050565b6000614371602f83614a7e565b915061437c82615354565b604082019050919050565b6000614394602183614a7e565b915061439f826153a3565b604082019050919050565b60006143b7601d83614a7e565b91506143c2826153f2565b602082019050919050565b60006143da603183614a7e565b91506143e58261541b565b604082019050919050565b60006143fd602c83614a7e565b91506144088261546a565b604082019050919050565b6000614420601783614a8f565b915061442b826154b9565b601782019050919050565b6000614443601c83614a7e565b915061444e826154e2565b602082019050919050565b6000614466601183614a8f565b91506144718261550b565b601182019050919050565b6000614489602f83614a7e565b915061449482615534565b604082019050919050565b6144a881614c35565b82525050565b6144b781614c35565b82525050565b60006144c98285614054565b91506144d58284614054565b91508190509392505050565b60006144ec82614413565b91506144f88285614054565b915061450382614459565b915061450f8284614054565b91508190509392505050565b60006020820190506145306000830184613f57565b92915050565b600060808201905061454b6000830187613f57565b6145586020830186613f57565b61456560408301856144ae565b81810360608301526145778184613fe2565b905095945050505050565b6000602082019050818103600083015261459c8184613f66565b905092915050565b60006020820190506145b96000830184613fc4565b92915050565b60006020820190506145d46000830184613fd3565b92915050565b600060208201905081810360008301526145f4818461401b565b905092915050565b6000602082019050818103600083015261461581614085565b9050919050565b60006020820190508181036000830152614635816140a8565b9050919050565b60006020820190508181036000830152614655816140cb565b9050919050565b60006020820190508181036000830152614675816140ee565b9050919050565b6000602082019050818103600083015261469581614111565b9050919050565b600060208201905081810360008301526146b581614134565b9050919050565b600060208201905081810360008301526146d581614157565b9050919050565b600060208201905081810360008301526146f58161417a565b9050919050565b600060208201905081810360008301526147158161419d565b9050919050565b60006020820190508181036000830152614735816141c0565b9050919050565b60006020820190508181036000830152614755816141e3565b9050919050565b6000602082019050818103600083015261477581614206565b9050919050565b6000602082019050818103600083015261479581614229565b9050919050565b600060208201905081810360008301526147b58161424c565b9050919050565b600060208201905081810360008301526147d58161426f565b9050919050565b600060208201905081810360008301526147f581614292565b9050919050565b60006020820190508181036000830152614815816142b5565b9050919050565b60006020820190508181036000830152614835816142d8565b9050919050565b60006020820190508181036000830152614855816142fb565b9050919050565b600060208201905081810360008301526148758161431e565b9050919050565b6000602082019050818103600083015261489581614341565b9050919050565b600060208201905081810360008301526148b581614364565b9050919050565b600060208201905081810360008301526148d581614387565b9050919050565b600060208201905081810360008301526148f5816143aa565b9050919050565b60006020820190508181036000830152614915816143cd565b9050919050565b60006020820190508181036000830152614935816143f0565b9050919050565b6000602082019050818103600083015261495581614436565b9050919050565b600060208201905081810360008301526149758161447c565b9050919050565b600060208201905061499160008301846144ae565b92915050565b60006149a16149b2565b90506149ad8282614cdd565b919050565b6000604051905090565b600067ffffffffffffffff8211156149d7576149d6614e15565b5b6149e082614e44565b9050602081019050919050565b600067ffffffffffffffff821115614a0857614a07614e15565b5b614a1182614e44565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000614aa582614c35565b9150614ab083614c35565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ae557614ae4614d88565b5b828201905092915050565b6000614afb82614c35565b9150614b0683614c35565b925082614b1657614b15614db7565b5b828204905092915050565b6000614b2c82614c35565b9150614b3783614c35565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b7057614b6f614d88565b5b828202905092915050565b6000614b8682614c35565b9150614b9183614c35565b925082821015614ba457614ba3614d88565b5b828203905092915050565b6000614bba82614c15565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614c0e82614baf565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614c6c578082015181840152602081019050614c51565b83811115614c7b576000848401525b50505050565b6000614c8c82614c35565b91506000821415614ca057614c9f614d88565b5b600182039050919050565b60006002820490506001821680614cc357607f821691505b60208210811415614cd757614cd6614de6565b5b50919050565b614ce682614e44565b810181811067ffffffffffffffff82111715614d0557614d04614e15565b5b80604052505050565b6000614d1982614c35565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d4c57614d4b614d88565b5b600182019050919050565b6000614d6282614c35565b9150614d6d83614c35565b925082614d7d57614d7c614db7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d696e696d756d20455448204e6f74204d657400000000000000000000000000600082015250565b7f4e6f7420596574204c61756e6368656400000000000000000000000000000000600082015250565b7f5075626c6963204d696e74696e67204e6f7420416c6c6f776564000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f546f6b656e204944204d6f7265205468616e204d617820537570706c79000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f416c6c204368756e6b732048617665204265656e20436c61696d656400000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61558c81614baf565b811461559757600080fd5b50565b6155a381614bc1565b81146155ae57600080fd5b50565b6155ba81614bcd565b81146155c557600080fd5b50565b6155d181614bd7565b81146155dc57600080fd5b50565b6155e881614c03565b81146155f357600080fd5b50565b6155ff81614c35565b811461560a57600080fd5b5056fea26469706673582212205ffb67c2466fe6f915407a934f64acb5b567cd8a21e1668515462fea51e2c63d64736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000064368756e6b73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054348554e4b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001a68747470733a2f2f6d6574612e6368756e6b732e776f726c642f000000000000

-----Decoded View---------------
Arg [0] : name (string): Chunks
Arg [1] : symbol (string): CHUNK
Arg [2] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [3] : _baseURIExtended (string): https://meta.chunks.world/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 4368756e6b730000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 4348554e4b000000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000001a
Arg [9] : 68747470733a2f2f6d6574612e6368756e6b732e776f726c642f000000000000


Deployed Bytecode Sourcemap

61262:5657:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62472:10;62463:31;;;62484:9;62463:31;;;;;;:::i;:::-;;;;;;;;61262:5657;;;;;65696:227;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20741:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22201:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21738:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64669:126;;;;;;;;;;;;;:::i;:::-;;33968:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63918:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23091:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48761:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49146:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33636:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50194:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64551:110;;;;;;;;;;;;;:::i;:::-;;23467:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34158:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63381:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61614:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42247:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20435:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62510:515;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63662:143;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20165:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53580:148;;;;;;;;;;;;;:::i;:::-;;64437:106;;;;;;;;;;;;;:::i;:::-;;66382:534;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64938:162;;;:::i;:::-;;52929:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47759:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20910:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61513:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61472:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45724:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22494:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63033:340;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64175:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23689:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65492:196;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49538:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61576:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64803:127;;;;;;;;;;;;;:::i;:::-;;65931:443;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53883:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61666:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65696:227;65850:4;65879:36;65903:11;65879:23;:36::i;:::-;65872:43;;65696:227;;;:::o;20741:100::-;20795:13;20828:5;20821:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20741:100;:::o;22201:221::-;22277:7;22305:16;22313:7;22305;:16::i;:::-;22297:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22390:15;:24;22406:7;22390:24;;;;;;;;;;;;;;;;;;;;;22383:31;;22201:221;;;:::o;21738:397::-;21819:13;21835:23;21850:7;21835:14;:23::i;:::-;21819:39;;21883:5;21877:11;;:2;:11;;;;21869:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21963:5;21947:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21972:37;21989:5;21996:12;:10;:12::i;:::-;21972:16;:37::i;:::-;21947:62;21939:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22106:21;22115:2;22119:7;22106:8;:21::i;:::-;21738:397;;;:::o;64669:126::-;64719:29;61548:21;64737:10;64719:7;:29::i;:::-;64711:38;;;;;;64783:4;64766:14;;:21;;;;;;;;;;;;;;;;;;64669:126::o;33968:113::-;34029:7;34056:10;:17;;;;34049:24;;33968:113;:::o;63918:147::-;63990:29;61548:21;64008:10;63990:7;:29::i;:::-;63982:38;;;;;;64046:11;64033:10;:24;;;;63918:147;:::o;23091:305::-;23252:41;23271:12;:10;:12::i;:::-;23285:7;23252:18;:41::i;:::-;23244:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23360:28;23370:4;23376:2;23380:7;23360:9;:28::i;:::-;23091:305;;;:::o;48761:123::-;48827:7;48854:6;:12;48861:4;48854:12;;;;;;;;;;;:22;;;48847:29;;48761:123;;;:::o;49146:147::-;49229:18;49242:4;49229:12;:18::i;:::-;47328:30;47339:4;47345:12;:10;:12::i;:::-;47328:10;:30::i;:::-;49260:25:::1;49271:4;49277:7;49260:10;:25::i;:::-;49146:147:::0;;;:::o;33636:256::-;33733:7;33769:23;33786:5;33769:16;:23::i;:::-;33761:5;:31;33753:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;33858:12;:19;33871:5;33858:19;;;;;;;;;;;;;;;:26;33878:5;33858:26;;;;;;;;;;;;33851:33;;33636:256;;;;:::o;50194:218::-;50301:12;:10;:12::i;:::-;50290:23;;:7;:23;;;50282:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;50378:26;50390:4;50396:7;50378:11;:26::i;:::-;50194:218;;:::o;64551:110::-;64596:29;61548:21;64614:10;64596:7;:29::i;:::-;64588:38;;;;;;64643:10;:8;:10::i;:::-;64551:110::o;23467:151::-;23571:39;23588:4;23594:2;23598:7;23571:39;;;;;;;;;;;;:16;:39::i;:::-;23467:151;;;:::o;34158:233::-;34233:7;34269:30;:28;:30::i;:::-;34261:5;:38;34253:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;34366:10;34377:5;34366:17;;;;;;;;;;;;;;;;;;;;;;;;34359:24;;34158:233;;;:::o;63381:149::-;63453:29;61548:21;63471:10;63453:7;:29::i;:::-;63445:38;;;;;;63514:8;63496:15;:26;;;;;;;;;;;;:::i;:::-;;63381:149;:::o;61614:45::-;;;;:::o;42247:86::-;42294:4;42318:7;;;;;;;;;;;42311:14;;42247:86;:::o;20435:239::-;20507:7;20527:13;20543:7;:16;20551:7;20543:16;;;;;;;;;;;;;;;;;;;;;20527:32;;20595:1;20578:19;;:5;:19;;;;20570:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20661:5;20654:12;;;20435:239;;;:::o;62510:515::-;62596:12;:10;:12::i;:::-;62580:13;:11;:13::i;:::-;:28;62572:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;62670:12;:10;:12::i;:::-;62660:7;:22;62652:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;62748:10;:8;:10::i;:::-;62735:9;:23;;62727:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;62820:13;:11;:13::i;:::-;62801:15;:32;;62793:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;62891:4;62873:22;;:14;;;;;;;;;;;:22;;;62865:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;62939:30;62949:10;62961:7;62939:9;:30::i;:::-;62997:10;62985:32;;;63009:7;62985:32;;;;;;:::i;:::-;;;;;;;;62510:515;:::o;63662:143::-;63732:29;61548:21;63750:10;63732:7;:29::i;:::-;63724:38;;;;;;63787:10;63775:9;:22;;;;63662:143;:::o;20165:208::-;20237:7;20282:1;20265:19;;:5;:19;;;;20257:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20349:9;:16;20359:5;20349:16;;;;;;;;;;;;;;;;20342:23;;20165:208;;;:::o;53580:148::-;53160:12;:10;:12::i;:::-;53149:23;;:7;:5;:7::i;:::-;:23;;;53141:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53687:1:::1;53650:40;;53671:6;;;;;;;;;;;53650:40;;;;;;;;;;;;53718:1;53701:6;;:19;;;;;;;;;;;;;;;;;;53580:148::o:0;64437:106::-;64480:29;61548:21;64498:10;64480:7;:29::i;:::-;64472:38;;;;;;64527:8;:6;:8::i;:::-;64437:106::o;66382:534::-;66471:16;66505:18;66526:17;66536:6;66526:9;:17::i;:::-;66505:38;;66572:1;66558:10;:15;66554:355;;;66611:1;66597:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66590:23;;;;;66554:355;66646:23;66686:10;66672:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66646:51;;66712:13;66740:130;66764:10;66756:5;:18;66740:130;;;66820:34;66840:6;66848:5;66820:19;:34::i;:::-;66804:6;66811:5;66804:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;66776:7;;;;;:::i;:::-;;;;66740:130;;;66891:6;66884:13;;;;;66382:534;;;;:::o;64938:162::-;64995:29;61548:21;65013:10;64995:7;:29::i;:::-;64987:38;;;;;;65052:10;65044:24;;:47;65069:21;65044:47;;;;;;;;;;;;;;;;;;;;;;;65036:56;;;;;;64938:162::o;52929:87::-;52975:7;53002:6;;;;;;;;;;;52995:13;;52929:87;:::o;47759:139::-;47837:4;47861:6;:12;47868:4;47861:12;;;;;;;;;;;:20;;:29;47882:7;47861:29;;;;;;;;;;;;;;;;;;;;;;;;;47854:36;;47759:139;;;;:::o;20910:104::-;20966:13;20999:7;20992:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20910:104;:::o;61513:56::-;61548:21;61513:56;:::o;61472:34::-;;;;;;;;;;;;;:::o;45724:49::-;45769:4;45724:49;;;:::o;22494:295::-;22609:12;:10;:12::i;:::-;22597:24;;:8;:24;;;;22589:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22709:8;22664:18;:32;22683:12;:10;:12::i;:::-;22664:32;;;;;;;;;;;;;;;:42;22697:8;22664:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22762:8;22733:48;;22748:12;:10;:12::i;:::-;22733:48;;;22772:8;22733:48;;;;;;:::i;:::-;;;;;;;;22494:295;;:::o;63033:340::-;63098:29;61548:21;63116:10;63098:7;:29::i;:::-;63090:38;;;;;;63163:12;:10;:12::i;:::-;63147:13;:11;:13::i;:::-;:28;63139:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;63237:12;:10;:12::i;:::-;63227:7;:22;63219:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;63300:27;63310:7;:5;:7::i;:::-;63319;63300:9;:27::i;:::-;63343:22;63357:7;63343:22;;;;;;:::i;:::-;;;;;;;;63033:340;:::o;64175:147::-;64247:29;61548:21;64265:10;64247:7;:29::i;:::-;64239:38;;;;;;64303:11;64290:10;:24;;;;64175:147;:::o;23689:285::-;23821:41;23840:12;:10;:12::i;:::-;23854:7;23821:18;:41::i;:::-;23813:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23927:39;23941:4;23947:2;23951:7;23960:5;23927:13;:39::i;:::-;23689:285;;;;:::o;65492:196::-;65619:13;65657:23;65672:7;65657:14;:23::i;:::-;65650:30;;65492:196;;;:::o;49538:149::-;49622:18;49635:4;49622:12;:18::i;:::-;47328:30;47339:4;47345:12;:10;:12::i;:::-;47328:10;:30::i;:::-;49653:26:::1;49665:4;49671:7;49653:11;:26::i;:::-;49538:149:::0;;;:::o;61576:31::-;;;;:::o;64803:127::-;64853:29;61548:21;64871:10;64853:7;:29::i;:::-;64845:38;;;;;;64917:5;64900:14;;:22;;;;;;;;;;;;;;;;;;64803:127::o;65931:443::-;66056:4;66141:27;66185:20;;;;;;;;;;;66141:65;;66262:8;66221:49;;66229:13;:21;;;66251:5;66229:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66221:49;;;66217:93;;;66294:4;66287:11;;;;;66217:93;66327:39;66350:5;66357:8;66327:22;:39::i;:::-;66320:46;;;65931:443;;;;;:::o;53883:244::-;53160:12;:10;:12::i;:::-;53149:23;;:7;:5;:7::i;:::-;:23;;;53141:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53992:1:::1;53972:22;;:8;:22;;;;53964:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;54082:8;54053:38;;54074:6;;;;;;;;;;;54053:38;;;;;;;;;;;;54111:8;54102:6;;:17;;;;;;;;;;;;;;;;;;53883:244:::0;:::o;61666:43::-;;;;:::o;47450:217::-;47535:4;47574:32;47559:47;;;:11;:47;;;;:100;;;;47623:36;47647:11;47623:23;:36::i;:::-;47559:100;47552:107;;47450:217;;;:::o;25441:127::-;25506:4;25558:1;25530:30;;:7;:16;25538:7;25530:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25523:37;;25441:127;;;:::o;15372:98::-;15425:7;15452:10;15445:17;;15372:98;:::o;29318:174::-;29420:2;29393:15;:24;29409:7;29393:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29476:7;29472:2;29438:46;;29447:23;29462:7;29447:14;:23::i;:::-;29438:46;;;;;;;;;;;;29318:174;;:::o;25735:348::-;25828:4;25853:16;25861:7;25853;:16::i;:::-;25845:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25929:13;25945:23;25960:7;25945:14;:23::i;:::-;25929:39;;25998:5;25987:16;;:7;:16;;;:51;;;;26031:7;26007:31;;:20;26019:7;26007:11;:20::i;:::-;:31;;;25987:51;:87;;;;26042:32;26059:5;26066:7;26042:16;:32::i;:::-;25987:87;25979:96;;;25735:348;;;;:::o;28656:544::-;28781:4;28754:31;;:23;28769:7;28754:14;:23::i;:::-;:31;;;28746:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28864:1;28850:16;;:2;:16;;;;28842:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28920:39;28941:4;28947:2;28951:7;28920:20;:39::i;:::-;29024:29;29041:1;29045:7;29024:8;:29::i;:::-;29085:1;29066:9;:15;29076:4;29066:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29114:1;29097:9;:13;29107:2;29097:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29145:2;29126:7;:16;29134:7;29126:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29184:7;29180:2;29165:27;;29174:4;29165:27;;;;;;;;;;;;28656:544;;;:::o;48188:384::-;48268:22;48276:4;48282:7;48268;:22::i;:::-;48264:301;;48400:41;48428:7;48400:41;;48438:2;48400:19;:41::i;:::-;48498:38;48526:4;48518:13;;48533:2;48498:19;:38::i;:::-;48321:230;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48307:246;;;;;;;;;;;:::i;:::-;;;;;;;;48264:301;48188:384;;:::o;51442:229::-;51517:22;51525:4;51531:7;51517;:22::i;:::-;51512:152;;51588:4;51556:6;:12;51563:4;51556:12;;;;;;;;;;;:20;;:29;51577:7;51556:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;51639:12;:10;:12::i;:::-;51612:40;;51630:7;51612:40;;51624:4;51612:40;;;;;;;;;;51512:152;51442:229;;:::o;51679:230::-;51754:22;51762:4;51768:7;51754;:22::i;:::-;51750:152;;;51825:5;51793:6;:12;51800:4;51793:12;;;;;;;;;;;:20;;:29;51814:7;51793:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;51877:12;:10;:12::i;:::-;51850:40;;51868:7;51850:40;;51862:4;51850:40;;;;;;;;;;51750:152;51679:230;;:::o;43306:120::-;42850:8;:6;:8::i;:::-;42842:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;43375:5:::1;43365:7;;:15;;;;;;;;;;;;;;;;;;43396:22;43405:12;:10;:12::i;:::-;43396:22;;;;;;:::i;:::-;;;;;;;;43306:120::o:0;63811:97::-;63864:7;63891:9;;63884:16;;63811:97;:::o;64071:96::-;64122:7;64149:10;;64142:17;;64071:96;:::o;64330:99::-;64384:7;64411:10;;64404:17;;64330:99;:::o;26425:110::-;26501:26;26511:2;26515:7;26501:26;;;;;;;;;;;;:9;:26::i;:::-;26425:110;;:::o;43047:118::-;42573:8;:6;:8::i;:::-;42572:9;42564:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;43117:4:::1;43107:7;;:14;;;;;;;;;;;;;;;;;;43137:20;43144:12;:10;:12::i;:::-;43137:20;;;;;;:::i;:::-;;;;;;;;43047:118::o:0;24856:272::-;24970:28;24980:4;24986:2;24990:7;24970:9;:28::i;:::-;25017:48;25040:4;25046:2;25050:7;25059:5;25017:22;:48::i;:::-;25009:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24856:272;;;;:::o;39764:679::-;39837:13;39871:16;39879:7;39871;:16::i;:::-;39863:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;39954:23;39980:10;:19;39991:7;39980:19;;;;;;;;;;;39954:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40010:18;40031:10;:8;:10::i;:::-;40010:31;;40139:1;40123:4;40117:18;:23;40113:72;;;40164:9;40157:16;;;;;;40113:72;40315:1;40295:9;40289:23;:27;40285:108;;;40364:4;40370:9;40347:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40333:48;;;;;;40285:108;40412:23;40427:7;40412:14;:23::i;:::-;40405:30;;;;39764:679;;;;:::o;22860:164::-;22957:4;22981:18;:25;23000:5;22981:25;;;;;;;;;;;;;;;:35;23007:8;22981:35;;;;;;;;;;;;;;;;;;;;;;;;;22974:42;;22860:164;;;;:::o;33315:237::-;33417:4;33456:35;33441:50;;;:11;:50;;;;:103;;;;33508:36;33532:11;33508:23;:36::i;:::-;33441:103;33434:110;;33315:237;;;:::o;65109:229::-;42573:8;:6;:8::i;:::-;42572:9;42564:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;65285:45:::1;65312:4;65318:2;65322:7;65285:26;:45::i;:::-;65109:229:::0;;;:::o;17248:447::-;17323:13;17349:19;17394:1;17385:6;17381:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17371:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17349:47;;17407:15;:6;17414:1;17407:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;17433;:6;17440:1;17433:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;17464:9;17489:1;17480:6;17476:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;17464:26;;17459:131;17496:1;17492;:5;17459:131;;;17531:8;17548:3;17540:5;:11;17531:21;;;;;;;;;;;;;;;;;;17519:6;17526:1;17519:9;;;;;;;;;;;;;;;;;;;:33;;;;;;;;;;;17577:1;17567:11;;;;;17499:3;;;;:::i;:::-;;;17459:131;;;;17617:1;17608:5;:10;17600:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;17680:6;17666:21;;;17248:447;;;;:::o;26762:250::-;26858:18;26864:2;26868:7;26858:5;:18::i;:::-;26895:54;26926:1;26930:2;26934:7;26943:5;26895:22;:54::i;:::-;26887:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;26762:250;;;:::o;30057:843::-;30178:4;30204:15;:2;:13;;;:15::i;:::-;30200:693;;;30256:2;30240:36;;;30277:12;:10;:12::i;:::-;30291:4;30297:7;30306:5;30240:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30236:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30503:1;30486:6;:13;:18;30482:341;;;30529:60;;;;;;;;;;:::i;:::-;;;;;;;;30482:341;30773:6;30767:13;30758:6;30754:2;30750:15;30743:38;30236:602;30373:45;;;30363:55;;;:6;:55;;;;30356:62;;;;;30200:693;30877:4;30870:11;;30057:843;;;;;;;:::o;63536:116::-;63596:13;63629:15;63622:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63536:116;:::o;21085:360::-;21158:13;21192:16;21200:7;21192;:16::i;:::-;21184:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21273:21;21297:10;:8;:10::i;:::-;21273:34;;21349:1;21331:7;21325:21;:25;:112;;;;;;;;;;;;;;;;;21390:7;21399:18;:7;:16;:18::i;:::-;21373:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21325:112;21318:119;;;21085:360;;;:::o;19809:292::-;19911:4;19950:25;19935:40;;;:11;:40;;;;:105;;;;20007:33;19992:48;;;:11;:48;;;;19935:105;:158;;;;20057:36;20081:11;20057:23;:36::i;:::-;19935:158;19928:165;;19809:292;;;:::o;35004:555::-;35114:45;35141:4;35147:2;35151:7;35114:26;:45::i;:::-;35192:1;35176:18;;:4;:18;;;35172:187;;;35211:40;35243:7;35211:31;:40::i;:::-;35172:187;;;35281:2;35273:10;;:4;:10;;;35269:90;;35300:47;35333:4;35339:7;35300:32;:47::i;:::-;35269:90;35172:187;35387:1;35373:16;;:2;:16;;;35369:183;;;35406:45;35443:7;35406:36;:45::i;:::-;35369:183;;;35479:4;35473:10;;:2;:10;;;35469:83;;35500:40;35528:2;35532:7;35500:27;:40::i;:::-;35469:83;35369:183;35004:555;;;:::o;27348:382::-;27442:1;27428:16;;:2;:16;;;;27420:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27501:16;27509:7;27501;:16::i;:::-;27500:17;27492:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27563:45;27592:1;27596:2;27600:7;27563:20;:45::i;:::-;27638:1;27621:9;:13;27631:2;27621:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27669:2;27650:7;:16;27658:7;27650:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27714:7;27710:2;27689:33;;27706:1;27689:33;;;;;;;;;;;;27348:382;;:::o;7569:422::-;7629:4;7837:12;7948:7;7936:20;7928:28;;7982:1;7975:4;:8;7968:15;;;7569:422;;;:::o;15947:723::-;16003:13;16233:1;16224:5;:10;16220:53;;;16251:10;;;;;;;;;;;;;;;;;;;;;16220:53;16283:12;16298:5;16283:20;;16314:14;16339:78;16354:1;16346:4;:9;16339:78;;16372:8;;;;;:::i;:::-;;;;16403:2;16395:10;;;;;:::i;:::-;;;16339:78;;;16427:19;16459:6;16449:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16427:39;;16477:154;16493:1;16484:5;:10;16477:154;;16521:1;16511:11;;;;;:::i;:::-;;;16588:2;16580:5;:10;;;;:::i;:::-;16567:2;:24;;;;:::i;:::-;16554:39;;16537:6;16544;16537:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16617:2;16608:11;;;;;:::i;:::-;;;16477:154;;;16655:6;16641:21;;;;;15947:723;;;;:::o;18407:157::-;18492:4;18531:25;18516:40;;;:11;:40;;;;18509:47;;18407:157;;;:::o;31513:93::-;;;;:::o;36282:164::-;36386:10;:17;;;;36359:15;:24;36375:7;36359:24;;;;;;;;;;;:44;;;;36414:10;36430:7;36414:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36282:164;:::o;37073:988::-;37339:22;37389:1;37364:22;37381:4;37364:16;:22::i;:::-;:26;;;;:::i;:::-;37339:51;;37401:18;37422:17;:26;37440:7;37422:26;;;;;;;;;;;;37401:47;;37569:14;37555:10;:28;37551:328;;37600:19;37622:12;:18;37635:4;37622:18;;;;;;;;;;;;;;;:34;37641:14;37622:34;;;;;;;;;;;;37600:56;;37706:11;37673:12;:18;37686:4;37673:18;;;;;;;;;;;;;;;:30;37692:10;37673:30;;;;;;;;;;;:44;;;;37823:10;37790:17;:30;37808:11;37790:30;;;;;;;;;;;:43;;;;37551:328;;37975:17;:26;37993:7;37975:26;;;;;;;;;;;37968:33;;;38019:12;:18;38032:4;38019:18;;;;;;;;;;;;;;;:34;38038:14;38019:34;;;;;;;;;;;38012:41;;;37073:988;;;;:::o;38356:1079::-;38609:22;38654:1;38634:10;:17;;;;:21;;;;:::i;:::-;38609:46;;38666:18;38687:15;:24;38703:7;38687:24;;;;;;;;;;;;38666:45;;39038:19;39060:10;39071:14;39060:26;;;;;;;;;;;;;;;;;;;;;;;;39038:48;;39124:11;39099:10;39110;39099:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;39235:10;39204:15;:28;39220:11;39204:28;;;;;;;;;;;:41;;;;39376:15;:24;39392:7;39376:24;;;;;;;;;;;39369:31;;;39411:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38356:1079;;;;:::o;35860:221::-;35945:14;35962:20;35979:2;35962:16;:20::i;:::-;35945:37;;36020:7;35993:12;:16;36006:2;35993:16;;;;;;;;;;;;;;;:24;36010:6;35993:24;;;;;;;;;;;:34;;;;36067:6;36038:17;:26;36056:7;36038:26;;;;;;;;;;;:35;;;;35860:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:139::-;1037:5;1075:6;1062:20;1053:29;;1091:33;1118:5;1091:33;:::i;:::-;1043:87;;;;:::o;1136:137::-;1181:5;1219:6;1206:20;1197:29;;1235:32;1261:5;1235:32;:::i;:::-;1187:86;;;;:::o;1279:141::-;1335:5;1366:6;1360:13;1351:22;;1382:32;1408:5;1382:32;:::i;:::-;1341:79;;;;:::o;1439:271::-;1494:5;1543:3;1536:4;1528:6;1524:17;1520:27;1510:2;;1561:1;1558;1551:12;1510:2;1601:6;1588:20;1626:78;1700:3;1692:6;1685:4;1677:6;1673:17;1626:78;:::i;:::-;1617:87;;1500:210;;;;;:::o;1716:201::-;1802:5;1833:6;1827:13;1818:22;;1849:62;1905:5;1849:62;:::i;:::-;1808:109;;;;:::o;1937:273::-;1993:5;2042:3;2035:4;2027:6;2023:17;2019:27;2009:2;;2060:1;2057;2050:12;2009:2;2100:6;2087:20;2125:79;2200:3;2192:6;2185:4;2177:6;2173:17;2125:79;:::i;:::-;2116:88;;1999:211;;;;;:::o;2216:139::-;2262:5;2300:6;2287:20;2278:29;;2316:33;2343:5;2316:33;:::i;:::-;2268:87;;;;:::o;2361:262::-;2420:6;2469:2;2457:9;2448:7;2444:23;2440:32;2437:2;;;2485:1;2482;2475:12;2437:2;2528:1;2553:53;2598:7;2589:6;2578:9;2574:22;2553:53;:::i;:::-;2543:63;;2499:117;2427:196;;;;:::o;2629:407::-;2697:6;2705;2754:2;2742:9;2733:7;2729:23;2725:32;2722:2;;;2770:1;2767;2760:12;2722:2;2813:1;2838:53;2883:7;2874:6;2863:9;2859:22;2838:53;:::i;:::-;2828:63;;2784:117;2940:2;2966:53;3011:7;3002:6;2991:9;2987:22;2966:53;:::i;:::-;2956:63;;2911:118;2712:324;;;;;:::o;3042:552::-;3119:6;3127;3135;3184:2;3172:9;3163:7;3159:23;3155:32;3152:2;;;3200:1;3197;3190:12;3152:2;3243:1;3268:53;3313:7;3304:6;3293:9;3289:22;3268:53;:::i;:::-;3258:63;;3214:117;3370:2;3396:53;3441:7;3432:6;3421:9;3417:22;3396:53;:::i;:::-;3386:63;;3341:118;3498:2;3524:53;3569:7;3560:6;3549:9;3545:22;3524:53;:::i;:::-;3514:63;;3469:118;3142:452;;;;;:::o;3600:809::-;3695:6;3703;3711;3719;3768:3;3756:9;3747:7;3743:23;3739:33;3736:2;;;3785:1;3782;3775:12;3736:2;3828:1;3853:53;3898:7;3889:6;3878:9;3874:22;3853:53;:::i;:::-;3843:63;;3799:117;3955:2;3981:53;4026:7;4017:6;4006:9;4002:22;3981:53;:::i;:::-;3971:63;;3926:118;4083:2;4109:53;4154:7;4145:6;4134:9;4130:22;4109:53;:::i;:::-;4099:63;;4054:118;4239:2;4228:9;4224:18;4211:32;4270:18;4262:6;4259:30;4256:2;;;4302:1;4299;4292:12;4256:2;4330:62;4384:7;4375:6;4364:9;4360:22;4330:62;:::i;:::-;4320:72;;4182:220;3726:683;;;;;;;:::o;4415:401::-;4480:6;4488;4537:2;4525:9;4516:7;4512:23;4508:32;4505:2;;;4553:1;4550;4543:12;4505:2;4596:1;4621:53;4666:7;4657:6;4646:9;4642:22;4621:53;:::i;:::-;4611:63;;4567:117;4723:2;4749:50;4791:7;4782:6;4771:9;4767:22;4749:50;:::i;:::-;4739:60;;4694:115;4495:321;;;;;:::o;4822:407::-;4890:6;4898;4947:2;4935:9;4926:7;4922:23;4918:32;4915:2;;;4963:1;4960;4953:12;4915:2;5006:1;5031:53;5076:7;5067:6;5056:9;5052:22;5031:53;:::i;:::-;5021:63;;4977:117;5133:2;5159:53;5204:7;5195:6;5184:9;5180:22;5159:53;:::i;:::-;5149:63;;5104:118;4905:324;;;;;:::o;5235:262::-;5294:6;5343:2;5331:9;5322:7;5318:23;5314:32;5311:2;;;5359:1;5356;5349:12;5311:2;5402:1;5427:53;5472:7;5463:6;5452:9;5448:22;5427:53;:::i;:::-;5417:63;;5373:117;5301:196;;;;:::o;5503:407::-;5571:6;5579;5628:2;5616:9;5607:7;5603:23;5599:32;5596:2;;;5644:1;5641;5634:12;5596:2;5687:1;5712:53;5757:7;5748:6;5737:9;5733:22;5712:53;:::i;:::-;5702:63;;5658:117;5814:2;5840:53;5885:7;5876:6;5865:9;5861:22;5840:53;:::i;:::-;5830:63;;5785:118;5586:324;;;;;:::o;5916:260::-;5974:6;6023:2;6011:9;6002:7;5998:23;5994:32;5991:2;;;6039:1;6036;6029:12;5991:2;6082:1;6107:52;6151:7;6142:6;6131:9;6127:22;6107:52;:::i;:::-;6097:62;;6053:116;5981:195;;;;:::o;6182:282::-;6251:6;6300:2;6288:9;6279:7;6275:23;6271:32;6268:2;;;6316:1;6313;6306:12;6268:2;6359:1;6384:63;6439:7;6430:6;6419:9;6415:22;6384:63;:::i;:::-;6374:73;;6330:127;6258:206;;;;:::o;6470:342::-;6569:6;6618:2;6606:9;6597:7;6593:23;6589:32;6586:2;;;6634:1;6631;6624:12;6586:2;6677:1;6702:93;6787:7;6778:6;6767:9;6763:22;6702:93;:::i;:::-;6692:103;;6648:157;6576:236;;;;:::o;6818:375::-;6887:6;6936:2;6924:9;6915:7;6911:23;6907:32;6904:2;;;6952:1;6949;6942:12;6904:2;7023:1;7012:9;7008:17;6995:31;7053:18;7045:6;7042:30;7039:2;;;7085:1;7082;7075:12;7039:2;7113:63;7168:7;7159:6;7148:9;7144:22;7113:63;:::i;:::-;7103:73;;6966:220;6894:299;;;;:::o;7199:262::-;7258:6;7307:2;7295:9;7286:7;7282:23;7278:32;7275:2;;;7323:1;7320;7313:12;7275:2;7366:1;7391:53;7436:7;7427:6;7416:9;7412:22;7391:53;:::i;:::-;7381:63;;7337:117;7265:196;;;;:::o;7467:179::-;7536:10;7557:46;7599:3;7591:6;7557:46;:::i;:::-;7635:4;7630:3;7626:14;7612:28;;7547:99;;;;:::o;7652:118::-;7739:24;7757:5;7739:24;:::i;:::-;7734:3;7727:37;7717:53;;:::o;7806:732::-;7925:3;7954:54;8002:5;7954:54;:::i;:::-;8024:86;8103:6;8098:3;8024:86;:::i;:::-;8017:93;;8134:56;8184:5;8134:56;:::i;:::-;8213:7;8244:1;8229:284;8254:6;8251:1;8248:13;8229:284;;;8330:6;8324:13;8357:63;8416:3;8401:13;8357:63;:::i;:::-;8350:70;;8443:60;8496:6;8443:60;:::i;:::-;8433:70;;8289:224;8276:1;8273;8269:9;8264:14;;8229:284;;;8233:14;8529:3;8522:10;;7930:608;;;;;;;:::o;8544:109::-;8625:21;8640:5;8625:21;:::i;:::-;8620:3;8613:34;8603:50;;:::o;8659:118::-;8746:24;8764:5;8746:24;:::i;:::-;8741:3;8734:37;8724:53;;:::o;8783:360::-;8869:3;8897:38;8929:5;8897:38;:::i;:::-;8951:70;9014:6;9009:3;8951:70;:::i;:::-;8944:77;;9030:52;9075:6;9070:3;9063:4;9056:5;9052:16;9030:52;:::i;:::-;9107:29;9129:6;9107:29;:::i;:::-;9102:3;9098:39;9091:46;;8873:270;;;;;:::o;9149:364::-;9237:3;9265:39;9298:5;9265:39;:::i;:::-;9320:71;9384:6;9379:3;9320:71;:::i;:::-;9313:78;;9400:52;9445:6;9440:3;9433:4;9426:5;9422:16;9400:52;:::i;:::-;9477:29;9499:6;9477:29;:::i;:::-;9472:3;9468:39;9461:46;;9241:272;;;;;:::o;9519:377::-;9625:3;9653:39;9686:5;9653:39;:::i;:::-;9708:89;9790:6;9785:3;9708:89;:::i;:::-;9701:96;;9806:52;9851:6;9846:3;9839:4;9832:5;9828:16;9806:52;:::i;:::-;9883:6;9878:3;9874:16;9867:23;;9629:267;;;;;:::o;9902:366::-;10044:3;10065:67;10129:2;10124:3;10065:67;:::i;:::-;10058:74;;10141:93;10230:3;10141:93;:::i;:::-;10259:2;10254:3;10250:12;10243:19;;10048:220;;;:::o;10274:366::-;10416:3;10437:67;10501:2;10496:3;10437:67;:::i;:::-;10430:74;;10513:93;10602:3;10513:93;:::i;:::-;10631:2;10626:3;10622:12;10615:19;;10420:220;;;:::o;10646:366::-;10788:3;10809:67;10873:2;10868:3;10809:67;:::i;:::-;10802:74;;10885:93;10974:3;10885:93;:::i;:::-;11003:2;10998:3;10994:12;10987:19;;10792:220;;;:::o;11018:366::-;11160:3;11181:67;11245:2;11240:3;11181:67;:::i;:::-;11174:74;;11257:93;11346:3;11257:93;:::i;:::-;11375:2;11370:3;11366:12;11359:19;;11164:220;;;:::o;11390:366::-;11532:3;11553:67;11617:2;11612:3;11553:67;:::i;:::-;11546:74;;11629:93;11718:3;11629:93;:::i;:::-;11747:2;11742:3;11738:12;11731:19;;11536:220;;;:::o;11762:366::-;11904:3;11925:67;11989:2;11984:3;11925:67;:::i;:::-;11918:74;;12001:93;12090:3;12001:93;:::i;:::-;12119:2;12114:3;12110:12;12103:19;;11908:220;;;:::o;12134:366::-;12276:3;12297:67;12361:2;12356:3;12297:67;:::i;:::-;12290:74;;12373:93;12462:3;12373:93;:::i;:::-;12491:2;12486:3;12482:12;12475:19;;12280:220;;;:::o;12506:366::-;12648:3;12669:67;12733:2;12728:3;12669:67;:::i;:::-;12662:74;;12745:93;12834:3;12745:93;:::i;:::-;12863:2;12858:3;12854:12;12847:19;;12652:220;;;:::o;12878:366::-;13020:3;13041:67;13105:2;13100:3;13041:67;:::i;:::-;13034:74;;13117:93;13206:3;13117:93;:::i;:::-;13235:2;13230:3;13226:12;13219:19;;13024:220;;;:::o;13250:366::-;13392:3;13413:67;13477:2;13472:3;13413:67;:::i;:::-;13406:74;;13489:93;13578:3;13489:93;:::i;:::-;13607:2;13602:3;13598:12;13591:19;;13396:220;;;:::o;13622:366::-;13764:3;13785:67;13849:2;13844:3;13785:67;:::i;:::-;13778:74;;13861:93;13950:3;13861:93;:::i;:::-;13979:2;13974:3;13970:12;13963:19;;13768:220;;;:::o;13994:366::-;14136:3;14157:67;14221:2;14216:3;14157:67;:::i;:::-;14150:74;;14233:93;14322:3;14233:93;:::i;:::-;14351:2;14346:3;14342:12;14335:19;;14140:220;;;:::o;14366:366::-;14508:3;14529:67;14593:2;14588:3;14529:67;:::i;:::-;14522:74;;14605:93;14694:3;14605:93;:::i;:::-;14723:2;14718:3;14714:12;14707:19;;14512:220;;;:::o;14738:366::-;14880:3;14901:67;14965:2;14960:3;14901:67;:::i;:::-;14894:74;;14977:93;15066:3;14977:93;:::i;:::-;15095:2;15090:3;15086:12;15079:19;;14884:220;;;:::o;15110:366::-;15252:3;15273:67;15337:2;15332:3;15273:67;:::i;:::-;15266:74;;15349:93;15438:3;15349:93;:::i;:::-;15467:2;15462:3;15458:12;15451:19;;15256:220;;;:::o;15482:366::-;15624:3;15645:67;15709:2;15704:3;15645:67;:::i;:::-;15638:74;;15721:93;15810:3;15721:93;:::i;:::-;15839:2;15834:3;15830:12;15823:19;;15628:220;;;:::o;15854:366::-;15996:3;16017:67;16081:2;16076:3;16017:67;:::i;:::-;16010:74;;16093:93;16182:3;16093:93;:::i;:::-;16211:2;16206:3;16202:12;16195:19;;16000:220;;;:::o;16226:366::-;16368:3;16389:67;16453:2;16448:3;16389:67;:::i;:::-;16382:74;;16465:93;16554:3;16465:93;:::i;:::-;16583:2;16578:3;16574:12;16567:19;;16372:220;;;:::o;16598:366::-;16740:3;16761:67;16825:2;16820:3;16761:67;:::i;:::-;16754:74;;16837:93;16926:3;16837:93;:::i;:::-;16955:2;16950:3;16946:12;16939:19;;16744:220;;;:::o;16970:366::-;17112:3;17133:67;17197:2;17192:3;17133:67;:::i;:::-;17126:74;;17209:93;17298:3;17209:93;:::i;:::-;17327:2;17322:3;17318:12;17311:19;;17116:220;;;:::o;17342:366::-;17484:3;17505:67;17569:2;17564:3;17505:67;:::i;:::-;17498:74;;17581:93;17670:3;17581:93;:::i;:::-;17699:2;17694:3;17690:12;17683:19;;17488:220;;;:::o;17714:366::-;17856:3;17877:67;17941:2;17936:3;17877:67;:::i;:::-;17870:74;;17953:93;18042:3;17953:93;:::i;:::-;18071:2;18066:3;18062:12;18055:19;;17860:220;;;:::o;18086:366::-;18228:3;18249:67;18313:2;18308:3;18249:67;:::i;:::-;18242:74;;18325:93;18414:3;18325:93;:::i;:::-;18443:2;18438:3;18434:12;18427:19;;18232:220;;;:::o;18458:366::-;18600:3;18621:67;18685:2;18680:3;18621:67;:::i;:::-;18614:74;;18697:93;18786:3;18697:93;:::i;:::-;18815:2;18810:3;18806:12;18799:19;;18604:220;;;:::o;18830:366::-;18972:3;18993:67;19057:2;19052:3;18993:67;:::i;:::-;18986:74;;19069:93;19158:3;19069:93;:::i;:::-;19187:2;19182:3;19178:12;19171:19;;18976:220;;;:::o;19202:366::-;19344:3;19365:67;19429:2;19424:3;19365:67;:::i;:::-;19358:74;;19441:93;19530:3;19441:93;:::i;:::-;19559:2;19554:3;19550:12;19543:19;;19348:220;;;:::o;19574:402::-;19734:3;19755:85;19837:2;19832:3;19755:85;:::i;:::-;19748:92;;19849:93;19938:3;19849:93;:::i;:::-;19967:2;19962:3;19958:12;19951:19;;19738:238;;;:::o;19982:366::-;20124:3;20145:67;20209:2;20204:3;20145:67;:::i;:::-;20138:74;;20221:93;20310:3;20221:93;:::i;:::-;20339:2;20334:3;20330:12;20323:19;;20128:220;;;:::o;20354:402::-;20514:3;20535:85;20617:2;20612:3;20535:85;:::i;:::-;20528:92;;20629:93;20718:3;20629:93;:::i;:::-;20747:2;20742:3;20738:12;20731:19;;20518:238;;;:::o;20762:366::-;20904:3;20925:67;20989:2;20984:3;20925:67;:::i;:::-;20918:74;;21001:93;21090:3;21001:93;:::i;:::-;21119:2;21114:3;21110:12;21103:19;;20908:220;;;:::o;21134:108::-;21211:24;21229:5;21211:24;:::i;:::-;21206:3;21199:37;21189:53;;:::o;21248:118::-;21335:24;21353:5;21335:24;:::i;:::-;21330:3;21323:37;21313:53;;:::o;21372:435::-;21552:3;21574:95;21665:3;21656:6;21574:95;:::i;:::-;21567:102;;21686:95;21777:3;21768:6;21686:95;:::i;:::-;21679:102;;21798:3;21791:10;;21556:251;;;;;:::o;21813:967::-;22195:3;22217:148;22361:3;22217:148;:::i;:::-;22210:155;;22382:95;22473:3;22464:6;22382:95;:::i;:::-;22375:102;;22494:148;22638:3;22494:148;:::i;:::-;22487:155;;22659:95;22750:3;22741:6;22659:95;:::i;:::-;22652:102;;22771:3;22764:10;;22199:581;;;;;:::o;22786:222::-;22879:4;22917:2;22906:9;22902:18;22894:26;;22930:71;22998:1;22987:9;22983:17;22974:6;22930:71;:::i;:::-;22884:124;;;;:::o;23014:640::-;23209:4;23247:3;23236:9;23232:19;23224:27;;23261:71;23329:1;23318:9;23314:17;23305:6;23261:71;:::i;:::-;23342:72;23410:2;23399:9;23395:18;23386:6;23342:72;:::i;:::-;23424;23492:2;23481:9;23477:18;23468:6;23424:72;:::i;:::-;23543:9;23537:4;23533:20;23528:2;23517:9;23513:18;23506:48;23571:76;23642:4;23633:6;23571:76;:::i;:::-;23563:84;;23214:440;;;;;;;:::o;23660:373::-;23803:4;23841:2;23830:9;23826:18;23818:26;;23890:9;23884:4;23880:20;23876:1;23865:9;23861:17;23854:47;23918:108;24021:4;24012:6;23918:108;:::i;:::-;23910:116;;23808:225;;;;:::o;24039:210::-;24126:4;24164:2;24153:9;24149:18;24141:26;;24177:65;24239:1;24228:9;24224:17;24215:6;24177:65;:::i;:::-;24131:118;;;;:::o;24255:222::-;24348:4;24386:2;24375:9;24371:18;24363:26;;24399:71;24467:1;24456:9;24452:17;24443:6;24399:71;:::i;:::-;24353:124;;;;:::o;24483:313::-;24596:4;24634:2;24623:9;24619:18;24611:26;;24683:9;24677:4;24673:20;24669:1;24658:9;24654:17;24647:47;24711:78;24784:4;24775:6;24711:78;:::i;:::-;24703:86;;24601:195;;;;:::o;24802:419::-;24968:4;25006:2;24995:9;24991:18;24983:26;;25055:9;25049:4;25045:20;25041:1;25030:9;25026:17;25019:47;25083:131;25209:4;25083:131;:::i;:::-;25075:139;;24973:248;;;:::o;25227:419::-;25393:4;25431:2;25420:9;25416:18;25408:26;;25480:9;25474:4;25470:20;25466:1;25455:9;25451:17;25444:47;25508:131;25634:4;25508:131;:::i;:::-;25500:139;;25398:248;;;:::o;25652:419::-;25818:4;25856:2;25845:9;25841:18;25833:26;;25905:9;25899:4;25895:20;25891:1;25880:9;25876:17;25869:47;25933:131;26059:4;25933:131;:::i;:::-;25925:139;;25823:248;;;:::o;26077:419::-;26243:4;26281:2;26270:9;26266:18;26258:26;;26330:9;26324:4;26320:20;26316:1;26305:9;26301:17;26294:47;26358:131;26484:4;26358:131;:::i;:::-;26350:139;;26248:248;;;:::o;26502:419::-;26668:4;26706:2;26695:9;26691:18;26683:26;;26755:9;26749:4;26745:20;26741:1;26730:9;26726:17;26719:47;26783:131;26909:4;26783:131;:::i;:::-;26775:139;;26673:248;;;:::o;26927:419::-;27093:4;27131:2;27120:9;27116:18;27108:26;;27180:9;27174:4;27170:20;27166:1;27155:9;27151:17;27144:47;27208:131;27334:4;27208:131;:::i;:::-;27200:139;;27098:248;;;:::o;27352:419::-;27518:4;27556:2;27545:9;27541:18;27533:26;;27605:9;27599:4;27595:20;27591:1;27580:9;27576:17;27569:47;27633:131;27759:4;27633:131;:::i;:::-;27625:139;;27523:248;;;:::o;27777:419::-;27943:4;27981:2;27970:9;27966:18;27958:26;;28030:9;28024:4;28020:20;28016:1;28005:9;28001:17;27994:47;28058:131;28184:4;28058:131;:::i;:::-;28050:139;;27948:248;;;:::o;28202:419::-;28368:4;28406:2;28395:9;28391:18;28383:26;;28455:9;28449:4;28445:20;28441:1;28430:9;28426:17;28419:47;28483:131;28609:4;28483:131;:::i;:::-;28475:139;;28373:248;;;:::o;28627:419::-;28793:4;28831:2;28820:9;28816:18;28808:26;;28880:9;28874:4;28870:20;28866:1;28855:9;28851:17;28844:47;28908:131;29034:4;28908:131;:::i;:::-;28900:139;;28798:248;;;:::o;29052:419::-;29218:4;29256:2;29245:9;29241:18;29233:26;;29305:9;29299:4;29295:20;29291:1;29280:9;29276:17;29269:47;29333:131;29459:4;29333:131;:::i;:::-;29325:139;;29223:248;;;:::o;29477:419::-;29643:4;29681:2;29670:9;29666:18;29658:26;;29730:9;29724:4;29720:20;29716:1;29705:9;29701:17;29694:47;29758:131;29884:4;29758:131;:::i;:::-;29750:139;;29648:248;;;:::o;29902:419::-;30068:4;30106:2;30095:9;30091:18;30083:26;;30155:9;30149:4;30145:20;30141:1;30130:9;30126:17;30119:47;30183:131;30309:4;30183:131;:::i;:::-;30175:139;;30073:248;;;:::o;30327:419::-;30493:4;30531:2;30520:9;30516:18;30508:26;;30580:9;30574:4;30570:20;30566:1;30555:9;30551:17;30544:47;30608:131;30734:4;30608:131;:::i;:::-;30600:139;;30498:248;;;:::o;30752:419::-;30918:4;30956:2;30945:9;30941:18;30933:26;;31005:9;30999:4;30995:20;30991:1;30980:9;30976:17;30969:47;31033:131;31159:4;31033:131;:::i;:::-;31025:139;;30923:248;;;:::o;31177:419::-;31343:4;31381:2;31370:9;31366:18;31358:26;;31430:9;31424:4;31420:20;31416:1;31405:9;31401:17;31394:47;31458:131;31584:4;31458:131;:::i;:::-;31450:139;;31348:248;;;:::o;31602:419::-;31768:4;31806:2;31795:9;31791:18;31783:26;;31855:9;31849:4;31845:20;31841:1;31830:9;31826:17;31819:47;31883:131;32009:4;31883:131;:::i;:::-;31875:139;;31773:248;;;:::o;32027:419::-;32193:4;32231:2;32220:9;32216:18;32208:26;;32280:9;32274:4;32270:20;32266:1;32255:9;32251:17;32244:47;32308:131;32434:4;32308:131;:::i;:::-;32300:139;;32198:248;;;:::o;32452:419::-;32618:4;32656:2;32645:9;32641:18;32633:26;;32705:9;32699:4;32695:20;32691:1;32680:9;32676:17;32669:47;32733:131;32859:4;32733:131;:::i;:::-;32725:139;;32623:248;;;:::o;32877:419::-;33043:4;33081:2;33070:9;33066:18;33058:26;;33130:9;33124:4;33120:20;33116:1;33105:9;33101:17;33094:47;33158:131;33284:4;33158:131;:::i;:::-;33150:139;;33048:248;;;:::o;33302:419::-;33468:4;33506:2;33495:9;33491:18;33483:26;;33555:9;33549:4;33545:20;33541:1;33530:9;33526:17;33519:47;33583:131;33709:4;33583:131;:::i;:::-;33575:139;;33473:248;;;:::o;33727:419::-;33893:4;33931:2;33920:9;33916:18;33908:26;;33980:9;33974:4;33970:20;33966:1;33955:9;33951:17;33944:47;34008:131;34134:4;34008:131;:::i;:::-;34000:139;;33898:248;;;:::o;34152:419::-;34318:4;34356:2;34345:9;34341:18;34333:26;;34405:9;34399:4;34395:20;34391:1;34380:9;34376:17;34369:47;34433:131;34559:4;34433:131;:::i;:::-;34425:139;;34323:248;;;:::o;34577:419::-;34743:4;34781:2;34770:9;34766:18;34758:26;;34830:9;34824:4;34820:20;34816:1;34805:9;34801:17;34794:47;34858:131;34984:4;34858:131;:::i;:::-;34850:139;;34748:248;;;:::o;35002:419::-;35168:4;35206:2;35195:9;35191:18;35183:26;;35255:9;35249:4;35245:20;35241:1;35230:9;35226:17;35219:47;35283:131;35409:4;35283:131;:::i;:::-;35275:139;;35173:248;;;:::o;35427:419::-;35593:4;35631:2;35620:9;35616:18;35608:26;;35680:9;35674:4;35670:20;35666:1;35655:9;35651:17;35644:47;35708:131;35834:4;35708:131;:::i;:::-;35700:139;;35598:248;;;:::o;35852:419::-;36018:4;36056:2;36045:9;36041:18;36033:26;;36105:9;36099:4;36095:20;36091:1;36080:9;36076:17;36069:47;36133:131;36259:4;36133:131;:::i;:::-;36125:139;;36023:248;;;:::o;36277:419::-;36443:4;36481:2;36470:9;36466:18;36458:26;;36530:9;36524:4;36520:20;36516:1;36505:9;36501:17;36494:47;36558:131;36684:4;36558:131;:::i;:::-;36550:139;;36448:248;;;:::o;36702:222::-;36795:4;36833:2;36822:9;36818:18;36810:26;;36846:71;36914:1;36903:9;36899:17;36890:6;36846:71;:::i;:::-;36800:124;;;;:::o;36930:129::-;36964:6;36991:20;;:::i;:::-;36981:30;;37020:33;37048:4;37040:6;37020:33;:::i;:::-;36971:88;;;:::o;37065:75::-;37098:6;37131:2;37125:9;37115:19;;37105:35;:::o;37146:307::-;37207:4;37297:18;37289:6;37286:30;37283:2;;;37319:18;;:::i;:::-;37283:2;37357:29;37379:6;37357:29;:::i;:::-;37349:37;;37441:4;37435;37431:15;37423:23;;37212:241;;;:::o;37459:308::-;37521:4;37611:18;37603:6;37600:30;37597:2;;;37633:18;;:::i;:::-;37597:2;37671:29;37693:6;37671:29;:::i;:::-;37663:37;;37755:4;37749;37745:15;37737:23;;37526:241;;;:::o;37773:132::-;37840:4;37863:3;37855:11;;37893:4;37888:3;37884:14;37876:22;;37845:60;;;:::o;37911:114::-;37978:6;38012:5;38006:12;37996:22;;37985:40;;;:::o;38031:98::-;38082:6;38116:5;38110:12;38100:22;;38089:40;;;:::o;38135:99::-;38187:6;38221:5;38215:12;38205:22;;38194:40;;;:::o;38240:113::-;38310:4;38342;38337:3;38333:14;38325:22;;38315:38;;;:::o;38359:184::-;38458:11;38492:6;38487:3;38480:19;38532:4;38527:3;38523:14;38508:29;;38470:73;;;;:::o;38549:168::-;38632:11;38666:6;38661:3;38654:19;38706:4;38701:3;38697:14;38682:29;;38644:73;;;;:::o;38723:169::-;38807:11;38841:6;38836:3;38829:19;38881:4;38876:3;38872:14;38857:29;;38819:73;;;;:::o;38898:148::-;39000:11;39037:3;39022:18;;39012:34;;;;:::o;39052:305::-;39092:3;39111:20;39129:1;39111:20;:::i;:::-;39106:25;;39145:20;39163:1;39145:20;:::i;:::-;39140:25;;39299:1;39231:66;39227:74;39224:1;39221:81;39218:2;;;39305:18;;:::i;:::-;39218:2;39349:1;39346;39342:9;39335:16;;39096:261;;;;:::o;39363:185::-;39403:1;39420:20;39438:1;39420:20;:::i;:::-;39415:25;;39454:20;39472:1;39454:20;:::i;:::-;39449:25;;39493:1;39483:2;;39498:18;;:::i;:::-;39483:2;39540:1;39537;39533:9;39528:14;;39405:143;;;;:::o;39554:348::-;39594:7;39617:20;39635:1;39617:20;:::i;:::-;39612:25;;39651:20;39669:1;39651:20;:::i;:::-;39646:25;;39839:1;39771:66;39767:74;39764:1;39761:81;39756:1;39749:9;39742:17;39738:105;39735:2;;;39846:18;;:::i;:::-;39735:2;39894:1;39891;39887:9;39876:20;;39602:300;;;;:::o;39908:191::-;39948:4;39968:20;39986:1;39968:20;:::i;:::-;39963:25;;40002:20;40020:1;40002:20;:::i;:::-;39997:25;;40041:1;40038;40035:8;40032:2;;;40046:18;;:::i;:::-;40032:2;40091:1;40088;40084:9;40076:17;;39953:146;;;;:::o;40105:96::-;40142:7;40171:24;40189:5;40171:24;:::i;:::-;40160:35;;40150:51;;;:::o;40207:90::-;40241:7;40284:5;40277:13;40270:21;40259:32;;40249:48;;;:::o;40303:77::-;40340:7;40369:5;40358:16;;40348:32;;;:::o;40386:149::-;40422:7;40462:66;40455:5;40451:78;40440:89;;40430:105;;;:::o;40541:125::-;40607:7;40636:24;40654:5;40636:24;:::i;:::-;40625:35;;40615:51;;;:::o;40672:126::-;40709:7;40749:42;40742:5;40738:54;40727:65;;40717:81;;;:::o;40804:77::-;40841:7;40870:5;40859:16;;40849:32;;;:::o;40887:154::-;40971:6;40966:3;40961;40948:30;41033:1;41024:6;41019:3;41015:16;41008:27;40938:103;;;:::o;41047:307::-;41115:1;41125:113;41139:6;41136:1;41133:13;41125:113;;;41224:1;41219:3;41215:11;41209:18;41205:1;41200:3;41196:11;41189:39;41161:2;41158:1;41154:10;41149:15;;41125:113;;;41256:6;41253:1;41250:13;41247:2;;;41336:1;41327:6;41322:3;41318:16;41311:27;41247:2;41096:258;;;;:::o;41360:171::-;41399:3;41422:24;41440:5;41422:24;:::i;:::-;41413:33;;41468:4;41461:5;41458:15;41455:2;;;41476:18;;:::i;:::-;41455:2;41523:1;41516:5;41512:13;41505:20;;41403:128;;;:::o;41537:320::-;41581:6;41618:1;41612:4;41608:12;41598:22;;41665:1;41659:4;41655:12;41686:18;41676:2;;41742:4;41734:6;41730:17;41720:27;;41676:2;41804;41796:6;41793:14;41773:18;41770:38;41767:2;;;41823:18;;:::i;:::-;41767:2;41588:269;;;;:::o;41863:281::-;41946:27;41968:4;41946:27;:::i;:::-;41938:6;41934:40;42076:6;42064:10;42061:22;42040:18;42028:10;42025:34;42022:62;42019:2;;;42087:18;;:::i;:::-;42019:2;42127:10;42123:2;42116:22;41906:238;;;:::o;42150:233::-;42189:3;42212:24;42230:5;42212:24;:::i;:::-;42203:33;;42258:66;42251:5;42248:77;42245:2;;;42328:18;;:::i;:::-;42245:2;42375:1;42368:5;42364:13;42357:20;;42193:190;;;:::o;42389:176::-;42421:1;42438:20;42456:1;42438:20;:::i;:::-;42433:25;;42472:20;42490:1;42472:20;:::i;:::-;42467:25;;42511:1;42501:2;;42516:18;;:::i;:::-;42501:2;42557:1;42554;42550:9;42545:14;;42423:142;;;;:::o;42571:180::-;42619:77;42616:1;42609:88;42716:4;42713:1;42706:15;42740:4;42737:1;42730:15;42757:180;42805:77;42802:1;42795:88;42902:4;42899:1;42892:15;42926:4;42923:1;42916:15;42943:180;42991:77;42988:1;42981:88;43088:4;43085:1;43078:15;43112:4;43109:1;43102:15;43129:180;43177:77;43174:1;43167:88;43274:4;43271:1;43264:15;43298:4;43295:1;43288:15;43315:102;43356:6;43407:2;43403:7;43398:2;43391:5;43387:14;43383:28;43373:38;;43363:54;;;:::o;43423:182::-;43563:34;43559:1;43551:6;43547:14;43540:58;43529:76;:::o;43611:170::-;43751:22;43747:1;43739:6;43735:14;43728:46;43717:64;:::o;43787:230::-;43927:34;43923:1;43915:6;43911:14;43904:58;43996:13;43991:2;43983:6;43979:15;43972:38;43893:124;:::o;44023:237::-;44163:34;44159:1;44151:6;44147:14;44140:58;44232:20;44227:2;44219:6;44215:15;44208:45;44129:131;:::o;44266:225::-;44406:34;44402:1;44394:6;44390:14;44383:58;44475:8;44470:2;44462:6;44458:15;44451:33;44372:119;:::o;44497:178::-;44637:30;44633:1;44625:6;44621:14;44614:54;44603:72;:::o;44681:223::-;44821:34;44817:1;44809:6;44805:14;44798:58;44890:6;44885:2;44877:6;44873:15;44866:31;44787:117;:::o;44910:175::-;45050:27;45046:1;45038:6;45034:14;45027:51;45016:69;:::o;45091:231::-;45231:34;45227:1;45219:6;45215:14;45208:58;45300:14;45295:2;45287:6;45283:15;45276:39;45197:125;:::o;45328:169::-;45468:21;45464:1;45456:6;45452:14;45445:45;45434:63;:::o;45503:166::-;45643:18;45639:1;45631:6;45627:14;45620:42;45609:60;:::o;45675:176::-;45815:28;45811:1;45803:6;45799:14;45792:52;45781:70;:::o;45857:166::-;45997:18;45993:1;45985:6;45981:14;45974:42;45963:60;:::o;46029:243::-;46169:34;46165:1;46157:6;46153:14;46146:58;46238:26;46233:2;46225:6;46221:15;46214:51;46135:137;:::o;46278:229::-;46418:34;46414:1;46406:6;46402:14;46395:58;46487:12;46482:2;46474:6;46470:15;46463:37;46384:123;:::o;46513:228::-;46653:34;46649:1;46641:6;46637:14;46630:58;46722:11;46717:2;46709:6;46705:15;46698:36;46619:122;:::o;46747:182::-;46887:34;46883:1;46875:6;46871:14;46864:58;46853:76;:::o;46935:236::-;47075:34;47071:1;47063:6;47059:14;47052:58;47144:19;47139:2;47131:6;47127:15;47120:44;47041:130;:::o;47177:231::-;47317:34;47313:1;47305:6;47301:14;47294:58;47386:14;47381:2;47373:6;47369:15;47362:39;47283:125;:::o;47414:182::-;47554:34;47550:1;47542:6;47538:14;47531:58;47520:76;:::o;47602:228::-;47742:34;47738:1;47730:6;47726:14;47719:58;47811:11;47806:2;47798:6;47794:15;47787:36;47708:122;:::o;47836:234::-;47976:34;47972:1;47964:6;47960:14;47953:58;48045:17;48040:2;48032:6;48028:15;48021:42;47942:128;:::o;48076:220::-;48216:34;48212:1;48204:6;48200:14;48193:58;48285:3;48280:2;48272:6;48268:15;48261:28;48182:114;:::o;48302:179::-;48442:31;48438:1;48430:6;48426:14;48419:55;48408:73;:::o;48487:236::-;48627:34;48623:1;48615:6;48611:14;48604:58;48696:19;48691:2;48683:6;48679:15;48672:44;48593:130;:::o;48729:231::-;48869:34;48865:1;48857:6;48853:14;48846:58;48938:14;48933:2;48925:6;48921:15;48914:39;48835:125;:::o;48966:173::-;49106:25;49102:1;49094:6;49090:14;49083:49;49072:67;:::o;49145:178::-;49285:30;49281:1;49273:6;49269:14;49262:54;49251:72;:::o;49329:167::-;49469:19;49465:1;49457:6;49453:14;49446:43;49435:61;:::o;49502:234::-;49642:34;49638:1;49630:6;49626:14;49619:58;49711:17;49706:2;49698:6;49694:15;49687:42;49608:128;:::o;49742:122::-;49815:24;49833:5;49815:24;:::i;:::-;49808:5;49805:35;49795:2;;49854:1;49851;49844:12;49795:2;49785:79;:::o;49870:116::-;49940:21;49955:5;49940:21;:::i;:::-;49933:5;49930:32;49920:2;;49976:1;49973;49966:12;49920:2;49910:76;:::o;49992:122::-;50065:24;50083:5;50065:24;:::i;:::-;50058:5;50055:35;50045:2;;50104:1;50101;50094:12;50045:2;50035:79;:::o;50120:120::-;50192:23;50209:5;50192:23;:::i;:::-;50185:5;50182:34;50172:2;;50230:1;50227;50220:12;50172:2;50162:78;:::o;50246:180::-;50348:53;50395:5;50348:53;:::i;:::-;50341:5;50338:64;50328:2;;50416:1;50413;50406:12;50328:2;50318:108;:::o;50432:122::-;50505:24;50523:5;50505:24;:::i;:::-;50498:5;50495:35;50485:2;;50544:1;50541;50534:12;50485:2;50475:79;:::o

Swarm Source

ipfs://5ffb67c2466fe6f915407a934f64acb5b567cd8a21e1668515462fea51e2c63d
Loading...
Loading
Loading...
Loading
[ 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.