Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
4,927 TEDDY
Holders
2,064
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 TEDDYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
PsychoTeddy
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-11 */ /** *Submitted for verification at Etherscan.io on 2021-09-08 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/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/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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { 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: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: NFTToken.sol // Project By: Coin Factory Inc pragma solidity ^0.8.0; contract PsychoTeddy is ERC721Enumerable, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenId; uint256 public MAX_SUPPlY = 8000; uint256 public PRESALE_SUPPLY = 2000; uint256 public MAX_ALLOWED = 20; uint256 public MAX_PRESALE_ALLOWED = 2; uint256 public price = 66600000000000000; //0.0666 Ether string baseTokenURI; bool public saleOpen = false; bool public presaleOpen = false; event NFTMinted(uint256 totalMinted); constructor(string memory baseURI) ERC721("Psycho Teddy", "TEDDY") { setBaseURI(baseURI); } //Get token Ids of all tokens owned by _owner function walletOfOwner(address _owner) external view returns (uint256[] memory) { uint256 tokenCount = balanceOf(_owner); uint256[] memory tokensId = new uint256[](tokenCount); for (uint256 i = 0; i < tokenCount; i++) { tokensId[i] = tokenOfOwnerByIndex(_owner, i); } return tokensId; } function setBaseURI(string memory baseURI) public onlyOwner { baseTokenURI = baseURI; } function setPrice(uint256 _newPrice) public onlyOwner { price = _newPrice; } //Close presale if open, open presale if closed function pausePreSale() public onlyOwner { presaleOpen = false; } //Close sale if open, open sale if closed function unpausePreSale() public onlyOwner { presaleOpen = true; } //Close sale if open, open sale if closed function pauseSale() public onlyOwner { saleOpen = false; } //Close sale if open, open sale if closed function unpauseSale() public onlyOwner { saleOpen = true; } function withdrawAll() public onlyOwner { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Transfer failed."); } //Presale mint NFT function presaleMintNFT(uint256 _count) public payable { if (msg.sender != owner()) { require(presaleOpen, "Preale is paused please try again later"); } require( _count > 0 && _count <= MAX_PRESALE_ALLOWED, "Min 1 & Max 2 NFTs can be minted per transaction" ); if (msg.sender != owner()) { require( totalSupply() + _count <= (PRESALE_SUPPLY), "All NFTs sold" ); }else{ require( totalSupply() + _count <= (PRESALE_SUPPLY), "All Presale NFTs sold" ); } require( msg.value >= price * _count, "Ether sent with this transaction is not correct" ); address _to = msg.sender; for (uint256 i = 0; i < _count; i++) { _mint(_to); } } //mint NFT function mintNFT(uint256 _count) public payable { if (msg.sender != owner()) { require(saleOpen, "Sale is paused please try again later"); } require( _count > 0 && _count <= MAX_ALLOWED, "Min 1 & Max 20 NFTs can be minted per transaction" ); if (msg.sender != owner()) { require( totalSupply() + _count <= (MAX_SUPPlY), "All NFTs sold" ); }else{ require( totalSupply() + _count <= (MAX_SUPPlY), "All NFTs sold" ); } require( msg.value >= price * _count, "Ether sent with this transaction is not correct" ); address _to = msg.sender; for (uint256 i = 0; i < _count; i++) { _mint(_to); } } function airdrop(address[] calldata _recipients) external onlyOwner { require( totalSupply() + _recipients.length <= (MAX_SUPPlY), "Airdrop minting will exceed maximum supply" ); require(_recipients.length != 0, "Address not found for minting"); for (uint256 i = 0; i < _recipients.length; i++) { require(_recipients[i] != address(0), "Minting to Null address"); _mint(_recipients[i]); } } function _mint(address _to) private { _tokenId.increment(); uint256 tokenId = _tokenId.current(); _safeMint(_to, tokenId); emit NFTMinted(tokenId); } function _baseURI() internal view virtual override returns (string memory) { return baseTokenURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalMinted","type":"uint256"}],"name":"NFTMinted","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":"MAX_ALLOWED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRESALE_ALLOWED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPlY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":"uint256","name":"_count","type":"uint256"}],"name":"mintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pausePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"presaleMintNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpausePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpauseSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052611f40600c556107d0600d556014600e556002600f5566ec9c58de0a80006010556012805461ffff191690553480156200003d57600080fd5b5060405162002ba838038062002ba883398101604081905262000060916200026a565b604080518082018252600c81526b50737963686f20546564647960a01b602080830191825283518085019094526005845264544544445960d81b908401528151919291620000b191600091620001c4565b508051620000c7906001906020840190620001c4565b505050620000e4620000de620000f660201b60201c565b620000fa565b620000ef816200014c565b5062000399565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001c0906011906020840190620001c4565b5050565b828054620001d29062000346565b90600052602060002090601f016020900481019282620001f6576000855562000241565b82601f106200021157805160ff191683800117855562000241565b8280016001018555821562000241579182015b828111156200024157825182559160200191906001019062000224565b506200024f92915062000253565b5090565b5b808211156200024f576000815560010162000254565b600060208083850312156200027e57600080fd5b82516001600160401b03808211156200029657600080fd5b818501915085601f830112620002ab57600080fd5b815181811115620002c057620002c062000383565b604051601f8201601f19908116603f01168101908382118183101715620002eb57620002eb62000383565b8160405282815288868487010111156200030457600080fd5b600093505b8284101562000328578484018601518185018701529285019262000309565b828411156200033a5760008684830101525b98975050505050505050565b600181811c908216806200035b57607f821691505b602082108114156200037d57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6127ff80620003a96000396000f3fe60806040526004361061021a5760003560e01c8063729ad39e11610123578063a035b1fe116100ab578063bee6348a1161006f578063bee6348a146105c5578063c87b56dd146105e4578063e0f888ef14610604578063e985e9c51461061a578063f2fde38b1461066357600080fd5b8063a035b1fe14610544578063a10e80be1461055a578063a22cb46514610570578063b88d4fde14610590578063bb33d729146105b057600080fd5b806391b7f5ed116100f257806391b7f5ed146104cc57806392642744146104ec57806395d89b41146104ff57806399288dbb146105145780639a6a62371461052e57600080fd5b8063729ad39e1461046357806373138e4f14610483578063853828b6146104995780638da5cb5b146104ae57600080fd5b80634357da58116101a657806355367ba91161017557806355367ba9146103d957806355f804b3146103ee5780636352211e1461040e57806370a082311461042e578063715018a61461044e57600080fd5b80634357da5814610364578063438b6300146103795780634a8011d2146103a65780634f6ccce7146103b957600080fd5b806318160ddd116101ed57806318160ddd146102d057806323b872dd146102ef5780632f745c591461030f57806342842e0e1461032f57806342d1e8f91461034f57600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612374565b610683565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106ae565b60405161024b91906124ec565b34801561028257600080fd5b506102966102913660046123f7565b610740565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c93660046122d5565b6107da565b005b3480156102dc57600080fd5b506008545b60405190815260200161024b565b3480156102fb57600080fd5b506102ce61030a3660046121e1565b6108f0565b34801561031b57600080fd5b506102e161032a3660046122d5565b610921565b34801561033b57600080fd5b506102ce61034a3660046121e1565b6109b7565b34801561035b57600080fd5b506102ce6109d2565b34801561037057600080fd5b506102ce610a0d565b34801561038557600080fd5b50610399610394366004612193565b610a44565b60405161024b91906124a8565b6102ce6103b43660046123f7565b610ae6565b3480156103c557600080fd5b506102e16103d43660046123f7565b610cd3565b3480156103e557600080fd5b506102ce610d66565b3480156103fa57600080fd5b506102ce6104093660046123ae565b610d9c565b34801561041a57600080fd5b506102966104293660046123f7565b610ddd565b34801561043a57600080fd5b506102e1610449366004612193565b610e54565b34801561045a57600080fd5b506102ce610edb565b34801561046f57600080fd5b506102ce61047e3660046122ff565b610f11565b34801561048f57600080fd5b506102e1600d5481565b3480156104a557600080fd5b506102ce6110cc565b3480156104ba57600080fd5b50600a546001600160a01b0316610296565b3480156104d857600080fd5b506102ce6104e73660046123f7565b611184565b6102ce6104fa3660046123f7565b6111b3565b34801561050b57600080fd5b50610269611372565b34801561052057600080fd5b5060125461023f9060ff1681565b34801561053a57600080fd5b506102e1600e5481565b34801561055057600080fd5b506102e160105481565b34801561056657600080fd5b506102e1600f5481565b34801561057c57600080fd5b506102ce61058b366004612299565b611381565b34801561059c57600080fd5b506102ce6105ab36600461221d565b611446565b3480156105bc57600080fd5b506102ce61147e565b3480156105d157600080fd5b5060125461023f90610100900460ff1681565b3480156105f057600080fd5b506102696105ff3660046123f7565b6114b7565b34801561061057600080fd5b506102e1600c5481565b34801561062657600080fd5b5061023f6106353660046121ae565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561066f57600080fd5b506102ce61067e366004612193565b611592565b60006001600160e01b0319821663780e9d6360e01b14806106a857506106a88261162a565b92915050565b6060600080546106bd906126db565b80601f01602080910402602001604051908101604052809291908181526020018280546106e9906126db565b80156107365780601f1061070b57610100808354040283529160200191610736565b820191906000526020600020905b81548152906001019060200180831161071957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107be5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107e582610ddd565b9050806001600160a01b0316836001600160a01b031614156108535760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b5565b336001600160a01b038216148061086f575061086f8133610635565b6108e15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b5565b6108eb838361167a565b505050565b6108fa33826116e8565b6109165760405162461bcd60e51b81526004016107b5906125fc565b6108eb8383836117df565b600061092c83610e54565b821061098e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b5565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6108eb83838360405180602001604052806000815250611446565b600a546001600160a01b031633146109fc5760405162461bcd60e51b81526004016107b5906125c7565b6012805461ff001916610100179055565b600a546001600160a01b03163314610a375760405162461bcd60e51b81526004016107b5906125c7565b6012805461ff0019169055565b60606000610a5183610e54565b905060008167ffffffffffffffff811115610a6e57610a6e61279d565b604051908082528060200260200182016040528015610a97578160200160208202803683370190505b50905060005b82811015610ade57610aaf8582610921565b828281518110610ac157610ac1612787565b602090810291909101015280610ad681612716565b915050610a9d565b509392505050565b600a546001600160a01b03163314610b5f57601254610100900460ff16610b5f5760405162461bcd60e51b815260206004820152602760248201527f507265616c652069732070617573656420706c6561736520747279206167616960448201526637103630ba32b960c91b60648201526084016107b5565b600081118015610b715750600f548111155b610bd65760405162461bcd60e51b815260206004820152603060248201527f4d696e20312026204d61782032204e4654732063616e206265206d696e74656460448201526f103832b9103a3930b739b0b1ba34b7b760811b60648201526084016107b5565b600a546001600160a01b03163314610c2257600d5481610bf560085490565b610bff919061264d565b1115610c1d5760405162461bcd60e51b81526004016107b590612551565b610c7f565b600d5481610c2f60085490565b610c39919061264d565b1115610c7f5760405162461bcd60e51b8152602060048201526015602482015274105b1b08141c995cd85b19481391951cc81cdbdb19605a1b60448201526064016107b5565b80601054610c8d9190612679565b341015610cac5760405162461bcd60e51b81526004016107b590612578565b3360005b828110156108eb57610cc18261198a565b80610ccb81612716565b915050610cb0565b6000610cde60085490565b8210610d415760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b5565b60088281548110610d5457610d54612787565b90600052602060002001549050919050565b600a546001600160a01b03163314610d905760405162461bcd60e51b81526004016107b5906125c7565b6012805460ff19169055565b600a546001600160a01b03163314610dc65760405162461bcd60e51b81526004016107b5906125c7565b8051610dd9906011906020840190612068565b5050565b6000818152600260205260408120546001600160a01b0316806106a85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b5565b60006001600160a01b038216610ebf5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b5565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610f055760405162461bcd60e51b81526004016107b5906125c7565b610f0f60006119e6565b565b600a546001600160a01b03163314610f3b5760405162461bcd60e51b81526004016107b5906125c7565b600c5481610f4860085490565b610f52919061264d565b1115610fb35760405162461bcd60e51b815260206004820152602a60248201527f41697264726f70206d696e74696e672077696c6c20657863656564206d6178696044820152696d756d20737570706c7960b01b60648201526084016107b5565b806110005760405162461bcd60e51b815260206004820152601d60248201527f41646472657373206e6f7420666f756e6420666f72206d696e74696e6700000060448201526064016107b5565b60005b818110156108eb57600083838381811061101f5761101f612787565b90506020020160208101906110349190612193565b6001600160a01b0316141561108b5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e6720746f204e756c6c206164647265737300000000000000000060448201526064016107b5565b6110ba8383838181106110a0576110a0612787565b90506020020160208101906110b59190612193565b61198a565b806110c481612716565b915050611003565b600a546001600160a01b031633146110f65760405162461bcd60e51b81526004016107b5906125c7565b604051600090339047908381818185875af1925050503d8060008114611138576040519150601f19603f3d011682016040523d82523d6000602084013e61113d565b606091505b50509050806111815760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016107b5565b50565b600a546001600160a01b031633146111ae5760405162461bcd60e51b81526004016107b5906125c7565b601055565b600a546001600160a01b031633146112255760125460ff166112255760405162461bcd60e51b815260206004820152602560248201527f53616c652069732070617573656420706c656173652074727920616761696e206044820152643630ba32b960d91b60648201526084016107b5565b6000811180156112375750600e548111155b61129d5760405162461bcd60e51b815260206004820152603160248201527f4d696e20312026204d6178203230204e4654732063616e206265206d696e746560448201527032103832b9103a3930b739b0b1ba34b7b760791b60648201526084016107b5565b600a546001600160a01b031633146112e957600c54816112bc60085490565b6112c6919061264d565b11156112e45760405162461bcd60e51b81526004016107b590612551565b61131e565b600c54816112f660085490565b611300919061264d565b111561131e5760405162461bcd60e51b81526004016107b590612551565b8060105461132c9190612679565b34101561134b5760405162461bcd60e51b81526004016107b590612578565b3360005b828110156108eb576113608261198a565b8061136a81612716565b91505061134f565b6060600180546106bd906126db565b6001600160a01b0382163314156113da5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b5565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61145033836116e8565b61146c5760405162461bcd60e51b81526004016107b5906125fc565b61147884848484611a38565b50505050565b600a546001600160a01b031633146114a85760405162461bcd60e51b81526004016107b5906125c7565b6012805460ff19166001179055565b6000818152600260205260409020546060906001600160a01b03166115365760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b5565b6000611540611a6b565b90506000815111611560576040518060200160405280600081525061158b565b8061156a84611a7a565b60405160200161157b92919061243c565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146115bc5760405162461bcd60e51b81526004016107b5906125c7565b6001600160a01b0381166116215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b5565b611181816119e6565b60006001600160e01b031982166380ac58cd60e01b148061165b57506001600160e01b03198216635b5e139f60e01b145b806106a857506301ffc9a760e01b6001600160e01b03198316146106a8565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906116af82610ddd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b5565b600061176c83610ddd565b9050806001600160a01b0316846001600160a01b031614806117a75750836001600160a01b031661179c84610740565b6001600160a01b0316145b806117d757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166117f282610ddd565b6001600160a01b03161461185a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b5565b6001600160a01b0382166118bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b5565b6118c7838383611b78565b6118d260008261167a565b6001600160a01b03831660009081526003602052604081208054600192906118fb908490612698565b90915550506001600160a01b038216600090815260036020526040812080546001929061192990849061264d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611998600b80546001019055565b60006119a3600b5490565b90506119af8282611c30565b6040518181527fd9dc24857f317ed9abbbb42e920ede0104231eb1d3d70236a74887ffaf1598689060200160405180910390a15050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a438484846117df565b611a4f84848484611c4a565b6114785760405162461bcd60e51b81526004016107b5906124ff565b6060601180546106bd906126db565b606081611a9e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ac85780611ab281612716565b9150611ac19050600a83612665565b9150611aa2565b60008167ffffffffffffffff811115611ae357611ae361279d565b6040519080825280601f01601f191660200182016040528015611b0d576020820181803683370190505b5090505b84156117d757611b22600183612698565b9150611b2f600a86612731565b611b3a90603061264d565b60f81b818381518110611b4f57611b4f612787565b60200101906001600160f81b031916908160001a905350611b71600a86612665565b9450611b11565b6001600160a01b038316611bd357611bce81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611bf6565b816001600160a01b0316836001600160a01b031614611bf657611bf68382611d57565b6001600160a01b038216611c0d576108eb81611df4565b826001600160a01b0316826001600160a01b0316146108eb576108eb8282611ea3565b610dd9828260405180602001604052806000815250611ee7565b60006001600160a01b0384163b15611d4c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c8e90339089908890889060040161246b565b602060405180830381600087803b158015611ca857600080fd5b505af1925050508015611cd8575060408051601f3d908101601f19168201909252611cd591810190612391565b60015b611d32573d808015611d06576040519150601f19603f3d011682016040523d82523d6000602084013e611d0b565b606091505b508051611d2a5760405162461bcd60e51b81526004016107b5906124ff565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117d7565b506001949350505050565b60006001611d6484610e54565b611d6e9190612698565b600083815260076020526040902054909150808214611dc1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611e0690600190612698565b60008381526009602052604081205460088054939450909284908110611e2e57611e2e612787565b906000526020600020015490508060088381548110611e4f57611e4f612787565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611e8757611e87612771565b6001900381819060005260206000200160009055905550505050565b6000611eae83610e54565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b611ef18383611f1a565b611efe6000848484611c4a565b6108eb5760405162461bcd60e51b81526004016107b5906124ff565b6001600160a01b038216611f705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b5565b6000818152600260205260409020546001600160a01b031615611fd55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b5565b611fe160008383611b78565b6001600160a01b038216600090815260036020526040812080546001929061200a90849061264d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612074906126db565b90600052602060002090601f01602090048101928261209657600085556120dc565b82601f106120af57805160ff19168380011785556120dc565b828001600101855582156120dc579182015b828111156120dc5782518255916020019190600101906120c1565b506120e89291506120ec565b5090565b5b808211156120e857600081556001016120ed565b600067ffffffffffffffff8084111561211c5761211c61279d565b604051601f8501601f19908116603f011681019082821181831017156121445761214461279d565b8160405280935085815286868601111561215d57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461218e57600080fd5b919050565b6000602082840312156121a557600080fd5b61158b82612177565b600080604083850312156121c157600080fd5b6121ca83612177565b91506121d860208401612177565b90509250929050565b6000806000606084860312156121f657600080fd5b6121ff84612177565b925061220d60208501612177565b9150604084013590509250925092565b6000806000806080858703121561223357600080fd5b61223c85612177565b935061224a60208601612177565b925060408501359150606085013567ffffffffffffffff81111561226d57600080fd5b8501601f8101871361227e57600080fd5b61228d87823560208401612101565b91505092959194509250565b600080604083850312156122ac57600080fd5b6122b583612177565b9150602083013580151581146122ca57600080fd5b809150509250929050565b600080604083850312156122e857600080fd5b6122f183612177565b946020939093013593505050565b6000806020838503121561231257600080fd5b823567ffffffffffffffff8082111561232a57600080fd5b818501915085601f83011261233e57600080fd5b81358181111561234d57600080fd5b8660208260051b850101111561236257600080fd5b60209290920196919550909350505050565b60006020828403121561238657600080fd5b813561158b816127b3565b6000602082840312156123a357600080fd5b815161158b816127b3565b6000602082840312156123c057600080fd5b813567ffffffffffffffff8111156123d757600080fd5b8201601f810184136123e857600080fd5b6117d784823560208401612101565b60006020828403121561240957600080fd5b5035919050565b600081518084526124288160208601602086016126af565b601f01601f19169290920160200192915050565b6000835161244e8184602088016126af565b8351908301906124628183602088016126af565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061249e90830184612410565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156124e0578351835292840192918401916001016124c4565b50909695505050505050565b60208152600061158b6020830184612410565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600d908201526c105b1b081391951cc81cdbdb19609a1b604082015260600190565b6020808252602f908201527f45746865722073656e7420776974682074686973207472616e73616374696f6e60408201526e081a5cc81b9bdd0818dbdc9c9958dd608a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561266057612660612745565b500190565b6000826126745761267461275b565b500490565b600081600019048311821515161561269357612693612745565b500290565b6000828210156126aa576126aa612745565b500390565b60005b838110156126ca5781810151838201526020016126b2565b838111156114785750506000910152565b600181811c908216806126ef57607f821691505b6020821081141561271057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561272a5761272a612745565b5060010190565b6000826127405761274061275b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461118157600080fdfea2646970667358221220900291e1932d7437917b51c22d0acb18e005953caa889b23e7e6582e73b62b6e64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d536452524d69366779627371526b75574855393734314271416d7a6b5270624b7159464c48334454513435532f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061021a5760003560e01c8063729ad39e11610123578063a035b1fe116100ab578063bee6348a1161006f578063bee6348a146105c5578063c87b56dd146105e4578063e0f888ef14610604578063e985e9c51461061a578063f2fde38b1461066357600080fd5b8063a035b1fe14610544578063a10e80be1461055a578063a22cb46514610570578063b88d4fde14610590578063bb33d729146105b057600080fd5b806391b7f5ed116100f257806391b7f5ed146104cc57806392642744146104ec57806395d89b41146104ff57806399288dbb146105145780639a6a62371461052e57600080fd5b8063729ad39e1461046357806373138e4f14610483578063853828b6146104995780638da5cb5b146104ae57600080fd5b80634357da58116101a657806355367ba91161017557806355367ba9146103d957806355f804b3146103ee5780636352211e1461040e57806370a082311461042e578063715018a61461044e57600080fd5b80634357da5814610364578063438b6300146103795780634a8011d2146103a65780634f6ccce7146103b957600080fd5b806318160ddd116101ed57806318160ddd146102d057806323b872dd146102ef5780632f745c591461030f57806342842e0e1461032f57806342d1e8f91461034f57600080fd5b806301ffc9a71461021f57806306fdde0314610254578063081812fc14610276578063095ea7b3146102ae575b600080fd5b34801561022b57600080fd5b5061023f61023a366004612374565b610683565b60405190151581526020015b60405180910390f35b34801561026057600080fd5b506102696106ae565b60405161024b91906124ec565b34801561028257600080fd5b506102966102913660046123f7565b610740565b6040516001600160a01b03909116815260200161024b565b3480156102ba57600080fd5b506102ce6102c93660046122d5565b6107da565b005b3480156102dc57600080fd5b506008545b60405190815260200161024b565b3480156102fb57600080fd5b506102ce61030a3660046121e1565b6108f0565b34801561031b57600080fd5b506102e161032a3660046122d5565b610921565b34801561033b57600080fd5b506102ce61034a3660046121e1565b6109b7565b34801561035b57600080fd5b506102ce6109d2565b34801561037057600080fd5b506102ce610a0d565b34801561038557600080fd5b50610399610394366004612193565b610a44565b60405161024b91906124a8565b6102ce6103b43660046123f7565b610ae6565b3480156103c557600080fd5b506102e16103d43660046123f7565b610cd3565b3480156103e557600080fd5b506102ce610d66565b3480156103fa57600080fd5b506102ce6104093660046123ae565b610d9c565b34801561041a57600080fd5b506102966104293660046123f7565b610ddd565b34801561043a57600080fd5b506102e1610449366004612193565b610e54565b34801561045a57600080fd5b506102ce610edb565b34801561046f57600080fd5b506102ce61047e3660046122ff565b610f11565b34801561048f57600080fd5b506102e1600d5481565b3480156104a557600080fd5b506102ce6110cc565b3480156104ba57600080fd5b50600a546001600160a01b0316610296565b3480156104d857600080fd5b506102ce6104e73660046123f7565b611184565b6102ce6104fa3660046123f7565b6111b3565b34801561050b57600080fd5b50610269611372565b34801561052057600080fd5b5060125461023f9060ff1681565b34801561053a57600080fd5b506102e1600e5481565b34801561055057600080fd5b506102e160105481565b34801561056657600080fd5b506102e1600f5481565b34801561057c57600080fd5b506102ce61058b366004612299565b611381565b34801561059c57600080fd5b506102ce6105ab36600461221d565b611446565b3480156105bc57600080fd5b506102ce61147e565b3480156105d157600080fd5b5060125461023f90610100900460ff1681565b3480156105f057600080fd5b506102696105ff3660046123f7565b6114b7565b34801561061057600080fd5b506102e1600c5481565b34801561062657600080fd5b5061023f6106353660046121ae565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561066f57600080fd5b506102ce61067e366004612193565b611592565b60006001600160e01b0319821663780e9d6360e01b14806106a857506106a88261162a565b92915050565b6060600080546106bd906126db565b80601f01602080910402602001604051908101604052809291908181526020018280546106e9906126db565b80156107365780601f1061070b57610100808354040283529160200191610736565b820191906000526020600020905b81548152906001019060200180831161071957829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166107be5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006107e582610ddd565b9050806001600160a01b0316836001600160a01b031614156108535760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016107b5565b336001600160a01b038216148061086f575061086f8133610635565b6108e15760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016107b5565b6108eb838361167a565b505050565b6108fa33826116e8565b6109165760405162461bcd60e51b81526004016107b5906125fc565b6108eb8383836117df565b600061092c83610e54565b821061098e5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016107b5565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6108eb83838360405180602001604052806000815250611446565b600a546001600160a01b031633146109fc5760405162461bcd60e51b81526004016107b5906125c7565b6012805461ff001916610100179055565b600a546001600160a01b03163314610a375760405162461bcd60e51b81526004016107b5906125c7565b6012805461ff0019169055565b60606000610a5183610e54565b905060008167ffffffffffffffff811115610a6e57610a6e61279d565b604051908082528060200260200182016040528015610a97578160200160208202803683370190505b50905060005b82811015610ade57610aaf8582610921565b828281518110610ac157610ac1612787565b602090810291909101015280610ad681612716565b915050610a9d565b509392505050565b600a546001600160a01b03163314610b5f57601254610100900460ff16610b5f5760405162461bcd60e51b815260206004820152602760248201527f507265616c652069732070617573656420706c6561736520747279206167616960448201526637103630ba32b960c91b60648201526084016107b5565b600081118015610b715750600f548111155b610bd65760405162461bcd60e51b815260206004820152603060248201527f4d696e20312026204d61782032204e4654732063616e206265206d696e74656460448201526f103832b9103a3930b739b0b1ba34b7b760811b60648201526084016107b5565b600a546001600160a01b03163314610c2257600d5481610bf560085490565b610bff919061264d565b1115610c1d5760405162461bcd60e51b81526004016107b590612551565b610c7f565b600d5481610c2f60085490565b610c39919061264d565b1115610c7f5760405162461bcd60e51b8152602060048201526015602482015274105b1b08141c995cd85b19481391951cc81cdbdb19605a1b60448201526064016107b5565b80601054610c8d9190612679565b341015610cac5760405162461bcd60e51b81526004016107b590612578565b3360005b828110156108eb57610cc18261198a565b80610ccb81612716565b915050610cb0565b6000610cde60085490565b8210610d415760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016107b5565b60088281548110610d5457610d54612787565b90600052602060002001549050919050565b600a546001600160a01b03163314610d905760405162461bcd60e51b81526004016107b5906125c7565b6012805460ff19169055565b600a546001600160a01b03163314610dc65760405162461bcd60e51b81526004016107b5906125c7565b8051610dd9906011906020840190612068565b5050565b6000818152600260205260408120546001600160a01b0316806106a85760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016107b5565b60006001600160a01b038216610ebf5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016107b5565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610f055760405162461bcd60e51b81526004016107b5906125c7565b610f0f60006119e6565b565b600a546001600160a01b03163314610f3b5760405162461bcd60e51b81526004016107b5906125c7565b600c5481610f4860085490565b610f52919061264d565b1115610fb35760405162461bcd60e51b815260206004820152602a60248201527f41697264726f70206d696e74696e672077696c6c20657863656564206d6178696044820152696d756d20737570706c7960b01b60648201526084016107b5565b806110005760405162461bcd60e51b815260206004820152601d60248201527f41646472657373206e6f7420666f756e6420666f72206d696e74696e6700000060448201526064016107b5565b60005b818110156108eb57600083838381811061101f5761101f612787565b90506020020160208101906110349190612193565b6001600160a01b0316141561108b5760405162461bcd60e51b815260206004820152601760248201527f4d696e74696e6720746f204e756c6c206164647265737300000000000000000060448201526064016107b5565b6110ba8383838181106110a0576110a0612787565b90506020020160208101906110b59190612193565b61198a565b806110c481612716565b915050611003565b600a546001600160a01b031633146110f65760405162461bcd60e51b81526004016107b5906125c7565b604051600090339047908381818185875af1925050503d8060008114611138576040519150601f19603f3d011682016040523d82523d6000602084013e61113d565b606091505b50509050806111815760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016107b5565b50565b600a546001600160a01b031633146111ae5760405162461bcd60e51b81526004016107b5906125c7565b601055565b600a546001600160a01b031633146112255760125460ff166112255760405162461bcd60e51b815260206004820152602560248201527f53616c652069732070617573656420706c656173652074727920616761696e206044820152643630ba32b960d91b60648201526084016107b5565b6000811180156112375750600e548111155b61129d5760405162461bcd60e51b815260206004820152603160248201527f4d696e20312026204d6178203230204e4654732063616e206265206d696e746560448201527032103832b9103a3930b739b0b1ba34b7b760791b60648201526084016107b5565b600a546001600160a01b031633146112e957600c54816112bc60085490565b6112c6919061264d565b11156112e45760405162461bcd60e51b81526004016107b590612551565b61131e565b600c54816112f660085490565b611300919061264d565b111561131e5760405162461bcd60e51b81526004016107b590612551565b8060105461132c9190612679565b34101561134b5760405162461bcd60e51b81526004016107b590612578565b3360005b828110156108eb576113608261198a565b8061136a81612716565b91505061134f565b6060600180546106bd906126db565b6001600160a01b0382163314156113da5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016107b5565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61145033836116e8565b61146c5760405162461bcd60e51b81526004016107b5906125fc565b61147884848484611a38565b50505050565b600a546001600160a01b031633146114a85760405162461bcd60e51b81526004016107b5906125c7565b6012805460ff19166001179055565b6000818152600260205260409020546060906001600160a01b03166115365760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b5565b6000611540611a6b565b90506000815111611560576040518060200160405280600081525061158b565b8061156a84611a7a565b60405160200161157b92919061243c565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146115bc5760405162461bcd60e51b81526004016107b5906125c7565b6001600160a01b0381166116215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b5565b611181816119e6565b60006001600160e01b031982166380ac58cd60e01b148061165b57506001600160e01b03198216635b5e139f60e01b145b806106a857506301ffc9a760e01b6001600160e01b03198316146106a8565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906116af82610ddd565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166117615760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016107b5565b600061176c83610ddd565b9050806001600160a01b0316846001600160a01b031614806117a75750836001600160a01b031661179c84610740565b6001600160a01b0316145b806117d757506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166117f282610ddd565b6001600160a01b03161461185a5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016107b5565b6001600160a01b0382166118bc5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016107b5565b6118c7838383611b78565b6118d260008261167a565b6001600160a01b03831660009081526003602052604081208054600192906118fb908490612698565b90915550506001600160a01b038216600090815260036020526040812080546001929061192990849061264d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611998600b80546001019055565b60006119a3600b5490565b90506119af8282611c30565b6040518181527fd9dc24857f317ed9abbbb42e920ede0104231eb1d3d70236a74887ffaf1598689060200160405180910390a15050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b611a438484846117df565b611a4f84848484611c4a565b6114785760405162461bcd60e51b81526004016107b5906124ff565b6060601180546106bd906126db565b606081611a9e5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ac85780611ab281612716565b9150611ac19050600a83612665565b9150611aa2565b60008167ffffffffffffffff811115611ae357611ae361279d565b6040519080825280601f01601f191660200182016040528015611b0d576020820181803683370190505b5090505b84156117d757611b22600183612698565b9150611b2f600a86612731565b611b3a90603061264d565b60f81b818381518110611b4f57611b4f612787565b60200101906001600160f81b031916908160001a905350611b71600a86612665565b9450611b11565b6001600160a01b038316611bd357611bce81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b611bf6565b816001600160a01b0316836001600160a01b031614611bf657611bf68382611d57565b6001600160a01b038216611c0d576108eb81611df4565b826001600160a01b0316826001600160a01b0316146108eb576108eb8282611ea3565b610dd9828260405180602001604052806000815250611ee7565b60006001600160a01b0384163b15611d4c57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611c8e90339089908890889060040161246b565b602060405180830381600087803b158015611ca857600080fd5b505af1925050508015611cd8575060408051601f3d908101601f19168201909252611cd591810190612391565b60015b611d32573d808015611d06576040519150601f19603f3d011682016040523d82523d6000602084013e611d0b565b606091505b508051611d2a5760405162461bcd60e51b81526004016107b5906124ff565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506117d7565b506001949350505050565b60006001611d6484610e54565b611d6e9190612698565b600083815260076020526040902054909150808214611dc1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090611e0690600190612698565b60008381526009602052604081205460088054939450909284908110611e2e57611e2e612787565b906000526020600020015490508060088381548110611e4f57611e4f612787565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480611e8757611e87612771565b6001900381819060005260206000200160009055905550505050565b6000611eae83610e54565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b611ef18383611f1a565b611efe6000848484611c4a565b6108eb5760405162461bcd60e51b81526004016107b5906124ff565b6001600160a01b038216611f705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016107b5565b6000818152600260205260409020546001600160a01b031615611fd55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016107b5565b611fe160008383611b78565b6001600160a01b038216600090815260036020526040812080546001929061200a90849061264d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612074906126db565b90600052602060002090601f01602090048101928261209657600085556120dc565b82601f106120af57805160ff19168380011785556120dc565b828001600101855582156120dc579182015b828111156120dc5782518255916020019190600101906120c1565b506120e89291506120ec565b5090565b5b808211156120e857600081556001016120ed565b600067ffffffffffffffff8084111561211c5761211c61279d565b604051601f8501601f19908116603f011681019082821181831017156121445761214461279d565b8160405280935085815286868601111561215d57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b038116811461218e57600080fd5b919050565b6000602082840312156121a557600080fd5b61158b82612177565b600080604083850312156121c157600080fd5b6121ca83612177565b91506121d860208401612177565b90509250929050565b6000806000606084860312156121f657600080fd5b6121ff84612177565b925061220d60208501612177565b9150604084013590509250925092565b6000806000806080858703121561223357600080fd5b61223c85612177565b935061224a60208601612177565b925060408501359150606085013567ffffffffffffffff81111561226d57600080fd5b8501601f8101871361227e57600080fd5b61228d87823560208401612101565b91505092959194509250565b600080604083850312156122ac57600080fd5b6122b583612177565b9150602083013580151581146122ca57600080fd5b809150509250929050565b600080604083850312156122e857600080fd5b6122f183612177565b946020939093013593505050565b6000806020838503121561231257600080fd5b823567ffffffffffffffff8082111561232a57600080fd5b818501915085601f83011261233e57600080fd5b81358181111561234d57600080fd5b8660208260051b850101111561236257600080fd5b60209290920196919550909350505050565b60006020828403121561238657600080fd5b813561158b816127b3565b6000602082840312156123a357600080fd5b815161158b816127b3565b6000602082840312156123c057600080fd5b813567ffffffffffffffff8111156123d757600080fd5b8201601f810184136123e857600080fd5b6117d784823560208401612101565b60006020828403121561240957600080fd5b5035919050565b600081518084526124288160208601602086016126af565b601f01601f19169290920160200192915050565b6000835161244e8184602088016126af565b8351908301906124628183602088016126af565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061249e90830184612410565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156124e0578351835292840192918401916001016124c4565b50909695505050505050565b60208152600061158b6020830184612410565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252600d908201526c105b1b081391951cc81cdbdb19609a1b604082015260600190565b6020808252602f908201527f45746865722073656e7420776974682074686973207472616e73616374696f6e60408201526e081a5cc81b9bdd0818dbdc9c9958dd608a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561266057612660612745565b500190565b6000826126745761267461275b565b500490565b600081600019048311821515161561269357612693612745565b500290565b6000828210156126aa576126aa612745565b500390565b60005b838110156126ca5781810151838201526020016126b2565b838111156114785750506000910152565b600181811c908216806126ef57607f821691505b6020821081141561271057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561272a5761272a612745565b5060010190565b6000826127405761274061275b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461118157600080fdfea2646970667358221220900291e1932d7437917b51c22d0acb18e005953caa889b23e7e6582e73b62b6e64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d536452524d69366779627371526b75574855393734314271416d7a6b5270624b7159464c48334454513435532f00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : baseURI (string): https://ipfs.io/ipfs/QmSdRRMi6gybsqRkuWHU9741BqAmzkRpbKqYFLH3DTQ45S/
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [2] : 68747470733a2f2f697066732e696f2f697066732f516d536452524d69366779
Arg [3] : 627371526b75574855393734314271416d7a6b5270624b7159464c4833445451
Arg [4] : 3435532f00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
46438:4814:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39941:300;;;;;;;;;;-1:-1:-1;39941:300:0;;;;;:::i;:::-;;:::i;:::-;;;7113:14:1;;7106:22;7088:41;;7076:2;7061:18;39941:300:0;;;;;;;;27101:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28794:308::-;;;;;;;;;;-1:-1:-1;28794:308:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5774:32:1;;;5756:51;;5744:2;5729:18;28794:308:0;5610:203:1;28317:411:0;;;;;;;;;;-1:-1:-1;28317:411:0;;;;;:::i;:::-;;:::i;:::-;;40744:113;;;;;;;;;;-1:-1:-1;40832:10:0;:17;40744:113;;;18940:25:1;;;18928:2;18913:18;40744:113:0;18794:177:1;29853:376:0;;;;;;;;;;-1:-1:-1;29853:376:0;;;;;:::i;:::-;;:::i;40325:343::-;;;;;;;;;;-1:-1:-1;40325:343:0;;;;;:::i;:::-;;:::i;30300:185::-;;;;;;;;;;-1:-1:-1;30300:185:0;;;;;:::i;:::-;;:::i;47914:80::-;;;;;;;;;;;;;:::i;47775:79::-;;;;;;;;;;;;;:::i;47119:385::-;;;;;;;;;;-1:-1:-1;47119:385:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48484:981::-;;;;;;:::i;:::-;;:::i;40934:320::-;;;;;;;;;;-1:-1:-1;40934:320:0;;;;;:::i;:::-;;:::i;48053:73::-;;;;;;;;;;;;;:::i;47512:101::-;;;;;;;;;;-1:-1:-1;47512:101:0;;;;;:::i;:::-;;:::i;26708:326::-;;;;;;;;;;-1:-1:-1;26708:326:0;;;;;:::i;:::-;;:::i;26351:295::-;;;;;;;;;;-1:-1:-1;26351:295:0;;;;;:::i;:::-;;:::i;9808:94::-;;;;;;;;;;;;;:::i;50433:491::-;;;;;;;;;;-1:-1:-1;50433:491:0;;;;;:::i;:::-;;:::i;46619:36::-;;;;;;;;;;;;;;;;48268:174;;;;;;;;;;;;;:::i;9157:87::-;;;;;;;;;;-1:-1:-1;9230:6:0;;-1:-1:-1;;;;;9230:6:0;9157:87;;47621:90;;;;;;;;;;-1:-1:-1;47621:90:0;;;;;:::i;:::-;;:::i;49489:932::-;;;;;;:::i;:::-;;:::i;27270:104::-;;;;;;;;;;;;;:::i;46835:28::-;;;;;;;;;;-1:-1:-1;46835:28:0;;;;;;;;46662:31;;;;;;;;;;;;;;;;46745:40;;;;;;;;;;;;;;;;46700:38;;;;;;;;;;;;;;;;29174:327;;;;;;;;;;-1:-1:-1;29174:327:0;;;;;:::i;:::-;;:::i;30556:365::-;;;;;;;;;;-1:-1:-1;30556:365:0;;;;;:::i;:::-;;:::i;48186:74::-;;;;;;;;;;;;;:::i;46870:31::-;;;;;;;;;;-1:-1:-1;46870:31:0;;;;;;;;;;;27445:468;;;;;;;;;;-1:-1:-1;27445:468:0;;;;;:::i;:::-;;:::i;46580:32::-;;;;;;;;;;;;;;;;29572:214;;;;;;;;;;-1:-1:-1;29572:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;29743:25:0;;;29714:4;29743:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29572:214;10057:229;;;;;;;;;;-1:-1:-1;10057:229:0;;;;;:::i;:::-;;:::i;39941:300::-;40088:4;-1:-1:-1;;;;;;40130:50:0;;-1:-1:-1;;;40130:50:0;;:103;;;40197:36;40221:11;40197:23;:36::i;:::-;40110:123;39941:300;-1:-1:-1;;39941:300:0:o;27101:100::-;27155:13;27188:5;27181:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27101:100;:::o;28794:308::-;28915:7;32557:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32557:16:0;28940:110;;;;-1:-1:-1;;;28940:110:0;;14635:2:1;28940:110:0;;;14617:21:1;14674:2;14654:18;;;14647:30;14713:34;14693:18;;;14686:62;-1:-1:-1;;;14764:18:1;;;14757:42;14816:19;;28940:110:0;;;;;;;;;-1:-1:-1;29070:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29070:24:0;;28794:308::o;28317:411::-;28398:13;28414:23;28429:7;28414:14;:23::i;:::-;28398:39;;28462:5;-1:-1:-1;;;;;28456:11:0;:2;-1:-1:-1;;;;;28456:11:0;;;28448:57;;;;-1:-1:-1;;;28448:57:0;;17068:2:1;28448:57:0;;;17050:21:1;17107:2;17087:18;;;17080:30;17146:34;17126:18;;;17119:62;-1:-1:-1;;;17197:18:1;;;17190:31;17238:19;;28448:57:0;16866:397:1;28448:57:0;2210:10;-1:-1:-1;;;;;28540:21:0;;;;:62;;-1:-1:-1;28565:37:0;28582:5;2210:10;29572:214;:::i;28565:37::-;28518:168;;;;-1:-1:-1;;;28518:168:0;;12199:2:1;28518:168:0;;;12181:21:1;12238:2;12218:18;;;12211:30;12277:34;12257:18;;;12250:62;12348:26;12328:18;;;12321:54;12392:19;;28518:168:0;11997:420:1;28518:168:0;28699:21;28708:2;28712:7;28699:8;:21::i;:::-;28387:341;28317:411;;:::o;29853:376::-;30062:41;2210:10;30095:7;30062:18;:41::i;:::-;30040:140;;;;-1:-1:-1;;;30040:140:0;;;;;;;:::i;:::-;30193:28;30203:4;30209:2;30213:7;30193:9;:28::i;40325:343::-;40467:7;40522:23;40539:5;40522:16;:23::i;:::-;40514:5;:31;40492:124;;;;-1:-1:-1;;;40492:124:0;;8330:2:1;40492:124:0;;;8312:21:1;8369:2;8349:18;;;8342:30;8408:34;8388:18;;;8381:62;-1:-1:-1;;;8459:18:1;;;8452:41;8510:19;;40492:124:0;8128:407:1;40492:124:0;-1:-1:-1;;;;;;40634:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40325:343::o;30300:185::-;30438:39;30455:4;30461:2;30465:7;30438:39;;;;;;;;;;;;:16;:39::i;47914:80::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;47968:11:::1;:18:::0;;-1:-1:-1;;47968:18:0::1;;;::::0;;47914:80::o;47775:79::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;47827:11:::1;:19:::0;;-1:-1:-1;;47827:19:0::1;::::0;;47775:79::o;47119:385::-;47208:16;47242:18;47263:17;47273:6;47263:9;:17::i;:::-;47242:38;;47293:25;47335:10;47321:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47321:25:0;;47293:53;;47362:9;47357:112;47381:10;47377:1;:14;47357:112;;;47427:30;47447:6;47455:1;47427:19;:30::i;:::-;47413:8;47422:1;47413:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;47393:3;;;;:::i;:::-;;;;47357:112;;;-1:-1:-1;47488:8:0;47119:385;-1:-1:-1;;;47119:385:0:o;48484:981::-;9230:6;;-1:-1:-1;;;;;9230:6:0;48554:10;:21;48550:117;;48600:11;;;;;;;48592:63;;;;-1:-1:-1;;;48592:63:0;;11036:2:1;48592:63:0;;;11018:21:1;11075:2;11055:18;;;11048:30;11114:34;11094:18;;;11087:62;-1:-1:-1;;;11165:18:1;;;11158:37;11212:19;;48592:63:0;10834:403:1;48592:63:0;48718:1;48709:6;:10;:43;;;;;48733:19;;48723:6;:29;;48709:43;48687:141;;;;-1:-1:-1;;;48687:141:0;;15825:2:1;48687:141:0;;;15807:21:1;15864:2;15844:18;;;15837:30;15903:34;15883:18;;;15876:62;-1:-1:-1;;;15954:18:1;;;15947:46;16010:19;;48687:141:0;15623:412:1;48687:141:0;9230:6;;-1:-1:-1;;;;;9230:6:0;48853:10;:21;48849:327;;48944:14;;48933:6;48917:13;40832:10;:17;;40744:113;48917:13;:22;;;;:::i;:::-;:42;;48891:117;;;;-1:-1:-1;;;48891:117:0;;;;;;;:::i;:::-;48849:327;;;49092:14;;49081:6;49065:13;40832:10;:17;;40744:113;49065:13;:22;;;;:::i;:::-;:42;;49039:125;;;;-1:-1:-1;;;49039:125:0;;17470:2:1;49039:125:0;;;17452:21:1;17509:2;17489:18;;;17482:30;-1:-1:-1;;;17528:18:1;;;17521:51;17589:18;;49039:125:0;17268:345:1;49039:125:0;49239:6;49231:5;;:14;;;;:::i;:::-;49218:9;:27;;49196:124;;;;-1:-1:-1;;;49196:124:0;;;;;;;:::i;:::-;49347:10;49333:11;49370:88;49394:6;49390:1;:10;49370:88;;;49422:10;49428:3;49422:5;:10::i;:::-;49402:3;;;;:::i;:::-;;;;49370:88;;40934:320;41054:7;41109:30;40832:10;:17;;40744:113;41109:30;41101:5;:38;41079:132;;;;-1:-1:-1;;;41079:132:0;;18583:2:1;41079:132:0;;;18565:21:1;18622:2;18602:18;;;18595:30;18661:34;18641:18;;;18634:62;-1:-1:-1;;;18712:18:1;;;18705:42;18764:19;;41079:132:0;18381:408:1;41079:132:0;41229:10;41240:5;41229:17;;;;;;;;:::i;:::-;;;;;;;;;41222:24;;40934:320;;;:::o;48053:73::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;48102:8:::1;:16:::0;;-1:-1:-1;;48102:16:0::1;::::0;;48053:73::o;47512:101::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;47583:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;47512:101:::0;:::o;26708:326::-;26825:7;26866:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26866:16:0;26915:19;26893:110;;;;-1:-1:-1;;;26893:110:0;;13446:2:1;26893:110:0;;;13428:21:1;13485:2;13465:18;;;13458:30;13524:34;13504:18;;;13497:62;-1:-1:-1;;;13575:18:1;;;13568:39;13624:19;;26893:110:0;13244:405:1;26351:295:0;26468:7;-1:-1:-1;;;;;26515:19:0;;26493:111;;;;-1:-1:-1;;;26493:111:0;;13035:2:1;26493:111:0;;;13017:21:1;13074:2;13054:18;;;13047:30;13113:34;13093:18;;;13086:62;-1:-1:-1;;;13164:18:1;;;13157:40;13214:19;;26493:111:0;12833:406:1;26493:111:0;-1:-1:-1;;;;;;26622:16:0;;;;;:9;:16;;;;;;;26351:295::o;9808:94::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;9873:21:::1;9891:1;9873:9;:21::i;:::-;9808:94::o:0;50433:491::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;50573:10:::1;::::0;50550:11;50534:13:::1;40832:10:::0;:17;;40744:113;50534:13:::1;:34;;;;:::i;:::-;:50;;50512:142;;;::::0;-1:-1:-1;;;50512:142:0;;12624:2:1;50512:142:0::1;::::0;::::1;12606:21:1::0;12663:2;12643:18;;;12636:30;12702:34;12682:18;;;12675:62;-1:-1:-1;;;12753:18:1;;;12746:40;12803:19;;50512:142:0::1;12422:406:1::0;50512:142:0::1;50673:23:::0;50665:65:::1;;;::::0;-1:-1:-1;;;50665:65:0;;7566:2:1;50665:65:0::1;::::0;::::1;7548:21:1::0;7605:2;7585:18;;;7578:30;7644:31;7624:18;;;7617:59;7693:18;;50665:65:0::1;7364:353:1::0;50665:65:0::1;50746:9;50741:176;50761:22:::0;;::::1;50741:176;;;50839:1;50813:11:::0;;50825:1;50813:14;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;50813:28:0::1;;;50805:64;;;::::0;-1:-1:-1;;;50805:64:0;;8742:2:1;50805:64:0::1;::::0;::::1;8724:21:1::0;8781:2;8761:18;;;8754:30;8820:25;8800:18;;;8793:53;8863:18;;50805:64:0::1;8540:347:1::0;50805:64:0::1;50884:21;50890:11;;50902:1;50890:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;50884:5;:21::i;:::-;50785:3:::0;::::1;::::0;::::1;:::i;:::-;;;;50741:176;;48268:174:::0;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;48338:49:::1;::::0;48320:12:::1;::::0;48338:10:::1;::::0;48361:21:::1;::::0;48320:12;48338:49;48320:12;48338:49;48361:21;48338:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48319:68;;;48406:7;48398:36;;;::::0;-1:-1:-1;;;48398:36:0;;17820:2:1;48398:36:0::1;::::0;::::1;17802:21:1::0;17859:2;17839:18;;;17832:30;-1:-1:-1;;;17878:18:1;;;17871:46;17934:18;;48398:36:0::1;17618:340:1::0;48398:36:0::1;48308:134;48268:174::o:0;47621:90::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;47686:5:::1;:17:::0;47621:90::o;49489:932::-;9230:6;;-1:-1:-1;;;;;9230:6:0;49552:10;:21;49548:112;;49598:8;;;;49590:58;;;;-1:-1:-1;;;49590:58:0;;7924:2:1;49590:58:0;;;7906:21:1;7963:2;7943:18;;;7936:30;8002:34;7982:18;;;7975:62;-1:-1:-1;;;8053:18:1;;;8046:35;8098:19;;49590:58:0;7722:401:1;49590:58:0;49711:1;49702:6;:10;:35;;;;;49726:11;;49716:6;:21;;49702:35;49680:134;;;;-1:-1:-1;;;49680:134:0;;14217:2:1;49680:134:0;;;14199:21:1;14256:2;14236:18;;;14229:30;14295:34;14275:18;;;14268:62;-1:-1:-1;;;14346:18:1;;;14339:47;14403:19;;49680:134:0;14015:413:1;49680:134:0;9230:6;;-1:-1:-1;;;;;9230:6:0;49839:10;:21;49835:311;;49930:10;;49919:6;49903:13;40832:10;:17;;40744:113;49903:13;:22;;;;:::i;:::-;:38;;49877:113;;;;-1:-1:-1;;;49877:113:0;;;;;;;:::i;:::-;49835:311;;;50074:10;;50063:6;50047:13;40832:10;:17;;40744:113;50047:13;:22;;;;:::i;:::-;:38;;50021:113;;;;-1:-1:-1;;;50021:113:0;;;;;;;:::i;:::-;50209:6;50201:5;;:14;;;;:::i;:::-;50188:9;:27;;50166:124;;;;-1:-1:-1;;;50166:124:0;;;;;;;:::i;:::-;50317:10;50303:11;50340:74;50364:6;50360:1;:10;50340:74;;;50392:10;50398:3;50392:5;:10::i;:::-;50372:3;;;;:::i;:::-;;;;50340:74;;27270:104;27326:13;27359:7;27352:14;;;;;:::i;29174:327::-;-1:-1:-1;;;;;29309:24:0;;2210:10;29309:24;;29301:62;;;;-1:-1:-1;;;29301:62:0;;10682:2:1;29301:62:0;;;10664:21:1;10721:2;10701:18;;;10694:30;10760:27;10740:18;;;10733:55;10805:18;;29301:62:0;10480:349:1;29301:62:0;2210:10;29376:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29376:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29376:53:0;;;;;;;;;;29445:48;;7088:41:1;;;29376:42:0;;2210:10;29445:48;;7061:18:1;29445:48:0;;;;;;;29174:327;;:::o;30556:365::-;30745:41;2210:10;30778:7;30745:18;:41::i;:::-;30723:140;;;;-1:-1:-1;;;30723:140:0;;;;;;;:::i;:::-;30874:39;30888:4;30894:2;30898:7;30907:5;30874:13;:39::i;:::-;30556:365;;;;:::o;48186:74::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;48237:8:::1;:15:::0;;-1:-1:-1;;48237:15:0::1;48248:4;48237:15;::::0;;48186:74::o;27445:468::-;32533:4;32557:16;;;:7;:16;;;;;;27563:13;;-1:-1:-1;;;;;32557:16:0;27594:113;;;;-1:-1:-1;;;27594:113:0;;16652:2:1;27594:113:0;;;16634:21:1;16691:2;16671:18;;;16664:30;16730:34;16710:18;;;16703:62;-1:-1:-1;;;16781:18:1;;;16774:45;16836:19;;27594:113:0;16450:411:1;27594:113:0;27720:21;27744:10;:8;:10::i;:::-;27720:34;;27809:1;27791:7;27785:21;:25;:120;;;;;;;;;;;;;;;;;27854:7;27863:18;:7;:16;:18::i;:::-;27837:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27785:120;27765:140;27445:468;-1:-1:-1;;;27445:468:0:o;10057:229::-;9230:6;;-1:-1:-1;;;;;9230:6:0;2210:10;9377:23;9369:68;;;;-1:-1:-1;;;9369:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10160:22:0;::::1;10138:110;;;::::0;-1:-1:-1;;;10138:110:0;;9513:2:1;10138:110:0::1;::::0;::::1;9495:21:1::0;9552:2;9532:18;;;9525:30;9591:34;9571:18;;;9564:62;-1:-1:-1;;;9642:18:1;;;9635:36;9688:19;;10138:110:0::1;9311:402:1::0;10138:110:0::1;10259:19;10269:8;10259:9;:19::i;25932:355::-:0;26079:4;-1:-1:-1;;;;;;26121:40:0;;-1:-1:-1;;;26121:40:0;;:105;;-1:-1:-1;;;;;;;26178:48:0;;-1:-1:-1;;;26178:48:0;26121:105;:158;;;-1:-1:-1;;;;;;;;;;12437:40:0;;;26243:36;12278:207;36591:174;36666:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;36666:29:0;-1:-1:-1;;;;;36666:29:0;;;;;;;;:24;;36720:23;36666:24;36720:14;:23::i;:::-;-1:-1:-1;;;;;36711:46:0;;;;;;;;;;;36591:174;;:::o;32762:452::-;32891:4;32557:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32557:16:0;32913:110;;;;-1:-1:-1;;;32913:110:0;;11444:2:1;32913:110:0;;;11426:21:1;11483:2;11463:18;;;11456:30;11522:34;11502:18;;;11495:62;-1:-1:-1;;;11573:18:1;;;11566:42;11625:19;;32913:110:0;11242:408:1;32913:110:0;33034:13;33050:23;33065:7;33050:14;:23::i;:::-;33034:39;;33103:5;-1:-1:-1;;;;;33092:16:0;:7;-1:-1:-1;;;;;33092:16:0;;:64;;;;33149:7;-1:-1:-1;;;;;33125:31:0;:20;33137:7;33125:11;:20::i;:::-;-1:-1:-1;;;;;33125:31:0;;33092:64;:113;;;-1:-1:-1;;;;;;29743:25:0;;;29714:4;29743:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33173:32;33084:122;32762:452;-1:-1:-1;;;;32762:452:0:o;35858:615::-;36031:4;-1:-1:-1;;;;;36004:31:0;:23;36019:7;36004:14;:23::i;:::-;-1:-1:-1;;;;;36004:31:0;;35982:122;;;;-1:-1:-1;;;35982:122:0;;16242:2:1;35982:122:0;;;16224:21:1;16281:2;16261:18;;;16254:30;16320:34;16300:18;;;16293:62;-1:-1:-1;;;16371:18:1;;;16364:39;16420:19;;35982:122:0;16040:405:1;35982:122:0;-1:-1:-1;;;;;36123:16:0;;36115:65;;;;-1:-1:-1;;;36115:65:0;;10277:2:1;36115:65:0;;;10259:21:1;10316:2;10296:18;;;10289:30;10355:34;10335:18;;;10328:62;-1:-1:-1;;;10406:18:1;;;10399:34;10450:19;;36115:65:0;10075:400:1;36115:65:0;36193:39;36214:4;36220:2;36224:7;36193:20;:39::i;:::-;36297:29;36314:1;36318:7;36297:8;:29::i;:::-;-1:-1:-1;;;;;36339:15:0;;;;;;:9;:15;;;;;:20;;36358:1;;36339:15;:20;;36358:1;;36339:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36370:13:0;;;;;;:9;:13;;;;;:18;;36387:1;;36370:13;:18;;36387:1;;36370:18;:::i;:::-;;;;-1:-1:-1;;36399:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36399:21:0;-1:-1:-1;;;;;36399:21:0;;;;;;;;;36438:27;;36399:16;;36438:27;;;;;;;35858:615;;;:::o;50932:190::-;50979:20;:8;1128:19;;1146:1;1128:19;;;1039:127;50979:20;51010:15;51028:18;:8;1009:14;;917:114;51028:18;51010:36;;51057:23;51067:3;51072:7;51057:9;:23::i;:::-;51096:18;;18940:25:1;;;51096:18:0;;18928:2:1;18913:18;51096::0;;;;;;;50968:154;50932:190;:::o;10294:173::-;10369:6;;;-1:-1:-1;;;;;10386:17:0;;;-1:-1:-1;;;;;;10386:17:0;;;;;;;10419:40;;10369:6;;;10386:17;10369:6;;10419:40;;10350:16;;10419:40;10339:128;10294:173;:::o;31803:352::-;31960:28;31970:4;31976:2;31980:7;31960:9;:28::i;:::-;32021:48;32044:4;32050:2;32054:7;32063:5;32021:22;:48::i;:::-;31999:148;;;;-1:-1:-1;;;31999:148:0;;;;;;;:::i;51130:113::-;51190:13;51223:12;51216:19;;;;;:::i;12799:723::-;12855:13;13076:10;13072:53;;-1:-1:-1;;13103:10:0;;;;;;;;;;;;-1:-1:-1;;;13103:10:0;;;;;12799:723::o;13072:53::-;13150:5;13135:12;13191:78;13198:9;;13191:78;;13224:8;;;;:::i;:::-;;-1:-1:-1;13247:10:0;;-1:-1:-1;13255:2:0;13247:10;;:::i;:::-;;;13191:78;;;13279:19;13311:6;13301:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13301:17:0;;13279:39;;13329:154;13336:10;;13329:154;;13363:11;13373:1;13363:11;;:::i;:::-;;-1:-1:-1;13432:10:0;13440:2;13432:5;:10;:::i;:::-;13419:24;;:2;:24;:::i;:::-;13406:39;;13389:6;13396;13389:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;13389:56:0;;;;;;;;-1:-1:-1;13460:11:0;13469:2;13460:11;;:::i;:::-;;;13329:154;;41867:589;-1:-1:-1;;;;;42073:18:0;;42069:187;;42108:40;42140:7;43283:10;:17;;43256:24;;;;:15;:24;;;;;:44;;;43311:24;;;;;;;;;;;;43179:164;42108:40;42069:187;;;42178:2;-1:-1:-1;;;;;42170:10:0;:4;-1:-1:-1;;;;;42170:10:0;;42166:90;;42197:47;42230:4;42236:7;42197:32;:47::i;:::-;-1:-1:-1;;;;;42270:16:0;;42266:183;;42303:45;42340:7;42303:36;:45::i;42266:183::-;42376:4;-1:-1:-1;;;;;42370:10:0;:2;-1:-1:-1;;;;;42370:10:0;;42366:83;;42397:40;42425:2;42429:7;42397:27;:40::i;33556:110::-;33632:26;33642:2;33646:7;33632:26;;;;;;;;;;;;:9;:26::i;37330:984::-;37485:4;-1:-1:-1;;;;;37506:13:0;;15675:20;15723:8;37502:805;;37559:175;;-1:-1:-1;;;37559:175:0;;-1:-1:-1;;;;;37559:36:0;;;;;:175;;2210:10;;37653:4;;37680:7;;37710:5;;37559:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37559:175:0;;;;;;;;-1:-1:-1;;37559:175:0;;;;;;;;;;;;:::i;:::-;;;37538:714;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37921:13:0;;37917:320;;37964:108;;-1:-1:-1;;;37964:108:0;;;;;;;:::i;37917:320::-;38187:6;38181:13;38172:6;38168:2;38164:15;38157:38;37538:714;-1:-1:-1;;;;;;37798:55:0;-1:-1:-1;;;37798:55:0;;-1:-1:-1;37791:62:0;;37502:805;-1:-1:-1;38291:4:0;37330:984;;;;;;:::o;43970:1002::-;44250:22;44300:1;44275:22;44292:4;44275:16;:22::i;:::-;:26;;;;:::i;:::-;44312:18;44333:26;;;:17;:26;;;;;;44250:51;;-1:-1:-1;44466:28:0;;;44462:328;;-1:-1:-1;;;;;44533:18:0;;44511:19;44533:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44584:30;;;;;;:44;;;44701:30;;:17;:30;;;;;:43;;;44462:328;-1:-1:-1;44886:26:0;;;;:17;:26;;;;;;;;44879:33;;;-1:-1:-1;;;;;44930:18:0;;;;;:12;:18;;;;;:34;;;;;;;44923:41;43970:1002::o;45267:1079::-;45545:10;:17;45520:22;;45545:21;;45565:1;;45545:21;:::i;:::-;45577:18;45598:24;;;:15;:24;;;;;;45971:10;:26;;45520:46;;-1:-1:-1;45598:24:0;;45520:46;;45971:26;;;;;;:::i;:::-;;;;;;;;;45949:48;;46035:11;46010:10;46021;46010:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46115:28;;;:15;:28;;;;;;;:41;;;46287:24;;;;;46280:31;46322:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45338:1008;;;45267:1079;:::o;42757:221::-;42842:14;42859:20;42876:2;42859:16;:20::i;:::-;-1:-1:-1;;;;;42890:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42935:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42757:221:0:o;33893:321::-;34023:18;34029:2;34033:7;34023:5;:18::i;:::-;34074:54;34105:1;34109:2;34113:7;34122:5;34074:22;:54::i;:::-;34052:154;;;;-1:-1:-1;;;34052:154:0;;;;;;;:::i;34550:382::-;-1:-1:-1;;;;;34630:16:0;;34622:61;;;;-1:-1:-1;;;34622:61:0;;13856:2:1;34622:61:0;;;13838:21:1;;;13875:18;;;13868:30;13934:34;13914:18;;;13907:62;13986:18;;34622:61:0;13654:356:1;34622:61:0;32533:4;32557:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32557:16:0;:30;34694:58;;;;-1:-1:-1;;;34694:58:0;;9920:2:1;34694:58:0;;;9902:21:1;9959:2;9939:18;;;9932:30;9998;9978:18;;;9971:58;10046:18;;34694:58:0;9718:352:1;34694:58:0;34765:45;34794:1;34798:2;34802:7;34765:20;:45::i;:::-;-1:-1:-1;;;;;34823:13:0;;;;;;:9;:13;;;;;:18;;34840:1;;34823:13;:18;;34840:1;;34823:18;:::i;:::-;;;;-1:-1:-1;;34852:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34852:21:0;-1:-1:-1;;;;;34852:21:0;;;;;;;;34891:33;;34852:16;;;34891:33;;34852:16;;34891:33;34550:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;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:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:186::-;887:6;940:2;928:9;919:7;915:23;911:32;908:52;;;956:1;953;946:12;908:52;979:29;998:9;979:29;:::i;1019:260::-;1087:6;1095;1148:2;1136:9;1127:7;1123:23;1119:32;1116:52;;;1164:1;1161;1154:12;1116:52;1187:29;1206:9;1187:29;:::i;:::-;1177:39;;1235:38;1269:2;1258:9;1254:18;1235:38;:::i;:::-;1225:48;;1019:260;;;;;:::o;1284:328::-;1361:6;1369;1377;1430:2;1418:9;1409:7;1405:23;1401:32;1398:52;;;1446:1;1443;1436:12;1398:52;1469:29;1488:9;1469:29;:::i;:::-;1459:39;;1517:38;1551:2;1540:9;1536:18;1517:38;:::i;:::-;1507:48;;1602:2;1591:9;1587:18;1574:32;1564:42;;1284:328;;;;;:::o;1617:666::-;1712:6;1720;1728;1736;1789:3;1777:9;1768:7;1764:23;1760:33;1757:53;;;1806:1;1803;1796:12;1757:53;1829:29;1848:9;1829:29;:::i;:::-;1819:39;;1877:38;1911:2;1900:9;1896:18;1877:38;:::i;:::-;1867:48;;1962:2;1951:9;1947:18;1934:32;1924:42;;2017:2;2006:9;2002:18;1989:32;2044:18;2036:6;2033:30;2030:50;;;2076:1;2073;2066:12;2030:50;2099:22;;2152:4;2144:13;;2140:27;-1:-1:-1;2130:55:1;;2181:1;2178;2171:12;2130:55;2204:73;2269:7;2264:2;2251:16;2246:2;2242;2238:11;2204:73;:::i;:::-;2194:83;;;1617:666;;;;;;;:::o;2288:347::-;2353:6;2361;2414:2;2402:9;2393:7;2389:23;2385:32;2382:52;;;2430:1;2427;2420:12;2382:52;2453:29;2472:9;2453:29;:::i;:::-;2443:39;;2532:2;2521:9;2517:18;2504:32;2579:5;2572:13;2565:21;2558:5;2555:32;2545:60;;2601:1;2598;2591:12;2545:60;2624:5;2614:15;;;2288:347;;;;;:::o;2640:254::-;2708:6;2716;2769:2;2757:9;2748:7;2744:23;2740:32;2737:52;;;2785:1;2782;2775:12;2737:52;2808:29;2827:9;2808:29;:::i;:::-;2798:39;2884:2;2869:18;;;;2856:32;;-1:-1:-1;;;2640:254:1:o;2899:615::-;2985:6;2993;3046:2;3034:9;3025:7;3021:23;3017:32;3014:52;;;3062:1;3059;3052:12;3014:52;3102:9;3089:23;3131:18;3172:2;3164:6;3161:14;3158:34;;;3188:1;3185;3178:12;3158:34;3226:6;3215:9;3211:22;3201:32;;3271:7;3264:4;3260:2;3256:13;3252:27;3242:55;;3293:1;3290;3283:12;3242:55;3333:2;3320:16;3359:2;3351:6;3348:14;3345:34;;;3375:1;3372;3365:12;3345:34;3428:7;3423:2;3413:6;3410:1;3406:14;3402:2;3398:23;3394:32;3391:45;3388:65;;;3449:1;3446;3439:12;3388:65;3480:2;3472:11;;;;;3502:6;;-1:-1:-1;2899:615:1;;-1:-1:-1;;;;2899:615:1:o;3519:245::-;3577:6;3630:2;3618:9;3609:7;3605:23;3601:32;3598:52;;;3646:1;3643;3636:12;3598:52;3685:9;3672:23;3704:30;3728:5;3704:30;:::i;3769:249::-;3838:6;3891:2;3879:9;3870:7;3866:23;3862:32;3859:52;;;3907:1;3904;3897:12;3859:52;3939:9;3933:16;3958:30;3982:5;3958:30;:::i;4023:450::-;4092:6;4145:2;4133:9;4124:7;4120:23;4116:32;4113:52;;;4161:1;4158;4151:12;4113:52;4201:9;4188:23;4234:18;4226:6;4223:30;4220:50;;;4266:1;4263;4256:12;4220:50;4289:22;;4342:4;4334:13;;4330:27;-1:-1:-1;4320:55:1;;4371:1;4368;4361:12;4320:55;4394:73;4459:7;4454:2;4441:16;4436:2;4432;4428:11;4394:73;:::i;4478:180::-;4537:6;4590:2;4578:9;4569:7;4565:23;4561:32;4558:52;;;4606:1;4603;4596:12;4558:52;-1:-1:-1;4629:23:1;;4478:180;-1:-1:-1;4478:180:1:o;4663:257::-;4704:3;4742:5;4736:12;4769:6;4764:3;4757:19;4785:63;4841:6;4834:4;4829:3;4825:14;4818:4;4811:5;4807:16;4785:63;:::i;:::-;4902:2;4881:15;-1:-1:-1;;4877:29:1;4868:39;;;;4909:4;4864:50;;4663:257;-1:-1:-1;;4663:257:1:o;4925:470::-;5104:3;5142:6;5136:13;5158:53;5204:6;5199:3;5192:4;5184:6;5180:17;5158:53;:::i;:::-;5274:13;;5233:16;;;;5296:57;5274:13;5233:16;5330:4;5318:17;;5296:57;:::i;:::-;5369:20;;4925:470;-1:-1:-1;;;;4925:470:1:o;5818:488::-;-1:-1:-1;;;;;6087:15:1;;;6069:34;;6139:15;;6134:2;6119:18;;6112:43;6186:2;6171:18;;6164:34;;;6234:3;6229:2;6214:18;;6207:31;;;6012:4;;6255:45;;6280:19;;6272:6;6255:45;:::i;:::-;6247:53;5818:488;-1:-1:-1;;;;;;5818:488:1:o;6311:632::-;6482:2;6534:21;;;6604:13;;6507:18;;;6626:22;;;6453:4;;6482:2;6705:15;;;;6679:2;6664:18;;;6453:4;6748:169;6762:6;6759:1;6756:13;6748:169;;;6823:13;;6811:26;;6892:15;;;;6857:12;;;;6784:1;6777:9;6748:169;;;-1:-1:-1;6934:3:1;;6311:632;-1:-1:-1;;;;;;6311:632:1:o;7140:219::-;7289:2;7278:9;7271:21;7252:4;7309:44;7349:2;7338:9;7334:18;7326:6;7309:44;:::i;8892:414::-;9094:2;9076:21;;;9133:2;9113:18;;;9106:30;9172:34;9167:2;9152:18;;9145:62;-1:-1:-1;;;9238:2:1;9223:18;;9216:48;9296:3;9281:19;;8892:414::o;11655:337::-;11857:2;11839:21;;;11896:2;11876:18;;;11869:30;-1:-1:-1;;;11930:2:1;11915:18;;11908:43;11983:2;11968:18;;11655:337::o;14846:411::-;15048:2;15030:21;;;15087:2;15067:18;;;15060:30;15126:34;15121:2;15106:18;;15099:62;-1:-1:-1;;;15192:2:1;15177:18;;15170:45;15247:3;15232:19;;14846:411::o;15262:356::-;15464:2;15446:21;;;15483:18;;;15476:30;15542:34;15537:2;15522:18;;15515:62;15609:2;15594:18;;15262:356::o;17963:413::-;18165:2;18147:21;;;18204:2;18184:18;;;18177:30;18243:34;18238:2;18223:18;;18216:62;-1:-1:-1;;;18309:2:1;18294:18;;18287:47;18366:3;18351:19;;17963:413::o;18976:128::-;19016:3;19047:1;19043:6;19040:1;19037:13;19034:39;;;19053:18;;:::i;:::-;-1:-1:-1;19089:9:1;;18976:128::o;19109:120::-;19149:1;19175;19165:35;;19180:18;;:::i;:::-;-1:-1:-1;19214:9:1;;19109:120::o;19234:168::-;19274:7;19340:1;19336;19332:6;19328:14;19325:1;19322:21;19317:1;19310:9;19303:17;19299:45;19296:71;;;19347:18;;:::i;:::-;-1:-1:-1;19387:9:1;;19234:168::o;19407:125::-;19447:4;19475:1;19472;19469:8;19466:34;;;19480:18;;:::i;:::-;-1:-1:-1;19517:9:1;;19407:125::o;19537:258::-;19609:1;19619:113;19633:6;19630:1;19627:13;19619:113;;;19709:11;;;19703:18;19690:11;;;19683:39;19655:2;19648:10;19619:113;;;19750:6;19747:1;19744:13;19741:48;;;-1:-1:-1;;19785:1:1;19767:16;;19760:27;19537:258::o;19800:380::-;19879:1;19875:12;;;;19922;;;19943:61;;19997:4;19989:6;19985:17;19975:27;;19943:61;20050:2;20042:6;20039:14;20019:18;20016:38;20013:161;;;20096:10;20091:3;20087:20;20084:1;20077:31;20131:4;20128:1;20121:15;20159:4;20156:1;20149:15;20013:161;;19800:380;;;:::o;20185:135::-;20224:3;-1:-1:-1;;20245:17:1;;20242:43;;;20265:18;;:::i;:::-;-1:-1:-1;20312:1:1;20301:13;;20185:135::o;20325:112::-;20357:1;20383;20373:35;;20388:18;;:::i;:::-;-1:-1:-1;20422:9:1;;20325:112::o;20442:127::-;20503:10;20498:3;20494:20;20491:1;20484:31;20534:4;20531:1;20524:15;20558:4;20555:1;20548:15;20574:127;20635:10;20630:3;20626:20;20623:1;20616:31;20666:4;20663:1;20656:15;20690:4;20687:1;20680:15;20706:127;20767:10;20762:3;20758:20;20755:1;20748:31;20798:4;20795:1;20788:15;20822:4;20819:1;20812:15;20838:127;20899:10;20894:3;20890:20;20887:1;20880:31;20930:4;20927:1;20920:15;20954:4;20951:1;20944:15;20970:127;21031:10;21026:3;21022:20;21019:1;21012:31;21062:4;21059:1;21052:15;21086:4;21083:1;21076:15;21102:131;-1:-1:-1;;;;;;21176:32:1;;21166:43;;21156:71;;21223:1;21220;21213:12
Swarm Source
ipfs://900291e1932d7437917b51c22d0acb18e005953caa889b23e7e6582e73b62b6e
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.