ETH Price: $3,340.75 (-1.01%)

Token

Poligoonz Collective (Poligoonz)
 

Overview

Max Total Supply

645 Poligoonz

Holders

299

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Poligoonz
0x66043f7d5f2b557dbcf35e1d7c7de72c84ad37e0
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:
PoligoonzNft

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-22
*/

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

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

/**
 * @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 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 ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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


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

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


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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


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

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

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

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

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

}


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

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

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

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

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

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

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

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

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

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

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

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

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

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

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


contract 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 ERC721Tradable
 * ERC721Tradable - ERC721 contract that whitelists a trading address, and has minting functionality.
 */
abstract contract ERC721Tradable is ContextMixin, ERC721Enumerable, NativeMetaTransaction, Ownable {
    using SafeMath for uint256;

    address proxyRegistryAddress;

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

    function baseTokenURI() virtual public view returns (string memory);

    function tokenURI(uint256 _tokenId) override public view returns (string memory) {
        return string(abi.encodePacked(baseTokenURI(), Strings.toString(_tokenId)));
    }

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

        return super.isApprovedForAll(owner, operator);
    }

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

interface INFT {
	function mint(address _to) external;
	function mintBatch(address _to, uint _amount) external;
}

contract PoligoonzNft is INFT, ERC721Tradable {

	uint public lastTokenId = 10000;
	uint public currentTokenId = 0;

	mapping(address => bool) public operators;
	
	string internal _baseTokenURI;

	constructor(
		address _proxyRegistryAddress,
		string memory _name,
		string memory _symbol,
		string memory __baseTokenURI,
		address[] memory _operators
	) ERC721Tradable(_name, _symbol, _proxyRegistryAddress)
	{
		_baseTokenURI = __baseTokenURI;

		for(uint i = 0; i < _operators.length; i++) {
			operators[_operators[i]] = true;
		}
	}
	
    /*
     * @dev function to update base URI for NFT marketplaces
     * @param __baseURI The new base URI 
     */
    function updateBaseURI(string memory __baseURI) public onlyOwner {
    	_baseTokenURI = __baseURI;
    }
    
    /*
     * @dev set operator status
     * @param _operatorAddress The address to which the changes will be applied 
     * @param _status Enabled or disabled (true/false)
     */
	function updateOperator(address _operatorAddress, bool _status) public onlyOwner {
		operators[_operatorAddress] = _status;
	}
    
    /*
     * @dev function to set lastTokenId
     * @param _lastTokenId Last token id
     */
	function changeLastTokenId(uint _lastTokenId) public onlyOwner {
		lastTokenId = _lastTokenId;
	}
    
    /*
     * @dev function to mint 1 NFT
     * @param _to To whom NFT will be minted
     */
	function mint(address _to) public override {
		require(operators[msg.sender], "only operators");
		require(currentTokenId + 1 <= lastTokenId, "exceed nft limit");
		currentTokenId++;
		
		_safeMint(_to, currentTokenId);
	}
    
    /*
     * @dev function to mint batch NFT's
     * @param _to To whom NFT will be minted
     * @param _amount How much tokens will be minted
     */
	function mintBatch(address _to, uint _amount) public override {
		require(operators[msg.sender], "only operators");
		require(currentTokenId + _amount <= lastTokenId, "exceed nft limit");

		uint buf = currentTokenId;
		for(uint i = 0; i < _amount; i++) {
			buf++;
			_safeMint(_to, buf);
		}
		
		currentTokenId = buf;	
	}
	
	function baseTokenURI() public view override returns(string memory) {
        return _baseTokenURI;
	}

	function _baseURI() internal view override returns(string memory) {
        return _baseTokenURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"__baseTokenURI","type":"string"},{"internalType":"address[]","name":"_operators","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lastTokenId","type":"uint256"}],"name":"changeLastTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"__baseURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operatorAddress","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"updateOperator","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600a60006101000a81548160ff021916908315150217905550612710600f5560006010553480156200003757600080fd5b506040516200557c3803806200557c83398181016040528101906200005d919062000659565b838386828281600090805190602001906200007a92919062000466565b5080600190805190602001906200009392919062000466565b5050506000620000a86200025960201b60201c565b905080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000199836200027560201b60201c565b5050508160129080519060200190620001b492919062000466565b5060005b81518110156200024d57600160116000848481518110620001de57620001dd62000a5a565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555080806200024490620009ae565b915050620001b8565b50505050505062000b25565b600062000270620002f760201b62001c701760201c565b905090565b600a60009054906101000a900460ff1615620002c8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002bf9062000803565b60405180910390fd5b620002d981620003aa60201b60201c565b6001600a60006101000a81548160ff02191690831515021790555050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415620003a357600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050620003a7565b3390505b90565b6040518060800160405280604f81526020016200552d604f91398051906020012081805190602001206040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152508051906020012030620004216200045960201b60201c565b60001b6040516020016200043a959493929190620007a6565b60405160208183030381529060405280519060200120600b8190555050565b6000804690508091505090565b828054620004749062000942565b90600052602060002090601f016020900481019282620004985760008555620004e4565b82601f10620004b357805160ff1916838001178555620004e4565b82800160010185558215620004e4579182015b82811115620004e3578251825591602001919060010190620004c6565b5b509050620004f39190620004f7565b5090565b5b8082111562000512576000816000905550600101620004f8565b5090565b60006200052d62000527846200084e565b62000825565b9050808382526020820190508285602086028201111562000553576200055262000abd565b5b60005b858110156200058757816200056c8882620005dc565b84526020840193506020830192505060018101905062000556565b5050509392505050565b6000620005a8620005a2846200087d565b62000825565b905082815260208101848484011115620005c757620005c662000ac2565b5b620005d48482856200090c565b509392505050565b600081519050620005ed8162000b0b565b92915050565b600082601f8301126200060b576200060a62000ab8565b5b81516200061d84826020860162000516565b91505092915050565b600082601f8301126200063e576200063d62000ab8565b5b81516200065084826020860162000591565b91505092915050565b600080600080600060a0868803121562000678576200067762000acc565b5b60006200068888828901620005dc565b955050602086015167ffffffffffffffff811115620006ac57620006ab62000ac7565b5b620006ba8882890162000626565b945050604086015167ffffffffffffffff811115620006de57620006dd62000ac7565b5b620006ec8882890162000626565b935050606086015167ffffffffffffffff81111562000710576200070f62000ac7565b5b6200071e8882890162000626565b925050608086015167ffffffffffffffff81111562000742576200074162000ac7565b5b6200075088828901620005f3565b9150509295509295909350565b6200076881620008c4565b82525050565b6200077981620008d8565b82525050565b60006200078e600e83620008b3565b91506200079b8262000ae2565b602082019050919050565b600060a082019050620007bd60008301886200076e565b620007cc60208301876200076e565b620007db60408301866200076e565b620007ea60608301856200075d565b620007f960808301846200076e565b9695505050505050565b600060208201905081810360008301526200081e816200077f565b9050919050565b60006200083162000844565b90506200083f828262000978565b919050565b6000604051905090565b600067ffffffffffffffff8211156200086c576200086b62000a89565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156200089b576200089a62000a89565b5b620008a68262000ad1565b9050602081019050919050565b600082825260208201905092915050565b6000620008d182620008e2565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200092c5780820151818401526020810190506200090f565b838111156200093c576000848401525b50505050565b600060028204905060018216806200095b57607f821691505b6020821081141562000972576200097162000a2b565b5b50919050565b620009838262000ad1565b810181811067ffffffffffffffff82111715620009a557620009a462000a89565b5b80604052505050565b6000620009bb8262000902565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620009f157620009f0620009fc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f616c726561647920696e69746564000000000000000000000000000000000000600082015250565b62000b1681620008c4565b811462000b2257600080fd5b50565b6149f88062000b356000396000f3fe6080604052600436106101ed5760003560e01c80634f6ccce71161010d578063931688cb116100a0578063c87b56dd1161006f578063c87b56dd14610713578063d547cfb714610750578063e985e9c51461077b578063f2fde38b146107b8578063f84ddf0b146107e1576101ed565b8063931688cb1461066d57806395d89b4114610696578063a22cb465146106c1578063b88d4fde146106ea576101ed565b806370a08231116100dc57806370a08231146105c5578063715018a61461060257806383669867146106195780638da5cb5b14610642576101ed565b80634f6ccce7146104f95780636352211e146105365780636a627842146105735780636d44a3b21461059c576101ed565b806318160ddd116101855780632d0335ab116101545780632d0335ab1461042b5780632f745c59146104685780633408e470146104a557806342842e0e146104d0576101ed565b806318160ddd1461038357806320379ee5146103ae57806323b872dd146103d9578063248b71fc14610402576101ed565b8063095ea7b3116101c1578063095ea7b3146102c25780630c53c51c146102eb5780630f7e59701461031b57806313e7c9d814610346576101ed565b80629a9b7b146101f257806301ffc9a71461021d57806306fdde031461025a578063081812fc14610285575b600080fd5b3480156101fe57600080fd5b5061020761080c565b6040516102149190613e02565b60405180910390f35b34801561022957600080fd5b50610244600480360381019061023f9190613381565b610812565b6040516102519190613a3e565b60405180910390f35b34801561026657600080fd5b5061026f61088c565b60405161027c9190613b20565b60405180910390f35b34801561029157600080fd5b506102ac60048036038101906102a79190613451565b61091e565b6040516102b99190613999565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e49190613341565b6109a3565b005b610305600480360381019061030091906132aa565b610abb565b6040516103129190613afe565b60405180910390f35b34801561032757600080fd5b50610330610d2d565b60405161033d9190613b20565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190613127565b610d66565b60405161037a9190613a3e565b60405180910390f35b34801561038f57600080fd5b50610398610d86565b6040516103a59190613e02565b60405180910390f35b3480156103ba57600080fd5b506103c3610d93565b6040516103d09190613a59565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613194565b610d9d565b005b34801561040e57600080fd5b5061042960048036038101906104249190613341565b610dfd565b005b34801561043757600080fd5b50610452600480360381019061044d9190613127565b610f25565b60405161045f9190613e02565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190613341565b610f6e565b60405161049c9190613e02565b60405180910390f35b3480156104b157600080fd5b506104ba611013565b6040516104c79190613e02565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190613194565b611020565b005b34801561050557600080fd5b50610520600480360381019061051b9190613451565b611040565b60405161052d9190613e02565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613451565b6110b1565b60405161056a9190613999565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613127565b611163565b005b3480156105a857600080fd5b506105c360048036038101906105be919061326a565b611269565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190613127565b611340565b6040516105f99190613e02565b60405180910390f35b34801561060e57600080fd5b506106176113f8565b005b34801561062557600080fd5b50610640600480360381019061063b9190613451565b611535565b005b34801561064e57600080fd5b506106576115bb565b6040516106649190613999565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f9190613408565b6115e5565b005b3480156106a257600080fd5b506106ab61167b565b6040516106b89190613b20565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e3919061326a565b61170d565b005b3480156106f657600080fd5b50610711600480360381019061070c91906131e7565b61188e565b005b34801561071f57600080fd5b5061073a60048036038101906107359190613451565b6118f0565b6040516107479190613b20565b60405180910390f35b34801561075c57600080fd5b5061076561192a565b6040516107729190613b20565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613154565b6119bc565b6040516107af9190613a3e565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da9190613127565b611abe565b005b3480156107ed57600080fd5b506107f6611c6a565b6040516108039190613e02565b60405180910390f35b60105481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610885575061088482611d21565b5b9050919050565b60606000805461089b9061409e565b80601f01602080910402602001604051908101604052809291908181526020018280546108c79061409e565b80156109145780601f106108e957610100808354040283529160200191610914565b820191906000526020600020905b8154815290600101906020018083116108f757829003601f168201915b5050505050905090565b600061092982611e03565b610968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095f90613d02565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109ae826110b1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1690613d82565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3e611e6f565b73ffffffffffffffffffffffffffffffffffffffff161480610a6d5750610a6c81610a67611e6f565b6119bc565b5b610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa390613c82565b60405180910390fd5b610ab68383611e7e565b505050565b606060006040518060600160405280600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610b3e8782878787611f37565b610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490613d62565b60405180910390fd5b610bd06001600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461204090919063ffffffff16565b600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610c46939291906139b4565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610c7b929190613916565b604051602081830303815290604052604051610c9791906138ff565b6000604051808303816000865af19150503d8060008114610cd4576040519150601f19603f3d011682016040523d82523d6000602084013e610cd9565b606091505b509150915081610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1590613bc2565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60116020528060005260406000206000915054906101000a900460ff1681565b6000600880549050905090565b6000600b54905090565b610dae610da8611e6f565b82612056565b610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490613da2565b60405180910390fd5b610df8838383612134565b505050565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090613b42565b60405180910390fd5b600f5481601054610e9a9190613ef2565b1115610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed290613de2565b60405180910390fd5b6000601054905060005b82811015610f18578180610ef890614101565b925050610f058483612390565b8080610f1090614101565b915050610ee5565b5080601081905550505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610f7983611340565b8210610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190613b62565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000804690508091505090565b61103b8383836040518060200160405280600081525061188e565b505050565b600061104a610d86565b821061108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290613dc2565b60405180910390fd5b6008828154811061109f5761109e614265565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561115a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115190613cc2565b60405180910390fd5b80915050919050565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613b42565b60405180910390fd5b600f5460016010546112019190613ef2565b1115611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613de2565b60405180910390fd5b6010600081548092919061125590614101565b919050555061126681601054612390565b50565b611271611e6f565b73ffffffffffffffffffffffffffffffffffffffff1661128f6115bb565b73ffffffffffffffffffffffffffffffffffffffff16146112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc90613d22565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a890613ca2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611400611e6f565b73ffffffffffffffffffffffffffffffffffffffff1661141e6115bb565b73ffffffffffffffffffffffffffffffffffffffff1614611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b90613d22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61153d611e6f565b73ffffffffffffffffffffffffffffffffffffffff1661155b6115bb565b73ffffffffffffffffffffffffffffffffffffffff16146115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890613d22565b60405180910390fd5b80600f8190555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115ed611e6f565b73ffffffffffffffffffffffffffffffffffffffff1661160b6115bb565b73ffffffffffffffffffffffffffffffffffffffff1614611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890613d22565b60405180910390fd5b8060129080519060200190611677929190612efc565b5050565b60606001805461168a9061409e565b80601f01602080910402602001604051908101604052809291908181526020018280546116b69061409e565b80156117035780601f106116d857610100808354040283529160200191611703565b820191906000526020600020905b8154815290600101906020018083116116e657829003601f168201915b5050505050905090565b611715611e6f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90613c22565b60405180910390fd5b8060056000611790611e6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661183d611e6f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118829190613a3e565b60405180910390a35050565b61189f611899611e6f565b83612056565b6118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590613da2565b60405180910390fd5b6118ea848484846123ae565b50505050565b60606118fa61192a565b6119038361240a565b60405160200161191492919061393e565b6040516020818303038152906040529050919050565b6060601280546119399061409e565b80601f01602080910402602001604051908101604052809291908181526020018280546119659061409e565b80156119b25780601f10611987576101008083540402835291602001916119b2565b820191906000526020600020905b81548152906001019060200180831161199557829003601f168201915b5050505050905090565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611a349190613999565b60206040518083038186803b158015611a4c57600080fd5b505afa158015611a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8491906133db565b73ffffffffffffffffffffffffffffffffffffffff161415611aaa576001915050611ab8565b611ab4848461256b565b9150505b92915050565b611ac6611e6f565b73ffffffffffffffffffffffffffffffffffffffff16611ae46115bb565b73ffffffffffffffffffffffffffffffffffffffff1614611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3190613d22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613ba2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611d1a57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611d1e565b3390505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611dfc5750611dfb826125ff565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611e79611c70565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ef1836110b1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f90613c62565b60405180910390fd5b6001611fbb611fb687612669565b6126d1565b83868660405160008152602001604052604051611fdb9493929190613ab9565b6020604051602081039080840390855afa158015611ffd573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b6000818361204e9190613ef2565b905092915050565b600061206182611e03565b6120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209790613c42565b60405180910390fd5b60006120ab836110b1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061211a57508373ffffffffffffffffffffffffffffffffffffffff166121028461091e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061212b575061212a81856119bc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612154826110b1565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a190613d42565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561221a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221190613c02565b60405180910390fd5b61222583838361270a565b612230600082611e7e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122809190613f79565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d79190613ef2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6123aa82826040518060200160405280600081525061281e565b5050565b6123b9848484612134565b6123c584848484612879565b612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613b82565b60405180910390fd5b50505050565b60606000821415612452576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612566565b600082905060005b6000821461248457808061246d90614101565b915050600a8261247d9190613f48565b915061245a565b60008167ffffffffffffffff8111156124a05761249f614294565b5b6040519080825280601f01601f1916602001820160405280156124d25781602001600182028036833780820191505090505b5090505b6000851461255f576001826124eb9190613f79565b9150600a856124fa9190614178565b60306125069190613ef2565b60f81b81838151811061251c5761251b614265565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125589190613f48565b94506124d6565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006040518060800160405280604381526020016149806043913980519060200120826000015183602001518460400151805190602001206040516020016126b49493929190613a74565b604051602081830303815290604052805190602001209050919050565b60006126db610d93565b826040516020016126ed929190613962565b604051602081830303815290604052805190602001209050919050565b612715838383612a10565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127585761275381612a15565b612797565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612796576127958382612a5e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127da576127d581612bcb565b612819565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612818576128178282612c9c565b5b5b505050565b6128288383612d1b565b6128356000848484612879565b612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b90613b82565b60405180910390fd5b505050565b600061289a8473ffffffffffffffffffffffffffffffffffffffff16612ee9565b15612a03578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128c3611e6f565b8786866040518563ffffffff1660e01b81526004016128e594939291906139f2565b602060405180830381600087803b1580156128ff57600080fd5b505af192505050801561293057506040513d601f19601f8201168201806040525081019061292d91906133ae565b60015b6129b3573d8060008114612960576040519150601f19603f3d011682016040523d82523d6000602084013e612965565b606091505b506000815114156129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a290613b82565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a08565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a6b84611340565b612a759190613f79565b9050600060076000848152602001908152602001600020549050818114612b5a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bdf9190613f79565b9050600060096000848152602001908152602001600020549050600060088381548110612c0f57612c0e614265565b5b906000526020600020015490508060088381548110612c3157612c30614265565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c8057612c7f614236565b5b6001900381819060005260206000200160009055905550505050565b6000612ca783611340565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8290613ce2565b60405180910390fd5b612d9481611e03565b15612dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcb90613be2565b60405180910390fd5b612de06000838361270a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e309190613ef2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612f089061409e565b90600052602060002090601f016020900481019282612f2a5760008555612f71565b82601f10612f4357805160ff1916838001178555612f71565b82800160010185558215612f71579182015b82811115612f70578251825591602001919060010190612f55565b5b509050612f7e9190612f82565b5090565b5b80821115612f9b576000816000905550600101612f83565b5090565b6000612fb2612fad84613e42565b613e1d565b905082815260208101848484011115612fce57612fcd6142c8565b5b612fd984828561405c565b509392505050565b6000612ff4612fef84613e73565b613e1d565b9050828152602081018484840111156130105761300f6142c8565b5b61301b84828561405c565b509392505050565b600081359050613032816148de565b92915050565b600081359050613047816148f5565b92915050565b60008135905061305c8161490c565b92915050565b60008135905061307181614923565b92915050565b60008151905061308681614923565b92915050565b600082601f8301126130a1576130a06142c3565b5b81356130b1848260208601612f9f565b91505092915050565b6000815190506130c98161493a565b92915050565b600082601f8301126130e4576130e36142c3565b5b81356130f4848260208601612fe1565b91505092915050565b60008135905061310c81614951565b92915050565b60008135905061312181614968565b92915050565b60006020828403121561313d5761313c6142d2565b5b600061314b84828501613023565b91505092915050565b6000806040838503121561316b5761316a6142d2565b5b600061317985828601613023565b925050602061318a85828601613023565b9150509250929050565b6000806000606084860312156131ad576131ac6142d2565b5b60006131bb86828701613023565b93505060206131cc86828701613023565b92505060406131dd868287016130fd565b9150509250925092565b60008060008060808587031215613201576132006142d2565b5b600061320f87828801613023565b945050602061322087828801613023565b9350506040613231878288016130fd565b925050606085013567ffffffffffffffff811115613252576132516142cd565b5b61325e8782880161308c565b91505092959194509250565b60008060408385031215613281576132806142d2565b5b600061328f85828601613023565b92505060206132a085828601613038565b9150509250929050565b600080600080600060a086880312156132c6576132c56142d2565b5b60006132d488828901613023565b955050602086013567ffffffffffffffff8111156132f5576132f46142cd565b5b6133018882890161308c565b94505060406133128882890161304d565b93505060606133238882890161304d565b925050608061333488828901613112565b9150509295509295909350565b60008060408385031215613358576133576142d2565b5b600061336685828601613023565b9250506020613377858286016130fd565b9150509250929050565b600060208284031215613397576133966142d2565b5b60006133a584828501613062565b91505092915050565b6000602082840312156133c4576133c36142d2565b5b60006133d284828501613077565b91505092915050565b6000602082840312156133f1576133f06142d2565b5b60006133ff848285016130ba565b91505092915050565b60006020828403121561341e5761341d6142d2565b5b600082013567ffffffffffffffff81111561343c5761343b6142cd565b5b613448848285016130cf565b91505092915050565b600060208284031215613467576134666142d2565b5b6000613475848285016130fd565b91505092915050565b61348781613fbf565b82525050565b61349681613fad565b82525050565b6134ad6134a882613fad565b61414a565b82525050565b6134bc81613fd1565b82525050565b6134cb81613fdd565b82525050565b6134e26134dd82613fdd565b61415c565b82525050565b60006134f382613ea4565b6134fd8185613eba565b935061350d81856020860161406b565b613516816142d7565b840191505092915050565b600061352c82613ea4565b6135368185613ecb565b935061354681856020860161406b565b80840191505092915050565b600061355d82613eaf565b6135678185613ed6565b935061357781856020860161406b565b613580816142d7565b840191505092915050565b600061359682613eaf565b6135a08185613ee7565b93506135b081856020860161406b565b80840191505092915050565b60006135c9600e83613ed6565b91506135d4826142f5565b602082019050919050565b60006135ec602b83613ed6565b91506135f78261431e565b604082019050919050565b600061360f603283613ed6565b915061361a8261436d565b604082019050919050565b6000613632602683613ed6565b915061363d826143bc565b604082019050919050565b6000613655601c83613ed6565b91506136608261440b565b602082019050919050565b6000613678601c83613ed6565b915061368382614434565b602082019050919050565b600061369b600283613ee7565b91506136a68261445d565b600282019050919050565b60006136be602483613ed6565b91506136c982614486565b604082019050919050565b60006136e1601983613ed6565b91506136ec826144d5565b602082019050919050565b6000613704602c83613ed6565b915061370f826144fe565b604082019050919050565b6000613727602583613ed6565b91506137328261454d565b604082019050919050565b600061374a603883613ed6565b91506137558261459c565b604082019050919050565b600061376d602a83613ed6565b9150613778826145eb565b604082019050919050565b6000613790602983613ed6565b915061379b8261463a565b604082019050919050565b60006137b3602083613ed6565b91506137be82614689565b602082019050919050565b60006137d6602c83613ed6565b91506137e1826146b2565b604082019050919050565b60006137f9602083613ed6565b915061380482614701565b602082019050919050565b600061381c602983613ed6565b91506138278261472a565b604082019050919050565b600061383f602183613ed6565b915061384a82614779565b604082019050919050565b6000613862602183613ed6565b915061386d826147c8565b604082019050919050565b6000613885603183613ed6565b915061389082614817565b604082019050919050565b60006138a8602c83613ed6565b91506138b382614866565b604082019050919050565b60006138cb601083613ed6565b91506138d6826148b5565b602082019050919050565b6138ea81614045565b82525050565b6138f98161404f565b82525050565b600061390b8284613521565b915081905092915050565b60006139228285613521565b915061392e828461349c565b6014820191508190509392505050565b600061394a828561358b565b9150613956828461358b565b91508190509392505050565b600061396d8261368e565b915061397982856134d1565b60208201915061398982846134d1565b6020820191508190509392505050565b60006020820190506139ae600083018461348d565b92915050565b60006060820190506139c9600083018661348d565b6139d6602083018561347e565b81810360408301526139e881846134e8565b9050949350505050565b6000608082019050613a07600083018761348d565b613a14602083018661348d565b613a2160408301856138e1565b8181036060830152613a3381846134e8565b905095945050505050565b6000602082019050613a5360008301846134b3565b92915050565b6000602082019050613a6e60008301846134c2565b92915050565b6000608082019050613a8960008301876134c2565b613a9660208301866138e1565b613aa3604083018561348d565b613ab060608301846134c2565b95945050505050565b6000608082019050613ace60008301876134c2565b613adb60208301866138f0565b613ae860408301856134c2565b613af560608301846134c2565b95945050505050565b60006020820190508181036000830152613b1881846134e8565b905092915050565b60006020820190508181036000830152613b3a8184613552565b905092915050565b60006020820190508181036000830152613b5b816135bc565b9050919050565b60006020820190508181036000830152613b7b816135df565b9050919050565b60006020820190508181036000830152613b9b81613602565b9050919050565b60006020820190508181036000830152613bbb81613625565b9050919050565b60006020820190508181036000830152613bdb81613648565b9050919050565b60006020820190508181036000830152613bfb8161366b565b9050919050565b60006020820190508181036000830152613c1b816136b1565b9050919050565b60006020820190508181036000830152613c3b816136d4565b9050919050565b60006020820190508181036000830152613c5b816136f7565b9050919050565b60006020820190508181036000830152613c7b8161371a565b9050919050565b60006020820190508181036000830152613c9b8161373d565b9050919050565b60006020820190508181036000830152613cbb81613760565b9050919050565b60006020820190508181036000830152613cdb81613783565b9050919050565b60006020820190508181036000830152613cfb816137a6565b9050919050565b60006020820190508181036000830152613d1b816137c9565b9050919050565b60006020820190508181036000830152613d3b816137ec565b9050919050565b60006020820190508181036000830152613d5b8161380f565b9050919050565b60006020820190508181036000830152613d7b81613832565b9050919050565b60006020820190508181036000830152613d9b81613855565b9050919050565b60006020820190508181036000830152613dbb81613878565b9050919050565b60006020820190508181036000830152613ddb8161389b565b9050919050565b60006020820190508181036000830152613dfb816138be565b9050919050565b6000602082019050613e1760008301846138e1565b92915050565b6000613e27613e38565b9050613e3382826140d0565b919050565b6000604051905090565b600067ffffffffffffffff821115613e5d57613e5c614294565b5b613e66826142d7565b9050602081019050919050565b600067ffffffffffffffff821115613e8e57613e8d614294565b5b613e97826142d7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613efd82614045565b9150613f0883614045565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3d57613f3c6141a9565b5b828201905092915050565b6000613f5382614045565b9150613f5e83614045565b925082613f6e57613f6d6141d8565b5b828204905092915050565b6000613f8482614045565b9150613f8f83614045565b925082821015613fa257613fa16141a9565b5b828203905092915050565b6000613fb882614025565b9050919050565b6000613fca82614025565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061401e82613fad565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561408957808201518184015260208101905061406e565b83811115614098576000848401525b50505050565b600060028204905060018216806140b657607f821691505b602082108114156140ca576140c9614207565b5b50919050565b6140d9826142d7565b810181811067ffffffffffffffff821117156140f8576140f7614294565b5b80604052505050565b600061410c82614045565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561413f5761413e6141a9565b5b600182019050919050565b600061415582614166565b9050919050565b6000819050919050565b6000614171826142e8565b9050919050565b600061418382614045565b915061418e83614045565b92508261419e5761419d6141d8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f6f6e6c79206f70657261746f7273000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f657863656564206e6674206c696d697400000000000000000000000000000000600082015250565b6148e781613fad565b81146148f257600080fd5b50565b6148fe81613fd1565b811461490957600080fd5b50565b61491581613fdd565b811461492057600080fd5b50565b61492c81613fe7565b811461493757600080fd5b50565b61494381614013565b811461494e57600080fd5b50565b61495a81614045565b811461496557600080fd5b50565b6149718161404f565b811461497c57600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220dcd1859b08a61c762401507f37cdbd17c19e8acc1b62720358bdb1d19b801c2964736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000014506f6c69676f6f6e7a20436f6c6c6563746976650000000000000000000000000000000000000000000000000000000000000000000000000000000000000009506f6c69676f6f6e7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f7374617469632e706f6c69676f6f6e7a2e696f2f6173736574732f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000026c3b144f5c2369eb8cb78579925eb9c701dce0f

Deployed Bytecode

0x6080604052600436106101ed5760003560e01c80634f6ccce71161010d578063931688cb116100a0578063c87b56dd1161006f578063c87b56dd14610713578063d547cfb714610750578063e985e9c51461077b578063f2fde38b146107b8578063f84ddf0b146107e1576101ed565b8063931688cb1461066d57806395d89b4114610696578063a22cb465146106c1578063b88d4fde146106ea576101ed565b806370a08231116100dc57806370a08231146105c5578063715018a61461060257806383669867146106195780638da5cb5b14610642576101ed565b80634f6ccce7146104f95780636352211e146105365780636a627842146105735780636d44a3b21461059c576101ed565b806318160ddd116101855780632d0335ab116101545780632d0335ab1461042b5780632f745c59146104685780633408e470146104a557806342842e0e146104d0576101ed565b806318160ddd1461038357806320379ee5146103ae57806323b872dd146103d9578063248b71fc14610402576101ed565b8063095ea7b3116101c1578063095ea7b3146102c25780630c53c51c146102eb5780630f7e59701461031b57806313e7c9d814610346576101ed565b80629a9b7b146101f257806301ffc9a71461021d57806306fdde031461025a578063081812fc14610285575b600080fd5b3480156101fe57600080fd5b5061020761080c565b6040516102149190613e02565b60405180910390f35b34801561022957600080fd5b50610244600480360381019061023f9190613381565b610812565b6040516102519190613a3e565b60405180910390f35b34801561026657600080fd5b5061026f61088c565b60405161027c9190613b20565b60405180910390f35b34801561029157600080fd5b506102ac60048036038101906102a79190613451565b61091e565b6040516102b99190613999565b60405180910390f35b3480156102ce57600080fd5b506102e960048036038101906102e49190613341565b6109a3565b005b610305600480360381019061030091906132aa565b610abb565b6040516103129190613afe565b60405180910390f35b34801561032757600080fd5b50610330610d2d565b60405161033d9190613b20565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190613127565b610d66565b60405161037a9190613a3e565b60405180910390f35b34801561038f57600080fd5b50610398610d86565b6040516103a59190613e02565b60405180910390f35b3480156103ba57600080fd5b506103c3610d93565b6040516103d09190613a59565b60405180910390f35b3480156103e557600080fd5b5061040060048036038101906103fb9190613194565b610d9d565b005b34801561040e57600080fd5b5061042960048036038101906104249190613341565b610dfd565b005b34801561043757600080fd5b50610452600480360381019061044d9190613127565b610f25565b60405161045f9190613e02565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a9190613341565b610f6e565b60405161049c9190613e02565b60405180910390f35b3480156104b157600080fd5b506104ba611013565b6040516104c79190613e02565b60405180910390f35b3480156104dc57600080fd5b506104f760048036038101906104f29190613194565b611020565b005b34801561050557600080fd5b50610520600480360381019061051b9190613451565b611040565b60405161052d9190613e02565b60405180910390f35b34801561054257600080fd5b5061055d60048036038101906105589190613451565b6110b1565b60405161056a9190613999565b60405180910390f35b34801561057f57600080fd5b5061059a60048036038101906105959190613127565b611163565b005b3480156105a857600080fd5b506105c360048036038101906105be919061326a565b611269565b005b3480156105d157600080fd5b506105ec60048036038101906105e79190613127565b611340565b6040516105f99190613e02565b60405180910390f35b34801561060e57600080fd5b506106176113f8565b005b34801561062557600080fd5b50610640600480360381019061063b9190613451565b611535565b005b34801561064e57600080fd5b506106576115bb565b6040516106649190613999565b60405180910390f35b34801561067957600080fd5b50610694600480360381019061068f9190613408565b6115e5565b005b3480156106a257600080fd5b506106ab61167b565b6040516106b89190613b20565b60405180910390f35b3480156106cd57600080fd5b506106e860048036038101906106e3919061326a565b61170d565b005b3480156106f657600080fd5b50610711600480360381019061070c91906131e7565b61188e565b005b34801561071f57600080fd5b5061073a60048036038101906107359190613451565b6118f0565b6040516107479190613b20565b60405180910390f35b34801561075c57600080fd5b5061076561192a565b6040516107729190613b20565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613154565b6119bc565b6040516107af9190613a3e565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da9190613127565b611abe565b005b3480156107ed57600080fd5b506107f6611c6a565b6040516108039190613e02565b60405180910390f35b60105481565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610885575061088482611d21565b5b9050919050565b60606000805461089b9061409e565b80601f01602080910402602001604051908101604052809291908181526020018280546108c79061409e565b80156109145780601f106108e957610100808354040283529160200191610914565b820191906000526020600020905b8154815290600101906020018083116108f757829003601f168201915b5050505050905090565b600061092982611e03565b610968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095f90613d02565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109ae826110b1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1690613d82565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a3e611e6f565b73ffffffffffffffffffffffffffffffffffffffff161480610a6d5750610a6c81610a67611e6f565b6119bc565b5b610aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa390613c82565b60405180910390fd5b610ab68383611e7e565b505050565b606060006040518060600160405280600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205481526020018873ffffffffffffffffffffffffffffffffffffffff168152602001878152509050610b3e8782878787611f37565b610b7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7490613d62565b60405180910390fd5b610bd06001600c60008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461204090919063ffffffff16565b600c60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610c46939291906139b4565b60405180910390a16000803073ffffffffffffffffffffffffffffffffffffffff16888a604051602001610c7b929190613916565b604051602081830303815290604052604051610c9791906138ff565b6000604051808303816000865af19150503d8060008114610cd4576040519150601f19603f3d011682016040523d82523d6000602084013e610cd9565b606091505b509150915081610d1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1590613bc2565b60405180910390fd5b80935050505095945050505050565b6040518060400160405280600181526020017f310000000000000000000000000000000000000000000000000000000000000081525081565b60116020528060005260406000206000915054906101000a900460ff1681565b6000600880549050905090565b6000600b54905090565b610dae610da8611e6f565b82612056565b610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490613da2565b60405180910390fd5b610df8838383612134565b505050565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610e89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8090613b42565b60405180910390fd5b600f5481601054610e9a9190613ef2565b1115610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed290613de2565b60405180910390fd5b6000601054905060005b82811015610f18578180610ef890614101565b925050610f058483612390565b8080610f1090614101565b915050610ee5565b5080601081905550505050565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000610f7983611340565b8210610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190613b62565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000804690508091505090565b61103b8383836040518060200160405280600081525061188e565b505050565b600061104a610d86565b821061108b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108290613dc2565b60405180910390fd5b6008828154811061109f5761109e614265565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561115a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115190613cc2565b60405180910390fd5b80915050919050565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166111ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e690613b42565b60405180910390fd5b600f5460016010546112019190613ef2565b1115611242576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161123990613de2565b60405180910390fd5b6010600081548092919061125590614101565b919050555061126681601054612390565b50565b611271611e6f565b73ffffffffffffffffffffffffffffffffffffffff1661128f6115bb565b73ffffffffffffffffffffffffffffffffffffffff16146112e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112dc90613d22565b60405180910390fd5b80601160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a890613ca2565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611400611e6f565b73ffffffffffffffffffffffffffffffffffffffff1661141e6115bb565b73ffffffffffffffffffffffffffffffffffffffff1614611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b90613d22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61153d611e6f565b73ffffffffffffffffffffffffffffffffffffffff1661155b6115bb565b73ffffffffffffffffffffffffffffffffffffffff16146115b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a890613d22565b60405180910390fd5b80600f8190555050565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115ed611e6f565b73ffffffffffffffffffffffffffffffffffffffff1661160b6115bb565b73ffffffffffffffffffffffffffffffffffffffff1614611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165890613d22565b60405180910390fd5b8060129080519060200190611677929190612efc565b5050565b60606001805461168a9061409e565b80601f01602080910402602001604051908101604052809291908181526020018280546116b69061409e565b80156117035780601f106116d857610100808354040283529160200191611703565b820191906000526020600020905b8154815290600101906020018083116116e657829003601f168201915b5050505050905090565b611715611e6f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611783576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177a90613c22565b60405180910390fd5b8060056000611790611e6f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661183d611e6f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118829190613a3e565b60405180910390a35050565b61189f611899611e6f565b83612056565b6118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d590613da2565b60405180910390fd5b6118ea848484846123ae565b50505050565b60606118fa61192a565b6119038361240a565b60405160200161191492919061393e565b6040516020818303038152906040529050919050565b6060601280546119399061409e565b80601f01602080910402602001604051908101604052809291908181526020018280546119659061409e565b80156119b25780601f10611987576101008083540402835291602001916119b2565b820191906000526020600020905b81548152906001019060200180831161199557829003601f168201915b5050505050905090565b600080600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b8152600401611a349190613999565b60206040518083038186803b158015611a4c57600080fd5b505afa158015611a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a8491906133db565b73ffffffffffffffffffffffffffffffffffffffff161415611aaa576001915050611ab8565b611ab4848461256b565b9150505b92915050565b611ac6611e6f565b73ffffffffffffffffffffffffffffffffffffffff16611ae46115bb565b73ffffffffffffffffffffffffffffffffffffffff1614611b3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3190613d22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba190613ba2565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611d1a57600080368080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509050600080369050905073ffffffffffffffffffffffffffffffffffffffff818301511692505050611d1e565b3390505b90565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611dec57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611dfc5750611dfb826125ff565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000611e79611c70565b905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ef1836110b1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f90613c62565b60405180910390fd5b6001611fbb611fb687612669565b6126d1565b83868660405160008152602001604052604051611fdb9493929190613ab9565b6020604051602081039080840390855afa158015611ffd573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614905095945050505050565b6000818361204e9190613ef2565b905092915050565b600061206182611e03565b6120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209790613c42565b60405180910390fd5b60006120ab836110b1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061211a57508373ffffffffffffffffffffffffffffffffffffffff166121028461091e565b73ffffffffffffffffffffffffffffffffffffffff16145b8061212b575061212a81856119bc565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612154826110b1565b73ffffffffffffffffffffffffffffffffffffffff16146121aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a190613d42565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561221a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221190613c02565b60405180910390fd5b61222583838361270a565b612230600082611e7e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122809190613f79565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d79190613ef2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6123aa82826040518060200160405280600081525061281e565b5050565b6123b9848484612134565b6123c584848484612879565b612404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fb90613b82565b60405180910390fd5b50505050565b60606000821415612452576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612566565b600082905060005b6000821461248457808061246d90614101565b915050600a8261247d9190613f48565b915061245a565b60008167ffffffffffffffff8111156124a05761249f614294565b5b6040519080825280601f01601f1916602001820160405280156124d25781602001600182028036833780820191505090505b5090505b6000851461255f576001826124eb9190613f79565b9150600a856124fa9190614178565b60306125069190613ef2565b60f81b81838151811061251c5761251b614265565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125589190613f48565b94506124d6565b8093505050505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006040518060800160405280604381526020016149806043913980519060200120826000015183602001518460400151805190602001206040516020016126b49493929190613a74565b604051602081830303815290604052805190602001209050919050565b60006126db610d93565b826040516020016126ed929190613962565b604051602081830303815290604052805190602001209050919050565b612715838383612a10565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127585761275381612a15565b612797565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612796576127958382612a5e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127da576127d581612bcb565b612819565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612818576128178282612c9c565b5b5b505050565b6128288383612d1b565b6128356000848484612879565b612874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286b90613b82565b60405180910390fd5b505050565b600061289a8473ffffffffffffffffffffffffffffffffffffffff16612ee9565b15612a03578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128c3611e6f565b8786866040518563ffffffff1660e01b81526004016128e594939291906139f2565b602060405180830381600087803b1580156128ff57600080fd5b505af192505050801561293057506040513d601f19601f8201168201806040525081019061292d91906133ae565b60015b6129b3573d8060008114612960576040519150601f19603f3d011682016040523d82523d6000602084013e612965565b606091505b506000815114156129ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129a290613b82565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a08565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612a6b84611340565b612a759190613f79565b9050600060076000848152602001908152602001600020549050818114612b5a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612bdf9190613f79565b9050600060096000848152602001908152602001600020549050600060088381548110612c0f57612c0e614265565b5b906000526020600020015490508060088381548110612c3157612c30614265565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612c8057612c7f614236565b5b6001900381819060005260206000200160009055905550505050565b6000612ca783611340565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612d8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8290613ce2565b60405180910390fd5b612d9481611e03565b15612dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dcb90613be2565b60405180910390fd5b612de06000838361270a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e309190613ef2565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612f089061409e565b90600052602060002090601f016020900481019282612f2a5760008555612f71565b82601f10612f4357805160ff1916838001178555612f71565b82800160010185558215612f71579182015b82811115612f70578251825591602001919060010190612f55565b5b509050612f7e9190612f82565b5090565b5b80821115612f9b576000816000905550600101612f83565b5090565b6000612fb2612fad84613e42565b613e1d565b905082815260208101848484011115612fce57612fcd6142c8565b5b612fd984828561405c565b509392505050565b6000612ff4612fef84613e73565b613e1d565b9050828152602081018484840111156130105761300f6142c8565b5b61301b84828561405c565b509392505050565b600081359050613032816148de565b92915050565b600081359050613047816148f5565b92915050565b60008135905061305c8161490c565b92915050565b60008135905061307181614923565b92915050565b60008151905061308681614923565b92915050565b600082601f8301126130a1576130a06142c3565b5b81356130b1848260208601612f9f565b91505092915050565b6000815190506130c98161493a565b92915050565b600082601f8301126130e4576130e36142c3565b5b81356130f4848260208601612fe1565b91505092915050565b60008135905061310c81614951565b92915050565b60008135905061312181614968565b92915050565b60006020828403121561313d5761313c6142d2565b5b600061314b84828501613023565b91505092915050565b6000806040838503121561316b5761316a6142d2565b5b600061317985828601613023565b925050602061318a85828601613023565b9150509250929050565b6000806000606084860312156131ad576131ac6142d2565b5b60006131bb86828701613023565b93505060206131cc86828701613023565b92505060406131dd868287016130fd565b9150509250925092565b60008060008060808587031215613201576132006142d2565b5b600061320f87828801613023565b945050602061322087828801613023565b9350506040613231878288016130fd565b925050606085013567ffffffffffffffff811115613252576132516142cd565b5b61325e8782880161308c565b91505092959194509250565b60008060408385031215613281576132806142d2565b5b600061328f85828601613023565b92505060206132a085828601613038565b9150509250929050565b600080600080600060a086880312156132c6576132c56142d2565b5b60006132d488828901613023565b955050602086013567ffffffffffffffff8111156132f5576132f46142cd565b5b6133018882890161308c565b94505060406133128882890161304d565b93505060606133238882890161304d565b925050608061333488828901613112565b9150509295509295909350565b60008060408385031215613358576133576142d2565b5b600061336685828601613023565b9250506020613377858286016130fd565b9150509250929050565b600060208284031215613397576133966142d2565b5b60006133a584828501613062565b91505092915050565b6000602082840312156133c4576133c36142d2565b5b60006133d284828501613077565b91505092915050565b6000602082840312156133f1576133f06142d2565b5b60006133ff848285016130ba565b91505092915050565b60006020828403121561341e5761341d6142d2565b5b600082013567ffffffffffffffff81111561343c5761343b6142cd565b5b613448848285016130cf565b91505092915050565b600060208284031215613467576134666142d2565b5b6000613475848285016130fd565b91505092915050565b61348781613fbf565b82525050565b61349681613fad565b82525050565b6134ad6134a882613fad565b61414a565b82525050565b6134bc81613fd1565b82525050565b6134cb81613fdd565b82525050565b6134e26134dd82613fdd565b61415c565b82525050565b60006134f382613ea4565b6134fd8185613eba565b935061350d81856020860161406b565b613516816142d7565b840191505092915050565b600061352c82613ea4565b6135368185613ecb565b935061354681856020860161406b565b80840191505092915050565b600061355d82613eaf565b6135678185613ed6565b935061357781856020860161406b565b613580816142d7565b840191505092915050565b600061359682613eaf565b6135a08185613ee7565b93506135b081856020860161406b565b80840191505092915050565b60006135c9600e83613ed6565b91506135d4826142f5565b602082019050919050565b60006135ec602b83613ed6565b91506135f78261431e565b604082019050919050565b600061360f603283613ed6565b915061361a8261436d565b604082019050919050565b6000613632602683613ed6565b915061363d826143bc565b604082019050919050565b6000613655601c83613ed6565b91506136608261440b565b602082019050919050565b6000613678601c83613ed6565b915061368382614434565b602082019050919050565b600061369b600283613ee7565b91506136a68261445d565b600282019050919050565b60006136be602483613ed6565b91506136c982614486565b604082019050919050565b60006136e1601983613ed6565b91506136ec826144d5565b602082019050919050565b6000613704602c83613ed6565b915061370f826144fe565b604082019050919050565b6000613727602583613ed6565b91506137328261454d565b604082019050919050565b600061374a603883613ed6565b91506137558261459c565b604082019050919050565b600061376d602a83613ed6565b9150613778826145eb565b604082019050919050565b6000613790602983613ed6565b915061379b8261463a565b604082019050919050565b60006137b3602083613ed6565b91506137be82614689565b602082019050919050565b60006137d6602c83613ed6565b91506137e1826146b2565b604082019050919050565b60006137f9602083613ed6565b915061380482614701565b602082019050919050565b600061381c602983613ed6565b91506138278261472a565b604082019050919050565b600061383f602183613ed6565b915061384a82614779565b604082019050919050565b6000613862602183613ed6565b915061386d826147c8565b604082019050919050565b6000613885603183613ed6565b915061389082614817565b604082019050919050565b60006138a8602c83613ed6565b91506138b382614866565b604082019050919050565b60006138cb601083613ed6565b91506138d6826148b5565b602082019050919050565b6138ea81614045565b82525050565b6138f98161404f565b82525050565b600061390b8284613521565b915081905092915050565b60006139228285613521565b915061392e828461349c565b6014820191508190509392505050565b600061394a828561358b565b9150613956828461358b565b91508190509392505050565b600061396d8261368e565b915061397982856134d1565b60208201915061398982846134d1565b6020820191508190509392505050565b60006020820190506139ae600083018461348d565b92915050565b60006060820190506139c9600083018661348d565b6139d6602083018561347e565b81810360408301526139e881846134e8565b9050949350505050565b6000608082019050613a07600083018761348d565b613a14602083018661348d565b613a2160408301856138e1565b8181036060830152613a3381846134e8565b905095945050505050565b6000602082019050613a5360008301846134b3565b92915050565b6000602082019050613a6e60008301846134c2565b92915050565b6000608082019050613a8960008301876134c2565b613a9660208301866138e1565b613aa3604083018561348d565b613ab060608301846134c2565b95945050505050565b6000608082019050613ace60008301876134c2565b613adb60208301866138f0565b613ae860408301856134c2565b613af560608301846134c2565b95945050505050565b60006020820190508181036000830152613b1881846134e8565b905092915050565b60006020820190508181036000830152613b3a8184613552565b905092915050565b60006020820190508181036000830152613b5b816135bc565b9050919050565b60006020820190508181036000830152613b7b816135df565b9050919050565b60006020820190508181036000830152613b9b81613602565b9050919050565b60006020820190508181036000830152613bbb81613625565b9050919050565b60006020820190508181036000830152613bdb81613648565b9050919050565b60006020820190508181036000830152613bfb8161366b565b9050919050565b60006020820190508181036000830152613c1b816136b1565b9050919050565b60006020820190508181036000830152613c3b816136d4565b9050919050565b60006020820190508181036000830152613c5b816136f7565b9050919050565b60006020820190508181036000830152613c7b8161371a565b9050919050565b60006020820190508181036000830152613c9b8161373d565b9050919050565b60006020820190508181036000830152613cbb81613760565b9050919050565b60006020820190508181036000830152613cdb81613783565b9050919050565b60006020820190508181036000830152613cfb816137a6565b9050919050565b60006020820190508181036000830152613d1b816137c9565b9050919050565b60006020820190508181036000830152613d3b816137ec565b9050919050565b60006020820190508181036000830152613d5b8161380f565b9050919050565b60006020820190508181036000830152613d7b81613832565b9050919050565b60006020820190508181036000830152613d9b81613855565b9050919050565b60006020820190508181036000830152613dbb81613878565b9050919050565b60006020820190508181036000830152613ddb8161389b565b9050919050565b60006020820190508181036000830152613dfb816138be565b9050919050565b6000602082019050613e1760008301846138e1565b92915050565b6000613e27613e38565b9050613e3382826140d0565b919050565b6000604051905090565b600067ffffffffffffffff821115613e5d57613e5c614294565b5b613e66826142d7565b9050602081019050919050565b600067ffffffffffffffff821115613e8e57613e8d614294565b5b613e97826142d7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613efd82614045565b9150613f0883614045565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613f3d57613f3c6141a9565b5b828201905092915050565b6000613f5382614045565b9150613f5e83614045565b925082613f6e57613f6d6141d8565b5b828204905092915050565b6000613f8482614045565b9150613f8f83614045565b925082821015613fa257613fa16141a9565b5b828203905092915050565b6000613fb882614025565b9050919050565b6000613fca82614025565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061401e82613fad565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561408957808201518184015260208101905061406e565b83811115614098576000848401525b50505050565b600060028204905060018216806140b657607f821691505b602082108114156140ca576140c9614207565b5b50919050565b6140d9826142d7565b810181811067ffffffffffffffff821117156140f8576140f7614294565b5b80604052505050565b600061410c82614045565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561413f5761413e6141a9565b5b600182019050919050565b600061415582614166565b9050919050565b6000819050919050565b6000614171826142e8565b9050919050565b600061418382614045565b915061418e83614045565b92508261419e5761419d6141d8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f6f6e6c79206f70657261746f7273000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f46756e6374696f6e2063616c6c206e6f74207375636365737366756c00000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360008201527f49474e4552000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f5369676e657220616e64207369676e617475726520646f206e6f74206d61746360008201527f6800000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f657863656564206e6674206c696d697400000000000000000000000000000000600082015250565b6148e781613fad565b81146148f257600080fd5b50565b6148fe81613fd1565b811461490957600080fd5b50565b61491581613fdd565b811461492057600080fd5b50565b61492c81613fe7565b811461493757600080fd5b50565b61494381614013565b811461494e57600080fd5b50565b61495a81614045565b811461496557600080fd5b50565b6149718161404f565b811461497c57600080fd5b5056fe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220dcd1859b08a61c762401507f37cdbd17c19e8acc1b62720358bdb1d19b801c2964736f6c63430008070033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001800000000000000000000000000000000000000000000000000000000000000014506f6c69676f6f6e7a20436f6c6c6563746976650000000000000000000000000000000000000000000000000000000000000000000000000000000000000009506f6c69676f6f6e7a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002368747470733a2f2f7374617469632e706f6c69676f6f6e7a2e696f2f6173736574732f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000026c3b144f5c2369eb8cb78579925eb9c701dce0f

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [1] : _name (string): Poligoonz Collective
Arg [2] : _symbol (string): Poligoonz
Arg [3] : __baseTokenURI (string): https://static.poligoonz.io/assets/
Arg [4] : _operators (address[]): 0x26C3b144F5c2369eB8Cb78579925EB9c701dCE0f

-----Encoded View---------------
14 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 506f6c69676f6f6e7a20436f6c6c656374697665000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [8] : 506f6c69676f6f6e7a0000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000023
Arg [10] : 68747470733a2f2f7374617469632e706f6c69676f6f6e7a2e696f2f61737365
Arg [11] : 74732f0000000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [13] : 00000000000000000000000026c3b144f5c2369eb8cb78579925eb9c701dce0f


Deployed Bytecode Sourcemap

56541:2392:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56628:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31287:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18721:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20181:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19718:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52400:1151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49665:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56664:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31940:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50674:101;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21071:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58375:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53977:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31608:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50783:161;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21447:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32130:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18415:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57979:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57535:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18145:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39077:148;;;;;;;;;;;;;:::i;:::-;;57772:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38426:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57232:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18890:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20474:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21669:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55357:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58716:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55664:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39380:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56593:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56628:30;;;;:::o;31287:237::-;31389:4;31428:35;31413:50;;;:11;:50;;;;:103;;;;31480:36;31504:11;31480:23;:36::i;:::-;31413:103;31406:110;;31287:237;;;:::o;18721:100::-;18775:13;18808:5;18801:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18721:100;:::o;20181:221::-;20257:7;20285:16;20293:7;20285;:16::i;:::-;20277:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20370:15;:24;20386:7;20370:24;;;;;;;;;;;;;;;;;;;;;20363:31;;20181:221;;;:::o;19718:397::-;19799:13;19815:23;19830:7;19815:14;:23::i;:::-;19799:39;;19863:5;19857:11;;:2;:11;;;;19849:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;19943:5;19927:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;19952:37;19969:5;19976:12;:10;:12::i;:::-;19952:16;:37::i;:::-;19927:62;19919:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;20086:21;20095:2;20099:7;20086:8;:21::i;:::-;19788:327;19718:397;;:::o;52400:1151::-;52601:12;52626:29;52658:152;;;;;;;;52696:6;:19;52703:11;52696:19;;;;;;;;;;;;;;;;52658:152;;;;52736:11;52658:152;;;;;;52781:17;52658:152;;;52626:184;;52845:45;52852:11;52865:6;52873:4;52879;52885;52845:6;:45::i;:::-;52823:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;53040:26;53064:1;53040:6;:19;53047:11;53040:19;;;;;;;;;;;;;;;;:23;;:26;;;;:::i;:::-;53018:6;:19;53025:11;53018:19;;;;;;;;;;;;;;;:48;;;;53084:126;53122:11;53156:10;53182:17;53084:126;;;;;;;;:::i;:::-;;;;;;;;53321:12;53335:23;53370:4;53362:18;;53412:17;53431:11;53395:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53362:92;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53320:134;;;;53473:7;53465:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53533:10;53526:17;;;;;52400:1151;;;;;;;:::o;49665:43::-;;;;;;;;;;;;;;;;;;;:::o;56664:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;31940:113::-;32001:7;32028:10;:17;;;;32021:24;;31940:113;:::o;50674:101::-;50725:7;50752:15;;50745:22;;50674:101;:::o;21071:305::-;21232:41;21251:12;:10;:12::i;:::-;21265:7;21232:18;:41::i;:::-;21224:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;21340:28;21350:4;21356:2;21360:7;21340:9;:28::i;:::-;21071:305;;;:::o;58375:335::-;58450:9;:21;58460:10;58450:21;;;;;;;;;;;;;;;;;;;;;;;;;58442:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;58531:11;;58520:7;58503:14;;:24;;;;:::i;:::-;:39;;58495:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58570:8;58581:14;;58570:25;;58604:6;58600:76;58620:7;58616:1;:11;58600:76;;;58640:5;;;;;:::i;:::-;;;;58651:19;58661:3;58666;58651:9;:19::i;:::-;58629:3;;;;;:::i;:::-;;;;58600:76;;;;58701:3;58684:14;:20;;;;58437:273;58375:335;;:::o;53977:107::-;54030:13;54064:6;:12;54071:4;54064:12;;;;;;;;;;;;;;;;54056:20;;53977:107;;;:::o;31608:256::-;31705:7;31741:23;31758:5;31741:16;:23::i;:::-;31733:5;:31;31725:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;31830:12;:19;31843:5;31830:19;;;;;;;;;;;;;;;:26;31850:5;31830:26;;;;;;;;;;;;31823:33;;31608:256;;;;:::o;50783:161::-;50826:7;50846:10;50897:9;50891:15;;50934:2;50927:9;;;50783:161;:::o;21447:151::-;21551:39;21568:4;21574:2;21578:7;21551:39;;;;;;;;;;;;:16;:39::i;:::-;21447:151;;;:::o;32130:233::-;32205:7;32241:30;:28;:30::i;:::-;32233:5;:38;32225:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;32338:10;32349:5;32338:17;;;;;;;;:::i;:::-;;;;;;;;;;32331:24;;32130:233;;;:::o;18415:239::-;18487:7;18507:13;18523:7;:16;18531:7;18523:16;;;;;;;;;;;;;;;;;;;;;18507:32;;18575:1;18558:19;;:5;:19;;;;18550:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18641:5;18634:12;;;18415:239;;;:::o;57979:228::-;58035:9;:21;58045:10;58035:21;;;;;;;;;;;;;;;;;;;;;;;;;58027:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;58110:11;;58105:1;58088:14;;:18;;;;:::i;:::-;:33;;58080:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;58147:14;;:16;;;;;;;;;:::i;:::-;;;;;;58172:30;58182:3;58187:14;;58172:9;:30::i;:::-;57979:228;:::o;57535:128::-;38657:12;:10;:12::i;:::-;38646:23;;:7;:5;:7::i;:::-;:23;;;38638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57651:7:::1;57621:9;:27;57631:16;57621:27;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;57535:128:::0;;:::o;18145:208::-;18217:7;18262:1;18245:19;;:5;:19;;;;18237:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;18329:9;:16;18339:5;18329:16;;;;;;;;;;;;;;;;18322:23;;18145:208;;;:::o;39077:148::-;38657:12;:10;:12::i;:::-;38646:23;;:7;:5;:7::i;:::-;:23;;;38638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39184:1:::1;39147:40;;39168:6;;;;;;;;;;;39147:40;;;;;;;;;;;;39215:1;39198:6;;:19;;;;;;;;;;;;;;;;;;39077:148::o:0;57772:99::-;38657:12;:10;:12::i;:::-;38646:23;;:7;:5;:7::i;:::-;:23;;;38638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57854:12:::1;57840:11;:26;;;;57772:99:::0;:::o;38426:87::-;38472:7;38499:6;;;;;;;;;;;38492:13;;38426:87;:::o;57232:106::-;38657:12;:10;:12::i;:::-;38646:23;;:7;:5;:7::i;:::-;:23;;;38638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57321:9:::1;57305:13;:25;;;;;;;;;;;;:::i;:::-;;57232:106:::0;:::o;18890:104::-;18946:13;18979:7;18972:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18890:104;:::o;20474:295::-;20589:12;:10;:12::i;:::-;20577:24;;:8;:24;;;;20569:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;20689:8;20644:18;:32;20663:12;:10;:12::i;:::-;20644:32;;;;;;;;;;;;;;;:42;20677:8;20644:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;20742:8;20713:48;;20728:12;:10;:12::i;:::-;20713:48;;;20752:8;20713:48;;;;;;:::i;:::-;;;;;;;;20474:295;;:::o;21669:285::-;21801:41;21820:12;:10;:12::i;:::-;21834:7;21801:18;:41::i;:::-;21793:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;21907:39;21921:4;21927:2;21931:7;21940:5;21907:13;:39::i;:::-;21669:285;;;;:::o;55357:175::-;55423:13;55480:14;:12;:14::i;:::-;55496:26;55513:8;55496:16;:26::i;:::-;55463:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55449:75;;55357:175;;;:::o;58716:104::-;58769:13;58802;58795:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58716:104;:::o;55664:445::-;55789:4;55874:27;55918:20;;;;;;;;;;;55874:65;;55995:8;55954:49;;55962:13;:21;;;55984:5;55962:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55954:49;;;55950:93;;;56027:4;56020:11;;;;;55950:93;56062:39;56085:5;56092:8;56062:22;:39::i;:::-;56055:46;;;55664:445;;;;;:::o;39380:244::-;38657:12;:10;:12::i;:::-;38646:23;;:7;:5;:7::i;:::-;:23;;;38638:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39489:1:::1;39469:22;;:8;:22;;;;39461:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39579:8;39550:38;;39571:6;;;;;;;;;;;39550:38;;;;;;;;;;;;39608:8;39599:6;;:17;;;;;;;;;;;;;;;;;;39380:244:::0;:::o;56593:31::-;;;;:::o;41652:650::-;41723:22;41789:4;41767:27;;:10;:27;;;41763:508;;;41811:18;41832:8;;41811:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41855:13;41871:8;;:15;;41855:31;;42123:42;42093:5;42086;42082:17;42076:24;42050:134;42040:144;;41910:289;;41763:508;;;42248:10;42231:28;;41763:508;41652:650;:::o;17789:292::-;17891:4;17930:25;17915:40;;;:11;:40;;;;:105;;;;17987:33;17972:48;;;:11;:48;;;;17915:105;:158;;;;18037:36;18061:11;18037:23;:36::i;:::-;17915:158;17908:165;;17789:292;;;:::o;23421:127::-;23486:4;23538:1;23510:30;;:7;:16;23518:7;23510:16;;;;;;;;;;;;;;;;;;;;;:30;;;;23503:37;;23421:127;;;:::o;56253:161::-;56343:14;56382:24;:22;:24::i;:::-;56375:31;;56253:161;:::o;27298:174::-;27400:2;27373:15;:24;27389:7;27373:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;27456:7;27452:2;27418:46;;27427:23;27442:7;27427:14;:23::i;:::-;27418:46;;;;;;;;;;;;27298:174;;:::o;54092:486::-;54270:4;54313:1;54295:20;;:6;:20;;;;54287:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;54411:159;54439:47;54458:27;54478:6;54458:19;:27::i;:::-;54439:18;:47::i;:::-;54505:4;54528;54551;54411:159;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54388:182;;:6;:182;;;54368:202;;54092:486;;;;;;;:::o;45010:98::-;45068:7;45099:1;45095;:5;;;;:::i;:::-;45088:12;;45010:98;;;;:::o;23715:348::-;23808:4;23833:16;23841:7;23833;:16::i;:::-;23825:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23909:13;23925:23;23940:7;23925:14;:23::i;:::-;23909:39;;23978:5;23967:16;;:7;:16;;;:51;;;;24011:7;23987:31;;:20;23999:7;23987:11;:20::i;:::-;:31;;;23967:51;:87;;;;24022:32;24039:5;24046:7;24022:16;:32::i;:::-;23967:87;23959:96;;;23715:348;;;;:::o;26636:544::-;26761:4;26734:31;;:23;26749:7;26734:14;:23::i;:::-;:31;;;26726:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;26844:1;26830:16;;:2;:16;;;;26822:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;26900:39;26921:4;26927:2;26931:7;26900:20;:39::i;:::-;27004:29;27021:1;27025:7;27004:8;:29::i;:::-;27065:1;27046:9;:15;27056:4;27046:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;27094:1;27077:9;:13;27087:2;27077:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27125:2;27106:7;:16;27114:7;27106:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27164:7;27160:2;27145:27;;27154:4;27145:27;;;;;;;;;;;;26636:544;;;:::o;24405:110::-;24481:26;24491:2;24495:7;24481:26;;;;;;;;;;;;:9;:26::i;:::-;24405:110;;:::o;22836:272::-;22950:28;22960:4;22966:2;22970:7;22950:9;:28::i;:::-;22997:48;23020:4;23026:2;23030:7;23039:5;22997:22;:48::i;:::-;22989:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;22836:272;;;;:::o;39855:723::-;39911:13;40141:1;40132:5;:10;40128:53;;;40159:10;;;;;;;;;;;;;;;;;;;;;40128:53;40191:12;40206:5;40191:20;;40222:14;40247:78;40262:1;40254:4;:9;40247:78;;40280:8;;;;;:::i;:::-;;;;40311:2;40303:10;;;;;:::i;:::-;;;40247:78;;;40335:19;40367:6;40357:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40335:39;;40385:154;40401:1;40392:5;:10;40385:154;;40429:1;40419:11;;;;;:::i;:::-;;;40496:2;40488:5;:10;;;;:::i;:::-;40475:2;:24;;;;:::i;:::-;40462:39;;40445:6;40452;40445:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;40525:2;40516:11;;;;;:::i;:::-;;;40385:154;;;40563:6;40549:21;;;;;39855:723;;;;:::o;20840:164::-;20937:4;20961:18;:25;20980:5;20961:25;;;;;;;;;;;;;;;:35;20987:8;20961:35;;;;;;;;;;;;;;;;;;;;;;;;;20954:42;;20840:164;;;;:::o;2327:157::-;2412:4;2451:25;2436:40;;;:11;:40;;;;2429:47;;2327:157;;;:::o;53559:410::-;53669:7;51736:100;;;;;;;;;;;;;;;;;51716:127;;;;;;53823:6;:12;;;53858:6;:11;;;53902:6;:24;;;53892:35;;;;;;53742:204;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53714:247;;;;;;53694:267;;53559:410;;;:::o;51313:258::-;51412:7;51514:20;:18;:20::i;:::-;51536:11;51485:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51457:106;;;;;;51437:126;;51313:258;;;:::o;32976:555::-;33086:45;33113:4;33119:2;33123:7;33086:26;:45::i;:::-;33164:1;33148:18;;:4;:18;;;33144:187;;;33183:40;33215:7;33183:31;:40::i;:::-;33144:187;;;33253:2;33245:10;;:4;:10;;;33241:90;;33272:47;33305:4;33311:7;33272:32;:47::i;:::-;33241:90;33144:187;33359:1;33345:16;;:2;:16;;;33341:183;;;33378:45;33415:7;33378:36;:45::i;:::-;33341:183;;;33451:4;33445:10;;:2;:10;;;33441:83;;33472:40;33500:2;33504:7;33472:27;:40::i;:::-;33441:83;33341:183;32976:555;;;:::o;24742:250::-;24838:18;24844:2;24848:7;24838:5;:18::i;:::-;24875:54;24906:1;24910:2;24914:7;24923:5;24875:22;:54::i;:::-;24867:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;24742:250;;;:::o;28037:843::-;28158:4;28184:15;:2;:13;;;:15::i;:::-;28180:693;;;28236:2;28220:36;;;28257:12;:10;:12::i;:::-;28271:4;28277:7;28286:5;28220:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28216:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28483:1;28466:6;:13;:18;28462:341;;;28509:60;;;;;;;;;;:::i;:::-;;;;;;;;28462:341;28753:6;28747:13;28738:6;28734:2;28730:15;28723:38;28216:602;28353:45;;;28343:55;;;:6;:55;;;;28336:62;;;;;28180:693;28857:4;28850:11;;28037:843;;;;;;;:::o;29493:93::-;;;;:::o;34254:164::-;34358:10;:17;;;;34331:15;:24;34347:7;34331:24;;;;;;;;;;;:44;;;;34386:10;34402:7;34386:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34254:164;:::o;35045:988::-;35311:22;35361:1;35336:22;35353:4;35336:16;:22::i;:::-;:26;;;;:::i;:::-;35311:51;;35373:18;35394:17;:26;35412:7;35394:26;;;;;;;;;;;;35373:47;;35541:14;35527:10;:28;35523:328;;35572:19;35594:12;:18;35607:4;35594:18;;;;;;;;;;;;;;;:34;35613:14;35594:34;;;;;;;;;;;;35572:56;;35678:11;35645:12;:18;35658:4;35645:18;;;;;;;;;;;;;;;:30;35664:10;35645:30;;;;;;;;;;;:44;;;;35795:10;35762:17;:30;35780:11;35762:30;;;;;;;;;;;:43;;;;35557:294;35523:328;35947:17;:26;35965:7;35947:26;;;;;;;;;;;35940:33;;;35991:12;:18;36004:4;35991:18;;;;;;;;;;;;;;;:34;36010:14;35991:34;;;;;;;;;;;35984:41;;;35126:907;;35045:988;;:::o;36328:1079::-;36581:22;36626:1;36606:10;:17;;;;:21;;;;:::i;:::-;36581:46;;36638:18;36659:15;:24;36675:7;36659:24;;;;;;;;;;;;36638:45;;37010:19;37032:10;37043:14;37032:26;;;;;;;;:::i;:::-;;;;;;;;;;37010:48;;37096:11;37071:10;37082;37071:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;37207:10;37176:15;:28;37192:11;37176:28;;;;;;;;;;;:41;;;;37348:15;:24;37364:7;37348:24;;;;;;;;;;;37341:31;;;37383:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36399:1008;;;36328:1079;:::o;33832:221::-;33917:14;33934:20;33951:2;33934:16;:20::i;:::-;33917:37;;33992:7;33965:12;:16;33978:2;33965:16;;;;;;;;;;;;;;;:24;33982:6;33965:24;;;;;;;;;;;:34;;;;34039:6;34010:17;:26;34028:7;34010:26;;;;;;;;;;;:35;;;;33906:147;33832:221;;:::o;25328:382::-;25422:1;25408:16;;:2;:16;;;;25400:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;25481:16;25489:7;25481;:16::i;:::-;25480:17;25472:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;25543:45;25572:1;25576:2;25580:7;25543:20;:45::i;:::-;25618:1;25601:9;:13;25611:2;25601:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;25649:2;25630:7;:16;25638:7;25630:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;25694:7;25690:2;25669:33;;25686:1;25669:33;;;;;;;;;;;;25328:382;;:::o;8406:422::-;8466:4;8674:12;8785:7;8773:20;8765:28;;8819:1;8812:4;:8;8805:15;;;8406:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410: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:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1917:201::-;2003:5;2034:6;2028:13;2019:22;;2050:62;2106:5;2050:62;:::i;:::-;1917:201;;;;:::o;2138:340::-;2194:5;2243:3;2236:4;2228:6;2224:17;2220:27;2210:122;;2251:79;;:::i;:::-;2210:122;2368:6;2355:20;2393:79;2468:3;2460:6;2453:4;2445:6;2441:17;2393:79;:::i;:::-;2384:88;;2200:278;2138:340;;;;:::o;2484:139::-;2530:5;2568:6;2555:20;2546:29;;2584:33;2611:5;2584:33;:::i;:::-;2484:139;;;;:::o;2629:135::-;2673:5;2711:6;2698:20;2689:29;;2727:31;2752:5;2727:31;:::i;:::-;2629:135;;;;:::o;2770:329::-;2829:6;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;2770:329;;;;:::o;3105:474::-;3173:6;3181;3230:2;3218:9;3209:7;3205:23;3201:32;3198:119;;;3236:79;;:::i;:::-;3198:119;3356:1;3381:53;3426:7;3417:6;3406:9;3402:22;3381:53;:::i;:::-;3371:63;;3327:117;3483:2;3509:53;3554:7;3545:6;3534:9;3530:22;3509:53;:::i;:::-;3499:63;;3454:118;3105:474;;;;;:::o;3585:619::-;3662:6;3670;3678;3727:2;3715:9;3706:7;3702:23;3698:32;3695:119;;;3733:79;;:::i;:::-;3695:119;3853:1;3878:53;3923:7;3914:6;3903:9;3899:22;3878:53;:::i;:::-;3868:63;;3824:117;3980:2;4006:53;4051:7;4042:6;4031:9;4027:22;4006:53;:::i;:::-;3996:63;;3951:118;4108:2;4134:53;4179:7;4170:6;4159:9;4155:22;4134:53;:::i;:::-;4124:63;;4079:118;3585:619;;;;;:::o;4210:943::-;4305:6;4313;4321;4329;4378:3;4366:9;4357:7;4353:23;4349:33;4346:120;;;4385:79;;:::i;:::-;4346:120;4505:1;4530:53;4575:7;4566:6;4555:9;4551:22;4530:53;:::i;:::-;4520:63;;4476:117;4632:2;4658:53;4703:7;4694:6;4683:9;4679:22;4658:53;:::i;:::-;4648:63;;4603:118;4760:2;4786:53;4831:7;4822:6;4811:9;4807:22;4786:53;:::i;:::-;4776:63;;4731:118;4916:2;4905:9;4901:18;4888:32;4947:18;4939:6;4936:30;4933:117;;;4969:79;;:::i;:::-;4933:117;5074:62;5128:7;5119:6;5108:9;5104:22;5074:62;:::i;:::-;5064:72;;4859:287;4210:943;;;;;;;:::o;5159:468::-;5224:6;5232;5281:2;5269:9;5260:7;5256:23;5252:32;5249:119;;;5287:79;;:::i;:::-;5249:119;5407:1;5432:53;5477:7;5468:6;5457:9;5453:22;5432:53;:::i;:::-;5422:63;;5378:117;5534:2;5560:50;5602:7;5593:6;5582:9;5578:22;5560:50;:::i;:::-;5550:60;;5505:115;5159:468;;;;;:::o;5633:1085::-;5735:6;5743;5751;5759;5767;5816:3;5804:9;5795:7;5791:23;5787:33;5784:120;;;5823:79;;:::i;:::-;5784:120;5943:1;5968:53;6013:7;6004:6;5993:9;5989:22;5968:53;:::i;:::-;5958:63;;5914:117;6098:2;6087:9;6083:18;6070:32;6129:18;6121:6;6118:30;6115:117;;;6151:79;;:::i;:::-;6115:117;6256:62;6310:7;6301:6;6290:9;6286:22;6256:62;:::i;:::-;6246:72;;6041:287;6367:2;6393:53;6438:7;6429:6;6418:9;6414:22;6393:53;:::i;:::-;6383:63;;6338:118;6495:2;6521:53;6566:7;6557:6;6546:9;6542:22;6521:53;:::i;:::-;6511:63;;6466:118;6623:3;6650:51;6693:7;6684:6;6673:9;6669:22;6650:51;:::i;:::-;6640:61;;6594:117;5633:1085;;;;;;;;:::o;6724:474::-;6792:6;6800;6849:2;6837:9;6828:7;6824:23;6820:32;6817:119;;;6855:79;;:::i;:::-;6817:119;6975:1;7000:53;7045:7;7036:6;7025:9;7021:22;7000:53;:::i;:::-;6990:63;;6946:117;7102:2;7128:53;7173:7;7164:6;7153:9;7149:22;7128:53;:::i;:::-;7118:63;;7073:118;6724:474;;;;;:::o;7204:327::-;7262:6;7311:2;7299:9;7290:7;7286:23;7282:32;7279:119;;;7317:79;;:::i;:::-;7279:119;7437:1;7462:52;7506:7;7497:6;7486:9;7482:22;7462:52;:::i;:::-;7452:62;;7408:116;7204:327;;;;:::o;7537:349::-;7606:6;7655:2;7643:9;7634:7;7630:23;7626:32;7623:119;;;7661:79;;:::i;:::-;7623:119;7781:1;7806:63;7861:7;7852:6;7841:9;7837:22;7806:63;:::i;:::-;7796:73;;7752:127;7537:349;;;;:::o;7892:409::-;7991:6;8040:2;8028:9;8019:7;8015:23;8011:32;8008:119;;;8046:79;;:::i;:::-;8008:119;8166:1;8191:93;8276:7;8267:6;8256:9;8252:22;8191:93;:::i;:::-;8181:103;;8137:157;7892:409;;;;:::o;8307:509::-;8376:6;8425:2;8413:9;8404:7;8400:23;8396:32;8393:119;;;8431:79;;:::i;:::-;8393:119;8579:1;8568:9;8564:17;8551:31;8609:18;8601:6;8598:30;8595:117;;;8631:79;;:::i;:::-;8595:117;8736:63;8791:7;8782:6;8771:9;8767:22;8736:63;:::i;:::-;8726:73;;8522:287;8307:509;;;;:::o;8822:329::-;8881:6;8930:2;8918:9;8909:7;8905:23;8901:32;8898:119;;;8936:79;;:::i;:::-;8898:119;9056:1;9081:53;9126:7;9117:6;9106:9;9102:22;9081:53;:::i;:::-;9071:63;;9027:117;8822:329;;;;:::o;9157:142::-;9260:32;9286:5;9260:32;:::i;:::-;9255:3;9248:45;9157:142;;:::o;9305:118::-;9392:24;9410:5;9392:24;:::i;:::-;9387:3;9380:37;9305:118;;:::o;9429:157::-;9534:45;9554:24;9572:5;9554:24;:::i;:::-;9534:45;:::i;:::-;9529:3;9522:58;9429:157;;:::o;9592:109::-;9673:21;9688:5;9673:21;:::i;:::-;9668:3;9661:34;9592:109;;:::o;9707:118::-;9794:24;9812:5;9794:24;:::i;:::-;9789:3;9782:37;9707:118;;:::o;9831:157::-;9936:45;9956:24;9974:5;9956:24;:::i;:::-;9936:45;:::i;:::-;9931:3;9924:58;9831:157;;:::o;9994:360::-;10080:3;10108:38;10140:5;10108:38;:::i;:::-;10162:70;10225:6;10220:3;10162:70;:::i;:::-;10155:77;;10241:52;10286:6;10281:3;10274:4;10267:5;10263:16;10241:52;:::i;:::-;10318:29;10340:6;10318:29;:::i;:::-;10313:3;10309:39;10302:46;;10084:270;9994:360;;;;:::o;10360:373::-;10464:3;10492:38;10524:5;10492:38;:::i;:::-;10546:88;10627:6;10622:3;10546:88;:::i;:::-;10539:95;;10643:52;10688:6;10683:3;10676:4;10669:5;10665:16;10643:52;:::i;:::-;10720:6;10715:3;10711:16;10704:23;;10468:265;10360:373;;;;:::o;10739:364::-;10827:3;10855:39;10888:5;10855:39;:::i;:::-;10910:71;10974:6;10969:3;10910:71;:::i;:::-;10903:78;;10990:52;11035:6;11030:3;11023:4;11016:5;11012:16;10990:52;:::i;:::-;11067:29;11089:6;11067:29;:::i;:::-;11062:3;11058:39;11051:46;;10831:272;10739:364;;;;:::o;11109:377::-;11215:3;11243:39;11276:5;11243:39;:::i;:::-;11298:89;11380:6;11375:3;11298:89;:::i;:::-;11291:96;;11396:52;11441:6;11436:3;11429:4;11422:5;11418:16;11396:52;:::i;:::-;11473:6;11468:3;11464:16;11457:23;;11219:267;11109:377;;;;:::o;11492:366::-;11634:3;11655:67;11719:2;11714:3;11655:67;:::i;:::-;11648:74;;11731:93;11820:3;11731:93;:::i;:::-;11849:2;11844:3;11840:12;11833:19;;11492:366;;;:::o;11864:::-;12006:3;12027:67;12091:2;12086:3;12027:67;:::i;:::-;12020:74;;12103:93;12192:3;12103:93;:::i;:::-;12221:2;12216:3;12212:12;12205:19;;11864:366;;;:::o;12236:::-;12378:3;12399:67;12463:2;12458:3;12399:67;:::i;:::-;12392:74;;12475:93;12564:3;12475:93;:::i;:::-;12593:2;12588:3;12584:12;12577:19;;12236:366;;;:::o;12608:::-;12750:3;12771:67;12835:2;12830:3;12771:67;:::i;:::-;12764:74;;12847:93;12936:3;12847:93;:::i;:::-;12965:2;12960:3;12956:12;12949:19;;12608:366;;;:::o;12980:::-;13122:3;13143:67;13207:2;13202:3;13143:67;:::i;:::-;13136:74;;13219:93;13308:3;13219:93;:::i;:::-;13337:2;13332:3;13328:12;13321:19;;12980:366;;;:::o;13352:::-;13494:3;13515:67;13579:2;13574:3;13515:67;:::i;:::-;13508:74;;13591:93;13680:3;13591:93;:::i;:::-;13709:2;13704:3;13700:12;13693:19;;13352:366;;;:::o;13724:400::-;13884:3;13905:84;13987:1;13982:3;13905:84;:::i;:::-;13898:91;;13998:93;14087:3;13998:93;:::i;:::-;14116:1;14111:3;14107:11;14100:18;;13724:400;;;:::o;14130:366::-;14272:3;14293:67;14357:2;14352:3;14293:67;:::i;:::-;14286:74;;14369:93;14458:3;14369:93;:::i;:::-;14487:2;14482:3;14478:12;14471:19;;14130:366;;;:::o;14502:::-;14644:3;14665:67;14729:2;14724:3;14665:67;:::i;:::-;14658:74;;14741:93;14830:3;14741:93;:::i;:::-;14859:2;14854:3;14850:12;14843:19;;14502:366;;;:::o;14874:::-;15016:3;15037:67;15101:2;15096:3;15037:67;:::i;:::-;15030:74;;15113:93;15202:3;15113:93;:::i;:::-;15231:2;15226:3;15222:12;15215:19;;14874:366;;;:::o;15246:::-;15388:3;15409:67;15473:2;15468:3;15409:67;:::i;:::-;15402:74;;15485:93;15574:3;15485:93;:::i;:::-;15603:2;15598:3;15594:12;15587:19;;15246:366;;;:::o;15618:::-;15760:3;15781:67;15845:2;15840:3;15781:67;:::i;:::-;15774:74;;15857:93;15946:3;15857:93;:::i;:::-;15975:2;15970:3;15966:12;15959:19;;15618:366;;;:::o;15990:::-;16132:3;16153:67;16217:2;16212:3;16153:67;:::i;:::-;16146:74;;16229:93;16318:3;16229:93;:::i;:::-;16347:2;16342:3;16338:12;16331:19;;15990:366;;;:::o;16362:::-;16504:3;16525:67;16589:2;16584:3;16525:67;:::i;:::-;16518:74;;16601:93;16690:3;16601:93;:::i;:::-;16719:2;16714:3;16710:12;16703:19;;16362:366;;;:::o;16734:::-;16876:3;16897:67;16961:2;16956:3;16897:67;:::i;:::-;16890:74;;16973:93;17062:3;16973:93;:::i;:::-;17091:2;17086:3;17082:12;17075:19;;16734:366;;;:::o;17106:::-;17248:3;17269:67;17333:2;17328:3;17269:67;:::i;:::-;17262:74;;17345:93;17434:3;17345:93;:::i;:::-;17463:2;17458:3;17454:12;17447:19;;17106:366;;;:::o;17478:::-;17620:3;17641:67;17705:2;17700:3;17641:67;:::i;:::-;17634:74;;17717:93;17806:3;17717:93;:::i;:::-;17835:2;17830:3;17826:12;17819:19;;17478:366;;;:::o;17850:::-;17992:3;18013:67;18077:2;18072:3;18013:67;:::i;:::-;18006:74;;18089:93;18178:3;18089:93;:::i;:::-;18207:2;18202:3;18198:12;18191:19;;17850:366;;;:::o;18222:::-;18364:3;18385:67;18449:2;18444:3;18385:67;:::i;:::-;18378:74;;18461:93;18550:3;18461:93;:::i;:::-;18579:2;18574:3;18570:12;18563:19;;18222:366;;;:::o;18594:::-;18736:3;18757:67;18821:2;18816:3;18757:67;:::i;:::-;18750:74;;18833:93;18922:3;18833:93;:::i;:::-;18951:2;18946:3;18942:12;18935:19;;18594:366;;;:::o;18966:::-;19108:3;19129:67;19193:2;19188:3;19129:67;:::i;:::-;19122:74;;19205:93;19294:3;19205:93;:::i;:::-;19323:2;19318:3;19314:12;19307:19;;18966:366;;;:::o;19338:::-;19480:3;19501:67;19565:2;19560:3;19501:67;:::i;:::-;19494:74;;19577:93;19666:3;19577:93;:::i;:::-;19695:2;19690:3;19686:12;19679:19;;19338:366;;;:::o;19710:::-;19852:3;19873:67;19937:2;19932:3;19873:67;:::i;:::-;19866:74;;19949:93;20038:3;19949:93;:::i;:::-;20067:2;20062:3;20058:12;20051:19;;19710:366;;;:::o;20082:118::-;20169:24;20187:5;20169:24;:::i;:::-;20164:3;20157:37;20082:118;;:::o;20206:112::-;20289:22;20305:5;20289:22;:::i;:::-;20284:3;20277:35;20206:112;;:::o;20324:271::-;20454:3;20476:93;20565:3;20556:6;20476:93;:::i;:::-;20469:100;;20586:3;20579:10;;20324:271;;;;:::o;20601:412::-;20759:3;20781:93;20870:3;20861:6;20781:93;:::i;:::-;20774:100;;20884:75;20955:3;20946:6;20884:75;:::i;:::-;20984:2;20979:3;20975:12;20968:19;;21004:3;20997:10;;20601:412;;;;;:::o;21019:435::-;21199:3;21221:95;21312:3;21303:6;21221:95;:::i;:::-;21214:102;;21333:95;21424:3;21415:6;21333:95;:::i;:::-;21326:102;;21445:3;21438:10;;21019:435;;;;;:::o;21460:663::-;21701:3;21723:148;21867:3;21723:148;:::i;:::-;21716:155;;21881:75;21952:3;21943:6;21881:75;:::i;:::-;21981:2;21976:3;21972:12;21965:19;;21994:75;22065:3;22056:6;21994:75;:::i;:::-;22094:2;22089:3;22085:12;22078:19;;22114:3;22107:10;;21460:663;;;;;:::o;22129:222::-;22222:4;22260:2;22249:9;22245:18;22237:26;;22273:71;22341:1;22330:9;22326:17;22317:6;22273:71;:::i;:::-;22129:222;;;;:::o;22357:561::-;22540:4;22578:2;22567:9;22563:18;22555:26;;22591:71;22659:1;22648:9;22644:17;22635:6;22591:71;:::i;:::-;22672:88;22756:2;22745:9;22741:18;22732:6;22672:88;:::i;:::-;22807:9;22801:4;22797:20;22792:2;22781:9;22777:18;22770:48;22835:76;22906:4;22897:6;22835:76;:::i;:::-;22827:84;;22357:561;;;;;;:::o;22924:640::-;23119:4;23157:3;23146:9;23142:19;23134:27;;23171:71;23239:1;23228:9;23224:17;23215:6;23171:71;:::i;:::-;23252:72;23320:2;23309:9;23305:18;23296:6;23252:72;:::i;:::-;23334;23402:2;23391:9;23387:18;23378:6;23334:72;:::i;:::-;23453:9;23447:4;23443:20;23438:2;23427:9;23423:18;23416:48;23481:76;23552:4;23543:6;23481:76;:::i;:::-;23473:84;;22924:640;;;;;;;:::o;23570:210::-;23657:4;23695:2;23684:9;23680:18;23672:26;;23708:65;23770:1;23759:9;23755:17;23746:6;23708:65;:::i;:::-;23570:210;;;;:::o;23786:222::-;23879:4;23917:2;23906:9;23902:18;23894:26;;23930:71;23998:1;23987:9;23983:17;23974:6;23930:71;:::i;:::-;23786:222;;;;:::o;24014:553::-;24191:4;24229:3;24218:9;24214:19;24206:27;;24243:71;24311:1;24300:9;24296:17;24287:6;24243:71;:::i;:::-;24324:72;24392:2;24381:9;24377:18;24368:6;24324:72;:::i;:::-;24406;24474:2;24463:9;24459:18;24450:6;24406:72;:::i;:::-;24488;24556:2;24545:9;24541:18;24532:6;24488:72;:::i;:::-;24014:553;;;;;;;:::o;24573:545::-;24746:4;24784:3;24773:9;24769:19;24761:27;;24798:71;24866:1;24855:9;24851:17;24842:6;24798:71;:::i;:::-;24879:68;24943:2;24932:9;24928:18;24919:6;24879:68;:::i;:::-;24957:72;25025:2;25014:9;25010:18;25001:6;24957:72;:::i;:::-;25039;25107:2;25096:9;25092:18;25083:6;25039:72;:::i;:::-;24573:545;;;;;;;:::o;25124:309::-;25235:4;25273:2;25262:9;25258:18;25250:26;;25322:9;25316:4;25312:20;25308:1;25297:9;25293:17;25286:47;25350:76;25421:4;25412:6;25350:76;:::i;:::-;25342:84;;25124:309;;;;:::o;25439:313::-;25552:4;25590:2;25579:9;25575:18;25567:26;;25639:9;25633:4;25629:20;25625:1;25614:9;25610:17;25603:47;25667:78;25740:4;25731:6;25667:78;:::i;:::-;25659:86;;25439:313;;;;:::o;25758:419::-;25924:4;25962:2;25951:9;25947:18;25939:26;;26011:9;26005:4;26001:20;25997:1;25986:9;25982:17;25975:47;26039:131;26165:4;26039:131;:::i;:::-;26031:139;;25758:419;;;:::o;26183:::-;26349:4;26387:2;26376:9;26372:18;26364:26;;26436:9;26430:4;26426:20;26422:1;26411:9;26407:17;26400:47;26464:131;26590:4;26464:131;:::i;:::-;26456:139;;26183:419;;;:::o;26608:::-;26774:4;26812:2;26801:9;26797:18;26789:26;;26861:9;26855:4;26851:20;26847:1;26836:9;26832:17;26825:47;26889:131;27015:4;26889:131;:::i;:::-;26881:139;;26608:419;;;:::o;27033:::-;27199:4;27237:2;27226:9;27222:18;27214:26;;27286:9;27280:4;27276:20;27272:1;27261:9;27257:17;27250:47;27314:131;27440:4;27314:131;:::i;:::-;27306:139;;27033:419;;;:::o;27458:::-;27624:4;27662:2;27651:9;27647:18;27639:26;;27711:9;27705:4;27701:20;27697:1;27686:9;27682:17;27675:47;27739:131;27865:4;27739:131;:::i;:::-;27731:139;;27458:419;;;:::o;27883:::-;28049:4;28087:2;28076:9;28072:18;28064:26;;28136:9;28130:4;28126:20;28122:1;28111:9;28107:17;28100:47;28164:131;28290:4;28164:131;:::i;:::-;28156:139;;27883:419;;;:::o;28308:::-;28474:4;28512:2;28501:9;28497:18;28489:26;;28561:9;28555:4;28551:20;28547:1;28536:9;28532:17;28525:47;28589:131;28715:4;28589:131;:::i;:::-;28581:139;;28308:419;;;:::o;28733:::-;28899:4;28937:2;28926:9;28922:18;28914:26;;28986:9;28980:4;28976:20;28972:1;28961:9;28957:17;28950:47;29014:131;29140:4;29014:131;:::i;:::-;29006:139;;28733:419;;;:::o;29158:::-;29324:4;29362:2;29351:9;29347:18;29339:26;;29411:9;29405:4;29401:20;29397:1;29386:9;29382:17;29375:47;29439:131;29565:4;29439:131;:::i;:::-;29431:139;;29158:419;;;:::o;29583:::-;29749:4;29787:2;29776:9;29772:18;29764:26;;29836:9;29830:4;29826:20;29822:1;29811:9;29807:17;29800:47;29864:131;29990:4;29864:131;:::i;:::-;29856:139;;29583:419;;;:::o;30008:::-;30174:4;30212:2;30201:9;30197:18;30189:26;;30261:9;30255:4;30251:20;30247:1;30236:9;30232:17;30225:47;30289:131;30415:4;30289:131;:::i;:::-;30281:139;;30008:419;;;:::o;30433:::-;30599:4;30637:2;30626:9;30622:18;30614:26;;30686:9;30680:4;30676:20;30672:1;30661:9;30657:17;30650:47;30714:131;30840:4;30714:131;:::i;:::-;30706:139;;30433:419;;;:::o;30858:::-;31024:4;31062:2;31051:9;31047:18;31039:26;;31111:9;31105:4;31101:20;31097:1;31086:9;31082:17;31075:47;31139:131;31265:4;31139:131;:::i;:::-;31131:139;;30858:419;;;:::o;31283:::-;31449:4;31487:2;31476:9;31472:18;31464:26;;31536:9;31530:4;31526:20;31522:1;31511:9;31507:17;31500:47;31564:131;31690:4;31564:131;:::i;:::-;31556:139;;31283:419;;;:::o;31708:::-;31874:4;31912:2;31901:9;31897:18;31889:26;;31961:9;31955:4;31951:20;31947:1;31936:9;31932:17;31925:47;31989:131;32115:4;31989:131;:::i;:::-;31981:139;;31708:419;;;:::o;32133:::-;32299:4;32337:2;32326:9;32322:18;32314:26;;32386:9;32380:4;32376:20;32372:1;32361:9;32357:17;32350:47;32414:131;32540:4;32414:131;:::i;:::-;32406:139;;32133:419;;;:::o;32558:::-;32724:4;32762:2;32751:9;32747:18;32739:26;;32811:9;32805:4;32801:20;32797:1;32786:9;32782:17;32775:47;32839:131;32965:4;32839:131;:::i;:::-;32831:139;;32558:419;;;:::o;32983:::-;33149:4;33187:2;33176:9;33172:18;33164:26;;33236:9;33230:4;33226:20;33222:1;33211:9;33207:17;33200:47;33264:131;33390:4;33264:131;:::i;:::-;33256:139;;32983:419;;;:::o;33408:::-;33574:4;33612:2;33601:9;33597:18;33589:26;;33661:9;33655:4;33651:20;33647:1;33636:9;33632:17;33625:47;33689:131;33815:4;33689:131;:::i;:::-;33681:139;;33408:419;;;:::o;33833:::-;33999:4;34037:2;34026:9;34022:18;34014:26;;34086:9;34080:4;34076:20;34072:1;34061:9;34057:17;34050:47;34114:131;34240:4;34114:131;:::i;:::-;34106:139;;33833:419;;;:::o;34258:::-;34424:4;34462:2;34451:9;34447:18;34439:26;;34511:9;34505:4;34501:20;34497:1;34486:9;34482:17;34475:47;34539:131;34665:4;34539:131;:::i;:::-;34531:139;;34258:419;;;:::o;34683:::-;34849:4;34887:2;34876:9;34872:18;34864:26;;34936:9;34930:4;34926:20;34922:1;34911:9;34907:17;34900:47;34964:131;35090:4;34964:131;:::i;:::-;34956:139;;34683:419;;;:::o;35108:222::-;35201:4;35239:2;35228:9;35224:18;35216:26;;35252:71;35320:1;35309:9;35305:17;35296:6;35252:71;:::i;:::-;35108:222;;;;:::o;35336:129::-;35370:6;35397:20;;:::i;:::-;35387:30;;35426:33;35454:4;35446:6;35426:33;:::i;:::-;35336:129;;;:::o;35471:75::-;35504:6;35537:2;35531:9;35521:19;;35471:75;:::o;35552:307::-;35613:4;35703:18;35695:6;35692:30;35689:56;;;35725:18;;:::i;:::-;35689:56;35763:29;35785:6;35763:29;:::i;:::-;35755:37;;35847:4;35841;35837:15;35829:23;;35552:307;;;:::o;35865:308::-;35927:4;36017:18;36009:6;36006:30;36003:56;;;36039:18;;:::i;:::-;36003:56;36077:29;36099:6;36077:29;:::i;:::-;36069:37;;36161:4;36155;36151:15;36143:23;;35865:308;;;:::o;36179:98::-;36230:6;36264:5;36258:12;36248:22;;36179:98;;;:::o;36283:99::-;36335:6;36369:5;36363:12;36353:22;;36283:99;;;:::o;36388:168::-;36471:11;36505:6;36500:3;36493:19;36545:4;36540:3;36536:14;36521:29;;36388:168;;;;:::o;36562:147::-;36663:11;36700:3;36685:18;;36562:147;;;;:::o;36715:169::-;36799:11;36833:6;36828:3;36821:19;36873:4;36868:3;36864:14;36849:29;;36715:169;;;;:::o;36890:148::-;36992:11;37029:3;37014:18;;36890:148;;;;:::o;37044:305::-;37084:3;37103:20;37121:1;37103:20;:::i;:::-;37098:25;;37137:20;37155:1;37137:20;:::i;:::-;37132:25;;37291:1;37223:66;37219:74;37216:1;37213:81;37210:107;;;37297:18;;:::i;:::-;37210:107;37341:1;37338;37334:9;37327:16;;37044:305;;;;:::o;37355:185::-;37395:1;37412:20;37430:1;37412:20;:::i;:::-;37407:25;;37446:20;37464:1;37446:20;:::i;:::-;37441:25;;37485:1;37475:35;;37490:18;;:::i;:::-;37475:35;37532:1;37529;37525:9;37520:14;;37355:185;;;;:::o;37546:191::-;37586:4;37606:20;37624:1;37606:20;:::i;:::-;37601:25;;37640:20;37658:1;37640:20;:::i;:::-;37635:25;;37679:1;37676;37673:8;37670:34;;;37684:18;;:::i;:::-;37670:34;37729:1;37726;37722:9;37714:17;;37546:191;;;;:::o;37743:96::-;37780:7;37809:24;37827:5;37809:24;:::i;:::-;37798:35;;37743:96;;;:::o;37845:104::-;37890:7;37919:24;37937:5;37919:24;:::i;:::-;37908:35;;37845:104;;;:::o;37955:90::-;37989:7;38032:5;38025:13;38018:21;38007:32;;37955:90;;;:::o;38051:77::-;38088:7;38117:5;38106:16;;38051:77;;;:::o;38134:149::-;38170:7;38210:66;38203:5;38199:78;38188:89;;38134:149;;;:::o;38289:125::-;38355:7;38384:24;38402:5;38384:24;:::i;:::-;38373:35;;38289:125;;;:::o;38420:126::-;38457:7;38497:42;38490:5;38486:54;38475:65;;38420:126;;;:::o;38552:77::-;38589:7;38618:5;38607:16;;38552:77;;;:::o;38635:86::-;38670:7;38710:4;38703:5;38699:16;38688:27;;38635:86;;;:::o;38727:154::-;38811:6;38806:3;38801;38788:30;38873:1;38864:6;38859:3;38855:16;38848:27;38727:154;;;:::o;38887:307::-;38955:1;38965:113;38979:6;38976:1;38973:13;38965:113;;;39064:1;39059:3;39055:11;39049:18;39045:1;39040:3;39036:11;39029:39;39001:2;38998:1;38994:10;38989:15;;38965:113;;;39096:6;39093:1;39090:13;39087:101;;;39176:1;39167:6;39162:3;39158:16;39151:27;39087:101;38936:258;38887:307;;;:::o;39200:320::-;39244:6;39281:1;39275:4;39271:12;39261:22;;39328:1;39322:4;39318:12;39349:18;39339:81;;39405:4;39397:6;39393:17;39383:27;;39339:81;39467:2;39459:6;39456:14;39436:18;39433:38;39430:84;;;39486:18;;:::i;:::-;39430:84;39251:269;39200:320;;;:::o;39526:281::-;39609:27;39631:4;39609:27;:::i;:::-;39601:6;39597:40;39739:6;39727:10;39724:22;39703:18;39691:10;39688:34;39685:62;39682:88;;;39750:18;;:::i;:::-;39682:88;39790:10;39786:2;39779:22;39569:238;39526:281;;:::o;39813:233::-;39852:3;39875:24;39893:5;39875:24;:::i;:::-;39866:33;;39921:66;39914:5;39911:77;39908:103;;;39991:18;;:::i;:::-;39908:103;40038:1;40031:5;40027:13;40020:20;;39813:233;;;:::o;40052:100::-;40091:7;40120:26;40140:5;40120:26;:::i;:::-;40109:37;;40052:100;;;:::o;40158:79::-;40197:7;40226:5;40215:16;;40158:79;;;:::o;40243:94::-;40282:7;40311:20;40325:5;40311:20;:::i;:::-;40300:31;;40243:94;;;:::o;40343:176::-;40375:1;40392:20;40410:1;40392:20;:::i;:::-;40387:25;;40426:20;40444:1;40426:20;:::i;:::-;40421:25;;40465:1;40455:35;;40470:18;;:::i;:::-;40455:35;40511:1;40508;40504:9;40499:14;;40343:176;;;;:::o;40525:180::-;40573:77;40570:1;40563:88;40670:4;40667:1;40660:15;40694:4;40691:1;40684:15;40711:180;40759:77;40756:1;40749:88;40856:4;40853:1;40846:15;40880:4;40877:1;40870:15;40897:180;40945:77;40942:1;40935:88;41042:4;41039:1;41032:15;41066:4;41063:1;41056:15;41083:180;41131:77;41128:1;41121:88;41228:4;41225:1;41218:15;41252:4;41249:1;41242:15;41269:180;41317:77;41314:1;41307:88;41414:4;41411:1;41404:15;41438:4;41435:1;41428:15;41455:180;41503:77;41500:1;41493:88;41600:4;41597:1;41590:15;41624:4;41621:1;41614:15;41641:117;41750:1;41747;41740:12;41764:117;41873:1;41870;41863:12;41887:117;41996:1;41993;41986:12;42010:117;42119:1;42116;42109:12;42133:102;42174:6;42225:2;42221:7;42216:2;42209:5;42205:14;42201:28;42191:38;;42133:102;;;:::o;42241:94::-;42274:8;42322:5;42318:2;42314:14;42293:35;;42241:94;;;:::o;42341:164::-;42481:16;42477:1;42469:6;42465:14;42458:40;42341:164;:::o;42511:230::-;42651:34;42647:1;42639:6;42635:14;42628:58;42720:13;42715:2;42707:6;42703:15;42696:38;42511:230;:::o;42747:237::-;42887:34;42883:1;42875:6;42871:14;42864:58;42956:20;42951:2;42943:6;42939:15;42932:45;42747:237;:::o;42990:225::-;43130:34;43126:1;43118:6;43114:14;43107:58;43199:8;43194:2;43186:6;43182:15;43175:33;42990:225;:::o;43221:178::-;43361:30;43357:1;43349:6;43345:14;43338:54;43221:178;:::o;43405:::-;43545:30;43541:1;43533:6;43529:14;43522:54;43405:178;:::o;43589:214::-;43729:66;43725:1;43717:6;43713:14;43706:90;43589:214;:::o;43809:223::-;43949:34;43945:1;43937:6;43933:14;43926:58;44018:6;44013:2;44005:6;44001:15;43994:31;43809:223;:::o;44038:175::-;44178:27;44174:1;44166:6;44162:14;44155:51;44038:175;:::o;44219:231::-;44359:34;44355:1;44347:6;44343:14;44336:58;44428:14;44423:2;44415:6;44411:15;44404:39;44219:231;:::o;44456:224::-;44596:34;44592:1;44584:6;44580:14;44573:58;44665:7;44660:2;44652:6;44648:15;44641:32;44456:224;:::o;44686:243::-;44826:34;44822:1;44814:6;44810:14;44803:58;44895:26;44890:2;44882:6;44878:15;44871:51;44686:243;:::o;44935:229::-;45075:34;45071:1;45063:6;45059:14;45052:58;45144:12;45139:2;45131:6;45127:15;45120:37;44935:229;:::o;45170:228::-;45310:34;45306:1;45298:6;45294:14;45287:58;45379:11;45374:2;45366:6;45362:15;45355:36;45170:228;:::o;45404:182::-;45544:34;45540:1;45532:6;45528:14;45521:58;45404:182;:::o;45592:231::-;45732:34;45728:1;45720:6;45716:14;45709:58;45801:14;45796:2;45788:6;45784:15;45777:39;45592:231;:::o;45829:182::-;45969:34;45965:1;45957:6;45953:14;45946:58;45829:182;:::o;46017:228::-;46157:34;46153:1;46145:6;46141:14;46134:58;46226:11;46221:2;46213:6;46209:15;46202:36;46017:228;:::o;46251:220::-;46391:34;46387:1;46379:6;46375:14;46368:58;46460:3;46455:2;46447:6;46443:15;46436:28;46251:220;:::o;46477:::-;46617:34;46613:1;46605:6;46601:14;46594:58;46686:3;46681:2;46673:6;46669:15;46662:28;46477:220;:::o;46703:236::-;46843:34;46839:1;46831:6;46827:14;46820:58;46912:19;46907:2;46899:6;46895:15;46888:44;46703:236;:::o;46945:231::-;47085:34;47081:1;47073:6;47069:14;47062:58;47154:14;47149:2;47141:6;47137:15;47130:39;46945:231;:::o;47182:166::-;47322:18;47318:1;47310:6;47306:14;47299:42;47182:166;:::o;47354:122::-;47427:24;47445:5;47427:24;:::i;:::-;47420:5;47417:35;47407:63;;47466:1;47463;47456:12;47407:63;47354:122;:::o;47482:116::-;47552:21;47567:5;47552:21;:::i;:::-;47545:5;47542:32;47532:60;;47588:1;47585;47578:12;47532:60;47482:116;:::o;47604:122::-;47677:24;47695:5;47677:24;:::i;:::-;47670:5;47667:35;47657:63;;47716:1;47713;47706:12;47657:63;47604:122;:::o;47732:120::-;47804:23;47821:5;47804:23;:::i;:::-;47797:5;47794:34;47784:62;;47842:1;47839;47832:12;47784:62;47732:120;:::o;47858:180::-;47960:53;48007:5;47960:53;:::i;:::-;47953:5;47950:64;47940:92;;48028:1;48025;48018:12;47940:92;47858:180;:::o;48044:122::-;48117:24;48135:5;48117:24;:::i;:::-;48110:5;48107:35;48097:63;;48156:1;48153;48146:12;48097:63;48044:122;:::o;48172:118::-;48243:22;48259:5;48243:22;:::i;:::-;48236:5;48233:33;48223:61;;48280:1;48277;48270:12;48223:61;48172:118;:::o

Swarm Source

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