ERC-721
Overview
Max Total Supply
0 Hoot
Holders
299
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
8 HootLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
OmniOwls
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-14 */ // File: contracts/OmniOwls.sol //SPDX-License-Identifier: UNLICENSED // 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/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: @openzeppelin/contracts/utils/Strings.sol // 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/Context.sol // 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/access/Ownable.sol // 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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // 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/utils/introspection/IERC165.sol // 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/utils/introspection/ERC165.sol // 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/IERC721.sol // 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/extensions/IERC721Metadata.sol // 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/token/ERC721/ERC721.sol // OpenZeppelin Contracts v4.4.1 (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(), ".json")) : ""; } /** * @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"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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 {} } // File: contracts/NonblockingReceiver.sol pragma solidity ^0.8.6; abstract contract NonblockingReceiver is Ownable, ILayerZeroReceiver { ILayerZeroEndpoint internal endpoint; struct FailedMessages { uint payloadLength; bytes32 payloadHash; } mapping(uint16 => mapping(bytes => mapping(uint => FailedMessages))) public failedMessages; mapping(uint16 => bytes) public trustedRemoteLookup; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload); 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 == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_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."); // handle incoming message _LzReceive( _srcChainId, _srcAddress, _nonce, _payload); } // abstract function function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) virtual internal; function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _txParam) internal { endpoint.send{value: msg.value}(_dstChainId, trustedRemoteLookup[_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 setTrustedRemote(uint16 _chainId, bytes calldata _trustedRemote) external onlyOwner { trustedRemoteLookup[_chainId] = _trustedRemote; } } // File: contracts/OmniOwls.sol pragma solidity ^0.8.7; contract OmniOwls is Ownable, ERC721, NonblockingReceiver { address public _owner; string private baseURI; uint256 nextTokenId = 0; uint256 MAX_MINT_ETHEREUM = 1000; uint gasForDestinationLzReceive = 350000; constructor(string memory baseURI_, address _layerZeroEndpoint) ERC721("OmniOwls", "Hoot") { _owner = msg.sender; endpoint = ILayerZeroEndpoint(_layerZeroEndpoint); baseURI = baseURI_; } // mint function // you can choose to mint 1 or 2 // mint is free, but payments are accepted function mint(uint8 numTokens) external payable { require(numTokens < 3, "Max 2 NFTs per transaction"); require(nextTokenId + numTokens <= MAX_MINT_ETHEREUM, "Mint exceeds supply"); _safeMint(msg.sender, ++nextTokenId); if (numTokens == 2) { _safeMint(msg.sender, ++nextTokenId); } } // This function transfers the nft from your address on the // source chain to the same address on the destination chain function traverseChains(uint16 _chainId, uint tokenId) public payable { require(msg.sender == ownerOf(tokenId), "You must own the token to traverse"); require(trustedRemoteLookup[_chainId].length > 0, "This chain is currently unavailable for travel"); // burn NFT, eliminating it from circulation on src chain _burn(tokenId); // abi.encode() the payload with the values to send bytes memory payload = abi.encode(msg.sender, tokenId); // encode adapterParams to specify more gas for the destination uint16 version = 1; bytes memory adapterParams = abi.encodePacked(version, gasForDestinationLzReceive); // get the fees we need to pay to LayerZero + Relayer to cover message delivery // you will be refunded for extra gas paid (uint messageFee, ) = endpoint.estimateFees(_chainId, address(this), payload, false, adapterParams); require(msg.value >= messageFee, "msg.value not enough to cover messageFee. Send gas for message fees"); endpoint.send{value: msg.value}( _chainId, // destination chainId trustedRemoteLookup[_chainId], // destination address of nft contract payload, // abi.encoded()'ed bytes payable(msg.sender), // refund address address(0x0), // 'zroPaymentAddress' unused for this adapterParams // txParameters ); } function setBaseURI(string memory URI) external onlyOwner { baseURI = URI; } function donate() external payable { // thank you } // This allows the devs to receive kind donations function withdraw(uint amt) external onlyOwner { (bool sent, ) = payable(_owner).call{value: amt}(""); require(sent, "Failed to withdraw Ether"); } // just in case this fixed variable limits us from future integrations function setGasForDestinationLzReceive(uint newVal) external onlyOwner { gasForDestinationLzReceive = newVal; } // ------------------ // Internal Functions // ------------------ function _LzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) override internal { // decode (address toAddr, uint tokenId) = abi.decode(_payload, (address, uint)); // mint the tokens back into existence on destination chain _safeMint(toAddr, tokenId); } function _baseURI() override internal view returns (string memory) { return baseURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"address","name":"_layerZeroEndpoint","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"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":[],"name":"_owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","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":"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":"uint8","name":"numTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newVal","type":"uint256"}],"name":"setGasForDestinationLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_trustedRemote","type":"bytes"}],"name":"setTrustedRemote","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"traverseChains","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"trustedRemoteLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600c556103e8600d5562055730600e553480156200002357600080fd5b5060405162002d5038038062002d5083398101604081905262000046916200022a565b604051806040016040528060088152602001674f6d6e694f776c7360c01b81525060405180604001604052806004815260200163121bdbdd60e21b8152506200009e620000986200011360201b60201c565b62000117565b8151620000b390600190602085019062000167565b508051620000c990600290602084019062000167565b5050600a8054336001600160a01b031991821617909155600780549091166001600160a01b0384161790555081516200010a90600b90602085019062000167565b5050506200036e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805462000175906200031b565b90600052602060002090601f016020900481019282620001995760008555620001e4565b82601f10620001b457805160ff1916838001178555620001e4565b82800160010185558215620001e4579182015b82811115620001e4578251825591602001919060010190620001c7565b50620001f2929150620001f6565b5090565b5b80821115620001f25760008155600101620001f7565b80516001600160a01b03811681146200022557600080fd5b919050565b600080604083850312156200023e57600080fd5b82516001600160401b03808211156200025657600080fd5b818501915085601f8301126200026b57600080fd5b81518181111562000280576200028062000358565b604051601f8201601f19908116603f01168101908382118183101715620002ab57620002ab62000358565b81604052828152602093508884848701011115620002c857600080fd5b600091505b82821015620002ec5784820184015181830185015290830190620002cd565b82821115620002fe5760008484830101525b9550620003109150508582016200020d565b925050509250929050565b600181811c908216806200033057607f821691505b602082108114156200035257634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6129d2806200037e6000396000f3fe6080604052600436106101c15760003560e01c80637533d788116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610531578063eb8d72b71461057a578063ed88c68e146101e6578063f2fde38b1461059a57600080fd5b8063b88d4fde146104cb578063c87b56dd146104eb578063cf89fa031461050b578063d1deba1f1461051e57600080fd5b8063943fb872116100d1578063943fb8721461045657806395d89b4114610476578063a22cb4651461048b578063b2bdfa7b146104ab57600080fd5b80637533d788146103ad5780638da5cb5b146103cd5780638ee74912146103eb57600080fd5b80632e1a7d4d116101645780636352211e1161013e5780636352211e146103375780636ecd23061461035757806370a082311461036a578063715018a61461039857600080fd5b80632e1a7d4d146102d757806342842e0e146102f757806355f804b31461031757600080fd5b8063081812fc116101a0578063081812fc1461023f578063095ea7b3146102775780631c37a8221461029757806323b872dd146102b757600080fd5b80621d3567146101c657806301ffc9a7146101e857806306fdde031461021d575b600080fd5b3480156101d257600080fd5b506101e66101e136600461233d565b6105ba565b005b3480156101f457600080fd5b5061020861020336600461216d565b6107b4565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610806565b6040516102149190612577565b34801561024b57600080fd5b5061025f61025a3660046123d1565b610898565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b506101e6610292366004612141565b61092d565b3480156102a357600080fd5b506101e66102b236600461233d565b610a43565b3480156102c357600080fd5b506101e66102d2366004612062565b610ab2565b3480156102e357600080fd5b506101e66102f23660046123d1565b610ae3565b34801561030357600080fd5b506101e6610312366004612062565b610bb4565b34801561032357600080fd5b506101e66103323660046121a7565b610bcf565b34801561034357600080fd5b5061025f6103523660046123d1565b610c0c565b6101e661036536600461240e565b610c83565b34801561037657600080fd5b5061038a610385366004611fde565b610d6d565b604051908152602001610214565b3480156103a457600080fd5b506101e6610df4565b3480156103b957600080fd5b506102326103c83660046121ef565b610e2a565b3480156103d957600080fd5b506000546001600160a01b031661025f565b3480156103f757600080fd5b5061044161040636600461225c565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b60408051928352602083019190915201610214565b34801561046257600080fd5b506101e66104713660046123d1565b610ec4565b34801561048257600080fd5b50610232610ef3565b34801561049757600080fd5b506101e66104a636600461210e565b610f02565b3480156104b757600080fd5b50600a5461025f906001600160a01b031681565b3480156104d757600080fd5b506101e66104e63660046120a3565b610f0d565b3480156104f757600080fd5b506102326105063660046123d1565b610f3f565b6101e66105193660046123b5565b61101a565b6101e661052c3660046122b2565b6112f7565b34801561053d57600080fd5b5061020861054c366004612029565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561058657600080fd5b506101e661059536600461220a565b611484565b3480156105a657600080fd5b506101e66105b5366004611fde565b6114cc565b6007546001600160a01b031633146105d157600080fd5b61ffff8416600090815260096020526040902080546105ef906128af565b9050835114801561062e575061ffff841660009081526009602052604090819020905161061c9190612489565b60405180910390208380519060200120145b61069c5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906106c5908790879087908790600401612717565b600060405180830381600087803b1580156106df57600080fd5b505af19250505080156106f0575060015b6107ae576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161073a919061246d565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107a5908690869086908690612717565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b14806107e557506001600160e01b03198216635b5e139f60e01b145b8061080057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610815906128af565b80601f0160208091040260200160405190810160405280929190818152602001828054610841906128af565b801561088e5780601f106108635761010080835404028352916020019161088e565b820191906000526020600020905b81548152906001019060200180831161087157829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166109115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610693565b506000908152600560205260409020546001600160a01b031690565b600061093882610c0c565b9050806001600160a01b0316836001600160a01b031614156109a65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610693565b336001600160a01b03821614806109c257506109c2813361054c565b610a345760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610693565b610a3e8383611564565b505050565b333014610aa65760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b6064820152608401610693565b6107ae848484846115d2565b610abc33826115ff565b610ad85760405162461bcd60e51b815260040161069390612611565b610a3e8383836116f6565b6000546001600160a01b03163314610b0d5760405162461bcd60e51b8152600401610693906125dc565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610b5a576040519150601f19603f3d011682016040523d82523d6000602084013e610b5f565b606091505b5050905080610bb05760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20776974686472617720457468657200000000000000006044820152606401610693565b5050565b610a3e83838360405180602001604052806000815250610f0d565b6000546001600160a01b03163314610bf95760405162461bcd60e51b8152600401610693906125dc565b8051610bb090600b906020840190611dc6565b6000818152600360205260408120546001600160a01b0316806108005760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610693565b60038160ff1610610cd65760405162461bcd60e51b815260206004820152601a60248201527f4d61782032204e46547320706572207472616e73616374696f6e0000000000006044820152606401610693565b600d548160ff16600c54610cea9190612840565b1115610d2e5760405162461bcd60e51b81526020600482015260136024820152724d696e74206578636565647320737570706c7960681b6044820152606401610693565b610d4b33600c60008154610d41906128ea565b9182905550611896565b8060ff1660021415610d6a57610d6a33600c60008154610d41906128ea565b50565b60006001600160a01b038216610dd85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610693565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610e1e5760405162461bcd60e51b8152600401610693906125dc565b610e2860006118b0565b565b60096020526000908152604090208054610e43906128af565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6f906128af565b8015610ebc5780601f10610e9157610100808354040283529160200191610ebc565b820191906000526020600020905b815481529060010190602001808311610e9f57829003601f168201915b505050505081565b6000546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610693906125dc565b600e55565b606060028054610815906128af565b610bb0338383611900565b610f1733836115ff565b610f335760405162461bcd60e51b815260040161069390612611565b6107ae848484846119cf565b6000818152600360205260409020546060906001600160a01b0316610fbe5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610693565b6000610fc8611a02565b90506000815111610fe85760405180602001604052806000815250611013565b80610ff284611a11565b6040516020016110039291906124fb565b6040516020818303038152906040525b9392505050565b61102381610c0c565b6001600160a01b0316336001600160a01b03161461108e5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b6064820152608401610693565b61ffff8216600090815260096020526040812080546110ac906128af565b9050116111125760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b6064820152608401610693565b61111b81611b0e565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb109061119e908990309089908790899060a601612662565b604080518083038186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed91906123ea565b509050803410156112725760405162461bcd60e51b815260206004820152604360248201527f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a401610693565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c58031009234926112bd928c928b913391908b90600401612760565b6000604051808303818588803b1580156112d657600080fd5b505af11580156112ea573d6000803e3d6000fd5b5050505050505050505050565b61ffff8516600090815260086020526040808220905161131890879061246d565b90815260408051602092819003830190206001600160401b038716600090815292529020600181015490915061139f5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b6064820152608401610693565b8054821480156113c95750806001015483836040516113bf92919061245d565b6040518091039020145b6114155760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610693565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061144a90899089908990899089906004016126b6565b600060405180830381600087803b15801561146457600080fd5b505af1158015611478573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146114ae5760405162461bcd60e51b8152600401610693906125dc565b61ffff831660009081526009602052604090206107ae908383611e4a565b6000546001600160a01b031633146114f65760405162461bcd60e51b8152600401610693906125dc565b6001600160a01b03811661155b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610693565b610d6a816118b0565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061159982610c0c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906115e99190611ffb565b915091506115f78282611896565b505050505050565b6000818152600360205260408120546001600160a01b03166116785760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610693565b600061168383610c0c565b9050806001600160a01b0316846001600160a01b031614806116be5750836001600160a01b03166116b384610898565b6001600160a01b0316145b806116ee57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661170982610c0c565b6001600160a01b0316146117715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610693565b6001600160a01b0382166117d35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610693565b6117de600082611564565b6001600160a01b038316600090815260046020526040812080546001929061180790849061286c565b90915550506001600160a01b0382166000908152600460205260408120805460019290611835908490612840565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610bb0828260405180602001604052806000815250611ba9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156119625760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610693565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119da8484846116f6565b6119e684848484611bdc565b6107ae5760405162461bcd60e51b81526004016106939061258a565b6060600b8054610815906128af565b606081611a355750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a5f5780611a49816128ea565b9150611a589050600a83612858565b9150611a39565b6000816001600160401b03811115611a7957611a7961295b565b6040519080825280601f01601f191660200182016040528015611aa3576020820181803683370190505b5090505b84156116ee57611ab860018361286c565b9150611ac5600a86612905565b611ad0906030612840565b60f81b818381518110611ae557611ae5612945565b60200101906001600160f81b031916908160001a905350611b07600a86612858565b9450611aa7565b6000611b1982610c0c565b9050611b26600083611564565b6001600160a01b0381166000908152600460205260408120805460019290611b4f90849061286c565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611bb38383611ce9565b611bc06000848484611bdc565b610a3e5760405162461bcd60e51b81526004016106939061258a565b60006001600160a01b0384163b15611cde57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c2090339089908890889060040161253a565b602060405180830381600087803b158015611c3a57600080fd5b505af1925050508015611c6a575060408051601f3d908101601f19168201909252611c679181019061218a565b60015b611cc4573d808015611c98576040519150601f19603f3d011682016040523d82523d6000602084013e611c9d565b606091505b508051611cbc5760405162461bcd60e51b81526004016106939061258a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116ee565b506001949350505050565b6001600160a01b038216611d3f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610693565b6001600160a01b0382166000908152600460205260408120805460019290611d68908490612840565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611dd2906128af565b90600052602060002090601f016020900481019282611df45760008555611e3a565b82601f10611e0d57805160ff1916838001178555611e3a565b82800160010185558215611e3a579182015b82811115611e3a578251825591602001919060010190611e1f565b50611e46929150611ebe565b5090565b828054611e56906128af565b90600052602060002090601f016020900481019282611e785760008555611e3a565b82601f10611e915782800160ff19823516178555611e3a565b82800160010185558215611e3a579182015b82811115611e3a578235825591602001919060010190611ea3565b5b80821115611e465760008155600101611ebf565b60006001600160401b0380841115611eed57611eed61295b565b604051601f8501601f19908116603f01168101908282118183101715611f1557611f1561295b565b81604052809350858152868686011115611f2e57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112611f5a57600080fd5b5081356001600160401b03811115611f7157600080fd5b602083019150836020828501011115611f8957600080fd5b9250929050565b600082601f830112611fa157600080fd5b61101383833560208501611ed3565b803561ffff81168114611fc257600080fd5b919050565b80356001600160401b0381168114611fc257600080fd5b600060208284031215611ff057600080fd5b813561101381612971565b6000806040838503121561200e57600080fd5b825161201981612971565b6020939093015192949293505050565b6000806040838503121561203c57600080fd5b823561204781612971565b9150602083013561205781612971565b809150509250929050565b60008060006060848603121561207757600080fd5b833561208281612971565b9250602084013561209281612971565b929592945050506040919091013590565b600080600080608085870312156120b957600080fd5b84356120c481612971565b935060208501356120d481612971565b92506040850135915060608501356001600160401b038111156120f657600080fd5b61210287828801611f90565b91505092959194509250565b6000806040838503121561212157600080fd5b823561212c81612971565b91506020830135801515811461205757600080fd5b6000806040838503121561215457600080fd5b823561215f81612971565b946020939093013593505050565b60006020828403121561217f57600080fd5b813561101381612986565b60006020828403121561219c57600080fd5b815161101381612986565b6000602082840312156121b957600080fd5b81356001600160401b038111156121cf57600080fd5b8201601f810184136121e057600080fd5b6116ee84823560208401611ed3565b60006020828403121561220157600080fd5b61101382611fb0565b60008060006040848603121561221f57600080fd5b61222884611fb0565b925060208401356001600160401b0381111561224357600080fd5b61224f86828701611f48565b9497909650939450505050565b60008060006060848603121561227157600080fd5b61227a84611fb0565b925060208401356001600160401b0381111561229557600080fd5b6122a186828701611f90565b925050604084013590509250925092565b6000806000806000608086880312156122ca57600080fd5b6122d386611fb0565b945060208601356001600160401b03808211156122ef57600080fd5b6122fb89838a01611f90565b955061230960408901611fc7565b9450606088013591508082111561231f57600080fd5b5061232c88828901611f48565b969995985093965092949392505050565b6000806000806080858703121561235357600080fd5b61235c85611fb0565b935060208501356001600160401b038082111561237857600080fd5b61238488838901611f90565b945061239260408801611fc7565b935060608701359150808211156123a857600080fd5b5061210287828801611f90565b600080604083850312156123c857600080fd5b61215f83611fb0565b6000602082840312156123e357600080fd5b5035919050565b600080604083850312156123fd57600080fd5b505080516020909101519092909150565b60006020828403121561242057600080fd5b813560ff8116811461101357600080fd5b60008151808452612449816020860160208601612883565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b6000825161247f818460208701612883565b9190910192915050565b6000808354612497816128af565b600182811680156124af57600181146124c0576124ef565b60ff198416875282870194506124ef565b8760005260208060002060005b858110156124e65781548a8201529084019082016124cd565b50505082870194505b50929695505050505050565b6000835161250d818460208801612883565b835190830190612521818360208801612883565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061256d90830184612431565b9695505050505050565b6020815260006110136020830184612431565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061269090830186612431565b841515606084015282810360808401526126aa8185612431565b98975050505050505050565b61ffff861681526080602082015260006126d36080830187612431565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006127346080830186612431565b6001600160401b038516604084015282810360608401526127558185612431565b979650505050505050565b61ffff871681526000602060c0818401526000885461277e816128af565b8060c087015260e06001808416600081146127a057600181146127b5576127e3565b60ff19851689840152610100890195506127e3565b8d6000528660002060005b858110156127db5781548b82018601529083019088016127c0565b8a0184019650505b505050505083810360408501526127fa8189612431565b91505061281260608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526128338185612431565b9998505050505050505050565b6000821982111561285357612853612919565b500190565b6000826128675761286761292f565b500490565b60008282101561287e5761287e612919565b500390565b60005b8381101561289e578181015183820152602001612886565b838111156107ae5750506000910152565b600181811c908216806128c357607f821691505b602082108114156128e457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128fe576128fe612919565b5060010190565b6000826129145761291461292f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d6a57600080fd5b6001600160e01b031981168114610d6a57600080fdfea26469706673582212201d4555a2ad187a51cfb1650ffeac4ccad5f280fcf13e02d7eccaaa79a73aec6a64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d585342436f3964344148526177457033764843523363325a4a474d66336f36576274647976385665347a4c722f00000000000000000000
Deployed Bytecode
0x6080604052600436106101c15760003560e01c80637533d788116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c514610531578063eb8d72b71461057a578063ed88c68e146101e6578063f2fde38b1461059a57600080fd5b8063b88d4fde146104cb578063c87b56dd146104eb578063cf89fa031461050b578063d1deba1f1461051e57600080fd5b8063943fb872116100d1578063943fb8721461045657806395d89b4114610476578063a22cb4651461048b578063b2bdfa7b146104ab57600080fd5b80637533d788146103ad5780638da5cb5b146103cd5780638ee74912146103eb57600080fd5b80632e1a7d4d116101645780636352211e1161013e5780636352211e146103375780636ecd23061461035757806370a082311461036a578063715018a61461039857600080fd5b80632e1a7d4d146102d757806342842e0e146102f757806355f804b31461031757600080fd5b8063081812fc116101a0578063081812fc1461023f578063095ea7b3146102775780631c37a8221461029757806323b872dd146102b757600080fd5b80621d3567146101c657806301ffc9a7146101e857806306fdde031461021d575b600080fd5b3480156101d257600080fd5b506101e66101e136600461233d565b6105ba565b005b3480156101f457600080fd5b5061020861020336600461216d565b6107b4565b60405190151581526020015b60405180910390f35b34801561022957600080fd5b50610232610806565b6040516102149190612577565b34801561024b57600080fd5b5061025f61025a3660046123d1565b610898565b6040516001600160a01b039091168152602001610214565b34801561028357600080fd5b506101e6610292366004612141565b61092d565b3480156102a357600080fd5b506101e66102b236600461233d565b610a43565b3480156102c357600080fd5b506101e66102d2366004612062565b610ab2565b3480156102e357600080fd5b506101e66102f23660046123d1565b610ae3565b34801561030357600080fd5b506101e6610312366004612062565b610bb4565b34801561032357600080fd5b506101e66103323660046121a7565b610bcf565b34801561034357600080fd5b5061025f6103523660046123d1565b610c0c565b6101e661036536600461240e565b610c83565b34801561037657600080fd5b5061038a610385366004611fde565b610d6d565b604051908152602001610214565b3480156103a457600080fd5b506101e6610df4565b3480156103b957600080fd5b506102326103c83660046121ef565b610e2a565b3480156103d957600080fd5b506000546001600160a01b031661025f565b3480156103f757600080fd5b5061044161040636600461225c565b600860209081526000938452604080852084518086018401805192815290840195840195909520945292905282529020805460019091015482565b60408051928352602083019190915201610214565b34801561046257600080fd5b506101e66104713660046123d1565b610ec4565b34801561048257600080fd5b50610232610ef3565b34801561049757600080fd5b506101e66104a636600461210e565b610f02565b3480156104b757600080fd5b50600a5461025f906001600160a01b031681565b3480156104d757600080fd5b506101e66104e63660046120a3565b610f0d565b3480156104f757600080fd5b506102326105063660046123d1565b610f3f565b6101e66105193660046123b5565b61101a565b6101e661052c3660046122b2565b6112f7565b34801561053d57600080fd5b5061020861054c366004612029565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561058657600080fd5b506101e661059536600461220a565b611484565b3480156105a657600080fd5b506101e66105b5366004611fde565b6114cc565b6007546001600160a01b031633146105d157600080fd5b61ffff8416600090815260096020526040902080546105ef906128af565b9050835114801561062e575061ffff841660009081526009602052604090819020905161061c9190612489565b60405180910390208380519060200120145b61069c5760405162461bcd60e51b815260206004820152603460248201527f4e6f6e626c6f636b696e6752656365697665723a20696e76616c696420736f756044820152731c98d9481cd95b991a5b99c818dbdb9d1c9858dd60621b60648201526084015b60405180910390fd5b604051630e1bd41160e11b81523090631c37a822906106c5908790879087908790600401612717565b600060405180830381600087803b1580156106df57600080fd5b505af19250505080156106f0575060015b6107ae576040518060400160405280825181526020018280519060200120815250600860008661ffff1661ffff1681526020019081526020016000208460405161073a919061246d565b9081526040805191829003602090810183206001600160401b038716600090815290825291909120835181559201516001909201919091557fe6f254030bcb01ffd20558175c13fcaed6d1520be7becee4c961b65f79243b0d906107a5908690869086908690612717565b60405180910390a15b50505050565b60006001600160e01b031982166380ac58cd60e01b14806107e557506001600160e01b03198216635b5e139f60e01b145b8061080057506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610815906128af565b80601f0160208091040260200160405190810160405280929190818152602001828054610841906128af565b801561088e5780601f106108635761010080835404028352916020019161088e565b820191906000526020600020905b81548152906001019060200180831161087157829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166109115760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610693565b506000908152600560205260409020546001600160a01b031690565b600061093882610c0c565b9050806001600160a01b0316836001600160a01b031614156109a65760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610693565b336001600160a01b03821614806109c257506109c2813361054c565b610a345760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610693565b610a3e8383611564565b505050565b333014610aa65760405162461bcd60e51b815260206004820152602b60248201527f4e6f6e626c6f636b696e6752656365697665723a2063616c6c6572206d75737460448201526a10313290213934b233b29760a91b6064820152608401610693565b6107ae848484846115d2565b610abc33826115ff565b610ad85760405162461bcd60e51b815260040161069390612611565b610a3e8383836116f6565b6000546001600160a01b03163314610b0d5760405162461bcd60e51b8152600401610693906125dc565b600a546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610b5a576040519150601f19603f3d011682016040523d82523d6000602084013e610b5f565b606091505b5050905080610bb05760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20776974686472617720457468657200000000000000006044820152606401610693565b5050565b610a3e83838360405180602001604052806000815250610f0d565b6000546001600160a01b03163314610bf95760405162461bcd60e51b8152600401610693906125dc565b8051610bb090600b906020840190611dc6565b6000818152600360205260408120546001600160a01b0316806108005760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610693565b60038160ff1610610cd65760405162461bcd60e51b815260206004820152601a60248201527f4d61782032204e46547320706572207472616e73616374696f6e0000000000006044820152606401610693565b600d548160ff16600c54610cea9190612840565b1115610d2e5760405162461bcd60e51b81526020600482015260136024820152724d696e74206578636565647320737570706c7960681b6044820152606401610693565b610d4b33600c60008154610d41906128ea565b9182905550611896565b8060ff1660021415610d6a57610d6a33600c60008154610d41906128ea565b50565b60006001600160a01b038216610dd85760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610693565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314610e1e5760405162461bcd60e51b8152600401610693906125dc565b610e2860006118b0565b565b60096020526000908152604090208054610e43906128af565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6f906128af565b8015610ebc5780601f10610e9157610100808354040283529160200191610ebc565b820191906000526020600020905b815481529060010190602001808311610e9f57829003601f168201915b505050505081565b6000546001600160a01b03163314610eee5760405162461bcd60e51b8152600401610693906125dc565b600e55565b606060028054610815906128af565b610bb0338383611900565b610f1733836115ff565b610f335760405162461bcd60e51b815260040161069390612611565b6107ae848484846119cf565b6000818152600360205260409020546060906001600160a01b0316610fbe5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610693565b6000610fc8611a02565b90506000815111610fe85760405180602001604052806000815250611013565b80610ff284611a11565b6040516020016110039291906124fb565b6040516020818303038152906040525b9392505050565b61102381610c0c565b6001600160a01b0316336001600160a01b03161461108e5760405162461bcd60e51b815260206004820152602260248201527f596f75206d757374206f776e2074686520746f6b656e20746f20747261766572604482015261736560f01b6064820152608401610693565b61ffff8216600090815260096020526040812080546110ac906128af565b9050116111125760405162461bcd60e51b815260206004820152602e60248201527f5468697320636861696e2069732063757272656e746c7920756e617661696c6160448201526d189b1948199bdc881d1c985d995b60921b6064820152608401610693565b61111b81611b0e565b60408051336020820152808201839052815180820383018152606082018352600e54600160f01b60808401526082808401919091528351808403909101815260a283019384905260075463040a7bb160e41b90945290926001926000916001600160a01b0316906340a7bb109061119e908990309089908790899060a601612662565b604080518083038186803b1580156111b557600080fd5b505afa1580156111c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ed91906123ea565b509050803410156112725760405162461bcd60e51b815260206004820152604360248201527f6d73672e76616c7565206e6f7420656e6f75676820746f20636f766572206d6560448201527f73736167654665652e2053656e642067617320666f72206d657373616765206660648201526265657360e81b608482015260a401610693565b60075461ffff8716600090815260096020526040808220905162c5803160e81b81526001600160a01b039093169263c58031009234926112bd928c928b913391908b90600401612760565b6000604051808303818588803b1580156112d657600080fd5b505af11580156112ea573d6000803e3d6000fd5b5050505050505050505050565b61ffff8516600090815260086020526040808220905161131890879061246d565b90815260408051602092819003830190206001600160401b038716600090815292529020600181015490915061139f5760405162461bcd60e51b815260206004820152602660248201527f4e6f6e626c6f636b696e6752656365697665723a206e6f2073746f726564206d60448201526565737361676560d01b6064820152608401610693565b8054821480156113c95750806001015483836040516113bf92919061245d565b6040518091039020145b6114155760405162461bcd60e51b815260206004820152601a60248201527f4c617965725a65726f3a20696e76616c6964207061796c6f61640000000000006044820152606401610693565b60008082556001820155604051630e1bd41160e11b81523090631c37a8229061144a90899089908990899089906004016126b6565b600060405180830381600087803b15801561146457600080fd5b505af1158015611478573d6000803e3d6000fd5b50505050505050505050565b6000546001600160a01b031633146114ae5760405162461bcd60e51b8152600401610693906125dc565b61ffff831660009081526009602052604090206107ae908383611e4a565b6000546001600160a01b031633146114f65760405162461bcd60e51b8152600401610693906125dc565b6001600160a01b03811661155b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610693565b610d6a816118b0565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061159982610c0c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080828060200190518101906115e99190611ffb565b915091506115f78282611896565b505050505050565b6000818152600360205260408120546001600160a01b03166116785760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610693565b600061168383610c0c565b9050806001600160a01b0316846001600160a01b031614806116be5750836001600160a01b03166116b384610898565b6001600160a01b0316145b806116ee57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661170982610c0c565b6001600160a01b0316146117715760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610693565b6001600160a01b0382166117d35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610693565b6117de600082611564565b6001600160a01b038316600090815260046020526040812080546001929061180790849061286c565b90915550506001600160a01b0382166000908152600460205260408120805460019290611835908490612840565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610bb0828260405180602001604052806000815250611ba9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156119625760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610693565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6119da8484846116f6565b6119e684848484611bdc565b6107ae5760405162461bcd60e51b81526004016106939061258a565b6060600b8054610815906128af565b606081611a355750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611a5f5780611a49816128ea565b9150611a589050600a83612858565b9150611a39565b6000816001600160401b03811115611a7957611a7961295b565b6040519080825280601f01601f191660200182016040528015611aa3576020820181803683370190505b5090505b84156116ee57611ab860018361286c565b9150611ac5600a86612905565b611ad0906030612840565b60f81b818381518110611ae557611ae5612945565b60200101906001600160f81b031916908160001a905350611b07600a86612858565b9450611aa7565b6000611b1982610c0c565b9050611b26600083611564565b6001600160a01b0381166000908152600460205260408120805460019290611b4f90849061286c565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b611bb38383611ce9565b611bc06000848484611bdc565b610a3e5760405162461bcd60e51b81526004016106939061258a565b60006001600160a01b0384163b15611cde57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c2090339089908890889060040161253a565b602060405180830381600087803b158015611c3a57600080fd5b505af1925050508015611c6a575060408051601f3d908101601f19168201909252611c679181019061218a565b60015b611cc4573d808015611c98576040519150601f19603f3d011682016040523d82523d6000602084013e611c9d565b606091505b508051611cbc5760405162461bcd60e51b81526004016106939061258a565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506116ee565b506001949350505050565b6001600160a01b038216611d3f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610693565b6001600160a01b0382166000908152600460205260408120805460019290611d68908490612840565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611dd2906128af565b90600052602060002090601f016020900481019282611df45760008555611e3a565b82601f10611e0d57805160ff1916838001178555611e3a565b82800160010185558215611e3a579182015b82811115611e3a578251825591602001919060010190611e1f565b50611e46929150611ebe565b5090565b828054611e56906128af565b90600052602060002090601f016020900481019282611e785760008555611e3a565b82601f10611e915782800160ff19823516178555611e3a565b82800160010185558215611e3a579182015b82811115611e3a578235825591602001919060010190611ea3565b5b80821115611e465760008155600101611ebf565b60006001600160401b0380841115611eed57611eed61295b565b604051601f8501601f19908116603f01168101908282118183101715611f1557611f1561295b565b81604052809350858152868686011115611f2e57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112611f5a57600080fd5b5081356001600160401b03811115611f7157600080fd5b602083019150836020828501011115611f8957600080fd5b9250929050565b600082601f830112611fa157600080fd5b61101383833560208501611ed3565b803561ffff81168114611fc257600080fd5b919050565b80356001600160401b0381168114611fc257600080fd5b600060208284031215611ff057600080fd5b813561101381612971565b6000806040838503121561200e57600080fd5b825161201981612971565b6020939093015192949293505050565b6000806040838503121561203c57600080fd5b823561204781612971565b9150602083013561205781612971565b809150509250929050565b60008060006060848603121561207757600080fd5b833561208281612971565b9250602084013561209281612971565b929592945050506040919091013590565b600080600080608085870312156120b957600080fd5b84356120c481612971565b935060208501356120d481612971565b92506040850135915060608501356001600160401b038111156120f657600080fd5b61210287828801611f90565b91505092959194509250565b6000806040838503121561212157600080fd5b823561212c81612971565b91506020830135801515811461205757600080fd5b6000806040838503121561215457600080fd5b823561215f81612971565b946020939093013593505050565b60006020828403121561217f57600080fd5b813561101381612986565b60006020828403121561219c57600080fd5b815161101381612986565b6000602082840312156121b957600080fd5b81356001600160401b038111156121cf57600080fd5b8201601f810184136121e057600080fd5b6116ee84823560208401611ed3565b60006020828403121561220157600080fd5b61101382611fb0565b60008060006040848603121561221f57600080fd5b61222884611fb0565b925060208401356001600160401b0381111561224357600080fd5b61224f86828701611f48565b9497909650939450505050565b60008060006060848603121561227157600080fd5b61227a84611fb0565b925060208401356001600160401b0381111561229557600080fd5b6122a186828701611f90565b925050604084013590509250925092565b6000806000806000608086880312156122ca57600080fd5b6122d386611fb0565b945060208601356001600160401b03808211156122ef57600080fd5b6122fb89838a01611f90565b955061230960408901611fc7565b9450606088013591508082111561231f57600080fd5b5061232c88828901611f48565b969995985093965092949392505050565b6000806000806080858703121561235357600080fd5b61235c85611fb0565b935060208501356001600160401b038082111561237857600080fd5b61238488838901611f90565b945061239260408801611fc7565b935060608701359150808211156123a857600080fd5b5061210287828801611f90565b600080604083850312156123c857600080fd5b61215f83611fb0565b6000602082840312156123e357600080fd5b5035919050565b600080604083850312156123fd57600080fd5b505080516020909101519092909150565b60006020828403121561242057600080fd5b813560ff8116811461101357600080fd5b60008151808452612449816020860160208601612883565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b6000825161247f818460208701612883565b9190910192915050565b6000808354612497816128af565b600182811680156124af57600181146124c0576124ef565b60ff198416875282870194506124ef565b8760005260208060002060005b858110156124e65781548a8201529084019082016124cd565b50505082870194505b50929695505050505050565b6000835161250d818460208801612883565b835190830190612521818360208801612883565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061256d90830184612431565b9695505050505050565b6020815260006110136020830184612431565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061269090830186612431565b841515606084015282810360808401526126aa8185612431565b98975050505050505050565b61ffff861681526080602082015260006126d36080830187612431565b6001600160401b03861660408401528281036060840152838152838560208301376000602085830101526020601f19601f8601168201019150509695505050505050565b61ffff851681526080602082015260006127346080830186612431565b6001600160401b038516604084015282810360608401526127558185612431565b979650505050505050565b61ffff871681526000602060c0818401526000885461277e816128af565b8060c087015260e06001808416600081146127a057600181146127b5576127e3565b60ff19851689840152610100890195506127e3565b8d6000528660002060005b858110156127db5781548b82018601529083019088016127c0565b8a0184019650505b505050505083810360408501526127fa8189612431565b91505061281260608401876001600160a01b03169052565b6001600160a01b038516608084015282810360a08401526128338185612431565b9998505050505050505050565b6000821982111561285357612853612919565b500190565b6000826128675761286761292f565b500490565b60008282101561287e5761287e612919565b500390565b60005b8381101561289e578181015183820152602001612886565b838111156107ae5750506000910152565b600181811c908216806128c357607f821691505b602082108114156128e457634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156128fe576128fe612919565b5060010190565b6000826129145761291461292f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610d6a57600080fd5b6001600160e01b031981168114610d6a57600080fdfea26469706673582212201d4555a2ad187a51cfb1650ffeac4ccad5f280fcf13e02d7eccaaa79a73aec6a64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000004000000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6750000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d585342436f3964344148526177457033764843523363325a4a474d66336f36576274647976385665347a4c722f00000000000000000000
-----Decoded View---------------
Arg [0] : baseURI_ (string): ipfs://QmXSBCo9d4AHRawEp3vHCR3c2ZJGMf3o6Wbtdyv8Ve4zLr/
Arg [1] : _layerZeroEndpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [3] : 697066733a2f2f516d585342436f396434414852617745703376484352336332
Arg [4] : 5a4a474d66336f36576274647976385665347a4c722f00000000000000000000
Deployed Bytecode Sourcemap
47351:3806:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44565:949;;;;;;;;;;-1:-1:-1;44565:949:0;;;;;:::i;:::-;;:::i;:::-;;31629:305;;;;;;;;;;-1:-1:-1;31629:305:0;;;;;:::i;:::-;;:::i;:::-;;;12969:14:1;;12962:22;12944:41;;12932:2;12917:18;31629:305:0;;;;;;;;32574:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34142:221::-;;;;;;;;;;-1:-1:-1;34142:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;11988:32:1;;;11970:51;;11958:2;11943:18;34142:221:0;11824:203:1;33665:411:0;;;;;;;;;;-1:-1:-1;33665:411:0;;;;;:::i;:::-;;:::i;45522:356::-;;;;;;;;;;-1:-1:-1;45522:356:0;;;;;:::i;:::-;;:::i;34892:339::-;;;;;;;;;;-1:-1:-1;34892:339:0;;;;;:::i;:::-;;:::i;50236:170::-;;;;;;;;;;-1:-1:-1;50236:170:0;;;;;:::i;:::-;;:::i;35302:185::-;;;;;;;;;;-1:-1:-1;35302:185:0;;;;;:::i;:::-;;:::i;50010:90::-;;;;;;;;;;-1:-1:-1;50010:90:0;;;;;:::i;:::-;;:::i;32268:239::-;;;;;;;;;;-1:-1:-1;32268:239:0;;;;;:::i;:::-;;:::i;47930:346::-;;;;;;:::i;:::-;;:::i;31998:208::-;;;;;;;;;;-1:-1:-1;31998:208:0;;;;;:::i;:::-;;:::i;:::-;;;26988:25:1;;;26976:2;26961:18;31998:208:0;26842:177:1;12617:103:0;;;;;;;;;;;;;:::i;44407:51::-;;;;;;;;;;-1:-1:-1;44407:51:0;;;;;:::i;:::-;;:::i;11966:87::-;;;;;;;;;;-1:-1:-1;12012:7:0;12039:6;-1:-1:-1;;;;;12039:6:0;11966:87;;44310:90;;;;;;;;;;-1:-1:-1;44310:90:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27198:25:1;;;27254:2;27239:18;;27232:34;;;;27171:18;44310:90:0;27024:248:1;50490:125:0;;;;;;;;;;-1:-1:-1;50490:125:0;;;;;:::i;:::-;;:::i;32743:104::-;;;;;;;;;;;;;:::i;34435:155::-;;;;;;;;;;-1:-1:-1;34435:155:0;;;;;:::i;:::-;;:::i;47418:21::-;;;;;;;;;;-1:-1:-1;47418:21:0;;;;-1:-1:-1;;;;;47418:21:0;;;35558:328;;;;;;;;;;-1:-1:-1;35558:328:0;;;;;:::i;:::-;;:::i;32918:343::-;;;;;;;;;;-1:-1:-1;32918:343:0;;;;;:::i;:::-;;:::i;48416:1584::-;;;;;;:::i;:::-;;:::i;46354:758::-;;;;;;:::i;:::-;;:::i;34661:164::-;;;;;;;;;;-1:-1:-1;34661:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34782:25:0;;;34758:4;34782:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34661:164;47120:158;;;;;;;;;;-1:-1:-1;47120:158:0;;;;;:::i;:::-;;:::i;12875:201::-;;;;;;;;;;-1:-1:-1;12875:201:0;;;;;:::i;:::-;;:::i;44565:949::-;44727:8;;-1:-1:-1;;;;;44727:8:0;44705:10;:31;44697:40;;;;;;44848:32;;;;;;;:19;:32;;;;;:39;;;;;:::i;:::-;;;44826:11;:18;:61;:134;;;;-1:-1:-1;44927:32:0;;;;;;;:19;:32;;;;;;;44917:43;;;;44927:32;44917:43;:::i;:::-;;;;;;;;44901:11;44891:22;;;;;;:69;44826:134;44818:213;;;;-1:-1:-1;;;44818:213:0;;20787:2:1;44818:213:0;;;20769:21:1;20826:2;20806:18;;;20799:30;20865:34;20845:18;;;20838:62;-1:-1:-1;;;20916:18:1;;;20909:50;20976:19;;44818:213:0;;;;;;;;;45159:60;;-1:-1:-1;;;45159:60:0;;:4;;:16;;:60;;45176:11;;45189;;45202:6;;45210:8;;45159:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45155:352;;45366:52;;;;;;;;45381:8;:15;45366:52;;;;45408:8;45398:19;;;;;;45366:52;;;45315:14;:27;45330:11;45315:27;;;;;;;;;;;;;;;45343:11;45315:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45315:48:0;;;;;;;;;;;;;:103;;;;;;;;;;;;;;;45438:57;;;;45452:11;;45465;;45356:6;;45486:8;;45438:57;:::i;:::-;;;;;;;;45155:352;44565:949;;;;:::o;31629:305::-;31731:4;-1:-1:-1;;;;;;31768:40:0;;-1:-1:-1;;;31768:40:0;;:105;;-1:-1:-1;;;;;;;31825:48:0;;-1:-1:-1;;;31825:48:0;31768:105;:158;;;-1:-1:-1;;;;;;;;;;24507:40:0;;;31890:36;31748:178;31629:305;-1:-1:-1;;31629:305:0:o;32574:100::-;32628:13;32661:5;32654:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32574:100;:::o;34142:221::-;34218:7;37485:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37485:16:0;34238:73;;;;-1:-1:-1;;;34238:73:0;;20013:2:1;34238:73:0;;;19995:21:1;20052:2;20032:18;;;20025:30;20091:34;20071:18;;;20064:62;-1:-1:-1;;;20142:18:1;;;20135:42;20194:19;;34238:73:0;19811:408:1;34238:73:0;-1:-1:-1;34331:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34331:24:0;;34142:221::o;33665:411::-;33746:13;33762:23;33777:7;33762:14;:23::i;:::-;33746:39;;33810:5;-1:-1:-1;;;;;33804:11:0;:2;-1:-1:-1;;;;;33804:11:0;;;33796:57;;;;-1:-1:-1;;;33796:57:0;;22387:2:1;33796:57:0;;;22369:21:1;22426:2;22406:18;;;22399:30;22465:34;22445:18;;;22438:62;-1:-1:-1;;;22516:18:1;;;22509:31;22557:19;;33796:57:0;22185:397:1;33796:57:0;10770:10;-1:-1:-1;;;;;33888:21:0;;;;:62;;-1:-1:-1;33913:37:0;33930:5;10770:10;34661:164;:::i;33913:37::-;33866:168;;;;-1:-1:-1;;;33866:168:0;;17994:2:1;33866:168:0;;;17976:21:1;18033:2;18013:18;;;18006:30;18072:34;18052:18;;;18045:62;18143:26;18123:18;;;18116:54;18187:19;;33866:168:0;17792:420:1;33866:168:0;34047:21;34056:2;34060:7;34047:8;:21::i;:::-;33735:341;33665:411;;:::o;45522:356::-;45691:10;45713:4;45691:27;45683:83;;;;-1:-1:-1;;;45683:83:0;;19240:2:1;45683:83:0;;;19222:21:1;19279:2;19259:18;;;19252:30;19318:34;19298:18;;;19291:62;-1:-1:-1;;;19369:18:1;;;19362:41;19420:19;;45683:83:0;19038:407:1;45683:83:0;45815:55;45827:11;45840;45853:6;45861:8;45815:10;:55::i;34892:339::-;35087:41;10770:10;35120:7;35087:18;:41::i;:::-;35079:103;;;;-1:-1:-1;;;35079:103:0;;;;;;;:::i;:::-;35195:28;35205:4;35211:2;35215:7;35195:9;:28::i;50236:170::-;12012:7;12039:6;-1:-1:-1;;;;;12039:6:0;10770:10;12186:23;12178:68;;;;-1:-1:-1;;;12178:68:0;;;;;;;:::i;:::-;50318:6:::1;::::0;50310:36:::1;::::0;50295:9:::1;::::0;-1:-1:-1;;;;;50318:6:0::1;::::0;50338:3;;50295:9;50310:36;50295:9;50310:36;50338:3;50318:6;50310:36:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50294:52;;;50365:4;50357:41;;;::::0;-1:-1:-1;;;50357:41:0;;22034:2:1;50357:41:0::1;::::0;::::1;22016:21:1::0;22073:2;22053:18;;;22046:30;22112:26;22092:18;;;22085:54;22156:18;;50357:41:0::1;21832:348:1::0;50357:41:0::1;50283:123;50236:170:::0;:::o;35302:185::-;35440:39;35457:4;35463:2;35467:7;35440:39;;;;;;;;;;;;:16;:39::i;50010:90::-;12012:7;12039:6;-1:-1:-1;;;;;12039:6:0;10770:10;12186:23;12178:68;;;;-1:-1:-1;;;12178:68:0;;;;;;;:::i;:::-;50079:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;32268:239::-:0;32340:7;32376:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32376:16:0;32411:19;32403:73;;;;-1:-1:-1;;;32403:73:0;;18830:2:1;32403:73:0;;;18812:21:1;18869:2;18849:18;;;18842:30;18908:34;18888:18;;;18881:62;-1:-1:-1;;;18959:18:1;;;18952:39;19008:19;;32403:73:0;18628:405:1;47930:346:0;48009:1;47997:9;:13;;;47989:52;;;;-1:-1:-1;;;47989:52:0;;17639:2:1;47989:52:0;;;17621:21:1;17678:2;17658:18;;;17651:30;17717:28;17697:18;;;17690:56;17763:18;;47989:52:0;17437:350:1;47989:52:0;48087:17;;48074:9;48060:23;;:11;;:23;;;;:::i;:::-;:44;;48052:76;;;;-1:-1:-1;;;48052:76:0;;16878:2:1;48052:76:0;;;16860:21:1;16917:2;16897:18;;;16890:30;-1:-1:-1;;;16936:18:1;;;16929:49;16995:18;;48052:76:0;16676:343:1;48052:76:0;48139:36;48149:10;48163:11;;48161:13;;;;;:::i;:::-;;;;;-1:-1:-1;48139:9:0;:36::i;:::-;48190:9;:14;;48203:1;48190:14;48186:83;;;48221:36;48231:10;48245:11;;48243:13;;;;;:::i;48221:36::-;47930:346;:::o;31998:208::-;32070:7;-1:-1:-1;;;;;32098:19:0;;32090:74;;;;-1:-1:-1;;;32090:74:0;;18419:2:1;32090:74:0;;;18401:21:1;18458:2;18438:18;;;18431:30;18497:34;18477:18;;;18470:62;-1:-1:-1;;;18548:18:1;;;18541:40;18598:19;;32090:74:0;18217:406:1;32090:74:0;-1:-1:-1;;;;;;32182:16:0;;;;;:9;:16;;;;;;;31998:208::o;12617:103::-;12012:7;12039:6;-1:-1:-1;;;;;12039:6:0;10770:10;12186:23;12178:68;;;;-1:-1:-1;;;12178:68:0;;;;;;;:::i;:::-;12682:30:::1;12709:1;12682:18;:30::i;:::-;12617:103::o:0;44407:51::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;50490:125::-;12012:7;12039:6;-1:-1:-1;;;;;12039:6:0;10770:10;12186:23;12178:68;;;;-1:-1:-1;;;12178:68:0;;;;;;;:::i;:::-;50572:26:::1;:35:::0;50490:125::o;32743:104::-;32799:13;32832:7;32825:14;;;;;:::i;34435:155::-;34530:52;10770:10;34563:8;34573;34530:18;:52::i;35558:328::-;35733:41;10770:10;35766:7;35733:18;:41::i;:::-;35725:103;;;;-1:-1:-1;;;35725:103:0;;;;;;;:::i;:::-;35839:39;35853:4;35859:2;35863:7;35872:5;35839:13;:39::i;32918:343::-;37461:4;37485:16;;;:7;:16;;;;;;32991:13;;-1:-1:-1;;;;;37485:16:0;33017:76;;;;-1:-1:-1;;;33017:76:0;;21618:2:1;33017:76:0;;;21600:21:1;21657:2;21637:18;;;21630:30;21696:34;21676:18;;;21669:62;-1:-1:-1;;;21747:18:1;;;21740:45;21802:19;;33017:76:0;21416:411:1;33017:76:0;33106:21;33130:10;:8;:10::i;:::-;33106:34;;33182:1;33164:7;33158:21;:25;:95;;;;;;;;;;;;;;;;;33210:7;33219:18;:7;:16;:18::i;:::-;33193:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33158:95;33151:102;32918:343;-1:-1:-1;;;32918:343:0:o;48416:1584::-;48519:16;48527:7;48519;:16::i;:::-;-1:-1:-1;;;;;48505:30:0;:10;-1:-1:-1;;;;;48505:30:0;;48497:77;;;;-1:-1:-1;;;48497:77:0;;16475:2:1;48497:77:0;;;16457:21:1;16514:2;16494:18;;;16487:30;16553:34;16533:18;;;16526:62;-1:-1:-1;;;16604:18:1;;;16597:32;16646:19;;48497:77:0;16273:398:1;48497:77:0;48593:29;;;48632:1;48593:29;;;:19;:29;;;;;:36;;;;;:::i;:::-;;;:40;48585:99;;;;-1:-1:-1;;;48585:99:0;;15705:2:1;48585:99:0;;;15687:21:1;15744:2;15724:18;;;15717:30;15783:34;15763:18;;;15756:62;-1:-1:-1;;;15834:18:1;;;15827:44;15888:19;;48585:99:0;15503:410:1;48585:99:0;48764:14;48770:7;48764:5;:14::i;:::-;48875:31;;;48886:10;48875:31;;;12699:51:1;12766:18;;;12759:34;;;48875:31:0;;;;;;;;;12672:18:1;;;48875:31:0;;49076:26;;-1:-1:-1;;;49050:53:0;;;11698:51:1;11765:11;;;;11758:27;;;;49050:53:0;;;;;;;;;;11801:12:1;;;49050:53:0;;;;49279:8;;-1:-1:-1;;;49279:77:0;;;48875:31;;49009:1;;-1:-1:-1;;;;;;;49279:8:0;;:21;;:77;;49301:8;;49319:4;;48875:31;;-1:-1:-1;;49050:53:0;;49279:77;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49257:99;;;49398:10;49385:9;:23;;49377:103;;;;-1:-1:-1;;;49377:103:0;;13644:2:1;49377:103:0;;;13626:21:1;13683:2;13663:18;;;13656:30;13722:34;13702:18;;;13695:62;13793:34;13773:18;;;13766:62;-1:-1:-1;;;13844:19:1;;;13837:34;13888:19;;49377:103:0;13442:471:1;49377:103:0;49493:8;;49611:29;;;49493:8;49611:29;;;:19;:29;;;;;;49493:499;;-1:-1:-1;;;49493:499:0;;-1:-1:-1;;;;;49493:8:0;;;;:13;;49514:9;;49493:499;;49539:8;;49699:7;;49782:10;;49493:8;49929:13;;49493:499;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48486:1514;;;;48416:1584;;:::o;46354:758::-;46570:27;;;46535:32;46570:27;;;:14;:27;;;;;;:40;;;;46598:11;;46570:40;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46570:48:0;;;;;;;;;;46637:21;;;;46570:48;;-1:-1:-1;46629:86:0;;;;-1:-1:-1;;;46629:86:0;;23207:2:1;46629:86:0;;;23189:21:1;23246:2;23226:18;;;23219:30;23285:34;23265:18;;;23258:62;-1:-1:-1;;;23336:18:1;;;23329:36;23382:19;;46629:86:0;23005:402:1;46629:86:0;46753:23;;46734:42;;:90;;;;;46803:9;:21;;;46790:8;;46780:19;;;;;;;:::i;:::-;;;;;;;;:44;46734:90;46726:129;;;;-1:-1:-1;;;46726:129:0;;16120:2:1;46726:129:0;;;16102:21:1;16159:2;16139:18;;;16132:30;16198:28;16178:18;;;16171:56;16244:18;;46726:129:0;15918:350:1;46726:129:0;46929:1;46903:27;;;46941:21;;;:34;47044:60;;-1:-1:-1;;;47044:60:0;;:4;;:16;;:60;;47061:11;;47074;;47087:6;;47095:8;;;;47044:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46479:633;46354:758;;;;;:::o;47120:158::-;12012:7;12039:6;-1:-1:-1;;;;;12039:6:0;10770:10;12186:23;12178:68;;;;-1:-1:-1;;;12178:68:0;;;;;;;:::i;:::-;47224:29:::1;::::0;::::1;;::::0;;;:19:::1;:29;::::0;;;;:46:::1;::::0;47256:14;;47224:46:::1;:::i;12875:201::-:0;12012:7;12039:6;-1:-1:-1;;;;;12039:6:0;10770:10;12186:23;12178:68;;;;-1:-1:-1;;;12178:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12964:22:0;::::1;12956:73;;;::::0;-1:-1:-1;;;12956:73:0;;14539:2:1;12956:73:0::1;::::0;::::1;14521:21:1::0;14578:2;14558:18;;;14551:30;14617:34;14597:18;;;14590:62;-1:-1:-1;;;14668:18:1;;;14661:36;14714:19;;12956:73:0::1;14337:402:1::0;12956:73:0::1;13040:28;13059:8;13040:18;:28::i;41309:174::-:0;41384:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;41384:29:0;-1:-1:-1;;;;;41384:29:0;;;;;;;;:24;;41438:23;41384:24;41438:14;:23::i;:::-;-1:-1:-1;;;;;41429:46:0;;;;;;;;;;;41309:174;;:::o;50706:338::-;50859:14;50875:12;50902:8;50891:37;;;;;;;;;;;;:::i;:::-;50858:70;;;;51010:26;51020:6;51028:7;51010:9;:26::i;:::-;50828:216;;50706:338;;;;:::o;37690:348::-;37783:4;37485:16;;;:7;:16;;;;;;-1:-1:-1;;;;;37485:16:0;37800:73;;;;-1:-1:-1;;;37800:73:0;;17226:2:1;37800:73:0;;;17208:21:1;17265:2;17245:18;;;17238:30;17304:34;17284:18;;;17277:62;-1:-1:-1;;;17355:18:1;;;17348:42;17407:19;;37800:73:0;17024:408:1;37800:73:0;37884:13;37900:23;37915:7;37900:14;:23::i;:::-;37884:39;;37953:5;-1:-1:-1;;;;;37942:16:0;:7;-1:-1:-1;;;;;37942:16:0;;:51;;;;37986:7;-1:-1:-1;;;;;37962:31:0;:20;37974:7;37962:11;:20::i;:::-;-1:-1:-1;;;;;37962:31:0;;37942:51;:87;;;-1:-1:-1;;;;;;34782:25:0;;;34758:4;34782:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;37997:32;37934:96;37690:348;-1:-1:-1;;;;37690:348:0:o;40613:578::-;40772:4;-1:-1:-1;;;;;40745:31:0;:23;40760:7;40745:14;:23::i;:::-;-1:-1:-1;;;;;40745:31:0;;40737:85;;;;-1:-1:-1;;;40737:85:0;;21208:2:1;40737:85:0;;;21190:21:1;21247:2;21227:18;;;21220:30;21286:34;21266:18;;;21259:62;-1:-1:-1;;;21337:18:1;;;21330:39;21386:19;;40737:85:0;21006:405:1;40737:85:0;-1:-1:-1;;;;;40841:16:0;;40833:65;;;;-1:-1:-1;;;40833:65:0;;14946:2:1;40833:65:0;;;14928:21:1;14985:2;14965:18;;;14958:30;15024:34;15004:18;;;14997:62;-1:-1:-1;;;15075:18:1;;;15068:34;15119:19;;40833:65:0;14744:400:1;40833:65:0;41015:29;41032:1;41036:7;41015:8;:29::i;:::-;-1:-1:-1;;;;;41057:15:0;;;;;;:9;:15;;;;;:20;;41076:1;;41057:15;:20;;41076:1;;41057:20;:::i;:::-;;;;-1:-1:-1;;;;;;;41088:13:0;;;;;;:9;:13;;;;;:18;;41105:1;;41088:13;:18;;41105:1;;41088:18;:::i;:::-;;;;-1:-1:-1;;41117:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41117:21:0;-1:-1:-1;;;;;41117:21:0;;;;;;;;;41156:27;;41117:16;;41156:27;;;;;;;40613:578;;;:::o;38380:110::-;38456:26;38466:2;38470:7;38456:26;;;;;;;;;;;;:9;:26::i;13236:191::-;13310:16;13329:6;;-1:-1:-1;;;;;13346:17:0;;;-1:-1:-1;;;;;;13346:17:0;;;;;;13379:40;;13329:6;;;;;;;13379:40;;13310:16;13379:40;13299:128;13236:191;:::o;41625:315::-;41780:8;-1:-1:-1;;;;;41771:17:0;:5;-1:-1:-1;;;;;41771:17:0;;;41763:55;;;;-1:-1:-1;;;41763:55:0;;15351:2:1;41763:55:0;;;15333:21:1;15390:2;15370:18;;;15363:30;15429:27;15409:18;;;15402:55;15474:18;;41763:55:0;15149:349:1;41763:55:0;-1:-1:-1;;;;;41829:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;41829:46:0;;;;;;;;;;41891:41;;12944::1;;;41891::0;;12917:18:1;41891:41:0;;;;;;;41625:315;;;:::o;36768:::-;36925:28;36935:4;36941:2;36945:7;36925:9;:28::i;:::-;36972:48;36995:4;37001:2;37005:7;37014:5;36972:22;:48::i;:::-;36964:111;;;;-1:-1:-1;;;36964:111:0;;;;;;;:::i;51054:100::-;51106:13;51139:7;51132:14;;;;;:::i;8252:723::-;8308:13;8529:10;8525:53;;-1:-1:-1;;8556:10:0;;;;;;;;;;;;-1:-1:-1;;;8556:10:0;;;;;8252:723::o;8525:53::-;8603:5;8588:12;8644:78;8651:9;;8644:78;;8677:8;;;;:::i;:::-;;-1:-1:-1;8700:10:0;;-1:-1:-1;8708:2:0;8700:10;;:::i;:::-;;;8644:78;;;8732:19;8764:6;-1:-1:-1;;;;;8754:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8754:17:0;;8732:39;;8782:154;8789:10;;8782:154;;8816:11;8826:1;8816:11;;:::i;:::-;;-1:-1:-1;8885:10:0;8893:2;8885:5;:10;:::i;:::-;8872:24;;:2;:24;:::i;:::-;8859:39;;8842:6;8849;8842:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8842:56:0;;;;;;;;-1:-1:-1;8913:11:0;8922:2;8913:11;;:::i;:::-;;;8782:154;;39916:360;39976:13;39992:23;40007:7;39992:14;:23::i;:::-;39976:39;;40117:29;40134:1;40138:7;40117:8;:29::i;:::-;-1:-1:-1;;;;;40159:16:0;;;;;;:9;:16;;;;;:21;;40179:1;;40159:16;:21;;40179:1;;40159:21;:::i;:::-;;;;-1:-1:-1;;40198:16:0;;;;:7;:16;;;;;;40191:23;;-1:-1:-1;;;;;;40191:23:0;;;40232:36;40206:7;;40198:16;-1:-1:-1;;;;;40232:36:0;;;;;40198:16;;40232:36;39965:311;39916:360;:::o;38717:321::-;38847:18;38853:2;38857:7;38847:5;:18::i;:::-;38898:54;38929:1;38933:2;38937:7;38946:5;38898:22;:54::i;:::-;38876:154;;;;-1:-1:-1;;;38876:154:0;;;;;;;:::i;42505:799::-;42660:4;-1:-1:-1;;;;;42681:13:0;;14577:20;14625:8;42677:620;;42717:72;;-1:-1:-1;;;42717:72:0;;-1:-1:-1;;;;;42717:36:0;;;;;:72;;10770:10;;42768:4;;42774:7;;42783:5;;42717:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42717:72:0;;;;;;;;-1:-1:-1;;42717:72:0;;;;;;;;;;;;:::i;:::-;;;42713:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42959:13:0;;42955:272;;43002:60;;-1:-1:-1;;;43002:60:0;;;;;;;:::i;42955:272::-;43177:6;43171:13;43162:6;43158:2;43154:15;43147:38;42713:529;-1:-1:-1;;;;;;42840:51:0;-1:-1:-1;;;42840:51:0;;-1:-1:-1;42833:58:0;;42677:620;-1:-1:-1;43281:4:0;42505:799;;;;;;:::o;39374:313::-;-1:-1:-1;;;;;39454:16:0;;39446:61;;;;-1:-1:-1;;;39446:61:0;;19652:2:1;39446:61:0;;;19634:21:1;;;19671:18;;;19664:30;19730:34;19710:18;;;19703:62;19782:18;;39446:61:0;19450:356:1;39446:61:0;-1:-1:-1;;;;;39578:13:0;;;;;;:9;:13;;;;;:18;;39595:1;;39578:13;:18;;39595:1;;39578:18;:::i;:::-;;;;-1:-1:-1;;39607:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;39607:21:0;-1:-1:-1;;;;;39607:21:0;;;;;;;;39646:33;;39607:16;;;39646:33;;39607:16;;39646:33;39374:313;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;-1:-1:-1;;;;;149:2:1;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:347::-;701:8;711:6;765:3;758:4;750:6;746:17;742:27;732:55;;783:1;780;773:12;732:55;-1:-1:-1;806:20:1;;-1:-1:-1;;;;;838:30:1;;835:50;;;881:1;878;871:12;835:50;918:4;910:6;906:17;894:29;;970:3;963:4;954:6;946;942:19;938:30;935:39;932:59;;;987:1;984;977:12;932:59;650:347;;;;;:::o;1002:220::-;1044:5;1097:3;1090:4;1082:6;1078:17;1074:27;1064:55;;1115:1;1112;1105:12;1064:55;1137:79;1212:3;1203:6;1190:20;1183:4;1175:6;1171:17;1137:79;:::i;1227:159::-;1294:20;;1354:6;1343:18;;1333:29;;1323:57;;1376:1;1373;1366:12;1323:57;1227:159;;;:::o;1391:171::-;1458:20;;-1:-1:-1;;;;;1507:30:1;;1497:41;;1487:69;;1552:1;1549;1542:12;1567:247;1626:6;1679:2;1667:9;1658:7;1654:23;1650:32;1647:52;;;1695:1;1692;1685:12;1647:52;1734:9;1721:23;1753:31;1778:5;1753:31;:::i;1819:320::-;1906:6;1914;1967:2;1955:9;1946:7;1942:23;1938:32;1935:52;;;1983:1;1980;1973:12;1935:52;2015:9;2009:16;2034:31;2059:5;2034:31;:::i;:::-;2129:2;2114:18;;;;2108:25;2084:5;;2108:25;;-1:-1:-1;;;1819:320:1:o;2144:388::-;2212:6;2220;2273:2;2261:9;2252:7;2248:23;2244:32;2241:52;;;2289:1;2286;2279:12;2241:52;2328:9;2315:23;2347:31;2372:5;2347:31;:::i;:::-;2397:5;-1:-1:-1;2454:2:1;2439:18;;2426:32;2467:33;2426:32;2467:33;:::i;:::-;2519:7;2509:17;;;2144:388;;;;;:::o;2537:456::-;2614:6;2622;2630;2683:2;2671:9;2662:7;2658:23;2654:32;2651:52;;;2699:1;2696;2689:12;2651:52;2738:9;2725:23;2757:31;2782:5;2757:31;:::i;:::-;2807:5;-1:-1:-1;2864:2:1;2849:18;;2836:32;2877:33;2836:32;2877:33;:::i;:::-;2537:456;;2929:7;;-1:-1:-1;;;2983:2:1;2968:18;;;;2955:32;;2537:456::o;2998:665::-;3093:6;3101;3109;3117;3170:3;3158:9;3149:7;3145:23;3141:33;3138:53;;;3187:1;3184;3177:12;3138:53;3226:9;3213:23;3245:31;3270:5;3245:31;:::i;:::-;3295:5;-1:-1:-1;3352:2:1;3337:18;;3324:32;3365:33;3324:32;3365:33;:::i;:::-;3417:7;-1:-1:-1;3471:2:1;3456:18;;3443:32;;-1:-1:-1;3526:2:1;3511:18;;3498:32;-1:-1:-1;;;;;3542:30:1;;3539:50;;;3585:1;3582;3575:12;3539:50;3608:49;3649:7;3640:6;3629:9;3625:22;3608:49;:::i;:::-;3598:59;;;2998:665;;;;;;;:::o;3668:416::-;3733:6;3741;3794:2;3782:9;3773:7;3769:23;3765:32;3762:52;;;3810:1;3807;3800:12;3762:52;3849:9;3836:23;3868:31;3893:5;3868:31;:::i;:::-;3918:5;-1:-1:-1;3975:2:1;3960:18;;3947:32;4017:15;;4010:23;3998:36;;3988:64;;4048:1;4045;4038:12;4089:315;4157:6;4165;4218:2;4206:9;4197:7;4193:23;4189:32;4186:52;;;4234:1;4231;4224:12;4186:52;4273:9;4260:23;4292:31;4317:5;4292:31;:::i;:::-;4342:5;4394:2;4379:18;;;;4366:32;;-1:-1:-1;;;4089:315:1:o;4409:245::-;4467:6;4520:2;4508:9;4499:7;4495:23;4491:32;4488:52;;;4536:1;4533;4526:12;4488:52;4575:9;4562:23;4594:30;4618:5;4594:30;:::i;4659:249::-;4728:6;4781:2;4769:9;4760:7;4756:23;4752:32;4749:52;;;4797:1;4794;4787:12;4749:52;4829:9;4823:16;4848:30;4872:5;4848:30;:::i;4913:450::-;4982:6;5035:2;5023:9;5014:7;5010:23;5006:32;5003:52;;;5051:1;5048;5041:12;5003:52;5091:9;5078:23;-1:-1:-1;;;;;5116:6:1;5113:30;5110:50;;;5156:1;5153;5146:12;5110:50;5179:22;;5232:4;5224:13;;5220:27;-1:-1:-1;5210:55:1;;5261:1;5258;5251:12;5210:55;5284:73;5349:7;5344:2;5331:16;5326:2;5322;5318:11;5284:73;:::i;5368:184::-;5426:6;5479:2;5467:9;5458:7;5454:23;5450:32;5447:52;;;5495:1;5492;5485:12;5447:52;5518:28;5536:9;5518:28;:::i;5557:481::-;5635:6;5643;5651;5704:2;5692:9;5683:7;5679:23;5675:32;5672:52;;;5720:1;5717;5710:12;5672:52;5743:28;5761:9;5743:28;:::i;:::-;5733:38;;5822:2;5811:9;5807:18;5794:32;-1:-1:-1;;;;;5841:6:1;5838:30;5835:50;;;5881:1;5878;5871:12;5835:50;5920:58;5970:7;5961:6;5950:9;5946:22;5920:58;:::i;:::-;5557:481;;5997:8;;-1:-1:-1;5894:84:1;;-1:-1:-1;;;;5557:481:1:o;6043:460::-;6128:6;6136;6144;6197:2;6185:9;6176:7;6172:23;6168:32;6165:52;;;6213:1;6210;6203:12;6165:52;6236:28;6254:9;6236:28;:::i;:::-;6226:38;;6315:2;6304:9;6300:18;6287:32;-1:-1:-1;;;;;6334:6:1;6331:30;6328:50;;;6374:1;6371;6364:12;6328:50;6397:49;6438:7;6429:6;6418:9;6414:22;6397:49;:::i;:::-;6387:59;;;6493:2;6482:9;6478:18;6465:32;6455:42;;6043:460;;;;;:::o;6508:773::-;6612:6;6620;6628;6636;6644;6697:3;6685:9;6676:7;6672:23;6668:33;6665:53;;;6714:1;6711;6704:12;6665:53;6737:28;6755:9;6737:28;:::i;:::-;6727:38;;6816:2;6805:9;6801:18;6788:32;-1:-1:-1;;;;;6880:2:1;6872:6;6869:14;6866:34;;;6896:1;6893;6886:12;6866:34;6919:49;6960:7;6951:6;6940:9;6936:22;6919:49;:::i;:::-;6909:59;;6987:37;7020:2;7009:9;7005:18;6987:37;:::i;:::-;6977:47;;7077:2;7066:9;7062:18;7049:32;7033:48;;7106:2;7096:8;7093:16;7090:36;;;7122:1;7119;7112:12;7090:36;;7161:60;7213:7;7202:8;7191:9;7187:24;7161:60;:::i;:::-;6508:773;;;;-1:-1:-1;6508:773:1;;-1:-1:-1;7240:8:1;;7135:86;6508:773;-1:-1:-1;;;6508:773:1:o;7286:684::-;7388:6;7396;7404;7412;7465:3;7453:9;7444:7;7440:23;7436:33;7433:53;;;7482:1;7479;7472:12;7433:53;7505:28;7523:9;7505:28;:::i;:::-;7495:38;;7584:2;7573:9;7569:18;7556:32;-1:-1:-1;;;;;7648:2:1;7640:6;7637:14;7634:34;;;7664:1;7661;7654:12;7634:34;7687:49;7728:7;7719:6;7708:9;7704:22;7687:49;:::i;:::-;7677:59;;7755:37;7788:2;7777:9;7773:18;7755:37;:::i;:::-;7745:47;;7845:2;7834:9;7830:18;7817:32;7801:48;;7874:2;7864:8;7861:16;7858:36;;;7890:1;7887;7880:12;7858:36;;7913:51;7956:7;7945:8;7934:9;7930:24;7913:51;:::i;7975:252::-;8042:6;8050;8103:2;8091:9;8082:7;8078:23;8074:32;8071:52;;;8119:1;8116;8109:12;8071:52;8142:28;8160:9;8142:28;:::i;8232:180::-;8291:6;8344:2;8332:9;8323:7;8319:23;8315:32;8312:52;;;8360:1;8357;8350:12;8312:52;-1:-1:-1;8383:23:1;;8232:180;-1:-1:-1;8232:180:1:o;8417:245::-;8496:6;8504;8557:2;8545:9;8536:7;8532:23;8528:32;8525:52;;;8573:1;8570;8563:12;8525:52;-1:-1:-1;;8596:16:1;;8652:2;8637:18;;;8631:25;8596:16;;8631:25;;-1:-1:-1;8417:245:1:o;8667:269::-;8724:6;8777:2;8765:9;8756:7;8752:23;8748:32;8745:52;;;8793:1;8790;8783:12;8745:52;8832:9;8819:23;8882:4;8875:5;8871:16;8864:5;8861:27;8851:55;;8902:1;8899;8892:12;9058:257;9099:3;9137:5;9131:12;9164:6;9159:3;9152:19;9180:63;9236:6;9229:4;9224:3;9220:14;9213:4;9206:5;9202:16;9180:63;:::i;:::-;9297:2;9276:15;-1:-1:-1;;9272:29:1;9263:39;;;;9304:4;9259:50;;9058:257;-1:-1:-1;;9058:257:1:o;9320:271::-;9503:6;9495;9490:3;9477:33;9459:3;9529:16;;9554:13;;;9529:16;9320:271;-1:-1:-1;9320:271:1:o;9596:274::-;9725:3;9763:6;9757:13;9779:53;9825:6;9820:3;9813:4;9805:6;9801:17;9779:53;:::i;:::-;9848:16;;;;;9596:274;-1:-1:-1;;9596:274:1:o;9875:811::-;10001:3;10030:1;10063:6;10057:13;10093:36;10119:9;10093:36;:::i;:::-;10148:1;10165:18;;;10192:104;;;;10310:1;10305:356;;;;10158:503;;10192:104;-1:-1:-1;;10225:24:1;;10213:37;;10270:16;;;;-1:-1:-1;10192:104:1;;10305:356;10336:6;10333:1;10326:17;10366:4;10411:2;10408:1;10398:16;10436:1;10450:165;10464:6;10461:1;10458:13;10450:165;;;10542:14;;10529:11;;;10522:35;10585:16;;;;10479:10;;10450:165;;;10454:3;;;10644:6;10639:3;10635:16;10628:23;;10158:503;-1:-1:-1;10677:3:1;;9875:811;-1:-1:-1;;;;;;9875:811:1:o;10691:637::-;10971:3;11009:6;11003:13;11025:53;11071:6;11066:3;11059:4;11051:6;11047:17;11025:53;:::i;:::-;11141:13;;11100:16;;;;11163:57;11141:13;11100:16;11197:4;11185:17;;11163:57;:::i;:::-;-1:-1:-1;;;11242:20:1;;11271:22;;;11320:1;11309:13;;10691:637;-1:-1:-1;;;;10691:637:1:o;12032:488::-;-1:-1:-1;;;;;12301:15:1;;;12283:34;;12353:15;;12348:2;12333:18;;12326:43;12400:2;12385:18;;12378:34;;;12448:3;12443:2;12428:18;;12421:31;;;12226:4;;12469:45;;12494:19;;12486:6;12469:45;:::i;:::-;12461:53;12032:488;-1:-1:-1;;;;;;12032:488:1:o;12996:217::-;13143:2;13132:9;13125:21;13106:4;13163:44;13203:2;13192:9;13188:18;13180:6;13163:44;:::i;13918:414::-;14120:2;14102:21;;;14159:2;14139:18;;;14132:30;14198:34;14193:2;14178:18;;14171:62;-1:-1:-1;;;14264:2:1;14249:18;;14242:48;14322:3;14307:19;;13918:414::o;20224:356::-;20426:2;20408:21;;;20445:18;;;20438:30;20504:34;20499:2;20484:18;;20477:62;20571:2;20556:18;;20224:356::o;22587:413::-;22789:2;22771:21;;;22828:2;22808:18;;;22801:30;22867:34;22862:2;22847:18;;22840:62;-1:-1:-1;;;22933:2:1;22918:18;;22911:47;22990:3;22975:19;;22587:413::o;23412:640::-;23693:6;23681:19;;23663:38;;-1:-1:-1;;;;;23737:32:1;;23732:2;23717:18;;23710:60;23757:3;23801:2;23786:18;;23779:31;;;-1:-1:-1;;23833:45:1;;23858:19;;23850:6;23833:45;:::i;:::-;23928:6;23921:14;23914:22;23909:2;23898:9;23894:18;23887:50;23986:9;23978:6;23974:22;23968:3;23957:9;23953:19;23946:51;24014:32;24039:6;24031;24014:32;:::i;:::-;24006:40;23412:640;-1:-1:-1;;;;;;;;23412:640:1:o;24057:717::-;24324:6;24316;24312:19;24301:9;24294:38;24368:3;24363:2;24352:9;24348:18;24341:31;24275:4;24395:45;24435:3;24424:9;24420:19;24412:6;24395:45;:::i;:::-;-1:-1:-1;;;;;24480:6:1;24476:31;24471:2;24460:9;24456:18;24449:59;24556:9;24548:6;24544:22;24539:2;24528:9;24524:18;24517:50;24591:6;24583;24576:22;24645:6;24637;24632:2;24624:6;24620:15;24607:45;24698:1;24693:2;24684:6;24676;24672:19;24668:28;24661:39;24765:2;24758;24754:7;24749:2;24741:6;24737:15;24733:29;24725:6;24721:42;24717:51;24709:59;;;24057:717;;;;;;;;:::o;24779:555::-;25036:6;25028;25024:19;25013:9;25006:38;25080:3;25075:2;25064:9;25060:18;25053:31;24987:4;25107:45;25147:3;25136:9;25132:19;25124:6;25107:45;:::i;:::-;-1:-1:-1;;;;;25192:6:1;25188:31;25183:2;25172:9;25168:18;25161:59;25268:9;25260:6;25256:22;25251:2;25240:9;25236:18;25229:50;25296:32;25321:6;25313;25296:32;:::i;:::-;25288:40;24779:555;-1:-1:-1;;;;;;;24779:555:1:o;25339:1498::-;25685:6;25677;25673:19;25662:9;25655:38;25636:4;25712:2;25750:3;25745:2;25734:9;25730:18;25723:31;25774:1;25807:6;25801:13;25837:36;25863:9;25837:36;:::i;:::-;25910:6;25904:3;25893:9;25889:19;25882:35;25936:3;25958:1;25990:2;25979:9;25975:18;26007:1;26002:122;;;;26138:1;26133:354;;;;25968:519;;26002:122;-1:-1:-1;;26050:24:1;;26030:18;;;26023:52;26110:3;26095:19;;;-1:-1:-1;26002:122:1;;26133:354;26164:6;26161:1;26154:17;26212:2;26209:1;26199:16;26237:1;26251:180;26265:6;26262:1;26259:13;26251:180;;;26358:14;;26334:17;;;26330:26;;26323:50;26401:16;;;;26280:10;;26251:180;;;26455:17;;26451:26;;;-1:-1:-1;;25968:519:1;;;;;;26532:9;26527:3;26523:19;26518:2;26507:9;26503:18;26496:47;26566:29;26591:3;26583:6;26566:29;:::i;:::-;26552:43;;;26604:54;26654:2;26643:9;26639:18;26631:6;-1:-1:-1;;;;;9015:31:1;9003:44;;8941:112;26604:54;-1:-1:-1;;;;;9015:31:1;;26717:3;26702:19;;9003:44;26771:9;26763:6;26759:22;26753:3;26742:9;26738:19;26731:51;26799:32;26824:6;26816;26799:32;:::i;:::-;26791:40;25339:1498;-1:-1:-1;;;;;;;;;25339:1498:1:o;27277:128::-;27317:3;27348:1;27344:6;27341:1;27338:13;27335:39;;;27354:18;;:::i;:::-;-1:-1:-1;27390:9:1;;27277:128::o;27410:120::-;27450:1;27476;27466:35;;27481:18;;:::i;:::-;-1:-1:-1;27515:9:1;;27410:120::o;27535:125::-;27575:4;27603:1;27600;27597:8;27594:34;;;27608:18;;:::i;:::-;-1:-1:-1;27645:9:1;;27535:125::o;27665:258::-;27737:1;27747:113;27761:6;27758:1;27755:13;27747:113;;;27837:11;;;27831:18;27818:11;;;27811:39;27783:2;27776:10;27747:113;;;27878:6;27875:1;27872:13;27869:48;;;-1:-1:-1;;27913:1:1;27895:16;;27888:27;27665:258::o;27928:380::-;28007:1;28003:12;;;;28050;;;28071:61;;28125:4;28117:6;28113:17;28103:27;;28071:61;28178:2;28170:6;28167:14;28147:18;28144:38;28141:161;;;28224:10;28219:3;28215:20;28212:1;28205:31;28259:4;28256:1;28249:15;28287:4;28284:1;28277:15;28141:161;;27928:380;;;:::o;28313:135::-;28352:3;-1:-1:-1;;28373:17:1;;28370:43;;;28393:18;;:::i;:::-;-1:-1:-1;28440:1:1;28429:13;;28313:135::o;28453:112::-;28485:1;28511;28501:35;;28516:18;;:::i;:::-;-1:-1:-1;28550:9:1;;28453:112::o;28570:127::-;28631:10;28626:3;28622:20;28619:1;28612:31;28662:4;28659:1;28652:15;28686:4;28683:1;28676:15;28702:127;28763:10;28758:3;28754:20;28751:1;28744:31;28794:4;28791:1;28784:15;28818:4;28815:1;28808:15;28834:127;28895:10;28890:3;28886:20;28883:1;28876:31;28926:4;28923:1;28916:15;28950:4;28947:1;28940:15;28966:127;29027:10;29022:3;29018:20;29015:1;29008:31;29058:4;29055:1;29048:15;29082:4;29079:1;29072:15;29098:131;-1:-1:-1;;;;;29173:31:1;;29163:42;;29153:70;;29219:1;29216;29209:12;29234:131;-1:-1:-1;;;;;;29308:32:1;;29298:43;;29288:71;;29355:1;29352;29345:12
Swarm Source
ipfs://1d4555a2ad187a51cfb1650ffeac4ccad5f280fcf13e02d7eccaaa79a73aec6a
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.