Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
5,555 CCLB
Holders
1,777
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
5 CCLBLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CoffeeClub
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-29 */ // 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) } } } // File: contracts/CoffeeClub.sol pragma solidity ^0.8.7; // abstract contract Ownable { // address private _owner; // constructor() { // _owner = msg.sender; // } // modifier onlyOwner() { // require(_owner == msg.sender, ""); // _; // } // } contract CoffeeClub is ERC721A, Ownable { bool public mintEnabled = false; constructor() ERC721A("The Coffee Club NFT", "CCLB") { _safeMint(msg.sender, 200); } function mint(uint256 count) external payable { uint256 balance = balanceOf(msg.sender); uint256 free = balance >= 3 ? 0 : (3 - balance); uint256 paid = count > free ? count - free : 0; require(msg.value >= paid * 0.01 ether, "Not enough ETH"); require(totalSupply() + count <= 5555, "Minted Out"); require(mintEnabled, "Not Minting"); _safeMint(msg.sender, count); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "" ); return string(abi.encodePacked("http://m.thecoffeeclubnft.com/", _toString(tokenId), ".json")); } function mintTo(address to, uint256 count) external onlyOwner { _safeMint(to, count); } function withdraw() external onlyOwner { (bool success, ) = payable(msg.sender).call{ value: address(this).balance }(""); require(success, ""); } function flipSale() external onlyOwner { mintEnabled = !mintEnabled; } }
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":[{"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":"flipSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","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":"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
60806040526000600860146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b506040518060400160405280601381526020017f54686520436f6666656520436c7562204e4654000000000000000000000000008152506040518060400160405280600481526020017f43434c42000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b1929190620006bf565b508060039080519060200190620000ca929190620006bf565b50620000db6200011c60201b60201c565b600081905550505062000103620000f76200012160201b60201c565b6200012960201b60201c565b620001163360c8620001ef60201b60201c565b620009c0565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002118282604051806020016040528060008152506200021560201b60201c565b5050565b620002278383620002c660201b60201c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14620002c157600080549050600083820390505b620002706000868380600101945086620004c560201b60201c565b620002a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811062000255578160005414620002be57600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000334576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141562000370576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200038560008483856200063760201b60201c565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506200041483620003f660008660006200063d60201b60201c565b62000407856200066d60201b60201c565b176200067d60201b60201c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106200043857806000819055505050620004c06000848385620006a860201b60201c565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620004f3620006ae60201b60201c565b8786866040518563ffffffff1660e01b81526004016200051794939291906200081b565b602060405180830381600087803b1580156200053257600080fd5b505af19250505080156200056657506040513d601f19601f8201168201806040525081019062000563919062000786565b60015b620005e4573d806000811462000599576040519150601f19603f3d011682016040523d82523d6000602084013e6200059e565b606091505b50600081511415620005dc576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b60008060e883901c905060e86200065c868684620006b660201b60201c565b62ffffff16901b9150509392505050565b60006001821460e11b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b60009392505050565b828054620006cd906200092b565b90600052602060002090601f016020900481019282620006f157600085556200073d565b82601f106200070c57805160ff19168380011785556200073d565b828001600101855582156200073d579182015b828111156200073c5782518255916020019190600101906200071f565b5b5090506200074c919062000750565b5090565b5b808211156200076b57600081600090555060010162000751565b5090565b6000815190506200078081620009a6565b92915050565b6000602082840312156200079f576200079e62000990565b5b6000620007af848285016200076f565b91505092915050565b620007c3816200088b565b82525050565b6000620007d6826200086f565b620007e281856200087a565b9350620007f4818560208601620008f5565b620007ff8162000995565b840191505092915050565b6200081581620008eb565b82525050565b6000608082019050620008326000830187620007b8565b620008416020830186620007b8565b6200085060408301856200080a565b8181036060830152620008648184620007c9565b905095945050505050565b600081519050919050565b600082825260208201905092915050565b60006200089882620008cb565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000915578082015181840152602081019050620008f8565b8381111562000925576000848401525b50505050565b600060028204905060018216806200094457607f821691505b602082108114156200095b576200095a62000961565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b620009b1816200089f565b8114620009bd57600080fd5b50565b61268980620009d06000396000f3fe6080604052600436106101355760003560e01c8063715018a6116100ab578063a22cb4651161006f578063a22cb465146103df578063b88d4fde14610408578063c87b56dd14610431578063d12397301461046e578063e985e9c514610499578063f2fde38b146104d657610135565b8063715018a61461033f5780637ba5e621146103565780638da5cb5b1461036d57806395d89b4114610398578063a0712d68146103c357610135565b806323b872dd116100fd57806323b872dd146102335780633ccfd60b1461025c57806342842e0e14610273578063449a52f81461029c5780636352211e146102c557806370a082311461030257610135565b806301ffc9a71461013a57806306fdde0314610177578063081812fc146101a2578063095ea7b3146101df57806318160ddd14610208575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190611d09565b6104ff565b60405161016e9190612044565b60405180910390f35b34801561018357600080fd5b5061018c610591565b604051610199919061205f565b60405180910390f35b3480156101ae57600080fd5b506101c960048036038101906101c49190611d63565b610623565b6040516101d69190611fdd565b60405180910390f35b3480156101eb57600080fd5b5061020660048036038101906102019190611cc9565b61069f565b005b34801561021457600080fd5b5061021d6107e0565b60405161022a9190612141565b60405180910390f35b34801561023f57600080fd5b5061025a60048036038101906102559190611bb3565b6107f7565b005b34801561026857600080fd5b50610271610b1c565b005b34801561027f57600080fd5b5061029a60048036038101906102959190611bb3565b610bd3565b005b3480156102a857600080fd5b506102c360048036038101906102be9190611cc9565b610bf3565b005b3480156102d157600080fd5b506102ec60048036038101906102e79190611d63565b610c09565b6040516102f99190611fdd565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190611b46565b610c1b565b6040516103369190612141565b60405180910390f35b34801561034b57600080fd5b50610354610cd4565b005b34801561036257600080fd5b5061036b610ce8565b005b34801561037957600080fd5b50610382610d1c565b60405161038f9190611fdd565b60405180910390f35b3480156103a457600080fd5b506103ad610d46565b6040516103ba919061205f565b60405180910390f35b6103dd60048036038101906103d89190611d63565b610dd8565b005b3480156103eb57600080fd5b5061040660048036038101906104019190611c89565b610f31565b005b34801561041457600080fd5b5061042f600480360381019061042a9190611c06565b6110a9565b005b34801561043d57600080fd5b5061045860048036038101906104539190611d63565b61111c565b604051610465919061205f565b60405180910390f35b34801561047a57600080fd5b50610483611195565b6040516104909190612044565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190611b73565b6111a8565b6040516104cd9190612044565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190611b46565b61123c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061055a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061058a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546105a09061239a565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc9061239a565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b5050505050905090565b600061062e826112c0565b610664576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106aa82610c09565b90508073ffffffffffffffffffffffffffffffffffffffff166106cb61131f565b73ffffffffffffffffffffffffffffffffffffffff161461072e576106f7816106f261131f565b6111a8565b61072d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006107ea611327565b6001546000540303905090565b60006108028261132c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610869576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610875846113fa565b9150915061088b818761088661131f565b61141c565b6108d7576108a08661089b61131f565b6111a8565b6108d6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561093e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61094b8686866001611460565b801561095657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610a2485610a00888887611466565b7c02000000000000000000000000000000000000000000000000000000001761148e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610aac576000600185019050600060046000838152602001908152602001600020541415610aaa576000548114610aa9578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610b1486868660016114b9565b505050505050565b610b246114bf565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610b4a90611fc8565b60006040518083038185875af1925050503d8060008114610b87576040519150601f19603f3d011682016040523d82523d6000602084013e610b8c565b606091505b5050905080610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc790612101565b60405180910390fd5b50565b610bee838383604051806020016040528060008152506110a9565b505050565b610bfb6114bf565b610c05828261153d565b5050565b6000610c148261132c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c83576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610cdc6114bf565b610ce6600061155b565b565b610cf06114bf565b600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d559061239a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d819061239a565b8015610dce5780601f10610da357610100808354040283529160200191610dce565b820191906000526020600020905b815481529060010190602001808311610db157829003601f168201915b5050505050905090565b6000610de333610c1b565b905060006003821015610e0257816003610dfd91906122b0565b610e05565b60005b90506000818411610e17576000610e24565b8184610e2391906122b0565b5b9050662386f26fc1000081610e399190612256565b341015610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e72906120a1565b60405180910390fd5b6115b384610e876107e0565b610e919190612200565b1115610ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec990612121565b60405180910390fd5b600860149054906101000a900460ff16610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f18906120c1565b60405180910390fd5b610f2b338561153d565b50505050565b610f3961131f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f9e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fab61131f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661105861131f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161109d9190612044565b60405180910390a35050565b6110b48484846107f7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611116576110df84848484611621565b611115576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611127826112c0565b611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90612101565b60405180910390fd5b61116f82611781565b60405160200161117f9190611f9b565b6040516020818303038152906040529050919050565b600860149054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112446114bf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ab90612081565b60405180910390fd5b6112bd8161155b565b50565b6000816112cb611327565b111580156112da575060005482105b8015611318575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000808290508061133b611327565b116113c3576000548110156113c25760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156113c0575b60008114156113b657600460008360019003935083815260200190815260200160002054905061138b565b80925050506113f5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861147d8686846117db565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6114c76117e4565b73ffffffffffffffffffffffffffffffffffffffff166114e5610d1c565b73ffffffffffffffffffffffffffffffffffffffff161461153b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611532906120e1565b60405180910390fd5b565b6115578282604051806020016040528060008152506117ec565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261164761131f565b8786866040518563ffffffff1660e01b81526004016116699493929190611ff8565b602060405180830381600087803b15801561168357600080fd5b505af19250505080156116b457506040513d601f19601f820116820180604052508101906116b19190611d36565b60015b61172e573d80600081146116e4576040519150601f19603f3d011682016040523d82523d6000602084013e6116e9565b606091505b50600081511415611726576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156117c757600183039250600a81066030018353600a810490506117a7565b508181036020830392508083525050919050565b60009392505050565b600033905090565b6117f68383611889565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461188457600080549050600083820390505b6118366000868380600101945086611621565b61186c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061182357816000541461188157600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118f6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415611931576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193e6000848385611460565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506119b5836119a66000866000611466565b6119af85611a5d565b1761148e565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106119d957806000819055505050611a5860008483856114b9565b505050565b60006001821460e11b9050919050565b6000611a80611a7b84612181565b61215c565b905082815260208101848484011115611a9c57611a9b61248f565b5b611aa7848285612358565b509392505050565b600081359050611abe816125f7565b92915050565b600081359050611ad38161260e565b92915050565b600081359050611ae881612625565b92915050565b600081519050611afd81612625565b92915050565b600082601f830112611b1857611b1761248a565b5b8135611b28848260208601611a6d565b91505092915050565b600081359050611b408161263c565b92915050565b600060208284031215611b5c57611b5b612499565b5b6000611b6a84828501611aaf565b91505092915050565b60008060408385031215611b8a57611b89612499565b5b6000611b9885828601611aaf565b9250506020611ba985828601611aaf565b9150509250929050565b600080600060608486031215611bcc57611bcb612499565b5b6000611bda86828701611aaf565b9350506020611beb86828701611aaf565b9250506040611bfc86828701611b31565b9150509250925092565b60008060008060808587031215611c2057611c1f612499565b5b6000611c2e87828801611aaf565b9450506020611c3f87828801611aaf565b9350506040611c5087828801611b31565b925050606085013567ffffffffffffffff811115611c7157611c70612494565b5b611c7d87828801611b03565b91505092959194509250565b60008060408385031215611ca057611c9f612499565b5b6000611cae85828601611aaf565b9250506020611cbf85828601611ac4565b9150509250929050565b60008060408385031215611ce057611cdf612499565b5b6000611cee85828601611aaf565b9250506020611cff85828601611b31565b9150509250929050565b600060208284031215611d1f57611d1e612499565b5b6000611d2d84828501611ad9565b91505092915050565b600060208284031215611d4c57611d4b612499565b5b6000611d5a84828501611aee565b91505092915050565b600060208284031215611d7957611d78612499565b5b6000611d8784828501611b31565b91505092915050565b611d99816122e4565b82525050565b611da8816122f6565b82525050565b6000611db9826121b2565b611dc381856121c8565b9350611dd3818560208601612367565b611ddc8161249e565b840191505092915050565b6000611df2826121bd565b611dfc81856121e4565b9350611e0c818560208601612367565b611e158161249e565b840191505092915050565b6000611e2b826121bd565b611e3581856121f5565b9350611e45818560208601612367565b80840191505092915050565b6000611e5e601e836121f5565b9150611e69826124af565b601e82019050919050565b6000611e816026836121e4565b9150611e8c826124d8565b604082019050919050565b6000611ea4600e836121e4565b9150611eaf82612527565b602082019050919050565b6000611ec76005836121f5565b9150611ed282612550565b600582019050919050565b6000611eea600b836121e4565b9150611ef582612579565b602082019050919050565b6000611f0d6020836121e4565b9150611f18826125a2565b602082019050919050565b6000611f306000836121d9565b9150611f3b826125cb565b600082019050919050565b6000611f536000836121e4565b9150611f5e826125cb565b600082019050919050565b6000611f76600a836121e4565b9150611f81826125ce565b602082019050919050565b611f958161234e565b82525050565b6000611fa682611e51565b9150611fb28284611e20565b9150611fbd82611eba565b915081905092915050565b6000611fd382611f23565b9150819050919050565b6000602082019050611ff26000830184611d90565b92915050565b600060808201905061200d6000830187611d90565b61201a6020830186611d90565b6120276040830185611f8c565b81810360608301526120398184611dae565b905095945050505050565b60006020820190506120596000830184611d9f565b92915050565b600060208201905081810360008301526120798184611de7565b905092915050565b6000602082019050818103600083015261209a81611e74565b9050919050565b600060208201905081810360008301526120ba81611e97565b9050919050565b600060208201905081810360008301526120da81611edd565b9050919050565b600060208201905081810360008301526120fa81611f00565b9050919050565b6000602082019050818103600083015261211a81611f46565b9050919050565b6000602082019050818103600083015261213a81611f69565b9050919050565b60006020820190506121566000830184611f8c565b92915050565b6000612166612177565b905061217282826123cc565b919050565b6000604051905090565b600067ffffffffffffffff82111561219c5761219b61245b565b5b6121a58261249e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061220b8261234e565b91506122168361234e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561224b5761224a6123fd565b5b828201905092915050565b60006122618261234e565b915061226c8361234e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156122a5576122a46123fd565b5b828202905092915050565b60006122bb8261234e565b91506122c68361234e565b9250828210156122d9576122d86123fd565b5b828203905092915050565b60006122ef8261232e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561238557808201518184015260208101905061236a565b83811115612394576000848401525b50505050565b600060028204905060018216806123b257607f821691505b602082108114156123c6576123c561242c565b5b50919050565b6123d58261249e565b810181811067ffffffffffffffff821117156123f4576123f361245b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f687474703a2f2f6d2e746865636f66666565636c75626e66742e636f6d2f0000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74204d696e74696e67000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f4d696e746564204f757400000000000000000000000000000000000000000000600082015250565b612600816122e4565b811461260b57600080fd5b50565b612617816122f6565b811461262257600080fd5b50565b61262e81612302565b811461263957600080fd5b50565b6126458161234e565b811461265057600080fd5b5056fea26469706673582212206adf45ae9b8ae8c24df9eb991974eeb666031f25fa538727751b37dba384aa7364736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101355760003560e01c8063715018a6116100ab578063a22cb4651161006f578063a22cb465146103df578063b88d4fde14610408578063c87b56dd14610431578063d12397301461046e578063e985e9c514610499578063f2fde38b146104d657610135565b8063715018a61461033f5780637ba5e621146103565780638da5cb5b1461036d57806395d89b4114610398578063a0712d68146103c357610135565b806323b872dd116100fd57806323b872dd146102335780633ccfd60b1461025c57806342842e0e14610273578063449a52f81461029c5780636352211e146102c557806370a082311461030257610135565b806301ffc9a71461013a57806306fdde0314610177578063081812fc146101a2578063095ea7b3146101df57806318160ddd14610208575b600080fd5b34801561014657600080fd5b50610161600480360381019061015c9190611d09565b6104ff565b60405161016e9190612044565b60405180910390f35b34801561018357600080fd5b5061018c610591565b604051610199919061205f565b60405180910390f35b3480156101ae57600080fd5b506101c960048036038101906101c49190611d63565b610623565b6040516101d69190611fdd565b60405180910390f35b3480156101eb57600080fd5b5061020660048036038101906102019190611cc9565b61069f565b005b34801561021457600080fd5b5061021d6107e0565b60405161022a9190612141565b60405180910390f35b34801561023f57600080fd5b5061025a60048036038101906102559190611bb3565b6107f7565b005b34801561026857600080fd5b50610271610b1c565b005b34801561027f57600080fd5b5061029a60048036038101906102959190611bb3565b610bd3565b005b3480156102a857600080fd5b506102c360048036038101906102be9190611cc9565b610bf3565b005b3480156102d157600080fd5b506102ec60048036038101906102e79190611d63565b610c09565b6040516102f99190611fdd565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190611b46565b610c1b565b6040516103369190612141565b60405180910390f35b34801561034b57600080fd5b50610354610cd4565b005b34801561036257600080fd5b5061036b610ce8565b005b34801561037957600080fd5b50610382610d1c565b60405161038f9190611fdd565b60405180910390f35b3480156103a457600080fd5b506103ad610d46565b6040516103ba919061205f565b60405180910390f35b6103dd60048036038101906103d89190611d63565b610dd8565b005b3480156103eb57600080fd5b5061040660048036038101906104019190611c89565b610f31565b005b34801561041457600080fd5b5061042f600480360381019061042a9190611c06565b6110a9565b005b34801561043d57600080fd5b5061045860048036038101906104539190611d63565b61111c565b604051610465919061205f565b60405180910390f35b34801561047a57600080fd5b50610483611195565b6040516104909190612044565b60405180910390f35b3480156104a557600080fd5b506104c060048036038101906104bb9190611b73565b6111a8565b6040516104cd9190612044565b60405180910390f35b3480156104e257600080fd5b506104fd60048036038101906104f89190611b46565b61123c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061055a57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061058a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546105a09061239a565b80601f01602080910402602001604051908101604052809291908181526020018280546105cc9061239a565b80156106195780601f106105ee57610100808354040283529160200191610619565b820191906000526020600020905b8154815290600101906020018083116105fc57829003601f168201915b5050505050905090565b600061062e826112c0565b610664576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106aa82610c09565b90508073ffffffffffffffffffffffffffffffffffffffff166106cb61131f565b73ffffffffffffffffffffffffffffffffffffffff161461072e576106f7816106f261131f565b6111a8565b61072d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006107ea611327565b6001546000540303905090565b60006108028261132c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610869576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610875846113fa565b9150915061088b818761088661131f565b61141c565b6108d7576108a08661089b61131f565b6111a8565b6108d6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561093e576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61094b8686866001611460565b801561095657600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610a2485610a00888887611466565b7c02000000000000000000000000000000000000000000000000000000001761148e565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610aac576000600185019050600060046000838152602001908152602001600020541415610aaa576000548114610aa9578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610b1486868660016114b9565b505050505050565b610b246114bf565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610b4a90611fc8565b60006040518083038185875af1925050503d8060008114610b87576040519150601f19603f3d011682016040523d82523d6000602084013e610b8c565b606091505b5050905080610bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc790612101565b60405180910390fd5b50565b610bee838383604051806020016040528060008152506110a9565b505050565b610bfb6114bf565b610c05828261153d565b5050565b6000610c148261132c565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c83576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610cdc6114bf565b610ce6600061155b565b565b610cf06114bf565b600860149054906101000a900460ff1615600860146101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610d559061239a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d819061239a565b8015610dce5780601f10610da357610100808354040283529160200191610dce565b820191906000526020600020905b815481529060010190602001808311610db157829003601f168201915b5050505050905090565b6000610de333610c1b565b905060006003821015610e0257816003610dfd91906122b0565b610e05565b60005b90506000818411610e17576000610e24565b8184610e2391906122b0565b5b9050662386f26fc1000081610e399190612256565b341015610e7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e72906120a1565b60405180910390fd5b6115b384610e876107e0565b610e919190612200565b1115610ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec990612121565b60405180910390fd5b600860149054906101000a900460ff16610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f18906120c1565b60405180910390fd5b610f2b338561153d565b50505050565b610f3961131f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f9e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610fab61131f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661105861131f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161109d9190612044565b60405180910390a35050565b6110b48484846107f7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611116576110df84848484611621565b611115576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060611127826112c0565b611166576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115d90612101565b60405180910390fd5b61116f82611781565b60405160200161117f9190611f9b565b6040516020818303038152906040529050919050565b600860149054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112446114bf565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156112b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ab90612081565b60405180910390fd5b6112bd8161155b565b50565b6000816112cb611327565b111580156112da575060005482105b8015611318575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000808290508061133b611327565b116113c3576000548110156113c25760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156113c0575b60008114156113b657600460008360019003935083815260200190815260200160002054905061138b565b80925050506113f5565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861147d8686846117db565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6114c76117e4565b73ffffffffffffffffffffffffffffffffffffffff166114e5610d1c565b73ffffffffffffffffffffffffffffffffffffffff161461153b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611532906120e1565b60405180910390fd5b565b6115578282604051806020016040528060008152506117ec565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261164761131f565b8786866040518563ffffffff1660e01b81526004016116699493929190611ff8565b602060405180830381600087803b15801561168357600080fd5b505af19250505080156116b457506040513d601f19601f820116820180604052508101906116b19190611d36565b60015b61172e573d80600081146116e4576040519150601f19603f3d011682016040523d82523d6000602084013e6116e9565b606091505b50600081511415611726576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b80156117c757600183039250600a81066030018353600a810490506117a7565b508181036020830392508083525050919050565b60009392505050565b600033905090565b6117f68383611889565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461188457600080549050600083820390505b6118366000868380600101945086611621565b61186c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81811061182357816000541461188157600080fd5b50505b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156118f6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415611931576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61193e6000848385611460565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506119b5836119a66000866000611466565b6119af85611a5d565b1761148e565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106119d957806000819055505050611a5860008483856114b9565b505050565b60006001821460e11b9050919050565b6000611a80611a7b84612181565b61215c565b905082815260208101848484011115611a9c57611a9b61248f565b5b611aa7848285612358565b509392505050565b600081359050611abe816125f7565b92915050565b600081359050611ad38161260e565b92915050565b600081359050611ae881612625565b92915050565b600081519050611afd81612625565b92915050565b600082601f830112611b1857611b1761248a565b5b8135611b28848260208601611a6d565b91505092915050565b600081359050611b408161263c565b92915050565b600060208284031215611b5c57611b5b612499565b5b6000611b6a84828501611aaf565b91505092915050565b60008060408385031215611b8a57611b89612499565b5b6000611b9885828601611aaf565b9250506020611ba985828601611aaf565b9150509250929050565b600080600060608486031215611bcc57611bcb612499565b5b6000611bda86828701611aaf565b9350506020611beb86828701611aaf565b9250506040611bfc86828701611b31565b9150509250925092565b60008060008060808587031215611c2057611c1f612499565b5b6000611c2e87828801611aaf565b9450506020611c3f87828801611aaf565b9350506040611c5087828801611b31565b925050606085013567ffffffffffffffff811115611c7157611c70612494565b5b611c7d87828801611b03565b91505092959194509250565b60008060408385031215611ca057611c9f612499565b5b6000611cae85828601611aaf565b9250506020611cbf85828601611ac4565b9150509250929050565b60008060408385031215611ce057611cdf612499565b5b6000611cee85828601611aaf565b9250506020611cff85828601611b31565b9150509250929050565b600060208284031215611d1f57611d1e612499565b5b6000611d2d84828501611ad9565b91505092915050565b600060208284031215611d4c57611d4b612499565b5b6000611d5a84828501611aee565b91505092915050565b600060208284031215611d7957611d78612499565b5b6000611d8784828501611b31565b91505092915050565b611d99816122e4565b82525050565b611da8816122f6565b82525050565b6000611db9826121b2565b611dc381856121c8565b9350611dd3818560208601612367565b611ddc8161249e565b840191505092915050565b6000611df2826121bd565b611dfc81856121e4565b9350611e0c818560208601612367565b611e158161249e565b840191505092915050565b6000611e2b826121bd565b611e3581856121f5565b9350611e45818560208601612367565b80840191505092915050565b6000611e5e601e836121f5565b9150611e69826124af565b601e82019050919050565b6000611e816026836121e4565b9150611e8c826124d8565b604082019050919050565b6000611ea4600e836121e4565b9150611eaf82612527565b602082019050919050565b6000611ec76005836121f5565b9150611ed282612550565b600582019050919050565b6000611eea600b836121e4565b9150611ef582612579565b602082019050919050565b6000611f0d6020836121e4565b9150611f18826125a2565b602082019050919050565b6000611f306000836121d9565b9150611f3b826125cb565b600082019050919050565b6000611f536000836121e4565b9150611f5e826125cb565b600082019050919050565b6000611f76600a836121e4565b9150611f81826125ce565b602082019050919050565b611f958161234e565b82525050565b6000611fa682611e51565b9150611fb28284611e20565b9150611fbd82611eba565b915081905092915050565b6000611fd382611f23565b9150819050919050565b6000602082019050611ff26000830184611d90565b92915050565b600060808201905061200d6000830187611d90565b61201a6020830186611d90565b6120276040830185611f8c565b81810360608301526120398184611dae565b905095945050505050565b60006020820190506120596000830184611d9f565b92915050565b600060208201905081810360008301526120798184611de7565b905092915050565b6000602082019050818103600083015261209a81611e74565b9050919050565b600060208201905081810360008301526120ba81611e97565b9050919050565b600060208201905081810360008301526120da81611edd565b9050919050565b600060208201905081810360008301526120fa81611f00565b9050919050565b6000602082019050818103600083015261211a81611f46565b9050919050565b6000602082019050818103600083015261213a81611f69565b9050919050565b60006020820190506121566000830184611f8c565b92915050565b6000612166612177565b905061217282826123cc565b919050565b6000604051905090565b600067ffffffffffffffff82111561219c5761219b61245b565b5b6121a58261249e565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061220b8261234e565b91506122168361234e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561224b5761224a6123fd565b5b828201905092915050565b60006122618261234e565b915061226c8361234e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156122a5576122a46123fd565b5b828202905092915050565b60006122bb8261234e565b91506122c68361234e565b9250828210156122d9576122d86123fd565b5b828203905092915050565b60006122ef8261232e565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561238557808201518184015260208101905061236a565b83811115612394576000848401525b50505050565b600060028204905060018216806123b257607f821691505b602082108114156123c6576123c561242c565b5b50919050565b6123d58261249e565b810181811067ffffffffffffffff821117156123f4576123f361245b565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f687474703a2f2f6d2e746865636f66666565636c75626e66742e636f6d2f0000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74204d696e74696e67000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f4d696e746564204f757400000000000000000000000000000000000000000000600082015250565b612600816122e4565b811461260b57600080fd5b50565b612617816122f6565b811461262257600080fd5b50565b61262e81612302565b811461263957600080fd5b50565b6126458161234e565b811461265057600080fd5b5056fea26469706673582212206adf45ae9b8ae8c24df9eb991974eeb666031f25fa538727751b37dba384aa7364736f6c63430008070033
Deployed Bytecode Sourcemap
48635:1377:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18185:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23832:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25778:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25326:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17239:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35043:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49727:190;;;;;;;;;;;;;:::i;:::-;;26668:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49617:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23621:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18864:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2776:103;;;;;;;;;;;;;:::i;:::-;;49925:84;;;;;;;;;;;;;:::i;:::-;;2128:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24001:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48830:441;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26054:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26924:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49279:330;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48684:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26433:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3034:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18185:615;18270:4;18585:10;18570:25;;:11;:25;;;;:102;;;;18662:10;18647:25;;:11;:25;;;;18570:102;:179;;;;18739:10;18724:25;;:11;:25;;;;18570:179;18550:199;;18185:615;;;:::o;23832:100::-;23886:13;23919:5;23912:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23832:100;:::o;25778:204::-;25846:7;25871:16;25879:7;25871;:16::i;:::-;25866:64;;25896:34;;;;;;;;;;;;;;25866:64;25950:15;:24;25966:7;25950:24;;;;;;;;;;;;;;;;;;;;;25943:31;;25778:204;;;:::o;25326:386::-;25399:13;25415:16;25423:7;25415;:16::i;:::-;25399:32;;25471:5;25448:28;;:19;:17;:19::i;:::-;:28;;;25444:175;;25496:44;25513:5;25520:19;:17;:19::i;:::-;25496:16;:44::i;:::-;25491:128;;25568:35;;;;;;;;;;;;;;25491:128;25444:175;25658:2;25631:15;:24;25647:7;25631:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25696:7;25692:2;25676:28;;25685:5;25676:28;;;;;;;;;;;;25388:324;25326:386;;:::o;17239:315::-;17292:7;17520:15;:13;:15::i;:::-;17505:12;;17489:13;;:28;:46;17482:53;;17239:315;:::o;35043:2800::-;35177:27;35207;35226:7;35207:18;:27::i;:::-;35177:57;;35292:4;35251:45;;35267:19;35251:45;;;35247:86;;35305:28;;;;;;;;;;;;;;35247:86;35347:27;35376:23;35403:28;35423:7;35403:19;:28::i;:::-;35346:85;;;;35531:62;35550:15;35567:4;35573:19;:17;:19::i;:::-;35531:18;:62::i;:::-;35526:174;;35613:43;35630:4;35636:19;:17;:19::i;:::-;35613:16;:43::i;:::-;35608:92;;35665:35;;;;;;;;;;;;;;35608:92;35526:174;35731:1;35717:16;;:2;:16;;;35713:52;;;35742:23;;;;;;;;;;;;;;35713:52;35778:43;35800:4;35806:2;35810:7;35819:1;35778:21;:43::i;:::-;35914:15;35911:160;;;36054:1;36033:19;36026:30;35911:160;36449:18;:24;36468:4;36449:24;;;;;;;;;;;;;;;;36447:26;;;;;;;;;;;;36518:18;:22;36537:2;36518:22;;;;;;;;;;;;;;;;36516:24;;;;;;;;;;;36840:145;36877:2;36925:45;36940:4;36946:2;36950:19;36925:14;:45::i;:::-;14467:8;36898:72;36840:18;:145::i;:::-;36811:17;:26;36829:7;36811:26;;;;;;;;;;;:174;;;;37155:1;14467:8;37105:19;:46;:51;37101:626;;;37177:19;37209:1;37199:7;:11;37177:33;;37366:1;37332:17;:30;37350:11;37332:30;;;;;;;;;;;;:35;37328:384;;;37470:13;;37455:11;:28;37451:242;;37650:19;37617:17;:30;37635:11;37617:30;;;;;;;;;;;:52;;;;37451:242;37328:384;37158:569;37101:626;37774:7;37770:2;37755:27;;37764:4;37755:27;;;;;;;;;;;;37793:42;37814:4;37820:2;37824:7;37833:1;37793:20;:42::i;:::-;35166:2677;;;35043:2800;;;:::o;49727:190::-;2014:13;:11;:13::i;:::-;49778:12:::1;49804:10;49796:24;;49842:21;49796:82;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49777:101;;;49897:7;49889:20;;;;;;;;;;;;:::i;:::-;;;;;;;;;49766:151;49727:190::o:0;26668:185::-;26806:39;26823:4;26829:2;26833:7;26806:39;;;;;;;;;;;;:16;:39::i;:::-;26668:185;;;:::o;49617:102::-;2014:13;:11;:13::i;:::-;49691:20:::1;49701:2;49705:5;49691:9;:20::i;:::-;49617:102:::0;;:::o;23621:144::-;23685:7;23728:27;23747:7;23728:18;:27::i;:::-;23705:52;;23621:144;;;:::o;18864:224::-;18928:7;18969:1;18952:19;;:5;:19;;;18948:60;;;18980:28;;;;;;;;;;;;;;18948:60;13419:13;19026:18;:25;19045:5;19026:25;;;;;;;;;;;;;;;;:54;19019:61;;18864:224;;;:::o;2776:103::-;2014:13;:11;:13::i;:::-;2841:30:::1;2868:1;2841:18;:30::i;:::-;2776:103::o:0;49925:84::-;2014:13;:11;:13::i;:::-;49990:11:::1;;;;;;;;;;;49989:12;49975:11;;:26;;;;;;;;;;;;;;;;;;49925:84::o:0;2128:87::-;2174:7;2201:6;;;;;;;;;;;2194:13;;2128:87;:::o;24001:104::-;24057:13;24090:7;24083:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24001:104;:::o;48830:441::-;48887:15;48905:21;48915:10;48905:9;:21::i;:::-;48887:39;;48937:12;48963:1;48952:7;:12;;:32;;48976:7;48972:1;:11;;;;:::i;:::-;48952:32;;;48967:1;48952:32;48937:47;;48995:12;49018:4;49010:5;:12;:31;;49040:1;49010:31;;;49033:4;49025:5;:12;;;;:::i;:::-;49010:31;48995:46;;49084:10;49077:4;:17;;;;:::i;:::-;49064:9;:30;;49056:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;49157:4;49148:5;49132:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:29;;49124:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;49195:11;;;;;;;;;;;49187:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;49235:28;49245:10;49257:5;49235:9;:28::i;:::-;48876:395;;;48830:441;:::o;26054:308::-;26165:19;:17;:19::i;:::-;26153:31;;:8;:31;;;26149:61;;;26193:17;;;;;;;;;;;;;;26149:61;26275:8;26223:18;:39;26242:19;:17;:19::i;:::-;26223:39;;;;;;;;;;;;;;;:49;26263:8;26223:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26335:8;26299:55;;26314:19;:17;:19::i;:::-;26299:55;;;26345:8;26299:55;;;;;;:::i;:::-;;;;;;;;26054:308;;:::o;26924:399::-;27091:31;27104:4;27110:2;27114:7;27091:12;:31::i;:::-;27155:1;27137:2;:14;;;:19;27133:183;;27176:56;27207:4;27213:2;27217:7;27226:5;27176:30;:56::i;:::-;27171:145;;27260:40;;;;;;;;;;;;;;27171:145;27133:183;26924:399;;;;:::o;49279:330::-;49397:13;49450:16;49458:7;49450;:16::i;:::-;49428:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49572:18;49582:7;49572:9;:18::i;:::-;49521:79;;;;;;;;:::i;:::-;;;;;;;;;;;;;49507:94;;49279:330;;;:::o;48684:31::-;;;;;;;;;;;;;:::o;26433:164::-;26530:4;26554:18;:25;26573:5;26554:25;;;;;;;;;;;;;;;:35;26580:8;26554:35;;;;;;;;;;;;;;;;;;;;;;;;;26547:42;;26433:164;;;;:::o;3034:201::-;2014:13;:11;:13::i;:::-;3143:1:::1;3123:22;;:8;:22;;;;3115:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;3199:28;3218:8;3199:18;:28::i;:::-;3034:201:::0;:::o;27578:273::-;27635:4;27691:7;27672:15;:13;:15::i;:::-;:26;;:66;;;;;27725:13;;27715:7;:23;27672:66;:152;;;;;27823:1;14189:8;27776:17;:26;27794:7;27776:26;;;;;;;;;;;;:43;:48;27672:152;27652:172;;27578:273;;;:::o;46139:105::-;46199:7;46226:10;46219:17;;46139:105;:::o;16763:92::-;16819:7;16763:92;:::o;20538:1129::-;20605:7;20625:12;20640:7;20625:22;;20708:4;20689:15;:13;:15::i;:::-;:23;20685:915;;20742:13;;20735:4;:20;20731:869;;;20780:14;20797:17;:23;20815:4;20797:23;;;;;;;;;;;;20780:40;;20913:1;14189:8;20886:6;:23;:28;20882:699;;;21405:113;21422:1;21412:6;:11;21405:113;;;21465:17;:25;21483:6;;;;;;;21465:25;;;;;;;;;;;;21456:34;;21405:113;;;21551:6;21544:13;;;;;;20882:699;20757:843;20731:869;20685:915;21628:31;;;;;;;;;;;;;;20538:1129;;;;:::o;33379:652::-;33474:27;33503:23;33544:53;33600:15;33544:71;;33786:7;33780:4;33773:21;33821:22;33815:4;33808:36;33897:4;33891;33881:21;33858:44;;33993:19;33987:26;33968:45;;33724:300;33379:652;;;:::o;34144:645::-;34286:11;34448:15;34442:4;34438:26;34430:34;;34607:15;34596:9;34592:31;34579:44;;34754:15;34743:9;34740:30;34733:4;34722:9;34719:19;34716:55;34706:65;;34144:645;;;;;:::o;44972:159::-;;;;;:::o;43284:309::-;43419:7;43439:16;14590:3;43465:19;:40;;43439:67;;14590:3;43532:31;43543:4;43549:2;43553:9;43532:10;:31::i;:::-;43524:40;;:61;;43517:68;;;43284:309;;;;;:::o;23112:447::-;23192:14;23360:15;23353:5;23349:27;23340:36;;23534:5;23520:11;23496:22;23492:40;23489:51;23482:5;23479:62;23469:72;;23112:447;;;;:::o;45790:158::-;;;;;:::o;2293:132::-;2368:12;:10;:12::i;:::-;2357:23;;:7;:5;:7::i;:::-;:23;;;2349:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2293:132::o;27935:104::-;28004:27;28014:2;28018:8;28004:27;;;;;;;;;;;;:9;:27::i;:::-;27935:104;;:::o;3395:191::-;3469:16;3488:6;;;;;;;;;;;3469:25;;3514:8;3505:6;;:17;;;;;;;;;;;;;;;;;;3569:8;3538:40;;3559:8;3538:40;;;;;;;;;;;;3458:128;3395:191;:::o;41794:716::-;41957:4;42003:2;41978:45;;;42024:19;:17;:19::i;:::-;42045:4;42051:7;42060:5;41978:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;41974:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42278:1;42261:6;:13;:18;42257:235;;;42307:40;;;;;;;;;;;;;;42257:235;42450:6;42444:13;42435:6;42431:2;42427:15;42420:38;41974:529;42147:54;;;42137:64;;;:6;:64;;;;42130:71;;;41794:716;;;;;;:::o;46350:1960::-;46407:17;46826:3;46819:4;46813:11;46809:21;46802:28;;46917:3;46911:4;46904:17;47023:3;47479:5;47609:1;47604:3;47600:11;47593:18;;47746:2;47740:4;47736:13;47732:2;47728:22;47723:3;47715:36;47787:2;47781:4;47777:13;47769:21;;47371:697;47806:4;47371:697;;;47997:1;47992:3;47988:11;47981:18;;48048:2;48042:4;48038:13;48034:2;48030:22;48025:3;48017:36;47901:2;47895:4;47891:13;47883:21;;47371:697;;;47375:430;48107:3;48102;48098:13;48222:2;48217:3;48213:12;48206:19;;48285:6;48280:3;48273:19;46446:1857;;46350:1960;;;:::o;44169:147::-;44306:6;44169:147;;;;;:::o;679:98::-;732:7;759:10;752:17;;679:98;:::o;28455:681::-;28578:19;28584:2;28588:8;28578:5;:19::i;:::-;28657:1;28639:2;:14;;;:19;28635:483;;28679:11;28693:13;;28679:27;;28725:13;28747:8;28741:3;:14;28725:30;;28774:233;28805:62;28844:1;28848:2;28852:7;;;;;;28861:5;28805:30;:62::i;:::-;28800:167;;28903:40;;;;;;;;;;;;;;28800:167;29002:3;28994:5;:11;28774:233;;29089:3;29072:13;;:20;29068:34;;29094:8;;;29068:34;28660:458;;28635:483;28455:681;;;:::o;29409:1529::-;29474:20;29497:13;;29474:36;;29539:1;29525:16;;:2;:16;;;29521:48;;;29550:19;;;;;;;;;;;;;;29521:48;29596:1;29584:8;:13;29580:44;;;29606:18;;;;;;;;;;;;;;29580:44;29637:61;29667:1;29671:2;29675:12;29689:8;29637:21;:61::i;:::-;30180:1;13556:2;30151:1;:25;;30150:31;30138:8;:44;30112:18;:22;30131:2;30112:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;30459:139;30496:2;30550:33;30573:1;30577:2;30581:1;30550:14;:33::i;:::-;30517:30;30538:8;30517:20;:30::i;:::-;:66;30459:18;:139::i;:::-;30425:17;:31;30443:12;30425:31;;;;;;;;;;;:173;;;;30615:15;30633:12;30615:30;;30660:11;30689:8;30674:12;:23;30660:37;;30712:101;30764:9;;;;;;30760:2;30739:35;;30756:1;30739:35;;;;;;;;;;;;30808:3;30798:7;:13;30712:101;;30845:3;30829:13;:19;;;;29886:974;;30870:60;30899:1;30903:2;30907:12;30921:8;30870:20;:60::i;:::-;29463:1475;29409:1529;;:::o;24942:322::-;25012:14;25243:1;25233:8;25230:15;25205:23;25201:45;25191:55;;24942:322;;;:::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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7223:402::-;7383:3;7404:85;7486:2;7481:3;7404:85;:::i;:::-;7397:92;;7498:93;7587:3;7498:93;:::i;:::-;7616:2;7611:3;7607:12;7600:19;;7223:402;;;:::o;7631:366::-;7773:3;7794:67;7858:2;7853:3;7794:67;:::i;:::-;7787:74;;7870:93;7959:3;7870:93;:::i;:::-;7988:2;7983:3;7979:12;7972:19;;7631:366;;;:::o;8003:::-;8145:3;8166:67;8230:2;8225:3;8166:67;:::i;:::-;8159:74;;8242:93;8331:3;8242:93;:::i;:::-;8360:2;8355:3;8351:12;8344:19;;8003:366;;;:::o;8375:400::-;8535:3;8556:84;8638:1;8633:3;8556:84;:::i;:::-;8549:91;;8649:93;8738:3;8649:93;:::i;:::-;8767:1;8762:3;8758:11;8751:18;;8375:400;;;:::o;8781:366::-;8923:3;8944:67;9008:2;9003:3;8944:67;:::i;:::-;8937:74;;9020:93;9109:3;9020:93;:::i;:::-;9138:2;9133:3;9129:12;9122:19;;8781:366;;;:::o;9153:::-;9295:3;9316:67;9380:2;9375:3;9316:67;:::i;:::-;9309:74;;9392:93;9481:3;9392:93;:::i;:::-;9510:2;9505:3;9501:12;9494:19;;9153:366;;;:::o;9525:398::-;9684:3;9705:83;9786:1;9781:3;9705:83;:::i;:::-;9698:90;;9797:93;9886:3;9797:93;:::i;:::-;9915:1;9910:3;9906:11;9899:18;;9525:398;;;:::o;9929:364::-;10071:3;10092:66;10156:1;10151:3;10092:66;:::i;:::-;10085:73;;10167:93;10256:3;10167:93;:::i;:::-;10285:1;10280:3;10276:11;10269:18;;9929:364;;;:::o;10299:366::-;10441:3;10462:67;10526:2;10521:3;10462:67;:::i;:::-;10455:74;;10538:93;10627:3;10538:93;:::i;:::-;10656:2;10651:3;10647:12;10640:19;;10299:366;;;:::o;10671:118::-;10758:24;10776:5;10758:24;:::i;:::-;10753:3;10746:37;10671:118;;:::o;10795:807::-;11129:3;11151:148;11295:3;11151:148;:::i;:::-;11144:155;;11316:95;11407:3;11398:6;11316:95;:::i;:::-;11309:102;;11428:148;11572:3;11428:148;:::i;:::-;11421:155;;11593:3;11586:10;;10795:807;;;;:::o;11608:379::-;11792:3;11814:147;11957:3;11814:147;:::i;:::-;11807:154;;11978:3;11971:10;;11608:379;;;:::o;11993:222::-;12086:4;12124:2;12113:9;12109:18;12101:26;;12137:71;12205:1;12194:9;12190:17;12181:6;12137:71;:::i;:::-;11993:222;;;;:::o;12221:640::-;12416:4;12454:3;12443:9;12439:19;12431:27;;12468:71;12536:1;12525:9;12521:17;12512:6;12468:71;:::i;:::-;12549:72;12617:2;12606:9;12602:18;12593:6;12549:72;:::i;:::-;12631;12699:2;12688:9;12684:18;12675:6;12631:72;:::i;:::-;12750:9;12744:4;12740:20;12735:2;12724:9;12720:18;12713:48;12778:76;12849:4;12840:6;12778:76;:::i;:::-;12770:84;;12221:640;;;;;;;:::o;12867:210::-;12954:4;12992:2;12981:9;12977:18;12969:26;;13005:65;13067:1;13056:9;13052:17;13043:6;13005:65;:::i;:::-;12867:210;;;;:::o;13083:313::-;13196:4;13234:2;13223:9;13219:18;13211:26;;13283:9;13277:4;13273:20;13269:1;13258:9;13254:17;13247:47;13311:78;13384:4;13375:6;13311:78;:::i;:::-;13303:86;;13083:313;;;;:::o;13402:419::-;13568:4;13606:2;13595:9;13591:18;13583:26;;13655:9;13649:4;13645:20;13641:1;13630:9;13626:17;13619:47;13683:131;13809:4;13683:131;:::i;:::-;13675:139;;13402:419;;;:::o;13827:::-;13993:4;14031:2;14020:9;14016:18;14008:26;;14080:9;14074:4;14070:20;14066:1;14055:9;14051:17;14044:47;14108:131;14234:4;14108:131;:::i;:::-;14100:139;;13827:419;;;:::o;14252:::-;14418:4;14456:2;14445:9;14441:18;14433:26;;14505:9;14499:4;14495:20;14491:1;14480:9;14476:17;14469:47;14533:131;14659:4;14533:131;:::i;:::-;14525:139;;14252:419;;;:::o;14677:::-;14843:4;14881:2;14870:9;14866:18;14858:26;;14930:9;14924:4;14920:20;14916:1;14905:9;14901:17;14894:47;14958:131;15084:4;14958:131;:::i;:::-;14950:139;;14677:419;;;:::o;15102:::-;15268:4;15306:2;15295:9;15291:18;15283:26;;15355:9;15349:4;15345:20;15341:1;15330:9;15326:17;15319:47;15383:131;15509:4;15383:131;:::i;:::-;15375:139;;15102:419;;;:::o;15527:::-;15693:4;15731:2;15720:9;15716:18;15708:26;;15780:9;15774:4;15770:20;15766:1;15755:9;15751:17;15744:47;15808:131;15934:4;15808:131;:::i;:::-;15800:139;;15527:419;;;:::o;15952:222::-;16045:4;16083:2;16072:9;16068:18;16060:26;;16096:71;16164:1;16153:9;16149:17;16140:6;16096:71;:::i;:::-;15952:222;;;;:::o;16180:129::-;16214:6;16241:20;;:::i;:::-;16231:30;;16270:33;16298:4;16290:6;16270:33;:::i;:::-;16180:129;;;:::o;16315:75::-;16348:6;16381:2;16375:9;16365:19;;16315:75;:::o;16396:307::-;16457:4;16547:18;16539:6;16536:30;16533:56;;;16569:18;;:::i;:::-;16533:56;16607:29;16629:6;16607:29;:::i;:::-;16599:37;;16691:4;16685;16681:15;16673:23;;16396:307;;;:::o;16709:98::-;16760:6;16794:5;16788:12;16778:22;;16709:98;;;:::o;16813:99::-;16865:6;16899:5;16893:12;16883:22;;16813:99;;;:::o;16918:168::-;17001:11;17035:6;17030:3;17023:19;17075:4;17070:3;17066:14;17051:29;;16918:168;;;;:::o;17092:147::-;17193:11;17230:3;17215:18;;17092:147;;;;:::o;17245:169::-;17329:11;17363:6;17358:3;17351:19;17403:4;17398:3;17394:14;17379:29;;17245:169;;;;:::o;17420:148::-;17522:11;17559:3;17544:18;;17420:148;;;;:::o;17574:305::-;17614:3;17633:20;17651:1;17633:20;:::i;:::-;17628:25;;17667:20;17685:1;17667:20;:::i;:::-;17662:25;;17821:1;17753:66;17749:74;17746:1;17743:81;17740:107;;;17827:18;;:::i;:::-;17740:107;17871:1;17868;17864:9;17857:16;;17574:305;;;;:::o;17885:348::-;17925:7;17948:20;17966:1;17948:20;:::i;:::-;17943:25;;17982:20;18000:1;17982:20;:::i;:::-;17977:25;;18170:1;18102:66;18098:74;18095:1;18092:81;18087:1;18080:9;18073:17;18069:105;18066:131;;;18177:18;;:::i;:::-;18066:131;18225:1;18222;18218:9;18207:20;;17885:348;;;;:::o;18239:191::-;18279:4;18299:20;18317:1;18299:20;:::i;:::-;18294:25;;18333:20;18351:1;18333:20;:::i;:::-;18328:25;;18372:1;18369;18366:8;18363:34;;;18377:18;;:::i;:::-;18363:34;18422:1;18419;18415:9;18407:17;;18239:191;;;;:::o;18436:96::-;18473:7;18502:24;18520:5;18502:24;:::i;:::-;18491:35;;18436:96;;;:::o;18538:90::-;18572:7;18615:5;18608:13;18601:21;18590:32;;18538:90;;;:::o;18634:149::-;18670:7;18710:66;18703:5;18699:78;18688:89;;18634:149;;;:::o;18789:126::-;18826:7;18866:42;18859:5;18855:54;18844:65;;18789:126;;;:::o;18921:77::-;18958:7;18987:5;18976:16;;18921:77;;;:::o;19004:154::-;19088:6;19083:3;19078;19065:30;19150:1;19141:6;19136:3;19132:16;19125:27;19004:154;;;:::o;19164:307::-;19232:1;19242:113;19256:6;19253:1;19250:13;19242:113;;;19341:1;19336:3;19332:11;19326:18;19322:1;19317:3;19313:11;19306:39;19278:2;19275:1;19271:10;19266:15;;19242:113;;;19373:6;19370:1;19367:13;19364:101;;;19453:1;19444:6;19439:3;19435:16;19428:27;19364:101;19213:258;19164:307;;;:::o;19477:320::-;19521:6;19558:1;19552:4;19548:12;19538:22;;19605:1;19599:4;19595:12;19626:18;19616:81;;19682:4;19674:6;19670:17;19660:27;;19616:81;19744:2;19736:6;19733:14;19713:18;19710:38;19707:84;;;19763:18;;:::i;:::-;19707:84;19528:269;19477:320;;;:::o;19803:281::-;19886:27;19908:4;19886:27;:::i;:::-;19878:6;19874:40;20016:6;20004:10;20001:22;19980:18;19968:10;19965:34;19962:62;19959:88;;;20027:18;;:::i;:::-;19959:88;20067:10;20063:2;20056:22;19846:238;19803:281;;:::o;20090:180::-;20138:77;20135:1;20128:88;20235:4;20232:1;20225:15;20259:4;20256:1;20249:15;20276:180;20324:77;20321:1;20314:88;20421:4;20418:1;20411:15;20445:4;20442:1;20435:15;20462:180;20510:77;20507:1;20500:88;20607:4;20604:1;20597:15;20631:4;20628:1;20621:15;20648:117;20757:1;20754;20747:12;20771:117;20880:1;20877;20870:12;20894:117;21003:1;21000;20993:12;21017:117;21126:1;21123;21116:12;21140:102;21181:6;21232:2;21228:7;21223:2;21216:5;21212:14;21208:28;21198:38;;21140:102;;;:::o;21248:184::-;21388:32;21384:1;21376:6;21372:14;21365:56;21248:184;:::o;21442:237::-;21586:34;21582:1;21574:6;21570:14;21563:58;21659:8;21654:2;21646:6;21642:15;21635:33;21442:237;:::o;21689:172::-;21833:16;21829:1;21821:6;21817:14;21810:40;21689:172;:::o;21871:163::-;22015:7;22011:1;22003:6;21999:14;21992:31;21871:163;:::o;22044:169::-;22188:13;22184:1;22176:6;22172:14;22165:37;22044:169;:::o;22223:190::-;22367:34;22363:1;22355:6;22351:14;22344:58;22223:190;:::o;22423:118::-;;:::o;22551:168::-;22695:12;22691:1;22683:6;22679:14;22672:36;22551:168;:::o;22729:130::-;22806:24;22824:5;22806:24;:::i;:::-;22799:5;22796:35;22786:63;;22845:1;22842;22835:12;22786:63;22729:130;:::o;22869:124::-;22943:21;22958:5;22943:21;:::i;:::-;22936:5;22933:32;22923:60;;22979:1;22976;22969:12;22923:60;22869:124;:::o;23003:128::-;23079:23;23096:5;23079:23;:::i;:::-;23072:5;23069:34;23059:62;;23117:1;23114;23107:12;23059:62;23003:128;:::o;23141:130::-;23218:24;23236:5;23218:24;:::i;:::-;23211:5;23208:35;23198:63;;23257:1;23254;23247:12;23198:63;23141:130;:::o
Swarm Source
ipfs://6adf45ae9b8ae8c24df9eb991974eeb666031f25fa538727751b37dba384aa73
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.