ETH Price: $3,473.31 (+4.69%)

Token

Omni Robotics (ORT)
 

Overview

Max Total Supply

0 ORT

Holders

638

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 ORT
0x45071a9247f9b34d2ad1e3ef6ddf2a63e97f51a3
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:
OmniRobotics

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-12
*/

// Sources flattened with hardhat v2.9.2 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;







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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File contracts/interfaces/ILayerZeroReceiver.sol

pragma solidity >=0.5.0;

interface ILayerZeroReceiver {
    // @notice LayerZero endpoint will invoke this function to deliver the message on the destination
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external;
}


// File contracts/interfaces/ILayerZeroUserApplicationConfig.sol

pragma solidity >=0.5.0;

interface ILayerZeroUserApplicationConfig {
    // @notice set the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _configType - type of configuration. every messaging library has its own convention.
    // @param _config - configuration in the bytes. can encode arbitrary content.
    function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external;

    // @notice set the send() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setSendVersion(uint16 _version) external;

    // @notice set the lzReceive() LayerZero messaging library version to _version
    // @param _version - new messaging library version
    function setReceiveVersion(uint16 _version) external;

    // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload
    // @param _srcChainId - the chainId of the source chain
    // @param _srcAddress - the contract address of the source contract at the source chain
    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external;
}


// File contracts/interfaces/ILayerZeroEndpoint.sol

pragma solidity >=0.5.0;

interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig {
    // @notice send a LayerZero message to the specified address at a LayerZero endpoint.
    // @param _dstChainId - the destination chain identifier
    // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains
    // @param _payload - a custom bytes payload to send to the destination contract
    // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address
    // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction
    // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination
    function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable;

    // @notice used by the messaging library to publish verified payload
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source contract (as bytes) at the source chain
    // @param _dstAddress - the address on destination chain
    // @param _nonce - the unbound message ordering nonce
    // @param _gasLimit - the gas limit for external contract execution
    // @param _payload - verified payload to send to the destination contract
    function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external;

    // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64);

    // @notice get the outboundNonce from this source chain which, consequently, is always an EVM
    // @param _srcAddress - the source chain contract address
    function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64);

    // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery
    // @param _dstChainId - the destination chain identifier
    // @param _userApplication - the user app address on this EVM chain
    // @param _payload - the custom message to send over LayerZero
    // @param _payInZRO - if false, user app pays the protocol fee in native token
    // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain
    function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee);

    // @notice get this Endpoint's immutable source identifier
    function getChainId() external view returns (uint16);

    // @notice the interface to retry failed message on this Endpoint destination
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    // @param _payload - the payload to be retried
    function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external;

    // @notice query if any STORED payload (message blocking) at the endpoint.
    // @param _srcChainId - the source chain identifier
    // @param _srcAddress - the source chain contract address
    function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool);

    // @notice query if the _libraryAddress is valid for sending msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getSendLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the _libraryAddress is valid for receiving msgs.
    // @param _userApplication - the user app address on this EVM chain
    function getReceiveLibraryAddress(address _userApplication) external view returns (address);

    // @notice query if the non-reentrancy guard for send() is on
    // @return true if the guard is on. false otherwise
    function isSendingPayload() external view returns (bool);

    // @notice query if the non-reentrancy guard for receive() is on
    // @return true if the guard is on. false otherwise
    function isReceivingPayload() external view returns (bool);

    // @notice get the configuration of the LayerZero messaging library of the specified version
    // @param _version - messaging library version
    // @param _chainId - the chainId for the pending config change
    // @param _userApplication - the contract address of the user application
    // @param _configType - type of configuration. every messaging library has its own convention.
    function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory);

    // @notice get the send() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getSendVersion(address _userApplication) external view returns (uint16);

    // @notice get the lzReceive() LayerZero messaging library version
    // @param _userApplication - the contract address of the user application
    function getReceiveVersion(address _userApplication) external view returns (uint16);
}


// File contracts/NonBlockingReceiver.sol

pragma solidity 0.8.4;



abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver {
    ILayerZeroEndpoint public endpoint;

    struct FailedMessages {
        uint payloadLength;
        bytes32 payloadHash;
    }

    mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages;
    mapping(uint16 => bytes) public trustedSourceLookup;

    event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload);

    // abstract function
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal;

    function lzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) external override {
        require(msg.sender == address(endpoint)); // boilerplate! lzReceive must be called by the endpoint for security
        require(_srcAddress.length == trustedSourceLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedSourceLookup[_srcChainId]), "NonblockingReceiver: invalid source sending contract");

        // try-catch all errors/exceptions
        // having failed messages does not block messages passing
        try this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload) {
            // do nothing
        } catch {
            // error / exception
            failedMessages[_srcChainId][_srcAddress][_nonce] = FailedMessages(_payload.length, keccak256(_payload));
            emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload);
        }
    }

    function onLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public {
        // only internal transaction
        require(msg.sender == address(this), "NonblockingReceiver: caller must be Bridge.");
        _LzReceive( _srcChainId, _srcAddress, _nonce, _payload);
    }

    function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal {
        endpoint.send{value: msg.value}(_dstChainId, trustedSourceLookup[_dstChainId], _payload, _refundAddress, _zroPaymentAddress, _txParam);
    }

    function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable {
        // assert there is message to retry
        FailedMessages storage failedMsg = failedMessages[_srcChainId][_srcAddress][_nonce];
        require(failedMsg.payloadHash != bytes32(0), "NonblockingReceiver: no stored message");
        require(_payload.length == failedMsg.payloadLength && keccak256(_payload) == failedMsg.payloadHash, "LayerZero: invalid payload");
        // clear the stored message
        failedMsg.payloadLength = 0;
        failedMsg.payloadHash = bytes32(0);
        // execute the message. revert if it fails again
        this.onLzReceive(_srcChainId, _srcAddress, _nonce, _payload);
    }

    function setTrustedSource(uint16 _chainId, bytes calldata _trustedSource) external onlyOwner {
        require(trustedSourceLookup[_chainId].length == 0, "The trusted source address has already been set for the chainId!");
        trustedSourceLookup[_chainId] = _trustedSource;
    }
}


// File contracts/OmnichainNonFungibleToken.sol

pragma solidity 0.8.4;

/***
 *     ________   _____ ______    ________    ___          ________   ________   ________   ________   _________   ___   ________   ________
 *    |\   __  \ |\   _ \  _   \ |\   ___  \ |\  \        |\   __  \ |\   __  \ |\   __  \ |\   __  \ |\___   ___\|\  \ |\   ____\ |\   ____\
 *    \ \  \|\  \\ \  \\\__\ \  \\ \  \\ \  \\ \  \       \ \  \|\  \\ \  \|\  \\ \  \|\ /_\ \  \|\  \\|___ \  \_|\ \  \\ \  \___| \ \  \___|_
 *     \ \  \\\  \\ \  \\|__| \  \\ \  \\ \  \\ \  \       \ \   _  _\\ \  \\\  \\ \   __  \\ \  \\\  \    \ \  \  \ \  \\ \  \     \ \_____  \
 *      \ \  \\\  \\ \  \    \ \  \\ \  \\ \  \\ \  \       \ \  \\  \|\ \  \\\  \\ \  \|\  \\ \  \\\  \    \ \  \  \ \  \\ \  \____ \|____|\  \
 *       \ \_______\\ \__\    \ \__\\ \__\\ \__\\ \__\       \ \__\\ _\ \ \_______\\ \_______\\ \_______\    \ \__\  \ \__\\ \_______\ ____\_\  \
 *        \|_______| \|__|     \|__| \|__| \|__| \|__|        \|__|\|__| \|_______| \|_______| \|_______|     \|__|   \|__| \|_______||\_________\
 *                                                                                                                                    \|_________|
 *
 *
 */


/// @title A LayerZero OmnichainNonFungibleToken Contract
/// @author Omni Robotics
/// @notice You can use this to mint ONFT and transfer across chain
/// @dev All function calls are currently implemented without side effects
contract OmniRobotics is ERC721, NonblockingReceiver, ILayerZeroUserApplicationConfig {

    using Strings for uint256;
    string public baseTokenURI;
    uint256 public nextTokenId;
    uint256 maxMint;
    uint256 maxMintPerTransaction = 20;
    uint256 tokenPrice = 0.0015 ether;
    address _owner;

    /// @notice Constructor for the OmnichainNonFungibleToken
    /// @param _baseTokenURI the Uniform Resource Identifier (URI) for tokenId token
    /// @param _layerZeroEndpoint handles message transmission across chains
    /// @param _startToken the starting mint number on this chain
    /// @param _maxMint the max number of mints on this chain
    constructor(
        string memory _baseTokenURI,
        address _layerZeroEndpoint,
        uint256 _startToken,
        uint256 _maxMint

    )
    ERC721("Omni Robotics", "ORT"){
        setBaseURI(_baseTokenURI);
        endpoint = ILayerZeroEndpoint(_layerZeroEndpoint);
        nextTokenId = _startToken;
        maxMint = _maxMint;
        _owner = msg.sender;
    }

    function mint(uint256 numberOfTokens) external payable{
        require(numberOfTokens > 0 && numberOfTokens <= maxMintPerTransaction, "Can only mint one or more at a time");
        require(nextTokenId + numberOfTokens <= maxMint,"Purchase would exceed max mint limit at this chain");
        require(msg.value >= tokenPrice * numberOfTokens,"Not enough ether sent");
        for(uint256 i = 0; i < numberOfTokens; i++){
            uint256 id = ++nextTokenId;
            if(id <= maxMint){
                _safeMint(msg.sender, id);
            }
        }
    }

    /// @notice Burn OmniChainNFT_tokenId on source chain and mint on destination chain
    /// @param _chainId the destination chain id you want to transfer too
    /// @param omniChainNFT_tokenId the id of the ONFT you want to transfer
    function transferOmnichainNFT(
        uint16 _chainId,
        uint256 omniChainNFT_tokenId
    ) public payable {
        require(msg.sender == ownerOf(omniChainNFT_tokenId), "Message sender must own the OmnichainNFT.");
        require(trustedSourceLookup[_chainId].length != 0, "This chain is not a trusted source source.");

        // burn ONFT on source chain
         _burn(omniChainNFT_tokenId);

        // encode payload w/ sender address and ONFT token id
        bytes memory payload = abi.encode(msg.sender, omniChainNFT_tokenId);

        // encode adapterParams w/ extra gas for destination chain
        // This example uses 500,000 gas. Your implementation may need more.
        uint16 version = 1;
        uint gas = 225000;
        bytes memory adapterParams = abi.encodePacked(version, gas);

        // use LayerZero estimateFees for cross chain delivery
        (uint quotedLayerZeroFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams);

        require(msg.value >= quotedLayerZeroFee, "Not enough gas to cover cross chain transfer.");

        endpoint.send{value:msg.value}(
            _chainId,                      // destination chainId
            trustedSourceLookup[_chainId], // destination address of OmnichainNFT
            payload,                       // abi.encode()'ed bytes
            payable(msg.sender),           // refund address
            address(0x0),                  // future parameter
            adapterParams                  // adapterParams
        );
    }

    /// @notice Set the baseTokenURI
    /// @param _baseTokenURI to set
    function setBaseURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    /// @notice Get the base URI
    function _baseURI() override internal view returns (string memory) {
        return baseTokenURI;
    }
    function tokenURI(uint256 tokenId) public view virtual override returns(string memory){
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");

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

    function donate() external payable {
        // thank you
    }

    // This allows the devs to receive kind donations
    function withdraw(uint256 amt) external  {
        require(msg.sender == _owner, "Only owner can withdraw");
        (bool sent, ) = payable(_owner).call{value: amt}("");
        require(sent, "Failed to withdraw Ether");
    }

    /// @notice Override the _LzReceive internal function of the NonblockingReceiver
    // @param _srcChainId - the source endpoint identifier
    // @param _srcAddress - the source sending contract address from the source chain
    // @param _nonce - the ordered message nonce
    // @param _payload - the signed payload is the UA bytes has encoded to be sent
    /// @dev safe mints the ONFT on your destination chain
    function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal override  {
        (address _dstOmnichainNFTAddress, uint256 omnichainNFT_tokenId) = abi.decode(_payload, (address, uint256));
        _safeMint(_dstOmnichainNFTAddress, omnichainNFT_tokenId);
    }

    //---------------------------DAO CALL----------------------------------------
    // generic config for user Application
    function setConfig(
        uint16 _version,
        uint16 _chainId,
        uint256 _configType,
        bytes calldata _config
    ) external override onlyOwner {
        endpoint.setConfig(_version, _chainId, _configType, _config);
    }

    function setSendVersion(uint16 _version) external override onlyOwner {
        endpoint.setSendVersion(_version);
    }

    function setReceiveVersion(uint16 _version) external override onlyOwner {
        endpoint.setReceiveVersion(_version);
    }

    function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner {
        endpoint.forceResumeReceive(_srcChainId, _srcAddress);
    }

    function renounceOwnership() public override onlyOwner {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"},{"internalType":"uint256","name":"_startToken","type":"uint256"},{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"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":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"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":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"uint256","name":"payloadLength","type":"uint256"},{"internalType":"bytes32","name":"payloadHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"onLzReceive","outputs":[],"stateMutability":"nonpayable","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":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedSource","type":"bytes"}],"name":"setTrustedSource","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"omniChainNFT_tokenId","type":"uint256"}],"name":"transferOmnichainNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedSourceLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526014600d556605543df729c000600e553480156200002157600080fd5b5060405162005e0f38038062005e0f8339818101604052810190620000479190620004a5565b6040518060400160405280600d81526020017f4f6d6e6920526f626f74696373000000000000000000000000000000000000008152506040518060400160405280600381526020017f4f525400000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cb92919062000355565b508060019080519060200190620000e492919062000355565b50505062000107620000fb620001b260201b60201c565b620001ba60201b60201c565b62000118846200028060201b60201c565b82600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600b8190555080600c8190555033600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050506200078f565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000290620001b260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002b66200032b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200030f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003069062000551565b60405180910390fd5b80600a90805190602001906200032792919062000355565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003639062000657565b90600052602060002090601f016020900481019282620003875760008555620003d3565b82601f10620003a257805160ff1916838001178555620003d3565b82800160010185558215620003d3579182015b82811115620003d2578251825591602001919060010190620003b5565b5b509050620003e29190620003e6565b5090565b5b8082111562000401576000816000905550600101620003e7565b5090565b60006200041c62000416846200059c565b62000573565b9050828152602081018484840111156200043557600080fd5b6200044284828562000621565b509392505050565b6000815190506200045b816200075b565b92915050565b600082601f8301126200047357600080fd5b81516200048584826020860162000405565b91505092915050565b6000815190506200049f8162000775565b92915050565b60008060008060808587031215620004bc57600080fd5b600085015167ffffffffffffffff811115620004d757600080fd5b620004e58782880162000461565b9450506020620004f8878288016200044a565b93505060406200050b878288016200048e565b92505060606200051e878288016200048e565b91505092959194509250565b600062000539602083620005d2565b9150620005468262000732565b602082019050919050565b600060208201905081810360008301526200056c816200052a565b9050919050565b60006200057f62000592565b90506200058d82826200068d565b919050565b6000604051905090565b600067ffffffffffffffff821115620005ba57620005b9620006f2565b5b620005c58262000721565b9050602081019050919050565b600082825260208201905092915050565b6000620005f082620005f7565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200064157808201518184015260208101905062000624565b8381111562000651576000848401525b50505050565b600060028204905060018216806200067057607f821691505b60208210811415620006875762000686620006c3565b5b50919050565b620006988262000721565b810181811067ffffffffffffffff82111715620006ba57620006b9620006f2565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6200076681620005e3565b81146200077257600080fd5b50565b620007808162000617565b81146200078c57600080fd5b50565b615670806200079f6000396000f3fe6080604052600436106101f85760003560e01c8063715018a61161010d578063b88d4fde116100a0578063d547cfb71161006f578063d547cfb714610700578063d73f057e1461072b578063e985e9c514610754578063ed88c68e14610791578063f2fde38b1461079b576101f8565b8063b88d4fde14610655578063c87b56dd1461067e578063cbed8b9c146106bb578063d1deba1f146106e4576101f8565b80638ee74912116100dc5780638ee74912146105a757806395d89b41146105e5578063a0712d6814610610578063a22cb4651461062c576101f8565b8063715018a6146104fd57806375794a3c1461051457806381c986ee1461053f5780638da5cb5b1461057c576101f8565b80631c37a8221161019057806342d65a8d1161015f57806342d65a8d1461040657806355f804b31461042f5780635e280f11146104585780636352211e1461048357806370a08231146104c0576101f8565b80631c37a8221461036257806323b872dd1461038b5780632e1a7d4d146103b457806342842e0e146103dd576101f8565b8063081812fc116101cc578063081812fc146102b7578063095ea7b3146102f457806310ddb1371461031d57806314c957d514610346576101f8565b80621d3567146101fd57806301ffc9a71461022657806306fdde031461026357806307e0db171461028e575b600080fd5b34801561020957600080fd5b50610224600480360381019061021f9190613845565b6107c4565b005b34801561023257600080fd5b5061024d60048036038101906102489190613632565b610a06565b60405161025a9190614248565b60405180910390f35b34801561026f57600080fd5b50610278610ae8565b60405161028591906142a0565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b091906136c5565b610b7a565b005b3480156102c357600080fd5b506102de60048036038101906102d99190613994565b610c86565b6040516102eb91906141b8565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906135f6565b610d0b565b005b34801561032957600080fd5b50610344600480360381019061033f91906136c5565b610e23565b005b610360600480360381019061035b9190613958565b610f2f565b005b34801561036e57600080fd5b5061038960048036038101906103849190613845565b61122a565b005b34801561039757600080fd5b506103b260048036038101906103ad91906134f0565b6112aa565b005b3480156103c057600080fd5b506103db60048036038101906103d69190613994565b61130a565b005b3480156103e957600080fd5b5061040460048036038101906103ff91906134f0565b61146c565b005b34801561041257600080fd5b5061042d600480360381019061042891906136ee565b61148c565b005b34801561043b57600080fd5b5061045660048036038101906104519190613684565b61159e565b005b34801561046457600080fd5b5061046d611634565b60405161047a9190614285565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613994565b61165a565b6040516104b791906141b8565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e2919061344f565b61170c565b6040516104f4919061487c565b60405180910390f35b34801561050957600080fd5b506105126117c4565b005b34801561052057600080fd5b50610529611842565b604051610536919061487c565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906136c5565b611848565b6040516105739190614263565b60405180910390f35b34801561058857600080fd5b506105916118e8565b60405161059e91906141b8565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190613746565b611912565b6040516105dc929190614897565b60405180910390f35b3480156105f157600080fd5b506105fa611966565b60405161060791906142a0565b60405180910390f35b61062a60048036038101906106259190613994565b6119f8565b005b34801561063857600080fd5b50610653600480360381019061064e91906135ba565b611b3b565b005b34801561066157600080fd5b5061067c6004803603810190610677919061353f565b611b51565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613994565b611bb3565b6040516106b291906142a0565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd91906138d8565b611c5a565b005b6106fe60048036038101906106f991906137ad565b611d72565b005b34801561070c57600080fd5b50610715611f12565b60405161072291906142a0565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d91906136ee565b611fa0565b005b34801561076057600080fd5b5061077b600480360381019061077691906134b4565b6120b6565b6040516107889190614248565b60405180910390f35b61079961214a565b005b3480156107a757600080fd5b506107c260048036038101906107bd919061344f565b61214c565b005b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461081e57600080fd5b600960008561ffff1661ffff168152602001908152602001600020805461084490614bd7565b9050835114801561088a5750600960008561ffff1661ffff1681526020019081526020016000206040516108789190614131565b60405180910390208380519060200120145b6108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c090614522565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16631c37a822858585856040518563ffffffff1660e01b81526004016109089493929190614765565b600060405180830381600087803b15801561092257600080fd5b505af1925050508015610933575060015b6109ff576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161097d919061411a565b908152602001604051809103902060008467ffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d848484846040516109f29493929190614765565b60405180910390a1610a00565b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ae15750610ae082612244565b5b9050919050565b606060008054610af790614bd7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2390614bd7565b8015610b705780601f10610b4557610100808354040283529160200191610b70565b820191906000526020600020905b815481529060010190602001808311610b5357829003601f168201915b5050505050905090565b610b826122ae565b73ffffffffffffffffffffffffffffffffffffffff16610ba06118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bed90614502565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610c519190614662565b600060405180830381600087803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b5050505050565b6000610c91826122b6565b610cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc7906144e2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d168261165a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e90614582565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da66122ae565b73ffffffffffffffffffffffffffffffffffffffff161480610dd55750610dd481610dcf6122ae565b6120b6565b5b610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90614442565b60405180910390fd5b610e1e8383612322565b505050565b610e2b6122ae565b73ffffffffffffffffffffffffffffffffffffffff16610e496118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690614502565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610efa9190614662565b600060405180830381600087803b158015610f1457600080fd5b505af1158015610f28573d6000803e3d6000fd5b5050505050565b610f388161165a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90614322565b60405180910390fd5b6000600960008461ffff1661ffff1681526020019081526020016000208054610fcd90614bd7565b90501415611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790614602565b60405180910390fd5b611019816123db565b6000338260405160200161102e92919061421f565b6040516020818303038152906040529050600060019050600062036ee890506000828260405160200161106292919061418c565b60405160208183030381529060405290506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108830886000876040518663ffffffff1660e01b81526004016110d995949392919061467d565b604080518083038186803b1580156110f057600080fd5b505afa158015611104573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112891906139bd565b5090508034101561116e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116590614422565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003489600960008c61ffff1661ffff16815260200190815260200160002089336000896040518863ffffffff1660e01b81526004016111ef969594939291906147b8565b6000604051808303818588803b15801561120857600080fd5b505af115801561121c573d6000803e3d6000fd5b505050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f906144a2565b60405180910390fd5b6112a4848484846124f8565b50505050565b6112bb6112b56122ae565b82612525565b6112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f1906145c2565b60405180910390fd5b611305838383612603565b505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614402565b60405180910390fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516113e290614177565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b5050905080611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90614562565b60405180910390fd5b5050565b61148783838360405180602001604052806000815250611b51565b505050565b6114946122ae565b73ffffffffffffffffffffffffffffffffffffffff166114b26118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ff90614502565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b8152600401611567939291906146de565b600060405180830381600087803b15801561158157600080fd5b505af1158015611595573d6000803e3d6000fd5b50505050505050565b6115a66122ae565b73ffffffffffffffffffffffffffffffffffffffff166115c46118e8565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190614502565b60405180910390fd5b80600a908051906020019061163092919061314f565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa90614482565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177490614462565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117cc6122ae565b73ffffffffffffffffffffffffffffffffffffffff166117ea6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790614502565b60405180910390fd5b565b600b5481565b6009602052806000526040600020600091509050805461186790614bd7565b80601f016020809104026020016040519081016040528092919081815260200182805461189390614bd7565b80156118e05780601f106118b5576101008083540402835291602001916118e0565b820191906000526020600020905b8154815290600101906020018083116118c357829003601f168201915b505050505081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050508060000154908060010154905082565b60606001805461197590614bd7565b80601f01602080910402602001604051908101604052809291908181526020018280546119a190614bd7565b80156119ee5780601f106119c3576101008083540402835291602001916119ee565b820191906000526020600020905b8154815290600101906020018083116119d157829003601f168201915b5050505050905090565b600081118015611a0a5750600d548111155b611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a40906145a2565b60405180910390fd5b600c5481600b54611a5a91906149aa565b1115611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a92906143e2565b60405180910390fd5b80600e54611aa99190614a31565b341015611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae2906145e2565b60405180910390fd5b60005b81811015611b37576000600b60008154611b0790614c3a565b9190508190559050600c548111611b2357611b22338261286a565b5b508080611b2f90614c3a565b915050611aee565b5050565b611b4d611b466122ae565b8383612888565b5050565b611b62611b5c6122ae565b83612525565b611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b98906145c2565b60405180910390fd5b611bad848484846129f5565b50505050565b6060611bbe826122b6565b611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf490614542565b60405180910390fd5b6000611c07612a51565b90506000815111611c275760405180602001604052806000815250611c52565b80611c3184612ae3565b604051602001611c42929190614148565b6040516020818303038152906040525b915050919050565b611c626122ae565b73ffffffffffffffffffffffffffffffffffffffff16611c806118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccd90614502565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b8152600401611d3995949392919061482e565b600060405180830381600087803b158015611d5357600080fd5b505af1158015611d67573d6000803e3d6000fd5b505050505050505050565b6000600860008761ffff1661ffff16815260200190815260200160002085604051611d9d919061411a565b908152602001604051809103902060008567ffffffffffffffff16815260200190815260200160002090506000801b81600101541415611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990614642565b60405180910390fd5b806000015483839050148015611e42575080600101548383604051611e38929190614101565b6040518091039020145b611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e78906143a2565b60405180910390fd5b600081600001819055506000801b81600101819055503073ffffffffffffffffffffffffffffffffffffffff16631c37a82287878787876040518663ffffffff1660e01b8152600401611ed8959493929190614710565b600060405180830381600087803b158015611ef257600080fd5b505af1158015611f06573d6000803e3d6000fd5b50505050505050505050565b600a8054611f1f90614bd7565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4b90614bd7565b8015611f985780601f10611f6d57610100808354040283529160200191611f98565b820191906000526020600020905b815481529060010190602001808311611f7b57829003601f168201915b505050505081565b611fa86122ae565b73ffffffffffffffffffffffffffffffffffffffff16611fc66118e8565b73ffffffffffffffffffffffffffffffffffffffff161461201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201390614502565b60405180910390fd5b6000600960008561ffff1661ffff168152602001908152602001600020805461204490614bd7565b905014612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207d90614622565b60405180910390fd5b8181600960008661ffff1661ffff16815260200190815260200160002091906120b09291906131d5565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b565b6121546122ae565b73ffffffffffffffffffffffffffffffffffffffff166121726118e8565b73ffffffffffffffffffffffffffffffffffffffff16146121c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bf90614502565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222f906142e2565b60405180910390fd5b61224181612c90565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123958361165a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123e68261165a565b90506123f481600084612d56565b6123ff600083612322565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461244f9190614a8b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124f481600084612d5b565b5050565b6000808280602001905181019061250f9190613478565b9150915061251d828261286a565b505050505050565b6000612530826122b6565b61256f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612566906143c2565b60405180910390fd5b600061257a8361165a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125e957508373ffffffffffffffffffffffffffffffffffffffff166125d184610c86565b73ffffffffffffffffffffffffffffffffffffffff16145b806125fa57506125f981856120b6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126238261165a565b73ffffffffffffffffffffffffffffffffffffffff1614612679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267090614302565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e090614362565b60405180910390fd5b6126f4838383612d56565b6126ff600082612322565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461274f9190614a8b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127a691906149aa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612865838383612d5b565b505050565b612884828260405180602001604052806000815250612d60565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90614382565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129e89190614248565b60405180910390a3505050565b612a00848484612603565b612a0c84848484612dbb565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a42906142c2565b60405180910390fd5b50505050565b6060600a8054612a6090614bd7565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8c90614bd7565b8015612ad95780601f10612aae57610100808354040283529160200191612ad9565b820191906000526020600020905b815481529060010190602001808311612abc57829003601f168201915b5050505050905090565b60606000821415612b2b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c8b565b600082905060005b60008214612b5d578080612b4690614c3a565b915050600a82612b569190614a00565b9150612b33565b60008167ffffffffffffffff811115612b9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bd15781602001600182028036833780820191505090505b5090505b60008514612c8457600182612bea9190614a8b565b9150600a85612bf99190614c9f565b6030612c0591906149aa565b60f81b818381518110612c41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c7d9190614a00565b9450612bd5565b8093505050505b919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b612d6a8383612f52565b612d776000848484612dbb565b612db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dad906142c2565b60405180910390fd5b505050565b6000612ddc8473ffffffffffffffffffffffffffffffffffffffff1661312c565b15612f45578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e056122ae565b8786866040518563ffffffff1660e01b8152600401612e2794939291906141d3565b602060405180830381600087803b158015612e4157600080fd5b505af1925050508015612e7257506040513d601f19601f82011682018060405250810190612e6f919061365b565b60015b612ef5573d8060008114612ea2576040519150601f19603f3d011682016040523d82523d6000602084013e612ea7565b606091505b50600081511415612eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee4906142c2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f4a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb9906144c2565b60405180910390fd5b612fcb816122b6565b1561300b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300290614342565b60405180910390fd5b61301760008383612d56565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461306791906149aa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461312860008383612d5b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461315b90614bd7565b90600052602060002090601f01602090048101928261317d57600085556131c4565b82601f1061319657805160ff19168380011785556131c4565b828001600101855582156131c4579182015b828111156131c35782518255916020019190600101906131a8565b5b5090506131d1919061325b565b5090565b8280546131e190614bd7565b90600052602060002090601f016020900481019282613203576000855561324a565b82601f1061321c57803560ff191683800117855561324a565b8280016001018555821561324a579182015b8281111561324957823582559160200191906001019061322e565b5b509050613257919061325b565b5090565b5b8082111561327457600081600090555060010161325c565b5090565b600061328b613286846148e5565b6148c0565b9050828152602081018484840111156132a357600080fd5b6132ae848285614b95565b509392505050565b60006132c96132c484614916565b6148c0565b9050828152602081018484840111156132e157600080fd5b6132ec848285614b95565b509392505050565b60008135905061330381615599565b92915050565b600081519050613318816155b0565b92915050565b60008135905061332d816155c7565b92915050565b600081359050613342816155de565b92915050565b600081519050613357816155de565b92915050565b60008083601f84011261336f57600080fd5b8235905067ffffffffffffffff81111561338857600080fd5b6020830191508360018202830111156133a057600080fd5b9250929050565b600082601f8301126133b857600080fd5b81356133c8848260208601613278565b91505092915050565b600082601f8301126133e257600080fd5b81356133f28482602086016132b6565b91505092915050565b60008135905061340a816155f5565b92915050565b60008135905061341f8161560c565b92915050565b6000815190506134348161560c565b92915050565b60008135905061344981615623565b92915050565b60006020828403121561346157600080fd5b600061346f848285016132f4565b91505092915050565b6000806040838503121561348b57600080fd5b600061349985828601613309565b92505060206134aa85828601613425565b9150509250929050565b600080604083850312156134c757600080fd5b60006134d5858286016132f4565b92505060206134e6858286016132f4565b9150509250929050565b60008060006060848603121561350557600080fd5b6000613513868287016132f4565b9350506020613524868287016132f4565b925050604061353586828701613410565b9150509250925092565b6000806000806080858703121561355557600080fd5b6000613563878288016132f4565b9450506020613574878288016132f4565b935050604061358587828801613410565b925050606085013567ffffffffffffffff8111156135a257600080fd5b6135ae878288016133a7565b91505092959194509250565b600080604083850312156135cd57600080fd5b60006135db858286016132f4565b92505060206135ec8582860161331e565b9150509250929050565b6000806040838503121561360957600080fd5b6000613617858286016132f4565b925050602061362885828601613410565b9150509250929050565b60006020828403121561364457600080fd5b600061365284828501613333565b91505092915050565b60006020828403121561366d57600080fd5b600061367b84828501613348565b91505092915050565b60006020828403121561369657600080fd5b600082013567ffffffffffffffff8111156136b057600080fd5b6136bc848285016133d1565b91505092915050565b6000602082840312156136d757600080fd5b60006136e5848285016133fb565b91505092915050565b60008060006040848603121561370357600080fd5b6000613711868287016133fb565b935050602084013567ffffffffffffffff81111561372e57600080fd5b61373a8682870161335d565b92509250509250925092565b60008060006060848603121561375b57600080fd5b6000613769868287016133fb565b935050602084013567ffffffffffffffff81111561378657600080fd5b613792868287016133a7565b92505060406137a386828701613410565b9150509250925092565b6000806000806000608086880312156137c557600080fd5b60006137d3888289016133fb565b955050602086013567ffffffffffffffff8111156137f057600080fd5b6137fc888289016133a7565b945050604061380d8882890161343a565b935050606086013567ffffffffffffffff81111561382a57600080fd5b6138368882890161335d565b92509250509295509295909350565b6000806000806080858703121561385b57600080fd5b6000613869878288016133fb565b945050602085013567ffffffffffffffff81111561388657600080fd5b613892878288016133a7565b93505060406138a38782880161343a565b925050606085013567ffffffffffffffff8111156138c057600080fd5b6138cc878288016133a7565b91505092959194509250565b6000806000806000608086880312156138f057600080fd5b60006138fe888289016133fb565b955050602061390f888289016133fb565b945050604061392088828901613410565b935050606086013567ffffffffffffffff81111561393d57600080fd5b6139498882890161335d565b92509250509295509295909350565b6000806040838503121561396b57600080fd5b6000613979858286016133fb565b925050602061398a85828601613410565b9150509250929050565b6000602082840312156139a657600080fd5b60006139b484828501613410565b91505092915050565b600080604083850312156139d057600080fd5b60006139de85828601613425565b92505060206139ef85828601613425565b9150509250929050565b613a0281614ad1565b82525050565b613a1181614abf565b82525050565b613a2081614ae3565b82525050565b613a2f81614aef565b82525050565b6000613a418385614972565b9350613a4e838584614b95565b613a5783614d8c565b840190509392505050565b6000613a6e8385614983565b9350613a7b838584614b95565b82840190509392505050565b6000613a928261495c565b613a9c8185614972565b9350613aac818560208601614ba4565b613ab581614d8c565b840191505092915050565b6000613acb8261495c565b613ad58185614983565b9350613ae5818560208601614ba4565b80840191505092915050565b60008154613afe81614bd7565b613b088186614972565b94506001821660008114613b235760018114613b3557613b68565b60ff1983168652602086019350613b68565b613b3e85614947565b60005b83811015613b6057815481890152600182019150602081019050613b41565b808801955050505b50505092915050565b60008154613b7e81614bd7565b613b888186614983565b94506001821660008114613ba35760018114613bb457613be7565b60ff19831686528186019350613be7565b613bbd85614947565b60005b83811015613bdf57815481890152600182019150602081019050613bc0565b838801955050505b50505092915050565b613bf981614b71565b82525050565b6000613c0a82614967565b613c14818561498e565b9350613c24818560208601614ba4565b613c2d81614d8c565b840191505092915050565b6000613c4382614967565b613c4d818561499f565b9350613c5d818560208601614ba4565b80840191505092915050565b6000613c7660328361498e565b9150613c8182614daa565b604082019050919050565b6000613c9960268361498e565b9150613ca482614df9565b604082019050919050565b6000613cbc60258361498e565b9150613cc782614e48565b604082019050919050565b6000613cdf60298361498e565b9150613cea82614e97565b604082019050919050565b6000613d02601c8361498e565b9150613d0d82614ee6565b602082019050919050565b6000613d2560248361498e565b9150613d3082614f0f565b604082019050919050565b6000613d4860198361498e565b9150613d5382614f5e565b602082019050919050565b6000613d6b601a8361498e565b9150613d7682614f87565b602082019050919050565b6000613d8e602c8361498e565b9150613d9982614fb0565b604082019050919050565b6000613db160328361498e565b9150613dbc82614fff565b604082019050919050565b6000613dd460178361498e565b9150613ddf8261504e565b602082019050919050565b6000613df7602d8361498e565b9150613e0282615077565b604082019050919050565b6000613e1a60388361498e565b9150613e25826150c6565b604082019050919050565b6000613e3d602a8361498e565b9150613e4882615115565b604082019050919050565b6000613e6060298361498e565b9150613e6b82615164565b604082019050919050565b6000613e83602b8361498e565b9150613e8e826151b3565b604082019050919050565b6000613ea660208361498e565b9150613eb182615202565b602082019050919050565b6000613ec9602c8361498e565b9150613ed48261522b565b604082019050919050565b6000613eec60058361499f565b9150613ef78261527a565b600582019050919050565b6000613f0f60208361498e565b9150613f1a826152a3565b602082019050919050565b6000613f3260348361498e565b9150613f3d826152cc565b604082019050919050565b6000613f55602f8361498e565b9150613f608261531b565b604082019050919050565b6000613f7860188361498e565b9150613f838261536a565b602082019050919050565b6000613f9b60218361498e565b9150613fa682615393565b604082019050919050565b6000613fbe600083614983565b9150613fc9826153e2565b600082019050919050565b6000613fe160238361498e565b9150613fec826153e5565b604082019050919050565b600061400460318361498e565b915061400f82615434565b604082019050919050565b600061402760158361498e565b915061403282615483565b602082019050919050565b600061404a602a8361498e565b9150614055826154ac565b604082019050919050565b600061406d60408361498e565b9150614078826154fb565b604082019050919050565b600061409060268361498e565b915061409b8261554a565b604082019050919050565b6140af81614b25565b82525050565b6140c66140c182614b25565b614c83565b82525050565b6140d581614b53565b82525050565b6140ec6140e782614b53565b614c95565b82525050565b6140fb81614b5d565b82525050565b600061410e828486613a62565b91508190509392505050565b60006141268284613ac0565b915081905092915050565b600061413d8284613b71565b915081905092915050565b60006141548285613c38565b91506141608284613c38565b915061416b82613edf565b91508190509392505050565b600061418282613fb1565b9150819050919050565b600061419882856140b5565b6002820191506141a882846140db565b6020820191508190509392505050565b60006020820190506141cd6000830184613a08565b92915050565b60006080820190506141e86000830187613a08565b6141f56020830186613a08565b61420260408301856140cc565b81810360608301526142148184613a87565b905095945050505050565b60006040820190506142346000830185613a08565b61424160208301846140cc565b9392505050565b600060208201905061425d6000830184613a17565b92915050565b6000602082019050818103600083015261427d8184613a87565b905092915050565b600060208201905061429a6000830184613bf0565b92915050565b600060208201905081810360008301526142ba8184613bff565b905092915050565b600060208201905081810360008301526142db81613c69565b9050919050565b600060208201905081810360008301526142fb81613c8c565b9050919050565b6000602082019050818103600083015261431b81613caf565b9050919050565b6000602082019050818103600083015261433b81613cd2565b9050919050565b6000602082019050818103600083015261435b81613cf5565b9050919050565b6000602082019050818103600083015261437b81613d18565b9050919050565b6000602082019050818103600083015261439b81613d3b565b9050919050565b600060208201905081810360008301526143bb81613d5e565b9050919050565b600060208201905081810360008301526143db81613d81565b9050919050565b600060208201905081810360008301526143fb81613da4565b9050919050565b6000602082019050818103600083015261441b81613dc7565b9050919050565b6000602082019050818103600083015261443b81613dea565b9050919050565b6000602082019050818103600083015261445b81613e0d565b9050919050565b6000602082019050818103600083015261447b81613e30565b9050919050565b6000602082019050818103600083015261449b81613e53565b9050919050565b600060208201905081810360008301526144bb81613e76565b9050919050565b600060208201905081810360008301526144db81613e99565b9050919050565b600060208201905081810360008301526144fb81613ebc565b9050919050565b6000602082019050818103600083015261451b81613f02565b9050919050565b6000602082019050818103600083015261453b81613f25565b9050919050565b6000602082019050818103600083015261455b81613f48565b9050919050565b6000602082019050818103600083015261457b81613f6b565b9050919050565b6000602082019050818103600083015261459b81613f8e565b9050919050565b600060208201905081810360008301526145bb81613fd4565b9050919050565b600060208201905081810360008301526145db81613ff7565b9050919050565b600060208201905081810360008301526145fb8161401a565b9050919050565b6000602082019050818103600083015261461b8161403d565b9050919050565b6000602082019050818103600083015261463b81614060565b9050919050565b6000602082019050818103600083015261465b81614083565b9050919050565b600060208201905061467760008301846140a6565b92915050565b600060a08201905061469260008301886140a6565b61469f6020830187613a08565b81810360408301526146b18186613a87565b90506146c06060830185613a17565b81810360808301526146d28184613a87565b90509695505050505050565b60006040820190506146f360008301866140a6565b8181036020830152614706818486613a35565b9050949350505050565b600060808201905061472560008301886140a6565b81810360208301526147378187613a87565b905061474660408301866140f2565b8181036060830152614759818486613a35565b90509695505050505050565b600060808201905061477a60008301876140a6565b818103602083015261478c8186613a87565b905061479b60408301856140f2565b81810360608301526147ad8184613a87565b905095945050505050565b600060c0820190506147cd60008301896140a6565b81810360208301526147df8188613af1565b905081810360408301526147f38187613a87565b905061480260608301866139f9565b61480f6080830185613a08565b81810360a08301526148218184613a87565b9050979650505050505050565b600060808201905061484360008301886140a6565b61485060208301876140a6565b61485d60408301866140cc565b8181036060830152614870818486613a35565b90509695505050505050565b600060208201905061489160008301846140cc565b92915050565b60006040820190506148ac60008301856140cc565b6148b96020830184613a26565b9392505050565b60006148ca6148db565b90506148d68282614c09565b919050565b6000604051905090565b600067ffffffffffffffff821115614900576148ff614d5d565b5b61490982614d8c565b9050602081019050919050565b600067ffffffffffffffff82111561493157614930614d5d565b5b61493a82614d8c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149b582614b53565b91506149c083614b53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149f5576149f4614cd0565b5b828201905092915050565b6000614a0b82614b53565b9150614a1683614b53565b925082614a2657614a25614cff565b5b828204905092915050565b6000614a3c82614b53565b9150614a4783614b53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a8057614a7f614cd0565b5b828202905092915050565b6000614a9682614b53565b9150614aa183614b53565b925082821015614ab457614ab3614cd0565b5b828203905092915050565b6000614aca82614b33565b9050919050565b6000614adc82614b33565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000614b7c82614b83565b9050919050565b6000614b8e82614b33565b9050919050565b82818337600083830152505050565b60005b83811015614bc2578082015181840152602081019050614ba7565b83811115614bd1576000848401525b50505050565b60006002820490506001821680614bef57607f821691505b60208210811415614c0357614c02614d2e565b5b50919050565b614c1282614d8c565b810181811067ffffffffffffffff82111715614c3157614c30614d5d565b5b80604052505050565b6000614c4582614b53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7857614c77614cd0565b5b600182019050919050565b6000614c8e82614d9d565b9050919050565b6000819050919050565b6000614caa82614b53565b9150614cb583614b53565b925082614cc557614cc4614cff565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4d6573736167652073656e646572206d757374206f776e20746865204f6d6e6960008201527f636861696e4e46542e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d6178206d696e74206c60008201527f696d6974206174207468697320636861696e0000000000000000000000000000602082015250565b7f4f6e6c79206f776e65722063616e207769746864726177000000000000000000600082015250565b7f4e6f7420656e6f7567682067617320746f20636f7665722063726f737320636860008201527f61696e207472616e736665722e00000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460008201527f206265204272696467652e000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560008201527f7263652073656e64696e6720636f6e7472616374000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f43616e206f6e6c79206d696e74206f6e65206f72206d6f72652061742061207460008201527f696d650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f5468697320636861696e206973206e6f742061207472757374656420736f757260008201527f636520736f757263652e00000000000000000000000000000000000000000000602082015250565b7f546865207472757374656420736f75726365206164647265737320686173206160008201527f6c7265616479206265656e2073657420666f722074686520636861696e496421602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60008201527f6573736167650000000000000000000000000000000000000000000000000000602082015250565b6155a281614abf565b81146155ad57600080fd5b50565b6155b981614ad1565b81146155c457600080fd5b50565b6155d081614ae3565b81146155db57600080fd5b50565b6155e781614af9565b81146155f257600080fd5b50565b6155fe81614b25565b811461560957600080fd5b50565b61561581614b53565b811461562057600080fd5b50565b61562c81614b5d565b811461563757600080fd5b5056fea2646970667358221220688fd765855062927437ebd92708bbe721bf862f93701605e3500bff3a53dd9364736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000196400000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d534145784d473171576e764b4e774a47445472506a446a4558656a7058694e324b38434c70657964313766552f00000000000000000000

Deployed Bytecode

0x6080604052600436106101f85760003560e01c8063715018a61161010d578063b88d4fde116100a0578063d547cfb71161006f578063d547cfb714610700578063d73f057e1461072b578063e985e9c514610754578063ed88c68e14610791578063f2fde38b1461079b576101f8565b8063b88d4fde14610655578063c87b56dd1461067e578063cbed8b9c146106bb578063d1deba1f146106e4576101f8565b80638ee74912116100dc5780638ee74912146105a757806395d89b41146105e5578063a0712d6814610610578063a22cb4651461062c576101f8565b8063715018a6146104fd57806375794a3c1461051457806381c986ee1461053f5780638da5cb5b1461057c576101f8565b80631c37a8221161019057806342d65a8d1161015f57806342d65a8d1461040657806355f804b31461042f5780635e280f11146104585780636352211e1461048357806370a08231146104c0576101f8565b80631c37a8221461036257806323b872dd1461038b5780632e1a7d4d146103b457806342842e0e146103dd576101f8565b8063081812fc116101cc578063081812fc146102b7578063095ea7b3146102f457806310ddb1371461031d57806314c957d514610346576101f8565b80621d3567146101fd57806301ffc9a71461022657806306fdde031461026357806307e0db171461028e575b600080fd5b34801561020957600080fd5b50610224600480360381019061021f9190613845565b6107c4565b005b34801561023257600080fd5b5061024d60048036038101906102489190613632565b610a06565b60405161025a9190614248565b60405180910390f35b34801561026f57600080fd5b50610278610ae8565b60405161028591906142a0565b60405180910390f35b34801561029a57600080fd5b506102b560048036038101906102b091906136c5565b610b7a565b005b3480156102c357600080fd5b506102de60048036038101906102d99190613994565b610c86565b6040516102eb91906141b8565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906135f6565b610d0b565b005b34801561032957600080fd5b50610344600480360381019061033f91906136c5565b610e23565b005b610360600480360381019061035b9190613958565b610f2f565b005b34801561036e57600080fd5b5061038960048036038101906103849190613845565b61122a565b005b34801561039757600080fd5b506103b260048036038101906103ad91906134f0565b6112aa565b005b3480156103c057600080fd5b506103db60048036038101906103d69190613994565b61130a565b005b3480156103e957600080fd5b5061040460048036038101906103ff91906134f0565b61146c565b005b34801561041257600080fd5b5061042d600480360381019061042891906136ee565b61148c565b005b34801561043b57600080fd5b5061045660048036038101906104519190613684565b61159e565b005b34801561046457600080fd5b5061046d611634565b60405161047a9190614285565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613994565b61165a565b6040516104b791906141b8565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e2919061344f565b61170c565b6040516104f4919061487c565b60405180910390f35b34801561050957600080fd5b506105126117c4565b005b34801561052057600080fd5b50610529611842565b604051610536919061487c565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906136c5565b611848565b6040516105739190614263565b60405180910390f35b34801561058857600080fd5b506105916118e8565b60405161059e91906141b8565b60405180910390f35b3480156105b357600080fd5b506105ce60048036038101906105c99190613746565b611912565b6040516105dc929190614897565b60405180910390f35b3480156105f157600080fd5b506105fa611966565b60405161060791906142a0565b60405180910390f35b61062a60048036038101906106259190613994565b6119f8565b005b34801561063857600080fd5b50610653600480360381019061064e91906135ba565b611b3b565b005b34801561066157600080fd5b5061067c6004803603810190610677919061353f565b611b51565b005b34801561068a57600080fd5b506106a560048036038101906106a09190613994565b611bb3565b6040516106b291906142a0565b60405180910390f35b3480156106c757600080fd5b506106e260048036038101906106dd91906138d8565b611c5a565b005b6106fe60048036038101906106f991906137ad565b611d72565b005b34801561070c57600080fd5b50610715611f12565b60405161072291906142a0565b60405180910390f35b34801561073757600080fd5b50610752600480360381019061074d91906136ee565b611fa0565b005b34801561076057600080fd5b5061077b600480360381019061077691906134b4565b6120b6565b6040516107889190614248565b60405180910390f35b61079961214a565b005b3480156107a757600080fd5b506107c260048036038101906107bd919061344f565b61214c565b005b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461081e57600080fd5b600960008561ffff1661ffff168152602001908152602001600020805461084490614bd7565b9050835114801561088a5750600960008561ffff1661ffff1681526020019081526020016000206040516108789190614131565b60405180910390208380519060200120145b6108c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108c090614522565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff16631c37a822858585856040518563ffffffff1660e01b81526004016109089493929190614765565b600060405180830381600087803b15801561092257600080fd5b505af1925050508015610933575060015b6109ff576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161097d919061411a565b908152602001604051809103902060008467ffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101559050507fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d848484846040516109f29493929190614765565b60405180910390a1610a00565b5b50505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ad157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ae15750610ae082612244565b5b9050919050565b606060008054610af790614bd7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2390614bd7565b8015610b705780601f10610b4557610100808354040283529160200191610b70565b820191906000526020600020905b815481529060010190602001808311610b5357829003601f168201915b5050505050905090565b610b826122ae565b73ffffffffffffffffffffffffffffffffffffffff16610ba06118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610bf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bed90614502565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166307e0db17826040518263ffffffff1660e01b8152600401610c519190614662565b600060405180830381600087803b158015610c6b57600080fd5b505af1158015610c7f573d6000803e3d6000fd5b5050505050565b6000610c91826122b6565b610cd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc7906144e2565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d168261165a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7e90614582565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610da66122ae565b73ffffffffffffffffffffffffffffffffffffffff161480610dd55750610dd481610dcf6122ae565b6120b6565b5b610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90614442565b60405180910390fd5b610e1e8383612322565b505050565b610e2b6122ae565b73ffffffffffffffffffffffffffffffffffffffff16610e496118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610e9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9690614502565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166310ddb137826040518263ffffffff1660e01b8152600401610efa9190614662565b600060405180830381600087803b158015610f1457600080fd5b505af1158015610f28573d6000803e3d6000fd5b5050505050565b610f388161165a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610fa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9c90614322565b60405180910390fd5b6000600960008461ffff1661ffff1681526020019081526020016000208054610fcd90614bd7565b90501415611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790614602565b60405180910390fd5b611019816123db565b6000338260405160200161102e92919061421f565b6040516020818303038152906040529050600060019050600062036ee890506000828260405160200161106292919061418c565b60405160208183030381529060405290506000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340a7bb108830886000876040518663ffffffff1660e01b81526004016110d995949392919061467d565b604080518083038186803b1580156110f057600080fd5b505afa158015611104573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112891906139bd565b5090508034101561116e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116590614422565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c58031003489600960008c61ffff1661ffff16815260200190815260200160002089336000896040518863ffffffff1660e01b81526004016111ef969594939291906147b8565b6000604051808303818588803b15801561120857600080fd5b505af115801561121c573d6000803e3d6000fd5b505050505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611298576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128f906144a2565b60405180910390fd5b6112a4848484846124f8565b50505050565b6112bb6112b56122ae565b82612525565b6112fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f1906145c2565b60405180910390fd5b611305838383612603565b505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614402565b60405180910390fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16826040516113e290614177565b60006040518083038185875af1925050503d806000811461141f576040519150601f19603f3d011682016040523d82523d6000602084013e611424565b606091505b5050905080611468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145f90614562565b60405180910390fd5b5050565b61148783838360405180602001604052806000815250611b51565b505050565b6114946122ae565b73ffffffffffffffffffffffffffffffffffffffff166114b26118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ff90614502565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342d65a8d8484846040518463ffffffff1660e01b8152600401611567939291906146de565b600060405180830381600087803b15801561158157600080fd5b505af1158015611595573d6000803e3d6000fd5b50505050505050565b6115a66122ae565b73ffffffffffffffffffffffffffffffffffffffff166115c46118e8565b73ffffffffffffffffffffffffffffffffffffffff161461161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161190614502565b60405180910390fd5b80600a908051906020019061163092919061314f565b5050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa90614482565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177490614462565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117cc6122ae565b73ffffffffffffffffffffffffffffffffffffffff166117ea6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183790614502565b60405180910390fd5b565b600b5481565b6009602052806000526040600020600091509050805461186790614bd7565b80601f016020809104026020016040519081016040528092919081815260200182805461189390614bd7565b80156118e05780601f106118b5576101008083540402835291602001916118e0565b820191906000526020600020905b8154815290600101906020018083116118c357829003601f168201915b505050505081565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60086020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505060205280600052604060002060009250925050508060000154908060010154905082565b60606001805461197590614bd7565b80601f01602080910402602001604051908101604052809291908181526020018280546119a190614bd7565b80156119ee5780601f106119c3576101008083540402835291602001916119ee565b820191906000526020600020905b8154815290600101906020018083116119d157829003601f168201915b5050505050905090565b600081118015611a0a5750600d548111155b611a49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a40906145a2565b60405180910390fd5b600c5481600b54611a5a91906149aa565b1115611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a92906143e2565b60405180910390fd5b80600e54611aa99190614a31565b341015611aeb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae2906145e2565b60405180910390fd5b60005b81811015611b37576000600b60008154611b0790614c3a565b9190508190559050600c548111611b2357611b22338261286a565b5b508080611b2f90614c3a565b915050611aee565b5050565b611b4d611b466122ae565b8383612888565b5050565b611b62611b5c6122ae565b83612525565b611ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b98906145c2565b60405180910390fd5b611bad848484846129f5565b50505050565b6060611bbe826122b6565b611bfd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf490614542565b60405180910390fd5b6000611c07612a51565b90506000815111611c275760405180602001604052806000815250611c52565b80611c3184612ae3565b604051602001611c42929190614148565b6040516020818303038152906040525b915050919050565b611c626122ae565b73ffffffffffffffffffffffffffffffffffffffff16611c806118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccd90614502565b60405180910390fd5b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cbed8b9c86868686866040518663ffffffff1660e01b8152600401611d3995949392919061482e565b600060405180830381600087803b158015611d5357600080fd5b505af1158015611d67573d6000803e3d6000fd5b505050505050505050565b6000600860008761ffff1661ffff16815260200190815260200160002085604051611d9d919061411a565b908152602001604051809103902060008567ffffffffffffffff16815260200190815260200160002090506000801b81600101541415611e12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0990614642565b60405180910390fd5b806000015483839050148015611e42575080600101548383604051611e38929190614101565b6040518091039020145b611e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e78906143a2565b60405180910390fd5b600081600001819055506000801b81600101819055503073ffffffffffffffffffffffffffffffffffffffff16631c37a82287878787876040518663ffffffff1660e01b8152600401611ed8959493929190614710565b600060405180830381600087803b158015611ef257600080fd5b505af1158015611f06573d6000803e3d6000fd5b50505050505050505050565b600a8054611f1f90614bd7565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4b90614bd7565b8015611f985780601f10611f6d57610100808354040283529160200191611f98565b820191906000526020600020905b815481529060010190602001808311611f7b57829003601f168201915b505050505081565b611fa86122ae565b73ffffffffffffffffffffffffffffffffffffffff16611fc66118e8565b73ffffffffffffffffffffffffffffffffffffffff161461201c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161201390614502565b60405180910390fd5b6000600960008561ffff1661ffff168152602001908152602001600020805461204490614bd7565b905014612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207d90614622565b60405180910390fd5b8181600960008661ffff1661ffff16815260200190815260200160002091906120b09291906131d5565b50505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b565b6121546122ae565b73ffffffffffffffffffffffffffffffffffffffff166121726118e8565b73ffffffffffffffffffffffffffffffffffffffff16146121c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bf90614502565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222f906142e2565b60405180910390fd5b61224181612c90565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123958361165a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006123e68261165a565b90506123f481600084612d56565b6123ff600083612322565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461244f9190614a8b565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124f481600084612d5b565b5050565b6000808280602001905181019061250f9190613478565b9150915061251d828261286a565b505050505050565b6000612530826122b6565b61256f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612566906143c2565b60405180910390fd5b600061257a8361165a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806125e957508373ffffffffffffffffffffffffffffffffffffffff166125d184610c86565b73ffffffffffffffffffffffffffffffffffffffff16145b806125fa57506125f981856120b6565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166126238261165a565b73ffffffffffffffffffffffffffffffffffffffff1614612679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267090614302565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e090614362565b60405180910390fd5b6126f4838383612d56565b6126ff600082612322565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461274f9190614a8b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127a691906149aa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612865838383612d5b565b505050565b612884828260405180602001604052806000815250612d60565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ee90614382565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129e89190614248565b60405180910390a3505050565b612a00848484612603565b612a0c84848484612dbb565b612a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a42906142c2565b60405180910390fd5b50505050565b6060600a8054612a6090614bd7565b80601f0160208091040260200160405190810160405280929190818152602001828054612a8c90614bd7565b8015612ad95780601f10612aae57610100808354040283529160200191612ad9565b820191906000526020600020905b815481529060010190602001808311612abc57829003601f168201915b5050505050905090565b60606000821415612b2b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c8b565b600082905060005b60008214612b5d578080612b4690614c3a565b915050600a82612b569190614a00565b9150612b33565b60008167ffffffffffffffff811115612b9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612bd15781602001600182028036833780820191505090505b5090505b60008514612c8457600182612bea9190614a8b565b9150600a85612bf99190614c9f565b6030612c0591906149aa565b60f81b818381518110612c41577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c7d9190614a00565b9450612bd5565b8093505050505b919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b612d6a8383612f52565b612d776000848484612dbb565b612db6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dad906142c2565b60405180910390fd5b505050565b6000612ddc8473ffffffffffffffffffffffffffffffffffffffff1661312c565b15612f45578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e056122ae565b8786866040518563ffffffff1660e01b8152600401612e2794939291906141d3565b602060405180830381600087803b158015612e4157600080fd5b505af1925050508015612e7257506040513d601f19601f82011682018060405250810190612e6f919061365b565b60015b612ef5573d8060008114612ea2576040519150601f19603f3d011682016040523d82523d6000602084013e612ea7565b606091505b50600081511415612eed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee4906142c2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f4a565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb9906144c2565b60405180910390fd5b612fcb816122b6565b1561300b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300290614342565b60405180910390fd5b61301760008383612d56565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461306791906149aa565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461312860008383612d5b565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461315b90614bd7565b90600052602060002090601f01602090048101928261317d57600085556131c4565b82601f1061319657805160ff19168380011785556131c4565b828001600101855582156131c4579182015b828111156131c35782518255916020019190600101906131a8565b5b5090506131d1919061325b565b5090565b8280546131e190614bd7565b90600052602060002090601f016020900481019282613203576000855561324a565b82601f1061321c57803560ff191683800117855561324a565b8280016001018555821561324a579182015b8281111561324957823582559160200191906001019061322e565b5b509050613257919061325b565b5090565b5b8082111561327457600081600090555060010161325c565b5090565b600061328b613286846148e5565b6148c0565b9050828152602081018484840111156132a357600080fd5b6132ae848285614b95565b509392505050565b60006132c96132c484614916565b6148c0565b9050828152602081018484840111156132e157600080fd5b6132ec848285614b95565b509392505050565b60008135905061330381615599565b92915050565b600081519050613318816155b0565b92915050565b60008135905061332d816155c7565b92915050565b600081359050613342816155de565b92915050565b600081519050613357816155de565b92915050565b60008083601f84011261336f57600080fd5b8235905067ffffffffffffffff81111561338857600080fd5b6020830191508360018202830111156133a057600080fd5b9250929050565b600082601f8301126133b857600080fd5b81356133c8848260208601613278565b91505092915050565b600082601f8301126133e257600080fd5b81356133f28482602086016132b6565b91505092915050565b60008135905061340a816155f5565b92915050565b60008135905061341f8161560c565b92915050565b6000815190506134348161560c565b92915050565b60008135905061344981615623565b92915050565b60006020828403121561346157600080fd5b600061346f848285016132f4565b91505092915050565b6000806040838503121561348b57600080fd5b600061349985828601613309565b92505060206134aa85828601613425565b9150509250929050565b600080604083850312156134c757600080fd5b60006134d5858286016132f4565b92505060206134e6858286016132f4565b9150509250929050565b60008060006060848603121561350557600080fd5b6000613513868287016132f4565b9350506020613524868287016132f4565b925050604061353586828701613410565b9150509250925092565b6000806000806080858703121561355557600080fd5b6000613563878288016132f4565b9450506020613574878288016132f4565b935050604061358587828801613410565b925050606085013567ffffffffffffffff8111156135a257600080fd5b6135ae878288016133a7565b91505092959194509250565b600080604083850312156135cd57600080fd5b60006135db858286016132f4565b92505060206135ec8582860161331e565b9150509250929050565b6000806040838503121561360957600080fd5b6000613617858286016132f4565b925050602061362885828601613410565b9150509250929050565b60006020828403121561364457600080fd5b600061365284828501613333565b91505092915050565b60006020828403121561366d57600080fd5b600061367b84828501613348565b91505092915050565b60006020828403121561369657600080fd5b600082013567ffffffffffffffff8111156136b057600080fd5b6136bc848285016133d1565b91505092915050565b6000602082840312156136d757600080fd5b60006136e5848285016133fb565b91505092915050565b60008060006040848603121561370357600080fd5b6000613711868287016133fb565b935050602084013567ffffffffffffffff81111561372e57600080fd5b61373a8682870161335d565b92509250509250925092565b60008060006060848603121561375b57600080fd5b6000613769868287016133fb565b935050602084013567ffffffffffffffff81111561378657600080fd5b613792868287016133a7565b92505060406137a386828701613410565b9150509250925092565b6000806000806000608086880312156137c557600080fd5b60006137d3888289016133fb565b955050602086013567ffffffffffffffff8111156137f057600080fd5b6137fc888289016133a7565b945050604061380d8882890161343a565b935050606086013567ffffffffffffffff81111561382a57600080fd5b6138368882890161335d565b92509250509295509295909350565b6000806000806080858703121561385b57600080fd5b6000613869878288016133fb565b945050602085013567ffffffffffffffff81111561388657600080fd5b613892878288016133a7565b93505060406138a38782880161343a565b925050606085013567ffffffffffffffff8111156138c057600080fd5b6138cc878288016133a7565b91505092959194509250565b6000806000806000608086880312156138f057600080fd5b60006138fe888289016133fb565b955050602061390f888289016133fb565b945050604061392088828901613410565b935050606086013567ffffffffffffffff81111561393d57600080fd5b6139498882890161335d565b92509250509295509295909350565b6000806040838503121561396b57600080fd5b6000613979858286016133fb565b925050602061398a85828601613410565b9150509250929050565b6000602082840312156139a657600080fd5b60006139b484828501613410565b91505092915050565b600080604083850312156139d057600080fd5b60006139de85828601613425565b92505060206139ef85828601613425565b9150509250929050565b613a0281614ad1565b82525050565b613a1181614abf565b82525050565b613a2081614ae3565b82525050565b613a2f81614aef565b82525050565b6000613a418385614972565b9350613a4e838584614b95565b613a5783614d8c565b840190509392505050565b6000613a6e8385614983565b9350613a7b838584614b95565b82840190509392505050565b6000613a928261495c565b613a9c8185614972565b9350613aac818560208601614ba4565b613ab581614d8c565b840191505092915050565b6000613acb8261495c565b613ad58185614983565b9350613ae5818560208601614ba4565b80840191505092915050565b60008154613afe81614bd7565b613b088186614972565b94506001821660008114613b235760018114613b3557613b68565b60ff1983168652602086019350613b68565b613b3e85614947565b60005b83811015613b6057815481890152600182019150602081019050613b41565b808801955050505b50505092915050565b60008154613b7e81614bd7565b613b888186614983565b94506001821660008114613ba35760018114613bb457613be7565b60ff19831686528186019350613be7565b613bbd85614947565b60005b83811015613bdf57815481890152600182019150602081019050613bc0565b838801955050505b50505092915050565b613bf981614b71565b82525050565b6000613c0a82614967565b613c14818561498e565b9350613c24818560208601614ba4565b613c2d81614d8c565b840191505092915050565b6000613c4382614967565b613c4d818561499f565b9350613c5d818560208601614ba4565b80840191505092915050565b6000613c7660328361498e565b9150613c8182614daa565b604082019050919050565b6000613c9960268361498e565b9150613ca482614df9565b604082019050919050565b6000613cbc60258361498e565b9150613cc782614e48565b604082019050919050565b6000613cdf60298361498e565b9150613cea82614e97565b604082019050919050565b6000613d02601c8361498e565b9150613d0d82614ee6565b602082019050919050565b6000613d2560248361498e565b9150613d3082614f0f565b604082019050919050565b6000613d4860198361498e565b9150613d5382614f5e565b602082019050919050565b6000613d6b601a8361498e565b9150613d7682614f87565b602082019050919050565b6000613d8e602c8361498e565b9150613d9982614fb0565b604082019050919050565b6000613db160328361498e565b9150613dbc82614fff565b604082019050919050565b6000613dd460178361498e565b9150613ddf8261504e565b602082019050919050565b6000613df7602d8361498e565b9150613e0282615077565b604082019050919050565b6000613e1a60388361498e565b9150613e25826150c6565b604082019050919050565b6000613e3d602a8361498e565b9150613e4882615115565b604082019050919050565b6000613e6060298361498e565b9150613e6b82615164565b604082019050919050565b6000613e83602b8361498e565b9150613e8e826151b3565b604082019050919050565b6000613ea660208361498e565b9150613eb182615202565b602082019050919050565b6000613ec9602c8361498e565b9150613ed48261522b565b604082019050919050565b6000613eec60058361499f565b9150613ef78261527a565b600582019050919050565b6000613f0f60208361498e565b9150613f1a826152a3565b602082019050919050565b6000613f3260348361498e565b9150613f3d826152cc565b604082019050919050565b6000613f55602f8361498e565b9150613f608261531b565b604082019050919050565b6000613f7860188361498e565b9150613f838261536a565b602082019050919050565b6000613f9b60218361498e565b9150613fa682615393565b604082019050919050565b6000613fbe600083614983565b9150613fc9826153e2565b600082019050919050565b6000613fe160238361498e565b9150613fec826153e5565b604082019050919050565b600061400460318361498e565b915061400f82615434565b604082019050919050565b600061402760158361498e565b915061403282615483565b602082019050919050565b600061404a602a8361498e565b9150614055826154ac565b604082019050919050565b600061406d60408361498e565b9150614078826154fb565b604082019050919050565b600061409060268361498e565b915061409b8261554a565b604082019050919050565b6140af81614b25565b82525050565b6140c66140c182614b25565b614c83565b82525050565b6140d581614b53565b82525050565b6140ec6140e782614b53565b614c95565b82525050565b6140fb81614b5d565b82525050565b600061410e828486613a62565b91508190509392505050565b60006141268284613ac0565b915081905092915050565b600061413d8284613b71565b915081905092915050565b60006141548285613c38565b91506141608284613c38565b915061416b82613edf565b91508190509392505050565b600061418282613fb1565b9150819050919050565b600061419882856140b5565b6002820191506141a882846140db565b6020820191508190509392505050565b60006020820190506141cd6000830184613a08565b92915050565b60006080820190506141e86000830187613a08565b6141f56020830186613a08565b61420260408301856140cc565b81810360608301526142148184613a87565b905095945050505050565b60006040820190506142346000830185613a08565b61424160208301846140cc565b9392505050565b600060208201905061425d6000830184613a17565b92915050565b6000602082019050818103600083015261427d8184613a87565b905092915050565b600060208201905061429a6000830184613bf0565b92915050565b600060208201905081810360008301526142ba8184613bff565b905092915050565b600060208201905081810360008301526142db81613c69565b9050919050565b600060208201905081810360008301526142fb81613c8c565b9050919050565b6000602082019050818103600083015261431b81613caf565b9050919050565b6000602082019050818103600083015261433b81613cd2565b9050919050565b6000602082019050818103600083015261435b81613cf5565b9050919050565b6000602082019050818103600083015261437b81613d18565b9050919050565b6000602082019050818103600083015261439b81613d3b565b9050919050565b600060208201905081810360008301526143bb81613d5e565b9050919050565b600060208201905081810360008301526143db81613d81565b9050919050565b600060208201905081810360008301526143fb81613da4565b9050919050565b6000602082019050818103600083015261441b81613dc7565b9050919050565b6000602082019050818103600083015261443b81613dea565b9050919050565b6000602082019050818103600083015261445b81613e0d565b9050919050565b6000602082019050818103600083015261447b81613e30565b9050919050565b6000602082019050818103600083015261449b81613e53565b9050919050565b600060208201905081810360008301526144bb81613e76565b9050919050565b600060208201905081810360008301526144db81613e99565b9050919050565b600060208201905081810360008301526144fb81613ebc565b9050919050565b6000602082019050818103600083015261451b81613f02565b9050919050565b6000602082019050818103600083015261453b81613f25565b9050919050565b6000602082019050818103600083015261455b81613f48565b9050919050565b6000602082019050818103600083015261457b81613f6b565b9050919050565b6000602082019050818103600083015261459b81613f8e565b9050919050565b600060208201905081810360008301526145bb81613fd4565b9050919050565b600060208201905081810360008301526145db81613ff7565b9050919050565b600060208201905081810360008301526145fb8161401a565b9050919050565b6000602082019050818103600083015261461b8161403d565b9050919050565b6000602082019050818103600083015261463b81614060565b9050919050565b6000602082019050818103600083015261465b81614083565b9050919050565b600060208201905061467760008301846140a6565b92915050565b600060a08201905061469260008301886140a6565b61469f6020830187613a08565b81810360408301526146b18186613a87565b90506146c06060830185613a17565b81810360808301526146d28184613a87565b90509695505050505050565b60006040820190506146f360008301866140a6565b8181036020830152614706818486613a35565b9050949350505050565b600060808201905061472560008301886140a6565b81810360208301526147378187613a87565b905061474660408301866140f2565b8181036060830152614759818486613a35565b90509695505050505050565b600060808201905061477a60008301876140a6565b818103602083015261478c8186613a87565b905061479b60408301856140f2565b81810360608301526147ad8184613a87565b905095945050505050565b600060c0820190506147cd60008301896140a6565b81810360208301526147df8188613af1565b905081810360408301526147f38187613a87565b905061480260608301866139f9565b61480f6080830185613a08565b81810360a08301526148218184613a87565b9050979650505050505050565b600060808201905061484360008301886140a6565b61485060208301876140a6565b61485d60408301866140cc565b8181036060830152614870818486613a35565b90509695505050505050565b600060208201905061489160008301846140cc565b92915050565b60006040820190506148ac60008301856140cc565b6148b96020830184613a26565b9392505050565b60006148ca6148db565b90506148d68282614c09565b919050565b6000604051905090565b600067ffffffffffffffff821115614900576148ff614d5d565b5b61490982614d8c565b9050602081019050919050565b600067ffffffffffffffff82111561493157614930614d5d565b5b61493a82614d8c565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006149b582614b53565b91506149c083614b53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149f5576149f4614cd0565b5b828201905092915050565b6000614a0b82614b53565b9150614a1683614b53565b925082614a2657614a25614cff565b5b828204905092915050565b6000614a3c82614b53565b9150614a4783614b53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a8057614a7f614cd0565b5b828202905092915050565b6000614a9682614b53565b9150614aa183614b53565b925082821015614ab457614ab3614cd0565b5b828203905092915050565b6000614aca82614b33565b9050919050565b6000614adc82614b33565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b6000614b7c82614b83565b9050919050565b6000614b8e82614b33565b9050919050565b82818337600083830152505050565b60005b83811015614bc2578082015181840152602081019050614ba7565b83811115614bd1576000848401525b50505050565b60006002820490506001821680614bef57607f821691505b60208210811415614c0357614c02614d2e565b5b50919050565b614c1282614d8c565b810181811067ffffffffffffffff82111715614c3157614c30614d5d565b5b80604052505050565b6000614c4582614b53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614c7857614c77614cd0565b5b600182019050919050565b6000614c8e82614d9d565b9050919050565b6000819050919050565b6000614caa82614b53565b9150614cb583614b53565b925082614cc557614cc4614cff565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160f01b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4d6573736167652073656e646572206d757374206f776e20746865204f6d6e6960008201527f636861696e4e46542e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4c617965725a65726f3a20696e76616c6964207061796c6f6164000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d6178206d696e74206c60008201527f696d6974206174207468697320636861696e0000000000000000000000000000602082015250565b7f4f6e6c79206f776e65722063616e207769746864726177000000000000000000600082015250565b7f4e6f7420656e6f7567682067617320746f20636f7665722063726f737320636860008201527f61696e207472616e736665722e00000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460008201527f206265204272696467652e000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f7560008201527f7263652073656e64696e6720636f6e7472616374000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f43616e206f6e6c79206d696e74206f6e65206f72206d6f72652061742061207460008201527f696d650000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b7f5468697320636861696e206973206e6f742061207472757374656420736f757260008201527f636520736f757263652e00000000000000000000000000000000000000000000602082015250565b7f546865207472757374656420736f75726365206164647265737320686173206160008201527f6c7265616479206265656e2073657420666f722074686520636861696e496421602082015250565b7f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60008201527f6573736167650000000000000000000000000000000000000000000000000000602082015250565b6155a281614abf565b81146155ad57600080fd5b50565b6155b981614ad1565b81146155c457600080fd5b50565b6155d081614ae3565b81146155db57600080fd5b50565b6155e781614af9565b81146155f257600080fd5b50565b6155fe81614b25565b811461560957600080fd5b50565b61561581614b53565b811461562057600080fd5b50565b61562c81614b5d565b811461563757600080fd5b5056fea2646970667358221220688fd765855062927437ebd92708bbe721bf862f93701605e3500bff3a53dd9364736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000000000000000000000000000000000000000196400000000000000000000000000000000000000000000000000000000000027100000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d534145784d473171576e764b4e774a47445472506a446a4558656a7058694e324b38434c70657964313766552f00000000000000000000

-----Decoded View---------------
Arg [0] : _baseTokenURI (string): ipfs://QmSAExMG1qWnvKNwJGDTrPjDjEXejpXiN2K8CLpeyd17fU/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [2] : _startToken (uint256): 6500
Arg [3] : _maxMint (uint256): 10000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001964
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [5] : 697066733a2f2f516d534145784d473171576e764b4e774a47445472506a446a
Arg [6] : 4558656a7058694e324b38434c70657964313766552f00000000000000000000


Deployed Bytecode Sourcemap

49990:6204:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45852:935;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21695:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22640:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55686:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24199:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23722:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55815:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51885:1584;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46795:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24949:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54314:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25359:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55950:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53552:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45302:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22334:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22064:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56134:57;;;;;;;;;;;;;:::i;:::-;;50150:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45539:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35877:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45442:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;22809:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51061:575;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24492:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25615:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53818:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55430:248;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47434:758;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50117:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48200:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24718:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54186:65;;;:::i;:::-;;36786:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45852:935;46014:8;;;;;;;;;;;45992:31;;:10;:31;;;45984:40;;;;;;46135:19;:32;46155:11;46135:32;;;;;;;;;;;;;;;:39;;;;;:::i;:::-;;;46113:11;:18;:61;:134;;;;;46214:19;:32;46234:11;46214:32;;;;;;;;;;;;;;;46204:43;;;;;;:::i;:::-;;;;;;;;46188:11;46178:22;;;;;;:69;46113:134;46105:199;;;;;;;;;;;;:::i;:::-;;;;;;;;;46432:4;:16;;;46449:11;46462;46475:6;46483:8;46432:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46428:352;;46639:52;;;;;;;;46654:8;:15;46639:52;;;;46681:8;46671:19;;;;;;46639:52;;;46588:14;:27;46603:11;46588:27;;;;;;;;;;;;;;;46616:11;46588:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;46629:6;46588:48;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;;;;;46711:57;46725:11;46738;46751:6;46759:8;46711:57;;;;;;;;;:::i;:::-;;;;;;;;46428:352;;;;45852:935;;;;:::o;21695:305::-;21797:4;21849:25;21834:40;;;:11;:40;;;;:105;;;;21906:33;21891:48;;;:11;:48;;;;21834:105;:158;;;;21956:36;21980:11;21956:23;:36::i;:::-;21834:158;21814:178;;21695:305;;;:::o;22640:100::-;22694:13;22727:5;22720:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22640:100;:::o;55686:121::-;36108:12;:10;:12::i;:::-;36097:23;;:7;:5;:7::i;:::-;:23;;;36089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55766:8:::1;;;;;;;;;;;:23;;;55790:8;55766:33;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55686:121:::0;:::o;24199:221::-;24275:7;24303:16;24311:7;24303;:16::i;:::-;24295:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24388:15;:24;24404:7;24388:24;;;;;;;;;;;;;;;;;;;;;24381:31;;24199:221;;;:::o;23722:411::-;23803:13;23819:23;23834:7;23819:14;:23::i;:::-;23803:39;;23867:5;23861:11;;:2;:11;;;;23853:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23961:5;23945:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23970:37;23987:5;23994:12;:10;:12::i;:::-;23970:16;:37::i;:::-;23945:62;23923:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24104:21;24113:2;24117:7;24104:8;:21::i;:::-;23722:411;;;:::o;55815:127::-;36108:12;:10;:12::i;:::-;36097:23;;:7;:5;:7::i;:::-;:23;;;36089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55898:8:::1;;;;;;;;;;;:26;;;55925:8;55898:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55815:127:::0;:::o;51885:1584::-;52035:29;52043:20;52035:7;:29::i;:::-;52021:43;;:10;:43;;;52013:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;52169:1;52129:19;:29;52149:8;52129:29;;;;;;;;;;;;;;;:36;;;;;:::i;:::-;;;:41;;52121:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;52269:27;52275:20;52269:5;:27::i;:::-;52372:20;52406:10;52418:20;52395:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52372:67;;52598:14;52615:1;52598:18;;52627:8;52638:6;52627:17;;52655:26;52701:7;52710:3;52684:30;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52655:59;;52792:23;52821:8;;;;;;;;;;;:21;;;52843:8;52861:4;52868:7;52877:5;52884:13;52821:77;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52791:107;;;52932:18;52919:9;:31;;52911:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;53013:8;;;;;;;;;;;:13;;;53033:9;53058:8;53125:19;:29;53145:8;53125:29;;;;;;;;;;;;;;;53208:7;53285:10;53347:3;53403:13;53013:448;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51885:1584;;;;;;;:::o;46795:318::-;46986:4;46964:27;;:10;:27;;;46956:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;47050:55;47062:11;47075;47088:6;47096:8;47050:10;:55::i;:::-;46795:318;;;;:::o;24949:339::-;25144:41;25163:12;:10;:12::i;:::-;25177:7;25144:18;:41::i;:::-;25136:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25252:28;25262:4;25268:2;25272:7;25252:9;:28::i;:::-;24949:339;;;:::o;54314:231::-;54388:6;;;;;;;;;;;54374:20;;:10;:20;;;54366:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;54434:9;54457:6;;;;;;;;;;;54449:20;;54477:3;54449:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54433:52;;;54504:4;54496:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;54314:231;;:::o;25359:185::-;25497:39;25514:4;25520:2;25524:7;25497:39;;;;;;;;;;;;:16;:39::i;:::-;25359:185;;;:::o;55950:176::-;36108:12;:10;:12::i;:::-;36097:23;;:7;:5;:7::i;:::-;:23;;;36089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56065:8:::1;;;;;;;;;;;:27;;;56093:11;56106;;56065:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55950:176:::0;;;:::o;53552:113::-;36108:12;:10;:12::i;:::-;36097:23;;:7;:5;:7::i;:::-;:23;;;36089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53644:13:::1;53629:12;:28;;;;;;;;;;;;:::i;:::-;;53552:113:::0;:::o;45302:34::-;;;;;;;;;;;;;:::o;22334:239::-;22406:7;22426:13;22442:7;:16;22450:7;22442:16;;;;;;;;;;;;;;;;;;;;;22426:32;;22494:1;22477:19;;:5;:19;;;;22469:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22560:5;22553:12;;;22334:239;;;:::o;22064:208::-;22136:7;22181:1;22164:19;;:5;:19;;;;22156:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22248:9;:16;22258:5;22248:16;;;;;;;;;;;;;;;;22241:23;;22064:208;;;:::o;56134:57::-;36108:12;:10;:12::i;:::-;36097:23;;:7;:5;:7::i;:::-;:23;;;36089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56134:57::o;50150:26::-;;;;:::o;45539:51::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35877:87::-;35923:7;35950:6;;;;;;;;;;;35943:13;;35877:87;:::o;45442:90::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22809:104::-;22865:13;22898:7;22891:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22809:104;:::o;51061:575::-;51151:1;51134:14;:18;:61;;;;;51174:21;;51156:14;:39;;51134:61;51126:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;51286:7;;51268:14;51254:11;;:28;;;;:::i;:::-;:39;;51246:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;51392:14;51379:10;;:27;;;;:::i;:::-;51366:9;:40;;51358:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51446:9;51442:187;51465:14;51461:1;:18;51442:187;;;51500:10;51515:11;;51513:13;;;;;:::i;:::-;;;;;;;51500:26;;51550:7;;51544:2;:13;51541:77;;51577:25;51587:10;51599:2;51577:9;:25::i;:::-;51541:77;51442:187;51481:3;;;;;:::i;:::-;;;;51442:187;;;;51061:575;:::o;24492:155::-;24587:52;24606:12;:10;:12::i;:::-;24620:8;24630;24587:18;:52::i;:::-;24492:155;;:::o;25615:328::-;25790:41;25809:12;:10;:12::i;:::-;25823:7;25790:18;:41::i;:::-;25782:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25896:39;25910:4;25916:2;25920:7;25929:5;25896:13;:39::i;:::-;25615:328;;;;:::o;53818:360::-;53890:13;53923:16;53931:7;53923;:16::i;:::-;53915:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;54003:28;54034:10;:8;:10::i;:::-;54003:41;;54093:1;54068:14;54062:28;:32;:108;;;;;;;;;;;;;;;;;54121:14;54137:18;:7;:16;:18::i;:::-;54104:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54062:108;54055:115;;;53818:360;;;:::o;55430:248::-;36108:12;:10;:12::i;:::-;36097:23;;:7;:5;:7::i;:::-;:23;;;36089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55610:8:::1;;;;;;;;;;;:18;;;55629:8;55639;55649:11;55662:7;;55610:60;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;55430:248:::0;;;;;:::o;47434:758::-;47615:32;47650:14;:27;47665:11;47650:27;;;;;;;;;;;;;;;47678:11;47650:40;;;;;;:::i;:::-;;;;;;;;;;;;;:48;47691:6;47650:48;;;;;;;;;;;;;47615:83;;47750:1;47742:10;;47717:9;:21;;;:35;;47709:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;47833:9;:23;;;47814:8;;:15;;:42;:90;;;;;47883:9;:21;;;47870:8;;47860:19;;;;;;;:::i;:::-;;;;;;;;:44;47814:90;47806:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;48009:1;47983:9;:23;;:27;;;;48053:1;48045:10;;48021:9;:21;;:34;;;;48124:4;:16;;;48141:11;48154;48167:6;48175:8;;48124:60;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47434:758;;;;;;:::o;50117:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48200:287::-;36108:12;:10;:12::i;:::-;36097:23;;:7;:5;:7::i;:::-;:23;;;36089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48352:1:::1;48312:19;:29;48332:8;48312:29;;;;;;;;;;;;;;;:36;;;;;:::i;:::-;;;:41;48304:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48465:14;;48433:19;:29;48453:8;48433:29;;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;48200:287:::0;;;:::o;24718:164::-;24815:4;24839:18;:25;24858:5;24839:25;;;;;;;;;;;;;;;:35;24865:8;24839:35;;;;;;;;;;;;;;;;;;;;;;;;;24832:42;;24718:164;;;;:::o;54186:65::-;:::o;36786:201::-;36108:12;:10;:12::i;:::-;36097:23;;:7;:5;:7::i;:::-;:23;;;36089:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36895:1:::1;36875:22;;:8;:22;;;;36867:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36951:28;36970:8;36951:18;:28::i;:::-;36786:201:::0;:::o;20118:157::-;20203:4;20242:25;20227:40;;;:11;:40;;;;20220:47;;20118:157;;;:::o;16901:98::-;16954:7;16981:10;16974:17;;16901:98;:::o;27453:127::-;27518:4;27570:1;27542:30;;:7;:16;27550:7;27542:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27535:37;;27453:127;;;:::o;31599:174::-;31701:2;31674:15;:24;31690:7;31674:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31757:7;31753:2;31719:46;;31728:23;31743:7;31728:14;:23::i;:::-;31719:46;;;;;;;;;;;;31599:174;;:::o;30099:420::-;30159:13;30175:23;30190:7;30175:14;:23::i;:::-;30159:39;;30211:48;30232:5;30247:1;30251:7;30211:20;:48::i;:::-;30300:29;30317:1;30321:7;30300:8;:29::i;:::-;30362:1;30342:9;:16;30352:5;30342:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;30381:7;:16;30389:7;30381:16;;;;;;;;;;;;30374:23;;;;;;;;;;;30443:7;30439:1;30415:36;;30424:5;30415:36;;;;;;;;;;;;30464:47;30484:5;30499:1;30503:7;30464:19;:47::i;:::-;30099:420;;:::o;54980:315::-;55115:31;55148:28;55191:8;55180:40;;;;;;;;;;;;:::i;:::-;55114:106;;;;55231:56;55241:23;55266:20;55231:9;:56::i;:::-;54980:315;;;;;;:::o;27747:348::-;27840:4;27865:16;27873:7;27865;:16::i;:::-;27857:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27941:13;27957:23;27972:7;27957:14;:23::i;:::-;27941:39;;28010:5;27999:16;;:7;:16;;;:51;;;;28043:7;28019:31;;:20;28031:7;28019:11;:20::i;:::-;:31;;;27999:51;:87;;;;28054:32;28071:5;28078:7;28054:16;:32::i;:::-;27999:87;27991:96;;;27747:348;;;;:::o;30856:625::-;31015:4;30988:31;;:23;31003:7;30988:14;:23::i;:::-;:31;;;30980:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31094:1;31080:16;;:2;:16;;;;31072:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31150:39;31171:4;31177:2;31181:7;31150:20;:39::i;:::-;31254:29;31271:1;31275:7;31254:8;:29::i;:::-;31315:1;31296:9;:15;31306:4;31296:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31344:1;31327:9;:13;31337:2;31327:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31375:2;31356:7;:16;31364:7;31356:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31414:7;31410:2;31395:27;;31404:4;31395:27;;;;;;;;;;;;31435:38;31455:4;31461:2;31465:7;31435:19;:38::i;:::-;30856:625;;;:::o;28437:110::-;28513:26;28523:2;28527:7;28513:26;;;;;;;;;;;;:9;:26::i;:::-;28437:110;;:::o;31915:315::-;32070:8;32061:17;;:5;:17;;;;32053:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32157:8;32119:18;:25;32138:5;32119:25;;;;;;;;;;;;;;;:35;32145:8;32119:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32203:8;32181:41;;32196:5;32181:41;;;32213:8;32181:41;;;;;;:::i;:::-;;;;;;;;31915:315;;;:::o;26825:::-;26982:28;26992:4;26998:2;27002:7;26982:9;:28::i;:::-;27029:48;27052:4;27058:2;27062:7;27071:5;27029:22;:48::i;:::-;27021:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26825:315;;;;:::o;53707:105::-;53759:13;53792:12;53785:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53707:105;:::o;17488:723::-;17544:13;17774:1;17765:5;:10;17761:53;;;17792:10;;;;;;;;;;;;;;;;;;;;;17761:53;17824:12;17839:5;17824:20;;17855:14;17880:78;17895:1;17887:4;:9;17880:78;;17913:8;;;;;:::i;:::-;;;;17944:2;17936:10;;;;;:::i;:::-;;;17880:78;;;17968:19;18000:6;17990:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17968:39;;18018:154;18034:1;18025:5;:10;18018:154;;18062:1;18052:11;;;;;:::i;:::-;;;18129:2;18121:5;:10;;;;:::i;:::-;18108:2;:24;;;;:::i;:::-;18095:39;;18078:6;18085;18078:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;18158:2;18149:11;;;;;:::i;:::-;;;18018:154;;;18196:6;18182:21;;;;;17488:723;;;;:::o;37147:191::-;37221:16;37240:6;;;;;;;;;;;37221:25;;37266:8;37257:6;;:17;;;;;;;;;;;;;;;;;;37321:8;37290:40;;37311:8;37290:40;;;;;;;;;;;;37147:191;;:::o;34166:126::-;;;;:::o;34677:125::-;;;;:::o;28774:321::-;28904:18;28910:2;28914:7;28904:5;:18::i;:::-;28955:54;28986:1;28990:2;28994:7;29003:5;28955:22;:54::i;:::-;28933:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28774:321;;;:::o;32795:799::-;32950:4;32971:15;:2;:13;;;:15::i;:::-;32967:620;;;33023:2;33007:36;;;33044:12;:10;:12::i;:::-;33058:4;33064:7;33073:5;33007:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33003:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33266:1;33249:6;:13;:18;33245:272;;;33292:60;;;;;;;;;;:::i;:::-;;;;;;;;33245:272;33467:6;33461:13;33452:6;33448:2;33444:15;33437:38;33003:529;33140:41;;;33130:51;;;:6;:51;;;;33123:58;;;;;32967:620;33571:4;33564:11;;32795:799;;;;;;;:::o;29431:439::-;29525:1;29511:16;;:2;:16;;;;29503:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29584:16;29592:7;29584;:16::i;:::-;29583:17;29575:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29646:45;29675:1;29679:2;29683:7;29646:20;:45::i;:::-;29721:1;29704:9;:13;29714:2;29704:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29752:2;29733:7;:16;29741:7;29733:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29797:7;29793:2;29772:33;;29789:1;29772:33;;;;;;;;;;;;29818:44;29846:1;29850:2;29854:7;29818:19;:44::i;:::-;29431:439;;:::o;8944:326::-;9004:4;9261:1;9239:7;:19;;;:23;9232:30;;8944:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:159::-;917:5;948:6;942:13;933:22;;964:41;999:5;964:41;:::i;:::-;923:88;;;;:::o;1017:133::-;1060:5;1098:6;1085:20;1076:29;;1114:30;1138:5;1114:30;:::i;:::-;1066:84;;;;:::o;1156:137::-;1201:5;1239:6;1226:20;1217:29;;1255:32;1281:5;1255:32;:::i;:::-;1207:86;;;;:::o;1299:141::-;1355:5;1386:6;1380:13;1371:22;;1402:32;1428:5;1402:32;:::i;:::-;1361:79;;;;:::o;1459:351::-;1516:8;1526:6;1576:3;1569:4;1561:6;1557:17;1553:27;1543:2;;1594:1;1591;1584:12;1543:2;1630:6;1617:20;1607:30;;1660:18;1652:6;1649:30;1646:2;;;1692:1;1689;1682:12;1646:2;1729:4;1721:6;1717:17;1705:29;;1783:3;1775:4;1767:6;1763:17;1753:8;1749:32;1746:41;1743:2;;;1800:1;1797;1790:12;1743:2;1533:277;;;;;:::o;1829:271::-;1884:5;1933:3;1926:4;1918:6;1914:17;1910:27;1900:2;;1951:1;1948;1941:12;1900:2;1991:6;1978:20;2016:78;2090:3;2082:6;2075:4;2067:6;2063:17;2016:78;:::i;:::-;2007:87;;1890:210;;;;;:::o;2120:273::-;2176:5;2225:3;2218:4;2210:6;2206:17;2202:27;2192:2;;2243:1;2240;2233:12;2192:2;2283:6;2270:20;2308:79;2383:3;2375:6;2368:4;2360:6;2356:17;2308:79;:::i;:::-;2299:88;;2182:211;;;;;:::o;2399:137::-;2444:5;2482:6;2469:20;2460:29;;2498:32;2524:5;2498:32;:::i;:::-;2450:86;;;;:::o;2542:139::-;2588:5;2626:6;2613:20;2604:29;;2642:33;2669:5;2642:33;:::i;:::-;2594:87;;;;:::o;2687:143::-;2744:5;2775:6;2769:13;2760:22;;2791:33;2818:5;2791:33;:::i;:::-;2750:80;;;;:::o;2836:137::-;2881:5;2919:6;2906:20;2897:29;;2935:32;2961:5;2935:32;:::i;:::-;2887:86;;;;:::o;2979:262::-;3038:6;3087:2;3075:9;3066:7;3062:23;3058:32;3055:2;;;3103:1;3100;3093:12;3055:2;3146:1;3171:53;3216:7;3207:6;3196:9;3192:22;3171:53;:::i;:::-;3161:63;;3117:117;3045:196;;;;:::o;3247:456::-;3334:6;3342;3391:2;3379:9;3370:7;3366:23;3362:32;3359:2;;;3407:1;3404;3397:12;3359:2;3450:1;3475:72;3539:7;3530:6;3519:9;3515:22;3475:72;:::i;:::-;3465:82;;3421:136;3596:2;3622:64;3678:7;3669:6;3658:9;3654:22;3622:64;:::i;:::-;3612:74;;3567:129;3349:354;;;;;:::o;3709:407::-;3777:6;3785;3834:2;3822:9;3813:7;3809:23;3805:32;3802:2;;;3850:1;3847;3840:12;3802:2;3893:1;3918:53;3963:7;3954:6;3943:9;3939:22;3918:53;:::i;:::-;3908:63;;3864:117;4020:2;4046:53;4091:7;4082:6;4071:9;4067:22;4046:53;:::i;:::-;4036:63;;3991:118;3792:324;;;;;:::o;4122:552::-;4199:6;4207;4215;4264:2;4252:9;4243:7;4239:23;4235:32;4232:2;;;4280:1;4277;4270:12;4232:2;4323:1;4348:53;4393:7;4384:6;4373:9;4369:22;4348:53;:::i;:::-;4338:63;;4294:117;4450:2;4476:53;4521:7;4512:6;4501:9;4497:22;4476:53;:::i;:::-;4466:63;;4421:118;4578:2;4604:53;4649:7;4640:6;4629:9;4625:22;4604:53;:::i;:::-;4594:63;;4549:118;4222:452;;;;;:::o;4680:809::-;4775:6;4783;4791;4799;4848:3;4836:9;4827:7;4823:23;4819:33;4816:2;;;4865:1;4862;4855:12;4816:2;4908:1;4933:53;4978:7;4969:6;4958:9;4954:22;4933:53;:::i;:::-;4923:63;;4879:117;5035:2;5061:53;5106:7;5097:6;5086:9;5082:22;5061:53;:::i;:::-;5051:63;;5006:118;5163:2;5189:53;5234:7;5225:6;5214:9;5210:22;5189:53;:::i;:::-;5179:63;;5134:118;5319:2;5308:9;5304:18;5291:32;5350:18;5342:6;5339:30;5336:2;;;5382:1;5379;5372:12;5336:2;5410:62;5464:7;5455:6;5444:9;5440:22;5410:62;:::i;:::-;5400:72;;5262:220;4806:683;;;;;;;:::o;5495:401::-;5560:6;5568;5617:2;5605:9;5596:7;5592:23;5588:32;5585:2;;;5633:1;5630;5623:12;5585:2;5676:1;5701:53;5746:7;5737:6;5726:9;5722:22;5701:53;:::i;:::-;5691:63;;5647:117;5803:2;5829:50;5871:7;5862:6;5851:9;5847:22;5829:50;:::i;:::-;5819:60;;5774:115;5575:321;;;;;:::o;5902:407::-;5970:6;5978;6027:2;6015:9;6006:7;6002:23;5998:32;5995:2;;;6043:1;6040;6033:12;5995:2;6086:1;6111:53;6156:7;6147:6;6136:9;6132:22;6111:53;:::i;:::-;6101:63;;6057:117;6213:2;6239:53;6284:7;6275:6;6264:9;6260:22;6239:53;:::i;:::-;6229:63;;6184:118;5985:324;;;;;:::o;6315:260::-;6373:6;6422:2;6410:9;6401:7;6397:23;6393:32;6390:2;;;6438:1;6435;6428:12;6390:2;6481:1;6506:52;6550:7;6541:6;6530:9;6526:22;6506:52;:::i;:::-;6496:62;;6452:116;6380:195;;;;:::o;6581:282::-;6650:6;6699:2;6687:9;6678:7;6674:23;6670:32;6667:2;;;6715:1;6712;6705:12;6667:2;6758:1;6783:63;6838:7;6829:6;6818:9;6814:22;6783:63;:::i;:::-;6773:73;;6729:127;6657:206;;;;:::o;6869:375::-;6938:6;6987:2;6975:9;6966:7;6962:23;6958:32;6955:2;;;7003:1;7000;6993:12;6955:2;7074:1;7063:9;7059:17;7046:31;7104:18;7096:6;7093:30;7090:2;;;7136:1;7133;7126:12;7090:2;7164:63;7219:7;7210:6;7199:9;7195:22;7164:63;:::i;:::-;7154:73;;7017:220;6945:299;;;;:::o;7250:260::-;7308:6;7357:2;7345:9;7336:7;7332:23;7328:32;7325:2;;;7373:1;7370;7363:12;7325:2;7416:1;7441:52;7485:7;7476:6;7465:9;7461:22;7441:52;:::i;:::-;7431:62;;7387:116;7315:195;;;;:::o;7516:536::-;7594:6;7602;7610;7659:2;7647:9;7638:7;7634:23;7630:32;7627:2;;;7675:1;7672;7665:12;7627:2;7718:1;7743:52;7787:7;7778:6;7767:9;7763:22;7743:52;:::i;:::-;7733:62;;7689:116;7872:2;7861:9;7857:18;7844:32;7903:18;7895:6;7892:30;7889:2;;;7935:1;7932;7925:12;7889:2;7971:64;8027:7;8018:6;8007:9;8003:22;7971:64;:::i;:::-;7953:82;;;;7815:230;7617:435;;;;;:::o;8058:661::-;8143:6;8151;8159;8208:2;8196:9;8187:7;8183:23;8179:32;8176:2;;;8224:1;8221;8214:12;8176:2;8267:1;8292:52;8336:7;8327:6;8316:9;8312:22;8292:52;:::i;:::-;8282:62;;8238:116;8421:2;8410:9;8406:18;8393:32;8452:18;8444:6;8441:30;8438:2;;;8484:1;8481;8474:12;8438:2;8512:62;8566:7;8557:6;8546:9;8542:22;8512:62;:::i;:::-;8502:72;;8364:220;8623:2;8649:53;8694:7;8685:6;8674:9;8670:22;8649:53;:::i;:::-;8639:63;;8594:118;8166:553;;;;;:::o;8725:936::-;8829:6;8837;8845;8853;8861;8910:3;8898:9;8889:7;8885:23;8881:33;8878:2;;;8927:1;8924;8917:12;8878:2;8970:1;8995:52;9039:7;9030:6;9019:9;9015:22;8995:52;:::i;:::-;8985:62;;8941:116;9124:2;9113:9;9109:18;9096:32;9155:18;9147:6;9144:30;9141:2;;;9187:1;9184;9177:12;9141:2;9215:62;9269:7;9260:6;9249:9;9245:22;9215:62;:::i;:::-;9205:72;;9067:220;9326:2;9352:52;9396:7;9387:6;9376:9;9372:22;9352:52;:::i;:::-;9342:62;;9297:117;9481:2;9470:9;9466:18;9453:32;9512:18;9504:6;9501:30;9498:2;;;9544:1;9541;9534:12;9498:2;9580:64;9636:7;9627:6;9616:9;9612:22;9580:64;:::i;:::-;9562:82;;;;9424:230;8868:793;;;;;;;;:::o;9667:916::-;9769:6;9777;9785;9793;9842:3;9830:9;9821:7;9817:23;9813:33;9810:2;;;9859:1;9856;9849:12;9810:2;9902:1;9927:52;9971:7;9962:6;9951:9;9947:22;9927:52;:::i;:::-;9917:62;;9873:116;10056:2;10045:9;10041:18;10028:32;10087:18;10079:6;10076:30;10073:2;;;10119:1;10116;10109:12;10073:2;10147:62;10201:7;10192:6;10181:9;10177:22;10147:62;:::i;:::-;10137:72;;9999:220;10258:2;10284:52;10328:7;10319:6;10308:9;10304:22;10284:52;:::i;:::-;10274:62;;10229:117;10413:2;10402:9;10398:18;10385:32;10444:18;10436:6;10433:30;10430:2;;;10476:1;10473;10466:12;10430:2;10504:62;10558:7;10549:6;10538:9;10534:22;10504:62;:::i;:::-;10494:72;;10356:220;9800:783;;;;;;;:::o;10589:825::-;10684:6;10692;10700;10708;10716;10765:3;10753:9;10744:7;10740:23;10736:33;10733:2;;;10782:1;10779;10772:12;10733:2;10825:1;10850:52;10894:7;10885:6;10874:9;10870:22;10850:52;:::i;:::-;10840:62;;10796:116;10951:2;10977:52;11021:7;11012:6;11001:9;10997:22;10977:52;:::i;:::-;10967:62;;10922:117;11078:2;11104:53;11149:7;11140:6;11129:9;11125:22;11104:53;:::i;:::-;11094:63;;11049:118;11234:2;11223:9;11219:18;11206:32;11265:18;11257:6;11254:30;11251:2;;;11297:1;11294;11287:12;11251:2;11333:64;11389:7;11380:6;11369:9;11365:22;11333:64;:::i;:::-;11315:82;;;;11177:230;10723:691;;;;;;;;:::o;11420:405::-;11487:6;11495;11544:2;11532:9;11523:7;11519:23;11515:32;11512:2;;;11560:1;11557;11550:12;11512:2;11603:1;11628:52;11672:7;11663:6;11652:9;11648:22;11628:52;:::i;:::-;11618:62;;11574:116;11729:2;11755:53;11800:7;11791:6;11780:9;11776:22;11755:53;:::i;:::-;11745:63;;11700:118;11502:323;;;;;:::o;11831:262::-;11890:6;11939:2;11927:9;11918:7;11914:23;11910:32;11907:2;;;11955:1;11952;11945:12;11907:2;11998:1;12023:53;12068:7;12059:6;12048:9;12044:22;12023:53;:::i;:::-;12013:63;;11969:117;11897:196;;;;:::o;12099:440::-;12178:6;12186;12235:2;12223:9;12214:7;12210:23;12206:32;12203:2;;;12251:1;12248;12241:12;12203:2;12294:1;12319:64;12375:7;12366:6;12355:9;12351:22;12319:64;:::i;:::-;12309:74;;12265:128;12432:2;12458:64;12514:7;12505:6;12494:9;12490:22;12458:64;:::i;:::-;12448:74;;12403:129;12193:346;;;;;:::o;12545:142::-;12648:32;12674:5;12648:32;:::i;:::-;12643:3;12636:45;12626:61;;:::o;12693:118::-;12780:24;12798:5;12780:24;:::i;:::-;12775:3;12768:37;12758:53;;:::o;12817:109::-;12898:21;12913:5;12898:21;:::i;:::-;12893:3;12886:34;12876:50;;:::o;12932:118::-;13019:24;13037:5;13019:24;:::i;:::-;13014:3;13007:37;12997:53;;:::o;13078:301::-;13174:3;13195:70;13258:6;13253:3;13195:70;:::i;:::-;13188:77;;13275:43;13311:6;13306:3;13299:5;13275:43;:::i;:::-;13343:29;13365:6;13343:29;:::i;:::-;13338:3;13334:39;13327:46;;13178:201;;;;;:::o;13407:314::-;13521:3;13542:88;13623:6;13618:3;13542:88;:::i;:::-;13535:95;;13640:43;13676:6;13671:3;13664:5;13640:43;:::i;:::-;13708:6;13703:3;13699:16;13692:23;;13525:196;;;;;:::o;13727:360::-;13813:3;13841:38;13873:5;13841:38;:::i;:::-;13895:70;13958:6;13953:3;13895:70;:::i;:::-;13888:77;;13974:52;14019:6;14014:3;14007:4;14000:5;13996:16;13974:52;:::i;:::-;14051:29;14073:6;14051:29;:::i;:::-;14046:3;14042:39;14035:46;;13817:270;;;;;:::o;14093:373::-;14197:3;14225:38;14257:5;14225:38;:::i;:::-;14279:88;14360:6;14355:3;14279:88;:::i;:::-;14272:95;;14376:52;14421:6;14416:3;14409:4;14402:5;14398:16;14376:52;:::i;:::-;14453:6;14448:3;14444:16;14437:23;;14201:265;;;;;:::o;14494:798::-;14577:3;14614:5;14608:12;14643:36;14669:9;14643:36;:::i;:::-;14695:70;14758:6;14753:3;14695:70;:::i;:::-;14688:77;;14796:1;14785:9;14781:17;14812:1;14807:135;;;;14956:1;14951:335;;;;14774:512;;14807:135;14891:4;14887:9;14876;14872:25;14867:3;14860:38;14927:4;14922:3;14918:14;14911:21;;14807:135;;14951:335;15018:37;15049:5;15018:37;:::i;:::-;15077:1;15091:154;15105:6;15102:1;15099:13;15091:154;;;15179:7;15173:14;15169:1;15164:3;15160:11;15153:35;15229:1;15220:7;15216:15;15205:26;;15127:4;15124:1;15120:12;15115:17;;15091:154;;;15274:1;15269:3;15265:11;15258:18;;14958:328;;14774:512;;14581:711;;;;;;:::o;15320:841::-;15421:3;15458:5;15452:12;15487:36;15513:9;15487:36;:::i;:::-;15539:88;15620:6;15615:3;15539:88;:::i;:::-;15532:95;;15658:1;15647:9;15643:17;15674:1;15669:137;;;;15820:1;15815:340;;;;15636:519;;15669:137;15753:4;15749:9;15738;15734:25;15729:3;15722:38;15789:6;15784:3;15780:16;15773:23;;15669:137;;15815:340;15882:37;15913:5;15882:37;:::i;:::-;15941:1;15955:154;15969:6;15966:1;15963:13;15955:154;;;16043:7;16037:14;16033:1;16028:3;16024:11;16017:35;16093:1;16084:7;16080:15;16069:26;;15991:4;15988:1;15984:12;15979:17;;15955:154;;;16138:6;16133:3;16129:16;16122:23;;15822:333;;15636:519;;15425:736;;;;;;:::o;16167:185::-;16281:64;16339:5;16281:64;:::i;:::-;16276:3;16269:77;16259:93;;:::o;16358:364::-;16446:3;16474:39;16507:5;16474:39;:::i;:::-;16529:71;16593:6;16588:3;16529:71;:::i;:::-;16522:78;;16609:52;16654:6;16649:3;16642:4;16635:5;16631:16;16609:52;:::i;:::-;16686:29;16708:6;16686:29;:::i;:::-;16681:3;16677:39;16670:46;;16450:272;;;;;:::o;16728:377::-;16834:3;16862:39;16895:5;16862:39;:::i;:::-;16917:89;16999:6;16994:3;16917:89;:::i;:::-;16910:96;;17015:52;17060:6;17055:3;17048:4;17041:5;17037:16;17015:52;:::i;:::-;17092:6;17087:3;17083:16;17076:23;;16838:267;;;;;:::o;17111:366::-;17253:3;17274:67;17338:2;17333:3;17274:67;:::i;:::-;17267:74;;17350:93;17439:3;17350:93;:::i;:::-;17468:2;17463:3;17459:12;17452:19;;17257:220;;;:::o;17483:366::-;17625:3;17646:67;17710:2;17705:3;17646:67;:::i;:::-;17639:74;;17722:93;17811:3;17722:93;:::i;:::-;17840:2;17835:3;17831:12;17824:19;;17629:220;;;:::o;17855:366::-;17997:3;18018:67;18082:2;18077:3;18018:67;:::i;:::-;18011:74;;18094:93;18183:3;18094:93;:::i;:::-;18212:2;18207:3;18203:12;18196:19;;18001:220;;;:::o;18227:366::-;18369:3;18390:67;18454:2;18449:3;18390:67;:::i;:::-;18383:74;;18466:93;18555:3;18466:93;:::i;:::-;18584:2;18579:3;18575:12;18568:19;;18373:220;;;:::o;18599:366::-;18741:3;18762:67;18826:2;18821:3;18762:67;:::i;:::-;18755:74;;18838:93;18927:3;18838:93;:::i;:::-;18956:2;18951:3;18947:12;18940:19;;18745:220;;;:::o;18971:366::-;19113:3;19134:67;19198:2;19193:3;19134:67;:::i;:::-;19127:74;;19210:93;19299:3;19210:93;:::i;:::-;19328:2;19323:3;19319:12;19312:19;;19117:220;;;:::o;19343:366::-;19485:3;19506:67;19570:2;19565:3;19506:67;:::i;:::-;19499:74;;19582:93;19671:3;19582:93;:::i;:::-;19700:2;19695:3;19691:12;19684:19;;19489:220;;;:::o;19715:366::-;19857:3;19878:67;19942:2;19937:3;19878:67;:::i;:::-;19871:74;;19954:93;20043:3;19954:93;:::i;:::-;20072:2;20067:3;20063:12;20056:19;;19861:220;;;:::o;20087:366::-;20229:3;20250:67;20314:2;20309:3;20250:67;:::i;:::-;20243:74;;20326:93;20415:3;20326:93;:::i;:::-;20444:2;20439:3;20435:12;20428:19;;20233:220;;;:::o;20459:366::-;20601:3;20622:67;20686:2;20681:3;20622:67;:::i;:::-;20615:74;;20698:93;20787:3;20698:93;:::i;:::-;20816:2;20811:3;20807:12;20800:19;;20605:220;;;:::o;20831:366::-;20973:3;20994:67;21058:2;21053:3;20994:67;:::i;:::-;20987:74;;21070:93;21159:3;21070:93;:::i;:::-;21188:2;21183:3;21179:12;21172:19;;20977:220;;;:::o;21203:366::-;21345:3;21366:67;21430:2;21425:3;21366:67;:::i;:::-;21359:74;;21442:93;21531:3;21442:93;:::i;:::-;21560:2;21555:3;21551:12;21544:19;;21349:220;;;:::o;21575:366::-;21717:3;21738:67;21802:2;21797:3;21738:67;:::i;:::-;21731:74;;21814:93;21903:3;21814:93;:::i;:::-;21932:2;21927:3;21923:12;21916:19;;21721:220;;;:::o;21947:366::-;22089:3;22110:67;22174:2;22169:3;22110:67;:::i;:::-;22103:74;;22186:93;22275:3;22186:93;:::i;:::-;22304:2;22299:3;22295:12;22288:19;;22093:220;;;:::o;22319:366::-;22461:3;22482:67;22546:2;22541:3;22482:67;:::i;:::-;22475:74;;22558:93;22647:3;22558:93;:::i;:::-;22676:2;22671:3;22667:12;22660:19;;22465:220;;;:::o;22691:366::-;22833:3;22854:67;22918:2;22913:3;22854:67;:::i;:::-;22847:74;;22930:93;23019:3;22930:93;:::i;:::-;23048:2;23043:3;23039:12;23032:19;;22837:220;;;:::o;23063:366::-;23205:3;23226:67;23290:2;23285:3;23226:67;:::i;:::-;23219:74;;23302:93;23391:3;23302:93;:::i;:::-;23420:2;23415:3;23411:12;23404:19;;23209:220;;;:::o;23435:366::-;23577:3;23598:67;23662:2;23657:3;23598:67;:::i;:::-;23591:74;;23674:93;23763:3;23674:93;:::i;:::-;23792:2;23787:3;23783:12;23776:19;;23581:220;;;:::o;23807:400::-;23967:3;23988:84;24070:1;24065:3;23988:84;:::i;:::-;23981:91;;24081:93;24170:3;24081:93;:::i;:::-;24199:1;24194:3;24190:11;24183:18;;23971:236;;;:::o;24213:366::-;24355:3;24376:67;24440:2;24435:3;24376:67;:::i;:::-;24369:74;;24452:93;24541:3;24452:93;:::i;:::-;24570:2;24565:3;24561:12;24554:19;;24359:220;;;:::o;24585:366::-;24727:3;24748:67;24812:2;24807:3;24748:67;:::i;:::-;24741:74;;24824:93;24913:3;24824:93;:::i;:::-;24942:2;24937:3;24933:12;24926:19;;24731:220;;;:::o;24957:366::-;25099:3;25120:67;25184:2;25179:3;25120:67;:::i;:::-;25113:74;;25196:93;25285:3;25196:93;:::i;:::-;25314:2;25309:3;25305:12;25298:19;;25103:220;;;:::o;25329:366::-;25471:3;25492:67;25556:2;25551:3;25492:67;:::i;:::-;25485:74;;25568:93;25657:3;25568:93;:::i;:::-;25686:2;25681:3;25677:12;25670:19;;25475:220;;;:::o;25701:366::-;25843:3;25864:67;25928:2;25923:3;25864:67;:::i;:::-;25857:74;;25940:93;26029:3;25940:93;:::i;:::-;26058:2;26053:3;26049:12;26042:19;;25847:220;;;:::o;26073:398::-;26232:3;26253:83;26334:1;26329:3;26253:83;:::i;:::-;26246:90;;26345:93;26434:3;26345:93;:::i;:::-;26463:1;26458:3;26454:11;26447:18;;26236:235;;;:::o;26477:366::-;26619:3;26640:67;26704:2;26699:3;26640:67;:::i;:::-;26633:74;;26716:93;26805:3;26716:93;:::i;:::-;26834:2;26829:3;26825:12;26818:19;;26623:220;;;:::o;26849:366::-;26991:3;27012:67;27076:2;27071:3;27012:67;:::i;:::-;27005:74;;27088:93;27177:3;27088:93;:::i;:::-;27206:2;27201:3;27197:12;27190:19;;26995:220;;;:::o;27221:366::-;27363:3;27384:67;27448:2;27443:3;27384:67;:::i;:::-;27377:74;;27460:93;27549:3;27460:93;:::i;:::-;27578:2;27573:3;27569:12;27562:19;;27367:220;;;:::o;27593:366::-;27735:3;27756:67;27820:2;27815:3;27756:67;:::i;:::-;27749:74;;27832:93;27921:3;27832:93;:::i;:::-;27950:2;27945:3;27941:12;27934:19;;27739:220;;;:::o;27965:366::-;28107:3;28128:67;28192:2;28187:3;28128:67;:::i;:::-;28121:74;;28204:93;28293:3;28204:93;:::i;:::-;28322:2;28317:3;28313:12;28306:19;;28111:220;;;:::o;28337:366::-;28479:3;28500:67;28564:2;28559:3;28500:67;:::i;:::-;28493:74;;28576:93;28665:3;28576:93;:::i;:::-;28694:2;28689:3;28685:12;28678:19;;28483:220;;;:::o;28709:115::-;28794:23;28811:5;28794:23;:::i;:::-;28789:3;28782:36;28772:52;;:::o;28830:153::-;28933:43;28952:23;28969:5;28952:23;:::i;:::-;28933:43;:::i;:::-;28928:3;28921:56;28911:72;;:::o;28989:118::-;29076:24;29094:5;29076:24;:::i;:::-;29071:3;29064:37;29054:53;;:::o;29113:157::-;29218:45;29238:24;29256:5;29238:24;:::i;:::-;29218:45;:::i;:::-;29213:3;29206:58;29196:74;;:::o;29276:115::-;29361:23;29378:5;29361:23;:::i;:::-;29356:3;29349:36;29339:52;;:::o;29397:291::-;29537:3;29559:103;29658:3;29649:6;29641;29559:103;:::i;:::-;29552:110;;29679:3;29672:10;;29541:147;;;;;:::o;29694:271::-;29824:3;29846:93;29935:3;29926:6;29846:93;:::i;:::-;29839:100;;29956:3;29949:10;;29828:137;;;;:::o;29971:265::-;30098:3;30120:90;30206:3;30197:6;30120:90;:::i;:::-;30113:97;;30227:3;30220:10;;30102:134;;;;:::o;30242:701::-;30523:3;30545:95;30636:3;30627:6;30545:95;:::i;:::-;30538:102;;30657:95;30748:3;30739:6;30657:95;:::i;:::-;30650:102;;30769:148;30913:3;30769:148;:::i;:::-;30762:155;;30934:3;30927:10;;30527:416;;;;;:::o;30949:379::-;31133:3;31155:147;31298:3;31155:147;:::i;:::-;31148:154;;31319:3;31312:10;;31137:191;;;:::o;31334:392::-;31472:3;31487:73;31556:3;31547:6;31487:73;:::i;:::-;31585:1;31580:3;31576:11;31569:18;;31597:75;31668:3;31659:6;31597:75;:::i;:::-;31697:2;31692:3;31688:12;31681:19;;31717:3;31710:10;;31476:250;;;;;:::o;31732:222::-;31825:4;31863:2;31852:9;31848:18;31840:26;;31876:71;31944:1;31933:9;31929:17;31920:6;31876:71;:::i;:::-;31830:124;;;;:::o;31960:640::-;32155:4;32193:3;32182:9;32178:19;32170:27;;32207:71;32275:1;32264:9;32260:17;32251:6;32207:71;:::i;:::-;32288:72;32356:2;32345:9;32341:18;32332:6;32288:72;:::i;:::-;32370;32438:2;32427:9;32423:18;32414:6;32370:72;:::i;:::-;32489:9;32483:4;32479:20;32474:2;32463:9;32459:18;32452:48;32517:76;32588:4;32579:6;32517:76;:::i;:::-;32509:84;;32160:440;;;;;;;:::o;32606:332::-;32727:4;32765:2;32754:9;32750:18;32742:26;;32778:71;32846:1;32835:9;32831:17;32822:6;32778:71;:::i;:::-;32859:72;32927:2;32916:9;32912:18;32903:6;32859:72;:::i;:::-;32732:206;;;;;:::o;32944:210::-;33031:4;33069:2;33058:9;33054:18;33046:26;;33082:65;33144:1;33133:9;33129:17;33120:6;33082:65;:::i;:::-;33036:118;;;;:::o;33160:309::-;33271:4;33309:2;33298:9;33294:18;33286:26;;33358:9;33352:4;33348:20;33344:1;33333:9;33329:17;33322:47;33386:76;33457:4;33448:6;33386:76;:::i;:::-;33378:84;;33276:193;;;;:::o;33475:276::-;33595:4;33633:2;33622:9;33618:18;33610:26;;33646:98;33741:1;33730:9;33726:17;33717:6;33646:98;:::i;:::-;33600:151;;;;:::o;33757:313::-;33870:4;33908:2;33897:9;33893:18;33885:26;;33957:9;33951:4;33947:20;33943:1;33932:9;33928:17;33921:47;33985:78;34058:4;34049:6;33985:78;:::i;:::-;33977:86;;33875:195;;;;:::o;34076:419::-;34242:4;34280:2;34269:9;34265:18;34257:26;;34329:9;34323:4;34319:20;34315:1;34304:9;34300:17;34293:47;34357:131;34483:4;34357:131;:::i;:::-;34349:139;;34247:248;;;:::o;34501:419::-;34667:4;34705:2;34694:9;34690:18;34682:26;;34754:9;34748:4;34744:20;34740:1;34729:9;34725:17;34718:47;34782:131;34908:4;34782:131;:::i;:::-;34774:139;;34672:248;;;:::o;34926:419::-;35092:4;35130:2;35119:9;35115:18;35107:26;;35179:9;35173:4;35169:20;35165:1;35154:9;35150:17;35143:47;35207:131;35333:4;35207:131;:::i;:::-;35199:139;;35097:248;;;:::o;35351:419::-;35517:4;35555:2;35544:9;35540:18;35532:26;;35604:9;35598:4;35594:20;35590:1;35579:9;35575:17;35568:47;35632:131;35758:4;35632:131;:::i;:::-;35624:139;;35522:248;;;:::o;35776:419::-;35942:4;35980:2;35969:9;35965:18;35957:26;;36029:9;36023:4;36019:20;36015:1;36004:9;36000:17;35993:47;36057:131;36183:4;36057:131;:::i;:::-;36049:139;;35947:248;;;:::o;36201:419::-;36367:4;36405:2;36394:9;36390:18;36382:26;;36454:9;36448:4;36444:20;36440:1;36429:9;36425:17;36418:47;36482:131;36608:4;36482:131;:::i;:::-;36474:139;;36372:248;;;:::o;36626:419::-;36792:4;36830:2;36819:9;36815:18;36807:26;;36879:9;36873:4;36869:20;36865:1;36854:9;36850:17;36843:47;36907:131;37033:4;36907:131;:::i;:::-;36899:139;;36797:248;;;:::o;37051:419::-;37217:4;37255:2;37244:9;37240:18;37232:26;;37304:9;37298:4;37294:20;37290:1;37279:9;37275:17;37268:47;37332:131;37458:4;37332:131;:::i;:::-;37324:139;;37222:248;;;:::o;37476:419::-;37642:4;37680:2;37669:9;37665:18;37657:26;;37729:9;37723:4;37719:20;37715:1;37704:9;37700:17;37693:47;37757:131;37883:4;37757:131;:::i;:::-;37749:139;;37647:248;;;:::o;37901:419::-;38067:4;38105:2;38094:9;38090:18;38082:26;;38154:9;38148:4;38144:20;38140:1;38129:9;38125:17;38118:47;38182:131;38308:4;38182:131;:::i;:::-;38174:139;;38072:248;;;:::o;38326:419::-;38492:4;38530:2;38519:9;38515:18;38507:26;;38579:9;38573:4;38569:20;38565:1;38554:9;38550:17;38543:47;38607:131;38733:4;38607:131;:::i;:::-;38599:139;;38497:248;;;:::o;38751:419::-;38917:4;38955:2;38944:9;38940:18;38932:26;;39004:9;38998:4;38994:20;38990:1;38979:9;38975:17;38968:47;39032:131;39158:4;39032:131;:::i;:::-;39024:139;;38922:248;;;:::o;39176:419::-;39342:4;39380:2;39369:9;39365:18;39357:26;;39429:9;39423:4;39419:20;39415:1;39404:9;39400:17;39393:47;39457:131;39583:4;39457:131;:::i;:::-;39449:139;;39347:248;;;:::o;39601:419::-;39767:4;39805:2;39794:9;39790:18;39782:26;;39854:9;39848:4;39844:20;39840:1;39829:9;39825:17;39818:47;39882:131;40008:4;39882:131;:::i;:::-;39874:139;;39772:248;;;:::o;40026:419::-;40192:4;40230:2;40219:9;40215:18;40207:26;;40279:9;40273:4;40269:20;40265:1;40254:9;40250:17;40243:47;40307:131;40433:4;40307:131;:::i;:::-;40299:139;;40197:248;;;:::o;40451:419::-;40617:4;40655:2;40644:9;40640:18;40632:26;;40704:9;40698:4;40694:20;40690:1;40679:9;40675:17;40668:47;40732:131;40858:4;40732:131;:::i;:::-;40724:139;;40622:248;;;:::o;40876:419::-;41042:4;41080:2;41069:9;41065:18;41057:26;;41129:9;41123:4;41119:20;41115:1;41104:9;41100:17;41093:47;41157:131;41283:4;41157:131;:::i;:::-;41149:139;;41047:248;;;:::o;41301:419::-;41467:4;41505:2;41494:9;41490:18;41482:26;;41554:9;41548:4;41544:20;41540:1;41529:9;41525:17;41518:47;41582:131;41708:4;41582:131;:::i;:::-;41574:139;;41472:248;;;:::o;41726:419::-;41892:4;41930:2;41919:9;41915:18;41907:26;;41979:9;41973:4;41969:20;41965:1;41954:9;41950:17;41943:47;42007:131;42133:4;42007:131;:::i;:::-;41999:139;;41897:248;;;:::o;42151:419::-;42317:4;42355:2;42344:9;42340:18;42332:26;;42404:9;42398:4;42394:20;42390:1;42379:9;42375:17;42368:47;42432:131;42558:4;42432:131;:::i;:::-;42424:139;;42322:248;;;:::o;42576:419::-;42742:4;42780:2;42769:9;42765:18;42757:26;;42829:9;42823:4;42819:20;42815:1;42804:9;42800:17;42793:47;42857:131;42983:4;42857:131;:::i;:::-;42849:139;;42747:248;;;:::o;43001:419::-;43167:4;43205:2;43194:9;43190:18;43182:26;;43254:9;43248:4;43244:20;43240:1;43229:9;43225:17;43218:47;43282:131;43408:4;43282:131;:::i;:::-;43274:139;;43172:248;;;:::o;43426:419::-;43592:4;43630:2;43619:9;43615:18;43607:26;;43679:9;43673:4;43669:20;43665:1;43654:9;43650:17;43643:47;43707:131;43833:4;43707:131;:::i;:::-;43699:139;;43597:248;;;:::o;43851:419::-;44017:4;44055:2;44044:9;44040:18;44032:26;;44104:9;44098:4;44094:20;44090:1;44079:9;44075:17;44068:47;44132:131;44258:4;44132:131;:::i;:::-;44124:139;;44022:248;;;:::o;44276:419::-;44442:4;44480:2;44469:9;44465:18;44457:26;;44529:9;44523:4;44519:20;44515:1;44504:9;44500:17;44493:47;44557:131;44683:4;44557:131;:::i;:::-;44549:139;;44447:248;;;:::o;44701:419::-;44867:4;44905:2;44894:9;44890:18;44882:26;;44954:9;44948:4;44944:20;44940:1;44929:9;44925:17;44918:47;44982:131;45108:4;44982:131;:::i;:::-;44974:139;;44872:248;;;:::o;45126:419::-;45292:4;45330:2;45319:9;45315:18;45307:26;;45379:9;45373:4;45369:20;45365:1;45354:9;45350:17;45343:47;45407:131;45533:4;45407:131;:::i;:::-;45399:139;;45297:248;;;:::o;45551:419::-;45717:4;45755:2;45744:9;45740:18;45732:26;;45804:9;45798:4;45794:20;45790:1;45779:9;45775:17;45768:47;45832:131;45958:4;45832:131;:::i;:::-;45824:139;;45722:248;;;:::o;45976:419::-;46142:4;46180:2;46169:9;46165:18;46157:26;;46229:9;46223:4;46219:20;46215:1;46204:9;46200:17;46193:47;46257:131;46383:4;46257:131;:::i;:::-;46249:139;;46147:248;;;:::o;46401:218::-;46492:4;46530:2;46519:9;46515:18;46507:26;;46543:69;46609:1;46598:9;46594:17;46585:6;46543:69;:::i;:::-;46497:122;;;;:::o;46625:822::-;46858:4;46896:3;46885:9;46881:19;46873:27;;46910:69;46976:1;46965:9;46961:17;46952:6;46910:69;:::i;:::-;46989:72;47057:2;47046:9;47042:18;47033:6;46989:72;:::i;:::-;47108:9;47102:4;47098:20;47093:2;47082:9;47078:18;47071:48;47136:76;47207:4;47198:6;47136:76;:::i;:::-;47128:84;;47222:66;47284:2;47273:9;47269:18;47260:6;47222:66;:::i;:::-;47336:9;47330:4;47326:20;47320:3;47309:9;47305:19;47298:49;47364:76;47435:4;47426:6;47364:76;:::i;:::-;47356:84;;46863:584;;;;;;;;:::o;47453:435::-;47600:4;47638:2;47627:9;47623:18;47615:26;;47651:69;47717:1;47706:9;47702:17;47693:6;47651:69;:::i;:::-;47767:9;47761:4;47757:20;47752:2;47741:9;47737:18;47730:48;47795:86;47876:4;47867:6;47859;47795:86;:::i;:::-;47787:94;;47605:283;;;;;;:::o;47894:739::-;48113:4;48151:3;48140:9;48136:19;48128:27;;48165:69;48231:1;48220:9;48216:17;48207:6;48165:69;:::i;:::-;48281:9;48275:4;48271:20;48266:2;48255:9;48251:18;48244:48;48309:76;48380:4;48371:6;48309:76;:::i;:::-;48301:84;;48395:70;48461:2;48450:9;48446:18;48437:6;48395:70;:::i;:::-;48512:9;48506:4;48502:20;48497:2;48486:9;48482:18;48475:48;48540:86;48621:4;48612:6;48604;48540:86;:::i;:::-;48532:94;;48118:515;;;;;;;;:::o;48639:719::-;48848:4;48886:3;48875:9;48871:19;48863:27;;48900:69;48966:1;48955:9;48951:17;48942:6;48900:69;:::i;:::-;49016:9;49010:4;49006:20;49001:2;48990:9;48986:18;48979:48;49044:76;49115:4;49106:6;49044:76;:::i;:::-;49036:84;;49130:70;49196:2;49185:9;49181:18;49172:6;49130:70;:::i;:::-;49247:9;49241:4;49237:20;49232:2;49221:9;49217:18;49210:48;49275:76;49346:4;49337:6;49275:76;:::i;:::-;49267:84;;48853:505;;;;;;;:::o;49364:1058::-;49662:4;49700:3;49689:9;49685:19;49677:27;;49714:69;49780:1;49769:9;49765:17;49756:6;49714:69;:::i;:::-;49830:9;49824:4;49820:20;49815:2;49804:9;49800:18;49793:48;49858:73;49926:4;49917:6;49858:73;:::i;:::-;49850:81;;49978:9;49972:4;49968:20;49963:2;49952:9;49948:18;49941:48;50006:76;50077:4;50068:6;50006:76;:::i;:::-;49998:84;;50092:88;50176:2;50165:9;50161:18;50152:6;50092:88;:::i;:::-;50190:73;50258:3;50247:9;50243:19;50234:6;50190:73;:::i;:::-;50311:9;50305:4;50301:20;50295:3;50284:9;50280:19;50273:49;50339:76;50410:4;50401:6;50339:76;:::i;:::-;50331:84;;49667:755;;;;;;;;;:::o;50428:652::-;50629:4;50667:3;50656:9;50652:19;50644:27;;50681:69;50747:1;50736:9;50732:17;50723:6;50681:69;:::i;:::-;50760:70;50826:2;50815:9;50811:18;50802:6;50760:70;:::i;:::-;50840:72;50908:2;50897:9;50893:18;50884:6;50840:72;:::i;:::-;50959:9;50953:4;50949:20;50944:2;50933:9;50929:18;50922:48;50987:86;51068:4;51059:6;51051;50987:86;:::i;:::-;50979:94;;50634:446;;;;;;;;:::o;51086:222::-;51179:4;51217:2;51206:9;51202:18;51194:26;;51230:71;51298:1;51287:9;51283:17;51274:6;51230:71;:::i;:::-;51184:124;;;;:::o;51314:332::-;51435:4;51473:2;51462:9;51458:18;51450:26;;51486:71;51554:1;51543:9;51539:17;51530:6;51486:71;:::i;:::-;51567:72;51635:2;51624:9;51620:18;51611:6;51567:72;:::i;:::-;51440:206;;;;;:::o;51652:129::-;51686:6;51713:20;;:::i;:::-;51703:30;;51742:33;51770:4;51762:6;51742:33;:::i;:::-;51693:88;;;:::o;51787:75::-;51820:6;51853:2;51847:9;51837:19;;51827:35;:::o;51868:307::-;51929:4;52019:18;52011:6;52008:30;52005:2;;;52041:18;;:::i;:::-;52005:2;52079:29;52101:6;52079:29;:::i;:::-;52071:37;;52163:4;52157;52153:15;52145:23;;51934:241;;;:::o;52181:308::-;52243:4;52333:18;52325:6;52322:30;52319:2;;;52355:18;;:::i;:::-;52319:2;52393:29;52415:6;52393:29;:::i;:::-;52385:37;;52477:4;52471;52467:15;52459:23;;52248:241;;;:::o;52495:140::-;52543:4;52566:3;52558:11;;52589:3;52586:1;52579:14;52623:4;52620:1;52610:18;52602:26;;52548:87;;;:::o;52641:98::-;52692:6;52726:5;52720:12;52710:22;;52699:40;;;:::o;52745:99::-;52797:6;52831:5;52825:12;52815:22;;52804:40;;;:::o;52850:168::-;52933:11;52967:6;52962:3;52955:19;53007:4;53002:3;52998:14;52983:29;;52945:73;;;;:::o;53024:147::-;53125:11;53162:3;53147:18;;53137:34;;;;:::o;53177:169::-;53261:11;53295:6;53290:3;53283:19;53335:4;53330:3;53326:14;53311:29;;53273:73;;;;:::o;53352:148::-;53454:11;53491:3;53476:18;;53466:34;;;;:::o;53506:305::-;53546:3;53565:20;53583:1;53565:20;:::i;:::-;53560:25;;53599:20;53617:1;53599:20;:::i;:::-;53594:25;;53753:1;53685:66;53681:74;53678:1;53675:81;53672:2;;;53759:18;;:::i;:::-;53672:2;53803:1;53800;53796:9;53789:16;;53550:261;;;;:::o;53817:185::-;53857:1;53874:20;53892:1;53874:20;:::i;:::-;53869:25;;53908:20;53926:1;53908:20;:::i;:::-;53903:25;;53947:1;53937:2;;53952:18;;:::i;:::-;53937:2;53994:1;53991;53987:9;53982:14;;53859:143;;;;:::o;54008:348::-;54048:7;54071:20;54089:1;54071:20;:::i;:::-;54066:25;;54105:20;54123:1;54105:20;:::i;:::-;54100:25;;54293:1;54225:66;54221:74;54218:1;54215:81;54210:1;54203:9;54196:17;54192:105;54189:2;;;54300:18;;:::i;:::-;54189:2;54348:1;54345;54341:9;54330:20;;54056:300;;;;:::o;54362:191::-;54402:4;54422:20;54440:1;54422:20;:::i;:::-;54417:25;;54456:20;54474:1;54456:20;:::i;:::-;54451:25;;54495:1;54492;54489:8;54486:2;;;54500:18;;:::i;:::-;54486:2;54545:1;54542;54538:9;54530:17;;54407:146;;;;:::o;54559:96::-;54596:7;54625:24;54643:5;54625:24;:::i;:::-;54614:35;;54604:51;;;:::o;54661:104::-;54706:7;54735:24;54753:5;54735:24;:::i;:::-;54724:35;;54714:51;;;:::o;54771:90::-;54805:7;54848:5;54841:13;54834:21;54823:32;;54813:48;;;:::o;54867:77::-;54904:7;54933:5;54922:16;;54912:32;;;:::o;54950:149::-;54986:7;55026:66;55019:5;55015:78;55004:89;;54994:105;;;:::o;55105:89::-;55141:7;55181:6;55174:5;55170:18;55159:29;;55149:45;;;:::o;55200:126::-;55237:7;55277:42;55270:5;55266:54;55255:65;;55245:81;;;:::o;55332:77::-;55369:7;55398:5;55387:16;;55377:32;;;:::o;55415:101::-;55451:7;55491:18;55484:5;55480:30;55469:41;;55459:57;;;:::o;55522:180::-;55599:9;55632:64;55690:5;55632:64;:::i;:::-;55619:77;;55609:93;;;:::o;55708:140::-;55785:9;55818:24;55836:5;55818:24;:::i;:::-;55805:37;;55795:53;;;:::o;55854:154::-;55938:6;55933:3;55928;55915:30;56000:1;55991:6;55986:3;55982:16;55975:27;55905:103;;;:::o;56014:307::-;56082:1;56092:113;56106:6;56103:1;56100:13;56092:113;;;56191:1;56186:3;56182:11;56176:18;56172:1;56167:3;56163:11;56156:39;56128:2;56125:1;56121:10;56116:15;;56092:113;;;56223:6;56220:1;56217:13;56214:2;;;56303:1;56294:6;56289:3;56285:16;56278:27;56214:2;56063:258;;;;:::o;56327:320::-;56371:6;56408:1;56402:4;56398:12;56388:22;;56455:1;56449:4;56445:12;56476:18;56466:2;;56532:4;56524:6;56520:17;56510:27;;56466:2;56594;56586:6;56583:14;56563:18;56560:38;56557:2;;;56613:18;;:::i;:::-;56557:2;56378:269;;;;:::o;56653:281::-;56736:27;56758:4;56736:27;:::i;:::-;56728:6;56724:40;56866:6;56854:10;56851:22;56830:18;56818:10;56815:34;56812:62;56809:2;;;56877:18;;:::i;:::-;56809:2;56917:10;56913:2;56906:22;56696:238;;;:::o;56940:233::-;56979:3;57002:24;57020:5;57002:24;:::i;:::-;56993:33;;57048:66;57041:5;57038:77;57035:2;;;57118:18;;:::i;:::-;57035:2;57165:1;57158:5;57154:13;57147:20;;56983:190;;;:::o;57179:94::-;57217:7;57246:21;57261:5;57246:21;:::i;:::-;57235:32;;57225:48;;;:::o;57279:79::-;57318:7;57347:5;57336:16;;57326:32;;;:::o;57364:176::-;57396:1;57413:20;57431:1;57413:20;:::i;:::-;57408:25;;57447:20;57465:1;57447:20;:::i;:::-;57442:25;;57486:1;57476:2;;57491:18;;:::i;:::-;57476:2;57532:1;57529;57525:9;57520:14;;57398:142;;;;:::o;57546:180::-;57594:77;57591:1;57584:88;57691:4;57688:1;57681:15;57715:4;57712:1;57705:15;57732:180;57780:77;57777:1;57770:88;57877:4;57874:1;57867:15;57901:4;57898:1;57891:15;57918:180;57966:77;57963:1;57956:88;58063:4;58060:1;58053:15;58087:4;58084:1;58077:15;58104:180;58152:77;58149:1;58142:88;58249:4;58246:1;58239:15;58273:4;58270:1;58263:15;58290:102;58331:6;58382:2;58378:7;58373:2;58366:5;58362:14;58358:28;58348:38;;58338:54;;;:::o;58398:96::-;58432:8;58481:5;58476:3;58472:15;58451:36;;58441:53;;;:::o;58500:237::-;58640:34;58636:1;58628:6;58624:14;58617:58;58709:20;58704:2;58696:6;58692:15;58685:45;58606:131;:::o;58743:225::-;58883:34;58879:1;58871:6;58867:14;58860:58;58952:8;58947:2;58939:6;58935:15;58928:33;58849:119;:::o;58974:224::-;59114:34;59110:1;59102:6;59098:14;59091:58;59183:7;59178:2;59170:6;59166:15;59159:32;59080:118;:::o;59204:228::-;59344:34;59340:1;59332:6;59328:14;59321:58;59413:11;59408:2;59400:6;59396:15;59389:36;59310:122;:::o;59438:178::-;59578:30;59574:1;59566:6;59562:14;59555:54;59544:72;:::o;59622:223::-;59762:34;59758:1;59750:6;59746:14;59739:58;59831:6;59826:2;59818:6;59814:15;59807:31;59728:117;:::o;59851:175::-;59991:27;59987:1;59979:6;59975:14;59968:51;59957:69;:::o;60032:176::-;60172:28;60168:1;60160:6;60156:14;60149:52;60138:70;:::o;60214:231::-;60354:34;60350:1;60342:6;60338:14;60331:58;60423:14;60418:2;60410:6;60406:15;60399:39;60320:125;:::o;60451:237::-;60591:34;60587:1;60579:6;60575:14;60568:58;60660:20;60655:2;60647:6;60643:15;60636:45;60557:131;:::o;60694:173::-;60834:25;60830:1;60822:6;60818:14;60811:49;60800:67;:::o;60873:232::-;61013:34;61009:1;61001:6;60997:14;60990:58;61082:15;61077:2;61069:6;61065:15;61058:40;60979:126;:::o;61111:243::-;61251:34;61247:1;61239:6;61235:14;61228:58;61320:26;61315:2;61307:6;61303:15;61296:51;61217:137;:::o;61360:229::-;61500:34;61496:1;61488:6;61484:14;61477:58;61569:12;61564:2;61556:6;61552:15;61545:37;61466:123;:::o;61595:228::-;61735:34;61731:1;61723:6;61719:14;61712:58;61804:11;61799:2;61791:6;61787:15;61780:36;61701:122;:::o;61829:230::-;61969:34;61965:1;61957:6;61953:14;61946:58;62038:13;62033:2;62025:6;62021:15;62014:38;61935:124;:::o;62065:182::-;62205:34;62201:1;62193:6;62189:14;62182:58;62171:76;:::o;62253:231::-;62393:34;62389:1;62381:6;62377:14;62370:58;62462:14;62457:2;62449:6;62445:15;62438:39;62359:125;:::o;62490:155::-;62630:7;62626:1;62618:6;62614:14;62607:31;62596:49;:::o;62651:182::-;62791:34;62787:1;62779:6;62775:14;62768:58;62757:76;:::o;62839:239::-;62979:34;62975:1;62967:6;62963:14;62956:58;63048:22;63043:2;63035:6;63031:15;63024:47;62945:133;:::o;63084:234::-;63224:34;63220:1;63212:6;63208:14;63201:58;63293:17;63288:2;63280:6;63276:15;63269:42;63190:128;:::o;63324:174::-;63464:26;63460:1;63452:6;63448:14;63441:50;63430:68;:::o;63504:220::-;63644:34;63640:1;63632:6;63628:14;63621:58;63713:3;63708:2;63700:6;63696:15;63689:28;63610:114;:::o;63730:::-;63836:8;:::o;63850:222::-;63990:34;63986:1;63978:6;63974:14;63967:58;64059:5;64054:2;64046:6;64042:15;64035:30;63956:116;:::o;64078:236::-;64218:34;64214:1;64206:6;64202:14;64195:58;64287:19;64282:2;64274:6;64270:15;64263:44;64184:130;:::o;64320:171::-;64460:23;64456:1;64448:6;64444:14;64437:47;64426:65;:::o;64497:229::-;64637:34;64633:1;64625:6;64621:14;64614:58;64706:12;64701:2;64693:6;64689:15;64682:37;64603:123;:::o;64732:251::-;64872:34;64868:1;64860:6;64856:14;64849:58;64941:34;64936:2;64928:6;64924:15;64917:59;64838:145;:::o;64989:225::-;65129:34;65125:1;65117:6;65113:14;65106:58;65198:8;65193:2;65185:6;65181:15;65174:33;65095:119;:::o;65220:122::-;65293:24;65311:5;65293:24;:::i;:::-;65286:5;65283:35;65273:2;;65332:1;65329;65322:12;65273:2;65263:79;:::o;65348:138::-;65429:32;65455:5;65429:32;:::i;:::-;65422:5;65419:43;65409:2;;65476:1;65473;65466:12;65409:2;65399:87;:::o;65492:116::-;65562:21;65577:5;65562:21;:::i;:::-;65555:5;65552:32;65542:2;;65598:1;65595;65588:12;65542:2;65532:76;:::o;65614:120::-;65686:23;65703:5;65686:23;:::i;:::-;65679:5;65676:34;65666:2;;65724:1;65721;65714:12;65666:2;65656:78;:::o;65740:120::-;65812:23;65829:5;65812:23;:::i;:::-;65805:5;65802:34;65792:2;;65850:1;65847;65840:12;65792:2;65782:78;:::o;65866:122::-;65939:24;65957:5;65939:24;:::i;:::-;65932:5;65929:35;65919:2;;65978:1;65975;65968:12;65919:2;65909:79;:::o;65994:120::-;66066:23;66083:5;66066:23;:::i;:::-;66059:5;66056:34;66046:2;;66104:1;66101;66094:12;66046:2;66036:78;:::o

Swarm Source

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