Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 51 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Mint | 15614989 | 746 days ago | IN | 0 ETH | 0.00014008 | ||||
Mint | 15614989 | 746 days ago | IN | 0 ETH | 0.00014008 | ||||
Start | 15614989 | 746 days ago | IN | 0 ETH | 0.00012992 | ||||
Mint | 15614989 | 746 days ago | IN | 0 ETH | 0.00014008 | ||||
Mint | 15614989 | 746 days ago | IN | 0 ETH | 0.00014008 | ||||
Mint | 15614985 | 746 days ago | IN | 0 ETH | 0.00014272 | ||||
Mint | 15614985 | 746 days ago | IN | 0 ETH | 0.00014272 | ||||
Mint | 15614985 | 746 days ago | IN | 0 ETH | 0.00014272 | ||||
Mint | 15614985 | 746 days ago | IN | 0 ETH | 0.00014272 | ||||
Start | 15614985 | 746 days ago | IN | 0 ETH | 0.00013237 | ||||
Mint | 15614982 | 746 days ago | IN | 0 ETH | 0.00014685 | ||||
Mint | 15614982 | 746 days ago | IN | 0 ETH | 0.00014685 | ||||
Mint | 15614982 | 746 days ago | IN | 0 ETH | 0.00014685 | ||||
Mint | 15614982 | 746 days ago | IN | 0 ETH | 0.00014685 | ||||
Start | 15614982 | 746 days ago | IN | 0 ETH | 0.0001362 | ||||
Mint | 15614973 | 746 days ago | IN | 0 ETH | 0.00017582 | ||||
Mint | 15614973 | 746 days ago | IN | 0 ETH | 0.00017582 | ||||
Start | 15614973 | 746 days ago | IN | 0 ETH | 0.00016307 | ||||
Mint | 15614973 | 746 days ago | IN | 0 ETH | 0.00017582 | ||||
Mint | 15614973 | 746 days ago | IN | 0 ETH | 0.00017582 | ||||
Mint | 15614973 | 746 days ago | IN | 0 ETH | 0.00017582 | ||||
Mint | 15614973 | 746 days ago | IN | 0 ETH | 0.00017582 | ||||
Mint | 15614973 | 746 days ago | IN | 0 ETH | 0.00017582 | ||||
Mint | 15614973 | 746 days ago | IN | 0 ETH | 0.00017582 | ||||
Mint | 15614965 | 746 days ago | IN | 0 ETH | 0.00016549 |
Loading...
Loading
Contract Name:
FaceFatigueUnion
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-26 */ /** *Submitted for verification at Etherscan.io on 2022-09-25 */ /** *Submitted for verification at Etherscan.io on 2022-09-23 */ /** *Submitted for verification at Etherscan.io on 2022-08-23 */ /** *Submitted for verification at Etherscan.io on 2022-08-22 */ /** *Submitted for verification at Etherscan.io on 2022-08-02 */ /** *Submitted for verification at Etherscan.io on 2022-07-20 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @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`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); // ============================== // IERC721Metadata // ============================== /** * @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); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren"t clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ""; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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-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 { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, "")`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ""); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot"s value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren"t clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren"t clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender"s balance is impossible because we check for // ownership above and the recipient"s balance can"t realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot"s address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender"s balance is impossible because we check for // ownership above and the recipient"s balance can"t realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot"s address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`"s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of "0". mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } 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); } } pragma solidity ^0.8.0; contract FaceFatigueUnion is ERC721A, Ownable { using Strings for uint; uint public constant MAX_PER_WALLET = 5; uint public maxSupply = 3500; bool public isPaused = true; string private _baseURL = ""; mapping(address => uint) private _walletMintedCount; mapping(address => bool) private _whiteList; constructor() // Name ERC721A("Face Fatigue Union", "FU") { } function _baseURI() internal view override returns (string memory) { return _baseURL; } function _startTokenId() internal pure override returns (uint) { return 1; } function contractURI() public pure returns (string memory) { return ""; } function mintedCount(address owner) external view returns (uint) { return _walletMintedCount[owner]; } function setBaseUri(string memory url) external onlyOwner { _baseURL = url; } function start(bool paused) external onlyOwner { isPaused = paused; } function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success); } function devMint(address to, uint count) external onlyOwner { require( _totalMinted() + count <= maxSupply, "Exceeds max supply" ); _safeMint(to, count); } function setMaxSupply(uint newMaxSupply) external onlyOwner { maxSupply = newMaxSupply; } function addWhitelist(address[] calldata wallets) external onlyOwner { for(uint i=0;i<wallets.length;i++) _whiteList[wallets[i]]=true; } function tokenURI(uint tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return bytes(_baseURI()).length > 0 ? string(abi.encodePacked(_baseURI(), tokenId.toString(), ".json")) : ""; } function mint() external payable { uint count=MAX_PER_WALLET; require(!isPaused, "Sales are off"); require(_totalMinted() + count <= maxSupply,"Exceeds max supply"); require(count <= MAX_PER_WALLET,"Exceeds max per transaction"); require(_walletMintedCount[msg.sender] + count <= MAX_PER_WALLET * 3,"Exceeds max per wallet"); require(_whiteList[msg.sender],"You are not on the whitelist!"); _walletMintedCount[msg.sender] += count; _safeMint(msg.sender, count); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"}],"name":"addWhitelist","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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"mintedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"url","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused","type":"bool"}],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052610dac6009556001600a60006101000a81548160ff02191690831515021790555060405180602001604052806000815250600b90805190602001906200004c9291906200020e565b503480156200005a57600080fd5b506040518060400160405280601281526020017f46616365204661746967756520556e696f6e00000000000000000000000000008152506040518060400160405280600281526020017f46550000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000df9291906200020e565b508060039080519060200190620000f89291906200020e565b50620001096200013760201b60201c565b600081905550505062000131620001256200014060201b60201c565b6200014860201b60201c565b62000323565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021c90620002be565b90600052602060002090601f0160209004810192826200024057600085556200028c565b82601f106200025b57805160ff19168380011785556200028c565b828001600101855582156200028c579182015b828111156200028b5782518255916020019190600101906200026e565b5b5090506200029b91906200029f565b5090565b5b80821115620002ba576000816000905550600101620002a0565b5090565b60006002820490506001821680620002d757607f821691505b60208210811415620002ee57620002ed620002f4565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6130fa80620003336000396000f3fe6080604052600436106101c25760003560e01c8063715018a6116100f7578063c877cf3711610095578063e985e9c511610064578063e985e9c5146105f9578063edac985b14610636578063f2fde38b1461065f578063fddcb5ea14610688576101c2565b8063c877cf371461053d578063c87b56dd14610566578063d5abeb01146105a3578063e8a3d485146105ce576101c2565b8063a0bcfc7f116100d1578063a0bcfc7f14610497578063a22cb465146104c0578063b187bd26146104e9578063b88d4fde14610514576101c2565b8063715018a61461042a5780638da5cb5b1461044157806395d89b411461046c576101c2565b806323b872dd11610164578063627804af1161013e578063627804af1461035e5780636352211e146103875780636f8b44b0146103c457806370a08231146103ed576101c2565b806323b872dd146102f55780633ccfd60b1461031e57806342842e0e14610335576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630f2cdd6c146102955780631249c58b146102c057806318160ddd146102ca576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612510565b6106c5565b6040516101fb91906128b9565b60405180910390f35b34801561021057600080fd5b50610219610757565b60405161022691906128d4565b60405180910390f35b34801561023b57600080fd5b50610256600480360381019061025191906125b3565b6107e9565b6040516102639190612852565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612456565b610865565b005b3480156102a157600080fd5b506102aa6109a6565b6040516102b791906129f6565b60405180910390f35b6102c86109ab565b005b3480156102d657600080fd5b506102df610c25565b6040516102ec91906129f6565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612340565b610c3c565b005b34801561032a57600080fd5b50610333610f61565b005b34801561034157600080fd5b5061035c60048036038101906103579190612340565b610fe2565b005b34801561036a57600080fd5b5061038560048036038101906103809190612456565b611002565b005b34801561039357600080fd5b506103ae60048036038101906103a991906125b3565b61106f565b6040516103bb9190612852565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906125b3565b611081565b005b3480156103f957600080fd5b50610414600480360381019061040f91906122d3565b611093565b60405161042191906129f6565b60405180910390f35b34801561043657600080fd5b5061043f61114c565b005b34801561044d57600080fd5b50610456611160565b6040516104639190612852565b60405180910390f35b34801561047857600080fd5b5061048161118a565b60405161048e91906128d4565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b9919061256a565b61121c565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190612416565b61123e565b005b3480156104f557600080fd5b506104fe6113b6565b60405161050b91906128b9565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190612393565b6113c9565b005b34801561054957600080fd5b50610564600480360381019061055f91906124e3565b61143c565b005b34801561057257600080fd5b5061058d600480360381019061058891906125b3565b611461565b60405161059a91906128d4565b60405180910390f35b3480156105af57600080fd5b506105b8611509565b6040516105c591906129f6565b60405180910390f35b3480156105da57600080fd5b506105e361150f565b6040516105f091906128d4565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190612300565b611526565b60405161062d91906128b9565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190612496565b6115ba565b005b34801561066b57600080fd5b50610686600480360381019061068191906122d3565b611667565b005b34801561069457600080fd5b506106af60048036038101906106aa91906122d3565b6116eb565b6040516106bc91906129f6565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461076690612cb1565b80601f016020809104026020016040519081016040528092919081815260200182805461079290612cb1565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b60006107f482611734565b61082a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108708261106f565b90508073ffffffffffffffffffffffffffffffffffffffff16610891611793565b73ffffffffffffffffffffffffffffffffffffffff16146108f4576108bd816108b8611793565b611526565b6108f3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600581565b600060059050600a60009054906101000a900460ff1615610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f890612916565b60405180910390fd5b60095481610a0d61179b565b610a179190612ae6565b1115610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f90612936565b60405180910390fd5b6005811115610a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a93906129b6565b60405180910390fd5b60036005610aaa9190612b6d565b81600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610af59190612ae6565b1115610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d906129d6565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb990612996565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c119190612ae6565b92505081905550610c2233826117ae565b50565b6000610c2f6117cc565b6001546000540303905090565b6000610c47826117d5565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cae576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cba846118a3565b91509150610cd08187610ccb611793565b6118c5565b610d1c57610ce586610ce0611793565b611526565b610d1b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d83576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d908686866001611909565b8015610d9b57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e6985610e4588888761190f565b7c020000000000000000000000000000000000000000000000000000000017611937565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610ef1576000600185019050600060046000838152602001908152602001600020541415610eef576000548114610eee578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f598686866001611962565b505050505050565b610f69611968565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f8f9061283d565b60006040518083038185875af1925050503d8060008114610fcc576040519150601f19603f3d011682016040523d82523d6000602084013e610fd1565b606091505b5050905080610fdf57600080fd5b50565b610ffd838383604051806020016040528060008152506113c9565b505050565b61100a611968565b6009548161101661179b565b6110209190612ae6565b1115611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890612936565b60405180910390fd5b61106b82826117ae565b5050565b600061107a826117d5565b9050919050565b611089611968565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611154611968565b61115e60006119e6565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461119990612cb1565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590612cb1565b80156112125780601f106111e757610100808354040283529160200191611212565b820191906000526020600020905b8154815290600101906020018083116111f557829003601f168201915b5050505050905090565b611224611968565b80600b908051906020019061123a929190612091565b5050565b611246611793565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ab576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006112b8611793565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611365611793565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113aa91906128b9565b60405180910390a35050565b600a60009054906101000a900460ff1681565b6113d4848484610c3c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611436576113ff84848484611aac565b611435576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611444611968565b80600a60006101000a81548160ff02191690831515021790555050565b606061146c82611734565b6114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290612976565b60405180910390fd5b60006114b5611c0c565b51116114d05760405180602001604052806000815250611502565b6114d8611c0c565b6114e183611c9e565b6040516020016114f292919061280e565b6040516020818303038152906040525b9050919050565b60095481565b606060405180602001604052806000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115c2611968565b60005b82829050811015611662576001600d60008585858181106115e9576115e8612e1b565b5b90506020020160208101906115fe91906122d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061165a90612d14565b9150506115c5565b505050565b61166f611968565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d6906128f6565b60405180910390fd5b6116e8816119e6565b50565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008161173f6117cc565b1115801561174e575060005482105b801561178c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006117a56117cc565b60005403905090565b6117c8828260405180602001604052806000815250611dff565b5050565b60006001905090565b600080829050806117e46117cc565b1161186c5760005481101561186b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611869575b600081141561185f576004600083600190039350838152602001908152602001600020549050611834565b809250505061189e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611926868684611e9c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611970611ea5565b73ffffffffffffffffffffffffffffffffffffffff1661198e611160565b73ffffffffffffffffffffffffffffffffffffffff16146119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90612956565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ad2611793565b8786866040518563ffffffff1660e01b8152600401611af4949392919061286d565b602060405180830381600087803b158015611b0e57600080fd5b505af1925050508015611b3f57506040513d601f19601f82011682018060405250810190611b3c919061253d565b60015b611bb9573d8060008114611b6f576040519150601f19603f3d011682016040523d82523d6000602084013e611b74565b606091505b50600081511415611bb1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611c1b90612cb1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4790612cb1565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050905090565b60606000821415611ce6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611dfa565b600082905060005b60008214611d18578080611d0190612d14565b915050600a82611d119190612b3c565b9150611cee565b60008167ffffffffffffffff811115611d3457611d33612e4a565b5b6040519080825280601f01601f191660200182016040528015611d665781602001600182028036833780820191505090505b5090505b60008514611df357600182611d7f9190612bc7565b9150600a85611d8e9190612d5d565b6030611d9a9190612ae6565b60f81b818381518110611db057611daf612e1b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611dec9190612b3c565b9450611d6a565b8093505050505b919050565b611e098383611ead565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e9757600080549050600083820390505b611e496000868380600101945086611aac565b611e7f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611e36578160005414611e9457600080fd5b50505b505050565b60009392505050565b600033905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f1a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415611f55576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f626000848385611909565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611fd983611fca600086600061190f565b611fd385612081565b17611937565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611ffd5780600081905550505061207c6000848385611962565b505050565b60006001821460e11b9050919050565b82805461209d90612cb1565b90600052602060002090601f0160209004810192826120bf5760008555612106565b82601f106120d857805160ff1916838001178555612106565b82800160010185558215612106579182015b828111156121055782518255916020019190600101906120ea565b5b5090506121139190612117565b5090565b5b80821115612130576000816000905550600101612118565b5090565b600061214761214284612a36565b612a11565b90508281526020810184848401111561216357612162612e88565b5b61216e848285612c6f565b509392505050565b600061218961218484612a67565b612a11565b9050828152602081018484840111156121a5576121a4612e88565b5b6121b0848285612c6f565b509392505050565b6000813590506121c781613068565b92915050565b60008083601f8401126121e3576121e2612e7e565b5b8235905067ffffffffffffffff811115612200576121ff612e79565b5b60208301915083602082028301111561221c5761221b612e83565b5b9250929050565b6000813590506122328161307f565b92915050565b60008135905061224781613096565b92915050565b60008151905061225c81613096565b92915050565b600082601f83011261227757612276612e7e565b5b8135612287848260208601612134565b91505092915050565b600082601f8301126122a5576122a4612e7e565b5b81356122b5848260208601612176565b91505092915050565b6000813590506122cd816130ad565b92915050565b6000602082840312156122e9576122e8612e92565b5b60006122f7848285016121b8565b91505092915050565b6000806040838503121561231757612316612e92565b5b6000612325858286016121b8565b9250506020612336858286016121b8565b9150509250929050565b60008060006060848603121561235957612358612e92565b5b6000612367868287016121b8565b9350506020612378868287016121b8565b9250506040612389868287016122be565b9150509250925092565b600080600080608085870312156123ad576123ac612e92565b5b60006123bb878288016121b8565b94505060206123cc878288016121b8565b93505060406123dd878288016122be565b925050606085013567ffffffffffffffff8111156123fe576123fd612e8d565b5b61240a87828801612262565b91505092959194509250565b6000806040838503121561242d5761242c612e92565b5b600061243b858286016121b8565b925050602061244c85828601612223565b9150509250929050565b6000806040838503121561246d5761246c612e92565b5b600061247b858286016121b8565b925050602061248c858286016122be565b9150509250929050565b600080602083850312156124ad576124ac612e92565b5b600083013567ffffffffffffffff8111156124cb576124ca612e8d565b5b6124d7858286016121cd565b92509250509250929050565b6000602082840312156124f9576124f8612e92565b5b600061250784828501612223565b91505092915050565b60006020828403121561252657612525612e92565b5b600061253484828501612238565b91505092915050565b60006020828403121561255357612552612e92565b5b60006125618482850161224d565b91505092915050565b6000602082840312156125805761257f612e92565b5b600082013567ffffffffffffffff81111561259e5761259d612e8d565b5b6125aa84828501612290565b91505092915050565b6000602082840312156125c9576125c8612e92565b5b60006125d7848285016122be565b91505092915050565b6125e981612bfb565b82525050565b6125f881612c0d565b82525050565b600061260982612a98565b6126138185612aae565b9350612623818560208601612c7e565b61262c81612e97565b840191505092915050565b600061264282612aa3565b61264c8185612aca565b935061265c818560208601612c7e565b61266581612e97565b840191505092915050565b600061267b82612aa3565b6126858185612adb565b9350612695818560208601612c7e565b80840191505092915050565b60006126ae602683612aca565b91506126b982612ea8565b604082019050919050565b60006126d1600d83612aca565b91506126dc82612ef7565b602082019050919050565b60006126f4601283612aca565b91506126ff82612f20565b602082019050919050565b6000612717600583612adb565b915061272282612f49565b600582019050919050565b600061273a602083612aca565b915061274582612f72565b602082019050919050565b600061275d602f83612aca565b915061276882612f9b565b604082019050919050565b6000612780601d83612aca565b915061278b82612fea565b602082019050919050565b60006127a3601b83612aca565b91506127ae82613013565b602082019050919050565b60006127c6600083612abf565b91506127d18261303c565b600082019050919050565b60006127e9601683612aca565b91506127f48261303f565b602082019050919050565b61280881612c65565b82525050565b600061281a8285612670565b91506128268284612670565b91506128318261270a565b91508190509392505050565b6000612848826127b9565b9150819050919050565b600060208201905061286760008301846125e0565b92915050565b600060808201905061288260008301876125e0565b61288f60208301866125e0565b61289c60408301856127ff565b81810360608301526128ae81846125fe565b905095945050505050565b60006020820190506128ce60008301846125ef565b92915050565b600060208201905081810360008301526128ee8184612637565b905092915050565b6000602082019050818103600083015261290f816126a1565b9050919050565b6000602082019050818103600083015261292f816126c4565b9050919050565b6000602082019050818103600083015261294f816126e7565b9050919050565b6000602082019050818103600083015261296f8161272d565b9050919050565b6000602082019050818103600083015261298f81612750565b9050919050565b600060208201905081810360008301526129af81612773565b9050919050565b600060208201905081810360008301526129cf81612796565b9050919050565b600060208201905081810360008301526129ef816127dc565b9050919050565b6000602082019050612a0b60008301846127ff565b92915050565b6000612a1b612a2c565b9050612a278282612ce3565b919050565b6000604051905090565b600067ffffffffffffffff821115612a5157612a50612e4a565b5b612a5a82612e97565b9050602081019050919050565b600067ffffffffffffffff821115612a8257612a81612e4a565b5b612a8b82612e97565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612af182612c65565b9150612afc83612c65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b3157612b30612d8e565b5b828201905092915050565b6000612b4782612c65565b9150612b5283612c65565b925082612b6257612b61612dbd565b5b828204905092915050565b6000612b7882612c65565b9150612b8383612c65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bbc57612bbb612d8e565b5b828202905092915050565b6000612bd282612c65565b9150612bdd83612c65565b925082821015612bf057612bef612d8e565b5b828203905092915050565b6000612c0682612c45565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612c9c578082015181840152602081019050612c81565b83811115612cab576000848401525b50505050565b60006002820490506001821680612cc957607f821691505b60208210811415612cdd57612cdc612dec565b5b50919050565b612cec82612e97565b810181811067ffffffffffffffff82111715612d0b57612d0a612e4a565b5b80604052505050565b6000612d1f82612c65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d5257612d51612d8e565b5b600182019050919050565b6000612d6882612c65565b9150612d7383612c65565b925082612d8357612d82612dbd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c657320617265206f666600000000000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74206f6e207468652077686974656c69737421000000600082015250565b7f45786365656473206d617820706572207472616e73616374696f6e0000000000600082015250565b50565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b61307181612bfb565b811461307c57600080fd5b50565b61308881612c0d565b811461309357600080fd5b50565b61309f81612c19565b81146130aa57600080fd5b50565b6130b681612c65565b81146130c157600080fd5b5056fea26469706673582212203d64fea53ccfb70ee74ae7f947a88326c8e820957c6edf0927abcfa89ce6295164736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101c25760003560e01c8063715018a6116100f7578063c877cf3711610095578063e985e9c511610064578063e985e9c5146105f9578063edac985b14610636578063f2fde38b1461065f578063fddcb5ea14610688576101c2565b8063c877cf371461053d578063c87b56dd14610566578063d5abeb01146105a3578063e8a3d485146105ce576101c2565b8063a0bcfc7f116100d1578063a0bcfc7f14610497578063a22cb465146104c0578063b187bd26146104e9578063b88d4fde14610514576101c2565b8063715018a61461042a5780638da5cb5b1461044157806395d89b411461046c576101c2565b806323b872dd11610164578063627804af1161013e578063627804af1461035e5780636352211e146103875780636f8b44b0146103c457806370a08231146103ed576101c2565b806323b872dd146102f55780633ccfd60b1461031e57806342842e0e14610335576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630f2cdd6c146102955780631249c58b146102c057806318160ddd146102ca576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612510565b6106c5565b6040516101fb91906128b9565b60405180910390f35b34801561021057600080fd5b50610219610757565b60405161022691906128d4565b60405180910390f35b34801561023b57600080fd5b50610256600480360381019061025191906125b3565b6107e9565b6040516102639190612852565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612456565b610865565b005b3480156102a157600080fd5b506102aa6109a6565b6040516102b791906129f6565b60405180910390f35b6102c86109ab565b005b3480156102d657600080fd5b506102df610c25565b6040516102ec91906129f6565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190612340565b610c3c565b005b34801561032a57600080fd5b50610333610f61565b005b34801561034157600080fd5b5061035c60048036038101906103579190612340565b610fe2565b005b34801561036a57600080fd5b5061038560048036038101906103809190612456565b611002565b005b34801561039357600080fd5b506103ae60048036038101906103a991906125b3565b61106f565b6040516103bb9190612852565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e691906125b3565b611081565b005b3480156103f957600080fd5b50610414600480360381019061040f91906122d3565b611093565b60405161042191906129f6565b60405180910390f35b34801561043657600080fd5b5061043f61114c565b005b34801561044d57600080fd5b50610456611160565b6040516104639190612852565b60405180910390f35b34801561047857600080fd5b5061048161118a565b60405161048e91906128d4565b60405180910390f35b3480156104a357600080fd5b506104be60048036038101906104b9919061256a565b61121c565b005b3480156104cc57600080fd5b506104e760048036038101906104e29190612416565b61123e565b005b3480156104f557600080fd5b506104fe6113b6565b60405161050b91906128b9565b60405180910390f35b34801561052057600080fd5b5061053b60048036038101906105369190612393565b6113c9565b005b34801561054957600080fd5b50610564600480360381019061055f91906124e3565b61143c565b005b34801561057257600080fd5b5061058d600480360381019061058891906125b3565b611461565b60405161059a91906128d4565b60405180910390f35b3480156105af57600080fd5b506105b8611509565b6040516105c591906129f6565b60405180910390f35b3480156105da57600080fd5b506105e361150f565b6040516105f091906128d4565b60405180910390f35b34801561060557600080fd5b50610620600480360381019061061b9190612300565b611526565b60405161062d91906128b9565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190612496565b6115ba565b005b34801561066b57600080fd5b50610686600480360381019061068191906122d3565b611667565b005b34801561069457600080fd5b506106af60048036038101906106aa91906122d3565b6116eb565b6040516106bc91906129f6565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061072057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461076690612cb1565b80601f016020809104026020016040519081016040528092919081815260200182805461079290612cb1565b80156107df5780601f106107b4576101008083540402835291602001916107df565b820191906000526020600020905b8154815290600101906020018083116107c257829003601f168201915b5050505050905090565b60006107f482611734565b61082a576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108708261106f565b90508073ffffffffffffffffffffffffffffffffffffffff16610891611793565b73ffffffffffffffffffffffffffffffffffffffff16146108f4576108bd816108b8611793565b611526565b6108f3576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600581565b600060059050600a60009054906101000a900460ff1615610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f890612916565b60405180910390fd5b60095481610a0d61179b565b610a179190612ae6565b1115610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f90612936565b60405180910390fd5b6005811115610a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a93906129b6565b60405180910390fd5b60036005610aaa9190612b6d565b81600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610af59190612ae6565b1115610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d906129d6565b60405180910390fd5b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb990612996565b60405180910390fd5b80600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c119190612ae6565b92505081905550610c2233826117ae565b50565b6000610c2f6117cc565b6001546000540303905090565b6000610c47826117d5565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cae576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cba846118a3565b91509150610cd08187610ccb611793565b6118c5565b610d1c57610ce586610ce0611793565b611526565b610d1b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610d83576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d908686866001611909565b8015610d9b57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610e6985610e4588888761190f565b7c020000000000000000000000000000000000000000000000000000000017611937565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610ef1576000600185019050600060046000838152602001908152602001600020541415610eef576000548114610eee578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f598686866001611962565b505050505050565b610f69611968565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610f8f9061283d565b60006040518083038185875af1925050503d8060008114610fcc576040519150601f19603f3d011682016040523d82523d6000602084013e610fd1565b606091505b5050905080610fdf57600080fd5b50565b610ffd838383604051806020016040528060008152506113c9565b505050565b61100a611968565b6009548161101661179b565b6110209190612ae6565b1115611061576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105890612936565b60405180910390fd5b61106b82826117ae565b5050565b600061107a826117d5565b9050919050565b611089611968565b8060098190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110fb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611154611968565b61115e60006119e6565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461119990612cb1565b80601f01602080910402602001604051908101604052809291908181526020018280546111c590612cb1565b80156112125780601f106111e757610100808354040283529160200191611212565b820191906000526020600020905b8154815290600101906020018083116111f557829003601f168201915b5050505050905090565b611224611968565b80600b908051906020019061123a929190612091565b5050565b611246611793565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112ab576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006112b8611793565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611365611793565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113aa91906128b9565b60405180910390a35050565b600a60009054906101000a900460ff1681565b6113d4848484610c3c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611436576113ff84848484611aac565b611435576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611444611968565b80600a60006101000a81548160ff02191690831515021790555050565b606061146c82611734565b6114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290612976565b60405180910390fd5b60006114b5611c0c565b51116114d05760405180602001604052806000815250611502565b6114d8611c0c565b6114e183611c9e565b6040516020016114f292919061280e565b6040516020818303038152906040525b9050919050565b60095481565b606060405180602001604052806000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115c2611968565b60005b82829050811015611662576001600d60008585858181106115e9576115e8612e1b565b5b90506020020160208101906115fe91906122d3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061165a90612d14565b9150506115c5565b505050565b61166f611968565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156116df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d6906128f6565b60405180910390fd5b6116e8816119e6565b50565b6000600c60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60008161173f6117cc565b1115801561174e575060005482105b801561178c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006117a56117cc565b60005403905090565b6117c8828260405180602001604052806000815250611dff565b5050565b60006001905090565b600080829050806117e46117cc565b1161186c5760005481101561186b5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611869575b600081141561185f576004600083600190039350838152602001908152602001600020549050611834565b809250505061189e565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611926868684611e9c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611970611ea5565b73ffffffffffffffffffffffffffffffffffffffff1661198e611160565b73ffffffffffffffffffffffffffffffffffffffff16146119e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119db90612956565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ad2611793565b8786866040518563ffffffff1660e01b8152600401611af4949392919061286d565b602060405180830381600087803b158015611b0e57600080fd5b505af1925050508015611b3f57506040513d601f19601f82011682018060405250810190611b3c919061253d565b60015b611bb9573d8060008114611b6f576040519150601f19603f3d011682016040523d82523d6000602084013e611b74565b606091505b50600081511415611bb1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b8054611c1b90612cb1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4790612cb1565b8015611c945780601f10611c6957610100808354040283529160200191611c94565b820191906000526020600020905b815481529060010190602001808311611c7757829003601f168201915b5050505050905090565b60606000821415611ce6576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611dfa565b600082905060005b60008214611d18578080611d0190612d14565b915050600a82611d119190612b3c565b9150611cee565b60008167ffffffffffffffff811115611d3457611d33612e4a565b5b6040519080825280601f01601f191660200182016040528015611d665781602001600182028036833780820191505090505b5090505b60008514611df357600182611d7f9190612bc7565b9150600a85611d8e9190612d5d565b6030611d9a9190612ae6565b60f81b818381518110611db057611daf612e1b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611dec9190612b3c565b9450611d6a565b8093505050505b919050565b611e098383611ead565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e9757600080549050600083820390505b611e496000868380600101945086611aac565b611e7f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611e36578160005414611e9457600080fd5b50505b505050565b60009392505050565b600033905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f1a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415611f55576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f626000848385611909565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611fd983611fca600086600061190f565b611fd385612081565b17611937565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611ffd5780600081905550505061207c6000848385611962565b505050565b60006001821460e11b9050919050565b82805461209d90612cb1565b90600052602060002090601f0160209004810192826120bf5760008555612106565b82601f106120d857805160ff1916838001178555612106565b82800160010185558215612106579182015b828111156121055782518255916020019190600101906120ea565b5b5090506121139190612117565b5090565b5b80821115612130576000816000905550600101612118565b5090565b600061214761214284612a36565b612a11565b90508281526020810184848401111561216357612162612e88565b5b61216e848285612c6f565b509392505050565b600061218961218484612a67565b612a11565b9050828152602081018484840111156121a5576121a4612e88565b5b6121b0848285612c6f565b509392505050565b6000813590506121c781613068565b92915050565b60008083601f8401126121e3576121e2612e7e565b5b8235905067ffffffffffffffff811115612200576121ff612e79565b5b60208301915083602082028301111561221c5761221b612e83565b5b9250929050565b6000813590506122328161307f565b92915050565b60008135905061224781613096565b92915050565b60008151905061225c81613096565b92915050565b600082601f83011261227757612276612e7e565b5b8135612287848260208601612134565b91505092915050565b600082601f8301126122a5576122a4612e7e565b5b81356122b5848260208601612176565b91505092915050565b6000813590506122cd816130ad565b92915050565b6000602082840312156122e9576122e8612e92565b5b60006122f7848285016121b8565b91505092915050565b6000806040838503121561231757612316612e92565b5b6000612325858286016121b8565b9250506020612336858286016121b8565b9150509250929050565b60008060006060848603121561235957612358612e92565b5b6000612367868287016121b8565b9350506020612378868287016121b8565b9250506040612389868287016122be565b9150509250925092565b600080600080608085870312156123ad576123ac612e92565b5b60006123bb878288016121b8565b94505060206123cc878288016121b8565b93505060406123dd878288016122be565b925050606085013567ffffffffffffffff8111156123fe576123fd612e8d565b5b61240a87828801612262565b91505092959194509250565b6000806040838503121561242d5761242c612e92565b5b600061243b858286016121b8565b925050602061244c85828601612223565b9150509250929050565b6000806040838503121561246d5761246c612e92565b5b600061247b858286016121b8565b925050602061248c858286016122be565b9150509250929050565b600080602083850312156124ad576124ac612e92565b5b600083013567ffffffffffffffff8111156124cb576124ca612e8d565b5b6124d7858286016121cd565b92509250509250929050565b6000602082840312156124f9576124f8612e92565b5b600061250784828501612223565b91505092915050565b60006020828403121561252657612525612e92565b5b600061253484828501612238565b91505092915050565b60006020828403121561255357612552612e92565b5b60006125618482850161224d565b91505092915050565b6000602082840312156125805761257f612e92565b5b600082013567ffffffffffffffff81111561259e5761259d612e8d565b5b6125aa84828501612290565b91505092915050565b6000602082840312156125c9576125c8612e92565b5b60006125d7848285016122be565b91505092915050565b6125e981612bfb565b82525050565b6125f881612c0d565b82525050565b600061260982612a98565b6126138185612aae565b9350612623818560208601612c7e565b61262c81612e97565b840191505092915050565b600061264282612aa3565b61264c8185612aca565b935061265c818560208601612c7e565b61266581612e97565b840191505092915050565b600061267b82612aa3565b6126858185612adb565b9350612695818560208601612c7e565b80840191505092915050565b60006126ae602683612aca565b91506126b982612ea8565b604082019050919050565b60006126d1600d83612aca565b91506126dc82612ef7565b602082019050919050565b60006126f4601283612aca565b91506126ff82612f20565b602082019050919050565b6000612717600583612adb565b915061272282612f49565b600582019050919050565b600061273a602083612aca565b915061274582612f72565b602082019050919050565b600061275d602f83612aca565b915061276882612f9b565b604082019050919050565b6000612780601d83612aca565b915061278b82612fea565b602082019050919050565b60006127a3601b83612aca565b91506127ae82613013565b602082019050919050565b60006127c6600083612abf565b91506127d18261303c565b600082019050919050565b60006127e9601683612aca565b91506127f48261303f565b602082019050919050565b61280881612c65565b82525050565b600061281a8285612670565b91506128268284612670565b91506128318261270a565b91508190509392505050565b6000612848826127b9565b9150819050919050565b600060208201905061286760008301846125e0565b92915050565b600060808201905061288260008301876125e0565b61288f60208301866125e0565b61289c60408301856127ff565b81810360608301526128ae81846125fe565b905095945050505050565b60006020820190506128ce60008301846125ef565b92915050565b600060208201905081810360008301526128ee8184612637565b905092915050565b6000602082019050818103600083015261290f816126a1565b9050919050565b6000602082019050818103600083015261292f816126c4565b9050919050565b6000602082019050818103600083015261294f816126e7565b9050919050565b6000602082019050818103600083015261296f8161272d565b9050919050565b6000602082019050818103600083015261298f81612750565b9050919050565b600060208201905081810360008301526129af81612773565b9050919050565b600060208201905081810360008301526129cf81612796565b9050919050565b600060208201905081810360008301526129ef816127dc565b9050919050565b6000602082019050612a0b60008301846127ff565b92915050565b6000612a1b612a2c565b9050612a278282612ce3565b919050565b6000604051905090565b600067ffffffffffffffff821115612a5157612a50612e4a565b5b612a5a82612e97565b9050602081019050919050565b600067ffffffffffffffff821115612a8257612a81612e4a565b5b612a8b82612e97565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612af182612c65565b9150612afc83612c65565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b3157612b30612d8e565b5b828201905092915050565b6000612b4782612c65565b9150612b5283612c65565b925082612b6257612b61612dbd565b5b828204905092915050565b6000612b7882612c65565b9150612b8383612c65565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612bbc57612bbb612d8e565b5b828202905092915050565b6000612bd282612c65565b9150612bdd83612c65565b925082821015612bf057612bef612d8e565b5b828203905092915050565b6000612c0682612c45565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612c9c578082015181840152602081019050612c81565b83811115612cab576000848401525b50505050565b60006002820490506001821680612cc957607f821691505b60208210811415612cdd57612cdc612dec565b5b50919050565b612cec82612e97565b810181811067ffffffffffffffff82111715612d0b57612d0a612e4a565b5b80604052505050565b6000612d1f82612c65565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d5257612d51612d8e565b5b600182019050919050565b6000612d6882612c65565b9150612d7383612c65565b925082612d8357612d82612dbd565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c657320617265206f666600000000000000000000000000000000000000600082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f7520617265206e6f74206f6e207468652077686974656c69737421000000600082015250565b7f45786365656473206d617820706572207472616e73616374696f6e0000000000600082015250565b50565b7f45786365656473206d6178207065722077616c6c657400000000000000000000600082015250565b61307181612bfb565b811461307c57600080fd5b50565b61308881612c0d565b811461309357600080fd5b50565b61309f81612c19565b81146130aa57600080fd5b50565b6130b681612c65565b81146130c157600080fd5b5056fea26469706673582212203d64fea53ccfb70ee74ae7f947a88326c8e820957c6edf0927abcfa89ce6295164736f6c63430008070033
Deployed Bytecode Sourcemap
50831:2450:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18644:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24291:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26237:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25785:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50912:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52759:519;;;:::i;:::-;;17698:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35502:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51803:177;;;;;;;;;;;;;:::i;:::-;;27127:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51985:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24080:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52164:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19323:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3235:103;;;;;;;;;;;;;:::i;:::-;;2587:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24460:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51631:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26513:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50989:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27383:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51721:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52425:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50955:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51421:78;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26892:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52266:154;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3493:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51507:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18644:615;18729:4;19044:10;19029:25;;:11;:25;;;;:102;;;;19121:10;19106:25;;:11;:25;;;;19029:102;:179;;;;19198:10;19183:25;;:11;:25;;;;19029:179;19009:199;;18644:615;;;:::o;24291:100::-;24345:13;24378:5;24371:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24291:100;:::o;26237:204::-;26305:7;26330:16;26338:7;26330;:16::i;:::-;26325:64;;26355:34;;;;;;;;;;;;;;26325:64;26409:15;:24;26425:7;26409:24;;;;;;;;;;;;;;;;;;;;;26402:31;;26237:204;;;:::o;25785:386::-;25858:13;25874:16;25882:7;25874;:16::i;:::-;25858:32;;25930:5;25907:28;;:19;:17;:19::i;:::-;:28;;;25903:175;;25955:44;25972:5;25979:19;:17;:19::i;:::-;25955:16;:44::i;:::-;25950:128;;26027:35;;;;;;;;;;;;;;25950:128;25903:175;26117:2;26090:15;:24;26106:7;26090:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;26155:7;26151:2;26135:28;;26144:5;26135:28;;;;;;;;;;;;25847:324;25785:386;;:::o;50912:39::-;50950:1;50912:39;:::o;52759:519::-;52803:10;50950:1;52803:25;;52842:8;;;;;;;;;;;52841:9;52833:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;52913:9;;52904:5;52887:14;:12;:14::i;:::-;:22;;;;:::i;:::-;:35;;52879:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50950:1;52963:5;:23;;52955:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53095:1;50950;53078:18;;;;:::i;:::-;53069:5;53036:18;:30;53055:10;53036:30;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;:60;;53028:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;53141:10;:22;53152:10;53141:22;;;;;;;;;;;;;;;;;;;;;;;;;53133:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53235:5;53201:18;:30;53220:10;53201:30;;;;;;;;;;;;;;;;:39;;;;;;;:::i;:::-;;;;;;;;53245:28;53255:10;53267:5;53245:9;:28::i;:::-;52792:486;52759:519::o;17698:315::-;17751:7;17979:15;:13;:15::i;:::-;17964:12;;17948:13;;:28;:46;17941:53;;17698:315;:::o;35502:2800::-;35636:27;35666;35685:7;35666:18;:27::i;:::-;35636:57;;35751:4;35710:45;;35726:19;35710:45;;;35706:86;;35764:28;;;;;;;;;;;;;;35706:86;35806:27;35835:23;35862:28;35882:7;35862:19;:28::i;:::-;35805:85;;;;35990:62;36009:15;36026:4;36032:19;:17;:19::i;:::-;35990:18;:62::i;:::-;35985:174;;36072:43;36089:4;36095:19;:17;:19::i;:::-;36072:16;:43::i;:::-;36067:92;;36124:35;;;;;;;;;;;;;;36067:92;35985:174;36190:1;36176:16;;:2;:16;;;36172:52;;;36201:23;;;;;;;;;;;;;;36172:52;36237:43;36259:4;36265:2;36269:7;36278:1;36237:21;:43::i;:::-;36373:15;36370:160;;;36513:1;36492:19;36485:30;36370:160;36908:18;:24;36927:4;36908:24;;;;;;;;;;;;;;;;36906:26;;;;;;;;;;;;36977:18;:22;36996:2;36977:22;;;;;;;;;;;;;;;;36975:24;;;;;;;;;;;37299:145;37336:2;37384:45;37399:4;37405:2;37409:19;37384:14;:45::i;:::-;14926:8;37357:72;37299:18;:145::i;:::-;37270:17;:26;37288:7;37270:26;;;;;;;;;;;:174;;;;37614:1;14926:8;37564:19;:46;:51;37560:626;;;37636:19;37668:1;37658:7;:11;37636:33;;37825:1;37791:17;:30;37809:11;37791:30;;;;;;;;;;;;:35;37787:384;;;37929:13;;37914:11;:28;37910:242;;38109:19;38076:17;:30;38094:11;38076:30;;;;;;;;;;;:52;;;;37910:242;37787:384;37617:569;37560:626;38233:7;38229:2;38214:27;;38223:4;38214:27;;;;;;;;;;;;38252:42;38273:4;38279:2;38283:7;38292:1;38252:20;:42::i;:::-;35625:2677;;;35502:2800;;;:::o;51803:177::-;2473:13;:11;:13::i;:::-;51848:12:::1;51874:10;51866:24;;51912:21;51866:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51847:101;;;51967:7;51959:16;;;::::0;::::1;;51842:138;51803:177::o:0;27127:185::-;27265:39;27282:4;27288:2;27292:7;27265:39;;;;;;;;;;;;:16;:39::i;:::-;27127:185;;;:::o;51985:174::-;2473:13;:11;:13::i;:::-;52089:9:::1;;52080:5;52063:14;:12;:14::i;:::-;:22;;;;:::i;:::-;:35;;52050:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;52134:20;52144:2;52148:5;52134:9;:20::i;:::-;51985:174:::0;;:::o;24080:144::-;24144:7;24187:27;24206:7;24187:18;:27::i;:::-;24164:52;;24080:144;;;:::o;52164:94::-;2473:13;:11;:13::i;:::-;52241:12:::1;52229:9;:24;;;;52164:94:::0;:::o;19323:224::-;19387:7;19428:1;19411:19;;:5;:19;;;19407:60;;;19439:28;;;;;;;;;;;;;;19407:60;13878:13;19485:18;:25;19504:5;19485:25;;;;;;;;;;;;;;;;:54;19478:61;;19323:224;;;:::o;3235:103::-;2473:13;:11;:13::i;:::-;3300:30:::1;3327:1;3300:18;:30::i;:::-;3235:103::o:0;2587:87::-;2633:7;2660:6;;;;;;;;;;;2653:13;;2587:87;:::o;24460:104::-;24516:13;24549:7;24542:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24460:104;:::o;51631:85::-;2473:13;:11;:13::i;:::-;51708:3:::1;51697:8;:14;;;;;;;;;;;;:::i;:::-;;51631:85:::0;:::o;26513:308::-;26624:19;:17;:19::i;:::-;26612:31;;:8;:31;;;26608:61;;;26652:17;;;;;;;;;;;;;;26608:61;26734:8;26682:18;:39;26701:19;:17;:19::i;:::-;26682:39;;;;;;;;;;;;;;;:49;26722:8;26682:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26794:8;26758:55;;26773:19;:17;:19::i;:::-;26758:55;;;26804:8;26758:55;;;;;;:::i;:::-;;;;;;;;26513:308;;:::o;50989:27::-;;;;;;;;;;;;;:::o;27383:399::-;27550:31;27563:4;27569:2;27573:7;27550:12;:31::i;:::-;27614:1;27596:2;:14;;;:19;27592:183;;27635:56;27666:4;27672:2;27676:7;27685:5;27635:30;:56::i;:::-;27630:145;;27719:40;;;;;;;;;;;;;;27630:145;27592:183;27383:399;;;;:::o;51721:77::-;2473:13;:11;:13::i;:::-;51787:6:::1;51776:8;;:17;;;;;;;;;;;;;;;;;;51721:77:::0;:::o;52425:329::-;52499:13;52535:16;52543:7;52535;:16::i;:::-;52527:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52648:1;52627:10;:8;:10::i;:::-;52621:24;:28;:128;;;;;;;;;;;;;;;;;52690:10;:8;:10::i;:::-;52702:18;:7;:16;:18::i;:::-;52673:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52621:128;52614:135;;52425:329;;;:::o;50955:28::-;;;;:::o;51421:78::-;51465:13;51485:9;;;;;;;;;;;;;;51421:78;:::o;26892:164::-;26989:4;27013:18;:25;27032:5;27013:25;;;;;;;;;;;;;;;:35;27039:8;27013:35;;;;;;;;;;;;;;;;;;;;;;;;;27006:42;;26892:164;;;;:::o;52266:154::-;2473:13;:11;:13::i;:::-;52344:6:::1;52340:75;52355:7;;:14;;52353:1;:16;52340:75;;;52411:4;52388:10;:22;52399:7;;52407:1;52399:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52388:22;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;52370:3;;;;;:::i;:::-;;;;52340:75;;;;52266:154:::0;;:::o;3493:201::-;2473:13;:11;:13::i;:::-;3602:1:::1;3582:22;;:8;:22;;;;3574:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3658:28;3677:8;3658:18;:28::i;:::-;3493:201:::0;:::o;51507:116::-;51566:4;51590:18;:25;51609:5;51590:25;;;;;;;;;;;;;;;;51583:32;;51507:116;;;:::o;28037:273::-;28094:4;28150:7;28131:15;:13;:15::i;:::-;:26;;:66;;;;;28184:13;;28174:7;:23;28131:66;:152;;;;;28282:1;14648:8;28235:17;:26;28253:7;28235:26;;;;;;;;;;;;:43;:48;28131:152;28111:172;;28037:273;;;:::o;46598:105::-;46658:7;46685:10;46678:17;;46598:105;:::o;18111:285::-;18158:7;18362:15;:13;:15::i;:::-;18346:13;;:31;18339:38;;18111:285;:::o;28394:104::-;28463:27;28473:2;28477:8;28463:27;;;;;;;;;;;;:9;:27::i;:::-;28394:104;;:::o;51335:81::-;51392:4;51410:1;51403:8;;51335:81;:::o;20997:1129::-;21064:7;21084:12;21099:7;21084:22;;21167:4;21148:15;:13;:15::i;:::-;:23;21144:915;;21201:13;;21194:4;:20;21190:869;;;21239:14;21256:17;:23;21274:4;21256:23;;;;;;;;;;;;21239:40;;21372:1;14648:8;21345:6;:23;:28;21341:699;;;21864:113;21881:1;21871:6;:11;21864:113;;;21924:17;:25;21942:6;;;;;;;21924:25;;;;;;;;;;;;21915:34;;21864:113;;;22010:6;22003:13;;;;;;21341:699;21216:843;21190:869;21144:915;22087:31;;;;;;;;;;;;;;20997:1129;;;;:::o;33838:652::-;33933:27;33962:23;34003:53;34059:15;34003:71;;34245:7;34239:4;34232:21;34280:22;34274:4;34267:36;34356:4;34350;34340:21;34317:44;;34452:19;34446:26;34427:45;;34183:300;33838:652;;;:::o;34603:645::-;34745:11;34907:15;34901:4;34897:26;34889:34;;35066:15;35055:9;35051:31;35038:44;;35213:15;35202:9;35199:30;35192:4;35181:9;35178:19;35175:55;35165:65;;34603:645;;;;;:::o;45431:159::-;;;;;:::o;43743:309::-;43878:7;43898:16;15049:3;43924:19;:40;;43898:67;;15049:3;43991:31;44002:4;44008:2;44012:9;43991:10;:31::i;:::-;43983:40;;:61;;43976:68;;;43743:309;;;;;:::o;23571:447::-;23651:14;23819:15;23812:5;23808:27;23799:36;;23993:5;23979:11;23955:22;23951:40;23948:51;23941:5;23938:62;23928:72;;23571:447;;;;:::o;46249:158::-;;;;;:::o;2752:132::-;2827:12;:10;:12::i;:::-;2816:23;;:7;:5;:7::i;:::-;:23;;;2808:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2752:132::o;3854:191::-;3928:16;3947:6;;;;;;;;;;;3928:25;;3973:8;3964:6;;:17;;;;;;;;;;;;;;;;;;4028:8;3997:40;;4018:8;3997:40;;;;;;;;;;;;3917:128;3854:191;:::o;42253:716::-;42416:4;42462:2;42437:45;;;42483:19;:17;:19::i;:::-;42504:4;42510:7;42519:5;42437:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42433:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42737:1;42720:6;:13;:18;42716:235;;;42766:40;;;;;;;;;;;;;;42716:235;42909:6;42903:13;42894:6;42890:2;42886:15;42879:38;42433:529;42606:54;;;42596:64;;;:6;:64;;;;42589:71;;;42253:716;;;;;;:::o;51238:92::-;51290:13;51317:8;51310:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51238:92;:::o;49035:723::-;49091:13;49321:1;49312:5;:10;49308:53;;;49339:10;;;;;;;;;;;;;;;;;;;;;49308:53;49371:12;49386:5;49371:20;;49402:14;49427:78;49442:1;49434:4;:9;49427:78;;49460:8;;;;;:::i;:::-;;;;49491:2;49483:10;;;;;:::i;:::-;;;49427:78;;;49515:19;49547:6;49537:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49515:39;;49565:154;49581:1;49572:5;:10;49565:154;;49609:1;49599:11;;;;;:::i;:::-;;;49676:2;49668:5;:10;;;;:::i;:::-;49655:2;:24;;;;:::i;:::-;49642:39;;49625:6;49632;49625:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;49705:2;49696:11;;;;;:::i;:::-;;;49565:154;;;49743:6;49729:21;;;;;49035:723;;;;:::o;28914:681::-;29037:19;29043:2;29047:8;29037:5;:19::i;:::-;29116:1;29098:2;:14;;;:19;29094:483;;29138:11;29152:13;;29138:27;;29184:13;29206:8;29200:3;:14;29184:30;;29233:233;29264:62;29303:1;29307:2;29311:7;;;;;;29320:5;29264:30;:62::i;:::-;29259:167;;29362:40;;;;;;;;;;;;;;29259:167;29461:3;29453:5;:11;29233:233;;29548:3;29531:13;;:20;29527:34;;29553:8;;;29527:34;29119:458;;29094:483;28914:681;;;:::o;44628:147::-;44765:6;44628:147;;;;;:::o;1138:98::-;1191:7;1218:10;1211:17;;1138:98;:::o;29868:1529::-;29933:20;29956:13;;29933:36;;29998:1;29984:16;;:2;:16;;;29980:48;;;30009:19;;;;;;;;;;;;;;29980:48;30055:1;30043:8;:13;30039:44;;;30065:18;;;;;;;;;;;;;;30039:44;30096:61;30126:1;30130:2;30134:12;30148:8;30096:21;:61::i;:::-;30639:1;14015:2;30610:1;:25;;30609:31;30597:8;:44;30571:18;:22;30590:2;30571:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;30918:139;30955:2;31009:33;31032:1;31036:2;31040:1;31009:14;:33::i;:::-;30976:30;30997:8;30976:20;:30::i;:::-;:66;30918:18;:139::i;:::-;30884:17;:31;30902:12;30884:31;;;;;;;;;;;:173;;;;31074:15;31092:12;31074:30;;31119:11;31148:8;31133:12;:23;31119:37;;31171:101;31223:9;;;;;;31219:2;31198:35;;31215:1;31198:35;;;;;;;;;;;;31267:3;31257:7;:13;31171:101;;31304:3;31288:13;:19;;;;30345:974;;31329:60;31358:1;31362:2;31366:12;31380:8;31329:20;:60::i;:::-;29922:1475;29868:1529;;:::o;25401:322::-;25471:14;25702:1;25692:8;25689:15;25664:23;25660:45;25650:55;;25401:322;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1761:5;1799:6;1786:20;1777:29;;1815:32;1841:5;1815:32;:::i;:::-;1716:137;;;;:::o;1859:141::-;1915:5;1946:6;1940:13;1931:22;;1962:32;1988:5;1962:32;:::i;:::-;1859:141;;;;:::o;2019:338::-;2074:5;2123:3;2116:4;2108:6;2104:17;2100:27;2090:122;;2131:79;;:::i;:::-;2090:122;2248:6;2235:20;2273:78;2347:3;2339:6;2332:4;2324:6;2320:17;2273:78;:::i;:::-;2264:87;;2080:277;2019:338;;;;:::o;2377:340::-;2433:5;2482:3;2475:4;2467:6;2463:17;2459:27;2449:122;;2490:79;;:::i;:::-;2449:122;2607:6;2594:20;2632:79;2707:3;2699:6;2692:4;2684:6;2680:17;2632:79;:::i;:::-;2623:88;;2439:278;2377:340;;;;:::o;2723:139::-;2769:5;2807:6;2794:20;2785:29;;2823:33;2850:5;2823:33;:::i;:::-;2723:139;;;;:::o;2868:329::-;2927:6;2976:2;2964:9;2955:7;2951:23;2947:32;2944:119;;;2982:79;;:::i;:::-;2944:119;3102:1;3127:53;3172:7;3163:6;3152:9;3148:22;3127:53;:::i;:::-;3117:63;;3073:117;2868:329;;;;:::o;3203:474::-;3271:6;3279;3328:2;3316:9;3307:7;3303:23;3299:32;3296:119;;;3334:79;;:::i;:::-;3296:119;3454:1;3479:53;3524:7;3515:6;3504:9;3500:22;3479:53;:::i;:::-;3469:63;;3425:117;3581:2;3607:53;3652:7;3643:6;3632:9;3628:22;3607:53;:::i;:::-;3597:63;;3552:118;3203:474;;;;;:::o;3683:619::-;3760:6;3768;3776;3825:2;3813:9;3804:7;3800:23;3796:32;3793:119;;;3831:79;;:::i;:::-;3793:119;3951:1;3976:53;4021:7;4012:6;4001:9;3997:22;3976:53;:::i;:::-;3966:63;;3922:117;4078:2;4104:53;4149:7;4140:6;4129:9;4125:22;4104:53;:::i;:::-;4094:63;;4049:118;4206:2;4232:53;4277:7;4268:6;4257:9;4253:22;4232:53;:::i;:::-;4222:63;;4177:118;3683:619;;;;;:::o;4308:943::-;4403:6;4411;4419;4427;4476:3;4464:9;4455:7;4451:23;4447:33;4444:120;;;4483:79;;:::i;:::-;4444:120;4603:1;4628:53;4673:7;4664:6;4653:9;4649:22;4628:53;:::i;:::-;4618:63;;4574:117;4730:2;4756:53;4801:7;4792:6;4781:9;4777:22;4756:53;:::i;:::-;4746:63;;4701:118;4858:2;4884:53;4929:7;4920:6;4909:9;4905:22;4884:53;:::i;:::-;4874:63;;4829:118;5014:2;5003:9;4999:18;4986:32;5045:18;5037:6;5034:30;5031:117;;;5067:79;;:::i;:::-;5031:117;5172:62;5226:7;5217:6;5206:9;5202:22;5172:62;:::i;:::-;5162:72;;4957:287;4308:943;;;;;;;:::o;5257:468::-;5322:6;5330;5379:2;5367:9;5358:7;5354:23;5350:32;5347:119;;;5385:79;;:::i;:::-;5347:119;5505:1;5530:53;5575:7;5566:6;5555:9;5551:22;5530:53;:::i;:::-;5520:63;;5476:117;5632:2;5658:50;5700:7;5691:6;5680:9;5676:22;5658:50;:::i;:::-;5648:60;;5603:115;5257:468;;;;;:::o;5731:474::-;5799:6;5807;5856:2;5844:9;5835:7;5831:23;5827:32;5824:119;;;5862:79;;:::i;:::-;5824:119;5982:1;6007:53;6052:7;6043:6;6032:9;6028:22;6007:53;:::i;:::-;5997:63;;5953:117;6109:2;6135:53;6180:7;6171:6;6160:9;6156:22;6135:53;:::i;:::-;6125:63;;6080:118;5731:474;;;;;:::o;6211:559::-;6297:6;6305;6354:2;6342:9;6333:7;6329:23;6325:32;6322:119;;;6360:79;;:::i;:::-;6322:119;6508:1;6497:9;6493:17;6480:31;6538:18;6530:6;6527:30;6524:117;;;6560:79;;:::i;:::-;6524:117;6673:80;6745:7;6736:6;6725:9;6721:22;6673:80;:::i;:::-;6655:98;;;;6451:312;6211:559;;;;;:::o;6776:323::-;6832:6;6881:2;6869:9;6860:7;6856:23;6852:32;6849:119;;;6887:79;;:::i;:::-;6849:119;7007:1;7032:50;7074:7;7065:6;7054:9;7050:22;7032:50;:::i;:::-;7022:60;;6978:114;6776:323;;;;:::o;7105:327::-;7163:6;7212:2;7200:9;7191:7;7187:23;7183:32;7180:119;;;7218:79;;:::i;:::-;7180:119;7338:1;7363:52;7407:7;7398:6;7387:9;7383:22;7363:52;:::i;:::-;7353:62;;7309:116;7105:327;;;;:::o;7438:349::-;7507:6;7556:2;7544:9;7535:7;7531:23;7527:32;7524:119;;;7562:79;;:::i;:::-;7524:119;7682:1;7707:63;7762:7;7753:6;7742:9;7738:22;7707:63;:::i;:::-;7697:73;;7653:127;7438:349;;;;:::o;7793:509::-;7862:6;7911:2;7899:9;7890:7;7886:23;7882:32;7879:119;;;7917:79;;:::i;:::-;7879:119;8065:1;8054:9;8050:17;8037:31;8095:18;8087:6;8084:30;8081:117;;;8117:79;;:::i;:::-;8081:117;8222:63;8277:7;8268:6;8257:9;8253:22;8222:63;:::i;:::-;8212:73;;8008:287;7793:509;;;;:::o;8308:329::-;8367:6;8416:2;8404:9;8395:7;8391:23;8387:32;8384:119;;;8422:79;;:::i;:::-;8384:119;8542:1;8567:53;8612:7;8603:6;8592:9;8588:22;8567:53;:::i;:::-;8557:63;;8513:117;8308:329;;;;:::o;8643:118::-;8730:24;8748:5;8730:24;:::i;:::-;8725:3;8718:37;8643:118;;:::o;8767:109::-;8848:21;8863:5;8848:21;:::i;:::-;8843:3;8836:34;8767:109;;:::o;8882:360::-;8968:3;8996:38;9028:5;8996:38;:::i;:::-;9050:70;9113:6;9108:3;9050:70;:::i;:::-;9043:77;;9129:52;9174:6;9169:3;9162:4;9155:5;9151:16;9129:52;:::i;:::-;9206:29;9228:6;9206:29;:::i;:::-;9201:3;9197:39;9190:46;;8972:270;8882:360;;;;:::o;9248:364::-;9336:3;9364:39;9397:5;9364:39;:::i;:::-;9419:71;9483:6;9478:3;9419:71;:::i;:::-;9412:78;;9499:52;9544:6;9539:3;9532:4;9525:5;9521:16;9499:52;:::i;:::-;9576:29;9598:6;9576:29;:::i;:::-;9571:3;9567:39;9560:46;;9340:272;9248:364;;;;:::o;9618:377::-;9724:3;9752:39;9785:5;9752:39;:::i;:::-;9807:89;9889:6;9884:3;9807:89;:::i;:::-;9800:96;;9905:52;9950:6;9945:3;9938:4;9931:5;9927:16;9905:52;:::i;:::-;9982:6;9977:3;9973:16;9966:23;;9728:267;9618:377;;;;:::o;10001:366::-;10143:3;10164:67;10228:2;10223:3;10164:67;:::i;:::-;10157:74;;10240:93;10329:3;10240:93;:::i;:::-;10358:2;10353:3;10349:12;10342:19;;10001:366;;;:::o;10373:::-;10515:3;10536:67;10600:2;10595:3;10536:67;:::i;:::-;10529:74;;10612:93;10701:3;10612:93;:::i;:::-;10730:2;10725:3;10721:12;10714:19;;10373:366;;;:::o;10745:::-;10887:3;10908:67;10972:2;10967:3;10908:67;:::i;:::-;10901:74;;10984:93;11073:3;10984:93;:::i;:::-;11102:2;11097:3;11093:12;11086:19;;10745:366;;;:::o;11117:400::-;11277:3;11298:84;11380:1;11375:3;11298:84;:::i;:::-;11291:91;;11391:93;11480:3;11391:93;:::i;:::-;11509:1;11504:3;11500:11;11493:18;;11117:400;;;:::o;11523:366::-;11665:3;11686:67;11750:2;11745:3;11686:67;:::i;:::-;11679:74;;11762:93;11851:3;11762:93;:::i;:::-;11880:2;11875:3;11871:12;11864:19;;11523:366;;;:::o;11895:::-;12037:3;12058:67;12122:2;12117:3;12058:67;:::i;:::-;12051:74;;12134:93;12223:3;12134:93;:::i;:::-;12252:2;12247:3;12243:12;12236:19;;11895:366;;;:::o;12267:::-;12409:3;12430:67;12494:2;12489:3;12430:67;:::i;:::-;12423:74;;12506:93;12595:3;12506:93;:::i;:::-;12624:2;12619:3;12615:12;12608:19;;12267:366;;;:::o;12639:::-;12781:3;12802:67;12866:2;12861:3;12802:67;:::i;:::-;12795:74;;12878:93;12967:3;12878:93;:::i;:::-;12996:2;12991:3;12987:12;12980:19;;12639:366;;;:::o;13011:398::-;13170:3;13191:83;13272:1;13267:3;13191:83;:::i;:::-;13184:90;;13283:93;13372:3;13283:93;:::i;:::-;13401:1;13396:3;13392:11;13385:18;;13011:398;;;:::o;13415:366::-;13557:3;13578:67;13642:2;13637:3;13578:67;:::i;:::-;13571:74;;13654:93;13743:3;13654:93;:::i;:::-;13772:2;13767:3;13763:12;13756:19;;13415:366;;;:::o;13787:118::-;13874:24;13892:5;13874:24;:::i;:::-;13869:3;13862:37;13787:118;;:::o;13911:701::-;14192:3;14214:95;14305:3;14296:6;14214:95;:::i;:::-;14207:102;;14326:95;14417:3;14408:6;14326:95;:::i;:::-;14319:102;;14438:148;14582:3;14438:148;:::i;:::-;14431:155;;14603:3;14596:10;;13911:701;;;;;:::o;14618:379::-;14802:3;14824:147;14967:3;14824:147;:::i;:::-;14817:154;;14988:3;14981:10;;14618:379;;;:::o;15003:222::-;15096:4;15134:2;15123:9;15119:18;15111:26;;15147:71;15215:1;15204:9;15200:17;15191:6;15147:71;:::i;:::-;15003:222;;;;:::o;15231:640::-;15426:4;15464:3;15453:9;15449:19;15441:27;;15478:71;15546:1;15535:9;15531:17;15522:6;15478:71;:::i;:::-;15559:72;15627:2;15616:9;15612:18;15603:6;15559:72;:::i;:::-;15641;15709:2;15698:9;15694:18;15685:6;15641:72;:::i;:::-;15760:9;15754:4;15750:20;15745:2;15734:9;15730:18;15723:48;15788:76;15859:4;15850:6;15788:76;:::i;:::-;15780:84;;15231:640;;;;;;;:::o;15877:210::-;15964:4;16002:2;15991:9;15987:18;15979:26;;16015:65;16077:1;16066:9;16062:17;16053:6;16015:65;:::i;:::-;15877:210;;;;:::o;16093:313::-;16206:4;16244:2;16233:9;16229:18;16221:26;;16293:9;16287:4;16283:20;16279:1;16268:9;16264:17;16257:47;16321:78;16394:4;16385:6;16321:78;:::i;:::-;16313:86;;16093:313;;;;:::o;16412:419::-;16578:4;16616:2;16605:9;16601:18;16593:26;;16665:9;16659:4;16655:20;16651:1;16640:9;16636:17;16629:47;16693:131;16819:4;16693:131;:::i;:::-;16685:139;;16412:419;;;:::o;16837:::-;17003:4;17041:2;17030:9;17026:18;17018:26;;17090:9;17084:4;17080:20;17076:1;17065:9;17061:17;17054:47;17118:131;17244:4;17118:131;:::i;:::-;17110:139;;16837:419;;;:::o;17262:::-;17428:4;17466:2;17455:9;17451:18;17443:26;;17515:9;17509:4;17505:20;17501:1;17490:9;17486:17;17479:47;17543:131;17669:4;17543:131;:::i;:::-;17535:139;;17262:419;;;:::o;17687:::-;17853:4;17891:2;17880:9;17876:18;17868:26;;17940:9;17934:4;17930:20;17926:1;17915:9;17911:17;17904:47;17968:131;18094:4;17968:131;:::i;:::-;17960:139;;17687:419;;;:::o;18112:::-;18278:4;18316:2;18305:9;18301:18;18293:26;;18365:9;18359:4;18355:20;18351:1;18340:9;18336:17;18329:47;18393:131;18519:4;18393:131;:::i;:::-;18385:139;;18112:419;;;:::o;18537:::-;18703:4;18741:2;18730:9;18726:18;18718:26;;18790:9;18784:4;18780:20;18776:1;18765:9;18761:17;18754:47;18818:131;18944:4;18818:131;:::i;:::-;18810:139;;18537:419;;;:::o;18962:::-;19128:4;19166:2;19155:9;19151:18;19143:26;;19215:9;19209:4;19205:20;19201:1;19190:9;19186:17;19179:47;19243:131;19369:4;19243:131;:::i;:::-;19235:139;;18962:419;;;:::o;19387:::-;19553:4;19591:2;19580:9;19576:18;19568:26;;19640:9;19634:4;19630:20;19626:1;19615:9;19611:17;19604:47;19668:131;19794:4;19668:131;:::i;:::-;19660:139;;19387:419;;;:::o;19812:222::-;19905:4;19943:2;19932:9;19928:18;19920:26;;19956:71;20024:1;20013:9;20009:17;20000:6;19956:71;:::i;:::-;19812:222;;;;:::o;20040:129::-;20074:6;20101:20;;:::i;:::-;20091:30;;20130:33;20158:4;20150:6;20130:33;:::i;:::-;20040:129;;;:::o;20175:75::-;20208:6;20241:2;20235:9;20225:19;;20175:75;:::o;20256:307::-;20317:4;20407:18;20399:6;20396:30;20393:56;;;20429:18;;:::i;:::-;20393:56;20467:29;20489:6;20467:29;:::i;:::-;20459:37;;20551:4;20545;20541:15;20533:23;;20256:307;;;:::o;20569:308::-;20631:4;20721:18;20713:6;20710:30;20707:56;;;20743:18;;:::i;:::-;20707:56;20781:29;20803:6;20781:29;:::i;:::-;20773:37;;20865:4;20859;20855:15;20847:23;;20569:308;;;:::o;20883:98::-;20934:6;20968:5;20962:12;20952:22;;20883:98;;;:::o;20987:99::-;21039:6;21073:5;21067:12;21057:22;;20987:99;;;:::o;21092:168::-;21175:11;21209:6;21204:3;21197:19;21249:4;21244:3;21240:14;21225:29;;21092:168;;;;:::o;21266:147::-;21367:11;21404:3;21389:18;;21266:147;;;;:::o;21419:169::-;21503:11;21537:6;21532:3;21525:19;21577:4;21572:3;21568:14;21553:29;;21419:169;;;;:::o;21594:148::-;21696:11;21733:3;21718:18;;21594:148;;;;:::o;21748:305::-;21788:3;21807:20;21825:1;21807:20;:::i;:::-;21802:25;;21841:20;21859:1;21841:20;:::i;:::-;21836:25;;21995:1;21927:66;21923:74;21920:1;21917:81;21914:107;;;22001:18;;:::i;:::-;21914:107;22045:1;22042;22038:9;22031:16;;21748:305;;;;:::o;22059:185::-;22099:1;22116:20;22134:1;22116:20;:::i;:::-;22111:25;;22150:20;22168:1;22150:20;:::i;:::-;22145:25;;22189:1;22179:35;;22194:18;;:::i;:::-;22179:35;22236:1;22233;22229:9;22224:14;;22059:185;;;;:::o;22250:348::-;22290:7;22313:20;22331:1;22313:20;:::i;:::-;22308:25;;22347:20;22365:1;22347:20;:::i;:::-;22342:25;;22535:1;22467:66;22463:74;22460:1;22457:81;22452:1;22445:9;22438:17;22434:105;22431:131;;;22542:18;;:::i;:::-;22431:131;22590:1;22587;22583:9;22572:20;;22250:348;;;;:::o;22604:191::-;22644:4;22664:20;22682:1;22664:20;:::i;:::-;22659:25;;22698:20;22716:1;22698:20;:::i;:::-;22693:25;;22737:1;22734;22731:8;22728:34;;;22742:18;;:::i;:::-;22728:34;22787:1;22784;22780:9;22772:17;;22604:191;;;;:::o;22801:96::-;22838:7;22867:24;22885:5;22867:24;:::i;:::-;22856:35;;22801:96;;;:::o;22903:90::-;22937:7;22980:5;22973:13;22966:21;22955:32;;22903:90;;;:::o;22999:149::-;23035:7;23075:66;23068:5;23064:78;23053:89;;22999:149;;;:::o;23154:126::-;23191:7;23231:42;23224:5;23220:54;23209:65;;23154:126;;;:::o;23286:77::-;23323:7;23352:5;23341:16;;23286:77;;;:::o;23369:154::-;23453:6;23448:3;23443;23430:30;23515:1;23506:6;23501:3;23497:16;23490:27;23369:154;;;:::o;23529:307::-;23597:1;23607:113;23621:6;23618:1;23615:13;23607:113;;;23706:1;23701:3;23697:11;23691:18;23687:1;23682:3;23678:11;23671:39;23643:2;23640:1;23636:10;23631:15;;23607:113;;;23738:6;23735:1;23732:13;23729:101;;;23818:1;23809:6;23804:3;23800:16;23793:27;23729:101;23578:258;23529:307;;;:::o;23842:320::-;23886:6;23923:1;23917:4;23913:12;23903:22;;23970:1;23964:4;23960:12;23991:18;23981:81;;24047:4;24039:6;24035:17;24025:27;;23981:81;24109:2;24101:6;24098:14;24078:18;24075:38;24072:84;;;24128:18;;:::i;:::-;24072:84;23893:269;23842:320;;;:::o;24168:281::-;24251:27;24273:4;24251:27;:::i;:::-;24243:6;24239:40;24381:6;24369:10;24366:22;24345:18;24333:10;24330:34;24327:62;24324:88;;;24392:18;;:::i;:::-;24324:88;24432:10;24428:2;24421:22;24211:238;24168:281;;:::o;24455:233::-;24494:3;24517:24;24535:5;24517:24;:::i;:::-;24508:33;;24563:66;24556:5;24553:77;24550:103;;;24633:18;;:::i;:::-;24550:103;24680:1;24673:5;24669:13;24662:20;;24455:233;;;:::o;24694:176::-;24726:1;24743:20;24761:1;24743:20;:::i;:::-;24738:25;;24777:20;24795:1;24777:20;:::i;:::-;24772:25;;24816:1;24806:35;;24821:18;;:::i;:::-;24806:35;24862:1;24859;24855:9;24850:14;;24694:176;;;;:::o;24876:180::-;24924:77;24921:1;24914:88;25021:4;25018:1;25011:15;25045:4;25042:1;25035:15;25062:180;25110:77;25107:1;25100:88;25207:4;25204:1;25197:15;25231:4;25228:1;25221:15;25248:180;25296:77;25293:1;25286:88;25393:4;25390:1;25383:15;25417:4;25414:1;25407:15;25434:180;25482:77;25479:1;25472:88;25579:4;25576:1;25569:15;25603:4;25600:1;25593:15;25620:180;25668:77;25665:1;25658:88;25765:4;25762:1;25755:15;25789:4;25786:1;25779:15;25806:117;25915:1;25912;25905:12;25929:117;26038:1;26035;26028:12;26052:117;26161:1;26158;26151:12;26175:117;26284:1;26281;26274:12;26298:117;26407:1;26404;26397:12;26421:117;26530:1;26527;26520:12;26544:102;26585:6;26636:2;26632:7;26627:2;26620:5;26616:14;26612:28;26602:38;;26544:102;;;:::o;26652:225::-;26792:34;26788:1;26780:6;26776:14;26769:58;26861:8;26856:2;26848:6;26844:15;26837:33;26652:225;:::o;26883:163::-;27023:15;27019:1;27011:6;27007:14;27000:39;26883:163;:::o;27052:168::-;27192:20;27188:1;27180:6;27176:14;27169:44;27052:168;:::o;27226:155::-;27366:7;27362:1;27354:6;27350:14;27343:31;27226:155;:::o;27387:182::-;27527:34;27523:1;27515:6;27511:14;27504:58;27387:182;:::o;27575:234::-;27715:34;27711:1;27703:6;27699:14;27692:58;27784:17;27779:2;27771:6;27767:15;27760:42;27575:234;:::o;27815:179::-;27955:31;27951:1;27943:6;27939:14;27932:55;27815:179;:::o;28000:177::-;28140:29;28136:1;28128:6;28124:14;28117:53;28000:177;:::o;28183:114::-;;:::o;28303:172::-;28443:24;28439:1;28431:6;28427:14;28420:48;28303:172;:::o;28481:122::-;28554:24;28572:5;28554:24;:::i;:::-;28547:5;28544:35;28534:63;;28593:1;28590;28583:12;28534:63;28481:122;:::o;28609:116::-;28679:21;28694:5;28679:21;:::i;:::-;28672:5;28669:32;28659:60;;28715:1;28712;28705:12;28659:60;28609:116;:::o;28731:120::-;28803:23;28820:5;28803:23;:::i;:::-;28796:5;28793:34;28783:62;;28841:1;28838;28831:12;28783:62;28731:120;:::o;28857:122::-;28930:24;28948:5;28930:24;:::i;:::-;28923:5;28920:35;28910:63;;28969:1;28966;28959:12;28910:63;28857:122;:::o
Swarm Source
ipfs://3d64fea53ccfb70ee74ae7f947a88326c8e820957c6edf0927abcfa89ce62951
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.