Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
10,000 BAIYC
Holders
1,043
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 BAIYCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
BoredAIYachtClub
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-03 */ // File: IERC721A.sol // ERC721A Contracts v4.0.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(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * 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(); 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; } /** * @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); } // File: ERC721A.sol // ERC721A Contracts v4.0.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 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` 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 (_addressToUint256(owner) == 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 auxillary 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 auxillary 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; assembly { // Cast aux without masking. 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; } /** * 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 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, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner) revert ApprovalToCurrentOwner(); 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-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(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. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @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 _transfer( address from, address to, uint256 tokenId ) private { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); address approvedAddress = _tokenApprovals[tokenId]; bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (_addressToUint256(to) == 0) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // 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] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // 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)); address approvedAddress = _tokenApprovals[tokenId]; if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // 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] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // 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 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: IERC721ABurnable.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721ABurnable compliant contract. */ interface IERC721ABurnable is IERC721A { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) external; } // File: ERC721ABurnable.sol // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Burnable Token * @dev ERC721A Token that can be irreversibly burned (destroyed). */ abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable { /** * @dev Burns `tokenId`. See {ERC721A-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual override { _burn(tokenId, true); } } // File: @openzeppelin/[email protected]/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/[email protected]/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/[email protected]/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: BoredAIYachtClub.sol pragma solidity ^0.8.11; contract BoredAIYachtClub is ERC721ABurnable, Ownable { using Strings for uint256; // metadata string public baseURI = "https://mint.boredapeyc.ai/metadata.php?tokenId="; // constants uint256 public constant FREE_MINTS = 2500; uint256 public constant TOTAL_SUPPLY = 10000; uint256 public constant PER_WALLET_LIMIT_PHASE1 = 10; uint256 public constant PER_WALLET_LIMIT_PHASE2 = 100; uint256 public constant PER_TX_LIMIT_PHASE1 = 3; uint256 public constant PER_TX_LIMIT_PHASE2 = 50; uint256 public constant MIN_BALANCE_PHASE1 = 0.05 ether; // sale settings bool public mintPaused = true; uint256 public price = 0.05 ether; mapping (address => uint256) public mintedPerWallet; mapping (address => bool) public whitelist; mapping (address => bool) public usedWhitelist; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection, and by setting supply caps, mint indexes, and reserves */ constructor() ERC721A("Bored AI Yacht Club", "BAIYC") { _mint(owner(), 100); } /** * ------------ CONFIG ------------ */ /** * @dev Gets base metadata URI */ function _baseURI() internal view override returns (string memory) { return baseURI; } /** * @dev Sets base metadata URI, callable by owner */ function setBaseUri(string memory _uri) external onlyOwner { baseURI = _uri; } /** * @dev Pause/unpause sale or presale */ function togglePauseMinting() external onlyOwner { mintPaused = !mintPaused; } /** * @dev Set price */ function setPrice(uint256 newPriceInWei) external onlyOwner { price = newPriceInWei; } /** * ------------ WHITELIST ------------ */ /** * @dev Add to whitelist */ function whitelistAddreses(address[] calldata addresses) public onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = true; } } /** * @dev Remove from whitelist */ function unwhitelistAddreses(address[] calldata addresses) public onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { whitelist[addresses[i]] = false; } } /** * ------------ MINTING ------------ */ /** * @dev Owner minting */ function airdropOwner(address[] calldata addresses, uint256[] calldata counts) public onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { require(_nextTokenId() + counts[i] <= TOTAL_SUPPLY, "Supply exceeded"); _mint(addresses[i], counts[i]); } } /** * @dev Public minting during public sale or presale */ function mint(uint256 count) public payable{ require(count > 0, "Count can't be 0"); require(!mintPaused, "Minting is currently paused"); require(_nextTokenId() + count <= TOTAL_SUPPLY, "Supply exceeded"); if (_nextTokenId() < FREE_MINTS) { // free mint require(msg.value == 0, "Wrong ETH amount"); require(count <= PER_TX_LIMIT_PHASE1, "Per TX limit exceeded"); require(mintedPerWallet[msg.sender] + count <= PER_WALLET_LIMIT_PHASE1, "Per wallet limit exceeded"); require(msg.sender.balance >= MIN_BALANCE_PHASE1, "Wallet balance too low"); usedWhitelist[msg.sender] = true; } else { // paid mint uint256 payableCount = count; if (whitelist[msg.sender] && !usedWhitelist[msg.sender]) { payableCount--; usedWhitelist[msg.sender] = true; } require(msg.value == price * payableCount, "Wrong ETH amount"); require(count <= PER_TX_LIMIT_PHASE2, "Per TX limit exceeded"); require(mintedPerWallet[msg.sender] + count <= PER_WALLET_LIMIT_PHASE2, "Per wallet limit exceeded"); } mintedPerWallet[msg.sender] += count; _mint(msg.sender, count); } /** * @dev Returns current mint index */ function nextTokenId() public view returns (uint256) { return _nextTokenId(); } /** * @dev Withdraw ether from this contract, callable by owner */ function withdraw() external onlyOwner{ uint256 balance = address(this).balance; payable(owner()).transfer(balance); } }
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":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_BALANCE_PHASE1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_TX_LIMIT_PHASE1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_TX_LIMIT_PHASE2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_WALLET_LIMIT_PHASE1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PER_WALLET_LIMIT_PHASE2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"counts","type":"uint256[]"}],"name":"airdropOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","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":"mintPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPriceInWei","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePauseMinting","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"unwhitelistAddreses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usedWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"whitelistAddreses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e060405260306080818152906200237660a0398051620000299160099160209091019062000229565b50600a805460ff1916600117905566b1a2bc2ec50000600b553480156200004f57600080fd5b50604080518082018252601381527f426f72656420414920596163687420436c756200000000000000000000000000602080830191825283518085019094526005845264424149594360d81b908401528151919291620000b29160029162000229565b508051620000c890600390602084019062000229565b50506000805550620000da33620000ff565b620000f9620000f16008546001600160a01b031690565b606462000151565b6200030c565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054826200017257604051622e076360e81b815260040160405180910390fd5b81620001915760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526005602090815260408083208054680100000000000000018702019055838352600490915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210620001dc5750600055505050565b8280546200023790620002cf565b90600052602060002090601f0160209004810192826200025b5760008555620002a6565b82601f106200027657805160ff1916838001178555620002a6565b82800160010185558215620002a6579182015b82811115620002a657825182559160200191906001019062000289565b50620002b4929150620002b8565b5090565b5b80821115620002b45760008155600101620002b9565b600181811c90821680620002e457607f821691505b602082108114156200030657634e487b7160e01b600052602260045260246000fd5b50919050565b61205a806200031c6000396000f3fe60806040526004361061023b5760003560e01c8063764267b61161012e578063a0bcfc7f116100ab578063d6d651761161006f578063d6d6517614610654578063d88527ab14610674578063df529c771461068f578063e985e9c5146106bf578063f2fde38b1461070857600080fd5b8063a0bcfc7f146105bf578063a22cb465146105df578063a5edca2c146105ff578063b88d4fde14610614578063c87b56dd1461063457600080fd5b806391b7f5ed116100f257806391b7f5ed1461053157806395d89b41146105515780639b19251a14610566578063a035b1fe14610596578063a0712d68146105ac57600080fd5b8063764267b6146104b85780637e4831d3146104ce5780638aaf6ead146104e85780638da5cb5b146104fd578063902d55a51461051b57600080fd5b80633a602b4d116101bc5780636352211e116101805780636352211e146104395780636c0360eb1461045957806370a082311461046e578063715018a61461048e57806375794a3c146104a357600080fd5b80633a602b4d146103a25780633ccfd60b146103cf5780633e53afc3146103e457806342842e0e146103f957806342966c681461041957600080fd5b80631134016c116102035780631134016c1461031457806318160ddd1461033457806319b78fe81461034d57806323b872dd146103625780632c9bee891461038257600080fd5b806301ffc9a71461024057806303943a4c1461027557806306fdde0314610298578063081812fc146102ba578063095ea7b3146102f2575b600080fd5b34801561024c57600080fd5b5061026061025b366004611a9e565b610728565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a600381565b60405190815260200161026c565b3480156102a457600080fd5b506102ad61077a565b60405161026c9190611b13565b3480156102c657600080fd5b506102da6102d5366004611b26565b61080c565b6040516001600160a01b03909116815260200161026c565b3480156102fe57600080fd5b5061031261030d366004611b5b565b610850565b005b34801561032057600080fd5b5061031261032f366004611bd1565b610923565b34801561034057600080fd5b506001546000540361028a565b34801561035957600080fd5b5061028a603281565b34801561036e57600080fd5b5061031261037d366004611c13565b6109cd565b34801561038e57600080fd5b5061031261039d366004611c4f565b6109d8565b3480156103ae57600080fd5b5061028a6103bd366004611cbb565b600c6020526000908152604090205481565b3480156103db57600080fd5b50610312610add565b3480156103f057600080fd5b50610312610b56565b34801561040557600080fd5b50610312610414366004611c13565b610b94565b34801561042557600080fd5b50610312610434366004611b26565b610baf565b34801561044557600080fd5b506102da610454366004611b26565b610bbd565b34801561046557600080fd5b506102ad610bc8565b34801561047a57600080fd5b5061028a610489366004611cbb565b610c56565b34801561049a57600080fd5b50610312610c9c565b3480156104af57600080fd5b5060005461028a565b3480156104c457600080fd5b5061028a6109c481565b3480156104da57600080fd5b50600a546102609060ff1681565b3480156104f457600080fd5b5061028a600a81565b34801561050957600080fd5b506008546001600160a01b03166102da565b34801561052757600080fd5b5061028a61271081565b34801561053d57600080fd5b5061031261054c366004611b26565b610cd2565b34801561055d57600080fd5b506102ad610d01565b34801561057257600080fd5b50610260610581366004611cbb565b600d6020526000908152604090205460ff1681565b3480156105a257600080fd5b5061028a600b5481565b6103126105ba366004611b26565b610d10565b3480156105cb57600080fd5b506103126105da366004611d62565b611100565b3480156105eb57600080fd5b506103126105fa366004611dab565b61113d565b34801561060b57600080fd5b5061028a606481565b34801561062057600080fd5b5061031261062f366004611de7565b6111d3565b34801561064057600080fd5b506102ad61064f366004611b26565b61121d565b34801561066057600080fd5b5061031261066f366004611bd1565b6112a2565b34801561068057600080fd5b5061028a66b1a2bc2ec5000081565b34801561069b57600080fd5b506102606106aa366004611cbb565b600e6020526000908152604090205460ff1681565b3480156106cb57600080fd5b506102606106da366004611e63565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561071457600080fd5b50610312610723366004611cbb565b61133e565b60006301ffc9a760e01b6001600160e01b03198316148061075957506380ac58cd60e01b6001600160e01b03198316145b806107745750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461078990611e96565b80601f01602080910402602001604051908101604052809291908181526020018280546107b590611e96565b80156108025780601f106107d757610100808354040283529160200191610802565b820191906000526020600020905b8154815290600101906020018083116107e557829003601f168201915b5050505050905090565b6000610817826113d6565b610834576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061085b826113fd565b9050806001600160a01b0316836001600160a01b031614156108905760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146108c7576108aa81336106da565b6108c7576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146109565760405162461bcd60e51b815260040161094d90611ed1565b60405180910390fd5b60005b818110156109c8576000600d600085858581811061097957610979611f06565b905060200201602081019061098e9190611cbb565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806109c081611f32565b915050610959565b505050565b6109c883838361145e565b6008546001600160a01b03163314610a025760405162461bcd60e51b815260040161094d90611ed1565b60005b83811015610ad657612710838383818110610a2257610a22611f06565b90506020020135610a3260005490565b610a3c9190611f4d565b1115610a7c5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48195e18d959591959608a1b604482015260640161094d565b610ac4858583818110610a9157610a91611f06565b9050602002016020810190610aa69190611cbb565b848484818110610ab857610ab8611f06565b9050602002013561160e565b80610ace81611f32565b915050610a05565b5050505050565b6008546001600160a01b03163314610b075760405162461bcd60e51b815260040161094d90611ed1565b47610b1a6008546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610b52573d6000803e3d6000fd5b5050565b6008546001600160a01b03163314610b805760405162461bcd60e51b815260040161094d90611ed1565b600a805460ff19811660ff90911615179055565b6109c8838383604051806020016040528060008152506111d3565b610bba8160016116e3565b50565b6000610774826113fd565b60098054610bd590611e96565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0190611e96565b8015610c4e5780601f10610c2357610100808354040283529160200191610c4e565b820191906000526020600020905b815481529060010190602001808311610c3157829003601f168201915b505050505081565b600081610c76576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610cc65760405162461bcd60e51b815260040161094d90611ed1565b610cd06000611856565b565b6008546001600160a01b03163314610cfc5760405162461bcd60e51b815260040161094d90611ed1565b600b55565b60606003805461078990611e96565b60008111610d535760405162461bcd60e51b815260206004820152601060248201526f0436f756e742063616e277420626520360841b604482015260640161094d565b600a5460ff1615610da65760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e672069732063757272656e746c79207061757365640000000000604482015260640161094d565b61271081610db360005490565b610dbd9190611f4d565b1115610dfd5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48195e18d959591959608a1b604482015260640161094d565b6109c4610e0960005490565b1015610f71573415610e505760405162461bcd60e51b815260206004820152601060248201526f15dc9bdb99c811551208185b5bdd5b9d60821b604482015260640161094d565b6003811115610e995760405162461bcd60e51b815260206004820152601560248201527414195c881516081b1a5b5a5d08195e18d959591959605a1b604482015260640161094d565b336000908152600c6020526040902054600a90610eb7908390611f4d565b1115610f015760405162461bcd60e51b815260206004820152601960248201527814195c881dd85b1b195d081b1a5b5a5d08195e18d959591959603a1b604482015260640161094d565b66b1a2bc2ec5000033311015610f525760405162461bcd60e51b815260206004820152601660248201527557616c6c65742062616c616e636520746f6f206c6f7760501b604482015260640161094d565b336000908152600e60205260409020805460ff191660011790556110d1565b336000908152600d6020526040902054819060ff168015610fa25750336000908152600e602052604090205460ff16155b15610fcf5780610fb181611f65565b336000908152600e60205260409020805460ff191660011790559150505b80600b54610fdd9190611f7c565b341461101e5760405162461bcd60e51b815260206004820152601060248201526f15dc9bdb99c811551208185b5bdd5b9d60821b604482015260640161094d565b60328211156110675760405162461bcd60e51b815260206004820152601560248201527414195c881516081b1a5b5a5d08195e18d959591959605a1b604482015260640161094d565b336000908152600c6020526040902054606490611085908490611f4d565b11156110cf5760405162461bcd60e51b815260206004820152601960248201527814195c881dd85b1b195d081b1a5b5a5d08195e18d959591959603a1b604482015260640161094d565b505b336000908152600c6020526040812080548392906110f0908490611f4d565b90915550610bba9050338261160e565b6008546001600160a01b0316331461112a5760405162461bcd60e51b815260040161094d90611ed1565b8051610b529060099060208401906119ef565b6001600160a01b0382163314156111675760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111de84848461145e565b6001600160a01b0383163b15611217576111fa848484846118a8565b611217576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611228826113d6565b61124557604051630a14c4b560e41b815260040160405180910390fd5b600061124f611991565b9050805160001415611270576040518060200160405280600081525061129b565b8061127a846119a0565b60405160200161128b929190611f9b565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146112cc5760405162461bcd60e51b815260040161094d90611ed1565b60005b818110156109c8576001600d60008585858181106112ef576112ef611f06565b90506020020160208101906113049190611cbb565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061133681611f32565b9150506112cf565b6008546001600160a01b031633146113685760405162461bcd60e51b815260040161094d90611ed1565b6001600160a01b0381166113cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094d565b610bba81611856565b6000805482108015610774575050600090815260046020526040902054600160e01b161590565b60008160005481101561144557600081815260046020526040902054600160e01b8116611443575b8061129b575060001901600081815260046020526040902054611425565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611469826113fd565b9050836001600160a01b0316816001600160a01b03161461149c5760405162a1148160e81b815260040160405180910390fd5b6000828152600660205260408120546001600160a01b03908116919086163314806114cc57506114cc86336106da565b806114df57506001600160a01b03821633145b9050806114ff57604051632ce44b5f60e11b815260040160405180910390fd5b8461151d57604051633a954ecd60e21b815260040160405180910390fd5b811561154057600084815260066020526040902080546001600160a01b03191690555b6001600160a01b03868116600090815260056020908152604080832080546000190190559288168252828220805460010190558682526004905220600160e11b4260a01b8717811790915583166115c557600184016000818152600460205260409020546115c35760005481146115c35760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000548261162e57604051622e076360e81b815260040160405180910390fd5b8161164c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526005602090815260408083208054680100000000000000018702019055838352600490915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106116975750600055505050565b60006116ee836113fd565b60008481526006602052604090205490915081906001600160a01b03168315611764576000336001600160a01b038416148061172f575061172f83336106da565b8061174257506001600160a01b03821633145b90508061176257604051632ce44b5f60e11b815260040160405180910390fd5b505b801561178757600085815260066020526040902080546001600160a01b03191690555b6001600160a01b038216600090815260056020908152604080832080546fffffffffffffffffffffffffffffffff01905587835260049091529020600360e01b4260a01b8417179055600160e11b831661180f576001850160008181526004602052604090205461180d57600054811461180d5760008181526004602052604090208490555b505b60405185906000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506001805481019055505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906118dd903390899088908890600401611fca565b6020604051808303816000875af1925050508015611918575060408051601f3d908101601f1916820190925261191591810190612007565b60015b611973573d808015611946576040519150601f19603f3d011682016040523d82523d6000602084013e61194b565b606091505b50805161196b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461078990611e96565b604080516080810191829052607f0190826030600a8206018353600a90045b80156119dd57600183039250600a81066030018353600a90046119bf565b50819003601f19909101908152919050565b8280546119fb90611e96565b90600052602060002090601f016020900481019282611a1d5760008555611a63565b82601f10611a3657805160ff1916838001178555611a63565b82800160010185558215611a63579182015b82811115611a63578251825591602001919060010190611a48565b50611a6f929150611a73565b5090565b5b80821115611a6f5760008155600101611a74565b6001600160e01b031981168114610bba57600080fd5b600060208284031215611ab057600080fd5b813561129b81611a88565b60005b83811015611ad6578181015183820152602001611abe565b838111156112175750506000910152565b60008151808452611aff816020860160208601611abb565b601f01601f19169290920160200192915050565b60208152600061129b6020830184611ae7565b600060208284031215611b3857600080fd5b5035919050565b80356001600160a01b0381168114611b5657600080fd5b919050565b60008060408385031215611b6e57600080fd5b611b7783611b3f565b946020939093013593505050565b60008083601f840112611b9757600080fd5b50813567ffffffffffffffff811115611baf57600080fd5b6020830191508360208260051b8501011115611bca57600080fd5b9250929050565b60008060208385031215611be457600080fd5b823567ffffffffffffffff811115611bfb57600080fd5b611c0785828601611b85565b90969095509350505050565b600080600060608486031215611c2857600080fd5b611c3184611b3f565b9250611c3f60208501611b3f565b9150604084013590509250925092565b60008060008060408587031215611c6557600080fd5b843567ffffffffffffffff80821115611c7d57600080fd5b611c8988838901611b85565b90965094506020870135915080821115611ca257600080fd5b50611caf87828801611b85565b95989497509550505050565b600060208284031215611ccd57600080fd5b61129b82611b3f565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d0757611d07611cd6565b604051601f8501601f19908116603f01168101908282118183101715611d2f57611d2f611cd6565b81604052809350858152868686011115611d4857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611d7457600080fd5b813567ffffffffffffffff811115611d8b57600080fd5b8201601f81018413611d9c57600080fd5b61198984823560208401611cec565b60008060408385031215611dbe57600080fd5b611dc783611b3f565b915060208301358015158114611ddc57600080fd5b809150509250929050565b60008060008060808587031215611dfd57600080fd5b611e0685611b3f565b9350611e1460208601611b3f565b925060408501359150606085013567ffffffffffffffff811115611e3757600080fd5b8501601f81018713611e4857600080fd5b611e5787823560208401611cec565b91505092959194509250565b60008060408385031215611e7657600080fd5b611e7f83611b3f565b9150611e8d60208401611b3f565b90509250929050565b600181811c90821680611eaa57607f821691505b60208210811415611ecb57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611f4657611f46611f1c565b5060010190565b60008219821115611f6057611f60611f1c565b500190565b600081611f7457611f74611f1c565b506000190190565b6000816000190483118215151615611f9657611f96611f1c565b500290565b60008351611fad818460208801611abb565b835190830190611fc1818360208801611abb565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ffd90830184611ae7565b9695505050505050565b60006020828403121561201957600080fd5b815161129b81611a8856fea2646970667358221220f000ab55a660b774236ecb4b9151ba6d40a0beb1e35e2e2cfacb97424a4709c264736f6c634300080b003368747470733a2f2f6d696e742e626f72656461706579632e61692f6d657461646174612e7068703f746f6b656e49643d
Deployed Bytecode
0x60806040526004361061023b5760003560e01c8063764267b61161012e578063a0bcfc7f116100ab578063d6d651761161006f578063d6d6517614610654578063d88527ab14610674578063df529c771461068f578063e985e9c5146106bf578063f2fde38b1461070857600080fd5b8063a0bcfc7f146105bf578063a22cb465146105df578063a5edca2c146105ff578063b88d4fde14610614578063c87b56dd1461063457600080fd5b806391b7f5ed116100f257806391b7f5ed1461053157806395d89b41146105515780639b19251a14610566578063a035b1fe14610596578063a0712d68146105ac57600080fd5b8063764267b6146104b85780637e4831d3146104ce5780638aaf6ead146104e85780638da5cb5b146104fd578063902d55a51461051b57600080fd5b80633a602b4d116101bc5780636352211e116101805780636352211e146104395780636c0360eb1461045957806370a082311461046e578063715018a61461048e57806375794a3c146104a357600080fd5b80633a602b4d146103a25780633ccfd60b146103cf5780633e53afc3146103e457806342842e0e146103f957806342966c681461041957600080fd5b80631134016c116102035780631134016c1461031457806318160ddd1461033457806319b78fe81461034d57806323b872dd146103625780632c9bee891461038257600080fd5b806301ffc9a71461024057806303943a4c1461027557806306fdde0314610298578063081812fc146102ba578063095ea7b3146102f2575b600080fd5b34801561024c57600080fd5b5061026061025b366004611a9e565b610728565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b5061028a600381565b60405190815260200161026c565b3480156102a457600080fd5b506102ad61077a565b60405161026c9190611b13565b3480156102c657600080fd5b506102da6102d5366004611b26565b61080c565b6040516001600160a01b03909116815260200161026c565b3480156102fe57600080fd5b5061031261030d366004611b5b565b610850565b005b34801561032057600080fd5b5061031261032f366004611bd1565b610923565b34801561034057600080fd5b506001546000540361028a565b34801561035957600080fd5b5061028a603281565b34801561036e57600080fd5b5061031261037d366004611c13565b6109cd565b34801561038e57600080fd5b5061031261039d366004611c4f565b6109d8565b3480156103ae57600080fd5b5061028a6103bd366004611cbb565b600c6020526000908152604090205481565b3480156103db57600080fd5b50610312610add565b3480156103f057600080fd5b50610312610b56565b34801561040557600080fd5b50610312610414366004611c13565b610b94565b34801561042557600080fd5b50610312610434366004611b26565b610baf565b34801561044557600080fd5b506102da610454366004611b26565b610bbd565b34801561046557600080fd5b506102ad610bc8565b34801561047a57600080fd5b5061028a610489366004611cbb565b610c56565b34801561049a57600080fd5b50610312610c9c565b3480156104af57600080fd5b5060005461028a565b3480156104c457600080fd5b5061028a6109c481565b3480156104da57600080fd5b50600a546102609060ff1681565b3480156104f457600080fd5b5061028a600a81565b34801561050957600080fd5b506008546001600160a01b03166102da565b34801561052757600080fd5b5061028a61271081565b34801561053d57600080fd5b5061031261054c366004611b26565b610cd2565b34801561055d57600080fd5b506102ad610d01565b34801561057257600080fd5b50610260610581366004611cbb565b600d6020526000908152604090205460ff1681565b3480156105a257600080fd5b5061028a600b5481565b6103126105ba366004611b26565b610d10565b3480156105cb57600080fd5b506103126105da366004611d62565b611100565b3480156105eb57600080fd5b506103126105fa366004611dab565b61113d565b34801561060b57600080fd5b5061028a606481565b34801561062057600080fd5b5061031261062f366004611de7565b6111d3565b34801561064057600080fd5b506102ad61064f366004611b26565b61121d565b34801561066057600080fd5b5061031261066f366004611bd1565b6112a2565b34801561068057600080fd5b5061028a66b1a2bc2ec5000081565b34801561069b57600080fd5b506102606106aa366004611cbb565b600e6020526000908152604090205460ff1681565b3480156106cb57600080fd5b506102606106da366004611e63565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561071457600080fd5b50610312610723366004611cbb565b61133e565b60006301ffc9a760e01b6001600160e01b03198316148061075957506380ac58cd60e01b6001600160e01b03198316145b806107745750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461078990611e96565b80601f01602080910402602001604051908101604052809291908181526020018280546107b590611e96565b80156108025780601f106107d757610100808354040283529160200191610802565b820191906000526020600020905b8154815290600101906020018083116107e557829003601f168201915b5050505050905090565b6000610817826113d6565b610834576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061085b826113fd565b9050806001600160a01b0316836001600160a01b031614156108905760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146108c7576108aa81336106da565b6108c7576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146109565760405162461bcd60e51b815260040161094d90611ed1565b60405180910390fd5b60005b818110156109c8576000600d600085858581811061097957610979611f06565b905060200201602081019061098e9190611cbb565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055806109c081611f32565b915050610959565b505050565b6109c883838361145e565b6008546001600160a01b03163314610a025760405162461bcd60e51b815260040161094d90611ed1565b60005b83811015610ad657612710838383818110610a2257610a22611f06565b90506020020135610a3260005490565b610a3c9190611f4d565b1115610a7c5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48195e18d959591959608a1b604482015260640161094d565b610ac4858583818110610a9157610a91611f06565b9050602002016020810190610aa69190611cbb565b848484818110610ab857610ab8611f06565b9050602002013561160e565b80610ace81611f32565b915050610a05565b5050505050565b6008546001600160a01b03163314610b075760405162461bcd60e51b815260040161094d90611ed1565b47610b1a6008546001600160a01b031690565b6001600160a01b03166108fc829081150290604051600060405180830381858888f19350505050158015610b52573d6000803e3d6000fd5b5050565b6008546001600160a01b03163314610b805760405162461bcd60e51b815260040161094d90611ed1565b600a805460ff19811660ff90911615179055565b6109c8838383604051806020016040528060008152506111d3565b610bba8160016116e3565b50565b6000610774826113fd565b60098054610bd590611e96565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0190611e96565b8015610c4e5780601f10610c2357610100808354040283529160200191610c4e565b820191906000526020600020905b815481529060010190602001808311610c3157829003601f168201915b505050505081565b600081610c76576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610cc65760405162461bcd60e51b815260040161094d90611ed1565b610cd06000611856565b565b6008546001600160a01b03163314610cfc5760405162461bcd60e51b815260040161094d90611ed1565b600b55565b60606003805461078990611e96565b60008111610d535760405162461bcd60e51b815260206004820152601060248201526f0436f756e742063616e277420626520360841b604482015260640161094d565b600a5460ff1615610da65760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e672069732063757272656e746c79207061757365640000000000604482015260640161094d565b61271081610db360005490565b610dbd9190611f4d565b1115610dfd5760405162461bcd60e51b815260206004820152600f60248201526e14dd5c1c1b1e48195e18d959591959608a1b604482015260640161094d565b6109c4610e0960005490565b1015610f71573415610e505760405162461bcd60e51b815260206004820152601060248201526f15dc9bdb99c811551208185b5bdd5b9d60821b604482015260640161094d565b6003811115610e995760405162461bcd60e51b815260206004820152601560248201527414195c881516081b1a5b5a5d08195e18d959591959605a1b604482015260640161094d565b336000908152600c6020526040902054600a90610eb7908390611f4d565b1115610f015760405162461bcd60e51b815260206004820152601960248201527814195c881dd85b1b195d081b1a5b5a5d08195e18d959591959603a1b604482015260640161094d565b66b1a2bc2ec5000033311015610f525760405162461bcd60e51b815260206004820152601660248201527557616c6c65742062616c616e636520746f6f206c6f7760501b604482015260640161094d565b336000908152600e60205260409020805460ff191660011790556110d1565b336000908152600d6020526040902054819060ff168015610fa25750336000908152600e602052604090205460ff16155b15610fcf5780610fb181611f65565b336000908152600e60205260409020805460ff191660011790559150505b80600b54610fdd9190611f7c565b341461101e5760405162461bcd60e51b815260206004820152601060248201526f15dc9bdb99c811551208185b5bdd5b9d60821b604482015260640161094d565b60328211156110675760405162461bcd60e51b815260206004820152601560248201527414195c881516081b1a5b5a5d08195e18d959591959605a1b604482015260640161094d565b336000908152600c6020526040902054606490611085908490611f4d565b11156110cf5760405162461bcd60e51b815260206004820152601960248201527814195c881dd85b1b195d081b1a5b5a5d08195e18d959591959603a1b604482015260640161094d565b505b336000908152600c6020526040812080548392906110f0908490611f4d565b90915550610bba9050338261160e565b6008546001600160a01b0316331461112a5760405162461bcd60e51b815260040161094d90611ed1565b8051610b529060099060208401906119ef565b6001600160a01b0382163314156111675760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6111de84848461145e565b6001600160a01b0383163b15611217576111fa848484846118a8565b611217576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060611228826113d6565b61124557604051630a14c4b560e41b815260040160405180910390fd5b600061124f611991565b9050805160001415611270576040518060200160405280600081525061129b565b8061127a846119a0565b60405160200161128b929190611f9b565b6040516020818303038152906040525b9392505050565b6008546001600160a01b031633146112cc5760405162461bcd60e51b815260040161094d90611ed1565b60005b818110156109c8576001600d60008585858181106112ef576112ef611f06565b90506020020160208101906113049190611cbb565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061133681611f32565b9150506112cf565b6008546001600160a01b031633146113685760405162461bcd60e51b815260040161094d90611ed1565b6001600160a01b0381166113cd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161094d565b610bba81611856565b6000805482108015610774575050600090815260046020526040902054600160e01b161590565b60008160005481101561144557600081815260046020526040902054600160e01b8116611443575b8061129b575060001901600081815260046020526040902054611425565b505b604051636f96cda160e11b815260040160405180910390fd5b6000611469826113fd565b9050836001600160a01b0316816001600160a01b03161461149c5760405162a1148160e81b815260040160405180910390fd5b6000828152600660205260408120546001600160a01b03908116919086163314806114cc57506114cc86336106da565b806114df57506001600160a01b03821633145b9050806114ff57604051632ce44b5f60e11b815260040160405180910390fd5b8461151d57604051633a954ecd60e21b815260040160405180910390fd5b811561154057600084815260066020526040902080546001600160a01b03191690555b6001600160a01b03868116600090815260056020908152604080832080546000190190559288168252828220805460010190558682526004905220600160e11b4260a01b8717811790915583166115c557600184016000818152600460205260409020546115c35760005481146115c35760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b6000548261162e57604051622e076360e81b815260040160405180910390fd5b8161164c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660009081526005602090815260408083208054680100000000000000018702019055838352600490915290204260a01b84176001841460e11b179055808083015b6040516001830192906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106116975750600055505050565b60006116ee836113fd565b60008481526006602052604090205490915081906001600160a01b03168315611764576000336001600160a01b038416148061172f575061172f83336106da565b8061174257506001600160a01b03821633145b90508061176257604051632ce44b5f60e11b815260040160405180910390fd5b505b801561178757600085815260066020526040902080546001600160a01b03191690555b6001600160a01b038216600090815260056020908152604080832080546fffffffffffffffffffffffffffffffff01905587835260049091529020600360e01b4260a01b8417179055600160e11b831661180f576001850160008181526004602052604090205461180d57600054811461180d5760008181526004602052604090208490555b505b60405185906000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a450506001805481019055505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906118dd903390899088908890600401611fca565b6020604051808303816000875af1925050508015611918575060408051601f3d908101601f1916820190925261191591810190612007565b60015b611973573d808015611946576040519150601f19603f3d011682016040523d82523d6000602084013e61194b565b606091505b50805161196b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461078990611e96565b604080516080810191829052607f0190826030600a8206018353600a90045b80156119dd57600183039250600a81066030018353600a90046119bf565b50819003601f19909101908152919050565b8280546119fb90611e96565b90600052602060002090601f016020900481019282611a1d5760008555611a63565b82601f10611a3657805160ff1916838001178555611a63565b82800160010185558215611a63579182015b82811115611a63578251825591602001919060010190611a48565b50611a6f929150611a73565b5090565b5b80821115611a6f5760008155600101611a74565b6001600160e01b031981168114610bba57600080fd5b600060208284031215611ab057600080fd5b813561129b81611a88565b60005b83811015611ad6578181015183820152602001611abe565b838111156112175750506000910152565b60008151808452611aff816020860160208601611abb565b601f01601f19169290920160200192915050565b60208152600061129b6020830184611ae7565b600060208284031215611b3857600080fd5b5035919050565b80356001600160a01b0381168114611b5657600080fd5b919050565b60008060408385031215611b6e57600080fd5b611b7783611b3f565b946020939093013593505050565b60008083601f840112611b9757600080fd5b50813567ffffffffffffffff811115611baf57600080fd5b6020830191508360208260051b8501011115611bca57600080fd5b9250929050565b60008060208385031215611be457600080fd5b823567ffffffffffffffff811115611bfb57600080fd5b611c0785828601611b85565b90969095509350505050565b600080600060608486031215611c2857600080fd5b611c3184611b3f565b9250611c3f60208501611b3f565b9150604084013590509250925092565b60008060008060408587031215611c6557600080fd5b843567ffffffffffffffff80821115611c7d57600080fd5b611c8988838901611b85565b90965094506020870135915080821115611ca257600080fd5b50611caf87828801611b85565b95989497509550505050565b600060208284031215611ccd57600080fd5b61129b82611b3f565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115611d0757611d07611cd6565b604051601f8501601f19908116603f01168101908282118183101715611d2f57611d2f611cd6565b81604052809350858152868686011115611d4857600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215611d7457600080fd5b813567ffffffffffffffff811115611d8b57600080fd5b8201601f81018413611d9c57600080fd5b61198984823560208401611cec565b60008060408385031215611dbe57600080fd5b611dc783611b3f565b915060208301358015158114611ddc57600080fd5b809150509250929050565b60008060008060808587031215611dfd57600080fd5b611e0685611b3f565b9350611e1460208601611b3f565b925060408501359150606085013567ffffffffffffffff811115611e3757600080fd5b8501601f81018713611e4857600080fd5b611e5787823560208401611cec565b91505092959194509250565b60008060408385031215611e7657600080fd5b611e7f83611b3f565b9150611e8d60208401611b3f565b90509250929050565b600181811c90821680611eaa57607f821691505b60208210811415611ecb57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415611f4657611f46611f1c565b5060010190565b60008219821115611f6057611f60611f1c565b500190565b600081611f7457611f74611f1c565b506000190190565b6000816000190483118215151615611f9657611f96611f1c565b500290565b60008351611fad818460208801611abb565b835190830190611fc1818360208801611abb565b01949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611ffd90830184611ae7565b9695505050505050565b60006020828403121561201957600080fd5b815161129b81611a8856fea2646970667358221220f000ab55a660b774236ecb4b9151ba6d40a0beb1e35e2e2cfacb97424a4709c264736f6c634300080b0033
Deployed Bytecode Sourcemap
45248:4703:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13029:615;;;;;;;;;;-1:-1:-1;13029:615:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;13029:615:0;;;;;;;;45679:47;;;;;;;;;;;;45725:1;45679:47;;;;;738:25:1;;;726:2;711:18;45679:47:0;592:177:1;18052:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20120:204::-;;;;;;;;;;-1:-1:-1;20120:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1874:32:1;;;1856:51;;1844:2;1829:18;20120:204:0;1710:203:1;19580:474:0;;;;;;;;;;-1:-1:-1;19580:474:0;;;;;:::i;:::-;;:::i;:::-;;47490:199;;;;;;;;;;-1:-1:-1;47490:199:0;;;;;:::i;:::-;;:::i;12083:315::-;;;;;;;;;;-1:-1:-1;12349:12:0;;12136:7;12333:13;:28;12083:315;;45733:48;;;;;;;;;;;;45779:2;45733:48;;21006:170;;;;;;;;;;-1:-1:-1;21006:170:0;;;;;:::i;:::-;;:::i;47805:311::-;;;;;;;;;;-1:-1:-1;47805:311:0;;;;;:::i;:::-;;:::i;45954:51::-;;;;;;;;;;-1:-1:-1;45954:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;49807:141;;;;;;;;;;;;;:::i;46871:92::-;;;;;;;;;;;;;:::i;21247:185::-;;;;;;;;;;-1:-1:-1;21247:185:0;;;;;:::i;:::-;;:::i;39513:94::-;;;;;;;;;;-1:-1:-1;39513:94:0;;;;;:::i;:::-;;:::i;17841:144::-;;;;;;;;;;-1:-1:-1;17841:144:0;;;;;:::i;:::-;;:::i;45360:74::-;;;;;;;;;;;;;:::i;13708:234::-;;;;;;;;;;-1:-1:-1;13708:234:0;;;;;:::i;:::-;;:::i;44360:103::-;;;;;;;;;;;;;:::i;49622:93::-;;;;;;;;;;-1:-1:-1;49666:7:0;11852:13;49622:93;;45461:41;;;;;;;;;;;;45498:4;45461:41;;45876:29;;;;;;;;;;-1:-1:-1;45876:29:0;;;;;;;;45560:52;;;;;;;;;;;;45610:2;45560:52;;43709:87;;;;;;;;;;-1:-1:-1;43782:6:0;;-1:-1:-1;;;;;43782:6:0;43709:87;;45509:44;;;;;;;;;;;;45548:5;45509:44;;47012:100;;;;;;;;;;-1:-1:-1;47012:100:0;;;;;:::i;:::-;;:::i;18221:104::-;;;;;;;;;;;;;:::i;46012:42::-;;;;;;;;;;-1:-1:-1;46012:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45912:33;;;;;;;;;;;;;;;;48202:1354;;;;;;:::i;:::-;;:::i;46706:92::-;;;;;;;;;;-1:-1:-1;46706:92:0;;;;;:::i;:::-;;:::i;20396:308::-;;;;;;;;;;-1:-1:-1;20396:308:0;;;;;:::i;:::-;;:::i;45619:53::-;;;;;;;;;;;;45669:3;45619:53;;21503:396;;;;;;;;;;-1:-1:-1;21503:396:0;;;;;:::i;:::-;;:::i;18396:318::-;;;;;;;;;;-1:-1:-1;18396:318:0;;;;;:::i;:::-;;:::i;47233:196::-;;;;;;;;;;-1:-1:-1;47233:196:0;;;;;:::i;:::-;;:::i;45788:55::-;;;;;;;;;;;;45833:10;45788:55;;46061:46;;;;;;;;;;-1:-1:-1;46061:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;20775:164;;;;;;;;;;-1:-1:-1;20775:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;20896:25:0;;;20872:4;20896:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;20775:164;44618:201;;;;;;;;;;-1:-1:-1;44618:201:0;;;;;:::i;:::-;;:::i;13029:615::-;13114:4;-1:-1:-1;;;;;;;;;13414:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;13491:25:0;;;13414:102;:179;;;-1:-1:-1;;;;;;;;;;13568:25:0;;;13414:179;13394:199;13029:615;-1:-1:-1;;13029:615:0:o;18052:100::-;18106:13;18139:5;18132:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18052:100;:::o;20120:204::-;20188:7;20213:16;20221:7;20213;:16::i;:::-;20208:64;;20238:34;;-1:-1:-1;;;20238:34:0;;;;;;;;;;;20208:64;-1:-1:-1;20292:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;20292:24:0;;20120:204::o;19580:474::-;19653:13;19685:27;19704:7;19685:18;:27::i;:::-;19653:61;;19735:5;-1:-1:-1;;;;;19729:11:0;:2;-1:-1:-1;;;;;19729:11:0;;19725:48;;;19749:24;;-1:-1:-1;;;19749:24:0;;;;;;;;;;;19725:48;36508:10;-1:-1:-1;;;;;19790:28:0;;;19786:175;;19838:44;19855:5;36508:10;20775:164;:::i;19838:44::-;19833:128;;19910:35;;-1:-1:-1;;;19910:35:0;;;;;;;;;;;19833:128;19973:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;19973:29:0;-1:-1:-1;;;;;19973:29:0;;;;;;;;;20018:28;;19973:24;;20018:28;;;;;;;19642:412;19580:474;;:::o;47490:199::-;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;;;;;;;;;47582:9:::1;47577:105;47597:20:::0;;::::1;47577:105;;;47665:5;47639:9;:23;47649:9;;47659:1;47649:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47639:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47639:23:0;:31;;-1:-1:-1;;47639:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47619:3;::::1;::::0;::::1;:::i;:::-;;;;47577:105;;;;47490:199:::0;;:::o;21006:170::-;21140:28;21150:4;21156:2;21160:7;21140:9;:28::i;47805:311::-;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;47917:9:::1;47912:197;47932:20:::0;;::::1;47912:197;;;45548:5;48007:6;;48014:1;48007:9;;;;;;;:::i;:::-;;;;;;;47990:14;11825:7:::0;11852:13;;11778:95;47990:14:::1;:26;;;;:::i;:::-;:42;;47982:70;;;::::0;-1:-1:-1;;;47982:70:0;;8470:2:1;47982:70:0::1;::::0;::::1;8452:21:1::0;8509:2;8489:18;;;8482:30;-1:-1:-1;;;8528:18:1;;;8521:45;8583:18;;47982:70:0::1;8268:339:1::0;47982:70:0::1;48067:30;48073:9;;48083:1;48073:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;48087:6;;48094:1;48087:9;;;;;;;:::i;:::-;;;;;;;48067:5;:30::i;:::-;47954:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47912:197;;;;47805:311:::0;;;;:::o;49807:141::-;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;49874:21:::1;49914:7;43782:6:::0;;-1:-1:-1;;;;;43782:6:0;;43709:87;49914:7:::1;-1:-1:-1::0;;;;;49906:25:0::1;:34;49932:7;49906:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;49845:103;49807:141::o:0;46871:92::-;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;46945:10:::1;::::0;;-1:-1:-1;;46931:24:0;::::1;46945:10;::::0;;::::1;46944:11;46931:24;::::0;;46871:92::o;21247:185::-;21385:39;21402:4;21408:2;21412:7;21385:39;;;;;;;;;;;;:16;:39::i;39513:94::-;39579:20;39585:7;39594:4;39579:5;:20::i;:::-;39513:94;:::o;17841:144::-;17905:7;17948:27;17967:7;17948:18;:27::i;45360:74::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13708:234::-;13772:7;13814:5;13792:70;;13834:28;;-1:-1:-1;;;13834:28:0;;;;;;;;;;;13792:70;-1:-1:-1;;;;;;13880:25:0;;;;;:18;:25;;;;;;9053:13;13880:54;;13708:234::o;44360:103::-;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;44425:30:::1;44452:1;44425:18;:30::i;:::-;44360:103::o:0;47012:100::-;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;47083:5:::1;:21:::0;47012:100::o;18221:104::-;18277:13;18310:7;18303:14;;;;;:::i;48202:1354::-;48272:1;48264:5;:9;48256:38;;;;-1:-1:-1;;;48256:38:0;;8814:2:1;48256:38:0;;;8796:21:1;8853:2;8833:18;;;8826:30;-1:-1:-1;;;8872:18:1;;;8865:46;8928:18;;48256:38:0;8612:340:1;48256:38:0;48314:10;;;;48313:11;48305:51;;;;-1:-1:-1;;;48305:51:0;;9159:2:1;48305:51:0;;;9141:21:1;9198:2;9178:18;;;9171:30;9237:29;9217:18;;;9210:57;9284:18;;48305:51:0;8957:351:1;48305:51:0;45548:5;48402;48385:14;11825:7;11852:13;;11778:95;48385:14;:22;;;;:::i;:::-;:38;;48377:66;;;;-1:-1:-1;;;48377:66:0;;8470:2:1;48377:66:0;;;8452:21:1;8509:2;8489:18;;;8482:30;-1:-1:-1;;;8528:18:1;;;8521:45;8583:18;;48377:66:0;8268:339:1;48377:66:0;45498:4;48460:14;11825:7;11852:13;;11778:95;48460:14;:27;48456:1001;;;48538:9;:14;48530:43;;;;-1:-1:-1;;;48530:43:0;;9515:2:1;48530:43:0;;;9497:21:1;9554:2;9534:18;;;9527:30;-1:-1:-1;;;9573:18:1;;;9566:46;9629:18;;48530:43:0;9313:340:1;48530:43:0;45725:1;48596:5;:28;;48588:62;;;;-1:-1:-1;;;48588:62:0;;9860:2:1;48588:62:0;;;9842:21:1;9899:2;9879:18;;;9872:30;-1:-1:-1;;;9918:18:1;;;9911:51;9979:18;;48588:62:0;9658:345:1;48588:62:0;48689:10;48673:27;;;;:15;:27;;;;;;45610:2;;48673:35;;48703:5;;48673:35;:::i;:::-;:62;;48665:100;;;;-1:-1:-1;;;48665:100:0;;10210:2:1;48665:100:0;;;10192:21:1;10249:2;10229:18;;;10222:30;-1:-1:-1;;;10268:18:1;;;10261:55;10333:18;;48665:100:0;10008:349:1;48665:100:0;45833:10;48788;:18;:40;;48780:75;;;;-1:-1:-1;;;48780:75:0;;10564:2:1;48780:75:0;;;10546:21:1;10603:2;10583:18;;;10576:30;-1:-1:-1;;;10622:18:1;;;10615:52;10684:18;;48780:75:0;10362:346:1;48780:75:0;48886:10;48872:25;;;;:13;:25;;;;;:32;;-1:-1:-1;;48872:32:0;48900:4;48872:32;;;48456:1001;;;49020:10;48963:20;49010:21;;;:9;:21;;;;;;48986:5;;49010:21;;:51;;;;-1:-1:-1;49050:10:0;49036:25;;;;:13;:25;;;;;;;;49035:26;49010:51;49006:157;;;49082:14;;;;:::i;:::-;49129:10;49115:25;;;;:13;:25;;;;;:32;;-1:-1:-1;;49115:32:0;49143:4;49115:32;;;49082:14;-1:-1:-1;;49006:157:0;49220:12;49212:5;;:20;;;;:::i;:::-;49199:9;:33;49191:62;;;;-1:-1:-1;;;49191:62:0;;9515:2:1;49191:62:0;;;9497:21:1;9554:2;9534:18;;;9527:30;-1:-1:-1;;;9573:18:1;;;9566:46;9629:18;;49191:62:0;9313:340:1;49191:62:0;45779:2;49276:5;:28;;49268:62;;;;-1:-1:-1;;;49268:62:0;;9860:2:1;49268:62:0;;;9842:21:1;9899:2;9879:18;;;9872:30;-1:-1:-1;;;9918:18:1;;;9911:51;9979:18;;49268:62:0;9658:345:1;49268:62:0;49369:10;49353:27;;;;:15;:27;;;;;;45669:3;;49353:35;;49383:5;;49353:35;:::i;:::-;:62;;49345:100;;;;-1:-1:-1;;;49345:100:0;;10210:2:1;49345:100:0;;;10192:21:1;10249:2;10229:18;;;10222:30;-1:-1:-1;;;10268:18:1;;;10261:55;10333:18;;49345:100:0;10008:349:1;49345:100:0;48922:535;48456:1001;49493:10;49477:27;;;;:15;:27;;;;;:36;;49508:5;;49477:27;:36;;49508:5;;49477:36;:::i;:::-;;;;-1:-1:-1;49524:24:0;;-1:-1:-1;49530:10:0;49542:5;49524;:24::i;46706:92::-;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;46776:14;;::::1;::::0;:7:::1;::::0;:14:::1;::::0;::::1;::::0;::::1;:::i;20396:308::-:0;-1:-1:-1;;;;;20495:31:0;;36508:10;20495:31;20491:61;;;20535:17;;-1:-1:-1;;;20535:17:0;;;;;;;;;;;20491:61;36508:10;20565:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;20565:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;20565:60:0;;;;;;;;;;20641:55;;540:41:1;;;20565:49:0;;36508:10;20641:55;;513:18:1;20641:55:0;;;;;;;20396:308;;:::o;21503:396::-;21670:28;21680:4;21686:2;21690:7;21670:9;:28::i;:::-;-1:-1:-1;;;;;21713:14:0;;;:19;21709:183;;21752:56;21783:4;21789:2;21793:7;21802:5;21752:30;:56::i;:::-;21747:145;;21836:40;;-1:-1:-1;;;21836:40:0;;;;;;;;;;;21747:145;21503:396;;;;:::o;18396:318::-;18469:13;18500:16;18508:7;18500;:16::i;:::-;18495:59;;18525:29;;-1:-1:-1;;;18525:29:0;;;;;;;;;;;18495:59;18567:21;18591:10;:8;:10::i;:::-;18567:34;;18625:7;18619:21;18644:1;18619:26;;:87;;;;;;;;;;;;;;;;;18672:7;18681:18;18691:7;18681:9;:18::i;:::-;18655:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18619:87;18612:94;18396:318;-1:-1:-1;;;18396:318:0:o;47233:196::-;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;47323:9:::1;47318:104;47338:20:::0;;::::1;47318:104;;;47406:4;47380:9;:23;47390:9;;47400:1;47390:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47380:23:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47380:23:0;:30;;-1:-1:-1;;47380:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47360:3;::::1;::::0;::::1;:::i;:::-;;;;47318:104;;44618:201:::0;43782:6;;-1:-1:-1;;;;;43782:6:0;36508:10;43929:23;43921:68;;;;-1:-1:-1;;;43921:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;44707:22:0;::::1;44699:73;;;::::0;-1:-1:-1;;;44699:73:0;;11704:2:1;44699:73:0::1;::::0;::::1;11686:21:1::0;11743:2;11723:18;;;11716:30;11782:34;11762:18;;;11755:62;-1:-1:-1;;;11833:18:1;;;11826:36;11879:19;;44699:73:0::1;11502:402:1::0;44699:73:0::1;44783:28;44802:8;44783:18;:28::i;22154:273::-:0;22211:4;22301:13;;22291:7;:23;22248:152;;;;-1:-1:-1;;22352:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;22352:43:0;:48;;22154:273::o;15356:1129::-;15423:7;15458;15560:13;;15553:4;:20;15549:869;;;15598:14;15615:23;;;:17;:23;;;;;;-1:-1:-1;;;15704:23:0;;15700:699;;16223:113;16230:11;16223:113;;-1:-1:-1;;;16301:6:0;16283:25;;;;:17;:25;;;;;;16223:113;;15700:699;15575:843;15549:869;16446:31;;-1:-1:-1;;;16446:31:0;;;;;;;;;;;27413:2654;27528:27;27558;27577:7;27558:18;:27::i;:::-;27528:57;;27643:4;-1:-1:-1;;;;;27602:45:0;27618:19;-1:-1:-1;;;;;27602:45:0;;27598:86;;27656:28;;-1:-1:-1;;;27656:28:0;;;;;;;;;;;27598:86;27697:23;27723:24;;;:15;:24;;;;;;-1:-1:-1;;;;;27723:24:0;;;;27697:23;27786:27;;36508:10;27786:27;;:87;;-1:-1:-1;27830:43:0;27847:4;36508:10;20775:164;:::i;27830:43::-;27786:142;;;-1:-1:-1;;;;;;27890:38:0;;36508:10;27890:38;27786:142;27760:169;;27947:17;27942:66;;27973:35;;-1:-1:-1;;;27973:35:0;;;;;;;;;;;27942:66;28041:2;28019:62;;28058:23;;-1:-1:-1;;;28058:23:0;;;;;;;;;;;28019:62;28225:15;28207:39;28203:103;;28270:24;;;;:15;:24;;;;;28263:31;;-1:-1:-1;;;;;;28263:31:0;;;28203:103;-1:-1:-1;;;;;28673:24:0;;;;;;;:18;:24;;;;;;;;28671:26;;-1:-1:-1;;28671:26:0;;;28742:22;;;;;;;;28740:24;;-1:-1:-1;28740:24:0;;;29035:26;;;:17;:26;;;-1:-1:-1;;;29123:15:0;9707:3;29123:41;29081:84;;:128;;29035:174;;;29329:46;;29325:626;;29433:1;29423:11;;29401:19;29556:30;;;:17;:30;;;;;;29552:384;;29694:13;;29679:11;:28;29675:242;;29841:30;;;;:17;:30;;;;;:52;;;29675:242;29382:569;29325:626;29998:7;29994:2;-1:-1:-1;;;;;29979:27:0;29988:4;-1:-1:-1;;;;;29979:27:0;;;;;;;;;;;27517:2550;;;27413:2654;;;:::o;25493:1666::-;25558:20;25581:13;25627:2;25605:58;;25644:19;;-1:-1:-1;;;25644:19:0;;;;;;;;;;;25605:58;25678:13;25674:44;;25700:18;;-1:-1:-1;;;25700:18:0;;;;;;;;;;;25674:44;-1:-1:-1;;;;;26267:22:0;;;;;;:18;:22;;;;9190:2;26267:22;;;:70;;26305:31;26293:44;;26267:70;;;26580:31;;;:17;:31;;;;;26673:15;9707:3;26673:41;26631:84;;-1:-1:-1;26751:13:0;;9966:3;26736:56;26631:162;26580:213;;:31;26874:23;;;26914:111;26941:40;;26966:14;;;;;-1:-1:-1;;;;;26941:40:0;;;26958:1;;26941:40;;26958:1;;26941:40;27020:3;27005:12;:18;26914:111;;-1:-1:-1;27041:13:0;:28;47577:105:::1;47490:199:::0;;:::o;30463:2935::-;30543:27;30573;30592:7;30573:18;:27::i;:::-;30613:12;30702:24;;;:15;:24;;;;;;30543:57;;-1:-1:-1;30543:57:0;;-1:-1:-1;;;;;30702:24:0;30739:306;;;;30773:22;36508:10;-1:-1:-1;;;;;30799:27:0;;;;:91;;-1:-1:-1;30847:43:0;30864:4;36508:10;20775:164;:::i;30847:43::-;30799:150;;;-1:-1:-1;;;;;;30911:38:0;;36508:10;30911:38;30799:150;30773:177;;30972:17;30967:66;;30998:35;;-1:-1:-1;;;30998:35:0;;;;;;;;;;;30967:66;30758:287;30739:306;31196:15;31178:39;31174:103;;31241:24;;;;:15;:24;;;;;31234:31;;-1:-1:-1;;;;;;31234:31:0;;;31174:103;-1:-1:-1;;;;;31865:24:0;;;;;;:18;:24;;;;;;;;:59;;31893:31;31865:59;;;32162:26;;;:17;:26;;;;;-1:-1:-1;;;32252:15:0;9707:3;32252:41;32208:86;;:164;32162:210;;-1:-1:-1;;;32492:46:0;;32488:626;;32596:1;32586:11;;32564:19;32719:30;;;:17;:30;;;;;;32715:384;;32857:13;;32842:11;:28;32838:242;;33004:30;;;;:17;:30;;;;;:52;;;32838:242;32545:569;32488:626;33142:35;;33169:7;;33165:1;;-1:-1:-1;;;;;33142:35:0;;;;;33165:1;;33142:35;-1:-1:-1;;33365:12:0;:14;;;;;;-1:-1:-1;;;30463:2935:0:o;44979:191::-;45072:6;;;-1:-1:-1;;;;;45089:17:0;;;-1:-1:-1;;;;;;45089:17:0;;;;;;;45122:40;;45072:6;;;45089:17;45072:6;;45122:40;;45053:16;;45122:40;45042:128;44979:191;:::o;33890:716::-;34074:88;;-1:-1:-1;;;34074:88:0;;34053:4;;-1:-1:-1;;;;;34074:45:0;;;;;:88;;36508:10;;34141:4;;34147:7;;34156:5;;34074:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34074:88:0;;;;;;;;-1:-1:-1;;34074:88:0;;;;;;;;;;;;:::i;:::-;;;34070:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34357:13:0;;34353:235;;34403:40;;-1:-1:-1;;;34403:40:0;;;;;;;;;;;34353:235;34546:6;34540:13;34531:6;34527:2;34523:15;34516:38;34070:529;-1:-1:-1;;;;;;34233:64:0;-1:-1:-1;;;34233:64:0;;-1:-1:-1;34070:529:0;33890:716;;;;;;:::o;46521:100::-;46573:13;46606:7;46599:14;;;;;:::i;36632:1943::-;37101:4;37095:11;;37108:3;37091:21;;37186:17;;;;37882:11;;;37761:5;38014:2;38028;38018:13;;38010:22;37882:11;37997:36;38069:2;38059:13;;37653:680;38088:4;37653:680;;;38262:1;38257:3;38253:11;38246:18;;38313:2;38307:4;38303:13;38299:2;38295:22;38290:3;38282:36;38183:2;38173:13;;37653:680;;;-1:-1:-1;38363:13:0;;;-1:-1:-1;;38478:12:0;;;38538:19;;;38478:12;36632:1943;-1:-1:-1;36632:1943:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:::-;1079:3;1117:5;1111:12;1144:6;1139:3;1132:19;1160:63;1216:6;1209:4;1204:3;1200:14;1193:4;1186:5;1182:16;1160:63;:::i;:::-;1277:2;1256:15;-1:-1:-1;;1252:29:1;1243:39;;;;1284:4;1239:50;;1037:258;-1:-1:-1;;1037:258:1:o;1300:220::-;1449:2;1438:9;1431:21;1412:4;1469:45;1510:2;1499:9;1495:18;1487:6;1469:45;:::i;1525:180::-;1584:6;1637:2;1625:9;1616:7;1612:23;1608:32;1605:52;;;1653:1;1650;1643:12;1605:52;-1:-1:-1;1676:23:1;;1525:180;-1:-1:-1;1525:180:1:o;1918:173::-;1986:20;;-1:-1:-1;;;;;2035:31:1;;2025:42;;2015:70;;2081:1;2078;2071:12;2015:70;1918:173;;;:::o;2096:254::-;2164:6;2172;2225:2;2213:9;2204:7;2200:23;2196:32;2193:52;;;2241:1;2238;2231:12;2193:52;2264:29;2283:9;2264:29;:::i;:::-;2254:39;2340:2;2325:18;;;;2312:32;;-1:-1:-1;;;2096:254:1:o;2355:367::-;2418:8;2428:6;2482:3;2475:4;2467:6;2463:17;2459:27;2449:55;;2500:1;2497;2490:12;2449:55;-1:-1:-1;2523:20:1;;2566:18;2555:30;;2552:50;;;2598:1;2595;2588:12;2552:50;2635:4;2627:6;2623:17;2611:29;;2695:3;2688:4;2678:6;2675:1;2671:14;2663:6;2659:27;2655:38;2652:47;2649:67;;;2712:1;2709;2702:12;2649:67;2355:367;;;;;:::o;2727:437::-;2813:6;2821;2874:2;2862:9;2853:7;2849:23;2845:32;2842:52;;;2890:1;2887;2880:12;2842:52;2930:9;2917:23;2963:18;2955:6;2952:30;2949:50;;;2995:1;2992;2985:12;2949:50;3034:70;3096:7;3087:6;3076:9;3072:22;3034:70;:::i;:::-;3123:8;;3008:96;;-1:-1:-1;2727:437:1;-1:-1:-1;;;;2727:437:1:o;3169:328::-;3246:6;3254;3262;3315:2;3303:9;3294:7;3290:23;3286:32;3283:52;;;3331:1;3328;3321:12;3283:52;3354:29;3373:9;3354:29;:::i;:::-;3344:39;;3402:38;3436:2;3425:9;3421:18;3402:38;:::i;:::-;3392:48;;3487:2;3476:9;3472:18;3459:32;3449:42;;3169:328;;;;;:::o;3502:773::-;3624:6;3632;3640;3648;3701:2;3689:9;3680:7;3676:23;3672:32;3669:52;;;3717:1;3714;3707:12;3669:52;3757:9;3744:23;3786:18;3827:2;3819:6;3816:14;3813:34;;;3843:1;3840;3833:12;3813:34;3882:70;3944:7;3935:6;3924:9;3920:22;3882:70;:::i;:::-;3971:8;;-1:-1:-1;3856:96:1;-1:-1:-1;4059:2:1;4044:18;;4031:32;;-1:-1:-1;4075:16:1;;;4072:36;;;4104:1;4101;4094:12;4072:36;;4143:72;4207:7;4196:8;4185:9;4181:24;4143:72;:::i;:::-;3502:773;;;;-1:-1:-1;4234:8:1;-1:-1:-1;;;;3502:773:1:o;4280:186::-;4339:6;4392:2;4380:9;4371:7;4367:23;4363:32;4360:52;;;4408:1;4405;4398:12;4360:52;4431:29;4450:9;4431:29;:::i;4471:127::-;4532:10;4527:3;4523:20;4520:1;4513:31;4563:4;4560:1;4553:15;4587:4;4584:1;4577:15;4603:632;4668:5;4698:18;4739:2;4731:6;4728:14;4725:40;;;4745:18;;:::i;:::-;4820:2;4814:9;4788:2;4874:15;;-1:-1:-1;;4870:24:1;;;4896:2;4866:33;4862:42;4850:55;;;4920:18;;;4940:22;;;4917:46;4914:72;;;4966:18;;:::i;:::-;5006:10;5002:2;4995:22;5035:6;5026:15;;5065:6;5057;5050:22;5105:3;5096:6;5091:3;5087:16;5084:25;5081:45;;;5122:1;5119;5112:12;5081:45;5172:6;5167:3;5160:4;5152:6;5148:17;5135:44;5227:1;5220:4;5211:6;5203;5199:19;5195:30;5188:41;;;;4603:632;;;;;:::o;5240:451::-;5309:6;5362:2;5350:9;5341:7;5337:23;5333:32;5330:52;;;5378:1;5375;5368:12;5330:52;5418:9;5405:23;5451:18;5443:6;5440:30;5437:50;;;5483:1;5480;5473:12;5437:50;5506:22;;5559:4;5551:13;;5547:27;-1:-1:-1;5537:55:1;;5588:1;5585;5578:12;5537:55;5611:74;5677:7;5672:2;5659:16;5654:2;5650;5646:11;5611:74;:::i;5696:347::-;5761:6;5769;5822:2;5810:9;5801:7;5797:23;5793:32;5790:52;;;5838:1;5835;5828:12;5790:52;5861:29;5880:9;5861:29;:::i;:::-;5851:39;;5940:2;5929:9;5925:18;5912:32;5987:5;5980:13;5973:21;5966:5;5963:32;5953:60;;6009:1;6006;5999:12;5953:60;6032:5;6022:15;;;5696:347;;;;;:::o;6048:667::-;6143:6;6151;6159;6167;6220:3;6208:9;6199:7;6195:23;6191:33;6188:53;;;6237:1;6234;6227:12;6188:53;6260:29;6279:9;6260:29;:::i;:::-;6250:39;;6308:38;6342:2;6331:9;6327:18;6308:38;:::i;:::-;6298:48;;6393:2;6382:9;6378:18;6365:32;6355:42;;6448:2;6437:9;6433:18;6420:32;6475:18;6467:6;6464:30;6461:50;;;6507:1;6504;6497:12;6461:50;6530:22;;6583:4;6575:13;;6571:27;-1:-1:-1;6561:55:1;;6612:1;6609;6602:12;6561:55;6635:74;6701:7;6696:2;6683:16;6678:2;6674;6670:11;6635:74;:::i;:::-;6625:84;;;6048:667;;;;;;;:::o;6720:260::-;6788:6;6796;6849:2;6837:9;6828:7;6824:23;6820:32;6817:52;;;6865:1;6862;6855:12;6817:52;6888:29;6907:9;6888:29;:::i;:::-;6878:39;;6936:38;6970:2;6959:9;6955:18;6936:38;:::i;:::-;6926:48;;6720:260;;;;;:::o;6985:380::-;7064:1;7060:12;;;;7107;;;7128:61;;7182:4;7174:6;7170:17;7160:27;;7128:61;7235:2;7227:6;7224:14;7204:18;7201:38;7198:161;;;7281:10;7276:3;7272:20;7269:1;7262:31;7316:4;7313:1;7306:15;7344:4;7341:1;7334:15;7198:161;;6985:380;;;:::o;7370:356::-;7572:2;7554:21;;;7591:18;;;7584:30;7650:34;7645:2;7630:18;;7623:62;7717:2;7702:18;;7370:356::o;7731:127::-;7792:10;7787:3;7783:20;7780:1;7773:31;7823:4;7820:1;7813:15;7847:4;7844:1;7837:15;7863:127;7924:10;7919:3;7915:20;7912:1;7905:31;7955:4;7952:1;7945:15;7979:4;7976:1;7969:15;7995:135;8034:3;-1:-1:-1;;8055:17:1;;8052:43;;;8075:18;;:::i;:::-;-1:-1:-1;8122:1:1;8111:13;;7995:135::o;8135:128::-;8175:3;8206:1;8202:6;8199:1;8196:13;8193:39;;;8212:18;;:::i;:::-;-1:-1:-1;8248:9:1;;8135:128::o;10713:136::-;10752:3;10780:5;10770:39;;10789:18;;:::i;:::-;-1:-1:-1;;;10825:18:1;;10713:136::o;10854:168::-;10894:7;10960:1;10956;10952:6;10948:14;10945:1;10942:21;10937:1;10930:9;10923:17;10919:45;10916:71;;;10967:18;;:::i;:::-;-1:-1:-1;11007:9:1;;10854:168::o;11027:470::-;11206:3;11244:6;11238:13;11260:53;11306:6;11301:3;11294:4;11286:6;11282:17;11260:53;:::i;:::-;11376:13;;11335:16;;;;11398:57;11376:13;11335:16;11432:4;11420:17;;11398:57;:::i;:::-;11471:20;;11027:470;-1:-1:-1;;;;11027:470:1:o;11909:489::-;-1:-1:-1;;;;;12178:15:1;;;12160:34;;12230:15;;12225:2;12210:18;;12203:43;12277:2;12262:18;;12255:34;;;12325:3;12320:2;12305:18;;12298:31;;;12103:4;;12346:46;;12372:19;;12364:6;12346:46;:::i;:::-;12338:54;11909:489;-1:-1:-1;;;;;;11909:489:1:o;12403:249::-;12472:6;12525:2;12513:9;12504:7;12500:23;12496:32;12493:52;;;12541:1;12538;12531:12;12493:52;12573:9;12567:16;12592:30;12616:5;12592:30;:::i
Swarm Source
ipfs://f000ab55a660b774236ecb4b9151ba6d40a0beb1e35e2e2cfacb97424a4709c2
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.