ETH Price: $2,508.31 (+0.68%)

Token

FuturePasses (FP)
 

Overview

Max Total Supply

69 FP

Holders

37

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 FP
0xd7242a4eb63aca04ad5e0113b73480c8eba81489
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:
FutureArtGoldPasses

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

    bool private _paused;

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

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

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

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

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

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

// 
/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

// 
abstract contract ContextMixin {
    function msgSender()
        internal
        view
        returns (address payable sender)
    {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string constant public ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH = keccak256(
        bytes(
            "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
        )
    );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(
        string memory name
    )
        internal
        initializer
    {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

// 
contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH = keccak256(
        bytes(
            "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
        )
    );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

// 
contract OwnableDelegateProxy {}

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

/**
 * @title FutureArtGoldPasses
 * Based on ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
contract FutureArtGoldPasses is
    ContextMixin,
    ERC721Enumerable,
    ERC721Pausable,
    NativeMetaTransaction,
    Ownable
{
    using SafeMath for uint256;

    address immutable proxyRegistryAddress;
    uint256 immutable NFTLimit = 300;
    uint256 private _currentTokenId = 0;
    string private _uri;

    constructor(
        string memory _name,
        string memory _symbol,
        address _proxyRegistryAddress,
        string memory _URI
    ) ERC721(_name, _symbol) {
        proxyRegistryAddress = _proxyRegistryAddress;
        _uri = _URI;
        _initializeEIP712(_name);
    }

    /**
     * @dev mints tokens to an address. Supply limited to NFTLimit.
     * @param _to address of the future owner of the tokens
     * @param _batchCount number of tokens to mint
     */
    function mintSupplyByBatch(
        address _to,
        uint256 _batchCount
    ) public onlyOwner {
        uint256 newNFTCount = _batchCount;
        // can't try mint more than limit
        if (newNFTCount > NFTLimit) {
            newNFTCount = NFTLimit;
        }
        uint256 lastId = _currentTokenId + newNFTCount;
        // mint only to limit
        if (lastId > NFTLimit) {
            uint256 excess = lastId - NFTLimit;
            newNFTCount -= excess;
        }
        require(newNFTCount > 0, "FutureArtGoldPasses: no more nfts to mint");
        for (uint256 i = 0; i < newNFTCount; i++) {
            uint256 newTokenId = _getNextTokenId();
            _mint(_to, newTokenId);
            _incrementTokenId();
        }
    }

    /**
     * @dev burns set of token ids, only if the contract owner owns them
     * @param ids array of token ids to burn
     */
    function burnBatch(uint256[] calldata ids) public onlyOwner {
        for (uint256 i=0; i<ids.length; i++) {
            require(_isApprovedOrOwner(_msgSender(), ids[i]), "ERC721Burnable: caller is not owner nor approved");
            _burn(ids[i]);
        }
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenId
     * @return uint256 for the next token ID
     */
    function _getNextTokenId() private view returns (uint256) {
        return _currentTokenId.add(1);
    }

    /**
     * @dev increments the value of _currentTokenId
     */
    function _incrementTokenId() private {
        _currentTokenId++;
    }

    /**
     * @dev shared uri for nfts
     */
    function tokenURI(uint256 /*_tokenId*/) override public view returns (string memory) {
        return _uri;
    }

    /**
     * @dev set _uri for all nfts
     */
    function setURI(string memory _newURI) public onlyOwner {
        _uri = _newURI;
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address tokenOwner, address operator)
        override
        public
        view
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(tokenOwner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(tokenOwner, operator);
    }

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

    /**
      * @dev Pauses all token transfers.
      */
    function pause() public virtual onlyOwner {
        _pause();
    }
    /**
      * @dev Unpauses all token transfers.
      */
    function unpause() public virtual onlyOwner {
        _unpause();
    }

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

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender()
        internal
        override
        view
        returns (address sender)
    {
        return ContextMixin.msgSender();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"string","name":"_URI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_batchCount","type":"uint256"}],"name":"mintSupplyByBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c06040526000600a60016101000a81548160ff02191690831515021790555061012c60a0908152506000600e553480156200003a57600080fd5b50604051620054b3380380620054b3833981810160405281019062000060919062000548565b838381600090805190602001906200007a9291906200040f565b508060019080519060200190620000939291906200040f565b5050506000600a60006101000a81548160ff021916908315150217905550620000d1620000c56200013c60201b60201c565b6200015860201b60201c565b8173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080600f9080519060200190620001209291906200040f565b5062000132846200021e60201b60201c565b50505050620008c9565b600062000153620002a060201b62001a671760201c565b905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600a60019054906101000a900460ff161562000271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026890620006a5565b60405180910390fd5b62000282816200035360201b60201c565b6001600a60016101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156200034c57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff81830151169250505062000350565b3390505b90565b6040518060800160405280604f815260200162005464604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620003ca6200040260201b60201c565b60001b604051602001620003e395949392919062000648565b60405160208183030381529060405280519060200120600b8190555050565b6000804690508091505090565b8280546200041d90620007ab565b90600052602060002090601f0160209004810192826200044157600085556200048d565b82601f106200045c57805160ff19168380011785556200048d565b828001600101855582156200048d579182015b828111156200048c5782518255916020019190600101906200046f565b5b5090506200049c9190620004a0565b5090565b5b80821115620004bb576000816000905550600101620004a1565b5090565b6000620004d6620004d084620006f0565b620006c7565b905082815260208101848484011115620004ef57600080fd5b620004fc84828562000775565b509392505050565b6000815190506200051581620008af565b92915050565b600082601f8301126200052d57600080fd5b81516200053f848260208601620004bf565b91505092915050565b600080600080608085870312156200055f57600080fd5b600085015167ffffffffffffffff8111156200057a57600080fd5b62000588878288016200051b565b945050602085015167ffffffffffffffff811115620005a657600080fd5b620005b4878288016200051b565b9350506040620005c78782880162000504565b925050606085015167ffffffffffffffff811115620005e557600080fd5b620005f3878288016200051b565b91505092959194509250565b6200060a8162000737565b82525050565b6200061b816200074b565b82525050565b600062000630600e8362000726565b91506200063d8262000886565b602082019050919050565b600060a0820190506200065f600083018862000610565b6200066e602083018762000610565b6200067d604083018662000610565b6200068c6060830185620005ff565b6200069b608083018462000610565b9695505050505050565b60006020820190508181036000830152620006c08162000621565b9050919050565b6000620006d3620006e6565b9050620006e18282620007e1565b919050565b6000604051905090565b600067ffffffffffffffff8211156200070e576200070d62000846565b5b620007198262000875565b9050602081019050919050565b600082825260208201905092915050565b6000620007448262000755565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60005b838110156200079557808201518184015260208101905062000778565b83811115620007a5576000848401525b50505050565b60006002820490506001821680620007c457607f821691505b60208210811415620007db57620007da62000817565b5b50919050565b620007ec8262000875565b810181811067ffffffffffffffff821117156200080e576200080d62000846565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b620008ba8162000737565b8114620008c657600080fd5b50565b60805160601c60a051614b5d6200090760003960008181610eac01528181610ed401528181610f0a0152610f34015260006118740152614b5d6000f3fe6080604052600436106101cd5760003560e01c806342842e0e116100f75780638da5cb5b11610095578063c87b56dd11610064578063c87b56dd14610669578063e4623c1b146106a6578063e985e9c5146106cf578063f2fde38b1461070c576101cd565b80638da5cb5b146105c157806395d89b41146105ec578063a22cb46514610617578063b88d4fde14610640576101cd565b80636352211e116100d15780636352211e1461051957806370a0823114610556578063715018a6146105935780638456cb59146105aa576101cd565b806342842e0e146104885780634f6ccce7146104b15780635c975abb146104ee576101cd565b806318160ddd1161016f5780632f745c591161013e5780632f745c59146103e05780633408e4701461041d5780633428aec8146104485780633f4ba83a14610471576101cd565b806318160ddd1461032457806320379ee51461034f57806323b872dd1461037a5780632d0335ab146103a3576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a05780630c53c51c146102c95780630f7e5970146102f9576101cd565b806301ffc9a7146101d257806302fe53051461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906134a0565b610735565b6040516102069190613b59565b60405180910390f35b34801561021b57600080fd5b506102366004803603810190610231919061351b565b610747565b005b34801561024457600080fd5b5061024d6107dd565b60405161025a9190613c3b565b60405180910390f35b34801561026f57600080fd5b5061028a6004803603810190610285919061355c565b61086f565b6040516102979190613ab4565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c2919061341f565b6108f4565b005b6102e360048036038101906102de9190613390565b610a0c565b6040516102f09190613c19565b60405180910390f35b34801561030557600080fd5b5061030e610c7e565b60405161031b9190613c3b565b60405180910390f35b34801561033057600080fd5b50610339610cb7565b6040516103469190613f7d565b60405180910390f35b34801561035b57600080fd5b50610364610cc4565b6040516103719190613b74565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c919061328a565b610cce565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613225565b610d2e565b6040516103d79190613f7d565b60405180910390f35b3480156103ec57600080fd5b506104076004803603810190610402919061341f565b610d77565b6040516104149190613f7d565b60405180910390f35b34801561042957600080fd5b50610432610e1c565b60405161043f9190613f7d565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a919061341f565b610e29565b005b34801561047d57600080fd5b50610486610ff7565b005b34801561049457600080fd5b506104af60048036038101906104aa919061328a565b61107d565b005b3480156104bd57600080fd5b506104d860048036038101906104d3919061355c565b61109d565b6040516104e59190613f7d565b60405180910390f35b3480156104fa57600080fd5b50610503611134565b6040516105109190613b59565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b919061355c565b61114b565b60405161054d9190613ab4565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613225565b6111fd565b60405161058a9190613f7d565b60405180910390f35b34801561059f57600080fd5b506105a86112b5565b005b3480156105b657600080fd5b506105bf61133d565b005b3480156105cd57600080fd5b506105d66113c3565b6040516105e39190613ab4565b60405180910390f35b3480156105f857600080fd5b506106016113ed565b60405161060e9190613c3b565b60405180910390f35b34801561062357600080fd5b5061063e60048036038101906106399190613354565b61147f565b005b34801561064c57600080fd5b50610667600480360381019061066291906132d9565b611600565b005b34801561067557600080fd5b50610690600480360381019061068b919061355c565b611662565b60405161069d9190613c3b565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c8919061345b565b6116f6565b005b3480156106db57600080fd5b506106f660048036038101906106f1919061324e565b61186f565b6040516107039190613b59565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190613225565b61196f565b005b600061074082611b18565b9050919050565b61074f611b92565b73ffffffffffffffffffffffffffffffffffffffff1661076d6113c3565b73ffffffffffffffffffffffffffffffffffffffff16146107c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ba90613e9d565b60405180910390fd5b80600f90805190602001906107d9929190612fc0565b5050565b6060600080546107ec906141e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610818906141e8565b80156108655780601f1061083a57610100808354040283529160200191610865565b820191906000526020600020905b81548152906001019060200180831161084857829003601f168201915b5050505050905090565b600061087a82611ba1565b6108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090613e7d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ff8261114b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790613efd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661098f611b92565b73ffffffffffffffffffffffffffffffffffffffff1614806109be57506109bd816109b8611b92565b61186f565b5b6109fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f490613ddd565b60405180910390fd5b610a078383611c0d565b505050565b606060006040518060600160405280600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610a8f8782878787611cc6565b610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590613edd565b60405180910390fd5b610b216001600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dcf90919063ffffffff16565b600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610b9793929190613acf565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610bcc929190613a55565b604051602081830303815290604052604051610be89190613a3e565b6000604051808303816000865af19150503d8060008114610c25576040519150601f19603f3d011682016040523d82523d6000602084013e610c2a565b606091505b509150915081610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690613cfd565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600880549050905090565b6000600b54905090565b610cdf610cd9611b92565b82611de5565b610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1590613f1d565b60405180910390fd5b610d29838383611ec3565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610d82836111fd565b8210610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613c9d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000804690508091505090565b610e31611b92565b73ffffffffffffffffffffffffffffffffffffffff16610e4f6113c3565b73ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613e9d565b60405180910390fd5b60008190507f0000000000000000000000000000000000000000000000000000000000000000811115610ef6577f000000000000000000000000000000000000000000000000000000000000000090505b600081600e54610f06919061406d565b90507f0000000000000000000000000000000000000000000000000000000000000000811115610f705760007f000000000000000000000000000000000000000000000000000000000000000082610f5e91906140c3565b90508083610f6c91906140c3565b9250505b60008211610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa90613dfd565b60405180910390fd5b60005b82811015610ff0576000610fc861211f565b9050610fd4868261213c565b610fdc61230a565b508080610fe89061424b565b915050610fb6565b5050505050565b610fff611b92565b73ffffffffffffffffffffffffffffffffffffffff1661101d6113c3565b73ffffffffffffffffffffffffffffffffffffffff1614611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90613e9d565b60405180910390fd5b61107b612324565b565b61109883838360405180602001604052806000815250611600565b505050565b60006110a7610cb7565b82106110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df90613f3d565b60405180910390fd5b60088281548110611122577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90613e3d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590613e1d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112bd611b92565b73ffffffffffffffffffffffffffffffffffffffff166112db6113c3565b73ffffffffffffffffffffffffffffffffffffffff1614611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890613e9d565b60405180910390fd5b61133b60006123c6565b565b611345611b92565b73ffffffffffffffffffffffffffffffffffffffff166113636113c3565b73ffffffffffffffffffffffffffffffffffffffff16146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090613e9d565b60405180910390fd5b6113c161248c565b565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113fc906141e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611428906141e8565b80156114755780601f1061144a57610100808354040283529160200191611475565b820191906000526020600020905b81548152906001019060200180831161145857829003601f168201915b5050505050905090565b611487611b92565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90613d5d565b60405180910390fd5b8060056000611502611b92565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115af611b92565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f49190613b59565b60405180910390a35050565b61161161160b611b92565b83611de5565b611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790613f1d565b60405180910390fd5b61165c8484848461252f565b50505050565b6060600f8054611671906141e8565b80601f016020809104026020016040519081016040528092919081815260200182805461169d906141e8565b80156116ea5780601f106116bf576101008083540402835291602001916116ea565b820191906000526020600020905b8154815290600101906020018083116116cd57829003601f168201915b50505050509050919050565b6116fe611b92565b73ffffffffffffffffffffffffffffffffffffffff1661171c6113c3565b73ffffffffffffffffffffffffffffffffffffffff1614611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990613e9d565b60405180910390fd5b60005b8282905081101561186a576117d061178b611b92565b8484848181106117c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135611de5565b61180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690613f5d565b60405180910390fd5b61185783838381811061184b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013561258b565b80806118629061424b565b915050611775565b505050565b6000807f000000000000000000000000000000000000000000000000000000000000000090508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118e59190613ab4565b60206040518083038186803b1580156118fd57600080fd5b505afa158015611911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193591906134f2565b73ffffffffffffffffffffffffffffffffffffffff16141561195b576001915050611969565b611965848461269c565b9150505b92915050565b611977611b92565b73ffffffffffffffffffffffffffffffffffffffff166119956113c3565b73ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613e9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5290613cdd565b60405180910390fd5b611a64816123c6565b50565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611b1157600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611b15565b3390505b90565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b8b5750611b8a82612730565b5b9050919050565b6000611b9c611a67565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c808361114b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90613d9d565b60405180910390fd5b6001611d4a611d4587612812565b61287a565b83868660405160008152602001604052604051611d6a9493929190613bd4565b6020604051602081039080840390855afa158015611d8c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611ddd919061406d565b905092915050565b6000611df082611ba1565b611e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2690613d7d565b60405180910390fd5b6000611e3a8361114b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ea957508373ffffffffffffffffffffffffffffffffffffffff16611e918461086f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eba5750611eb9818561186f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ee38261114b565b73ffffffffffffffffffffffffffffffffffffffff1614611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3090613ebd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090613d3d565b60405180910390fd5b611fb48383836128b3565b611fbf600082611c0d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461200f91906140c3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612066919061406d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006121376001600e54611dcf90919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a390613e5d565b60405180910390fd5b6121b581611ba1565b156121f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ec90613d1d565b60405180910390fd5b612201600083836128b3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612251919061406d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600e600081548092919061231d9061424b565b9190505550565b61232c611134565b61236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290613c7d565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123af611b92565b6040516123bc9190613ab4565b60405180910390a1565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612494611134565b156124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cb90613dbd565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612518611b92565b6040516125259190613ab4565b60405180910390a1565b61253a848484611ec3565b612546848484846128c3565b612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257c90613cbd565b60405180910390fd5b50505050565b60006125968261114b565b90506125a4816000846128b3565b6125af600083611c0d565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ff91906140c3565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061280b575061280a82612a5a565b5b9050919050565b6000604051806080016040528060438152602001614ae560439139805190602001208260000151836020015184604001518051906020012060405160200161285d9493929190613b8f565b604051602081830303815290604052805190602001209050919050565b6000612884610cc4565b82604051602001612896929190613a7d565b604051602081830303815290604052805190602001209050919050565b6128be838383612ac4565b505050565b60006128e48473ffffffffffffffffffffffffffffffffffffffff16612b1c565b15612a4d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261290d611b92565b8786866040518563ffffffff1660e01b815260040161292f9493929190613b0d565b602060405180830381600087803b15801561294957600080fd5b505af192505050801561297a57506040513d601f19601f8201168201806040525081019061297791906134c9565b60015b6129fd573d80600081146129aa576040519150601f19603f3d011682016040523d82523d6000602084013e6129af565b606091505b506000815114156129f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec90613cbd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a52565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612acf838383612b2f565b612ad7611134565b15612b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0e90613c5d565b60405180910390fd5b505050565b600080823b905060008111915050919050565b612b3a838383612c43565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7d57612b7881612c48565b612bbc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bbb57612bba8382612c91565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bff57612bfa81612dfe565b612c3e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3d57612c3c8282612f41565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c9e846111fd565b612ca891906140c3565b9050600060076000848152602001908152602001600020549050818114612d8d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e1291906140c3565b9050600060096000848152602001908152602001600020549050600060088381548110612e68577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612eb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f25577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f4c836111fd565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612fcc906141e8565b90600052602060002090601f016020900481019282612fee5760008555613035565b82601f1061300757805160ff1916838001178555613035565b82800160010185558215613035579182015b82811115613034578251825591602001919060010190613019565b5b5090506130429190613046565b5090565b5b8082111561305f576000816000905550600101613047565b5090565b600061307661307184613fbd565b613f98565b90508281526020810184848401111561308e57600080fd5b6130998482856141a6565b509392505050565b60006130b46130af84613fee565b613f98565b9050828152602081018484840111156130cc57600080fd5b6130d78482856141a6565b509392505050565b6000813590506130ee81614a43565b92915050565b60008083601f84011261310657600080fd5b8235905067ffffffffffffffff81111561311f57600080fd5b60208301915083602082028301111561313757600080fd5b9250929050565b60008135905061314d81614a5a565b92915050565b60008135905061316281614a71565b92915050565b60008135905061317781614a88565b92915050565b60008151905061318c81614a88565b92915050565b600082601f8301126131a357600080fd5b81356131b3848260208601613063565b91505092915050565b6000815190506131cb81614a9f565b92915050565b600082601f8301126131e257600080fd5b81356131f28482602086016130a1565b91505092915050565b60008135905061320a81614ab6565b92915050565b60008135905061321f81614acd565b92915050565b60006020828403121561323757600080fd5b6000613245848285016130df565b91505092915050565b6000806040838503121561326157600080fd5b600061326f858286016130df565b9250506020613280858286016130df565b9150509250929050565b60008060006060848603121561329f57600080fd5b60006132ad868287016130df565b93505060206132be868287016130df565b92505060406132cf868287016131fb565b9150509250925092565b600080600080608085870312156132ef57600080fd5b60006132fd878288016130df565b945050602061330e878288016130df565b935050604061331f878288016131fb565b925050606085013567ffffffffffffffff81111561333c57600080fd5b61334887828801613192565b91505092959194509250565b6000806040838503121561336757600080fd5b6000613375858286016130df565b92505060206133868582860161313e565b9150509250929050565b600080600080600060a086880312156133a857600080fd5b60006133b6888289016130df565b955050602086013567ffffffffffffffff8111156133d357600080fd5b6133df88828901613192565b94505060406133f088828901613153565b935050606061340188828901613153565b925050608061341288828901613210565b9150509295509295909350565b6000806040838503121561343257600080fd5b6000613440858286016130df565b9250506020613451858286016131fb565b9150509250929050565b6000806020838503121561346e57600080fd5b600083013567ffffffffffffffff81111561348857600080fd5b613494858286016130f4565b92509250509250929050565b6000602082840312156134b257600080fd5b60006134c084828501613168565b91505092915050565b6000602082840312156134db57600080fd5b60006134e98482850161317d565b91505092915050565b60006020828403121561350457600080fd5b6000613512848285016131bc565b91505092915050565b60006020828403121561352d57600080fd5b600082013567ffffffffffffffff81111561354757600080fd5b613553848285016131d1565b91505092915050565b60006020828403121561356e57600080fd5b600061357c848285016131fb565b91505092915050565b61358e81614109565b82525050565b61359d816140f7565b82525050565b6135b46135af826140f7565b614294565b82525050565b6135c38161411b565b82525050565b6135d281614127565b82525050565b6135e96135e482614127565b6142a6565b82525050565b60006135fa8261401f565b6136048185614035565b93506136148185602086016141b5565b61361d8161434f565b840191505092915050565b60006136338261401f565b61363d8185614046565b935061364d8185602086016141b5565b80840191505092915050565b60006136648261402a565b61366e8185614051565b935061367e8185602086016141b5565b6136878161434f565b840191505092915050565b600061369f602b83614051565b91506136aa8261436d565b604082019050919050565b60006136c2601483614051565b91506136cd826143bc565b602082019050919050565b60006136e5602b83614051565b91506136f0826143e5565b604082019050919050565b6000613708603283614051565b915061371382614434565b604082019050919050565b600061372b602683614051565b915061373682614483565b604082019050919050565b600061374e601c83614051565b9150613759826144d2565b602082019050919050565b6000613771601c83614051565b915061377c826144fb565b602082019050919050565b6000613794600283614062565b915061379f82614524565b600282019050919050565b60006137b7602483614051565b91506137c28261454d565b604082019050919050565b60006137da601983614051565b91506137e58261459c565b602082019050919050565b60006137fd602c83614051565b9150613808826145c5565b604082019050919050565b6000613820602583614051565b915061382b82614614565b604082019050919050565b6000613843601083614051565b915061384e82614663565b602082019050919050565b6000613866603883614051565b91506138718261468c565b604082019050919050565b6000613889602983614051565b9150613894826146db565b604082019050919050565b60006138ac602a83614051565b91506138b78261472a565b604082019050919050565b60006138cf602983614051565b91506138da82614779565b604082019050919050565b60006138f2602083614051565b91506138fd826147c8565b602082019050919050565b6000613915602c83614051565b9150613920826147f1565b604082019050919050565b6000613938602083614051565b915061394382614840565b602082019050919050565b600061395b602983614051565b915061396682614869565b604082019050919050565b600061397e602183614051565b9150613989826148b8565b604082019050919050565b60006139a1602183614051565b91506139ac82614907565b604082019050919050565b60006139c4603183614051565b91506139cf82614956565b604082019050919050565b60006139e7602c83614051565b91506139f2826149a5565b604082019050919050565b6000613a0a603083614051565b9150613a15826149f4565b604082019050919050565b613a298161418f565b82525050565b613a3881614199565b82525050565b6000613a4a8284613628565b915081905092915050565b6000613a618285613628565b9150613a6d82846135a3565b6014820191508190509392505050565b6000613a8882613787565b9150613a9482856135d8565b602082019150613aa482846135d8565b6020820191508190509392505050565b6000602082019050613ac96000830184613594565b92915050565b6000606082019050613ae46000830186613594565b613af16020830185613585565b8181036040830152613b0381846135ef565b9050949350505050565b6000608082019050613b226000830187613594565b613b2f6020830186613594565b613b3c6040830185613a20565b8181036060830152613b4e81846135ef565b905095945050505050565b6000602082019050613b6e60008301846135ba565b92915050565b6000602082019050613b8960008301846135c9565b92915050565b6000608082019050613ba460008301876135c9565b613bb16020830186613a20565b613bbe6040830185613594565b613bcb60608301846135c9565b95945050505050565b6000608082019050613be960008301876135c9565b613bf66020830186613a2f565b613c0360408301856135c9565b613c1060608301846135c9565b95945050505050565b60006020820190508181036000830152613c3381846135ef565b905092915050565b60006020820190508181036000830152613c558184613659565b905092915050565b60006020820190508181036000830152613c7681613692565b9050919050565b60006020820190508181036000830152613c96816136b5565b9050919050565b60006020820190508181036000830152613cb6816136d8565b9050919050565b60006020820190508181036000830152613cd6816136fb565b9050919050565b60006020820190508181036000830152613cf68161371e565b9050919050565b60006020820190508181036000830152613d1681613741565b9050919050565b60006020820190508181036000830152613d3681613764565b9050919050565b60006020820190508181036000830152613d56816137aa565b9050919050565b60006020820190508181036000830152613d76816137cd565b9050919050565b60006020820190508181036000830152613d96816137f0565b9050919050565b60006020820190508181036000830152613db681613813565b9050919050565b60006020820190508181036000830152613dd681613836565b9050919050565b60006020820190508181036000830152613df681613859565b9050919050565b60006020820190508181036000830152613e168161387c565b9050919050565b60006020820190508181036000830152613e368161389f565b9050919050565b60006020820190508181036000830152613e56816138c2565b9050919050565b60006020820190508181036000830152613e76816138e5565b9050919050565b60006020820190508181036000830152613e9681613908565b9050919050565b60006020820190508181036000830152613eb68161392b565b9050919050565b60006020820190508181036000830152613ed68161394e565b9050919050565b60006020820190508181036000830152613ef681613971565b9050919050565b60006020820190508181036000830152613f1681613994565b9050919050565b60006020820190508181036000830152613f36816139b7565b9050919050565b60006020820190508181036000830152613f56816139da565b9050919050565b60006020820190508181036000830152613f76816139fd565b9050919050565b6000602082019050613f926000830184613a20565b92915050565b6000613fa2613fb3565b9050613fae828261421a565b919050565b6000604051905090565b600067ffffffffffffffff821115613fd857613fd7614320565b5b613fe18261434f565b9050602081019050919050565b600067ffffffffffffffff82111561400957614008614320565b5b6140128261434f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140788261418f565b91506140838361418f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140b8576140b76142c2565b5b828201905092915050565b60006140ce8261418f565b91506140d98361418f565b9250828210156140ec576140eb6142c2565b5b828203905092915050565b60006141028261416f565b9050919050565b60006141148261416f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614168826140f7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156141d35780820151818401526020810190506141b8565b838111156141e2576000848401525b50505050565b6000600282049050600182168061420057607f821691505b60208210811415614214576142136142f1565b5b50919050565b6142238261434f565b810181811067ffffffffffffffff8211171561424257614241614320565b5b80604052505050565b60006142568261418f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614289576142886142c2565b5b600182019050919050565b600061429f826142b0565b9050919050565b6000819050919050565b60006142bb82614360565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f467574757265417274476f6c645061737365733a206e6f206d6f7265206e667460008201527f7320746f206d696e740000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b614a4c816140f7565b8114614a5757600080fd5b50565b614a638161411b565b8114614a6e57600080fd5b50565b614a7a81614127565b8114614a8557600080fd5b50565b614a9181614131565b8114614a9c57600080fd5b50565b614aa88161415d565b8114614ab357600080fd5b50565b614abf8161418f565b8114614aca57600080fd5b50565b614ad681614199565b8114614ae157600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212205bc0b40b08b38728c73357dba2b5a3d53bd92295f3e81c3585487557c29b544f64736f6c63430008040033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000c467574757265506173736573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6436677341416e6336764d4c346475586b777478576a70597659394b67657768694639536a5052553373617a00000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806342842e0e116100f75780638da5cb5b11610095578063c87b56dd11610064578063c87b56dd14610669578063e4623c1b146106a6578063e985e9c5146106cf578063f2fde38b1461070c576101cd565b80638da5cb5b146105c157806395d89b41146105ec578063a22cb46514610617578063b88d4fde14610640576101cd565b80636352211e116100d15780636352211e1461051957806370a0823114610556578063715018a6146105935780638456cb59146105aa576101cd565b806342842e0e146104885780634f6ccce7146104b15780635c975abb146104ee576101cd565b806318160ddd1161016f5780632f745c591161013e5780632f745c59146103e05780633408e4701461041d5780633428aec8146104485780633f4ba83a14610471576101cd565b806318160ddd1461032457806320379ee51461034f57806323b872dd1461037a5780632d0335ab146103a3576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a05780630c53c51c146102c95780630f7e5970146102f9576101cd565b806301ffc9a7146101d257806302fe53051461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906134a0565b610735565b6040516102069190613b59565b60405180910390f35b34801561021b57600080fd5b506102366004803603810190610231919061351b565b610747565b005b34801561024457600080fd5b5061024d6107dd565b60405161025a9190613c3b565b60405180910390f35b34801561026f57600080fd5b5061028a6004803603810190610285919061355c565b61086f565b6040516102979190613ab4565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c2919061341f565b6108f4565b005b6102e360048036038101906102de9190613390565b610a0c565b6040516102f09190613c19565b60405180910390f35b34801561030557600080fd5b5061030e610c7e565b60405161031b9190613c3b565b60405180910390f35b34801561033057600080fd5b50610339610cb7565b6040516103469190613f7d565b60405180910390f35b34801561035b57600080fd5b50610364610cc4565b6040516103719190613b74565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c919061328a565b610cce565b005b3480156103af57600080fd5b506103ca60048036038101906103c59190613225565b610d2e565b6040516103d79190613f7d565b60405180910390f35b3480156103ec57600080fd5b506104076004803603810190610402919061341f565b610d77565b6040516104149190613f7d565b60405180910390f35b34801561042957600080fd5b50610432610e1c565b60405161043f9190613f7d565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a919061341f565b610e29565b005b34801561047d57600080fd5b50610486610ff7565b005b34801561049457600080fd5b506104af60048036038101906104aa919061328a565b61107d565b005b3480156104bd57600080fd5b506104d860048036038101906104d3919061355c565b61109d565b6040516104e59190613f7d565b60405180910390f35b3480156104fa57600080fd5b50610503611134565b6040516105109190613b59565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b919061355c565b61114b565b60405161054d9190613ab4565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190613225565b6111fd565b60405161058a9190613f7d565b60405180910390f35b34801561059f57600080fd5b506105a86112b5565b005b3480156105b657600080fd5b506105bf61133d565b005b3480156105cd57600080fd5b506105d66113c3565b6040516105e39190613ab4565b60405180910390f35b3480156105f857600080fd5b506106016113ed565b60405161060e9190613c3b565b60405180910390f35b34801561062357600080fd5b5061063e60048036038101906106399190613354565b61147f565b005b34801561064c57600080fd5b50610667600480360381019061066291906132d9565b611600565b005b34801561067557600080fd5b50610690600480360381019061068b919061355c565b611662565b60405161069d9190613c3b565b60405180910390f35b3480156106b257600080fd5b506106cd60048036038101906106c8919061345b565b6116f6565b005b3480156106db57600080fd5b506106f660048036038101906106f1919061324e565b61186f565b6040516107039190613b59565b60405180910390f35b34801561071857600080fd5b50610733600480360381019061072e9190613225565b61196f565b005b600061074082611b18565b9050919050565b61074f611b92565b73ffffffffffffffffffffffffffffffffffffffff1661076d6113c3565b73ffffffffffffffffffffffffffffffffffffffff16146107c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ba90613e9d565b60405180910390fd5b80600f90805190602001906107d9929190612fc0565b5050565b6060600080546107ec906141e8565b80601f0160208091040260200160405190810160405280929190818152602001828054610818906141e8565b80156108655780601f1061083a57610100808354040283529160200191610865565b820191906000526020600020905b81548152906001019060200180831161084857829003601f168201915b5050505050905090565b600061087a82611ba1565b6108b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b090613e7d565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108ff8261114b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610970576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096790613efd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661098f611b92565b73ffffffffffffffffffffffffffffffffffffffff1614806109be57506109bd816109b8611b92565b61186f565b5b6109fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f490613ddd565b60405180910390fd5b610a078383611c0d565b505050565b606060006040518060600160405280600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610a8f8782878787611cc6565b610ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac590613edd565b60405180910390fd5b610b216001600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611dcf90919063ffffffff16565b600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610b9793929190613acf565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610bcc929190613a55565b604051602081830303815290604052604051610be89190613a3e565b6000604051808303816000865af19150503d8060008114610c25576040519150601f19603f3d011682016040523d82523d6000602084013e610c2a565b606091505b509150915081610c6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6690613cfd565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b6000600880549050905090565b6000600b54905090565b610cdf610cd9611b92565b82611de5565b610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1590613f1d565b60405180910390fd5b610d29838383611ec3565b505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610d82836111fd565b8210610dc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dba90613c9d565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000804690508091505090565b610e31611b92565b73ffffffffffffffffffffffffffffffffffffffff16610e4f6113c3565b73ffffffffffffffffffffffffffffffffffffffff1614610ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9c90613e9d565b60405180910390fd5b60008190507f000000000000000000000000000000000000000000000000000000000000012c811115610ef6577f000000000000000000000000000000000000000000000000000000000000012c90505b600081600e54610f06919061406d565b90507f000000000000000000000000000000000000000000000000000000000000012c811115610f705760007f000000000000000000000000000000000000000000000000000000000000012c82610f5e91906140c3565b90508083610f6c91906140c3565b9250505b60008211610fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610faa90613dfd565b60405180910390fd5b60005b82811015610ff0576000610fc861211f565b9050610fd4868261213c565b610fdc61230a565b508080610fe89061424b565b915050610fb6565b5050505050565b610fff611b92565b73ffffffffffffffffffffffffffffffffffffffff1661101d6113c3565b73ffffffffffffffffffffffffffffffffffffffff1614611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a90613e9d565b60405180910390fd5b61107b612324565b565b61109883838360405180602001604052806000815250611600565b505050565b60006110a7610cb7565b82106110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df90613f3d565b60405180910390fd5b60088281548110611122577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000600a60009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111eb90613e3d565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561126e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126590613e1d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112bd611b92565b73ffffffffffffffffffffffffffffffffffffffff166112db6113c3565b73ffffffffffffffffffffffffffffffffffffffff1614611331576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132890613e9d565b60405180910390fd5b61133b60006123c6565b565b611345611b92565b73ffffffffffffffffffffffffffffffffffffffff166113636113c3565b73ffffffffffffffffffffffffffffffffffffffff16146113b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b090613e9d565b60405180910390fd5b6113c161248c565b565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546113fc906141e8565b80601f0160208091040260200160405190810160405280929190818152602001828054611428906141e8565b80156114755780601f1061144a57610100808354040283529160200191611475565b820191906000526020600020905b81548152906001019060200180831161145857829003601f168201915b5050505050905090565b611487611b92565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90613d5d565b60405180910390fd5b8060056000611502611b92565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166115af611b92565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115f49190613b59565b60405180910390a35050565b61161161160b611b92565b83611de5565b611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790613f1d565b60405180910390fd5b61165c8484848461252f565b50505050565b6060600f8054611671906141e8565b80601f016020809104026020016040519081016040528092919081815260200182805461169d906141e8565b80156116ea5780601f106116bf576101008083540402835291602001916116ea565b820191906000526020600020905b8154815290600101906020018083116116cd57829003601f168201915b50505050509050919050565b6116fe611b92565b73ffffffffffffffffffffffffffffffffffffffff1661171c6113c3565b73ffffffffffffffffffffffffffffffffffffffff1614611772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176990613e9d565b60405180910390fd5b60005b8282905081101561186a576117d061178b611b92565b8484848181106117c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020135611de5565b61180f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180690613f5d565b60405180910390fd5b61185783838381811061184b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002013561258b565b80806118629061424b565b915050611775565b505050565b6000807f000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c190508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b81526004016118e59190613ab4565b60206040518083038186803b1580156118fd57600080fd5b505afa158015611911573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193591906134f2565b73ffffffffffffffffffffffffffffffffffffffff16141561195b576001915050611969565b611965848461269c565b9150505b92915050565b611977611b92565b73ffffffffffffffffffffffffffffffffffffffff166119956113c3565b73ffffffffffffffffffffffffffffffffffffffff16146119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613e9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5290613cdd565b60405180910390fd5b611a64816123c6565b50565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611b1157600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611b15565b3390505b90565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b8b5750611b8a82612730565b5b9050919050565b6000611b9c611a67565b905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c808361114b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90613d9d565b60405180910390fd5b6001611d4a611d4587612812565b61287a565b83868660405160008152602001604052604051611d6a9493929190613bd4565b6020604051602081039080840390855afa158015611d8c573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b60008183611ddd919061406d565b905092915050565b6000611df082611ba1565b611e2f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2690613d7d565b60405180910390fd5b6000611e3a8361114b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ea957508373ffffffffffffffffffffffffffffffffffffffff16611e918461086f565b73ffffffffffffffffffffffffffffffffffffffff16145b80611eba5750611eb9818561186f565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611ee38261114b565b73ffffffffffffffffffffffffffffffffffffffff1614611f39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3090613ebd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa090613d3d565b60405180910390fd5b611fb48383836128b3565b611fbf600082611c0d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461200f91906140c3565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612066919061406d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006121376001600e54611dcf90919063ffffffff16565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a390613e5d565b60405180910390fd5b6121b581611ba1565b156121f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ec90613d1d565b60405180910390fd5b612201600083836128b3565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612251919061406d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600e600081548092919061231d9061424b565b9190505550565b61232c611134565b61236b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236290613c7d565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123af611b92565b6040516123bc9190613ab4565b60405180910390a1565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612494611134565b156124d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124cb90613dbd565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612518611b92565b6040516125259190613ab4565b60405180910390a1565b61253a848484611ec3565b612546848484846128c3565b612585576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257c90613cbd565b60405180910390fd5b50505050565b60006125968261114b565b90506125a4816000846128b3565b6125af600083611c0d565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125ff91906140c3565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127fb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061280b575061280a82612a5a565b5b9050919050565b6000604051806080016040528060438152602001614ae560439139805190602001208260000151836020015184604001518051906020012060405160200161285d9493929190613b8f565b604051602081830303815290604052805190602001209050919050565b6000612884610cc4565b82604051602001612896929190613a7d565b604051602081830303815290604052805190602001209050919050565b6128be838383612ac4565b505050565b60006128e48473ffffffffffffffffffffffffffffffffffffffff16612b1c565b15612a4d578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261290d611b92565b8786866040518563ffffffff1660e01b815260040161292f9493929190613b0d565b602060405180830381600087803b15801561294957600080fd5b505af192505050801561297a57506040513d601f19601f8201168201806040525081019061297791906134c9565b60015b6129fd573d80600081146129aa576040519150601f19603f3d011682016040523d82523d6000602084013e6129af565b606091505b506000815114156129f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ec90613cbd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a52565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612acf838383612b2f565b612ad7611134565b15612b17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0e90613c5d565b60405180910390fd5b505050565b600080823b905060008111915050919050565b612b3a838383612c43565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b7d57612b7881612c48565b612bbc565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612bbb57612bba8382612c91565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bff57612bfa81612dfe565b612c3e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612c3d57612c3c8282612f41565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c9e846111fd565b612ca891906140c3565b9050600060076000848152602001908152602001600020549050818114612d8d576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e1291906140c3565b9050600060096000848152602001908152602001600020549050600060088381548110612e68577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612eb0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f25577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f4c836111fd565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b828054612fcc906141e8565b90600052602060002090601f016020900481019282612fee5760008555613035565b82601f1061300757805160ff1916838001178555613035565b82800160010185558215613035579182015b82811115613034578251825591602001919060010190613019565b5b5090506130429190613046565b5090565b5b8082111561305f576000816000905550600101613047565b5090565b600061307661307184613fbd565b613f98565b90508281526020810184848401111561308e57600080fd5b6130998482856141a6565b509392505050565b60006130b46130af84613fee565b613f98565b9050828152602081018484840111156130cc57600080fd5b6130d78482856141a6565b509392505050565b6000813590506130ee81614a43565b92915050565b60008083601f84011261310657600080fd5b8235905067ffffffffffffffff81111561311f57600080fd5b60208301915083602082028301111561313757600080fd5b9250929050565b60008135905061314d81614a5a565b92915050565b60008135905061316281614a71565b92915050565b60008135905061317781614a88565b92915050565b60008151905061318c81614a88565b92915050565b600082601f8301126131a357600080fd5b81356131b3848260208601613063565b91505092915050565b6000815190506131cb81614a9f565b92915050565b600082601f8301126131e257600080fd5b81356131f28482602086016130a1565b91505092915050565b60008135905061320a81614ab6565b92915050565b60008135905061321f81614acd565b92915050565b60006020828403121561323757600080fd5b6000613245848285016130df565b91505092915050565b6000806040838503121561326157600080fd5b600061326f858286016130df565b9250506020613280858286016130df565b9150509250929050565b60008060006060848603121561329f57600080fd5b60006132ad868287016130df565b93505060206132be868287016130df565b92505060406132cf868287016131fb565b9150509250925092565b600080600080608085870312156132ef57600080fd5b60006132fd878288016130df565b945050602061330e878288016130df565b935050604061331f878288016131fb565b925050606085013567ffffffffffffffff81111561333c57600080fd5b61334887828801613192565b91505092959194509250565b6000806040838503121561336757600080fd5b6000613375858286016130df565b92505060206133868582860161313e565b9150509250929050565b600080600080600060a086880312156133a857600080fd5b60006133b6888289016130df565b955050602086013567ffffffffffffffff8111156133d357600080fd5b6133df88828901613192565b94505060406133f088828901613153565b935050606061340188828901613153565b925050608061341288828901613210565b9150509295509295909350565b6000806040838503121561343257600080fd5b6000613440858286016130df565b9250506020613451858286016131fb565b9150509250929050565b6000806020838503121561346e57600080fd5b600083013567ffffffffffffffff81111561348857600080fd5b613494858286016130f4565b92509250509250929050565b6000602082840312156134b257600080fd5b60006134c084828501613168565b91505092915050565b6000602082840312156134db57600080fd5b60006134e98482850161317d565b91505092915050565b60006020828403121561350457600080fd5b6000613512848285016131bc565b91505092915050565b60006020828403121561352d57600080fd5b600082013567ffffffffffffffff81111561354757600080fd5b613553848285016131d1565b91505092915050565b60006020828403121561356e57600080fd5b600061357c848285016131fb565b91505092915050565b61358e81614109565b82525050565b61359d816140f7565b82525050565b6135b46135af826140f7565b614294565b82525050565b6135c38161411b565b82525050565b6135d281614127565b82525050565b6135e96135e482614127565b6142a6565b82525050565b60006135fa8261401f565b6136048185614035565b93506136148185602086016141b5565b61361d8161434f565b840191505092915050565b60006136338261401f565b61363d8185614046565b935061364d8185602086016141b5565b80840191505092915050565b60006136648261402a565b61366e8185614051565b935061367e8185602086016141b5565b6136878161434f565b840191505092915050565b600061369f602b83614051565b91506136aa8261436d565b604082019050919050565b60006136c2601483614051565b91506136cd826143bc565b602082019050919050565b60006136e5602b83614051565b91506136f0826143e5565b604082019050919050565b6000613708603283614051565b915061371382614434565b604082019050919050565b600061372b602683614051565b915061373682614483565b604082019050919050565b600061374e601c83614051565b9150613759826144d2565b602082019050919050565b6000613771601c83614051565b915061377c826144fb565b602082019050919050565b6000613794600283614062565b915061379f82614524565b600282019050919050565b60006137b7602483614051565b91506137c28261454d565b604082019050919050565b60006137da601983614051565b91506137e58261459c565b602082019050919050565b60006137fd602c83614051565b9150613808826145c5565b604082019050919050565b6000613820602583614051565b915061382b82614614565b604082019050919050565b6000613843601083614051565b915061384e82614663565b602082019050919050565b6000613866603883614051565b91506138718261468c565b604082019050919050565b6000613889602983614051565b9150613894826146db565b604082019050919050565b60006138ac602a83614051565b91506138b78261472a565b604082019050919050565b60006138cf602983614051565b91506138da82614779565b604082019050919050565b60006138f2602083614051565b91506138fd826147c8565b602082019050919050565b6000613915602c83614051565b9150613920826147f1565b604082019050919050565b6000613938602083614051565b915061394382614840565b602082019050919050565b600061395b602983614051565b915061396682614869565b604082019050919050565b600061397e602183614051565b9150613989826148b8565b604082019050919050565b60006139a1602183614051565b91506139ac82614907565b604082019050919050565b60006139c4603183614051565b91506139cf82614956565b604082019050919050565b60006139e7602c83614051565b91506139f2826149a5565b604082019050919050565b6000613a0a603083614051565b9150613a15826149f4565b604082019050919050565b613a298161418f565b82525050565b613a3881614199565b82525050565b6000613a4a8284613628565b915081905092915050565b6000613a618285613628565b9150613a6d82846135a3565b6014820191508190509392505050565b6000613a8882613787565b9150613a9482856135d8565b602082019150613aa482846135d8565b6020820191508190509392505050565b6000602082019050613ac96000830184613594565b92915050565b6000606082019050613ae46000830186613594565b613af16020830185613585565b8181036040830152613b0381846135ef565b9050949350505050565b6000608082019050613b226000830187613594565b613b2f6020830186613594565b613b3c6040830185613a20565b8181036060830152613b4e81846135ef565b905095945050505050565b6000602082019050613b6e60008301846135ba565b92915050565b6000602082019050613b8960008301846135c9565b92915050565b6000608082019050613ba460008301876135c9565b613bb16020830186613a20565b613bbe6040830185613594565b613bcb60608301846135c9565b95945050505050565b6000608082019050613be960008301876135c9565b613bf66020830186613a2f565b613c0360408301856135c9565b613c1060608301846135c9565b95945050505050565b60006020820190508181036000830152613c3381846135ef565b905092915050565b60006020820190508181036000830152613c558184613659565b905092915050565b60006020820190508181036000830152613c7681613692565b9050919050565b60006020820190508181036000830152613c96816136b5565b9050919050565b60006020820190508181036000830152613cb6816136d8565b9050919050565b60006020820190508181036000830152613cd6816136fb565b9050919050565b60006020820190508181036000830152613cf68161371e565b9050919050565b60006020820190508181036000830152613d1681613741565b9050919050565b60006020820190508181036000830152613d3681613764565b9050919050565b60006020820190508181036000830152613d56816137aa565b9050919050565b60006020820190508181036000830152613d76816137cd565b9050919050565b60006020820190508181036000830152613d96816137f0565b9050919050565b60006020820190508181036000830152613db681613813565b9050919050565b60006020820190508181036000830152613dd681613836565b9050919050565b60006020820190508181036000830152613df681613859565b9050919050565b60006020820190508181036000830152613e168161387c565b9050919050565b60006020820190508181036000830152613e368161389f565b9050919050565b60006020820190508181036000830152613e56816138c2565b9050919050565b60006020820190508181036000830152613e76816138e5565b9050919050565b60006020820190508181036000830152613e9681613908565b9050919050565b60006020820190508181036000830152613eb68161392b565b9050919050565b60006020820190508181036000830152613ed68161394e565b9050919050565b60006020820190508181036000830152613ef681613971565b9050919050565b60006020820190508181036000830152613f1681613994565b9050919050565b60006020820190508181036000830152613f36816139b7565b9050919050565b60006020820190508181036000830152613f56816139da565b9050919050565b60006020820190508181036000830152613f76816139fd565b9050919050565b6000602082019050613f926000830184613a20565b92915050565b6000613fa2613fb3565b9050613fae828261421a565b919050565b6000604051905090565b600067ffffffffffffffff821115613fd857613fd7614320565b5b613fe18261434f565b9050602081019050919050565b600067ffffffffffffffff82111561400957614008614320565b5b6140128261434f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140788261418f565b91506140838361418f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140b8576140b76142c2565b5b828201905092915050565b60006140ce8261418f565b91506140d98361418f565b9250828210156140ec576140eb6142c2565b5b828203905092915050565b60006141028261416f565b9050919050565b60006141148261416f565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614168826140f7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156141d35780820151818401526020810190506141b8565b838111156141e2576000848401525b50505050565b6000600282049050600182168061420057607f821691505b60208210811415614214576142136142f1565b5b50919050565b6142238261434f565b810181811067ffffffffffffffff8211171561424257614241614320565b5b80604052505050565b60006142568261418f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614289576142886142c2565b5b600182019050919050565b600061429f826142b0565b9050919050565b6000819050919050565b60006142bb82614360565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f467574757265417274476f6c645061737365733a206e6f206d6f7265206e667460008201527f7320746f206d696e740000000000000000000000000000000000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b614a4c816140f7565b8114614a5757600080fd5b50565b614a638161411b565b8114614a6e57600080fd5b50565b614a7a81614127565b8114614a8557600080fd5b50565b614a9181614131565b8114614a9c57600080fd5b50565b614aa88161415d565b8114614ab357600080fd5b50565b614abf8161418f565b8114614aca57600080fd5b50565b614ad681614199565b8114614ae157600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212205bc0b40b08b38728c73357dba2b5a3d53bd92295f3e81c3585487557c29b544f64736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000c467574757265506173736573000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000024650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d6436677341416e6336764d4c346475586b777478576a70597659394b67657768694639536a5052553373617a00000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): FuturePasses
Arg [1] : _symbol (string): FP
Arg [2] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [3] : _URI (string): https://gateway.pinata.cloud/ipfs/Qmd6gsAAnc6vML4duXkwtxWjpYvY9KgewhiF9SjPRU3saz

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [5] : 4675747572655061737365730000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 4650000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [9] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [10] : 732f516d6436677341416e6336764d4c346475586b777478576a70597659394b
Arg [11] : 67657768694639536a5052553373617a00000000000000000000000000000000


Deployed Bytecode Sourcemap

58139:4358:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61491:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60802:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20828:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22387:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21910:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55667:1151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52927:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37292:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53936:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23277:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57244:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36960:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54045:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58973:771;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61877:73;;;;;;;;;;;;;:::i;:::-;;23687:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37482:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32994:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20522:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20252:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44366:94;;;;;;;;;;;;;:::i;:::-;;61739:69;;;;;;;;;;;;;:::i;:::-;;43715:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20997:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22680:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23943:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60626:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59890:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61023:460;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44615:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61491:179;61602:4;61626:36;61650:11;61626:23;:36::i;:::-;61619:43;;61491:179;;;:::o;60802:89::-;43946:12;:10;:12::i;:::-;43935:23;;:7;:5;:7::i;:::-;:23;;;43927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60876:7:::1;60869:4;:14;;;;;;;;;;;;:::i;:::-;;60802:89:::0;:::o;20828:100::-;20882:13;20915:5;20908:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20828:100;:::o;22387:221::-;22463:7;22491:16;22499:7;22491;:16::i;:::-;22483:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22576:15;:24;22592:7;22576:24;;;;;;;;;;;;;;;;;;;;;22569:31;;22387:221;;;:::o;21910:411::-;21991:13;22007:23;22022:7;22007:14;:23::i;:::-;21991:39;;22055:5;22049:11;;:2;:11;;;;22041:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22149:5;22133:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22158:37;22175:5;22182:12;:10;:12::i;:::-;22158:16;:37::i;:::-;22133:62;22111:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22292:21;22301:2;22305:7;22292:8;:21::i;:::-;21910:411;;;:::o;55667:1151::-;55868:12;55893:29;55925:152;;;;;;;;55963:6;:19;55970:11;55963:19;;;;;;;;;;;;;;;;55925:152;;;;56003:11;55925:152;;;;;;56048:17;55925:152;;;55893:184;;56112:45;56119:11;56132:6;56140:4;56146;56152;56112:6;:45::i;:::-;56090:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;56307:26;56331:1;56307:6;:19;56314:11;56307:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;56285:6;:19;56292:11;56285:19;;;;;;;;;;;;;;;:48;;;;56351:126;56389:11;56423:10;56449:17;56351:126;;;;;;;;:::i;:::-;;;;;;;;56588:12;56602:23;56637:4;56629:18;;56679:17;56698:11;56662:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56629:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56587:134;;;;56740:7;56732:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;56800:10;56793:17;;;;;55667:1151;;;;;;;:::o;52927:43::-;;;;;;;;;;;;;;;;;;;:::o;37292:113::-;37353:7;37380:10;:17;;;;37373:24;;37292:113;:::o;53936:101::-;53987:7;54014:15;;54007:22;;53936:101;:::o;23277:339::-;23472:41;23491:12;:10;:12::i;:::-;23505:7;23472:18;:41::i;:::-;23464:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23580:28;23590:4;23596:2;23600:7;23580:9;:28::i;:::-;23277:339;;;:::o;57244:107::-;57297:13;57331:6;:12;57338:4;57331:12;;;;;;;;;;;;;;;;57323:20;;57244:107;;;:::o;36960:256::-;37057:7;37093:23;37110:5;37093:16;:23::i;:::-;37085:5;:31;37077:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37182:12;:19;37195:5;37182:19;;;;;;;;;;;;;;;:26;37202:5;37182:26;;;;;;;;;;;;37175:33;;36960:256;;;;:::o;54045:161::-;54088:7;54108:10;54159:9;54153:15;;54196:2;54189:9;;;54045:161;:::o;58973:771::-;43946:12;:10;:12::i;:::-;43935:23;;:7;:5;:7::i;:::-;:23;;;43927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59087:19:::1;59109:11;59087:33;;59192:8;59178:11;:22;59174:77;;;59231:8;59217:22;;59174:77;59261:14;59296:11;59278:15;;:29;;;;:::i;:::-;59261:46;;59362:8;59353:6;:17;59349:120;;;59387:14;59413:8;59404:6;:17;;;;:::i;:::-;59387:34;;59451:6;59436:21;;;;;:::i;:::-;;;59349:120;;59501:1;59487:11;:15;59479:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;59564:9;59559:178;59583:11;59579:1;:15;59559:178;;;59616:18;59637:17;:15;:17::i;:::-;59616:38;;59669:22;59675:3;59680:10;59669:5;:22::i;:::-;59706:19;:17;:19::i;:::-;59559:178;59596:3;;;;;:::i;:::-;;;;59559:178;;;;44006:1;;58973:771:::0;;:::o;61877:73::-;43946:12;:10;:12::i;:::-;43935:23;;:7;:5;:7::i;:::-;:23;;;43927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61932:10:::1;:8;:10::i;:::-;61877:73::o:0;23687:185::-;23825:39;23842:4;23848:2;23852:7;23825:39;;;;;;;;;;;;:16;:39::i;:::-;23687:185;;;:::o;37482:233::-;37557:7;37593:30;:28;:30::i;:::-;37585:5;:38;37577:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37690:10;37701:5;37690:17;;;;;;;;;;;;;;;;;;;;;;;;37683:24;;37482:233;;;:::o;32994:86::-;33041:4;33065:7;;;;;;;;;;;33058:14;;32994:86;:::o;20522:239::-;20594:7;20614:13;20630:7;:16;20638:7;20630:16;;;;;;;;;;;;;;;;;;;;;20614:32;;20682:1;20665:19;;:5;:19;;;;20657:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20748:5;20741:12;;;20522:239;;;:::o;20252:208::-;20324:7;20369:1;20352:19;;:5;:19;;;;20344:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20436:9;:16;20446:5;20436:16;;;;;;;;;;;;;;;;20429:23;;20252:208;;;:::o;44366:94::-;43946:12;:10;:12::i;:::-;43935:23;;:7;:5;:7::i;:::-;:23;;;43927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44431:21:::1;44449:1;44431:9;:21::i;:::-;44366:94::o:0;61739:69::-;43946:12;:10;:12::i;:::-;43935:23;;:7;:5;:7::i;:::-;:23;;;43927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61792:8:::1;:6;:8::i;:::-;61739:69::o:0;43715:87::-;43761:7;43788:6;;;;;;;;;;;43781:13;;43715:87;:::o;20997:104::-;21053:13;21086:7;21079:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20997:104;:::o;22680:295::-;22795:12;:10;:12::i;:::-;22783:24;;:8;:24;;;;22775:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22895:8;22850:18;:32;22869:12;:10;:12::i;:::-;22850:32;;;;;;;;;;;;;;;:42;22883:8;22850:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22948:8;22919:48;;22934:12;:10;:12::i;:::-;22919:48;;;22958:8;22919:48;;;;;;:::i;:::-;;;;;;;;22680:295;;:::o;23943:328::-;24118:41;24137:12;:10;:12::i;:::-;24151:7;24118:18;:41::i;:::-;24110:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24224:39;24238:4;24244:2;24248:7;24257:5;24224:13;:39::i;:::-;23943:328;;;;:::o;60626:115::-;60696:13;60729:4;60722:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60626:115;;;:::o;59890:271::-;43946:12;:10;:12::i;:::-;43935:23;;:7;:5;:7::i;:::-;:23;;;43927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59966:9:::1;59961:193;59981:3;;:10;;59979:1;:12;59961:193;;;60021:40;60040:12;:10;:12::i;:::-;60054:3;;60058:1;60054:6;;;;;;;;;;;;;;;;;;;;;60021:18;:40::i;:::-;60013:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;60129:13;60135:3;;60139:1;60135:6;;;;;;;;;;;;;;;;;;;;;60129:5;:13::i;:::-;59993:3;;;;;:::i;:::-;;;;59961:193;;;;59890:271:::0;;:::o;61023:460::-;61153:4;61238:27;61282:20;61238:65;;61364:8;61318:54;;61326:13;:21;;;61348:10;61326:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61318:54;;;61314:98;;;61396:4;61389:11;;;;;61314:98;61431:44;61454:10;61466:8;61431:22;:44::i;:::-;61424:51;;;61023:460;;;;;:::o;44615:192::-;43946:12;:10;:12::i;:::-;43935:23;;:7;:5;:7::i;:::-;:23;;;43927:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44724:1:::1;44704:22;;:8;:22;;;;44696:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;44780:19;44790:8;44780:9;:19::i;:::-;44615:192:::0;:::o;51907:650::-;51978:22;52044:4;52022:27;;:10;:27;;;52018:508;;;52066:18;52087:8;;52066:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52110:13;52126:8;;:15;;52110:31;;52378:42;52348:5;52341;52337:17;52331:24;52305:134;52295:144;;52165:289;;;;;52503:10;52486:28;;52018:508;51907:650;:::o;36652:224::-;36754:4;36793:35;36778:50;;;:11;:50;;;;:90;;;;36832:36;36856:11;36832:23;:36::i;:::-;36778:90;36771:97;;36652:224;;;:::o;62333:161::-;62423:14;62462:24;:22;:24::i;:::-;62455:31;;62333:161;:::o;25781:127::-;25846:4;25898:1;25870:30;;:7;:16;25878:7;25870:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25863:37;;25781:127;;;:::o;29763:174::-;29865:2;29838:15;:24;29854:7;29838:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29921:7;29917:2;29883:46;;29892:23;29907:7;29892:14;:23::i;:::-;29883:46;;;;;;;;;;;;29763:174;;:::o;57359:486::-;57537:4;57580:1;57562:20;;:6;:20;;;;57554:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;57678:159;57706:47;57725:27;57745:6;57725:19;:27::i;:::-;57706:18;:47::i;:::-;57772:4;57795;57818;57678:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57655:182;;:6;:182;;;57635:202;;57359:486;;;;;;;:::o;47699:98::-;47757:7;47788:1;47784;:5;;;;:::i;:::-;47777:12;;47699:98;;;;:::o;26075:348::-;26168:4;26193:16;26201:7;26193;:16::i;:::-;26185:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26269:13;26285:23;26300:7;26285:14;:23::i;:::-;26269:39;;26338:5;26327:16;;:7;:16;;;:51;;;;26371:7;26347:31;;:20;26359:7;26347:11;:20::i;:::-;:31;;;26327:51;:87;;;;26382:32;26399:5;26406:7;26382:16;:32::i;:::-;26327:87;26319:96;;;26075:348;;;;:::o;29067:578::-;29226:4;29199:31;;:23;29214:7;29199:14;:23::i;:::-;:31;;;29191:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29309:1;29295:16;;:2;:16;;;;29287:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29365:39;29386:4;29392:2;29396:7;29365:20;:39::i;:::-;29469:29;29486:1;29490:7;29469:8;:29::i;:::-;29530:1;29511:9;:15;29521:4;29511:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29559:1;29542:9;:13;29552:2;29542:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29590:2;29571:7;:16;29579:7;29571:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29629:7;29625:2;29610:27;;29619:4;29610:27;;;;;;;;;;;;29067:578;;;:::o;60309:106::-;60358:7;60385:22;60405:1;60385:15;;:19;;:22;;;;:::i;:::-;60378:29;;60309:106;:::o;27759:382::-;27853:1;27839:16;;:2;:16;;;;27831:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27912:16;27920:7;27912;:16::i;:::-;27911:17;27903:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27974:45;28003:1;28007:2;28011:7;27974:20;:45::i;:::-;28049:1;28032:9;:13;28042:2;28032:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28080:2;28061:7;:16;28069:7;28061:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28125:7;28121:2;28100:33;;28117:1;28100:33;;;;;;;;;;;;27759:382;;:::o;60494:73::-;60542:15;;:17;;;;;;;;;:::i;:::-;;;;;;60494:73::o;34053:120::-;33597:8;:6;:8::i;:::-;33589:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;34122:5:::1;34112:7;;:15;;;;;;;;;;;;;;;;;;34143:22;34152:12;:10;:12::i;:::-;34143:22;;;;;;:::i;:::-;;;;;;;;34053:120::o:0;44815:173::-;44871:16;44890:6;;;;;;;;;;;44871:25;;44916:8;44907:6;;:17;;;;;;;;;;;;;;;;;;44971:8;44940:40;;44961:8;44940:40;;;;;;;;;;;;44815:173;;:::o;33794:118::-;33320:8;:6;:8::i;:::-;33319:9;33311:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33864:4:::1;33854:7;;:14;;;;;;;;;;;;;;;;;;33884:20;33891:12;:10;:12::i;:::-;33884:20;;;;;;:::i;:::-;;;;;;;;33794:118::o:0;25153:315::-;25310:28;25320:4;25326:2;25330:7;25310:9;:28::i;:::-;25357:48;25380:4;25386:2;25390:7;25399:5;25357:22;:48::i;:::-;25349:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25153:315;;;;:::o;28370:360::-;28430:13;28446:23;28461:7;28446:14;:23::i;:::-;28430:39;;28482:48;28503:5;28518:1;28522:7;28482:20;:48::i;:::-;28571:29;28588:1;28592:7;28571:8;:29::i;:::-;28633:1;28613:9;:16;28623:5;28613:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;28652:7;:16;28660:7;28652:16;;;;;;;;;;;;28645:23;;;;;;;;;;;28714:7;28710:1;28686:36;;28695:5;28686:36;;;;;;;;;;;;28370:360;;:::o;23046:164::-;23143:4;23167:18;:25;23186:5;23167:25;;;;;;;;;;;;;;;:35;23193:8;23167:35;;;;;;;;;;;;;;;;;;;;;;;;;23160:42;;23046:164;;;;:::o;19883:305::-;19985:4;20037:25;20022:40;;;:11;:40;;;;:105;;;;20094:33;20079:48;;;:11;:48;;;;20022:105;:158;;;;20144:36;20168:11;20144:23;:36::i;:::-;20022:158;20002:178;;19883:305;;;:::o;56826:410::-;56936:7;55003:100;;;;;;;;;;;;;;;;;54983:127;;;;;;57090:6;:12;;;57125:6;:11;;;57169:6;:24;;;57159:35;;;;;;57009:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56981:247;;;;;;56961:267;;56826:410;;;:::o;54575:258::-;54674:7;54776:20;:18;:20::i;:::-;54798:11;54747:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54719:106;;;;;;54699:126;;54575:258;;;:::o;61958:231::-;62136:45;62163:4;62169:2;62173:7;62136:26;:45::i;:::-;61958:231;;;:::o;30502:799::-;30657:4;30678:15;:2;:13;;;:15::i;:::-;30674:620;;;30730:2;30714:36;;;30751:12;:10;:12::i;:::-;30765:4;30771:7;30780:5;30714:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30710:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30973:1;30956:6;:13;:18;30952:272;;;30999:60;;;;;;;;;;:::i;:::-;;;;;;;;30952:272;31174:6;31168:13;31159:6;31155:2;31151:15;31144:38;30710:529;30847:41;;;30837:51;;;:6;:51;;;;30830:58;;;;;30674:620;31278:4;31271:11;;30502:799;;;;;;;:::o;18487:157::-;18572:4;18611:25;18596:40;;;:11;:40;;;;18589:47;;18487:157;;;:::o;34670:275::-;34814:45;34841:4;34847:2;34851:7;34814:26;:45::i;:::-;34881:8;:6;:8::i;:::-;34880:9;34872:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34670:275;;;:::o;7704:387::-;7764:4;7972:12;8039:7;8027:20;8019:28;;8082:1;8075:4;:8;8068:15;;;7704:387;;;:::o;38328:589::-;38472:45;38499:4;38505:2;38509:7;38472:26;:45::i;:::-;38550:1;38534:18;;:4;:18;;;38530:187;;;38569:40;38601:7;38569:31;:40::i;:::-;38530:187;;;38639:2;38631:10;;:4;:10;;;38627:90;;38658:47;38691:4;38697:7;38658:32;:47::i;:::-;38627:90;38530:187;38745:1;38731:16;;:2;:16;;;38727:183;;;38764:45;38801:7;38764:36;:45::i;:::-;38727:183;;;38837:4;38831:10;;:2;:10;;;38827:83;;38858:40;38886:2;38890:7;38858:27;:40::i;:::-;38827:83;38727:183;38328:589;;;:::o;31873:126::-;;;;:::o;39640:164::-;39744:10;:17;;;;39717:15;:24;39733:7;39717:24;;;;;;;;;;;:44;;;;39772:10;39788:7;39772:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39640:164;:::o;40431:988::-;40697:22;40747:1;40722:22;40739:4;40722:16;:22::i;:::-;:26;;;;:::i;:::-;40697:51;;40759:18;40780:17;:26;40798:7;40780:26;;;;;;;;;;;;40759:47;;40927:14;40913:10;:28;40909:328;;40958:19;40980:12;:18;40993:4;40980:18;;;;;;;;;;;;;;;:34;40999:14;40980:34;;;;;;;;;;;;40958:56;;41064:11;41031:12;:18;41044:4;41031:18;;;;;;;;;;;;;;;:30;41050:10;41031:30;;;;;;;;;;;:44;;;;41181:10;41148:17;:30;41166:11;41148:30;;;;;;;;;;;:43;;;;40909:328;;41333:17;:26;41351:7;41333:26;;;;;;;;;;;41326:33;;;41377:12;:18;41390:4;41377:18;;;;;;;;;;;;;;;:34;41396:14;41377:34;;;;;;;;;;;41370:41;;;40431:988;;;;:::o;41714:1079::-;41967:22;42012:1;41992:10;:17;;;;:21;;;;:::i;:::-;41967:46;;42024:18;42045:15;:24;42061:7;42045:24;;;;;;;;;;;;42024:45;;42396:19;42418:10;42429:14;42418:26;;;;;;;;;;;;;;;;;;;;;;;;42396:48;;42482:11;42457:10;42468;42457:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42593:10;42562:15;:28;42578:11;42562:28;;;;;;;;;;;:41;;;;42734:15;:24;42750:7;42734:24;;;;;;;;;;;42727:31;;;42769:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41714:1079;;;;:::o;39218:221::-;39303:14;39320:20;39337:2;39320:16;:20::i;:::-;39303:37;;39378:7;39351:12;:16;39364:2;39351:16;;;;;;;;;;;;;;;:24;39368:6;39351:24;;;;;;;;;;;:34;;;;39425:6;39396:17;:26;39414:7;39396:26;;;;;;;;;;;:35;;;;39218:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:139::-;1427:5;1465:6;1452:20;1443:29;;1481:33;1508:5;1481:33;:::i;:::-;1433:87;;;;:::o;1526:137::-;1571:5;1609:6;1596:20;1587:29;;1625:32;1651:5;1625:32;:::i;:::-;1577:86;;;;:::o;1669:141::-;1725:5;1756:6;1750:13;1741:22;;1772:32;1798:5;1772:32;:::i;:::-;1731:79;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2106:201::-;2192:5;2223:6;2217:13;2208:22;;2239:62;2295:5;2239:62;:::i;:::-;2198:109;;;;:::o;2327:273::-;2383:5;2432:3;2425:4;2417:6;2413:17;2409:27;2399:2;;2450:1;2447;2440:12;2399:2;2490:6;2477:20;2515:79;2590:3;2582:6;2575:4;2567:6;2563:17;2515:79;:::i;:::-;2506:88;;2389:211;;;;;:::o;2606:139::-;2652:5;2690:6;2677:20;2668:29;;2706:33;2733:5;2706:33;:::i;:::-;2658:87;;;;:::o;2751:135::-;2795:5;2833:6;2820:20;2811:29;;2849:31;2874:5;2849:31;:::i;:::-;2801:85;;;;:::o;2892:262::-;2951:6;3000:2;2988:9;2979:7;2975:23;2971:32;2968:2;;;3016:1;3013;3006:12;2968:2;3059:1;3084:53;3129:7;3120:6;3109:9;3105:22;3084:53;:::i;:::-;3074:63;;3030:117;2958:196;;;;:::o;3160:407::-;3228:6;3236;3285:2;3273:9;3264:7;3260:23;3256:32;3253:2;;;3301:1;3298;3291:12;3253:2;3344:1;3369:53;3414:7;3405:6;3394:9;3390:22;3369:53;:::i;:::-;3359:63;;3315:117;3471:2;3497:53;3542:7;3533:6;3522:9;3518:22;3497:53;:::i;:::-;3487:63;;3442:118;3243:324;;;;;:::o;3573:552::-;3650:6;3658;3666;3715:2;3703:9;3694:7;3690:23;3686:32;3683:2;;;3731:1;3728;3721:12;3683:2;3774:1;3799:53;3844:7;3835:6;3824:9;3820:22;3799:53;:::i;:::-;3789:63;;3745:117;3901:2;3927:53;3972:7;3963:6;3952:9;3948:22;3927:53;:::i;:::-;3917:63;;3872:118;4029:2;4055:53;4100:7;4091:6;4080:9;4076:22;4055:53;:::i;:::-;4045:63;;4000:118;3673:452;;;;;:::o;4131:809::-;4226:6;4234;4242;4250;4299:3;4287:9;4278:7;4274:23;4270:33;4267:2;;;4316:1;4313;4306:12;4267:2;4359:1;4384:53;4429:7;4420:6;4409:9;4405:22;4384:53;:::i;:::-;4374:63;;4330:117;4486:2;4512:53;4557:7;4548:6;4537:9;4533:22;4512:53;:::i;:::-;4502:63;;4457:118;4614:2;4640:53;4685:7;4676:6;4665:9;4661:22;4640:53;:::i;:::-;4630:63;;4585:118;4770:2;4759:9;4755:18;4742:32;4801:18;4793:6;4790:30;4787:2;;;4833:1;4830;4823:12;4787:2;4861:62;4915:7;4906:6;4895:9;4891:22;4861:62;:::i;:::-;4851:72;;4713:220;4257:683;;;;;;;:::o;4946:401::-;5011:6;5019;5068:2;5056:9;5047:7;5043:23;5039:32;5036:2;;;5084:1;5081;5074:12;5036:2;5127:1;5152:53;5197:7;5188:6;5177:9;5173:22;5152:53;:::i;:::-;5142:63;;5098:117;5254:2;5280:50;5322:7;5313:6;5302:9;5298:22;5280:50;:::i;:::-;5270:60;;5225:115;5026:321;;;;;:::o;5353:951::-;5455:6;5463;5471;5479;5487;5536:3;5524:9;5515:7;5511:23;5507:33;5504:2;;;5553:1;5550;5543:12;5504:2;5596:1;5621:53;5666:7;5657:6;5646:9;5642:22;5621:53;:::i;:::-;5611:63;;5567:117;5751:2;5740:9;5736:18;5723:32;5782:18;5774:6;5771:30;5768:2;;;5814:1;5811;5804:12;5768:2;5842:62;5896:7;5887:6;5876:9;5872:22;5842:62;:::i;:::-;5832:72;;5694:220;5953:2;5979:53;6024:7;6015:6;6004:9;6000:22;5979:53;:::i;:::-;5969:63;;5924:118;6081:2;6107:53;6152:7;6143:6;6132:9;6128:22;6107:53;:::i;:::-;6097:63;;6052:118;6209:3;6236:51;6279:7;6270:6;6259:9;6255:22;6236:51;:::i;:::-;6226:61;;6180:117;5494:810;;;;;;;;:::o;6310:407::-;6378:6;6386;6435:2;6423:9;6414:7;6410:23;6406:32;6403:2;;;6451:1;6448;6441:12;6403:2;6494:1;6519:53;6564:7;6555:6;6544:9;6540:22;6519:53;:::i;:::-;6509:63;;6465:117;6621:2;6647:53;6692:7;6683:6;6672:9;6668:22;6647:53;:::i;:::-;6637:63;;6592:118;6393:324;;;;;:::o;6723:425::-;6809:6;6817;6866:2;6854:9;6845:7;6841:23;6837:32;6834:2;;;6882:1;6879;6872:12;6834:2;6953:1;6942:9;6938:17;6925:31;6983:18;6975:6;6972:30;6969:2;;;7015:1;7012;7005:12;6969:2;7051:80;7123:7;7114:6;7103:9;7099:22;7051:80;:::i;:::-;7033:98;;;;6896:245;6824:324;;;;;:::o;7154:260::-;7212:6;7261:2;7249:9;7240:7;7236:23;7232:32;7229:2;;;7277:1;7274;7267:12;7229:2;7320:1;7345:52;7389:7;7380:6;7369:9;7365:22;7345:52;:::i;:::-;7335:62;;7291:116;7219:195;;;;:::o;7420:282::-;7489:6;7538:2;7526:9;7517:7;7513:23;7509:32;7506:2;;;7554:1;7551;7544:12;7506:2;7597:1;7622:63;7677:7;7668:6;7657:9;7653:22;7622:63;:::i;:::-;7612:73;;7568:127;7496:206;;;;:::o;7708:342::-;7807:6;7856:2;7844:9;7835:7;7831:23;7827:32;7824:2;;;7872:1;7869;7862:12;7824:2;7915:1;7940:93;8025:7;8016:6;8005:9;8001:22;7940:93;:::i;:::-;7930:103;;7886:157;7814:236;;;;:::o;8056:375::-;8125:6;8174:2;8162:9;8153:7;8149:23;8145:32;8142:2;;;8190:1;8187;8180:12;8142:2;8261:1;8250:9;8246:17;8233:31;8291:18;8283:6;8280:30;8277:2;;;8323:1;8320;8313:12;8277:2;8351:63;8406:7;8397:6;8386:9;8382:22;8351:63;:::i;:::-;8341:73;;8204:220;8132:299;;;;:::o;8437:262::-;8496:6;8545:2;8533:9;8524:7;8520:23;8516:32;8513:2;;;8561:1;8558;8551:12;8513:2;8604:1;8629:53;8674:7;8665:6;8654:9;8650:22;8629:53;:::i;:::-;8619:63;;8575:117;8503:196;;;;:::o;8705:142::-;8808:32;8834:5;8808:32;:::i;:::-;8803:3;8796:45;8786:61;;:::o;8853:118::-;8940:24;8958:5;8940:24;:::i;:::-;8935:3;8928:37;8918:53;;:::o;8977:157::-;9082:45;9102:24;9120:5;9102:24;:::i;:::-;9082:45;:::i;:::-;9077:3;9070:58;9060:74;;:::o;9140:109::-;9221:21;9236:5;9221:21;:::i;:::-;9216:3;9209:34;9199:50;;:::o;9255:118::-;9342:24;9360:5;9342:24;:::i;:::-;9337:3;9330:37;9320:53;;:::o;9379:157::-;9484:45;9504:24;9522:5;9504:24;:::i;:::-;9484:45;:::i;:::-;9479:3;9472:58;9462:74;;:::o;9542:360::-;9628:3;9656:38;9688:5;9656:38;:::i;:::-;9710:70;9773:6;9768:3;9710:70;:::i;:::-;9703:77;;9789:52;9834:6;9829:3;9822:4;9815:5;9811:16;9789:52;:::i;:::-;9866:29;9888:6;9866:29;:::i;:::-;9861:3;9857:39;9850:46;;9632:270;;;;;:::o;9908:373::-;10012:3;10040:38;10072:5;10040:38;:::i;:::-;10094:88;10175:6;10170:3;10094:88;:::i;:::-;10087:95;;10191:52;10236:6;10231:3;10224:4;10217:5;10213:16;10191:52;:::i;:::-;10268:6;10263:3;10259:16;10252:23;;10016:265;;;;;:::o;10287:364::-;10375:3;10403:39;10436:5;10403:39;:::i;:::-;10458:71;10522:6;10517:3;10458:71;:::i;:::-;10451:78;;10538:52;10583:6;10578:3;10571:4;10564:5;10560:16;10538:52;:::i;:::-;10615:29;10637:6;10615:29;:::i;:::-;10610:3;10606:39;10599:46;;10379:272;;;;;:::o;10657:366::-;10799:3;10820:67;10884:2;10879:3;10820:67;:::i;:::-;10813:74;;10896:93;10985:3;10896:93;:::i;:::-;11014:2;11009:3;11005:12;10998:19;;10803:220;;;:::o;11029:366::-;11171:3;11192:67;11256:2;11251:3;11192:67;:::i;:::-;11185:74;;11268:93;11357:3;11268:93;:::i;:::-;11386:2;11381:3;11377:12;11370:19;;11175:220;;;:::o;11401:366::-;11543:3;11564:67;11628:2;11623:3;11564:67;:::i;:::-;11557:74;;11640:93;11729:3;11640:93;:::i;:::-;11758:2;11753:3;11749:12;11742:19;;11547:220;;;:::o;11773:366::-;11915:3;11936:67;12000:2;11995:3;11936:67;:::i;:::-;11929:74;;12012:93;12101:3;12012:93;:::i;:::-;12130:2;12125:3;12121:12;12114:19;;11919:220;;;:::o;12145:366::-;12287:3;12308:67;12372:2;12367:3;12308:67;:::i;:::-;12301:74;;12384:93;12473:3;12384:93;:::i;:::-;12502:2;12497:3;12493:12;12486:19;;12291:220;;;:::o;12517:366::-;12659:3;12680:67;12744:2;12739:3;12680:67;:::i;:::-;12673:74;;12756:93;12845:3;12756:93;:::i;:::-;12874:2;12869:3;12865:12;12858:19;;12663:220;;;:::o;12889:366::-;13031:3;13052:67;13116:2;13111:3;13052:67;:::i;:::-;13045:74;;13128:93;13217:3;13128:93;:::i;:::-;13246:2;13241:3;13237:12;13230:19;;13035:220;;;:::o;13261:400::-;13421:3;13442:84;13524:1;13519:3;13442:84;:::i;:::-;13435:91;;13535:93;13624:3;13535:93;:::i;:::-;13653:1;13648:3;13644:11;13637:18;;13425:236;;;:::o;13667:366::-;13809:3;13830:67;13894:2;13889:3;13830:67;:::i;:::-;13823:74;;13906:93;13995:3;13906:93;:::i;:::-;14024:2;14019:3;14015:12;14008:19;;13813:220;;;:::o;14039:366::-;14181:3;14202:67;14266:2;14261:3;14202:67;:::i;:::-;14195:74;;14278:93;14367:3;14278:93;:::i;:::-;14396:2;14391:3;14387:12;14380:19;;14185:220;;;:::o;14411:366::-;14553:3;14574:67;14638:2;14633:3;14574:67;:::i;:::-;14567:74;;14650:93;14739:3;14650:93;:::i;:::-;14768:2;14763:3;14759:12;14752:19;;14557:220;;;:::o;14783:366::-;14925:3;14946:67;15010:2;15005:3;14946:67;:::i;:::-;14939:74;;15022:93;15111:3;15022:93;:::i;:::-;15140:2;15135:3;15131:12;15124:19;;14929:220;;;:::o;15155:366::-;15297:3;15318:67;15382:2;15377:3;15318:67;:::i;:::-;15311:74;;15394:93;15483:3;15394:93;:::i;:::-;15512:2;15507:3;15503:12;15496:19;;15301:220;;;:::o;15527:366::-;15669:3;15690:67;15754:2;15749:3;15690:67;:::i;:::-;15683:74;;15766:93;15855:3;15766:93;:::i;:::-;15884:2;15879:3;15875:12;15868:19;;15673:220;;;:::o;15899:366::-;16041:3;16062:67;16126:2;16121:3;16062:67;:::i;:::-;16055:74;;16138:93;16227:3;16138:93;:::i;:::-;16256:2;16251:3;16247:12;16240:19;;16045:220;;;:::o;16271:366::-;16413:3;16434:67;16498:2;16493:3;16434:67;:::i;:::-;16427:74;;16510:93;16599:3;16510:93;:::i;:::-;16628:2;16623:3;16619:12;16612:19;;16417:220;;;:::o;16643:366::-;16785:3;16806:67;16870:2;16865:3;16806:67;:::i;:::-;16799:74;;16882:93;16971:3;16882:93;:::i;:::-;17000:2;16995:3;16991:12;16984:19;;16789:220;;;:::o;17015:366::-;17157:3;17178:67;17242:2;17237:3;17178:67;:::i;:::-;17171:74;;17254:93;17343:3;17254:93;:::i;:::-;17372:2;17367:3;17363:12;17356:19;;17161:220;;;:::o;17387:366::-;17529:3;17550:67;17614:2;17609:3;17550:67;:::i;:::-;17543:74;;17626:93;17715:3;17626:93;:::i;:::-;17744:2;17739:3;17735:12;17728:19;;17533:220;;;:::o;17759:366::-;17901:3;17922:67;17986:2;17981:3;17922:67;:::i;:::-;17915:74;;17998:93;18087:3;17998:93;:::i;:::-;18116:2;18111:3;18107:12;18100:19;;17905:220;;;:::o;18131:366::-;18273:3;18294:67;18358:2;18353:3;18294:67;:::i;:::-;18287:74;;18370:93;18459:3;18370:93;:::i;:::-;18488:2;18483:3;18479:12;18472:19;;18277:220;;;:::o;18503:366::-;18645:3;18666:67;18730:2;18725:3;18666:67;:::i;:::-;18659:74;;18742:93;18831:3;18742:93;:::i;:::-;18860:2;18855:3;18851:12;18844:19;;18649:220;;;:::o;18875:366::-;19017:3;19038:67;19102:2;19097:3;19038:67;:::i;:::-;19031:74;;19114:93;19203:3;19114:93;:::i;:::-;19232:2;19227:3;19223:12;19216:19;;19021:220;;;:::o;19247:366::-;19389:3;19410:67;19474:2;19469:3;19410:67;:::i;:::-;19403:74;;19486:93;19575:3;19486:93;:::i;:::-;19604:2;19599:3;19595:12;19588:19;;19393:220;;;:::o;19619:366::-;19761:3;19782:67;19846:2;19841:3;19782:67;:::i;:::-;19775:74;;19858:93;19947:3;19858:93;:::i;:::-;19976:2;19971:3;19967:12;19960:19;;19765:220;;;:::o;19991:366::-;20133:3;20154:67;20218:2;20213:3;20154:67;:::i;:::-;20147:74;;20230:93;20319:3;20230:93;:::i;:::-;20348:2;20343:3;20339:12;20332:19;;20137:220;;;:::o;20363:118::-;20450:24;20468:5;20450:24;:::i;:::-;20445:3;20438:37;20428:53;;:::o;20487:112::-;20570:22;20586:5;20570:22;:::i;:::-;20565:3;20558:35;20548:51;;:::o;20605:271::-;20735:3;20757:93;20846:3;20837:6;20757:93;:::i;:::-;20750:100;;20867:3;20860:10;;20739:137;;;;:::o;20882:412::-;21040:3;21062:93;21151:3;21142:6;21062:93;:::i;:::-;21055:100;;21165:75;21236:3;21227:6;21165:75;:::i;:::-;21265:2;21260:3;21256:12;21249:19;;21285:3;21278:10;;21044:250;;;;;:::o;21300:663::-;21541:3;21563:148;21707:3;21563:148;:::i;:::-;21556:155;;21721:75;21792:3;21783:6;21721:75;:::i;:::-;21821:2;21816:3;21812:12;21805:19;;21834:75;21905:3;21896:6;21834:75;:::i;:::-;21934:2;21929:3;21925:12;21918:19;;21954:3;21947:10;;21545:418;;;;;:::o;21969:222::-;22062:4;22100:2;22089:9;22085:18;22077:26;;22113:71;22181:1;22170:9;22166:17;22157:6;22113:71;:::i;:::-;22067:124;;;;:::o;22197:561::-;22380:4;22418:2;22407:9;22403:18;22395:26;;22431:71;22499:1;22488:9;22484:17;22475:6;22431:71;:::i;:::-;22512:88;22596:2;22585:9;22581:18;22572:6;22512:88;:::i;:::-;22647:9;22641:4;22637:20;22632:2;22621:9;22617:18;22610:48;22675:76;22746:4;22737:6;22675:76;:::i;:::-;22667:84;;22385:373;;;;;;:::o;22764:640::-;22959:4;22997:3;22986:9;22982:19;22974:27;;23011:71;23079:1;23068:9;23064:17;23055:6;23011:71;:::i;:::-;23092:72;23160:2;23149:9;23145:18;23136:6;23092:72;:::i;:::-;23174;23242:2;23231:9;23227:18;23218:6;23174:72;:::i;:::-;23293:9;23287:4;23283:20;23278:2;23267:9;23263:18;23256:48;23321:76;23392:4;23383:6;23321:76;:::i;:::-;23313:84;;22964:440;;;;;;;:::o;23410:210::-;23497:4;23535:2;23524:9;23520:18;23512:26;;23548:65;23610:1;23599:9;23595:17;23586:6;23548:65;:::i;:::-;23502:118;;;;:::o;23626:222::-;23719:4;23757:2;23746:9;23742:18;23734:26;;23770:71;23838:1;23827:9;23823:17;23814:6;23770:71;:::i;:::-;23724:124;;;;:::o;23854:553::-;24031:4;24069:3;24058:9;24054:19;24046:27;;24083:71;24151:1;24140:9;24136:17;24127:6;24083:71;:::i;:::-;24164:72;24232:2;24221:9;24217:18;24208:6;24164:72;:::i;:::-;24246;24314:2;24303:9;24299:18;24290:6;24246:72;:::i;:::-;24328;24396:2;24385:9;24381:18;24372:6;24328:72;:::i;:::-;24036:371;;;;;;;:::o;24413:545::-;24586:4;24624:3;24613:9;24609:19;24601:27;;24638:71;24706:1;24695:9;24691:17;24682:6;24638:71;:::i;:::-;24719:68;24783:2;24772:9;24768:18;24759:6;24719:68;:::i;:::-;24797:72;24865:2;24854:9;24850:18;24841:6;24797:72;:::i;:::-;24879;24947:2;24936:9;24932:18;24923:6;24879:72;:::i;:::-;24591:367;;;;;;;:::o;24964:309::-;25075:4;25113:2;25102:9;25098:18;25090:26;;25162:9;25156:4;25152:20;25148:1;25137:9;25133:17;25126:47;25190:76;25261:4;25252:6;25190:76;:::i;:::-;25182:84;;25080:193;;;;:::o;25279:313::-;25392:4;25430:2;25419:9;25415:18;25407:26;;25479:9;25473:4;25469:20;25465:1;25454:9;25450:17;25443:47;25507:78;25580:4;25571:6;25507:78;:::i;:::-;25499:86;;25397:195;;;;:::o;25598:419::-;25764:4;25802:2;25791:9;25787:18;25779:26;;25851:9;25845:4;25841:20;25837:1;25826:9;25822:17;25815:47;25879:131;26005:4;25879:131;:::i;:::-;25871:139;;25769:248;;;:::o;26023:419::-;26189:4;26227:2;26216:9;26212:18;26204:26;;26276:9;26270:4;26266:20;26262:1;26251:9;26247:17;26240:47;26304:131;26430:4;26304:131;:::i;:::-;26296:139;;26194:248;;;:::o;26448:419::-;26614:4;26652:2;26641:9;26637:18;26629:26;;26701:9;26695:4;26691:20;26687:1;26676:9;26672:17;26665:47;26729:131;26855:4;26729:131;:::i;:::-;26721:139;;26619:248;;;:::o;26873:419::-;27039:4;27077:2;27066:9;27062:18;27054:26;;27126:9;27120:4;27116:20;27112:1;27101:9;27097:17;27090:47;27154:131;27280:4;27154:131;:::i;:::-;27146:139;;27044:248;;;:::o;27298:419::-;27464:4;27502:2;27491:9;27487:18;27479:26;;27551:9;27545:4;27541:20;27537:1;27526:9;27522:17;27515:47;27579:131;27705:4;27579:131;:::i;:::-;27571:139;;27469:248;;;:::o;27723:419::-;27889:4;27927:2;27916:9;27912:18;27904:26;;27976:9;27970:4;27966:20;27962:1;27951:9;27947:17;27940:47;28004:131;28130:4;28004:131;:::i;:::-;27996:139;;27894:248;;;:::o;28148:419::-;28314:4;28352:2;28341:9;28337:18;28329:26;;28401:9;28395:4;28391:20;28387:1;28376:9;28372:17;28365:47;28429:131;28555:4;28429:131;:::i;:::-;28421:139;;28319:248;;;:::o;28573:419::-;28739:4;28777:2;28766:9;28762:18;28754:26;;28826:9;28820:4;28816:20;28812:1;28801:9;28797:17;28790:47;28854:131;28980:4;28854:131;:::i;:::-;28846:139;;28744:248;;;:::o;28998:419::-;29164:4;29202:2;29191:9;29187:18;29179:26;;29251:9;29245:4;29241:20;29237:1;29226:9;29222:17;29215:47;29279:131;29405:4;29279:131;:::i;:::-;29271:139;;29169:248;;;:::o;29423:419::-;29589:4;29627:2;29616:9;29612:18;29604:26;;29676:9;29670:4;29666:20;29662:1;29651:9;29647:17;29640:47;29704:131;29830:4;29704:131;:::i;:::-;29696:139;;29594:248;;;:::o;29848:419::-;30014:4;30052:2;30041:9;30037:18;30029:26;;30101:9;30095:4;30091:20;30087:1;30076:9;30072:17;30065:47;30129:131;30255:4;30129:131;:::i;:::-;30121:139;;30019:248;;;:::o;30273:419::-;30439:4;30477:2;30466:9;30462:18;30454:26;;30526:9;30520:4;30516:20;30512:1;30501:9;30497:17;30490:47;30554:131;30680:4;30554:131;:::i;:::-;30546:139;;30444:248;;;:::o;30698:419::-;30864:4;30902:2;30891:9;30887:18;30879:26;;30951:9;30945:4;30941:20;30937:1;30926:9;30922:17;30915:47;30979:131;31105:4;30979:131;:::i;:::-;30971:139;;30869:248;;;:::o;31123:419::-;31289:4;31327:2;31316:9;31312:18;31304:26;;31376:9;31370:4;31366:20;31362:1;31351:9;31347:17;31340:47;31404:131;31530:4;31404:131;:::i;:::-;31396:139;;31294:248;;;:::o;31548:419::-;31714:4;31752:2;31741:9;31737:18;31729:26;;31801:9;31795:4;31791:20;31787:1;31776:9;31772:17;31765:47;31829:131;31955:4;31829:131;:::i;:::-;31821:139;;31719:248;;;:::o;31973:419::-;32139:4;32177:2;32166:9;32162:18;32154:26;;32226:9;32220:4;32216:20;32212:1;32201:9;32197:17;32190:47;32254:131;32380:4;32254:131;:::i;:::-;32246:139;;32144:248;;;:::o;32398:419::-;32564:4;32602:2;32591:9;32587:18;32579:26;;32651:9;32645:4;32641:20;32637:1;32626:9;32622:17;32615:47;32679:131;32805:4;32679:131;:::i;:::-;32671:139;;32569:248;;;:::o;32823:419::-;32989:4;33027:2;33016:9;33012:18;33004:26;;33076:9;33070:4;33066:20;33062:1;33051:9;33047:17;33040:47;33104:131;33230:4;33104:131;:::i;:::-;33096:139;;32994:248;;;:::o;33248:419::-;33414:4;33452:2;33441:9;33437:18;33429:26;;33501:9;33495:4;33491:20;33487:1;33476:9;33472:17;33465:47;33529:131;33655:4;33529:131;:::i;:::-;33521:139;;33419:248;;;:::o;33673:419::-;33839:4;33877:2;33866:9;33862:18;33854:26;;33926:9;33920:4;33916:20;33912:1;33901:9;33897:17;33890:47;33954:131;34080:4;33954:131;:::i;:::-;33946:139;;33844:248;;;:::o;34098:419::-;34264:4;34302:2;34291:9;34287:18;34279:26;;34351:9;34345:4;34341:20;34337:1;34326:9;34322:17;34315:47;34379:131;34505:4;34379:131;:::i;:::-;34371:139;;34269:248;;;:::o;34523:419::-;34689:4;34727:2;34716:9;34712:18;34704:26;;34776:9;34770:4;34766:20;34762:1;34751:9;34747:17;34740:47;34804:131;34930:4;34804:131;:::i;:::-;34796:139;;34694:248;;;:::o;34948:419::-;35114:4;35152:2;35141:9;35137:18;35129:26;;35201:9;35195:4;35191:20;35187:1;35176:9;35172:17;35165:47;35229:131;35355:4;35229:131;:::i;:::-;35221:139;;35119:248;;;:::o;35373:419::-;35539:4;35577:2;35566:9;35562:18;35554:26;;35626:9;35620:4;35616:20;35612:1;35601:9;35597:17;35590:47;35654:131;35780:4;35654:131;:::i;:::-;35646:139;;35544:248;;;:::o;35798:419::-;35964:4;36002:2;35991:9;35987:18;35979:26;;36051:9;36045:4;36041:20;36037:1;36026:9;36022:17;36015:47;36079:131;36205:4;36079:131;:::i;:::-;36071:139;;35969:248;;;:::o;36223:222::-;36316:4;36354:2;36343:9;36339:18;36331:26;;36367:71;36435:1;36424:9;36420:17;36411:6;36367:71;:::i;:::-;36321:124;;;;:::o;36451:129::-;36485:6;36512:20;;:::i;:::-;36502:30;;36541:33;36569:4;36561:6;36541:33;:::i;:::-;36492:88;;;:::o;36586:75::-;36619:6;36652:2;36646:9;36636:19;;36626:35;:::o;36667:307::-;36728:4;36818:18;36810:6;36807:30;36804:2;;;36840:18;;:::i;:::-;36804:2;36878:29;36900:6;36878:29;:::i;:::-;36870:37;;36962:4;36956;36952:15;36944:23;;36733:241;;;:::o;36980:308::-;37042:4;37132:18;37124:6;37121:30;37118:2;;;37154:18;;:::i;:::-;37118:2;37192:29;37214:6;37192:29;:::i;:::-;37184:37;;37276:4;37270;37266:15;37258:23;;37047:241;;;:::o;37294:98::-;37345:6;37379:5;37373:12;37363:22;;37352:40;;;:::o;37398:99::-;37450:6;37484:5;37478:12;37468:22;;37457:40;;;:::o;37503:168::-;37586:11;37620:6;37615:3;37608:19;37660:4;37655:3;37651:14;37636:29;;37598:73;;;;:::o;37677:147::-;37778:11;37815:3;37800:18;;37790:34;;;;:::o;37830:169::-;37914:11;37948:6;37943:3;37936:19;37988:4;37983:3;37979:14;37964:29;;37926:73;;;;:::o;38005:148::-;38107:11;38144:3;38129:18;;38119:34;;;;:::o;38159:305::-;38199:3;38218:20;38236:1;38218:20;:::i;:::-;38213:25;;38252:20;38270:1;38252:20;:::i;:::-;38247:25;;38406:1;38338:66;38334:74;38331:1;38328:81;38325:2;;;38412:18;;:::i;:::-;38325:2;38456:1;38453;38449:9;38442:16;;38203:261;;;;:::o;38470:191::-;38510:4;38530:20;38548:1;38530:20;:::i;:::-;38525:25;;38564:20;38582:1;38564:20;:::i;:::-;38559:25;;38603:1;38600;38597:8;38594:2;;;38608:18;;:::i;:::-;38594:2;38653:1;38650;38646:9;38638:17;;38515:146;;;;:::o;38667:96::-;38704:7;38733:24;38751:5;38733:24;:::i;:::-;38722:35;;38712:51;;;:::o;38769:104::-;38814:7;38843:24;38861:5;38843:24;:::i;:::-;38832:35;;38822:51;;;:::o;38879:90::-;38913:7;38956:5;38949:13;38942:21;38931:32;;38921:48;;;:::o;38975:77::-;39012:7;39041:5;39030:16;;39020:32;;;:::o;39058:149::-;39094:7;39134:66;39127:5;39123:78;39112:89;;39102:105;;;:::o;39213:125::-;39279:7;39308:24;39326:5;39308:24;:::i;:::-;39297:35;;39287:51;;;:::o;39344:126::-;39381:7;39421:42;39414:5;39410:54;39399:65;;39389:81;;;:::o;39476:77::-;39513:7;39542:5;39531:16;;39521:32;;;:::o;39559:86::-;39594:7;39634:4;39627:5;39623:16;39612:27;;39602:43;;;:::o;39651:154::-;39735:6;39730:3;39725;39712:30;39797:1;39788:6;39783:3;39779:16;39772:27;39702:103;;;:::o;39811:307::-;39879:1;39889:113;39903:6;39900:1;39897:13;39889:113;;;39988:1;39983:3;39979:11;39973:18;39969:1;39964:3;39960:11;39953:39;39925:2;39922:1;39918:10;39913:15;;39889:113;;;40020:6;40017:1;40014:13;40011:2;;;40100:1;40091:6;40086:3;40082:16;40075:27;40011:2;39860:258;;;;:::o;40124:320::-;40168:6;40205:1;40199:4;40195:12;40185:22;;40252:1;40246:4;40242:12;40273:18;40263:2;;40329:4;40321:6;40317:17;40307:27;;40263:2;40391;40383:6;40380:14;40360:18;40357:38;40354:2;;;40410:18;;:::i;:::-;40354:2;40175:269;;;;:::o;40450:281::-;40533:27;40555:4;40533:27;:::i;:::-;40525:6;40521:40;40663:6;40651:10;40648:22;40627:18;40615:10;40612:34;40609:62;40606:2;;;40674:18;;:::i;:::-;40606:2;40714:10;40710:2;40703:22;40493:238;;;:::o;40737:233::-;40776:3;40799:24;40817:5;40799:24;:::i;:::-;40790:33;;40845:66;40838:5;40835:77;40832:2;;;40915:18;;:::i;:::-;40832:2;40962:1;40955:5;40951:13;40944:20;;40780:190;;;:::o;40976:100::-;41015:7;41044:26;41064:5;41044:26;:::i;:::-;41033:37;;41023:53;;;:::o;41082:79::-;41121:7;41150:5;41139:16;;41129:32;;;:::o;41167:94::-;41206:7;41235:20;41249:5;41235:20;:::i;:::-;41224:31;;41214:47;;;:::o;41267:180::-;41315:77;41312:1;41305:88;41412:4;41409:1;41402:15;41436:4;41433:1;41426:15;41453:180;41501:77;41498:1;41491:88;41598:4;41595:1;41588:15;41622:4;41619:1;41612:15;41639:180;41687:77;41684:1;41677:88;41784:4;41781:1;41774:15;41808:4;41805:1;41798:15;41825:102;41866:6;41917:2;41913:7;41908:2;41901:5;41897:14;41893:28;41883:38;;41873:54;;;:::o;41933:94::-;41966:8;42014:5;42010:2;42006:14;41985:35;;41975:52;;;:::o;42033:230::-;42173:34;42169:1;42161:6;42157:14;42150:58;42242:13;42237:2;42229:6;42225:15;42218:38;42139:124;:::o;42269:170::-;42409:22;42405:1;42397:6;42393:14;42386:46;42375:64;:::o;42445:230::-;42585:34;42581:1;42573:6;42569:14;42562:58;42654:13;42649:2;42641:6;42637:15;42630:38;42551:124;:::o;42681:237::-;42821:34;42817:1;42809:6;42805:14;42798:58;42890:20;42885:2;42877:6;42873:15;42866:45;42787:131;:::o;42924:225::-;43064:34;43060:1;43052:6;43048:14;43041:58;43133:8;43128:2;43120:6;43116:15;43109:33;43030:119;:::o;43155:178::-;43295:30;43291:1;43283:6;43279:14;43272:54;43261:72;:::o;43339:178::-;43479:30;43475:1;43467:6;43463:14;43456:54;43445:72;:::o;43523:214::-;43663:66;43659:1;43651:6;43647:14;43640:90;43629:108;:::o;43743:223::-;43883:34;43879:1;43871:6;43867:14;43860:58;43952:6;43947:2;43939:6;43935:15;43928:31;43849:117;:::o;43972:175::-;44112:27;44108:1;44100:6;44096:14;44089:51;44078:69;:::o;44153:231::-;44293:34;44289:1;44281:6;44277:14;44270:58;44362:14;44357:2;44349:6;44345:15;44338:39;44259:125;:::o;44390:224::-;44530:34;44526:1;44518:6;44514:14;44507:58;44599:7;44594:2;44586:6;44582:15;44575:32;44496:118;:::o;44620:166::-;44760:18;44756:1;44748:6;44744:14;44737:42;44726:60;:::o;44792:243::-;44932:34;44928:1;44920:6;44916:14;44909:58;45001:26;44996:2;44988:6;44984:15;44977:51;44898:137;:::o;45041:228::-;45181:34;45177:1;45169:6;45165:14;45158:58;45250:11;45245:2;45237:6;45233:15;45226:36;45147:122;:::o;45275:229::-;45415:34;45411:1;45403:6;45399:14;45392:58;45484:12;45479:2;45471:6;45467:15;45460:37;45381:123;:::o;45510:228::-;45650:34;45646:1;45638:6;45634:14;45627:58;45719:11;45714:2;45706:6;45702:15;45695:36;45616:122;:::o;45744:182::-;45884:34;45880:1;45872:6;45868:14;45861:58;45850:76;:::o;45932:231::-;46072:34;46068:1;46060:6;46056:14;46049:58;46141:14;46136:2;46128:6;46124:15;46117:39;46038:125;:::o;46169:182::-;46309:34;46305:1;46297:6;46293:14;46286:58;46275:76;:::o;46357:228::-;46497:34;46493:1;46485:6;46481:14;46474:58;46566:11;46561:2;46553:6;46549:15;46542:36;46463:122;:::o;46591:220::-;46731:34;46727:1;46719:6;46715:14;46708:58;46800:3;46795:2;46787:6;46783:15;46776:28;46697:114;:::o;46817:220::-;46957:34;46953:1;46945:6;46941:14;46934:58;47026:3;47021:2;47013:6;47009:15;47002:28;46923:114;:::o;47043:236::-;47183:34;47179:1;47171:6;47167:14;47160:58;47252:19;47247:2;47239:6;47235:15;47228:44;47149:130;:::o;47285:231::-;47425:34;47421:1;47413:6;47409:14;47402:58;47494:14;47489:2;47481:6;47477:15;47470:39;47391:125;:::o;47522:235::-;47662:34;47658:1;47650:6;47646:14;47639:58;47731:18;47726:2;47718:6;47714:15;47707:43;47628:129;:::o;47763:122::-;47836:24;47854:5;47836:24;:::i;:::-;47829:5;47826:35;47816:2;;47875:1;47872;47865:12;47816:2;47806:79;:::o;47891:116::-;47961:21;47976:5;47961:21;:::i;:::-;47954:5;47951:32;47941:2;;47997:1;47994;47987:12;47941:2;47931:76;:::o;48013:122::-;48086:24;48104:5;48086:24;:::i;:::-;48079:5;48076:35;48066:2;;48125:1;48122;48115:12;48066:2;48056:79;:::o;48141:120::-;48213:23;48230:5;48213:23;:::i;:::-;48206:5;48203:34;48193:2;;48251:1;48248;48241:12;48193:2;48183:78;:::o;48267:180::-;48369:53;48416:5;48369:53;:::i;:::-;48362:5;48359:64;48349:2;;48437:1;48434;48427:12;48349:2;48339:108;:::o;48453:122::-;48526:24;48544:5;48526:24;:::i;:::-;48519:5;48516:35;48506:2;;48565:1;48562;48555:12;48506:2;48496:79;:::o;48581:118::-;48652:22;48668:5;48652:22;:::i;:::-;48645:5;48642:33;48632:2;;48689:1;48686;48679:12;48632:2;48622:77;:::o

Swarm Source

ipfs://5bc0b40b08b38728c73357dba2b5a3d53bd92295f3e81c3585487557c29b544f
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.