ETH Price: $3,478.43 (+1.74%)
Gas: 10 Gwei

Token

UREEQA Collectibles (URQA-C)
 

Overview

Max Total Supply

0 URQA-C

Holders

97

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 URQA-C
0xbb0173c0e8d5919e0a6a4066a1c506b16748e2d1
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:
UreeqaCollectibleNFTv2

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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


pragma solidity ^0.8.0;

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

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

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


pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

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


pragma solidity ^0.8.0;

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

}

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


pragma solidity ^0.8.0;


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

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


pragma solidity ^0.8.0;









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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 || ERC721.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 || ERC721.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 { }
}

// File: @openzeppelin/contracts/utils/structs/EnumerableSet.sol


pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


// File: contracts/OwnershipAgreementv3.sol

pragma solidity >=0.7.0 <0.9.0;


/// @title Creates an Ownership Agreement, with an optional Operator role
/// @author Dr. Jonathan Shahen at UREEQA
/// @notice TODO
/// @dev Maximum number of Owners is set to 255 (unit8.MAX_VALUE)
contract OwnershipAgreementv3 {
    /*
     * Storage
     */

    // ResolutionTypes:
    uint constant private resTypeNone = 0; // This indicates that the resolution hasn't been set (default value)
    uint constant private resTypeAddOwner = 1;
    uint constant private resTypeRemoveOwner = 2;
    uint constant private resTypeReplaceOwner = 3;
    uint constant private resTypeAddOperator = 4;
    uint constant private resTypeRemoveOperator = 5;
    uint constant private resTypeReplaceOperator = 6;
    uint constant private resTypeUpdateThreshold = 7;
    uint constant private resTypeUpdateTransactionLimit = 8;
    uint constant private resTypePause = 9;
    uint constant private resTypeUnpause = 10;
    uint constant private resTypeCustom = 1000; // Custom resoutions for each subclass

    struct Resolution {
        // Has the resolution already been passed
        bool passed;
        // The type of resolution
        uint256 resType;
        // The old address, can be address(0). oldAddress and newAddress cannot both equal address(0).
        address oldAddress;
        // The new address, can be address(0). oldAddress and newAddress cannot both equal address(0).
        address newAddress;
        // Able to store extra information for custom resolutions
        bytes32[] extra;
    }
    using EnumerableSet for EnumerableSet.AddressSet;
    // Set of owners
    // NOTE: we utilize a set, so we can enumerate the owners and so that the list only contains one instance of an account
    // NOTE: address(0) is not a valid owner
    EnumerableSet.AddressSet private _owners;
    // Value to indicate if the smart contract is paused
    bool private _paused;
    // An address, usually controlled by a computer, that performs regular/automated operations within the smart contract
    // NOTE: address(0) is not a valid operator
    EnumerableSet.AddressSet private _operators;
    // Limit the number of operators
    uint256 public operatorLimit = 1;
    // The number of owners it takes to come to an agreement
    uint256 public ownerAgreementThreshold = 1;
    // Limit per Transaction to impose
    // A limit of zero means no limit imposed
    uint256 public transactionLimit = 0;
    // Stores each vote for each resolution number (int)
    mapping(address => mapping(uint256 => bool)) public ownerVotes;
    // The next available resolution number
    uint256 public nextResolution = 1;
    mapping(address => uint256) lastOwnerResolutionNumber;
    // Stores the resolutions
    mapping(uint256 => Resolution) public resolutions;

    // ////////////////////////////////////////////////////
    // EVENTS
    // ////////////////////////////////////////////////////
    event OwnerAddition(address owner);
    event OwnerRemoval(address owner);
    event OwnerReplacement(address oldOwner, address newOwner);

    event OperatorAddition(address newOperator);
    event OperatorRemoval(address oldOperator);
    event OperatorReplacement(address oldOperator, address newOperator);

    event UpdateThreshold(uint256 newThreshold);
    event UpdateNumberOfOperators(uint256 newOperators);
    event UpdateTransactionLimit(uint256 newLimit);
    /// @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);

    // ////////////////////////////////////////////////////
    // MODIFIERS
    // ////////////////////////////////////////////////////
    function isValidAddress(address newAddr) public pure {
        require(newAddr != address(0), "Invaild Address");
    }

    modifier onlyOperators() {
        isValidAddress(msg.sender);
        require(
            EnumerableSet.contains(_operators, msg.sender) == true,
            "Only the operator can run this function."
        );
        _;
    }
    modifier onlyOwners() {
        isValidAddress(msg.sender);
        require(
            EnumerableSet.contains(_owners, msg.sender) == true,
            "Only an owner can run this function."
        );
        _;
    }

    modifier onlyOwnersOrOperator() {
        isValidAddress(msg.sender);
        require(
            EnumerableSet.contains(_operators, msg.sender) == true ||
                EnumerableSet.contains(_owners, msg.sender) == true,
            "Only an owner or the operator can run this function."
        );
        _;
    }

    modifier ownerExists(address thisOwner) {
        require(
            EnumerableSet.contains(_owners, thisOwner) == true,
            "Owner does not exists."
        );
        _;
    }

    /**
     * @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, "Smart Contract is paused");
        _;
    }

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

    /// @dev Modifier to make a function callable only when the amount is within the transaction limit
    modifier withinLimit(uint256 amount) {
        require(
            transactionLimit == 0 || amount <= transactionLimit,
            "Amount is over the transaction limit"
        );
        _;
    }

    // ////////////////////////////////////////////////////
    // CONSTRUCTOR
    // ////////////////////////////////////////////////////
    constructor() {
        _addOwner(msg.sender);
        _paused = false;
    }

    // ////////////////////////////////////////////////////
    // VIEW FUNCTIONS
    // ////////////////////////////////////////////////////

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        if(EnumerableSet.length(_owners) == 0) return address(0);
        return EnumerableSet.at(_owners, 0);
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOwners() public view returns (address[] memory) {
        uint256 len = EnumerableSet.length(_owners);
        address[] memory o = new address[](len);

        for (uint256 i = 0; i < len; i++) {
            o[i] = EnumerableSet.at(_owners, i);
        }

        return o;
    }

    /// @dev Returns the number of owners.
    /// @return Number of owners.
    function getNumberOfOwners() public view returns (uint) {
        return EnumerableSet.length(_owners);
    }

    /// @dev Returns list of owners.
    /// @return List of owner addresses.
    function getOperators() public view returns (address[] memory) {
        uint256 len = EnumerableSet.length(_operators);
        address[] memory o = new address[](len);

        for (uint256 i = 0; i < len; i++) {
            o[i] = EnumerableSet.at(_operators, i);
        }

        return o;
    }

    /// @dev Returns the number of operators.
    /// @return Number of operators.
    function getNumberOfOperators() public view returns (uint8) {
        return uint8(EnumerableSet.length(_operators));
    }

    /// @dev How many owners does it take to approve a resolution
    /// @return minimum number of owner votes
    function getVoteThreshold() public view returns (uint256) {
        return ownerAgreementThreshold;
    }

    /// @dev Returns the maximum amount a transaction can contain
    /// @return maximum amount or zero is no limit
    function getTransactionLimit() public view returns (uint256) {
        return transactionLimit;
    }

    /// @dev Returns the next available resolution.
    /// @return The next available resolution number
    function getNextResolutionNumber() public view returns (uint256) {
        return nextResolution;
    }

    /// @dev Returns the next available resolution.
    /// @return The next available resolution number
    function getLastOwnerResolutionNumber(address thisOwner)
        public
        view
        returns (uint256)
    {
        return lastOwnerResolutionNumber[thisOwner];
    }

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

    /// @dev Helper function to fail if resolution number is already in use.
    function resolutionAlreadyUsed(uint256 resNum) public view {
        require(
            // atleast one of the address must not be equal to address(0)
            !(resolutions[resNum].oldAddress != address(0) ||
                resolutions[resNum].newAddress != address(0)),
            "Resolution is already in use."
        );
    }

    function isResolutionPassed(uint256 resNum) public view returns (bool) {
        return resolutions[resNum].passed;
    }

    function canResolutionPass(uint256 resNum) public view returns (bool) {
        uint256 voteCount = 0;
        uint256 len = EnumerableSet.length(_owners);

        for (uint256 i = 0; i < len; i++) {
            if (ownerVotes[EnumerableSet.at(_owners, i)][resNum] == true) {
                voteCount++;
            }
        }

        return voteCount >= ownerAgreementThreshold;
    }

    // ////////////////////////////////////////////////////
    // PUBLIC FUNCTIONS
    // ////////////////////////////////////////////////////

    /// @notice Vote Yes on a Resolution.
    /// @dev The owner who tips the agreement threshold will pay the gas for performing the resolution.
    /// @return TRUE if the resolution passed
    function voteResolution(uint256 resNum) public onlyOwners() returns (bool) {
        ownerVotes[msg.sender][resNum] = true;

        // If the reolution has already passed, then do nothing
        if (isResolutionPassed(resNum)) {
            return true;
        }

        // If the resolution can now be passed, then do so
        if (canResolutionPass(resNum)) {
            _performResolution(resNum);
            return true;
        }

        // The resolution cannot be passed yet
        return false;
    }

    /// @dev Create a resolution to add an owner. Performs addition if threshold is 1 or zero.
    function createResolutionAddOwner(address newOwner) public onlyOwners() {
        isValidAddress(newOwner);
        require(
            !EnumerableSet.contains(_owners, newOwner),
            "newOwner already exists."
        );

        createResolution(resTypeAddOwner, address(0), newOwner, new bytes32[](0));
    }

    /// @dev Create a resolution to remove an owner. Performs removal if threshold is 1 or zero.
    /// @dev Updates the threshold to keep it less than or equal to the number of new owners
    function createResolutionRemoveOwner(address oldOwner) public onlyOwners() {
        isValidAddress(oldOwner);
        require(getNumberOfOwners() > 1, "Must always be one owner");
        require(
            EnumerableSet.contains(_owners, oldOwner),
            "owner is not an owner."
        );

        createResolution(resTypeRemoveOwner, oldOwner, address(0), new bytes32[](0));
    }

    /// @dev Create a resolution to repalce an owner. Performs replacement if threshold is 1 or zero.
    function createResolutionReplaceOwner(address oldOwner, address newOwner)
        public
        onlyOwners()
    {
        isValidAddress(oldOwner);
        isValidAddress(newOwner);
        require(
            EnumerableSet.contains(_owners, oldOwner),
            "oldOwner is not an owner."
        );
        require(
            !EnumerableSet.contains(_owners, newOwner),
            "newOwner already exists."
        );

        createResolution(resTypeReplaceOwner, oldOwner, newOwner, new bytes32[](0));
    }

    /// @dev Create a resolution to add an operator. Performs addition if threshold is 1 or zero.
    function createResolutionAddOperator(address newOperator)
        public
        onlyOwners()
    {
        isValidAddress(newOperator);
        require(
            !EnumerableSet.contains(_operators, newOperator),
            "newOperator already exists."
        );

        createResolution(resTypeAddOperator, address(0), newOperator, new bytes32[](0));
    }

    /// @dev Create a resolution to remove the operator. Performs removal if threshold is 1 or zero.
    function createResolutionRemoveOperator(address operator)
        public
        onlyOwners()
    {
        require(
            EnumerableSet.contains(_operators, operator),
            "operator is not an Operator."
        );
        createResolution(resTypeRemoveOperator, operator, address(0), new bytes32[](0));
    }

    /// @dev Create a resolution to replace the operator account. Performs replacement if threshold is 1 or zero.
    function createResolutionReplaceOperator(
        address oldOperator,
        address newOperator
    ) public onlyOwners() {
        isValidAddress(oldOperator);
        isValidAddress(newOperator);
        require(
            EnumerableSet.contains(_operators, oldOperator),
            "oldOperator is not an Operator."
        );
        require(
            !EnumerableSet.contains(_operators, newOperator),
            "newOperator already exists."
        );

        createResolution(resTypeReplaceOperator, oldOperator, newOperator,new bytes32[](0));
    }

    /// @dev Create a resolution to update the transaction limit. Performs update if threshold is 1 or zero.
    function createResolutionUpdateTransactionLimit(uint160 newLimit)
        public
        onlyOwners()
    {
        createResolution(
            resTypeUpdateTransactionLimit,
            address(0),
            address(newLimit),
            new bytes32[](0)
        );
    }

    /// @dev Create a resolution to update the owner agreement threshold. Performs update if threshold is 1 or zero.
    function createResolutionUpdateThreshold(uint160 threshold)
        public
        onlyOwners()
    {
        createResolution(
            resTypeUpdateThreshold,
            address(0),
            address(threshold),
            new bytes32[](0)
        );
    }

    /// @dev Pause the contract. Does not require owner agreement.
    function pause() public onlyOwners() {
        _pause();
    }

    /// @dev Create a resolution to unpause the contract. Performs update if threshold is 1 or zero.
    function createResolutionUnpause() public onlyOwners() {
        createResolution(resTypeUnpause, address(1), address(1), new bytes32[](0));
    }

    // ////////////////////////////////////////////////////
    // INTERNAL FUNCTIONS
    // ////////////////////////////////////////////////////
    /// @dev Create a resolution and check if we can call perofrm the resolution with 1 vote.
    function createResolution(
        uint256 resType,
        address oldAddress,
        address newAddress,
        bytes32[] memory extra
    ) internal {
        uint256 resNum = nextResolution;
        nextResolution++;
        resolutionAlreadyUsed(resNum);

        resolutions[resNum].resType = resType;
        resolutions[resNum].oldAddress = oldAddress;
        resolutions[resNum].newAddress = newAddress;
        resolutions[resNum].extra = extra;

        ownerVotes[msg.sender][resNum] = true;
        lastOwnerResolutionNumber[msg.sender] = resNum;

        // Check if agreement is already reached
        if (ownerAgreementThreshold <= 1) {
            _performResolution(resNum);
        }
    }

    /// @dev Performs the resolution and then marks it as passed. No checks prevent it from performing the resolutions.
    function _performResolution(uint256 resNum) internal {
        if (resolutions[resNum].resType == resTypeAddOwner) {
            _addOwner(resolutions[resNum].newAddress);
        } else if (resolutions[resNum].resType == resTypeRemoveOwner) {
            _removeOwner(resolutions[resNum].oldAddress);
        } else if (resolutions[resNum].resType == resTypeReplaceOwner) {
            _replaceOwner(
                resolutions[resNum].oldAddress,
                resolutions[resNum].newAddress
            );
        } else if (resolutions[resNum].resType == resTypeAddOperator) {
            _addOperator(resolutions[resNum].newAddress);
        } else if (resolutions[resNum].resType == resTypeRemoveOperator) {
            _removeOperator(resolutions[resNum].oldAddress);
        } else if (resolutions[resNum].resType == resTypeReplaceOperator) {
            _replaceOperator(
                resolutions[resNum].oldAddress,
                resolutions[resNum].newAddress
            );
        } else if (
            resolutions[resNum].resType == resTypeUpdateTransactionLimit
        ) {
            _updateTransactionLimit(uint160(resolutions[resNum].newAddress));
        } else if (resolutions[resNum].resType == resTypeUpdateThreshold) {
            _updateThreshold(uint160(resolutions[resNum].newAddress));
        } else if (resolutions[resNum].resType == resTypePause) {
            _pause();
        } else if (resolutions[resNum].resType == resTypeUnpause) {
            _unpause();
        } else {
            _customResolutions(resNum);
            return;
        }

        resolutions[resNum].passed = true;
    }

    /**
     * @dev Able to handle Custom Resolutions.
     * 
     * Requirements:
     * 
     * - Must set the resolution passed: resolutions[resNum].passed = true;
     * - You should check the resolutions[resNum].resType to know what to perform
     */
    function _customResolutions(uint256 resNum) internal virtual {}

    /// @dev
    function _addOwner(address newOwner) internal {
        EnumerableSet.add(_owners, newOwner);
        emit OwnerAddition(newOwner);
    }

    /// @dev
    function _removeOwner(address newOwner) internal {
        EnumerableSet.remove(_owners, newOwner);
        emit OwnerRemoval(newOwner);

        uint numOwners = getNumberOfOwners();
        if (ownerAgreementThreshold > numOwners) {
            _updateThreshold(numOwners);
        }
    }

    /// @dev
    function _replaceOwner(address oldOwner, address newOwner) internal {
        EnumerableSet.remove(_owners, oldOwner);
        EnumerableSet.add(_owners, newOwner);
        emit OwnerReplacement(oldOwner, newOwner);
    }

    /// @dev
    function _addOperator(address operator) internal {
        EnumerableSet.add(_operators, operator);
        emit OperatorAddition(operator);
    }

    /// @dev
    function _removeOperator(address operator) internal {
        EnumerableSet.remove(_operators, operator);
        emit OperatorRemoval(operator);
    }

    /// @dev
    function _replaceOperator(address oldOperator, address newOperator)
        internal
    {
        emit OperatorReplacement(oldOperator, newOperator);
        EnumerableSet.remove(_operators, oldOperator);
        EnumerableSet.add(_operators, newOperator);
    }

    /// @dev Internal function to update and emit the new transaction limit
    function _updateTransactionLimit(uint256 newLimit) internal {
        emit UpdateTransactionLimit(newLimit);
        transactionLimit = newLimit;
    }

    /// @dev Internal function to update and emit the new voting threshold
    function _updateThreshold(uint threshold) internal {
        require(
            threshold <= getNumberOfOwners(),
            "Unable to set threshold above the number of owners"
        );
        emit UpdateThreshold(threshold);
        ownerAgreementThreshold = threshold;
    }

    /// @dev Internal function to update and emit the new voting threshold
    function _updateNumberOfOperators(uint160 numOperators) internal {
        require(
            numOperators >= getNumberOfOperators(),
            "Unable to set number of Operators below the number of operators"
        );
        emit UpdateNumberOfOperators(numOperators);
        operatorLimit = numOperators;
    }

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

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

// File: contracts/UreeqaCollectibleNFTsv2.sol

pragma solidity >=0.7.0 <0.9.0;



/// @title Official Collectible NFTs
/// @author Dr. Jonathan Shahen at UREEQA
/// @notice Collectible NFTs that are officially connected to a Validated UREEQA NFT
/// @dev Check the Package of Proof associated with the UREEQA Validated NFT before Purchase
contract UreeqaCollectibleNFTv2 is OwnershipAgreementv3, ERC721 {
    // ////////////////////////////////////////////////////
    // STORAGE
    // ////////////////////////////////////////////////////
    string private _baseUrl;

    // Owner Validated NFT
    mapping(uint256 => address) _validatedNFTAddress;
    mapping(uint256 => uint256) _validatedNFTID;

    // Attached File
    mapping(uint256 => bytes32) _attachedFileHash;

    // ////////////////////////////////////////////////////
    // CONSTRUCTOR
    // ////////////////////////////////////////////////////
    /// @dev Add an Operator if `operator` is not equal to address(0)
    constructor(
        string memory name,
        string memory symbol,
        address operator
    ) ERC721(name, symbol) {
        _baseUrl = string(
            abi.encodePacked(
                "https://nft.ureeqa.com/contract/",
                toString(abi.encodePacked(address(this))),
                "/"
            )
        );

        if (operator != address(0)) {
            createResolutionAddOperator(operator);
        }
    }

    // ////////////////////////////////////////////////////
    // EVENTS
    // ////////////////////////////////////////////////////
    event UpdateNFT(
        address oldContract,
        uint256 oldNFTId,
        address newContract,
        uint256 newNFTId
    );
    event UpdateFileHash(bytes32 oldFileHash, bytes32 newFileHash);

    // ////////////////////////////////////////////////////
    // MODIFIERS
    // ////////////////////////////////////////////////////

    // ////////////////////////////////////////////////////
    // VIEW FUNCTIONS
    // ////////////////////////////////////////////////////
    /// @dev returns the Contract's URI
    function contractURI() public view returns (string memory) {
        return _baseUrl;
    }

    /// @dev Returns if an NFT exists (was minted)
    function exists(uint256 tokenId) public view returns (bool) {
        return _exists(tokenId);
    }

    /// @dev Returns the Smart Cotnract address and the NFT ID of the parent Validated NFT
    function getValidatedNFT(uint256 tokenId)
        public
        view
        returns (address, uint256)
    {
        return (_validatedNFTAddress[tokenId], _validatedNFTID[tokenId]);
    }

    /// @dev Returns the Smart Cotnract address and the NFT ID of the parent Validated NFT
    function getAttachedFileHash(uint256 tokenId)
        public
        view
        returns (bytes32)
    {
        return _attachedFileHash[tokenId];
    }

    // ////////////////////////////////////////////////////
    // PUBLIC FUNCTIONS
    // ////////////////////////////////////////////////////

    // ////////////////////////////////////////////////////
    // OPERATOR FUNCTIONS
    // ////////////////////////////////////////////////////

    /**
     * @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} nad {UpdateNFT} events.
     */
    function safeMint(
        address to,
        uint256 tokenId,
        address validatedAddress,
        uint256 validatedID,
        bytes32 attachedFileHash
    ) public onlyOperators() {
        _safeMint(to, tokenId, "");

        emit UpdateNFT(
            _validatedNFTAddress[tokenId],
            _validatedNFTID[tokenId],
            validatedAddress,
            validatedID
        );
        _validatedNFTAddress[tokenId] = validatedAddress;
        _validatedNFTID[tokenId] = validatedID;
        _attachedFileHash[tokenId] = attachedFileHash;
    }

    /**
     * @dev Safely mints `tokenId`s and transfers it to `to`s.
     *
     * 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 safeMintBatch(
        address[] calldata to,
        uint256[] calldata tokenId,
        address[] calldata validatedAddress,
        uint256[] calldata validatedID,
        bytes32[] calldata attachedFileHash
    ) public onlyOperators() {
        require(
            to.length == tokenId.length &&
                validatedAddress.length == tokenId.length &&
                attachedFileHash.length == tokenId.length &&
                validatedAddress.length == validatedID.length,
            "To and TokenID must have the same length"
        );
        for (uint256 i = 0; i < to.length; i++) {
            _safeMint(to[i], tokenId[i], "");

            emit UpdateNFT(
                _validatedNFTAddress[tokenId[i]],
                _validatedNFTID[tokenId[i]],
                validatedAddress[i],
                validatedID[i]
            );
            _validatedNFTAddress[tokenId[i]] = validatedAddress[i];
            _validatedNFTID[tokenId[i]] = validatedID[i];
            _attachedFileHash[tokenId[i]] = attachedFileHash[i];
        }
    }

    /**
     * @dev Updates the connected Validated NFT for a Collectible
     *
     * Emits a {UpdateNFT} event.
     */
    function updateValidatedNFT(
        uint256 tokenId,
        address validatedAddress,
        uint256 validatedID
    ) public onlyOperators() {
        emit UpdateNFT(
            _validatedNFTAddress[tokenId],
            _validatedNFTID[tokenId],
            validatedAddress,
            validatedID
        );
        _validatedNFTAddress[tokenId] = validatedAddress;
        _validatedNFTID[tokenId] = validatedID;
    }

    /**
     * @dev Batch Updates the connected Validated NFT for a Collectible
     *
     * Emits a {UpdateNFT} event.
     */
    function updateValidatedNFTBatch(
        uint256[] calldata tokenId,
        address[] calldata validatedAddress,
        uint256[] calldata validatedID
    ) public onlyOperators() {
        require(
            validatedAddress.length == tokenId.length &&
                validatedAddress.length == validatedID.length,
            "Input arrays must have the same length"
        );
        for (uint256 i = 0; i < tokenId.length; i++) {
            emit UpdateNFT(
                _validatedNFTAddress[tokenId[i]],
                _validatedNFTID[tokenId[i]],
                validatedAddress[i],
                validatedID[i]
            );
            _validatedNFTAddress[tokenId[i]] = validatedAddress[i];
            _validatedNFTID[tokenId[i]] = validatedID[i];
        }
    }

    /**
     * @dev Updates the attached File Hash for a Collectible
     *
     * Emits a {UpdateFileHash} event.
     */
    function updateAttachedFileHash(uint256 tokenId, bytes32 fileHash)
        public
        onlyOperators()
    {
        emit UpdateFileHash(_attachedFileHash[tokenId], fileHash);
        _attachedFileHash[tokenId] = fileHash;
    }

    /**
     * @dev Batch Updates the attached File Hash for a Collectible
     *
     * Emits a {UpdateFileHash} event.
     */
    function updateAttachedFileHashBatch(
        uint256[] calldata tokenId,
        bytes32[] calldata fileHash
    ) public onlyOperators() {
        require(
            fileHash.length == tokenId.length,
            "Input arrays must have the same length"
        );
        for (uint256 i = 0; i < tokenId.length; i++) {
            emit UpdateFileHash(_attachedFileHash[tokenId[i]], fileHash[i]);
            _attachedFileHash[tokenId[i]] = fileHash[i];
        }
    }

    // ////////////////////////////////////////////////////
    // INTERNAL FUNCTIONS
    // ////////////////////////////////////////////////////
    /**
     * @dev Base URI for computing {tokenURI}.
     */
    function _baseURI() internal view override returns (string memory) {
        return _baseUrl;
    }

    function toString(bytes memory data) public pure returns (string memory) {
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(2 + data.length * 2);
        str[0] = "0";
        str[1] = "x";
        for (uint256 i = 0; i < data.length; i++) {
            str[2 + i * 2] = alphabet[uint256(uint8(data[i] >> 4))];
            str[3 + i * 2] = alphabet[uint256(uint8(data[i] & 0x0f))];
        }
        return string(str);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"operator","type":"address"}],"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":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"}],"name":"OperatorRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOperator","type":"address"},{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorReplacement","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"}],"name":"OwnerRemoval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerReplacement","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":"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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"oldFileHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newFileHash","type":"bytes32"}],"name":"UpdateFileHash","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldNFTId","type":"uint256"},{"indexed":false,"internalType":"address","name":"newContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"newNFTId","type":"uint256"}],"name":"UpdateNFT","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newOperators","type":"uint256"}],"name":"UpdateNumberOfOperators","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newThreshold","type":"uint256"}],"name":"UpdateThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"UpdateTransactionLimit","type":"event"},{"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":"resNum","type":"uint256"}],"name":"canResolutionPass","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"createResolutionAddOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"createResolutionAddOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"createResolutionRemoveOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOwner","type":"address"}],"name":"createResolutionRemoveOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOperator","type":"address"},{"internalType":"address","name":"newOperator","type":"address"}],"name":"createResolutionReplaceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOwner","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"createResolutionReplaceOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createResolutionUnpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"threshold","type":"uint160"}],"name":"createResolutionUpdateThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint160","name":"newLimit","type":"uint160"}],"name":"createResolutionUpdateTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAttachedFileHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"thisOwner","type":"address"}],"name":"getLastOwnerResolutionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextResolutionNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfOperators","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfOwners","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransactionLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getValidatedNFT","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getVoteThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"isResolutionPassed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAddr","type":"address"}],"name":"isValidAddress","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextResolution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operatorLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAgreementThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerVotes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"resolutionAlreadyUsed","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"resolutions","outputs":[{"internalType":"bool","name":"passed","type":"bool"},{"internalType":"uint256","name":"resType","type":"uint256"},{"internalType":"address","name":"oldAddress","type":"address"},{"internalType":"address","name":"newAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"validatedAddress","type":"address"},{"internalType":"uint256","name":"validatedID","type":"uint256"},{"internalType":"bytes32","name":"attachedFileHash","type":"bytes32"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"validatedAddress","type":"address[]"},{"internalType":"uint256[]","name":"validatedID","type":"uint256[]"},{"internalType":"bytes32[]","name":"attachedFileHash","type":"bytes32[]"}],"name":"safeMintBatch","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":"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":"bytes","name":"data","type":"bytes"}],"name":"toString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"transactionLimit","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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"fileHash","type":"bytes32"}],"name":"updateAttachedFileHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"bytes32[]","name":"fileHash","type":"bytes32[]"}],"name":"updateAttachedFileHashBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"validatedAddress","type":"address"},{"internalType":"uint256","name":"validatedID","type":"uint256"}],"name":"updateValidatedNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"validatedAddress","type":"address[]"},{"internalType":"uint256[]","name":"validatedID","type":"uint256[]"}],"name":"updateValidatedNFTBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"resNum","type":"uint256"}],"name":"voteResolution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

608060405260016005556001600655600060075560016009553480156200002557600080fd5b506040516200538d3803806200538d833981016040819052620000489162000fa3565b8282620000553362000117565b6002805460ff1916905581516200007490600c90602085019062000e37565b5080516200008a90600d90602084019062000e37565b505050620000ba30604051602001620000a491906200102c565b60408051601f198184030181529190526200016c565b604051602001620000cc919062001044565b60405160208183030381529060405260129080519060200190620000f292919062000e37565b506001600160a01b038116156200010e576200010e816200041c565b50505062001379565b6200012f600082620004d260201b620020ae1760201c565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d8160405162000161919062001096565b60405180910390a150565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090620001a990600262001283565b620001b690600262001268565b6001600160401b03811115620001dc57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801562000207576020820181803683370190505b509050600360fc1b816000815181106200023157634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106200026f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b84518110156200041457826004868381518110620002b757634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c908110620002ee57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b031916826200030b83600262001283565b6200031890600262001268565b815181106200033757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350828582815181106200037057634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f169081106200039f57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682620003bc83600262001283565b620003c990600362001268565b81518110620003e857634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350806200040b816200132f565b91505062000289565b509392505050565b6200042733620004f2565b6200043f6000336200051b60201b620020c31760201c565b15156001146200046c5760405162461bcd60e51b8152600401620004639062001184565b60405180910390fd5b6200047781620004f2565b6200048f6003826200051b60201b620020c31760201c565b15620004af5760405162461bcd60e51b815260040162000463906200114d565b60408051600080825260208201909252620004cf91600491849062000532565b50565b6000620004e9836001600160a01b0384166200060a565b90505b92915050565b6001600160a01b038116620004cf5760405162461bcd60e51b81526004016200046390620011ff565b6000620004e9836001600160a01b03841662000659565b60098054908190600062000546836200132f565b909155506200055790508162000671565b6000818152600b60209081526040909120600181018790556002810180546001600160a01b038089166001600160a01b031992831617909255600383018054928816929091169190911790558351620005b99260049092019185019062000ec6565b503360008181526008602090815260408083208584528252808320805460ff19166001908117909155938352600a90915290208290556006541162000603576200060381620006d3565b5050505050565b600062000618838362000659565b6200065057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620004ec565b506000620004ec565b60009081526001919091016020526040902054151590565b6000818152600b60205260409020600201546001600160a01b0316151580620006b357506000818152600b60205260409020600301546001600160a01b031615155b15620004cf5760405162461bcd60e51b8152600401620004639062001228565b6000818152600b6020526040902060019081015414156200071a576000818152600b602052604090206003015462000714906001600160a01b031662000117565b62000952565b6000818152600b6020526040902060010154600214156200075b576000818152600b602052604090206002015462000714906001600160a01b03166200096e565b6000818152600b602052604090206001015460031415620007a7576000818152600b60205260409020600281015460039091015462000714916001600160a01b039081169116620009e8565b6000818152600b602052604090206001015460041415620007e8576000818152600b602052604090206003015462000714906001600160a01b031662000a59565b6000818152600b60205260409020600101546005141562000829576000818152600b602052604090206002015462000714906001600160a01b031662000aa3565b6000818152600b60205260409020600101546006141562000875576000818152600b60205260409020600281015460039091015462000714916001600160a01b03908116911662000aed565b6000818152600b602052604090206001015460081415620008b6576000818152600b602052604090206003015462000714906001600160a01b031662000b5e565b6000818152600b602052604090206001015460071415620008f7576000818152600b602052604090206003015462000714906001600160a01b031662000b9c565b6000818152600b6020526040902060010154600914156200091c576200071462000c06565b6000818152600b6020526040902060010154600a141562000941576200071462000c75565b6200094c81620004cf565b620004cf565b6000818152600b60205260409020805460ff1916600117905550565b6200098660008262000cd660201b620020d81760201c565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9081604051620009b8919062001096565b60405180910390a16000620009cc62000ced565b9050806006541115620009e457620009e48162000b9c565b5050565b62000a0060008362000cd660201b620020d81760201c565b5062000a19600082620004d260201b620020ae1760201c565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e5828260405162000a4d929190620010aa565b60405180910390a15050565b62000a71600382620004d260201b620020ae1760201c565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc8160405162000161919062001096565b62000abb60038262000cd660201b620020d81760201c565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be1548160405162000161919062001096565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a828260405162000b20929190620010aa565b60405180910390a162000b4060038362000cd660201b620020d81760201c565b5062000b59600382620004d260201b620020ae1760201c565b505050565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea98160405162000b8f91906200125f565b60405180910390a1600755565b62000ba662000ced565b81111562000bc85760405162461bcd60e51b81526004016200046390620010c4565b7fcfbc3e24bcdbf875f7af2b101605919fdbd3cb0b217ae54c372ae49417c58d018160405162000bf991906200125f565b60405180910390a1600655565b60025460ff161562000c2c5760405162461bcd60e51b81526004016200046390620011c8565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589062000c6b90339062001096565b60405180910390a1565b60025460ff1662000c9a5760405162461bcd60e51b8152600401620004639062001116565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9062000c6b90339062001096565b6000620004e9836001600160a01b03841662000d0b565b600062000d06600062000e2c60201b620020ed1760201c565b905090565b6000818152600183016020526040812054801562000e2157600062000d32600183620012a5565b855490915060009062000d4890600190620012a5565b9050600086600001828154811062000d7057634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811062000da257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101929092558281526001890190915260409020849055865487908062000de457634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050620004ec565b6000915050620004ec565b6000620004ec825490565b82805462000e4590620012f2565b90600052602060002090601f01602090048101928262000e69576000855562000eb4565b82601f1062000e8457805160ff191683800117855562000eb4565b8280016001018555821562000eb4579182015b8281111562000eb457825182559160200191906001019062000e97565b5062000ec292915062000f03565b5090565b82805482825590600052602060002090810192821562000eb4579160200282018281111562000eb457825182559160200191906001019062000e97565b5b8082111562000ec2576000815560010162000f04565b600082601f83011262000f2b578081fd5b81516001600160401b038082111562000f485762000f4862001363565b604051601f8301601f19168101602001828111828210171562000f6f5762000f6f62001363565b60405282815284830160200186101562000f87578384fd5b62000f9a836020830160208801620012bf565b95945050505050565b60008060006060848603121562000fb8578283fd5b83516001600160401b038082111562000fcf578485fd5b62000fdd8783880162000f1a565b9450602086015191508082111562000ff3578384fd5b50620010028682870162000f1a565b604086015190935090506001600160a01b038116811462001021578182fd5b809150509250925092565b60609190911b6001600160601b031916815260140190565b60007f68747470733a2f2f6e66742e7572656571612e636f6d2f636f6e74726163742f825282516200107e816020850160208701620012bf565b602f60f81b6020939091019283015250602101919050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b90815260200190565b600082198211156200127e576200127e6200134d565b500190565b6000816000190483118215151615620012a057620012a06200134d565b500290565b600082821015620012ba57620012ba6200134d565b500390565b60005b83811015620012dc578181015183820152602001620012c2565b83811115620012ec576000848401525b50505050565b6002810460018216806200130757607f821691505b602082108114156200132957634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200134657620013466200134d565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61400480620013896000396000f3fe608060405234801561001057600080fd5b506004361061035c5760003560e01c80638456cb59116101d3578063b8d95d7e11610104578063ce6f7549116100a2578063e985e9c51161007c578063e985e9c5146106e6578063f1376a98146106f9578063f19605d61461070c578063fb3da8e5146107145761035c565b8063ce6f7549146106c3578063dee80c0f146106d6578063e8a3d485146106de5761035c565b8063c0d795de116100de578063c0d795de1461068d578063c3743cff146106a0578063c87b56dd146106a8578063ccc19752146106bb5761035c565b8063b8d95d7e1461065f578063baa98fbd14610672578063bc64745f1461067a5761035c565b806395d89b4111610171578063a4b7f5ce1161014b578063a4b7f5ce1461060e578063abefed8314610631578063b85e5b7414610644578063b88d4fde1461064c5761035c565b806395d89b41146105eb578063a0e67e2b146105f3578063a22cb465146105fb5761035c565b80638da5cb5b116101ad5780638da5cb5b146105a75780638dfc731f146105af57806390e4ed59146105c25780639425c908146105ca5761035c565b80638456cb591461057757806384be5ea91461057f57806385a1a60b146105925761035c565b80632e33e1e3116102ad578063654079ba1161024b57806370a082311161022557806370a082311461052b57806371aad10d1461053e57806378f880d2146105515780637ad8ed1e146105645761035c565b8063654079ba146104f25780636cc8bcff146105055780636f80210a146105185761035c565b80634f558e79116102875780634f558e79146104bc5780635c975abb146104cf5780635e7d907f146104d75780636352211e146104df5761035c565b80632e33e1e31461048e5780633a008949146104a157806342842e0e146104a95761035c565b8063095ea7b31161031a57806320336566116102f4578063203365661461044057806323b872dd1461045357806326eb27351461046657806327a099d8146104795761035c565b8063095ea7b31461040757806312c290cb1461041a57806312c445151461042d5761035c565b80623f07fa1461036157806301ffc9a714610376578063037af12c1461039f578063053a04f1146103bf57806306fdde03146103d2578063081812fc146103e7575b600080fd5b61037461036f366004613047565b610727565b005b6103896103843660046133dc565b610759565b60405161039691906135fc565b60405180910390f35b6103b26103ad366004613047565b6107a1565b6040516103969190613630565b6103896103cd366004613447565b6107bc565b6103da6107d1565b6040516103969190613647565b6103fa6103f5366004613447565b610864565b6040516103969190613501565b610374610415366004613176565b6108a7565b610374610428366004613047565b61093f565b61037461043b366004613047565b6109de565b61037461044e366004613063565b610a21565b61037461046136600461309b565b610ac9565b610374610474366004613047565b610b01565b610481610b9b565b60405161039691906135af565b61037461049c366004613047565b610c67565b6103b2610cdb565b6103746104b736600461309b565b610ce1565b6103896104ca366004613447565b610cfc565b610389610d07565b6103b2610d10565b6103fa6104ed366004613447565b610d16565b610389610500366004613176565b610d4b565b610374610513366004613447565b610d6b565b61037461052636600461345f565b610dc9565b6103b2610539366004613047565b610e84565b6103da61054c366004613414565b610ec8565b61037461055f366004613485565b61115f565b610374610572366004613047565b6111ee565b610374611231565b61037461058d366004613063565b611270565b61059a611314565b6040516103969190613e3b565b6103fa611325565b6103746105bd366004613373565b611348565b6103b26114bd565b6105dd6105d8366004613447565b6114c3565b60405161039692919061356c565b6103da6114ec565b6104816114fb565b610374610609366004613145565b6115c0565b61062161061c366004613447565b61168e565b6040516103969493929190613607565b61037461063f3660046131f2565b6116c6565b6103b2611a3e565b61037461065a3660046130db565b611a4a565b61037461066d366004613047565b611a89565b610374611af3565b6103b2610688366004613447565b611b37565b61038961069b366004613447565b611b49565b6103b2611bd3565b6103da6106b6366004613447565b611bd9565b6103b2611c5c565b6103746106d13660046132dd565b611c62565b6103b2611ee8565b6103da611eee565b6103896106f4366004613063565b611efd565b610389610707366004613447565b611f2d565b6103b2611fc6565b6103746107223660046131a1565b611fcc565b6001600160a01b0381166107565760405162461bcd60e51b815260040161074d90613da4565b60405180910390fd5b50565b60006001600160e01b031982166380ac58cd60e01b148061078a57506001600160e01b03198216635b5e139f60e01b145b806107995750610799826120f8565b90505b919050565b6001600160a01b03166000908152600a602052604090205490565b6000908152600b602052604090205460ff1690565b6060600c80546107e090613ed7565b80601f016020809104026020016040519081016040528092919081815260200182805461080c90613ed7565b80156108595780601f1061082e57610100808354040283529160200191610859565b820191906000526020600020905b81548152906001019060200180831161083c57829003601f168201915b505050505090505b90565b600061086f82612111565b61088b5760405162461bcd60e51b815260040161074d90613bb3565b506000908152601060205260409020546001600160a01b031690565b60006108b282610d16565b9050806001600160a01b0316836001600160a01b031614156108e65760405162461bcd60e51b815260040161074d90613c97565b806001600160a01b03166108f861212e565b6001600160a01b031614806109145750610914816106f461212e565b6109305760405162461bcd60e51b815260040161074d90613973565b61093a8383612132565b505050565b61094833610727565b6109536000336120c3565b15156001146109745760405162461bcd60e51b815260040161074d90613d29565b61097d81610727565b6109886003826120c3565b156109a55760405162461bcd60e51b815260040161074d90613ad1565b6107566004600083815b6040519080825280602002602001820160405280156109d8578160200160208202803683370190505b506121a0565b6109e733610727565b6109f26000336120c3565b1515600114610a135760405162461bcd60e51b815260040161074d90613d29565b6107566007600083816109af565b610a2a33610727565b610a356000336120c3565b1515600114610a565760405162461bcd60e51b815260040161074d90613d29565b610a5f82610727565b610a6881610727565b610a736003836120c3565b610a8f5760405162461bcd60e51b815260040161074d906137ae565b610a9a6003826120c3565b15610ab75760405162461bcd60e51b815260040161074d90613ad1565b610ac56006838360006109af565b5050565b610ada610ad461212e565b82612267565b610af65760405162461bcd60e51b815260040161074d90613cd8565b61093a8383836122ec565b610b0a33610727565b610b156000336120c3565b1515600114610b365760405162461bcd60e51b815260040161074d90613d29565b610b3f81610727565b6001610b49611a3e565b11610b665760405162461bcd60e51b815260040161074d90613740565b610b716000826120c3565b610b8d5760405162461bcd60e51b815260040161074d90613b83565b6107566002826000806109af565b60606000610ba960036120ed565b905060008167ffffffffffffffff811115610bd457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610bfd578160200160208202803683370190505b50905060005b82811015610c6057610c16600382612419565b828281518110610c3657634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280610c5881613f12565b915050610c03565b5091505090565b610c7033610727565b610c7b6000336120c3565b1515600114610c9c5760405162461bcd60e51b815260040161074d90613d29565b610ca581610727565b610cb06000826120c3565b15610ccd5760405162461bcd60e51b815260040161074d906138f4565b6107566001600083816109af565b60095490565b61093a83838360405180602001604052806000815250611a4a565b600061079982612111565b60025460ff1690565b60065490565b6000818152600e60205260408120546001600160a01b0316806107995760405162461bcd60e51b815260040161074d90613a1a565b600860209081526000928352604080842090915290825290205460ff1681565b6000818152600b60205260409020600201546001600160a01b0316151580610dac57506000818152600b60205260409020600301546001600160a01b031615155b156107565760405162461bcd60e51b815260040161074d90613e04565b610dd233610727565b610ddd6003336120c3565b1515600114610dfe5760405162461bcd60e51b815260040161074d90613860565b600083815260136020908152604080832054601490925291829020549151600080516020613faf83398151915292610e43926001600160a01b03169186908690613585565b60405180910390a1600092835260136020908152604080852080546001600160a01b0319166001600160a01b03959095169490941790935560149052912055565b60006001600160a01b038216610eac5760405162461bcd60e51b815260040161074d906139d0565b506001600160a01b03166000908152600f602052604090205490565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090610f03906002613e75565b610f0e906002613e49565b67ffffffffffffffff811115610f3457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610f5e576020820181803683370190505b509050600360fc1b81600081518110610f8757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610fc457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b84518110156111575782600486838151811061100a57634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c90811061104057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168261105b836002613e75565b611066906002613e49565b8151811061108457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350828582815181106110bc57634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f169081106110ea57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611105836002613e75565b611110906003613e49565b8151811061112e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061114f81613f12565b915050610fde565b509392505050565b61116833610727565b6111736003336120c3565b15156001146111945760405162461bcd60e51b815260040161074d90613860565b600082815260156020526040908190205490517f2dbfd0069a9236a97389d9573cc238a1ba0cb78a195d33231fc1cbc87e4ccd17916111d4918490613639565b60405180910390a160009182526015602052604090912055565b6111f733610727565b6112026000336120c3565b15156001146112235760405162461bcd60e51b815260040161074d90613d29565b6107566008600083816109af565b61123a33610727565b6112456000336120c3565b15156001146112665760405162461bcd60e51b815260040161074d90613d29565b61126e612425565b565b61127933610727565b6112846000336120c3565b15156001146112a55760405162461bcd60e51b815260040161074d90613d29565b6112ae82610727565b6112b781610727565b6112c26000836120c3565b6112de5760405162461bcd60e51b815260040161074d90613a63565b6112e96000826120c3565b156113065760405162461bcd60e51b815260040161074d906138f4565b610ac56003838360006109af565b600061132060036120ed565b905090565b600061133160006120ed565b61133d57506000610861565b611320600080612419565b61135133610727565b61135c6003336120c3565b151560011461137d5760405162461bcd60e51b815260040161074d90613860565b80831461139c5760405162461bcd60e51b815260040161074d90613b3d565b60005b838110156114b6577f2dbfd0069a9236a97389d9573cc238a1ba0cb78a195d33231fc1cbc87e4ccd17601560008787858181106113ec57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000205484848481811061142257634e487b7160e01b600052603260045260246000fd5b90506020020135604051611437929190613639565b60405180910390a182828281811061145f57634e487b7160e01b600052603260045260246000fd5b905060200201356015600087878581811061148a57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000208190555080806114ae90613f12565b91505061139f565b5050505050565b60055481565b6000908152601360209081526040808320546014909252909120546001600160a01b0390911691565b6060600d80546107e090613ed7565b6060600061150960006120ed565b905060008167ffffffffffffffff81111561153457634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561155d578160200160208202803683370190505b50905060005b82811015610c6057611576600082612419565b82828151811061159657634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806115b881613f12565b915050611563565b6115c861212e565b6001600160a01b0316826001600160a01b031614156115f95760405162461bcd60e51b815260040161074d90613829565b806011600061160661212e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561164a61212e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168291906135fc565b60405180910390a35050565b600b60205260009081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b03918216911684565b6116cf33610727565b6116da6003336120c3565b15156001146116fb5760405162461bcd60e51b815260040161074d90613860565b888714801561170957508487145b801561171457508087145b801561171f57508483145b61173b5760405162461bcd60e51b815260040161074d9061392b565b60005b89811015611a31576117ba8b8b8381811061176957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061177e9190613047565b8a8a8481811061179e57634e487b7160e01b600052603260045260246000fd5b905060200201356040518060200160405280600081525061248f565b600080516020613faf833981519152601360008b8b858181106117ed57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316601460008c8c8681811061183a57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000205489898581811061187057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906118859190613047565b8888868181106118a557634e487b7160e01b600052603260045260246000fd5b905060200201356040516118bc9493929190613585565b60405180910390a18686828181106118e457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906118f99190613047565b601360008b8b8581811061191d57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084848281811061197657634e487b7160e01b600052603260045260246000fd5b90506020020135601460008b8b858181106119a157634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508282828181106119da57634e487b7160e01b600052603260045260246000fd5b90506020020135601560008b8b85818110611a0557634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508080611a2990613f12565b91505061173e565b5050505050505050505050565b600061132060006120ed565b611a5b611a5561212e565b83612267565b611a775760405162461bcd60e51b815260040161074d90613cd8565b611a83848484846124c2565b50505050565b611a9233610727565b611a9d6000336120c3565b1515600114611abe5760405162461bcd60e51b815260040161074d90613d29565b611ac96003826120c3565b611ae55760405162461bcd60e51b815260040161074d90613dcd565b6107566005826000806109af565b611afc33610727565b611b076000336120c3565b1515600114611b285760405162461bcd60e51b815260040161074d90613d29565b61126e600a60018060006109af565b60009081526015602052604090205490565b60008080611b56816120ed565b905060005b81811015611bc65760086000611b72600084612419565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205460ff16151560011415611bb45782611bb081613f12565b9350505b80611bbe81613f12565b915050611b5b565b5050600654111592915050565b60075490565b6060611be482612111565b611c005760405162461bcd60e51b815260040161074d90613c48565b6000611c0a611eee565b90506000815111611c2a5760405180602001604052806000815250611c55565b80611c34846124f5565b604051602001611c459291906134d2565b6040516020818303038152906040525b9392505050565b60095481565b611c6b33610727565b611c766003336120c3565b1515600114611c975760405162461bcd60e51b815260040161074d90613860565b8285148015611ca557508281145b611cc15760405162461bcd60e51b815260040161074d90613b3d565b60005b85811015611edf57600080516020613faf83398151915260136000898985818110611cff57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316601460008a8a86818110611d4c57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002054878785818110611d8257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d979190613047565b868686818110611db757634e487b7160e01b600052603260045260246000fd5b90506020020135604051611dce9493929190613585565b60405180910390a1848482818110611df657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e0b9190613047565b60136000898985818110611e2f57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550828282818110611e8857634e487b7160e01b600052603260045260246000fd5b9050602002013560146000898985818110611eb357634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508080611ed790613f12565b915050611cc4565b50505050505050565b60065481565b6060601280546107e090613ed7565b6001600160a01b0380831660009081526011602090815260408083209385168352929052205460ff165b92915050565b6000611f3833610727565b611f436000336120c3565b1515600114611f645760405162461bcd60e51b815260040161074d90613d29565b3360009081526008602090815260408083208584529091529020805460ff19166001179055611f92826107bc565b15611f9f5750600161079c565b611fa882611b49565b15611fbe57611fb682612610565b50600161079c565b506000919050565b60075481565b611fd533610727565b611fe06003336120c3565b15156001146120015760405162461bcd60e51b815260040161074d90613860565b61201b85856040518060200160405280600081525061248f565b600084815260136020908152604080832054601490925291829020549151600080516020613faf83398151915292612060926001600160a01b03169187908790613585565b60405180910390a1600093845260136020908152604080862080546001600160a01b0319166001600160a01b0396909616959095179094556014815283852092909255601590915291205550565b6000611c55836001600160a01b038416612889565b6000611c55836001600160a01b0384166128d3565b6000611c55836001600160a01b0384166128eb565b600061079982612a02565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600e60205260409020546001600160a01b0316151590565b3390565b600081815260106020526040902080546001600160a01b0319166001600160a01b038416908117909155819061216782610d16565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6009805490819060006121b283613f12565b91905055506121c081610d6b565b6000818152600b60209081526040909120600181018790556002810180546001600160a01b038089166001600160a01b03199283161790925560038301805492881692909116919091179055835161222092600490920191850190612f1d565b503360008181526008602090815260408083208584528252808320805460ff19166001908117909155938352600a9091529020829055600654116114b6576114b681612610565b600061227282612111565b61228e5760405162461bcd60e51b815260040161074d906138a8565b600061229983610d16565b9050806001600160a01b0316846001600160a01b031614806122d45750836001600160a01b03166122c984610864565b6001600160a01b0316145b806122e457506122e48185611efd565b949350505050565b826001600160a01b03166122ff82610d16565b6001600160a01b0316146123255760405162461bcd60e51b815260040161074d90613bff565b6001600160a01b03821661234b5760405162461bcd60e51b815260040161074d906137e5565b61235683838361093a565b612361600082612132565b6001600160a01b0383166000908152600f6020526040812080546001929061238a908490613e94565b90915550506001600160a01b0382166000908152600f602052604081208054600192906123b8908490613e49565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611c558383612a06565b60025460ff16156124485760405162461bcd60e51b815260040161074d90613d6d565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890612485903390613501565b60405180910390a1565b6124998383612a5f565b6124a66000848484612b3e565b61093a5760405162461bcd60e51b815260040161074d906136ee565b6124cd8484846122ec565b6124d984848484612b3e565b611a835760405162461bcd60e51b815260040161074d906136ee565b60608161251a57506040805180820190915260018152600360fc1b602082015261079c565b8160005b8115612544578061252e81613f12565b915061253d9050600a83613e61565b915061251e565b60008167ffffffffffffffff81111561256d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612597576020820181803683370190505b5090505b84156122e4576125ac600183613e94565b91506125b9600a86613f2d565b6125c4906030613e49565b60f81b8183815181106125e757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612609600a86613e61565b945061259b565b6000818152600b602052604090206001908101541415612653576000818152600b602052604090206003015461264e906001600160a01b0316612c59565b61286d565b6000818152600b602052604090206001015460021415612691576000818152600b602052604090206002015461264e906001600160a01b0316612c9f565b6000818152600b6020526040902060010154600314156126da576000818152600b60205260409020600281015460039091015461264e916001600160a01b039081169116612d01565b6000818152600b602052604090206001015460041415612718576000818152600b602052604090206003015461264e906001600160a01b0316612d56565b6000818152600b602052604090206001015460051415612756576000818152600b602052604090206002015461264e906001600160a01b0316612d91565b6000818152600b60205260409020600101546006141561279f576000818152600b60205260409020600281015460039091015461264e916001600160a01b039081169116612dcc565b6000818152600b6020526040902060010154600814156127dd576000818152600b602052604090206003015461264e906001600160a01b0316612e1c565b6000818152600b60205260409020600101546007141561281b576000818152600b602052604090206003015461264e906001600160a01b0316612e58565b6000818152600b60205260409020600101546009141561283d5761264e612425565b6000818152600b6020526040902060010154600a141561285f5761264e612ebb565b61286881610756565b610756565b6000818152600b60205260409020805460ff1916600117905550565b600061289583836128d3565b6128cb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611f27565b506000611f27565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156129f857600061290f600183613e94565b855490915060009061292390600190613e94565b9050600086600001828154811061294a57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061297b57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600189019091526040902084905586548790806129bc57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611f27565b6000915050611f27565b5490565b81546000908210612a295760405162461bcd60e51b815260040161074d9061365a565b826000018281548110612a4c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6001600160a01b038216612a855760405162461bcd60e51b815260040161074d90613b08565b612a8e81612111565b15612aab5760405162461bcd60e51b815260040161074d90613777565b612ab76000838361093a565b6001600160a01b0382166000908152600f60205260408120805460019290612ae0908490613e49565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612b52846001600160a01b0316612f17565b15612c4e57836001600160a01b031663150b7a02612b6e61212e565b8786866040518563ffffffff1660e01b8152600401612b90949392919061352f565b602060405180830381600087803b158015612baa57600080fd5b505af1925050508015612bda575060408051601f3d908101601f19168201909252612bd7918101906133f8565b60015b612c34573d808015612c08576040519150601f19603f3d011682016040523d82523d6000602084013e612c0d565b606091505b508051612c2c5760405162461bcd60e51b815260040161074d906136ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122e4565b506001949350505050565b612c646000826120ae565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d81604051612c949190613501565b60405180910390a150565b612caa6000826120d8565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9081604051612cda9190613501565b60405180910390a16000612cec611a3e565b9050806006541115610ac557610ac581612e58565b612d0c6000836120d8565b50612d186000826120ae565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e58282604051612d4a929190613515565b60405180910390a15050565b612d616003826120ae565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc81604051612c949190613501565b612d9c6003826120d8565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be15481604051612c949190613501565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a8282604051612dfd929190613515565b60405180910390a1612e106003836120d8565b5061093a6003826120ae565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea981604051612e4b9190613630565b60405180910390a1600755565b612e60611a3e565b811115612e7f5760405162461bcd60e51b815260040161074d9061369c565b7fcfbc3e24bcdbf875f7af2b101605919fdbd3cb0b217ae54c372ae49417c58d0181604051612eae9190613630565b60405180910390a1600655565b60025460ff16612edd5760405162461bcd60e51b815260040161074d90613a9a565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90612485903390613501565b3b151590565b828054828255906000526020600020908101928215612f58579160200282015b82811115612f58578251825591602001919060010190612f3d565b50612f64929150612f68565b5090565b5b80821115612f645760008155600101612f69565b60008083601f840112612f8e578081fd5b50813567ffffffffffffffff811115612fa5578182fd5b6020830191508360208083028501011115612fbf57600080fd5b9250929050565b600082601f830112612fd6578081fd5b813567ffffffffffffffff80821115612ff157612ff1613f6d565b604051601f8301601f19168101602001828111828210171561301557613015613f6d565b60405282815284830160200186101561302c578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215613058578081fd5b8135611c5581613f83565b60008060408385031215613075578081fd5b823561308081613f83565b9150602083013561309081613f83565b809150509250929050565b6000806000606084860312156130af578081fd5b83356130ba81613f83565b925060208401356130ca81613f83565b929592945050506040919091013590565b600080600080608085870312156130f0578081fd5b84356130fb81613f83565b9350602085013561310b81613f83565b925060408501359150606085013567ffffffffffffffff81111561312d578182fd5b61313987828801612fc6565b91505092959194509250565b60008060408385031215613157578182fd5b823561316281613f83565b915060208301358015158114613090578182fd5b60008060408385031215613188578182fd5b823561319381613f83565b946020939093013593505050565b600080600080600060a086880312156131b8578081fd5b85356131c381613f83565b94506020860135935060408601356131da81613f83565b94979396509394606081013594506080013592915050565b60008060008060008060008060008060a08b8d031215613210578485fd5b8a3567ffffffffffffffff80821115613227578687fd5b6132338e838f01612f7d565b909c509a5060208d013591508082111561324b578687fd5b6132578e838f01612f7d565b909a50985060408d013591508082111561326f578687fd5b61327b8e838f01612f7d565b909850965060608d0135915080821115613293578586fd5b61329f8e838f01612f7d565b909650945060808d01359150808211156132b7578384fd5b506132c48d828e01612f7d565b915080935050809150509295989b9194979a5092959850565b600080600080600080606087890312156132f5578182fd5b863567ffffffffffffffff8082111561330c578384fd5b6133188a838b01612f7d565b90985096506020890135915080821115613330578384fd5b61333c8a838b01612f7d565b90965094506040890135915080821115613354578384fd5b5061336189828a01612f7d565b979a9699509497509295939492505050565b60008060008060408587031215613388578182fd5b843567ffffffffffffffff8082111561339f578384fd5b6133ab88838901612f7d565b909650945060208701359150808211156133c3578384fd5b506133d087828801612f7d565b95989497509550505050565b6000602082840312156133ed578081fd5b8135611c5581613f98565b600060208284031215613409578081fd5b8151611c5581613f98565b600060208284031215613425578081fd5b813567ffffffffffffffff81111561343b578182fd5b6122e484828501612fc6565b600060208284031215613458578081fd5b5035919050565b600080600060608486031215613473578081fd5b8335925060208401356130ca81613f83565b60008060408385031215613497578182fd5b50508035926020909101359150565b600081518084526134be816020860160208601613eab565b601f01601f19169290920160200192915050565b600083516134e4818460208801613eab565b8351908301906134f8818360208801613eab565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613562908301846134a6565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b6020808252825182820181905260009190848201906040850190845b818110156135f05783516001600160a01b0316835292840192918401916001016135cb565b50909695505050505050565b901515815260200190565b931515845260208401929092526001600160a01b03908116604084015216606082015260800190565b90815260200190565b918252602082015260400190565b600060208252611c5560208301846134a6565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526018908201527f4d75737420616c77617973206265206f6e65206f776e65720000000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601f908201527f6f6c644f70657261746f72206973206e6f7420616e204f70657261746f722e00604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526028908201527f4f6e6c7920746865206f70657261746f722063616e2072756e207468697320666040820152673ab731ba34b7b71760c11b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526018908201527f6e65774f776e657220616c7265616479206578697374732e0000000000000000604082015260600190565b60208082526028908201527f546f20616e6420546f6b656e4944206d7573742068617665207468652073616d6040820152670ca40d8cadccee8d60c31b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f6f6c644f776e6572206973206e6f7420616e206f776e65722e00000000000000604082015260600190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526026908201527f496e70757420617272617973206d7573742068617665207468652073616d65206040820152650d8cadccee8d60d31b606082015260800190565b60208082526016908201527537bbb732b91034b9903737ba1030b71037bbb732b91760511b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601c908201527f6f70657261746f72206973206e6f7420616e204f70657261746f722e00000000604082015260600190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b60ff91909116815260200190565b60008219821115613e5c57613e5c613f41565b500190565b600082613e7057613e70613f57565b500490565b6000816000190483118215151615613e8f57613e8f613f41565b500290565b600082821015613ea657613ea6613f41565b500390565b60005b83811015613ec6578181015183820152602001613eae565b83811115611a835750506000910152565b600281046001821680613eeb57607f821691505b60208210811415613f0c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f2657613f26613f41565b5060010190565b600082613f3c57613f3c613f57565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461075657600080fd5b6001600160e01b03198116811461075657600080fdfe94e823969ed6ed7ab64ec5ba9dbcdf3117af9e0563e0f43a62e9e6a74a3f43a1a2646970667358221220e67864a3eb7e12b01e8b04935666c8a95c0096afff886b2afb99b2f0cabd447e64736f6c63430008000033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002e2090300faf6de6495e3070df102bbc1e4ce7fa000000000000000000000000000000000000000000000000000000000000001355524545514120436f6c6c65637469626c6573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006555251412d430000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061035c5760003560e01c80638456cb59116101d3578063b8d95d7e11610104578063ce6f7549116100a2578063e985e9c51161007c578063e985e9c5146106e6578063f1376a98146106f9578063f19605d61461070c578063fb3da8e5146107145761035c565b8063ce6f7549146106c3578063dee80c0f146106d6578063e8a3d485146106de5761035c565b8063c0d795de116100de578063c0d795de1461068d578063c3743cff146106a0578063c87b56dd146106a8578063ccc19752146106bb5761035c565b8063b8d95d7e1461065f578063baa98fbd14610672578063bc64745f1461067a5761035c565b806395d89b4111610171578063a4b7f5ce1161014b578063a4b7f5ce1461060e578063abefed8314610631578063b85e5b7414610644578063b88d4fde1461064c5761035c565b806395d89b41146105eb578063a0e67e2b146105f3578063a22cb465146105fb5761035c565b80638da5cb5b116101ad5780638da5cb5b146105a75780638dfc731f146105af57806390e4ed59146105c25780639425c908146105ca5761035c565b80638456cb591461057757806384be5ea91461057f57806385a1a60b146105925761035c565b80632e33e1e3116102ad578063654079ba1161024b57806370a082311161022557806370a082311461052b57806371aad10d1461053e57806378f880d2146105515780637ad8ed1e146105645761035c565b8063654079ba146104f25780636cc8bcff146105055780636f80210a146105185761035c565b80634f558e79116102875780634f558e79146104bc5780635c975abb146104cf5780635e7d907f146104d75780636352211e146104df5761035c565b80632e33e1e31461048e5780633a008949146104a157806342842e0e146104a95761035c565b8063095ea7b31161031a57806320336566116102f4578063203365661461044057806323b872dd1461045357806326eb27351461046657806327a099d8146104795761035c565b8063095ea7b31461040757806312c290cb1461041a57806312c445151461042d5761035c565b80623f07fa1461036157806301ffc9a714610376578063037af12c1461039f578063053a04f1146103bf57806306fdde03146103d2578063081812fc146103e7575b600080fd5b61037461036f366004613047565b610727565b005b6103896103843660046133dc565b610759565b60405161039691906135fc565b60405180910390f35b6103b26103ad366004613047565b6107a1565b6040516103969190613630565b6103896103cd366004613447565b6107bc565b6103da6107d1565b6040516103969190613647565b6103fa6103f5366004613447565b610864565b6040516103969190613501565b610374610415366004613176565b6108a7565b610374610428366004613047565b61093f565b61037461043b366004613047565b6109de565b61037461044e366004613063565b610a21565b61037461046136600461309b565b610ac9565b610374610474366004613047565b610b01565b610481610b9b565b60405161039691906135af565b61037461049c366004613047565b610c67565b6103b2610cdb565b6103746104b736600461309b565b610ce1565b6103896104ca366004613447565b610cfc565b610389610d07565b6103b2610d10565b6103fa6104ed366004613447565b610d16565b610389610500366004613176565b610d4b565b610374610513366004613447565b610d6b565b61037461052636600461345f565b610dc9565b6103b2610539366004613047565b610e84565b6103da61054c366004613414565b610ec8565b61037461055f366004613485565b61115f565b610374610572366004613047565b6111ee565b610374611231565b61037461058d366004613063565b611270565b61059a611314565b6040516103969190613e3b565b6103fa611325565b6103746105bd366004613373565b611348565b6103b26114bd565b6105dd6105d8366004613447565b6114c3565b60405161039692919061356c565b6103da6114ec565b6104816114fb565b610374610609366004613145565b6115c0565b61062161061c366004613447565b61168e565b6040516103969493929190613607565b61037461063f3660046131f2565b6116c6565b6103b2611a3e565b61037461065a3660046130db565b611a4a565b61037461066d366004613047565b611a89565b610374611af3565b6103b2610688366004613447565b611b37565b61038961069b366004613447565b611b49565b6103b2611bd3565b6103da6106b6366004613447565b611bd9565b6103b2611c5c565b6103746106d13660046132dd565b611c62565b6103b2611ee8565b6103da611eee565b6103896106f4366004613063565b611efd565b610389610707366004613447565b611f2d565b6103b2611fc6565b6103746107223660046131a1565b611fcc565b6001600160a01b0381166107565760405162461bcd60e51b815260040161074d90613da4565b60405180910390fd5b50565b60006001600160e01b031982166380ac58cd60e01b148061078a57506001600160e01b03198216635b5e139f60e01b145b806107995750610799826120f8565b90505b919050565b6001600160a01b03166000908152600a602052604090205490565b6000908152600b602052604090205460ff1690565b6060600c80546107e090613ed7565b80601f016020809104026020016040519081016040528092919081815260200182805461080c90613ed7565b80156108595780601f1061082e57610100808354040283529160200191610859565b820191906000526020600020905b81548152906001019060200180831161083c57829003601f168201915b505050505090505b90565b600061086f82612111565b61088b5760405162461bcd60e51b815260040161074d90613bb3565b506000908152601060205260409020546001600160a01b031690565b60006108b282610d16565b9050806001600160a01b0316836001600160a01b031614156108e65760405162461bcd60e51b815260040161074d90613c97565b806001600160a01b03166108f861212e565b6001600160a01b031614806109145750610914816106f461212e565b6109305760405162461bcd60e51b815260040161074d90613973565b61093a8383612132565b505050565b61094833610727565b6109536000336120c3565b15156001146109745760405162461bcd60e51b815260040161074d90613d29565b61097d81610727565b6109886003826120c3565b156109a55760405162461bcd60e51b815260040161074d90613ad1565b6107566004600083815b6040519080825280602002602001820160405280156109d8578160200160208202803683370190505b506121a0565b6109e733610727565b6109f26000336120c3565b1515600114610a135760405162461bcd60e51b815260040161074d90613d29565b6107566007600083816109af565b610a2a33610727565b610a356000336120c3565b1515600114610a565760405162461bcd60e51b815260040161074d90613d29565b610a5f82610727565b610a6881610727565b610a736003836120c3565b610a8f5760405162461bcd60e51b815260040161074d906137ae565b610a9a6003826120c3565b15610ab75760405162461bcd60e51b815260040161074d90613ad1565b610ac56006838360006109af565b5050565b610ada610ad461212e565b82612267565b610af65760405162461bcd60e51b815260040161074d90613cd8565b61093a8383836122ec565b610b0a33610727565b610b156000336120c3565b1515600114610b365760405162461bcd60e51b815260040161074d90613d29565b610b3f81610727565b6001610b49611a3e565b11610b665760405162461bcd60e51b815260040161074d90613740565b610b716000826120c3565b610b8d5760405162461bcd60e51b815260040161074d90613b83565b6107566002826000806109af565b60606000610ba960036120ed565b905060008167ffffffffffffffff811115610bd457634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610bfd578160200160208202803683370190505b50905060005b82811015610c6057610c16600382612419565b828281518110610c3657634e487b7160e01b600052603260045260246000fd5b6001600160a01b039092166020928302919091019091015280610c5881613f12565b915050610c03565b5091505090565b610c7033610727565b610c7b6000336120c3565b1515600114610c9c5760405162461bcd60e51b815260040161074d90613d29565b610ca581610727565b610cb06000826120c3565b15610ccd5760405162461bcd60e51b815260040161074d906138f4565b6107566001600083816109af565b60095490565b61093a83838360405180602001604052806000815250611a4a565b600061079982612111565b60025460ff1690565b60065490565b6000818152600e60205260408120546001600160a01b0316806107995760405162461bcd60e51b815260040161074d90613a1a565b600860209081526000928352604080842090915290825290205460ff1681565b6000818152600b60205260409020600201546001600160a01b0316151580610dac57506000818152600b60205260409020600301546001600160a01b031615155b156107565760405162461bcd60e51b815260040161074d90613e04565b610dd233610727565b610ddd6003336120c3565b1515600114610dfe5760405162461bcd60e51b815260040161074d90613860565b600083815260136020908152604080832054601490925291829020549151600080516020613faf83398151915292610e43926001600160a01b03169186908690613585565b60405180910390a1600092835260136020908152604080852080546001600160a01b0319166001600160a01b03959095169490941790935560149052912055565b60006001600160a01b038216610eac5760405162461bcd60e51b815260040161074d906139d0565b506001600160a01b03166000908152600f602052604090205490565b60408051808201909152601081526f181899199a1a9b1b9c1cb0b131b232b360811b6020820152815160609190600090610f03906002613e75565b610f0e906002613e49565b67ffffffffffffffff811115610f3457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015610f5e576020820181803683370190505b509050600360fc1b81600081518110610f8757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110610fc457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060005b84518110156111575782600486838151811061100a57634e487b7160e01b600052603260045260246000fd5b016020015182516001600160f81b031990911690911c60f81c90811061104057634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b0319168261105b836002613e75565b611066906002613e49565b8151811061108457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350828582815181106110bc57634e487b7160e01b600052603260045260246000fd5b602091010151815160f89190911c600f169081106110ea57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191682611105836002613e75565b611110906003613e49565b8151811061112e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508061114f81613f12565b915050610fde565b509392505050565b61116833610727565b6111736003336120c3565b15156001146111945760405162461bcd60e51b815260040161074d90613860565b600082815260156020526040908190205490517f2dbfd0069a9236a97389d9573cc238a1ba0cb78a195d33231fc1cbc87e4ccd17916111d4918490613639565b60405180910390a160009182526015602052604090912055565b6111f733610727565b6112026000336120c3565b15156001146112235760405162461bcd60e51b815260040161074d90613d29565b6107566008600083816109af565b61123a33610727565b6112456000336120c3565b15156001146112665760405162461bcd60e51b815260040161074d90613d29565b61126e612425565b565b61127933610727565b6112846000336120c3565b15156001146112a55760405162461bcd60e51b815260040161074d90613d29565b6112ae82610727565b6112b781610727565b6112c26000836120c3565b6112de5760405162461bcd60e51b815260040161074d90613a63565b6112e96000826120c3565b156113065760405162461bcd60e51b815260040161074d906138f4565b610ac56003838360006109af565b600061132060036120ed565b905090565b600061133160006120ed565b61133d57506000610861565b611320600080612419565b61135133610727565b61135c6003336120c3565b151560011461137d5760405162461bcd60e51b815260040161074d90613860565b80831461139c5760405162461bcd60e51b815260040161074d90613b3d565b60005b838110156114b6577f2dbfd0069a9236a97389d9573cc238a1ba0cb78a195d33231fc1cbc87e4ccd17601560008787858181106113ec57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000205484848481811061142257634e487b7160e01b600052603260045260246000fd5b90506020020135604051611437929190613639565b60405180910390a182828281811061145f57634e487b7160e01b600052603260045260246000fd5b905060200201356015600087878581811061148a57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000208190555080806114ae90613f12565b91505061139f565b5050505050565b60055481565b6000908152601360209081526040808320546014909252909120546001600160a01b0390911691565b6060600d80546107e090613ed7565b6060600061150960006120ed565b905060008167ffffffffffffffff81111561153457634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561155d578160200160208202803683370190505b50905060005b82811015610c6057611576600082612419565b82828151811061159657634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152806115b881613f12565b915050611563565b6115c861212e565b6001600160a01b0316826001600160a01b031614156115f95760405162461bcd60e51b815260040161074d90613829565b806011600061160661212e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561164a61212e565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168291906135fc565b60405180910390a35050565b600b60205260009081526040902080546001820154600283015460039093015460ff9092169290916001600160a01b03918216911684565b6116cf33610727565b6116da6003336120c3565b15156001146116fb5760405162461bcd60e51b815260040161074d90613860565b888714801561170957508487145b801561171457508087145b801561171f57508483145b61173b5760405162461bcd60e51b815260040161074d9061392b565b60005b89811015611a31576117ba8b8b8381811061176957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061177e9190613047565b8a8a8481811061179e57634e487b7160e01b600052603260045260246000fd5b905060200201356040518060200160405280600081525061248f565b600080516020613faf833981519152601360008b8b858181106117ed57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316601460008c8c8681811061183a57634e487b7160e01b600052603260045260246000fd5b9050602002013581526020019081526020016000205489898581811061187057634e487b7160e01b600052603260045260246000fd5b90506020020160208101906118859190613047565b8888868181106118a557634e487b7160e01b600052603260045260246000fd5b905060200201356040516118bc9493929190613585565b60405180910390a18686828181106118e457634e487b7160e01b600052603260045260246000fd5b90506020020160208101906118f99190613047565b601360008b8b8581811061191d57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555084848281811061197657634e487b7160e01b600052603260045260246000fd5b90506020020135601460008b8b858181106119a157634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508282828181106119da57634e487b7160e01b600052603260045260246000fd5b90506020020135601560008b8b85818110611a0557634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508080611a2990613f12565b91505061173e565b5050505050505050505050565b600061132060006120ed565b611a5b611a5561212e565b83612267565b611a775760405162461bcd60e51b815260040161074d90613cd8565b611a83848484846124c2565b50505050565b611a9233610727565b611a9d6000336120c3565b1515600114611abe5760405162461bcd60e51b815260040161074d90613d29565b611ac96003826120c3565b611ae55760405162461bcd60e51b815260040161074d90613dcd565b6107566005826000806109af565b611afc33610727565b611b076000336120c3565b1515600114611b285760405162461bcd60e51b815260040161074d90613d29565b61126e600a60018060006109af565b60009081526015602052604090205490565b60008080611b56816120ed565b905060005b81811015611bc65760086000611b72600084612419565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205460ff16151560011415611bb45782611bb081613f12565b9350505b80611bbe81613f12565b915050611b5b565b5050600654111592915050565b60075490565b6060611be482612111565b611c005760405162461bcd60e51b815260040161074d90613c48565b6000611c0a611eee565b90506000815111611c2a5760405180602001604052806000815250611c55565b80611c34846124f5565b604051602001611c459291906134d2565b6040516020818303038152906040525b9392505050565b60095481565b611c6b33610727565b611c766003336120c3565b1515600114611c975760405162461bcd60e51b815260040161074d90613860565b8285148015611ca557508281145b611cc15760405162461bcd60e51b815260040161074d90613b3d565b60005b85811015611edf57600080516020613faf83398151915260136000898985818110611cff57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060009054906101000a90046001600160a01b0316601460008a8a86818110611d4c57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002054878785818110611d8257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611d979190613047565b868686818110611db757634e487b7160e01b600052603260045260246000fd5b90506020020135604051611dce9493929190613585565b60405180910390a1848482818110611df657634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611e0b9190613047565b60136000898985818110611e2f57634e487b7160e01b600052603260045260246000fd5b90506020020135815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550828282818110611e8857634e487b7160e01b600052603260045260246000fd5b9050602002013560146000898985818110611eb357634e487b7160e01b600052603260045260246000fd5b905060200201358152602001908152602001600020819055508080611ed790613f12565b915050611cc4565b50505050505050565b60065481565b6060601280546107e090613ed7565b6001600160a01b0380831660009081526011602090815260408083209385168352929052205460ff165b92915050565b6000611f3833610727565b611f436000336120c3565b1515600114611f645760405162461bcd60e51b815260040161074d90613d29565b3360009081526008602090815260408083208584529091529020805460ff19166001179055611f92826107bc565b15611f9f5750600161079c565b611fa882611b49565b15611fbe57611fb682612610565b50600161079c565b506000919050565b60075481565b611fd533610727565b611fe06003336120c3565b15156001146120015760405162461bcd60e51b815260040161074d90613860565b61201b85856040518060200160405280600081525061248f565b600084815260136020908152604080832054601490925291829020549151600080516020613faf83398151915292612060926001600160a01b03169187908790613585565b60405180910390a1600093845260136020908152604080862080546001600160a01b0319166001600160a01b0396909616959095179094556014815283852092909255601590915291205550565b6000611c55836001600160a01b038416612889565b6000611c55836001600160a01b0384166128d3565b6000611c55836001600160a01b0384166128eb565b600061079982612a02565b6001600160e01b031981166301ffc9a760e01b14919050565b6000908152600e60205260409020546001600160a01b0316151590565b3390565b600081815260106020526040902080546001600160a01b0319166001600160a01b038416908117909155819061216782610d16565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6009805490819060006121b283613f12565b91905055506121c081610d6b565b6000818152600b60209081526040909120600181018790556002810180546001600160a01b038089166001600160a01b03199283161790925560038301805492881692909116919091179055835161222092600490920191850190612f1d565b503360008181526008602090815260408083208584528252808320805460ff19166001908117909155938352600a9091529020829055600654116114b6576114b681612610565b600061227282612111565b61228e5760405162461bcd60e51b815260040161074d906138a8565b600061229983610d16565b9050806001600160a01b0316846001600160a01b031614806122d45750836001600160a01b03166122c984610864565b6001600160a01b0316145b806122e457506122e48185611efd565b949350505050565b826001600160a01b03166122ff82610d16565b6001600160a01b0316146123255760405162461bcd60e51b815260040161074d90613bff565b6001600160a01b03821661234b5760405162461bcd60e51b815260040161074d906137e5565b61235683838361093a565b612361600082612132565b6001600160a01b0383166000908152600f6020526040812080546001929061238a908490613e94565b90915550506001600160a01b0382166000908152600f602052604081208054600192906123b8908490613e49565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6000611c558383612a06565b60025460ff16156124485760405162461bcd60e51b815260040161074d90613d6d565b6002805460ff191660011790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890612485903390613501565b60405180910390a1565b6124998383612a5f565b6124a66000848484612b3e565b61093a5760405162461bcd60e51b815260040161074d906136ee565b6124cd8484846122ec565b6124d984848484612b3e565b611a835760405162461bcd60e51b815260040161074d906136ee565b60608161251a57506040805180820190915260018152600360fc1b602082015261079c565b8160005b8115612544578061252e81613f12565b915061253d9050600a83613e61565b915061251e565b60008167ffffffffffffffff81111561256d57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612597576020820181803683370190505b5090505b84156122e4576125ac600183613e94565b91506125b9600a86613f2d565b6125c4906030613e49565b60f81b8183815181106125e757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612609600a86613e61565b945061259b565b6000818152600b602052604090206001908101541415612653576000818152600b602052604090206003015461264e906001600160a01b0316612c59565b61286d565b6000818152600b602052604090206001015460021415612691576000818152600b602052604090206002015461264e906001600160a01b0316612c9f565b6000818152600b6020526040902060010154600314156126da576000818152600b60205260409020600281015460039091015461264e916001600160a01b039081169116612d01565b6000818152600b602052604090206001015460041415612718576000818152600b602052604090206003015461264e906001600160a01b0316612d56565b6000818152600b602052604090206001015460051415612756576000818152600b602052604090206002015461264e906001600160a01b0316612d91565b6000818152600b60205260409020600101546006141561279f576000818152600b60205260409020600281015460039091015461264e916001600160a01b039081169116612dcc565b6000818152600b6020526040902060010154600814156127dd576000818152600b602052604090206003015461264e906001600160a01b0316612e1c565b6000818152600b60205260409020600101546007141561281b576000818152600b602052604090206003015461264e906001600160a01b0316612e58565b6000818152600b60205260409020600101546009141561283d5761264e612425565b6000818152600b6020526040902060010154600a141561285f5761264e612ebb565b61286881610756565b610756565b6000818152600b60205260409020805460ff1916600117905550565b600061289583836128d3565b6128cb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155611f27565b506000611f27565b60009081526001919091016020526040902054151590565b600081815260018301602052604081205480156129f857600061290f600183613e94565b855490915060009061292390600190613e94565b9050600086600001828154811061294a57634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508087600001848154811061297b57634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600189019091526040902084905586548790806129bc57634e487b7160e01b600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050611f27565b6000915050611f27565b5490565b81546000908210612a295760405162461bcd60e51b815260040161074d9061365a565b826000018281548110612a4c57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6001600160a01b038216612a855760405162461bcd60e51b815260040161074d90613b08565b612a8e81612111565b15612aab5760405162461bcd60e51b815260040161074d90613777565b612ab76000838361093a565b6001600160a01b0382166000908152600f60205260408120805460019290612ae0908490613e49565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612b52846001600160a01b0316612f17565b15612c4e57836001600160a01b031663150b7a02612b6e61212e565b8786866040518563ffffffff1660e01b8152600401612b90949392919061352f565b602060405180830381600087803b158015612baa57600080fd5b505af1925050508015612bda575060408051601f3d908101601f19168201909252612bd7918101906133f8565b60015b612c34573d808015612c08576040519150601f19603f3d011682016040523d82523d6000602084013e612c0d565b606091505b508051612c2c5760405162461bcd60e51b815260040161074d906136ee565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506122e4565b506001949350505050565b612c646000826120ae565b507ff39e6e1eb0edcf53c221607b54b00cd28f3196fed0a24994dc308b8f611b682d81604051612c949190613501565b60405180910390a150565b612caa6000826120d8565b507f8001553a916ef2f495d26a907cc54d96ed840d7bda71e73194bf5a9df7a76b9081604051612cda9190613501565b60405180910390a16000612cec611a3e565b9050806006541115610ac557610ac581612e58565b612d0c6000836120d8565b50612d186000826120ae565b507f1b82188083c6040dda91df3d142280a20fa00e5a433eb921fdbf2e4ad1db45e58282604051612d4a929190613515565b60405180910390a15050565b612d616003826120ae565b507fe96a56aa17dd8ae64ac3a51347e8e8a03d52f1cb2acdf8ed49b20d55662ebecc81604051612c949190613501565b612d9c6003826120d8565b507f108286147377add4f5f7bcdd7b6104dc6bdac3443e499142a612d418aa0be15481604051612c949190613501565b7f409833df5b08419a3bd86d34683f91767845e813a29d30d8a4338fba95158d8a8282604051612dfd929190613515565b60405180910390a1612e106003836120d8565b5061093a6003826120ae565b7f5ba74490711ccc5e81b24b40b8c5d2bd282981e4bc080dd8789bb10c1dfc2ea981604051612e4b9190613630565b60405180910390a1600755565b612e60611a3e565b811115612e7f5760405162461bcd60e51b815260040161074d9061369c565b7fcfbc3e24bcdbf875f7af2b101605919fdbd3cb0b217ae54c372ae49417c58d0181604051612eae9190613630565b60405180910390a1600655565b60025460ff16612edd5760405162461bcd60e51b815260040161074d90613a9a565b6002805460ff191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90612485903390613501565b3b151590565b828054828255906000526020600020908101928215612f58579160200282015b82811115612f58578251825591602001919060010190612f3d565b50612f64929150612f68565b5090565b5b80821115612f645760008155600101612f69565b60008083601f840112612f8e578081fd5b50813567ffffffffffffffff811115612fa5578182fd5b6020830191508360208083028501011115612fbf57600080fd5b9250929050565b600082601f830112612fd6578081fd5b813567ffffffffffffffff80821115612ff157612ff1613f6d565b604051601f8301601f19168101602001828111828210171561301557613015613f6d565b60405282815284830160200186101561302c578384fd5b82602086016020830137918201602001929092529392505050565b600060208284031215613058578081fd5b8135611c5581613f83565b60008060408385031215613075578081fd5b823561308081613f83565b9150602083013561309081613f83565b809150509250929050565b6000806000606084860312156130af578081fd5b83356130ba81613f83565b925060208401356130ca81613f83565b929592945050506040919091013590565b600080600080608085870312156130f0578081fd5b84356130fb81613f83565b9350602085013561310b81613f83565b925060408501359150606085013567ffffffffffffffff81111561312d578182fd5b61313987828801612fc6565b91505092959194509250565b60008060408385031215613157578182fd5b823561316281613f83565b915060208301358015158114613090578182fd5b60008060408385031215613188578182fd5b823561319381613f83565b946020939093013593505050565b600080600080600060a086880312156131b8578081fd5b85356131c381613f83565b94506020860135935060408601356131da81613f83565b94979396509394606081013594506080013592915050565b60008060008060008060008060008060a08b8d031215613210578485fd5b8a3567ffffffffffffffff80821115613227578687fd5b6132338e838f01612f7d565b909c509a5060208d013591508082111561324b578687fd5b6132578e838f01612f7d565b909a50985060408d013591508082111561326f578687fd5b61327b8e838f01612f7d565b909850965060608d0135915080821115613293578586fd5b61329f8e838f01612f7d565b909650945060808d01359150808211156132b7578384fd5b506132c48d828e01612f7d565b915080935050809150509295989b9194979a5092959850565b600080600080600080606087890312156132f5578182fd5b863567ffffffffffffffff8082111561330c578384fd5b6133188a838b01612f7d565b90985096506020890135915080821115613330578384fd5b61333c8a838b01612f7d565b90965094506040890135915080821115613354578384fd5b5061336189828a01612f7d565b979a9699509497509295939492505050565b60008060008060408587031215613388578182fd5b843567ffffffffffffffff8082111561339f578384fd5b6133ab88838901612f7d565b909650945060208701359150808211156133c3578384fd5b506133d087828801612f7d565b95989497509550505050565b6000602082840312156133ed578081fd5b8135611c5581613f98565b600060208284031215613409578081fd5b8151611c5581613f98565b600060208284031215613425578081fd5b813567ffffffffffffffff81111561343b578182fd5b6122e484828501612fc6565b600060208284031215613458578081fd5b5035919050565b600080600060608486031215613473578081fd5b8335925060208401356130ca81613f83565b60008060408385031215613497578182fd5b50508035926020909101359150565b600081518084526134be816020860160208601613eab565b601f01601f19169290920160200192915050565b600083516134e4818460208801613eab565b8351908301906134f8818360208801613eab565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613562908301846134a6565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039485168152602081019390935292166040820152606081019190915260800190565b6020808252825182820181905260009190848201906040850190845b818110156135f05783516001600160a01b0316835292840192918401916001016135cb565b50909695505050505050565b901515815260200190565b931515845260208401929092526001600160a01b03908116604084015216606082015260800190565b90815260200190565b918252602082015260400190565b600060208252611c5560208301846134a6565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f556e61626c6520746f20736574207468726573686f6c642061626f766520746860408201527165206e756d626572206f66206f776e65727360701b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526018908201527f4d75737420616c77617973206265206f6e65206f776e65720000000000000000604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601f908201527f6f6c644f70657261746f72206973206e6f7420616e204f70657261746f722e00604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526028908201527f4f6e6c7920746865206f70657261746f722063616e2072756e207468697320666040820152673ab731ba34b7b71760c11b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526018908201527f6e65774f776e657220616c7265616479206578697374732e0000000000000000604082015260600190565b60208082526028908201527f546f20616e6420546f6b656e4944206d7573742068617665207468652073616d6040820152670ca40d8cadccee8d60c31b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b60208082526019908201527f6f6c644f776e6572206973206e6f7420616e206f776e65722e00000000000000604082015260600190565b6020808252601c908201527f536d61727420436f6e7472616374206973206e6f742070617573656400000000604082015260600190565b6020808252601b908201527f6e65774f70657261746f7220616c7265616479206578697374732e0000000000604082015260600190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526026908201527f496e70757420617272617973206d7573742068617665207468652073616d65206040820152650d8cadccee8d60d31b606082015260800190565b60208082526016908201527537bbb732b91034b9903737ba1030b71037bbb732b91760511b604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526024908201527f4f6e6c7920616e206f776e65722063616e2072756e20746869732066756e637460408201526334b7b71760e11b606082015260800190565b60208082526018908201527f536d61727420436f6e7472616374206973207061757365640000000000000000604082015260600190565b6020808252600f908201526e496e7661696c64204164647265737360881b604082015260600190565b6020808252601c908201527f6f70657261746f72206973206e6f7420616e204f70657261746f722e00000000604082015260600190565b6020808252601d908201527f5265736f6c7574696f6e20697320616c726561647920696e207573652e000000604082015260600190565b60ff91909116815260200190565b60008219821115613e5c57613e5c613f41565b500190565b600082613e7057613e70613f57565b500490565b6000816000190483118215151615613e8f57613e8f613f41565b500290565b600082821015613ea657613ea6613f41565b500390565b60005b83811015613ec6578181015183820152602001613eae565b83811115611a835750506000910152565b600281046001821680613eeb57607f821691505b60208210811415613f0c57634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415613f2657613f26613f41565b5060010190565b600082613f3c57613f3c613f57565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461075657600080fd5b6001600160e01b03198116811461075657600080fdfe94e823969ed6ed7ab64ec5ba9dbcdf3117af9e0563e0f43a62e9e6a74a3f43a1a2646970667358221220e67864a3eb7e12b01e8b04935666c8a95c0096afff886b2afb99b2f0cabd447e64736f6c63430008000033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000002e2090300faf6de6495e3070df102bbc1e4ce7fa000000000000000000000000000000000000000000000000000000000000001355524545514120436f6c6c65637469626c6573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006555251412d430000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): UREEQA Collectibles
Arg [1] : symbol (string): URQA-C
Arg [2] : operator (address): 0x2e2090300FAF6DE6495E3070DF102BBC1e4cE7Fa

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000002e2090300faf6de6495e3070df102bbc1e4ce7fa
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000013
Arg [4] : 55524545514120436f6c6c65637469626c657300000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [6] : 555251412d430000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

63654:8644:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45967:121;;;;;;:::i;:::-;;:::i;:::-;;20548:292;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50583:181;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51363:123::-;;;;;;:::i;:::-;;:::i;21480:100::-;;;:::i;:::-;;;;;;;:::i;22947:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;22477:404::-;;;;;;:::i;:::-;;:::i;54568:375::-;;;;;;:::i;:::-;;:::i;56622:275::-;;;;;;:::i;:::-;;:::i;55508:583::-;;;;;;:::i;:::-;;:::i;23837:305::-;;;;;;:::i;:::-;;:::i;53411:402::-;;;;;;:::i;:::-;;:::i;49261:310::-;;;:::i;:::-;;;;;;;:::i;52883:328::-;;;;;;:::i;:::-;;:::i;50363:105::-;;;:::i;24213:151::-;;;;;;:::i;:::-;;:::i;65618:102::-;;;;;;:::i;:::-;;:::i;50847:78::-;;;:::i;49911:107::-;;;:::i;21174:239::-;;;;;;:::i;:::-;;:::i;44702:62::-;;;;;;:::i;:::-;;:::i;51011:344::-;;;;;;:::i;:::-;;:::i;69095:441::-;;;;;;:::i;:::-;;:::i;20904:208::-;;;;;;:::i;:::-;;:::i;71818:477::-;;;;;;:::i;:::-;;:::i;70622:237::-;;;;;;:::i;:::-;;:::i;56209:287::-;;;;;;:::i;:::-;;:::i;56973:64::-;;;:::i;53924:537::-;;;;;;:::i;:::-;;:::i;49664:125::-;;;:::i;:::-;;;;;;;:::i;48410:176::-;;;:::i;71001:485::-;;;;;;:::i;:::-;;:::i;44365:32::-;;;:::i;65820:196::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;21649:104::-;;;:::i;48674:301::-;;;:::i;23240:295::-;;;;;;:::i;:::-;;:::i;44947:49::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;67861:1098::-;;;;;;:::i;:::-;;:::i;49062:111::-;;;:::i;24435:285::-;;;;;;:::i;:::-;;:::i;55053:332::-;;;;;;:::i;:::-;;:::i;57147:148::-;;;:::i;66116:160::-;;;;;;:::i;:::-;;:::i;51494:400::-;;;;;;:::i;:::-;;:::i;50145:103::-;;;:::i;21824:360::-;;;;;;:::i;:::-;;:::i;44816:33::-;;;:::i;69678:808::-;;;;;;:::i;:::-;;:::i;44466:42::-;;;:::i;65465:93::-;;;:::i;23606:164::-;;;;;;:::i;:::-;;:::i;52246:533::-;;;;;;:::i;:::-;;:::i;44602:35::-;;;:::i;66935:582::-;;;;;;:::i;:::-;;:::i;45967:121::-;-1:-1:-1;;;;;46039:21:0;;46031:49;;;;-1:-1:-1;;;46031:49:0;;;;;;;:::i;:::-;;;;;;;;;45967:121;:::o;20548:292::-;20650:4;-1:-1:-1;;;;;;20674:40:0;;-1:-1:-1;;;20674:40:0;;:105;;-1:-1:-1;;;;;;;20731:48:0;;-1:-1:-1;;;20731:48:0;20674:105;:158;;;;20796:36;20820:11;20796:23;:36::i;:::-;20667:165;;20548:292;;;;:::o;50583:181::-;-1:-1:-1;;;;;50720:36:0;50688:7;50720:36;;;:25;:36;;;;;;;50583:181::o;51363:123::-;51428:4;51452:19;;;:11;:19;;;;;:26;;;;51363:123::o;21480:100::-;21534:13;21567:5;21560:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21480:100;;:::o;22947:221::-;23023:7;23051:16;23059:7;23051;:16::i;:::-;23043:73;;;;-1:-1:-1;;;23043:73:0;;;;;;;:::i;:::-;-1:-1:-1;23136:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23136:24:0;;22947:221::o;22477:404::-;22558:13;22574:23;22589:7;22574:14;:23::i;:::-;22558:39;;22622:5;-1:-1:-1;;;;;22616:11:0;:2;-1:-1:-1;;;;;22616:11:0;;;22608:57;;;;-1:-1:-1;;;22608:57:0;;;;;;;:::i;:::-;22702:5;-1:-1:-1;;;;;22686:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;22686:21:0;;:69;;;;22711:44;22735:5;22742:12;:10;:12::i;22711:44::-;22678:161;;;;-1:-1:-1;;;22678:161:0;;;;;;;:::i;:::-;22852:21;22861:2;22865:7;22852:8;:21::i;:::-;22477:404;;;:::o;54568:375::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;54680:27:::1;54695:11;54680:14;:27::i;:::-;54741:47;54764:10;54776:11;54741:22;:47::i;:::-;54740:48;54718:125;;;;-1:-1:-1::0;;;54718:125:0::1;;;;;;;:::i;:::-;54856:79;42783:1;54901;54905:11:::0;54901:1;54918:16:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;54918:16:0::1;;54856;:79::i;56622:275::-:0;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;56736:153:::1;42947:1;56812;56837:9:::0;56812:1;56862:16:::1;::::0;55508:583;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;55647:27:::1;55662:11;55647:14;:27::i;:::-;55685;55700:11;55685:14;:27::i;:::-;55745:47;55768:10;55780:11;55745:22;:47::i;:::-;55723:128;;;;-1:-1:-1::0;;;55723:128:0::1;;;;;;;:::i;:::-;55885:47;55908:10;55920:11;55885:22;:47::i;:::-;55884:48;55862:125;;;;-1:-1:-1::0;;;55862:125:0::1;;;;;;;:::i;:::-;56000:83;42892:1;56041:11:::0;56054;56080:1:::1;56066:16;::::0;56000:83:::1;55508:583:::0;;:::o;23837:305::-;23998:41;24017:12;:10;:12::i;:::-;24031:7;23998:18;:41::i;:::-;23990:103;;;;-1:-1:-1;;;23990:103:0;;;;;;;:::i;:::-;24106:28;24116:4;24122:2;24126:7;24106:9;:28::i;53411:402::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;53497:24:::1;53512:8;53497:14;:24::i;:::-;53562:1;53540:19;:17;:19::i;:::-;:23;53532:60;;;;-1:-1:-1::0;;;53532:60:0::1;;;;;;;:::i;:::-;53625:41;53648:7;53657:8;53625:22;:41::i;:::-;53603:113;;;;-1:-1:-1::0;;;53603:113:0::1;;;;;;;:::i;:::-;53729:76;42680:1;53766:8:::0;53784:1:::1;::::0;53788:16:::1;::::0;49261:310;49306:16;49335:11;49349:32;49370:10;49349:20;:32::i;:::-;49335:46;;49392:18;49427:3;49413:18;;;;;;-1:-1:-1;;;49413:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49413:18:0;;49392:39;;49449:9;49444:99;49468:3;49464:1;:7;49444:99;;;49500:31;49517:10;49529:1;49500:16;:31::i;:::-;49493:1;49495;49493:4;;;;;;-1:-1:-1;;;49493:4:0;;;;;;;;;-1:-1:-1;;;;;49493:38:0;;;:4;;;;;;;;;;;:38;49473:3;;;;:::i;:::-;;;;49444:99;;;-1:-1:-1;49562:1:0;-1:-1:-1;;49261:310:0;:::o;52883:328::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;52966:24:::1;52981:8;52966:14;:24::i;:::-;53024:41;53047:7;53056:8;53024:22;:41::i;:::-;53023:42;53001:116;;;;-1:-1:-1::0;;;53001:116:0::1;;;;;;;:::i;:::-;53130:73;42629:1;53172;53176:8:::0;53172:1;53186:16:::1;::::0;50363:105;50446:14;;50363:105;:::o;24213:151::-;24317:39;24334:4;24340:2;24344:7;24317:39;;;;;;;;;;;;:16;:39::i;65618:102::-;65672:4;65696:16;65704:7;65696;:16::i;50847:78::-;50910:7;;;;50847:78;:::o;49911:107::-;49987:23;;49911:107;:::o;21174:239::-;21246:7;21282:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21282:16:0;21317:19;21309:73;;;;-1:-1:-1;;;21309:73:0;;;;;;;:::i;44702:62::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51011:344::-;51222:1;51180:19;;;:11;:19;;;;;:30;;;-1:-1:-1;;;;;51180:30:0;:44;;;:109;;-1:-1:-1;51287:1:0;51245:19;;;:11;:19;;;;;:30;;;-1:-1:-1;;;;;51245:30:0;:44;;51180:109;51178:112;51081:266;;;;-1:-1:-1;;;51081:266:0;;;;;;;:::i;69095:441::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;69284:29:::1;::::0;;;:20:::1;:29;::::0;;;;;;;;69328:15:::1;:24:::0;;;;;;;;69260:160;;-1:-1:-1;;;;;;;;;;;69260:160:0;::::1;::::0;-1:-1:-1;;;;;69284:29:0::1;::::0;69367:16;;69398:11;;69260:160:::1;:::i;:::-;;;;;;;;69431:29;::::0;;;:20:::1;:29;::::0;;;;;;;:48;;-1:-1:-1;;;;;;69431:48:0::1;-1:-1:-1::0;;;;;69431:48:0;;;::::1;::::0;;;::::1;::::0;;;69490:15:::1;:24:::0;;;;:38;69095:441::o;20904:208::-;20976:7;-1:-1:-1;;;;;21004:19:0;;20996:74;;;;-1:-1:-1;;;20996:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;21088:16:0;;;;;:9;:16;;;;;;;20904:208::o;71818:477::-;71902:42;;;;;;;;;;;;-1:-1:-1;;;71902:42:0;;;;71990:11;;71876:13;;71902:42;:21;;71990:15;;72004:1;71990:15;:::i;:::-;71986:19;;:1;:19;:::i;:::-;71976:30;;;;;;-1:-1:-1;;;71976:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71976:30:0;;71957:49;;-1:-1:-1;;;72017:3:0;72021:1;72017:6;;;;;;-1:-1:-1;;;72017:6:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;72017:12:0;;;;;;;;;-1:-1:-1;;;72040:3:0;72044:1;72040:6;;;;;;-1:-1:-1;;;72040:6:0;;;;;;;;;;;;:12;-1:-1:-1;;;;;72040:12:0;;;;;;;;;72068:9;72063:196;72087:4;:11;72083:1;:15;72063:196;;;72137:8;72171:1;72160:4;72165:1;72160:7;;;;;;-1:-1:-1;;;72160:7:0;;;;;;;;;;;;;72137:38;;-1:-1:-1;;;;;;72160:7:0;;;:12;;;:7;72154:19;;72137:38;;;;-1:-1:-1;;;72137:38:0;;;;;;;;;;;;;-1:-1:-1;;;;;;72137:38:0;72120:3;72128:5;:1;72132;72128:5;:::i;:::-;72124:9;;:1;:9;:::i;:::-;72120:14;;;;;;-1:-1:-1;;;72120:14:0;;;;;;;;;;;;:55;-1:-1:-1;;;;;72120:55:0;;;;;;;;;72207:8;72230:4;72235:1;72230:7;;;;;;-1:-1:-1;;;72230:7:0;;;;;;;;;;;;;;72207:40;;72230:7;;;;;72240:4;72224:21;;72207:40;;;;-1:-1:-1;;;72207:40:0;;;;;;;;;;;;;-1:-1:-1;;;;;;72207:40:0;72190:3;72198:5;:1;72202;72198:5;:::i;:::-;72194:9;;:1;:9;:::i;:::-;72190:14;;;;;;-1:-1:-1;;;72190:14:0;;;;;;;;;;;;:57;-1:-1:-1;;;;;72190:57:0;;;;;;;;-1:-1:-1;72100:3:0;;;;:::i;:::-;;;;72063:196;;;-1:-1:-1;72283:3:0;71818:477;-1:-1:-1;;;71818:477:0:o;70622:237::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;70766:26:::1;::::0;;;:17:::1;:26;::::0;;;;;;;70751:52;;::::1;::::0;::::1;::::0;70794:8;;70751:52:::1;:::i;:::-;;;;;;;;70814:26;::::0;;;:17:::1;:26;::::0;;;;;:37;70622:237::o;56209:287::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;56329:159:::1;43009:1;56412;56437:8:::0;56412:1;56461:16:::1;::::0;56973:64;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;57021:8:::1;:6;:8::i;:::-;56973:64::o:0;53924:537::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;54052:24:::1;54067:8;54052:14;:24::i;:::-;54087;54102:8;54087:14;:24::i;:::-;54144:41;54167:7;54176:8;54144:22;:41::i;:::-;54122:116;;;;-1:-1:-1::0;;;54122:116:0::1;;;;;;;:::i;:::-;54272:41;54295:7;54304:8;54272:22;:41::i;:::-;54271:42;54249:116;;;;-1:-1:-1::0;;;54249:116:0::1;;;;;;;:::i;:::-;54378:75;42732:1;54416:8:::0;54426;54450:1:::1;54436:16;::::0;49664:125;49717:5;49748:32;49769:10;49748:20;:32::i;:::-;49735:46;;49664:125;:::o;48410:176::-;48456:7;48479:29;48500:7;48479:20;:29::i;:::-;48476:56;;-1:-1:-1;48530:1:0;48515:17;;48476:56;48550:28;48567:7;48576:1;48550:16;:28::i;71001:485::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;71176:33;;::::1;71154:121;;;;-1:-1:-1::0;;;71154:121:0::1;;;;;;;:::i;:::-;71291:9;71286:193;71306:18:::0;;::::1;71286:193;;;71351:58;71366:17;:29;71384:7;;71392:1;71384:10;;;;;-1:-1:-1::0;;;71384:10:0::1;;;;;;;;;;;;;;;71366:29;;;;;;;;;;;;71397:8;;71406:1;71397:11;;;;;-1:-1:-1::0;;;71397:11:0::1;;;;;;;;;;;;;;;71351:58;;;;;;;:::i;:::-;;;;;;;;71456:8;;71465:1;71456:11;;;;;-1:-1:-1::0;;;71456:11:0::1;;;;;;;;;;;;;;;71424:17;:29;71442:7;;71450:1;71442:10;;;;;-1:-1:-1::0;;;71442:10:0::1;;;;;;;;;;;;;;;71424:29;;;;;;;;;;;:43;;;;71326:3;;;;;:::i;:::-;;;;71286:193;;;;71001:485:::0;;;;:::o;44365:32::-;;;;:::o;65820:196::-;65910:7;65952:29;;;:20;:29;;;;;;;;;65983:15;:24;;;;;;;-1:-1:-1;;;;;65952:29:0;;;;65820:196::o;21649:104::-;21705:13;21738:7;21731:14;;;;;:::i;48674:301::-;48716:16;48745:11;48759:29;48780:7;48759:20;:29::i;:::-;48745:43;;48799:18;48834:3;48820:18;;;;;;-1:-1:-1;;;48820:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48820:18:0;;48799:39;;48856:9;48851:96;48875:3;48871:1;:7;48851:96;;;48907:28;48924:7;48933:1;48907:16;:28::i;:::-;48900:1;48902;48900:4;;;;;;-1:-1:-1;;;48900:4:0;;;;;;;;;-1:-1:-1;;;;;48900:35:0;;;:4;;;;;;;;;;;:35;48880:3;;;;:::i;:::-;;;;48851:96;;23240:295;23355:12;:10;:12::i;:::-;-1:-1:-1;;;;;23343:24:0;:8;-1:-1:-1;;;;;23343:24:0;;;23335:62;;;;-1:-1:-1;;;23335:62:0;;;;;;;:::i;:::-;23455:8;23410:18;:32;23429:12;:10;:12::i;:::-;-1:-1:-1;;;;;23410:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;23410:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;23410:53:0;;;;;;;;;;;23494:12;:10;:12::i;:::-;-1:-1:-1;;;;;23479:48:0;;23518:8;23479:48;;;;;;:::i;:::-;;;;;;;;23240:295;;:::o;44947:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44947:49:0;;;;;;:::o;67861:1098::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;68149:27;;::::1;:89:::0;::::1;;;-1:-1:-1::0;68197:41:0;;::::1;68149:89;:151;;;;-1:-1:-1::0;68259:41:0;;::::1;68149:151;:217;;;;-1:-1:-1::0;68321:45:0;;::::1;68149:217;68127:307;;;;-1:-1:-1::0;;;68127:307:0::1;;;;;;;:::i;:::-;68450:9;68445:507;68465:13:::0;;::::1;68445:507;;;68500:32;68510:2;;68513:1;68510:5;;;;;-1:-1:-1::0;;;68510:5:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68517:7;;68525:1;68517:10;;;;;-1:-1:-1::0;;;68517:10:0::1;;;;;;;;;;;;;;;68500:32;;;;;;;;;;;::::0;:9:::1;:32::i;:::-;-1:-1:-1::0;;;;;;;;;;;68582:20:0::1;:32;68603:7;;68611:1;68603:10;;;;;-1:-1:-1::0;;;68603:10:0::1;;;;;;;;;;;;;;;68582:32;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;68582:32:0::1;68633:15;:27;68649:7;;68657:1;68649:10;;;;;-1:-1:-1::0;;;68649:10:0::1;;;;;;;;;;;;;;;68633:27;;;;;;;;;;;;68679:16;;68696:1;68679:19;;;;;-1:-1:-1::0;;;68679:19:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68717:11;;68729:1;68717:14;;;;;-1:-1:-1::0;;;68717:14:0::1;;;;;;;;;;;;;;;68554:192;;;;;;;;;:::i;:::-;;;;;;;;68796:16;;68813:1;68796:19;;;;;-1:-1:-1::0;;;68796:19:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68761:20;:32;68782:7;;68790:1;68782:10;;;;;-1:-1:-1::0;;;68782:10:0::1;;;;;;;;;;;;;;;68761:32;;;;;;;;;;;;:54;;;;;-1:-1:-1::0;;;;;68761:54:0::1;;;;;-1:-1:-1::0;;;;;68761:54:0::1;;;;;;68860:11;;68872:1;68860:14;;;;;-1:-1:-1::0;;;68860:14:0::1;;;;;;;;;;;;;;;68830:15;:27;68846:7;;68854:1;68846:10;;;;;-1:-1:-1::0;;;68846:10:0::1;;;;;;;;;;;;;;;68830:27;;;;;;;;;;;:44;;;;68921:16;;68938:1;68921:19;;;;;-1:-1:-1::0;;;68921:19:0::1;;;;;;;;;;;;;;;68889:17;:29;68907:7;;68915:1;68907:10;;;;;-1:-1:-1::0;;;68907:10:0::1;;;;;;;;;;;;;;;68889:29;;;;;;;;;;;:51;;;;68480:3;;;;;:::i;:::-;;;;68445:507;;;;67861:1098:::0;;;;;;;;;;:::o;49062:111::-;49112:4;49136:29;49157:7;49136:20;:29::i;24435:285::-;24567:41;24586:12;:10;:12::i;:::-;24600:7;24567:18;:41::i;:::-;24559:103;;;;-1:-1:-1;;;24559:103:0;;;;;;;:::i;:::-;24673:39;24687:4;24693:2;24697:7;24706:5;24673:13;:39::i;:::-;24435:285;;;;:::o;55053:332::-;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;55187:44:::1;55210:10;55222:8;55187:22;:44::i;:::-;55165:122;;;;-1:-1:-1::0;;;55165:122:0::1;;;;;;;:::i;:::-;55298:79;42837:1;55338:8:::0;55356:1:::1;::::0;55360:16:::1;::::0;57147:148;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;57213:74:::1;43101:2;57254:1;::::0;57284::::1;57270:16;::::0;66116:160;66210:7;66242:26;;;:17;:26;;;;;;;66116:160::o;51494:400::-;51558:4;;;51621:29;51558:4;51621:20;:29::i;:::-;51607:43;;51668:9;51663:168;51687:3;51683:1;:7;51663:168;;;51716:10;:40;51727:28;51744:7;51753:1;51727:16;:28::i;:::-;-1:-1:-1;;;;;51716:40:0;;;;;;;;;;;;;;;-1:-1:-1;51716:40:0;;;:48;;;;;;;;;;;:56;;:48;:56;51712:108;;;51793:11;;;;:::i;:::-;;;;51712:108;51692:3;;;;:::i;:::-;;;;51663:168;;;-1:-1:-1;;51863:23:0;;-1:-1:-1;51850:36:0;;51494:400;-1:-1:-1;;51494:400:0:o;50145:103::-;50224:16;;50145:103;:::o;21824:360::-;21897:13;21931:16;21939:7;21931;:16::i;:::-;21923:76;;;;-1:-1:-1;;;21923:76:0;;;;;;;:::i;:::-;22012:21;22036:10;:8;:10::i;:::-;22012:34;;22088:1;22070:7;22064:21;:25;:112;;;;;;;;;;;;;;;;;22129:7;22138:18;:7;:16;:18::i;:::-;22112:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22064:112;22057:119;21824:360;-1:-1:-1;;;21824:360:0:o;44816:33::-;;;;:::o;69678:808::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;69898:41;;::::1;:107:::0;::::1;;;-1:-1:-1::0;69960:45:0;;::::1;69898:107;69876:195;;;;-1:-1:-1::0;;;69876:195:0::1;;;;;;;:::i;:::-;70087:9;70082:397;70102:18:::0;;::::1;70082:397;;;-1:-1:-1::0;;;;;;;;;;;70175:20:0::1;:32;70196:7;;70204:1;70196:10;;;;;-1:-1:-1::0;;;70196:10:0::1;;;;;;;;;;;;;;;70175:32;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;70175:32:0::1;70226:15;:27;70242:7;;70250:1;70242:10;;;;;-1:-1:-1::0;;;70242:10:0::1;;;;;;;;;;;;;;;70226:27;;;;;;;;;;;;70272:16;;70289:1;70272:19;;;;;-1:-1:-1::0;;;70272:19:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70310:11;;70322:1;70310:14;;;;;-1:-1:-1::0;;;70310:14:0::1;;;;;;;;;;;;;;;70147:192;;;;;;;;;:::i;:::-;;;;;;;;70389:16;;70406:1;70389:19;;;;;-1:-1:-1::0;;;70389:19:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;70354:20;:32;70375:7;;70383:1;70375:10;;;;;-1:-1:-1::0;;;70375:10:0::1;;;;;;;;;;;;;;;70354:32;;;;;;;;;;;;:54;;;;;-1:-1:-1::0;;;;;70354:54:0::1;;;;;-1:-1:-1::0;;;;;70354:54:0::1;;;;;;70453:11;;70465:1;70453:14;;;;;-1:-1:-1::0;;;70453:14:0::1;;;;;;;;;;;;;;;70423:15;:27;70439:7;;70447:1;70439:10;;;;;-1:-1:-1::0;;;70439:10:0::1;;;;;;;;;;;;;;;70423:27;;;;;;;;;;;:44;;;;70122:3;;;;;:::i;:::-;;;;70082:397;;;;69678:808:::0;;;;;;:::o;44466:42::-;;;;:::o;65465:93::-;65509:13;65542:8;65535:15;;;;;:::i;23606:164::-;-1:-1:-1;;;;;23727:25:0;;;23703:4;23727:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;23606:164;;;;;:::o;52246:533::-;52315:4;46372:26;46387:10;46372:14;:26::i;:::-;46431:43;46454:7;46463:10;46431:22;:43::i;:::-;:51;;46478:4;46431:51;46409:137;;;;-1:-1:-1;;;46409:137:0;;;;;;;:::i;:::-;52343:10:::1;52332:22;::::0;;;:10:::1;:22;::::0;;;;;;;:30;;;;;;;;:37;;-1:-1:-1;;52332:37:0::1;52365:4;52332:37;::::0;;52451:26:::1;52355:6:::0;52451:18:::1;:26::i;:::-;52447:70;;;-1:-1:-1::0;52501:4:0::1;52494:11;;52447:70;52593:25;52611:6;52593:17;:25::i;:::-;52589:110;;;52635:26;52654:6;52635:18;:26::i;:::-;-1:-1:-1::0;52683:4:0::1;52676:11;;52589:110;-1:-1:-1::0;52766:5:0::1;52246:533:::0;;;:::o;44602:35::-;;;;:::o;66935:582::-;46132:26;46147:10;46132:14;:26::i;:::-;46191:46;46214:10;46226;46191:22;:46::i;:::-;:54;;46241:4;46191:54;46169:144;;;;-1:-1:-1;;;46169:144:0;;;;;;;:::i;:::-;67141:26:::1;67151:2;67155:7;67141:26;;;;;;;;;;;::::0;:9:::1;:26::i;:::-;67209:29;::::0;;;:20:::1;:29;::::0;;;;;;;;67253:15:::1;:24:::0;;;;;;;;67185:160;;-1:-1:-1;;;;;;;;;;;67185:160:0;::::1;::::0;-1:-1:-1;;;;;67209:29:0::1;::::0;67292:16;;67323:11;;67185:160:::1;:::i;:::-;;;;;;;;67356:29;::::0;;;:20:::1;:29;::::0;;;;;;;:48;;-1:-1:-1;;;;;;67356:48:0::1;-1:-1:-1::0;;;;;67356:48:0;;;::::1;::::0;;;::::1;::::0;;;67415:15:::1;:24:::0;;;;;:38;;;;67464:17:::1;:26:::0;;;;;:45;-1:-1:-1;66935:582:0:o;39031:152::-;39101:4;39125:50;39130:3;-1:-1:-1;;;;;39150:23:0;;39125:4;:50::i;39603:167::-;39683:4;39707:55;39717:3;-1:-1:-1;;;;;39737:23:0;;39707:9;:55::i;39359:158::-;39432:4;39456:53;39464:3;-1:-1:-1;;;;;39484:23:0;;39456:7;:53::i;39856:117::-;39919:7;39946:19;39954:3;39946:7;:19::i;19046:157::-;-1:-1:-1;;;;;;19155:40:0;;-1:-1:-1;;;19155:40:0;19046:157;;;:::o;26187:127::-;26252:4;26276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26276:16:0;:30;;;26187:127::o;15840:98::-;15920:10;15840:98;:::o;30071:174::-;30146:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30146:29:0;-1:-1:-1;;;;;30146:29:0;;;;;;;;:24;;30200:23;30146:24;30200:14;:23::i;:::-;-1:-1:-1;;;;;30191:46:0;;;;;;;;;;;30071:174;;:::o;57547:734::-;57734:14;;;;;;57717;57759:16;57734:14;57759:16;:::i;:::-;;;;;;57786:29;57808:6;57786:21;:29::i;:::-;57828:19;;;;:11;:19;;;;;;;;:27;;;:37;;;57876:30;;;:43;;-1:-1:-1;;;;;57876:43:0;;;-1:-1:-1;;;;;;57876:43:0;;;;;;;57930:30;;;:43;;;;;;;;;;;;;;;57984:33;;;;:25;;;;;:33;;;;:::i;:::-;-1:-1:-1;58041:10:0;58030:22;;;;:10;:22;;;;;;;;:30;;;;;;;;:37;;-1:-1:-1;;58030:37:0;58063:4;58030:37;;;;;;58078;;;:25;:37;;;;;:46;;;58191:23;;:28;58187:87;;58236:26;58255:6;58236:18;:26::i;26481:355::-;26574:4;26599:16;26607:7;26599;:16::i;:::-;26591:73;;;;-1:-1:-1;;;26591:73:0;;;;;;;:::i;:::-;26675:13;26691:23;26706:7;26691:14;:23::i;:::-;26675:39;;26744:5;-1:-1:-1;;;;;26733:16:0;:7;-1:-1:-1;;;;;26733:16:0;;:51;;;;26777:7;-1:-1:-1;;;;;26753:31:0;:20;26765:7;26753:11;:20::i;:::-;-1:-1:-1;;;;;26753:31:0;;26733:51;:94;;;;26788:39;26812:5;26819:7;26788:23;:39::i;:::-;26725:103;26481:355;-1:-1:-1;;;;26481:355:0:o;29409:544::-;29534:4;-1:-1:-1;;;;;29507:31:0;:23;29522:7;29507:14;:23::i;:::-;-1:-1:-1;;;;;29507:31:0;;29499:85;;;;-1:-1:-1;;;29499:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29603:16:0;;29595:65;;;;-1:-1:-1;;;29595:65:0;;;;;;;:::i;:::-;29673:39;29694:4;29700:2;29704:7;29673:20;:39::i;:::-;29777:29;29794:1;29798:7;29777:8;:29::i;:::-;-1:-1:-1;;;;;29819:15:0;;;;;;:9;:15;;;;;:20;;29838:1;;29819:15;:20;;29838:1;;29819:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29850:13:0;;;;;;:9;:13;;;;;:18;;29867:1;;29850:13;:18;;29867:1;;29850:18;:::i;:::-;;;;-1:-1:-1;;29879:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29879:21:0;-1:-1:-1;;;;;29879:21:0;;;;;;;;;29918:27;;29879:16;;29918:27;;;;;;;29409:544;;;:::o;40317:158::-;40391:7;40442:22;40446:3;40458:5;40442:3;:22::i;62940:116::-;47317:7;;;;47316:8;47308:45;;;;-1:-1:-1;;;47308:45:0;;;;;;;:::i;:::-;63000:7:::1;:14:::0;;-1:-1:-1;;63000:14:0::1;63010:4;63000:14;::::0;;63030:18:::1;::::0;::::1;::::0;::::1;::::0;63037:10:::1;::::0;63030:18:::1;:::i;:::-;;;;;;;;62940:116::o:0;27515:250::-;27611:18;27617:2;27621:7;27611:5;:18::i;:::-;27648:54;27679:1;27683:2;27687:7;27696:5;27648:22;:54::i;:::-;27640:117;;;;-1:-1:-1;;;27640:117:0;;;;;;;:::i;25602:272::-;25716:28;25726:4;25732:2;25736:7;25716:9;:28::i;:::-;25763:48;25786:4;25792:2;25796:7;25805:5;25763:22;:48::i;:::-;25755:111;;;;-1:-1:-1;;;25755:111:0;;;;;;;:::i;16493:723::-;16549:13;16770:10;16766:53;;-1:-1:-1;16797:10:0;;;;;;;;;;;;-1:-1:-1;;;16797:10:0;;;;;;16766:53;16844:5;16829:12;16885:78;16892:9;;16885:78;;16918:8;;;;:::i;:::-;;-1:-1:-1;16941:10:0;;-1:-1:-1;16949:2:0;16941:10;;:::i;:::-;;;16885:78;;;16973:19;17005:6;16995:17;;;;;;-1:-1:-1;;;16995:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16995:17:0;;16973:39;;17023:154;17030:10;;17023:154;;17057:11;17067:1;17057:11;;:::i;:::-;;-1:-1:-1;17126:10:0;17134:2;17126:5;:10;:::i;:::-;17113:24;;:2;:24;:::i;:::-;17100:39;;17083:6;17090;17083:14;;;;;;-1:-1:-1;;;17083:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;17083:56:0;;;;;;;;-1:-1:-1;17154:11:0;17163:2;17154:11;;:::i;:::-;;;17023:154;;58410:1675;58478:19;;;;:11;:19;;;;;42629:1;58478:27;;;;:46;58474:1558;;;58551:19;;;;:11;:19;;;;;:30;;;58541:41;;-1:-1:-1;;;;;58551:30:0;58541:9;:41::i;:::-;58474:1558;;;58604:19;;;;:11;:19;;;;;:27;;;42680:1;58604:49;58600:1432;;;58683:19;;;;:11;:19;;;;;:30;;;58670:44;;-1:-1:-1;;;;;58683:30:0;58670:12;:44::i;58600:1432::-;58736:19;;;;:11;:19;;;;;:27;;;42732:1;58736:50;58732:1300;;;58835:19;;;;:11;:19;;;;;:30;;;;58884;;;;;58803:126;;-1:-1:-1;;;;;58835:30:0;;;;58884;58803:13;:126::i;58732:1300::-;58951:19;;;;:11;:19;;;;;:27;;;42783:1;58951:49;58947:1085;;;59030:19;;;;:11;:19;;;;;:30;;;59017:44;;-1:-1:-1;;;;;59030:30:0;59017:12;:44::i;58947:1085::-;59083:19;;;;:11;:19;;;;;:27;;;42837:1;59083:52;59079:953;;;59168:19;;;;:11;:19;;;;;:30;;;59152:47;;-1:-1:-1;;;;;59168:30:0;59152:15;:47::i;59079:953::-;59221:19;;;;:11;:19;;;;;:27;;;42892:1;59221:53;59217:815;;;59326:19;;;;:11;:19;;;;;:30;;;;59375;;;;;59291:129;;-1:-1:-1;;;;;59326:30:0;;;;59375;59291:16;:129::i;59217:815::-;59456:19;;;;:11;:19;;;;;:27;;;43009:1;59456:60;59438:594;;;59575:19;;;;:11;:19;;;;;:30;;;59543:64;;-1:-1:-1;;;;;59575:30:0;59543:23;:64::i;59438:594::-;59629:19;;;;:11;:19;;;;;:27;;;42947:1;59629:53;59625:407;;;59724:19;;;;:11;:19;;;;;:30;;;59699:57;;-1:-1:-1;;;;;59724:30:0;59699:16;:57::i;59625:407::-;59778:19;;;;:11;:19;;;;;:27;;;43054:1;59778:43;59774:258;;;59838:8;:6;:8::i;59774:258::-;59868:19;;;;:11;:19;;;;;:27;;;43101:2;59868:45;59864:168;;;59930:10;:8;:10::i;59864:168::-;59973:26;59992:6;59973:18;:26::i;:::-;60014:7;;59864:168;60044:19;;;;:11;:19;;;;;:33;;-1:-1:-1;;60044:33:0;60073:4;60044:33;;;58410:1675;:::o;34086:414::-;34149:4;34171:21;34181:3;34186:5;34171:9;:21::i;:::-;34166:327;;-1:-1:-1;34209:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;34392:18;;34370:19;;;:12;;;:19;;;;;;:40;;;;34425:11;;34166:327;-1:-1:-1;34476:5:0;34469:12;;36315:129;36388:4;36412:19;;;:12;;;;;:19;;;;;;:24;;;36315:129::o;34676:1553::-;34742:4;34881:19;;;:12;;;:19;;;;;;34917:15;;34913:1309;;35279:21;35303:14;35316:1;35303:10;:14;:::i;:::-;35352:18;;35279:38;;-1:-1:-1;35332:17:0;;35352:22;;35373:1;;35352:22;:::i;:::-;35332:42;;35619:17;35639:3;:11;;35651:9;35639:22;;;;;;-1:-1:-1;;;35639:22:0;;;;;;;;;;;;;;;;;35619:42;;35785:9;35756:3;:11;;35768:13;35756:26;;;;;;-1:-1:-1;;;35756:26:0;;;;;;;;;;;;;;;;;;;;:38;;;;35862:23;;;:12;;;:23;;;;;;:36;;;36023:17;;35862:3;;36023:17;;;-1:-1:-1;;;36023:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;36118:3;:12;;:19;36131:5;36118:19;;;;;;;;;;;36111:26;;;36161:4;36154:11;;;;;;;;34913:1309;36205:5;36198:12;;;;;36530:109;36613:18;;36530:109::o;36983:204::-;37078:18;;37050:7;;37078:26;-1:-1:-1;37070:73:0;;;;-1:-1:-1;;;37070:73:0;;;;;;;:::i;:::-;37161:3;:11;;37173:5;37161:18;;;;;;-1:-1:-1;;;37161:18:0;;;;;;;;;;;;;;;;;37154:25;;36983:204;;;;:::o;28101:382::-;-1:-1:-1;;;;;28181:16:0;;28173:61;;;;-1:-1:-1;;;28173:61:0;;;;;;;:::i;:::-;28254:16;28262:7;28254;:16::i;:::-;28253:17;28245:58;;;;-1:-1:-1;;;28245:58:0;;;;;;;:::i;:::-;28316:45;28345:1;28349:2;28353:7;28316:20;:45::i;:::-;-1:-1:-1;;;;;28374:13:0;;;;;;:9;:13;;;;;:18;;28391:1;;28374:13;:18;;28391:1;;28374:18;:::i;:::-;;;;-1:-1:-1;;28403:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28403:21:0;-1:-1:-1;;;;;28403:21:0;;;;;;;;28442:33;;28403:16;;;28442:33;;28403:16;;28442:33;28101:382;;:::o;30810:843::-;30931:4;30957:15;:2;-1:-1:-1;;;;;30957:13:0;;:15::i;:::-;30953:693;;;31009:2;-1:-1:-1;;;;;30993:36:0;;31030:12;:10;:12::i;:::-;31044:4;31050:7;31059:5;30993:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30993:72:0;;;;;;;;-1:-1:-1;;30993:72:0;;;;;;;;;;;;:::i;:::-;;;30989:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31239:13:0;;31235:341;;31282:60;;-1:-1:-1;;;31282:60:0;;;;;;;:::i;31235:341::-;31526:6;31520:13;31511:6;31507:2;31503:15;31496:38;30989:602;-1:-1:-1;;;;;;31116:55:0;-1:-1:-1;;;31116:55:0;;-1:-1:-1;31109:62:0;;30953:693;-1:-1:-1;31630:4:0;30810:843;;;;;;:::o;60444:140::-;60501:36;60519:7;60528:8;60501:17;:36::i;:::-;;60553:23;60567:8;60553:23;;;;;;:::i;:::-;;;;;;;;60444:140;:::o;60606:299::-;60666:39;60687:7;60696:8;60666:20;:39::i;:::-;;60721:22;60734:8;60721:22;;;;;;:::i;:::-;;;;;;;;60756:14;60773:19;:17;:19::i;:::-;60756:36;;60833:9;60807:23;;:35;60803:95;;;60859:27;60876:9;60859:16;:27::i;60927:225::-;61006:39;61027:7;61036:8;61006:20;:39::i;:::-;;61056:36;61074:7;61083:8;61056:17;:36::i;:::-;;61108;61125:8;61135;61108:36;;;;;;;:::i;:::-;;;;;;;;60927:225;;:::o;61174:149::-;61234:39;61252:10;61264:8;61234:17;:39::i;:::-;;61289:26;61306:8;61289:26;;;;;;:::i;61345:154::-;61408:42;61429:10;61441:8;61408:20;:42::i;:::-;;61466:25;61482:8;61466:25;;;;;;:::i;61521:269::-;61628:45;61648:11;61661;61628:45;;;;;;;:::i;:::-;;;;;;;;61684;61705:10;61717:11;61684:20;:45::i;:::-;;61740:42;61758:10;61770:11;61740:17;:42::i;61875:154::-;61951:32;61974:8;61951:32;;;;;;:::i;:::-;;;;;;;;61994:16;:27;61875:154::o;62113:290::-;62210:19;:17;:19::i;:::-;62197:9;:32;;62175:132;;;;-1:-1:-1;;;62175:132:0;;;;;;;:::i;:::-;62323:26;62339:9;62323:26;;;;;;:::i;:::-;;;;;;;;62360:23;:35;62113:290::o;63179:118::-;47575:7;;;;47567:48;;;;-1:-1:-1;;;47567:48:0;;;;;;;:::i;:::-;63238:7:::1;:15:::0;;-1:-1:-1;;63238:15:0::1;::::0;;63269:20:::1;::::0;::::1;::::0;::::1;::::0;63278:10:::1;::::0;63269:20:::1;:::i;7959:422::-:0;8326:20;8365:8;;;7959:422::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:400:1;;;147:3;140:4;132:6;128:17;124:27;114:2;;170:6;162;155:22;114:2;-1:-1:-1;198:20:1;;241:18;230:30;;227:2;;;280:8;270;263:26;227:2;324:4;316:6;312:17;300:29;;387:3;380:4;372;364:6;360:17;352:6;348:30;344:41;341:50;338:2;;;404:1;401;394:12;338:2;104:310;;;;;:::o;419:712::-;;516:3;509:4;501:6;497:17;493:27;483:2;;538:5;531;524:20;483:2;578:6;565:20;604:18;641:2;637;634:10;631:2;;;647:18;;:::i;:::-;696:2;690:9;765:2;746:13;;-1:-1:-1;;742:27:1;730:40;;772:4;726:51;792:18;;;812:22;;;789:46;786:2;;;838:18;;:::i;:::-;874:2;867:22;898:18;;;935:15;;;952:4;931:26;928:35;-1:-1:-1;925:2:1;;;980:5;973;966:20;925:2;1048;1041:4;1033:6;1029:17;1022:4;1014:6;1010:17;997:54;1071:15;;;1088:4;1067:26;1060:41;;;;1075:6;473:658;-1:-1:-1;;;473:658:1:o;1136:259::-;;1248:2;1236:9;1227:7;1223:23;1219:32;1216:2;;;1269:6;1261;1254:22;1216:2;1313:9;1300:23;1332:33;1359:5;1332:33;:::i;1400:402::-;;;1529:2;1517:9;1508:7;1504:23;1500:32;1497:2;;;1550:6;1542;1535:22;1497:2;1594:9;1581:23;1613:33;1640:5;1613:33;:::i;:::-;1665:5;-1:-1:-1;1722:2:1;1707:18;;1694:32;1735:35;1694:32;1735:35;:::i;:::-;1789:7;1779:17;;;1487:315;;;;;:::o;1807:470::-;;;;1953:2;1941:9;1932:7;1928:23;1924:32;1921:2;;;1974:6;1966;1959:22;1921:2;2018:9;2005:23;2037:33;2064:5;2037:33;:::i;:::-;2089:5;-1:-1:-1;2146:2:1;2131:18;;2118:32;2159:35;2118:32;2159:35;:::i;:::-;1911:366;;2213:7;;-1:-1:-1;;;2267:2:1;2252:18;;;;2239:32;;1911:366::o;2282:691::-;;;;;2454:3;2442:9;2433:7;2429:23;2425:33;2422:2;;;2476:6;2468;2461:22;2422:2;2520:9;2507:23;2539:33;2566:5;2539:33;:::i;:::-;2591:5;-1:-1:-1;2648:2:1;2633:18;;2620:32;2661:35;2620:32;2661:35;:::i;:::-;2715:7;-1:-1:-1;2769:2:1;2754:18;;2741:32;;-1:-1:-1;2824:2:1;2809:18;;2796:32;2851:18;2840:30;;2837:2;;;2888:6;2880;2873:22;2837:2;2916:51;2959:7;2950:6;2939:9;2935:22;2916:51;:::i;:::-;2906:61;;;2412:561;;;;;;;:::o;2978:438::-;;;3104:2;3092:9;3083:7;3079:23;3075:32;3072:2;;;3125:6;3117;3110:22;3072:2;3169:9;3156:23;3188:33;3215:5;3188:33;:::i;:::-;3240:5;-1:-1:-1;3297:2:1;3282:18;;3269:32;3339:15;;3332:23;3320:36;;3310:2;;3375:6;3367;3360:22;3421:327;;;3550:2;3538:9;3529:7;3525:23;3521:32;3518:2;;;3571:6;3563;3556:22;3518:2;3615:9;3602:23;3634:33;3661:5;3634:33;:::i;:::-;3686:5;3738:2;3723:18;;;;3710:32;;-1:-1:-1;;;3508:240:1:o;3753:608::-;;;;;;3933:3;3921:9;3912:7;3908:23;3904:33;3901:2;;;3955:6;3947;3940:22;3901:2;3999:9;3986:23;4018:33;4045:5;4018:33;:::i;:::-;4070:5;-1:-1:-1;4122:2:1;4107:18;;4094:32;;-1:-1:-1;4178:2:1;4163:18;;4150:32;4191:35;4150:32;4191:35;:::i;:::-;3891:470;;;;-1:-1:-1;4245:7:1;;4299:2;4284:18;;4271:32;;-1:-1:-1;4350:3:1;4335:19;4322:33;;3891:470;-1:-1:-1;;3891:470:1:o;4366:1810::-;;;;;;;;;;;4721:3;4709:9;4700:7;4696:23;4692:33;4689:2;;;4743:6;4735;4728:22;4689:2;4788:9;4775:23;4817:18;4858:2;4850:6;4847:14;4844:2;;;4879:6;4871;4864:22;4844:2;4923:76;4991:7;4982:6;4971:9;4967:22;4923:76;:::i;:::-;5018:8;;-1:-1:-1;4897:102:1;-1:-1:-1;5106:2:1;5091:18;;5078:32;;-1:-1:-1;5122:16:1;;;5119:2;;;5156:6;5148;5141:22;5119:2;5200:78;5270:7;5259:8;5248:9;5244:24;5200:78;:::i;:::-;5297:8;;-1:-1:-1;5174:104:1;-1:-1:-1;5385:2:1;5370:18;;5357:32;;-1:-1:-1;5401:16:1;;;5398:2;;;5435:6;5427;5420:22;5398:2;5479:78;5549:7;5538:8;5527:9;5523:24;5479:78;:::i;:::-;5576:8;;-1:-1:-1;5453:104:1;-1:-1:-1;5664:2:1;5649:18;;5636:32;;-1:-1:-1;5680:16:1;;;5677:2;;;5714:6;5706;5699:22;5677:2;5758:78;5828:7;5817:8;5806:9;5802:24;5758:78;:::i;:::-;5855:8;;-1:-1:-1;5732:104:1;-1:-1:-1;5943:3:1;5928:19;;5915:33;;-1:-1:-1;5960:16:1;;;5957:2;;;5994:6;5986;5979:22;5957:2;;6038:78;6108:7;6097:8;6086:9;6082:24;6038:78;:::i;:::-;6012:104;;6135:8;6125:18;;;6162:8;6152:18;;;4679:1497;;;;;;;;;;;;;:::o;6181:1146::-;;;;;;;6432:2;6420:9;6411:7;6407:23;6403:32;6400:2;;;6453:6;6445;6438:22;6400:2;6498:9;6485:23;6527:18;6568:2;6560:6;6557:14;6554:2;;;6589:6;6581;6574:22;6554:2;6633:76;6701:7;6692:6;6681:9;6677:22;6633:76;:::i;:::-;6728:8;;-1:-1:-1;6607:102:1;-1:-1:-1;6816:2:1;6801:18;;6788:32;;-1:-1:-1;6832:16:1;;;6829:2;;;6866:6;6858;6851:22;6829:2;6910:78;6980:7;6969:8;6958:9;6954:24;6910:78;:::i;:::-;7007:8;;-1:-1:-1;6884:104:1;-1:-1:-1;7095:2:1;7080:18;;7067:32;;-1:-1:-1;7111:16:1;;;7108:2;;;7145:6;7137;7130:22;7108:2;;7189:78;7259:7;7248:8;7237:9;7233:24;7189:78;:::i;:::-;6390:937;;;;-1:-1:-1;6390:937:1;;-1:-1:-1;6390:937:1;;7286:8;;6390:937;-1:-1:-1;;;6390:937:1:o;7332:815::-;;;;;7531:2;7519:9;7510:7;7506:23;7502:32;7499:2;;;7552:6;7544;7537:22;7499:2;7597:9;7584:23;7626:18;7667:2;7659:6;7656:14;7653:2;;;7688:6;7680;7673:22;7653:2;7732:76;7800:7;7791:6;7780:9;7776:22;7732:76;:::i;:::-;7827:8;;-1:-1:-1;7706:102:1;-1:-1:-1;7915:2:1;7900:18;;7887:32;;-1:-1:-1;7931:16:1;;;7928:2;;;7965:6;7957;7950:22;7928:2;;8009:78;8079:7;8068:8;8057:9;8053:24;8009:78;:::i;:::-;7489:658;;;;-1:-1:-1;8106:8:1;-1:-1:-1;;;;7489:658:1:o;8152:257::-;;8263:2;8251:9;8242:7;8238:23;8234:32;8231:2;;;8284:6;8276;8269:22;8231:2;8328:9;8315:23;8347:32;8373:5;8347:32;:::i;8414:261::-;;8536:2;8524:9;8515:7;8511:23;8507:32;8504:2;;;8557:6;8549;8542:22;8504:2;8594:9;8588:16;8613:32;8639:5;8613:32;:::i;8680:342::-;;8801:2;8789:9;8780:7;8776:23;8772:32;8769:2;;;8822:6;8814;8807:22;8769:2;8867:9;8854:23;8900:18;8892:6;8889:30;8886:2;;;8937:6;8929;8922:22;8886:2;8965:51;9008:7;8999:6;8988:9;8984:22;8965:51;:::i;9291:190::-;;9403:2;9391:9;9382:7;9378:23;9374:32;9371:2;;;9424:6;9416;9409:22;9371:2;-1:-1:-1;9452:23:1;;9361:120;-1:-1:-1;9361:120:1:o;9486:395::-;;;;9632:2;9620:9;9611:7;9607:23;9603:32;9600:2;;;9653:6;9645;9638:22;9600:2;9694:9;9681:23;9671:33;;9754:2;9743:9;9739:18;9726:32;9767:33;9794:5;9767:33;:::i;9886:258::-;;;10015:2;10003:9;9994:7;9990:23;9986:32;9983:2;;;10036:6;10028;10021:22;9983:2;-1:-1:-1;;10064:23:1;;;10134:2;10119:18;;;10106:32;;-1:-1:-1;9973:171:1:o;10149:259::-;;10230:5;10224:12;10257:6;10252:3;10245:19;10273:63;10329:6;10322:4;10317:3;10313:14;10306:4;10299:5;10295:16;10273:63;:::i;:::-;10390:2;10369:15;-1:-1:-1;;10365:29:1;10356:39;;;;10397:4;10352:50;;10200:208;-1:-1:-1;;10200:208:1:o;10413:470::-;;10630:6;10624:13;10646:53;10692:6;10687:3;10680:4;10672:6;10668:17;10646:53;:::i;:::-;10762:13;;10721:16;;;;10784:57;10762:13;10721:16;10818:4;10806:17;;10784:57;:::i;:::-;10857:20;;10600:283;-1:-1:-1;;;;10600:283:1:o;10888:203::-;-1:-1:-1;;;;;11052:32:1;;;;11034:51;;11022:2;11007:18;;10989:102::o;11096:304::-;-1:-1:-1;;;;;11326:15:1;;;11308:34;;11378:15;;11373:2;11358:18;;11351:43;11258:2;11243:18;;11225:175::o;11405:490::-;-1:-1:-1;;;;;11674:15:1;;;11656:34;;11726:15;;11721:2;11706:18;;11699:43;11773:2;11758:18;;11751:34;;;11821:3;11816:2;11801:18;;11794:31;;;11405:490;;11842:47;;11869:19;;11861:6;11842:47;:::i;:::-;11834:55;11608:287;-1:-1:-1;;;;;;11608:287:1:o;11900:274::-;-1:-1:-1;;;;;12092:32:1;;;;12074:51;;12156:2;12141:18;;12134:34;12062:2;12047:18;;12029:145::o;12179:447::-;-1:-1:-1;;;;;12466:15:1;;;12448:34;;12513:2;12498:18;;12491:34;;;;12561:15;;12556:2;12541:18;;12534:43;12608:2;12593:18;;12586:34;;;;12397:3;12382:19;;12364:262::o;12631:661::-;12802:2;12854:21;;;12924:13;;12827:18;;;12946:22;;;12631:661;;12802:2;13025:15;;;;12999:2;12984:18;;;12631:661;13071:195;13085:6;13082:1;13079:13;13071:195;;;13150:13;;-1:-1:-1;;;;;13146:39:1;13134:52;;13241:15;;;;13206:12;;;;13182:1;13100:9;13071:195;;;-1:-1:-1;13283:3:1;;12782:510;-1:-1:-1;;;;;;12782:510:1:o;13297:187::-;13462:14;;13455:22;13437:41;;13425:2;13410:18;;13392:92::o;13489:457::-;13739:14;;13732:22;13714:41;;13786:2;13771:18;;13764:34;;;;-1:-1:-1;;;;;13872:15:1;;;13867:2;13852:18;;13845:43;13924:15;13919:2;13904:18;;13897:43;13701:3;13686:19;;13668:278::o;13951:177::-;14097:25;;;14085:2;14070:18;;14052:76::o;14133:248::-;14307:25;;;14363:2;14348:18;;14341:34;14295:2;14280:18;;14262:119::o;14386:221::-;;14535:2;14524:9;14517:21;14555:46;14597:2;14586:9;14582:18;14574:6;14555:46;:::i;14612:398::-;14814:2;14796:21;;;14853:2;14833:18;;;14826:30;14892:34;14887:2;14872:18;;14865:62;-1:-1:-1;;;14958:2:1;14943:18;;14936:32;15000:3;14985:19;;14786:224::o;15015:414::-;15217:2;15199:21;;;15256:2;15236:18;;;15229:30;15295:34;15290:2;15275:18;;15268:62;-1:-1:-1;;;15361:2:1;15346:18;;15339:48;15419:3;15404:19;;15189:240::o;15434:414::-;15636:2;15618:21;;;15675:2;15655:18;;;15648:30;15714:34;15709:2;15694:18;;15687:62;-1:-1:-1;;;15780:2:1;15765:18;;15758:48;15838:3;15823:19;;15608:240::o;15853:348::-;16055:2;16037:21;;;16094:2;16074:18;;;16067:30;16133:26;16128:2;16113:18;;16106:54;16192:2;16177:18;;16027:174::o;16206:352::-;16408:2;16390:21;;;16447:2;16427:18;;;16420:30;16486;16481:2;16466:18;;16459:58;16549:2;16534:18;;16380:178::o;16563:355::-;16765:2;16747:21;;;16804:2;16784:18;;;16777:30;16843:33;16838:2;16823:18;;16816:61;16909:2;16894:18;;16737:181::o;16923:400::-;17125:2;17107:21;;;17164:2;17144:18;;;17137:30;17203:34;17198:2;17183:18;;17176:62;-1:-1:-1;;;17269:2:1;17254:18;;17247:34;17313:3;17298:19;;17097:226::o;17328:349::-;17530:2;17512:21;;;17569:2;17549:18;;;17542:30;17608:27;17603:2;17588:18;;17581:55;17668:2;17653:18;;17502:175::o;17682:404::-;17884:2;17866:21;;;17923:2;17903:18;;;17896:30;17962:34;17957:2;17942:18;;17935:62;-1:-1:-1;;;18028:2:1;18013:18;;18006:38;18076:3;18061:19;;17856:230::o;18091:408::-;18293:2;18275:21;;;18332:2;18312:18;;;18305:30;18371:34;18366:2;18351:18;;18344:62;-1:-1:-1;;;18437:2:1;18422:18;;18415:42;18489:3;18474:19;;18265:234::o;18504:348::-;18706:2;18688:21;;;18745:2;18725:18;;;18718:30;18784:26;18779:2;18764:18;;18757:54;18843:2;18828:18;;18678:174::o;18857:404::-;19059:2;19041:21;;;19098:2;19078:18;;;19071:30;19137:34;19132:2;19117:18;;19110:62;-1:-1:-1;;;19203:2:1;19188:18;;19181:38;19251:3;19236:19;;19031:230::o;19266:420::-;19468:2;19450:21;;;19507:2;19487:18;;;19480:30;19546:34;19541:2;19526:18;;19519:62;19617:26;19612:2;19597:18;;19590:54;19676:3;19661:19;;19440:246::o;19691:406::-;19893:2;19875:21;;;19932:2;19912:18;;;19905:30;19971:34;19966:2;19951:18;;19944:62;-1:-1:-1;;;20037:2:1;20022:18;;20015:40;20087:3;20072:19;;19865:232::o;20102:405::-;20304:2;20286:21;;;20343:2;20323:18;;;20316:30;20382:34;20377:2;20362:18;;20355:62;-1:-1:-1;;;20448:2:1;20433:18;;20426:39;20497:3;20482:19;;20276:231::o;20512:349::-;20714:2;20696:21;;;20753:2;20733:18;;;20726:30;20792:27;20787:2;20772:18;;20765:55;20852:2;20837:18;;20686:175::o;20866:352::-;21068:2;21050:21;;;21107:2;21087:18;;;21080:30;21146;21141:2;21126:18;;21119:58;21209:2;21194:18;;21040:178::o;21223:351::-;21425:2;21407:21;;;21464:2;21444:18;;;21437:30;21503:29;21498:2;21483:18;;21476:57;21565:2;21550:18;;21397:177::o;21579:356::-;21781:2;21763:21;;;21800:18;;;21793:30;21859:34;21854:2;21839:18;;21832:62;21926:2;21911:18;;21753:182::o;21940:402::-;22142:2;22124:21;;;22181:2;22161:18;;;22154:30;22220:34;22215:2;22200:18;;22193:62;-1:-1:-1;;;22286:2:1;22271:18;;22264:36;22332:3;22317:19;;22114:228::o;22347:346::-;22549:2;22531:21;;;22588:2;22568:18;;;22561:30;-1:-1:-1;;;22622:2:1;22607:18;;22600:52;22684:2;22669:18;;22521:172::o;22698:408::-;22900:2;22882:21;;;22939:2;22919:18;;;22912:30;22978:34;22973:2;22958:18;;22951:62;-1:-1:-1;;;23044:2:1;23029:18;;23022:42;23096:3;23081:19;;22872:234::o;23111:405::-;23313:2;23295:21;;;23352:2;23332:18;;;23325:30;23391:34;23386:2;23371:18;;23364:62;-1:-1:-1;;;23457:2:1;23442:18;;23435:39;23506:3;23491:19;;23285:231::o;23521:411::-;23723:2;23705:21;;;23762:2;23742:18;;;23735:30;23801:34;23796:2;23781:18;;23774:62;-1:-1:-1;;;23867:2:1;23852:18;;23845:45;23922:3;23907:19;;23695:237::o;23937:397::-;24139:2;24121:21;;;24178:2;24158:18;;;24151:30;24217:34;24212:2;24197:18;;24190:62;-1:-1:-1;;;24283:2:1;24268:18;;24261:31;24324:3;24309:19;;24111:223::o;24339:413::-;24541:2;24523:21;;;24580:2;24560:18;;;24553:30;24619:34;24614:2;24599:18;;24592:62;-1:-1:-1;;;24685:2:1;24670:18;;24663:47;24742:3;24727:19;;24513:239::o;24757:400::-;24959:2;24941:21;;;24998:2;24978:18;;;24971:30;25037:34;25032:2;25017:18;;25010:62;-1:-1:-1;;;25103:2:1;25088:18;;25081:34;25147:3;25132:19;;24931:226::o;25162:348::-;25364:2;25346:21;;;25403:2;25383:18;;;25376:30;25442:26;25437:2;25422:18;;25415:54;25501:2;25486:18;;25336:174::o;25515:339::-;25717:2;25699:21;;;25756:2;25736:18;;;25729:30;-1:-1:-1;;;25790:2:1;25775:18;;25768:45;25845:2;25830:18;;25689:165::o;25859:352::-;26061:2;26043:21;;;26100:2;26080:18;;;26073:30;26139;26134:2;26119:18;;26112:58;26202:2;26187:18;;26033:178::o;26216:353::-;26418:2;26400:21;;;26457:2;26437:18;;;26430:30;26496:31;26491:2;26476:18;;26469:59;26560:2;26545:18;;26390:179::o;26756:184::-;26928:4;26916:17;;;;26898:36;;26886:2;26871:18;;26853:87::o;26945:128::-;;27016:1;27012:6;27009:1;27006:13;27003:2;;;27022:18;;:::i;:::-;-1:-1:-1;27058:9:1;;26993:80::o;27078:120::-;;27144:1;27134:2;;27149:18;;:::i;:::-;-1:-1:-1;27183:9:1;;27124:74::o;27203:168::-;;27309:1;27305;27301:6;27297:14;27294:1;27291:21;27286:1;27279:9;27272:17;27268:45;27265:2;;;27316:18;;:::i;:::-;-1:-1:-1;27356:9:1;;27255:116::o;27376:125::-;;27444:1;27441;27438:8;27435:2;;;27449:18;;:::i;:::-;-1:-1:-1;27486:9:1;;27425:76::o;27506:258::-;27578:1;27588:113;27602:6;27599:1;27596:13;27588:113;;;27678:11;;;27672:18;27659:11;;;27652:39;27624:2;27617:10;27588:113;;;27719:6;27716:1;27713:13;27710:2;;;-1:-1:-1;;27754:1:1;27736:16;;27729:27;27559:205::o;27769:380::-;27854:1;27844:12;;27901:1;27891:12;;;27912:2;;27966:4;27958:6;27954:17;27944:27;;27912:2;28019;28011:6;28008:14;27988:18;27985:38;27982:2;;;28065:10;28060:3;28056:20;28053:1;28046:31;28100:4;28097:1;28090:15;28128:4;28125:1;28118:15;27982:2;;27824:325;;;:::o;28154:135::-;;-1:-1:-1;;28214:17:1;;28211:2;;;28234:18;;:::i;:::-;-1:-1:-1;28281:1:1;28270:13;;28201:88::o;28294:112::-;;28352:1;28342:2;;28357:18;;:::i;:::-;-1:-1:-1;28391:9:1;;28332:74::o;28411:127::-;28472:10;28467:3;28463:20;28460:1;28453:31;28503:4;28500:1;28493:15;28527:4;28524:1;28517:15;28543:127;28604:10;28599:3;28595:20;28592:1;28585:31;28635:4;28632:1;28625:15;28659:4;28656:1;28649:15;28675:127;28736:10;28731:3;28727:20;28724:1;28717:31;28767:4;28764:1;28757:15;28791:4;28788:1;28781:15;28807:133;-1:-1:-1;;;;;28884:31:1;;28874:42;;28864:2;;28930:1;28927;28920:12;28945:133;-1:-1:-1;;;;;;29021:32:1;;29011:43;;29001:2;;29068:1;29065;29058:12

Swarm Source

ipfs://e67864a3eb7e12b01e8b04935666c8a95c0096afff886b2afb99b2f0cabd447e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.