Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
3,333 CTP
Holders
1,099
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 CTPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CallMeCutiePie
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.7; import "./ERC721A.sol"; import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./Strings.sol"; contract CallMeCutiePie is ERC721A, Ownable, ReentrancyGuard { // ===== Variables ===== string public baseTokenURI; uint256 public mintPrice = 0.0 ether; uint256 public collectionSize = 3333; uint256 public reservedSize = 240; uint256 public maxItemsPerWallet = 3; uint256 public maxItemsPerTx = 2; uint256 public maxBatchSize = 120; // ===== Constructor ===== constructor() ERC721A("CallMeCutiePie", "CTP") {} // ===== Modifier ===== function _onlySender() private view { require(msg.sender == tx.origin); } modifier onlySender { _onlySender(); _; } // ===== Dev mint ===== function devMint(uint256 amount) external onlySender onlyOwner { require(amount <= reservedSize, "Minting amount exceeds reserved size"); require((totalSupply() + amount) <= collectionSize, "Sold out!"); require( amount % maxBatchSize == 0, "Can only mint a multiple of the maxBatchSize" ); uint256 numChunks = amount / maxBatchSize; for (uint256 i = 0; i < numChunks; i++) { _safeMint(msg.sender, maxBatchSize); } } // ===== Public mint ===== function mint(uint256 _mintAmount) public payable nonReentrant { uint256 s = totalSupply(); require(_mintAmount > 0, "Cant mint 0"); require(_mintAmount <= maxItemsPerWallet, "Cant mint more then maxmint" ); require(s + _mintAmount <= collectionSize, "Cant go over supply"); _safeMint(msg.sender, _mintAmount); delete s; } // ===== Setter (owner only) ===== function setReservedSize(uint256 _reservedSize) external onlyOwner { reservedSize = _reservedSize; } function setMintPrice(uint256 _mintPrice) external onlyOwner { mintPrice = _mintPrice; } function setMaxItemsPerTx(uint256 _maxItemsPerTx) external onlyOwner { maxItemsPerTx = _maxItemsPerTx; } function setMaxItemsPerWallet(uint256 _maxItemsPerWallet) external onlyOwner { maxItemsPerWallet = _maxItemsPerWallet; } function setBaseTokenURI(string memory _baseTokenURI) external onlyOwner { baseTokenURI = _baseTokenURI; } // ===== Withdraw to owner ===== function withdrawAll() external onlyOwner onlySender nonReentrant { (bool success, ) = msg.sender.call{value: address(this).balance}(""); require(success, "Failed to send ether"); } // ===== View ===== function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) { return string(abi.encodePacked(baseTokenURI, Strings.toString(tokenId), ".json")); } function walletOfOwner(address address_) public virtual view returns (uint256[] memory) { uint256 _balance = balanceOf(address_); uint256[] memory _tokens = new uint256[] (_balance); uint256 _index; uint256 _loopThrough = totalSupply(); for (uint256 i = 0; i < _loopThrough; i++) { bool _exists = _exists(i); if (_exists) { if (ownerOf(i) == address_) { _tokens[_index] = i; _index++; } } else if (!_exists && _tokens[_balance - 1] == 0) { _loopThrough++; } } return _tokens; } }
// SPDX-License-Identifier: MIT // 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; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.0.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @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 auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; 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 (_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 for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (_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 offset; do { emit Transfer(address(0), to, startTokenId + offset++); } while (offset < quantity); _currentIndex = startTokenId + quantity; } _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) } } }
// SPDX-License-Identifier: MIT // 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(); /** * 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"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":[{"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxItemsPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxItemsPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedSize","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":"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":"_baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxItemsPerTx","type":"uint256"}],"name":"setMaxItemsPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxItemsPerWallet","type":"uint256"}],"name":"setMaxItemsPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reservedSize","type":"uint256"}],"name":"setReservedSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600b55610d05600c5560f0600d556003600e556002600f5560786010553480156200003057600080fd5b506040518060400160405280600e81526020017f43616c6c4d6543757469655069650000000000000000000000000000000000008152506040518060400160405280600381526020017f43545000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000b5929190620001e8565b508060039080519060200190620000ce929190620001e8565b50620000df6200011560201b60201c565b600081905550505062000107620000fb6200011a60201b60201c565b6200012260201b60201c565b6001600981905550620002fd565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001f69062000298565b90600052602060002090601f0160209004810192826200021a576000855562000266565b82601f106200023557805160ff191683800117855562000266565b8280016001018555821562000266579182015b828111156200026557825182559160200191906001019062000248565b5b50905062000275919062000279565b5090565b5b80821115620002945760008160009055506001016200027a565b5090565b60006002820490506001821680620002b157607f821691505b60208210811415620002c857620002c7620002ce565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613312806200030d6000396000f3fe6080604052600436106101ee5760003560e01c80636817c76c1161010d578063a0712d68116100a0578063d547cfb71161006f578063d547cfb7146106c8578063db7aa4f9146106f3578063e985e9c51461071e578063f2fde38b1461075b578063f4a0a52814610784576101ee565b8063a0712d681461061d578063a22cb46514610639578063b88d4fde14610662578063c87b56dd1461068b576101ee565b80637a4e5715116100dc5780637a4e571514610587578063853828b6146105b05780638da5cb5b146105c757806395d89b41146105f2576101ee565b80636817c76c146104dd57806370a0823114610508578063715018a61461054557806379e1587a1461055c576101ee565b806330176e131161018557806342842e0e1161015457806342842e0e1461040f578063438b63001461043857806345c0f533146104755780636352211e146104a0576101ee565b806330176e131461036957806330666a4d14610392578063375a069a146103bd5780633c732464146103e6576101ee565b8063180fec04116101c1578063180fec04146102c157806318160ddd146102ea57806323b872dd146103155780632913daa01461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061251a565b6107ad565b6040516102279190612a2f565b60405180910390f35b34801561023c57600080fd5b5061024561083f565b6040516102529190612a4a565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906125bd565b6108d1565b60405161028f91906129a6565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906124da565b61094d565b005b3480156102cd57600080fd5b506102e860048036038101906102e391906125bd565b610a8e565b005b3480156102f657600080fd5b506102ff610aa0565b60405161030c9190612bac565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906123c4565b610ab7565b005b34801561034a57600080fd5b50610353610ac7565b6040516103609190612bac565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190612574565b610acd565b005b34801561039e57600080fd5b506103a7610aef565b6040516103b49190612bac565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df91906125bd565b610af5565b005b3480156103f257600080fd5b5061040d600480360381019061040891906125bd565b610c32565b005b34801561041b57600080fd5b50610436600480360381019061043191906123c4565b610c44565b005b34801561044457600080fd5b5061045f600480360381019061045a9190612357565b610c64565b60405161046c9190612a0d565b60405180910390f35b34801561048157600080fd5b5061048a610dc5565b6040516104979190612bac565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c291906125bd565b610dcb565b6040516104d491906129a6565b60405180910390f35b3480156104e957600080fd5b506104f2610ddd565b6040516104ff9190612bac565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a9190612357565b610de3565b60405161053c9190612bac565b60405180910390f35b34801561055157600080fd5b5061055a610e78565b005b34801561056857600080fd5b50610571610e8c565b60405161057e9190612bac565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906125bd565b610e92565b005b3480156105bc57600080fd5b506105c5610ea4565b005b3480156105d357600080fd5b506105dc610fb9565b6040516105e991906129a6565b60405180910390f35b3480156105fe57600080fd5b50610607610fe3565b6040516106149190612a4a565b60405180910390f35b610637600480360381019061063291906125bd565b611075565b005b34801561064557600080fd5b50610660600480360381019061065b919061249a565b6111c1565b005b34801561066e57600080fd5b5061068960048036038101906106849190612417565b611339565b005b34801561069757600080fd5b506106b260048036038101906106ad91906125bd565b6113ac565b6040516106bf9190612a4a565b60405180910390f35b3480156106d457600080fd5b506106dd6113e0565b6040516106ea9190612a4a565b60405180910390f35b3480156106ff57600080fd5b5061070861146e565b6040516107159190612bac565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190612384565b611474565b6040516107529190612a2f565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190612357565b611508565b005b34801561079057600080fd5b506107ab60048036038101906107a691906125bd565b61158c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108385750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461084e90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461087a90612e5b565b80156108c75780601f1061089c576101008083540402835291602001916108c7565b820191906000526020600020905b8154815290600101906020018083116108aa57829003601f168201915b5050505050905090565b60006108dc8261159e565b610912576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610958826115fd565b90508073ffffffffffffffffffffffffffffffffffffffff166109796116cb565b73ffffffffffffffffffffffffffffffffffffffff16146109dc576109a5816109a06116cb565b611474565b6109db576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610a966116d3565b80600e8190555050565b6000610aaa611751565b6001546000540303905090565b610ac2838383611756565b505050565b60105481565b610ad56116d3565b80600a9080519060200190610aeb92919061216b565b5050565b600f5481565b610afd611b1e565b610b056116d3565b600d54811115610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190612aac565b60405180910390fd5b600c5481610b56610aa0565b610b609190612cea565b1115610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612b8c565b60405180910390fd5b600060105482610bb19190612f07565b14610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890612b4c565b60405180910390fd5b600060105482610c019190612d40565b905060005b81811015610c2d57610c1a33601054611b58565b8080610c2590612ebe565b915050610c06565b505050565b610c3a6116d3565b80600d8190555050565b610c5f83838360405180602001604052806000815250611339565b505050565b60606000610c7183610de3565b905060008167ffffffffffffffff811115610c8f57610c8e612ff4565b5b604051908082528060200260200182016040528015610cbd5781602001602082028036833780820191505090505b509050600080610ccb610aa0565b905060005b81811015610db8576000610ce38261159e565b90508015610d5b578773ffffffffffffffffffffffffffffffffffffffff16610d0b83610dcb565b73ffffffffffffffffffffffffffffffffffffffff161415610d565781858581518110610d3b57610d3a612fc5565b5b6020026020010181815250508380610d5290612ebe565b9450505b610da4565b80158015610d8f5750600085600188610d749190612d71565b81518110610d8557610d84612fc5565b5b6020026020010151145b15610da3578280610d9f90612ebe565b9350505b5b508080610db090612ebe565b915050610cd0565b5082945050505050919050565b600c5481565b6000610dd6826115fd565b9050919050565b600b5481565b600080610def83611b76565b1415610e27576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e806116d3565b610e8a6000611b80565b565b600d5481565b610e9a6116d3565b80600f8190555050565b610eac6116d3565b610eb4611b1e565b60026009541415610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef190612b6c565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610f2890612991565b60006040518083038185875af1925050503d8060008114610f65576040519150601f19603f3d011682016040523d82523d6000602084013e610f6a565b606091505b5050905080610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590612b0c565b60405180910390fd5b506001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ff290612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461101e90612e5b565b801561106b5780601f106110405761010080835404028352916020019161106b565b820191906000526020600020905b81548152906001019060200180831161104e57829003601f168201915b5050505050905090565b600260095414156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290612b6c565b60405180910390fd5b600260098190555060006110cd610aa0565b905060008211611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990612a6c565b60405180910390fd5b600e54821115611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90612b2c565b60405180910390fd5b600c5482826111669190612cea565b11156111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90612acc565b60405180910390fd5b6111b13383611b58565b6000905050600160098190555050565b6111c96116cb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061123b6116cb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112e86116cb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161132d9190612a2f565b60405180910390a35050565b611344848484611756565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113a65761136f84848484611c46565b6113a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a6113b983611da6565b6040516020016113ca929190612962565b6040516020818303038152906040529050919050565b600a80546113ed90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461141990612e5b565b80156114665780601f1061143b57610100808354040283529160200191611466565b820191906000526020600020905b81548152906001019060200180831161144957829003601f168201915b505050505081565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115106116d3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790612a8c565b60405180910390fd5b61158981611b80565b50565b6115946116d3565b80600b8190555050565b6000816115a9611751565b111580156115b8575060005482105b80156115f6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061160c611751565b11611694576000548110156116935760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611691575b600081141561168757600460008360019003935083815260200190815260200160002054905061165c565b80925050506116c6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b6116db611f07565b73ffffffffffffffffffffffffffffffffffffffff166116f9610fb9565b73ffffffffffffffffffffffffffffffffffffffff161461174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690612aec565b60405180910390fd5b565b600090565b6000611761826115fd565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117c8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff166118216116cb565b73ffffffffffffffffffffffffffffffffffffffff161480611850575061184f8661184a6116cb565b611474565b5b8061188d575061185e6116cb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806118c6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118d186611b76565b1415611909576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119168686866001611f0f565b600061192183611b76565b1461195d576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611a2487611b76565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611aae576000600185019050600060046000838152602001908152602001600020541415611aac576000548114611aab578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b168686866001611f15565b505050505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b5657600080fd5b565b611b72828260405180602001604052806000815250611f1b565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c6c6116cb565b8786866040518563ffffffff1660e01b8152600401611c8e94939291906129c1565b602060405180830381600087803b158015611ca857600080fd5b505af1925050508015611cd957506040513d601f19601f82011682018060405250810190611cd69190612547565b60015b611d53573d8060008114611d09576040519150601f19603f3d011682016040523d82523d6000602084013e611d0e565b606091505b50600081511415611d4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611dee576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f02565b600082905060005b60008214611e20578080611e0990612ebe565b915050600a82611e199190612d40565b9150611df6565b60008167ffffffffffffffff811115611e3c57611e3b612ff4565b5b6040519080825280601f01601f191660200182016040528015611e6e5781602001600182028036833780820191505090505b5090505b60008514611efb57600182611e879190612d71565b9150600a85611e969190612f07565b6030611ea29190612cea565b60f81b818381518110611eb857611eb7612fc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ef49190612d40565b9450611e72565b8093505050505b919050565b600033905090565b50505050565b50505050565b611f258383611fb8565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fb357600080549050600083820390505b611f656000868380600101945086611c46565b611f9b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611f52578160005414611fb057600080fd5b50505b505050565b6000805490506000611fc984611b76565b1415612001576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561203c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120496000848385611f0f565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16120ae60018414612161565b901b60a042901b6120be85611b76565b1717600460008381526020019081526020016000208190555060005b8080600101915082018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48281106120da578282016000819055505061215c6000848385611f15565b505050565b6000819050919050565b82805461217790612e5b565b90600052602060002090601f01602090048101928261219957600085556121e0565b82601f106121b257805160ff19168380011785556121e0565b828001600101855582156121e0579182015b828111156121df5782518255916020019190600101906121c4565b5b5090506121ed91906121f1565b5090565b5b8082111561220a5760008160009055506001016121f2565b5090565b600061222161221c84612bec565b612bc7565b90508281526020810184848401111561223d5761223c613028565b5b612248848285612e19565b509392505050565b600061226361225e84612c1d565b612bc7565b90508281526020810184848401111561227f5761227e613028565b5b61228a848285612e19565b509392505050565b6000813590506122a181613280565b92915050565b6000813590506122b681613297565b92915050565b6000813590506122cb816132ae565b92915050565b6000815190506122e0816132ae565b92915050565b600082601f8301126122fb576122fa613023565b5b813561230b84826020860161220e565b91505092915050565b600082601f83011261232957612328613023565b5b8135612339848260208601612250565b91505092915050565b600081359050612351816132c5565b92915050565b60006020828403121561236d5761236c613032565b5b600061237b84828501612292565b91505092915050565b6000806040838503121561239b5761239a613032565b5b60006123a985828601612292565b92505060206123ba85828601612292565b9150509250929050565b6000806000606084860312156123dd576123dc613032565b5b60006123eb86828701612292565b93505060206123fc86828701612292565b925050604061240d86828701612342565b9150509250925092565b6000806000806080858703121561243157612430613032565b5b600061243f87828801612292565b945050602061245087828801612292565b935050604061246187828801612342565b925050606085013567ffffffffffffffff8111156124825761248161302d565b5b61248e878288016122e6565b91505092959194509250565b600080604083850312156124b1576124b0613032565b5b60006124bf85828601612292565b92505060206124d0858286016122a7565b9150509250929050565b600080604083850312156124f1576124f0613032565b5b60006124ff85828601612292565b925050602061251085828601612342565b9150509250929050565b6000602082840312156125305761252f613032565b5b600061253e848285016122bc565b91505092915050565b60006020828403121561255d5761255c613032565b5b600061256b848285016122d1565b91505092915050565b60006020828403121561258a57612589613032565b5b600082013567ffffffffffffffff8111156125a8576125a761302d565b5b6125b484828501612314565b91505092915050565b6000602082840312156125d3576125d2613032565b5b60006125e184828501612342565b91505092915050565b60006125f68383612944565b60208301905092915050565b61260b81612da5565b82525050565b600061261c82612c73565b6126268185612ca1565b935061263183612c4e565b8060005b8381101561266257815161264988826125ea565b975061265483612c94565b925050600181019050612635565b5085935050505092915050565b61267881612db7565b82525050565b600061268982612c7e565b6126938185612cb2565b93506126a3818560208601612e28565b6126ac81613037565b840191505092915050565b60006126c282612c89565b6126cc8185612cce565b93506126dc818560208601612e28565b6126e581613037565b840191505092915050565b60006126fb82612c89565b6127058185612cdf565b9350612715818560208601612e28565b80840191505092915050565b6000815461272e81612e5b565b6127388186612cdf565b94506001821660008114612753576001811461276457612797565b60ff19831686528186019350612797565b61276d85612c5e565b60005b8381101561278f57815481890152600182019150602081019050612770565b838801955050505b50505092915050565b60006127ad600b83612cce565b91506127b882613048565b602082019050919050565b60006127d0602683612cce565b91506127db82613071565b604082019050919050565b60006127f3602483612cce565b91506127fe826130c0565b604082019050919050565b6000612816601383612cce565b91506128218261310f565b602082019050919050565b6000612839600583612cdf565b915061284482613138565b600582019050919050565b600061285c602083612cce565b915061286782613161565b602082019050919050565b600061287f601483612cce565b915061288a8261318a565b602082019050919050565b60006128a2600083612cc3565b91506128ad826131b3565b600082019050919050565b60006128c5601b83612cce565b91506128d0826131b6565b602082019050919050565b60006128e8602c83612cce565b91506128f3826131df565b604082019050919050565b600061290b601f83612cce565b91506129168261322e565b602082019050919050565b600061292e600983612cce565b915061293982613257565b602082019050919050565b61294d81612e0f565b82525050565b61295c81612e0f565b82525050565b600061296e8285612721565b915061297a82846126f0565b91506129858261282c565b91508190509392505050565b600061299c82612895565b9150819050919050565b60006020820190506129bb6000830184612602565b92915050565b60006080820190506129d66000830187612602565b6129e36020830186612602565b6129f06040830185612953565b8181036060830152612a02818461267e565b905095945050505050565b60006020820190508181036000830152612a278184612611565b905092915050565b6000602082019050612a44600083018461266f565b92915050565b60006020820190508181036000830152612a6481846126b7565b905092915050565b60006020820190508181036000830152612a85816127a0565b9050919050565b60006020820190508181036000830152612aa5816127c3565b9050919050565b60006020820190508181036000830152612ac5816127e6565b9050919050565b60006020820190508181036000830152612ae581612809565b9050919050565b60006020820190508181036000830152612b058161284f565b9050919050565b60006020820190508181036000830152612b2581612872565b9050919050565b60006020820190508181036000830152612b45816128b8565b9050919050565b60006020820190508181036000830152612b65816128db565b9050919050565b60006020820190508181036000830152612b85816128fe565b9050919050565b60006020820190508181036000830152612ba581612921565b9050919050565b6000602082019050612bc16000830184612953565b92915050565b6000612bd1612be2565b9050612bdd8282612e8d565b919050565b6000604051905090565b600067ffffffffffffffff821115612c0757612c06612ff4565b5b612c1082613037565b9050602081019050919050565b600067ffffffffffffffff821115612c3857612c37612ff4565b5b612c4182613037565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612cf582612e0f565b9150612d0083612e0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d3557612d34612f38565b5b828201905092915050565b6000612d4b82612e0f565b9150612d5683612e0f565b925082612d6657612d65612f67565b5b828204905092915050565b6000612d7c82612e0f565b9150612d8783612e0f565b925082821015612d9a57612d99612f38565b5b828203905092915050565b6000612db082612def565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612e46578082015181840152602081019050612e2b565b83811115612e55576000848401525b50505050565b60006002820490506001821680612e7357607f821691505b60208210811415612e8757612e86612f96565b5b50919050565b612e9682613037565b810181811067ffffffffffffffff82111715612eb557612eb4612ff4565b5b80604052505050565b6000612ec982612e0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612efc57612efb612f38565b5b600182019050919050565b6000612f1282612e0f565b9150612f1d83612e0f565b925082612f2d57612f2c612f67565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720616d6f756e7420657863656564732072657365727665642060008201527f73697a6500000000000000000000000000000000000000000000000000000000602082015250565b7f43616e7420676f206f76657220737570706c7900000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b50565b7f43616e74206d696e74206d6f7265207468656e206d61786d696e740000000000600082015250565b7f43616e206f6e6c79206d696e742061206d756c7469706c65206f66207468652060008201527f6d6178426174636853697a650000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b61328981612da5565b811461329457600080fd5b50565b6132a081612db7565b81146132ab57600080fd5b50565b6132b781612dc3565b81146132c257600080fd5b50565b6132ce81612e0f565b81146132d957600080fd5b5056fea2646970667358221220346e6bc72a5a63a9f5d074aa6121e94a8e1cd3e9e6a10e9a9d92166f47360aca64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80636817c76c1161010d578063a0712d68116100a0578063d547cfb71161006f578063d547cfb7146106c8578063db7aa4f9146106f3578063e985e9c51461071e578063f2fde38b1461075b578063f4a0a52814610784576101ee565b8063a0712d681461061d578063a22cb46514610639578063b88d4fde14610662578063c87b56dd1461068b576101ee565b80637a4e5715116100dc5780637a4e571514610587578063853828b6146105b05780638da5cb5b146105c757806395d89b41146105f2576101ee565b80636817c76c146104dd57806370a0823114610508578063715018a61461054557806379e1587a1461055c576101ee565b806330176e131161018557806342842e0e1161015457806342842e0e1461040f578063438b63001461043857806345c0f533146104755780636352211e146104a0576101ee565b806330176e131461036957806330666a4d14610392578063375a069a146103bd5780633c732464146103e6576101ee565b8063180fec04116101c1578063180fec04146102c157806318160ddd146102ea57806323b872dd146103155780632913daa01461033e576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a6004803603810190610215919061251a565b6107ad565b6040516102279190612a2f565b60405180910390f35b34801561023c57600080fd5b5061024561083f565b6040516102529190612a4a565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d91906125bd565b6108d1565b60405161028f91906129a6565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba91906124da565b61094d565b005b3480156102cd57600080fd5b506102e860048036038101906102e391906125bd565b610a8e565b005b3480156102f657600080fd5b506102ff610aa0565b60405161030c9190612bac565b60405180910390f35b34801561032157600080fd5b5061033c600480360381019061033791906123c4565b610ab7565b005b34801561034a57600080fd5b50610353610ac7565b6040516103609190612bac565b60405180910390f35b34801561037557600080fd5b50610390600480360381019061038b9190612574565b610acd565b005b34801561039e57600080fd5b506103a7610aef565b6040516103b49190612bac565b60405180910390f35b3480156103c957600080fd5b506103e460048036038101906103df91906125bd565b610af5565b005b3480156103f257600080fd5b5061040d600480360381019061040891906125bd565b610c32565b005b34801561041b57600080fd5b50610436600480360381019061043191906123c4565b610c44565b005b34801561044457600080fd5b5061045f600480360381019061045a9190612357565b610c64565b60405161046c9190612a0d565b60405180910390f35b34801561048157600080fd5b5061048a610dc5565b6040516104979190612bac565b60405180910390f35b3480156104ac57600080fd5b506104c760048036038101906104c291906125bd565b610dcb565b6040516104d491906129a6565b60405180910390f35b3480156104e957600080fd5b506104f2610ddd565b6040516104ff9190612bac565b60405180910390f35b34801561051457600080fd5b5061052f600480360381019061052a9190612357565b610de3565b60405161053c9190612bac565b60405180910390f35b34801561055157600080fd5b5061055a610e78565b005b34801561056857600080fd5b50610571610e8c565b60405161057e9190612bac565b60405180910390f35b34801561059357600080fd5b506105ae60048036038101906105a991906125bd565b610e92565b005b3480156105bc57600080fd5b506105c5610ea4565b005b3480156105d357600080fd5b506105dc610fb9565b6040516105e991906129a6565b60405180910390f35b3480156105fe57600080fd5b50610607610fe3565b6040516106149190612a4a565b60405180910390f35b610637600480360381019061063291906125bd565b611075565b005b34801561064557600080fd5b50610660600480360381019061065b919061249a565b6111c1565b005b34801561066e57600080fd5b5061068960048036038101906106849190612417565b611339565b005b34801561069757600080fd5b506106b260048036038101906106ad91906125bd565b6113ac565b6040516106bf9190612a4a565b60405180910390f35b3480156106d457600080fd5b506106dd6113e0565b6040516106ea9190612a4a565b60405180910390f35b3480156106ff57600080fd5b5061070861146e565b6040516107159190612bac565b60405180910390f35b34801561072a57600080fd5b5061074560048036038101906107409190612384565b611474565b6040516107529190612a2f565b60405180910390f35b34801561076757600080fd5b50610782600480360381019061077d9190612357565b611508565b005b34801561079057600080fd5b506107ab60048036038101906107a691906125bd565b61158c565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080857506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108385750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461084e90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461087a90612e5b565b80156108c75780601f1061089c576101008083540402835291602001916108c7565b820191906000526020600020905b8154815290600101906020018083116108aa57829003601f168201915b5050505050905090565b60006108dc8261159e565b610912576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610958826115fd565b90508073ffffffffffffffffffffffffffffffffffffffff166109796116cb565b73ffffffffffffffffffffffffffffffffffffffff16146109dc576109a5816109a06116cb565b611474565b6109db576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610a966116d3565b80600e8190555050565b6000610aaa611751565b6001546000540303905090565b610ac2838383611756565b505050565b60105481565b610ad56116d3565b80600a9080519060200190610aeb92919061216b565b5050565b600f5481565b610afd611b1e565b610b056116d3565b600d54811115610b4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4190612aac565b60405180910390fd5b600c5481610b56610aa0565b610b609190612cea565b1115610ba1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9890612b8c565b60405180910390fd5b600060105482610bb19190612f07565b14610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890612b4c565b60405180910390fd5b600060105482610c019190612d40565b905060005b81811015610c2d57610c1a33601054611b58565b8080610c2590612ebe565b915050610c06565b505050565b610c3a6116d3565b80600d8190555050565b610c5f83838360405180602001604052806000815250611339565b505050565b60606000610c7183610de3565b905060008167ffffffffffffffff811115610c8f57610c8e612ff4565b5b604051908082528060200260200182016040528015610cbd5781602001602082028036833780820191505090505b509050600080610ccb610aa0565b905060005b81811015610db8576000610ce38261159e565b90508015610d5b578773ffffffffffffffffffffffffffffffffffffffff16610d0b83610dcb565b73ffffffffffffffffffffffffffffffffffffffff161415610d565781858581518110610d3b57610d3a612fc5565b5b6020026020010181815250508380610d5290612ebe565b9450505b610da4565b80158015610d8f5750600085600188610d749190612d71565b81518110610d8557610d84612fc5565b5b6020026020010151145b15610da3578280610d9f90612ebe565b9350505b5b508080610db090612ebe565b915050610cd0565b5082945050505050919050565b600c5481565b6000610dd6826115fd565b9050919050565b600b5481565b600080610def83611b76565b1415610e27576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610e806116d3565b610e8a6000611b80565b565b600d5481565b610e9a6116d3565b80600f8190555050565b610eac6116d3565b610eb4611b1e565b60026009541415610efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef190612b6c565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610f2890612991565b60006040518083038185875af1925050503d8060008114610f65576040519150601f19603f3d011682016040523d82523d6000602084013e610f6a565b606091505b5050905080610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa590612b0c565b60405180910390fd5b506001600981905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ff290612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461101e90612e5b565b801561106b5780601f106110405761010080835404028352916020019161106b565b820191906000526020600020905b81548152906001019060200180831161104e57829003601f168201915b5050505050905090565b600260095414156110bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b290612b6c565b60405180910390fd5b600260098190555060006110cd610aa0565b905060008211611112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110990612a6c565b60405180910390fd5b600e54821115611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e90612b2c565b60405180910390fd5b600c5482826111669190612cea565b11156111a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119e90612acc565b60405180910390fd5b6111b13383611b58565b6000905050600160098190555050565b6111c96116cb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561122e576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061123b6116cb565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112e86116cb565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161132d9190612a2f565b60405180910390a35050565b611344848484611756565b60008373ffffffffffffffffffffffffffffffffffffffff163b146113a65761136f84848484611c46565b6113a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a6113b983611da6565b6040516020016113ca929190612962565b6040516020818303038152906040529050919050565b600a80546113ed90612e5b565b80601f016020809104026020016040519081016040528092919081815260200182805461141990612e5b565b80156114665780601f1061143b57610100808354040283529160200191611466565b820191906000526020600020905b81548152906001019060200180831161144957829003601f168201915b505050505081565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115106116d3565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790612a8c565b60405180910390fd5b61158981611b80565b50565b6115946116d3565b80600b8190555050565b6000816115a9611751565b111580156115b8575060005482105b80156115f6575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061160c611751565b11611694576000548110156116935760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611691575b600081141561168757600460008360019003935083815260200190815260200160002054905061165c565b80925050506116c6565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b6116db611f07565b73ffffffffffffffffffffffffffffffffffffffff166116f9610fb9565b73ffffffffffffffffffffffffffffffffffffffff161461174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690612aec565b60405180910390fd5b565b600090565b6000611761826115fd565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146117c8576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff166118216116cb565b73ffffffffffffffffffffffffffffffffffffffff161480611850575061184f8661184a6116cb565b611474565b5b8061188d575061185e6116cb565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050806118c6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006118d186611b76565b1415611909576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119168686866001611f0f565b600061192183611b76565b1461195d576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611a2487611b76565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415611aae576000600185019050600060046000838152602001908152602001600020541415611aac576000548114611aab578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b168686866001611f15565b505050505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b5657600080fd5b565b611b72828260405180602001604052806000815250611f1b565b5050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611c6c6116cb565b8786866040518563ffffffff1660e01b8152600401611c8e94939291906129c1565b602060405180830381600087803b158015611ca857600080fd5b505af1925050508015611cd957506040513d601f19601f82011682018060405250810190611cd69190612547565b60015b611d53573d8060008114611d09576040519150601f19603f3d011682016040523d82523d6000602084013e611d0e565b606091505b50600081511415611d4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611dee576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611f02565b600082905060005b60008214611e20578080611e0990612ebe565b915050600a82611e199190612d40565b9150611df6565b60008167ffffffffffffffff811115611e3c57611e3b612ff4565b5b6040519080825280601f01601f191660200182016040528015611e6e5781602001600182028036833780820191505090505b5090505b60008514611efb57600182611e879190612d71565b9150600a85611e969190612f07565b6030611ea29190612cea565b60f81b818381518110611eb857611eb7612fc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ef49190612d40565b9450611e72565b8093505050505b919050565b600033905090565b50505050565b50505050565b611f258383611fb8565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611fb357600080549050600083820390505b611f656000868380600101945086611c46565b611f9b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611f52578160005414611fb057600080fd5b50505b505050565b6000805490506000611fc984611b76565b1415612001576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082141561203c576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120496000848385611f0f565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16120ae60018414612161565b901b60a042901b6120be85611b76565b1717600460008381526020019081526020016000208190555060005b8080600101915082018473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48281106120da578282016000819055505061215c6000848385611f15565b505050565b6000819050919050565b82805461217790612e5b565b90600052602060002090601f01602090048101928261219957600085556121e0565b82601f106121b257805160ff19168380011785556121e0565b828001600101855582156121e0579182015b828111156121df5782518255916020019190600101906121c4565b5b5090506121ed91906121f1565b5090565b5b8082111561220a5760008160009055506001016121f2565b5090565b600061222161221c84612bec565b612bc7565b90508281526020810184848401111561223d5761223c613028565b5b612248848285612e19565b509392505050565b600061226361225e84612c1d565b612bc7565b90508281526020810184848401111561227f5761227e613028565b5b61228a848285612e19565b509392505050565b6000813590506122a181613280565b92915050565b6000813590506122b681613297565b92915050565b6000813590506122cb816132ae565b92915050565b6000815190506122e0816132ae565b92915050565b600082601f8301126122fb576122fa613023565b5b813561230b84826020860161220e565b91505092915050565b600082601f83011261232957612328613023565b5b8135612339848260208601612250565b91505092915050565b600081359050612351816132c5565b92915050565b60006020828403121561236d5761236c613032565b5b600061237b84828501612292565b91505092915050565b6000806040838503121561239b5761239a613032565b5b60006123a985828601612292565b92505060206123ba85828601612292565b9150509250929050565b6000806000606084860312156123dd576123dc613032565b5b60006123eb86828701612292565b93505060206123fc86828701612292565b925050604061240d86828701612342565b9150509250925092565b6000806000806080858703121561243157612430613032565b5b600061243f87828801612292565b945050602061245087828801612292565b935050604061246187828801612342565b925050606085013567ffffffffffffffff8111156124825761248161302d565b5b61248e878288016122e6565b91505092959194509250565b600080604083850312156124b1576124b0613032565b5b60006124bf85828601612292565b92505060206124d0858286016122a7565b9150509250929050565b600080604083850312156124f1576124f0613032565b5b60006124ff85828601612292565b925050602061251085828601612342565b9150509250929050565b6000602082840312156125305761252f613032565b5b600061253e848285016122bc565b91505092915050565b60006020828403121561255d5761255c613032565b5b600061256b848285016122d1565b91505092915050565b60006020828403121561258a57612589613032565b5b600082013567ffffffffffffffff8111156125a8576125a761302d565b5b6125b484828501612314565b91505092915050565b6000602082840312156125d3576125d2613032565b5b60006125e184828501612342565b91505092915050565b60006125f68383612944565b60208301905092915050565b61260b81612da5565b82525050565b600061261c82612c73565b6126268185612ca1565b935061263183612c4e565b8060005b8381101561266257815161264988826125ea565b975061265483612c94565b925050600181019050612635565b5085935050505092915050565b61267881612db7565b82525050565b600061268982612c7e565b6126938185612cb2565b93506126a3818560208601612e28565b6126ac81613037565b840191505092915050565b60006126c282612c89565b6126cc8185612cce565b93506126dc818560208601612e28565b6126e581613037565b840191505092915050565b60006126fb82612c89565b6127058185612cdf565b9350612715818560208601612e28565b80840191505092915050565b6000815461272e81612e5b565b6127388186612cdf565b94506001821660008114612753576001811461276457612797565b60ff19831686528186019350612797565b61276d85612c5e565b60005b8381101561278f57815481890152600182019150602081019050612770565b838801955050505b50505092915050565b60006127ad600b83612cce565b91506127b882613048565b602082019050919050565b60006127d0602683612cce565b91506127db82613071565b604082019050919050565b60006127f3602483612cce565b91506127fe826130c0565b604082019050919050565b6000612816601383612cce565b91506128218261310f565b602082019050919050565b6000612839600583612cdf565b915061284482613138565b600582019050919050565b600061285c602083612cce565b915061286782613161565b602082019050919050565b600061287f601483612cce565b915061288a8261318a565b602082019050919050565b60006128a2600083612cc3565b91506128ad826131b3565b600082019050919050565b60006128c5601b83612cce565b91506128d0826131b6565b602082019050919050565b60006128e8602c83612cce565b91506128f3826131df565b604082019050919050565b600061290b601f83612cce565b91506129168261322e565b602082019050919050565b600061292e600983612cce565b915061293982613257565b602082019050919050565b61294d81612e0f565b82525050565b61295c81612e0f565b82525050565b600061296e8285612721565b915061297a82846126f0565b91506129858261282c565b91508190509392505050565b600061299c82612895565b9150819050919050565b60006020820190506129bb6000830184612602565b92915050565b60006080820190506129d66000830187612602565b6129e36020830186612602565b6129f06040830185612953565b8181036060830152612a02818461267e565b905095945050505050565b60006020820190508181036000830152612a278184612611565b905092915050565b6000602082019050612a44600083018461266f565b92915050565b60006020820190508181036000830152612a6481846126b7565b905092915050565b60006020820190508181036000830152612a85816127a0565b9050919050565b60006020820190508181036000830152612aa5816127c3565b9050919050565b60006020820190508181036000830152612ac5816127e6565b9050919050565b60006020820190508181036000830152612ae581612809565b9050919050565b60006020820190508181036000830152612b058161284f565b9050919050565b60006020820190508181036000830152612b2581612872565b9050919050565b60006020820190508181036000830152612b45816128b8565b9050919050565b60006020820190508181036000830152612b65816128db565b9050919050565b60006020820190508181036000830152612b85816128fe565b9050919050565b60006020820190508181036000830152612ba581612921565b9050919050565b6000602082019050612bc16000830184612953565b92915050565b6000612bd1612be2565b9050612bdd8282612e8d565b919050565b6000604051905090565b600067ffffffffffffffff821115612c0757612c06612ff4565b5b612c1082613037565b9050602081019050919050565b600067ffffffffffffffff821115612c3857612c37612ff4565b5b612c4182613037565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612cf582612e0f565b9150612d0083612e0f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612d3557612d34612f38565b5b828201905092915050565b6000612d4b82612e0f565b9150612d5683612e0f565b925082612d6657612d65612f67565b5b828204905092915050565b6000612d7c82612e0f565b9150612d8783612e0f565b925082821015612d9a57612d99612f38565b5b828203905092915050565b6000612db082612def565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612e46578082015181840152602081019050612e2b565b83811115612e55576000848401525b50505050565b60006002820490506001821680612e7357607f821691505b60208210811415612e8757612e86612f96565b5b50919050565b612e9682613037565b810181811067ffffffffffffffff82111715612eb557612eb4612ff4565b5b80604052505050565b6000612ec982612e0f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612efc57612efb612f38565b5b600182019050919050565b6000612f1282612e0f565b9150612f1d83612e0f565b925082612f2d57612f2c612f67565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f43616e74206d696e742030000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4d696e74696e6720616d6f756e7420657863656564732072657365727665642060008201527f73697a6500000000000000000000000000000000000000000000000000000000602082015250565b7f43616e7420676f206f76657220737570706c7900000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4661696c656420746f2073656e64206574686572000000000000000000000000600082015250565b50565b7f43616e74206d696e74206d6f7265207468656e206d61786d696e740000000000600082015250565b7f43616e206f6e6c79206d696e742061206d756c7469706c65206f66207468652060008201527f6d6178426174636853697a650000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f536f6c64206f7574210000000000000000000000000000000000000000000000600082015250565b61328981612da5565b811461329457600080fd5b50565b6132a081612db7565b81146132ab57600080fd5b50565b6132b781612dc3565b81146132c257600080fd5b50565b6132ce81612e0f565b81146132d957600080fd5b5056fea2646970667358221220346e6bc72a5a63a9f5d074aa6121e94a8e1cd3e9e6a10e9a9d92166f47360aca64736f6c63430008070033
Deployed Bytecode Sourcemap
162:3364:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4874:607:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9784:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11727:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11261:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2151:132:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3957:309:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12587:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;494:33:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2289:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;456:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;835:512;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1805:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12817:179:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2923:601:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;333:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9580:142:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;291:36:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5540:231:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1809:101:4;;;;;;;;;;;;;:::i;:::-;;375:33:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2029:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2450:201;;;;;;;;;;;;;:::i;:::-;;1179:85:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9946:102:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1385:374:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11994:303:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13062:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2681:236:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;259:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;414:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12363:162:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2059:198:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1923:100:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4874:607:2;4959:4;5269:10;5254:25;;:11;:25;;;;:101;;;;5345:10;5330:25;;:11;:25;;;;5254:101;:177;;;;5421:10;5406:25;;:11;:25;;;;5254:177;5235:196;;4874:607;;;:::o;9784:98::-;9838:13;9870:5;9863:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9784:98;:::o;11727:200::-;11795:7;11819:16;11827:7;11819;:16::i;:::-;11814:64;;11844:34;;;;;;;;;;;;;;11814:64;11896:15;:24;11912:7;11896:24;;;;;;;;;;;;;;;;;;;;;11889:31;;11727:200;;;:::o;11261:405::-;11333:13;11365:27;11384:7;11365:18;:27::i;:::-;11333:61;;11432:5;11409:28;;:19;:17;:19::i;:::-;:28;;;11405:172;;11456:44;11473:5;11480:19;:17;:19::i;:::-;11456:16;:44::i;:::-;11451:126;;11527:35;;;;;;;;;;;;;;11451:126;11405:172;11614:2;11587:15;:24;11603:7;11587:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11651:7;11647:2;11631:28;;11640:5;11631:28;;;;;;;;;;;;11323:343;11261:405;;:::o;2151:132:0:-;1072:13:4;:11;:13::i;:::-;2258:18:0::1;2238:17;:38;;;;2151:132:::0;:::o;3957:309:2:-;4010:7;4234:15;:13;:15::i;:::-;4219:12;;4203:13;;:28;:46;4196:53;;3957:309;:::o;12587:164::-;12716:28;12726:4;12732:2;12736:7;12716:9;:28::i;:::-;12587:164;;;:::o;494:33:0:-;;;;:::o;2289:118::-;1072:13:4;:11;:13::i;:::-;2387::0::1;2372:12;:28;;;;;;;;;;;;:::i;:::-;;2289:118:::0;:::o;456:32::-;;;;:::o;835:512::-;770:13;:11;:13::i;:::-;1072::4::1;:11;:13::i;:::-;926:12:0::2;;916:6;:22;;908:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;1025:14;;1014:6;998:13;:11;:13::i;:::-;:22;;;;:::i;:::-;997:42;;989:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1109:1;1093:12;;1084:6;:21;;;;:::i;:::-;:26;1063:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;1190:17;1219:12;;1210:6;:21;;;;:::i;:::-;1190:41;;1246:9;1241:100;1265:9;1261:1;:13;1241:100;;;1295:35;1305:10;1317:12;;1295:9;:35::i;:::-;1276:3;;;;;:::i;:::-;;;;1241:100;;;;898:449;835:512:::0;:::o;1805:112::-;1072:13:4;:11;:13::i;:::-;1897::0::1;1882:12;:28;;;;1805:112:::0;:::o;12817:179:2:-;12950:39;12967:4;12973:2;12977:7;12950:39;;;;;;;;;;;;:16;:39::i;:::-;12817:179;;;:::o;2923:601:0:-;2993:16;3021;3040:19;3050:8;3040:9;:19::i;:::-;3021:38;;3069:24;3111:8;3096:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3069:51;;3130:14;3154:20;3177:13;:11;:13::i;:::-;3154:36;;3205:9;3200:294;3224:12;3220:1;:16;3200:294;;;3257:12;3272:10;3280:1;3272:7;:10::i;:::-;3257:25;;3300:7;3296:188;;;3345:8;3331:22;;:10;3339:1;3331:7;:10::i;:::-;:22;;;3327:62;;;3375:1;3357:7;3365:6;3357:15;;;;;;;;:::i;:::-;;;;;;;:19;;;;;3378:8;;;;;:::i;:::-;;;;3327:62;3296:188;;;3426:7;3425:8;:38;;;;;3462:1;3437:7;3456:1;3445:8;:12;;;;:::i;:::-;3437:21;;;;;;;;:::i;:::-;;;;;;;;:26;3425:38;3421:63;;;3467:14;;;;;:::i;:::-;;;;3421:63;3296:188;3243:251;3238:3;;;;;:::i;:::-;;;;3200:294;;;;3510:7;3503:14;;;;;;2923:601;;;:::o;333:36::-;;;;:::o;9580:142:2:-;9644:7;9686:27;9705:7;9686:18;:27::i;:::-;9663:52;;9580:142;;;:::o;291:36:0:-;;;;:::o;5540:231:2:-;5604:7;5655:1;5627:24;5645:5;5627:17;:24::i;:::-;:29;5623:70;;;5665:28;;;;;;;;;;;;;;5623:70;1017:13;5710:18;:25;5729:5;5710:25;;;;;;;;;;;;;;;;:54;5703:61;;5540:231;;;:::o;1809:101:4:-;1072:13;:11;:13::i;:::-;1873:30:::1;1900:1;1873:18;:30::i;:::-;1809:101::o:0;375:33:0:-;;;;:::o;2029:116::-;1072:13:4;:11;:13::i;:::-;2124:14:0::1;2108:13;:30;;;;2029:116:::0;:::o;2450:201::-;1072:13:4;:11;:13::i;:::-;770::0::1;:11;:13::i;:::-;1744:1:5::2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2527:12:0::3;2545:10;:15;;2568:21;2545:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2526:68;;;2612:7;2604:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;2516:135;1701:1:5::2;2628:7;:22;;;;2450:201:0:o:0;1179:85:4:-;1225:7;1251:6;;;;;;;;;;;1244:13;;1179:85;:::o;9946:102:2:-;10002:13;10034:7;10027:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9946:102;:::o;1385:374:0:-;1744:1:5;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1458:9:0::1;1470:13;:11;:13::i;:::-;1458:25;;1515:1;1501:11;:15;1493:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;1565:17;;1550:11;:32;;1542:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;1652:14;;1637:11;1633:1;:15;;;;:::i;:::-;:33;;1625:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;1700:34;1710:10;1722:11;1700:9;:34::i;:::-;1744:8;;;1448:311;1701:1:5::0;2628:7;:22;;;;1385:374:0;:::o;11994:303:2:-;12104:19;:17;:19::i;:::-;12092:31;;:8;:31;;;12088:61;;;12132:17;;;;;;;;;;;;;;12088:61;12212:8;12160:18;:39;12179:19;:17;:19::i;:::-;12160:39;;;;;;;;;;;;;;;:49;12200:8;12160:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;12271:8;12235:55;;12250:19;:17;:19::i;:::-;12235:55;;;12281:8;12235:55;;;;;;:::i;:::-;;;;;;;;11994:303;;:::o;13062:385::-;13223:28;13233:4;13239:2;13243:7;13223:9;:28::i;:::-;13283:1;13265:2;:14;;;:19;13261:180;;13303:56;13334:4;13340:2;13344:7;13353:5;13303:30;:56::i;:::-;13298:143;;13386:40;;;;;;;;;;;;;;13298:143;13261:180;13062:385;;;;:::o;2681:236:0:-;2787:13;2859:12;2873:25;2890:7;2873:16;:25::i;:::-;2842:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2816:94;;2681:236;;;:::o;259:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;414:36::-;;;;:::o;12363:162:2:-;12460:4;12483:18;:25;12502:5;12483:25;;;;;;;;;;;;;;;:35;12509:8;12483:35;;;;;;;;;;;;;;;;;;;;;;;;;12476:42;;12363:162;;;;:::o;2059:198:4:-;1072:13;:11;:13::i;:::-;2167:1:::1;2147:22;;:8;:22;;;;2139:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2222:28;2241:8;2222:18;:28::i;:::-;2059:198:::0;:::o;1923:100:0:-;1072:13:4;:11;:13::i;:::-;2006:10:0::1;1994:9;:22;;;;1923:100:::0;:::o;13693:268:2:-;13750:4;13804:7;13785:15;:13;:15::i;:::-;:26;;:65;;;;;13837:13;;13827:7;:23;13785:65;:150;;;;;13934:1;1769:8;13887:17;:26;13905:7;13887:26;;;;;;;;;;;;:43;:48;13785:150;13766:169;;13693:268;;;:::o;7157:1105::-;7224:7;7243:12;7258:7;7243:22;;7323:4;7304:15;:13;:15::i;:::-;:23;7300:898;;7356:13;;7349:4;:20;7345:853;;;7393:14;7410:17;:23;7428:4;7410:23;;;;;;;;;;;;7393:40;;7524:1;1769:8;7497:6;:23;:28;7493:687;;;8008:111;8025:1;8015:6;:11;8008:111;;;8067:17;:25;8085:6;;;;;;;8067:25;;;;;;;;;;;;8058:34;;8008:111;;;8151:6;8144:13;;;;;;7493:687;7371:827;7345:853;7300:898;8224:31;;;;;;;;;;;;;;7157:1105;;;;:::o;26037:103::-;26097:7;26123:10;26116:17;;26037:103;:::o;1337:130:4:-;1411:12;:10;:12::i;:::-;1400:23;;:7;:5;:7::i;:::-;:23;;;1392:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1337:130::o;3497:90:2:-;3553:7;3497:90;:::o;17254:2595::-;17364:27;17394;17413:7;17394:18;:27::i;:::-;17364:57;;17477:4;17436:45;;17452:19;17436:45;;;17432:86;;17490:28;;;;;;;;;;;;;;17432:86;17529:23;17555:15;:24;17571:7;17555:24;;;;;;;;;;;;;;;;;;;;;17529:50;;17590:22;17639:4;17616:27;;:19;:17;:19::i;:::-;:27;;;:86;;;;17659:43;17676:4;17682:19;:17;:19::i;:::-;17659:16;:43::i;:::-;17616:86;:140;;;;17737:19;:17;:19::i;:::-;17718:38;;:15;:38;;;17616:140;17590:167;;17773:17;17768:66;;17799:35;;;;;;;;;;;;;;17768:66;17873:1;17848:21;17866:2;17848:17;:21::i;:::-;:26;17844:62;;;17883:23;;;;;;;;;;;;;;17844:62;17917:43;17939:4;17945:2;17949:7;17958:1;17917:21;:43::i;:::-;18065:1;18027:34;18045:15;18027:17;:34::i;:::-;:39;18023:101;;18089:15;:24;18105:7;18089:24;;;;;;;;;;;;18082:31;;;;;;;;;;;18023:101;18484:18;:24;18503:4;18484:24;;;;;;;;;;;;;;;;18482:26;;;;;;;;;;;;18552:18;:22;18571:2;18552:22;;;;;;;;;;;;;;;;18550:24;;;;;;;;;;;2041:8;1656:3;18924:15;:41;;18883:21;18901:2;18883:17;:21::i;:::-;:83;:126;18838:17;:26;18856:7;18838:26;;;;;;;;;;;:171;;;;19176:1;2041:8;19126:19;:46;:51;19122:616;;;19197:19;19229:1;19219:7;:11;19197:33;;19384:1;19350:17;:30;19368:11;19350:30;;;;;;;;;;;;:35;19346:378;;;19486:13;;19471:11;:28;19467:239;;19664:19;19631:17;:30;19649:11;19631:30;;;;;;;;;;;:52;;;;19467:239;19346:378;19179:559;19122:616;19782:7;19778:2;19763:27;;19772:4;19763:27;;;;;;;;;;;;19800:42;19821:4;19827:2;19831:7;19840:1;19800:20;:42::i;:::-;17354:2495;;;17254:2595;;;:::o;649:85:0:-;717:9;703:23;;:10;:23;;;695:32;;;;;;649:85::o;14040:102:2:-;14108:27;14118:2;14122:8;14108:27;;;;;;;;;;;;:9;:27::i;:::-;14040:102;;:::o;10840:144::-;10904:14;10963:5;10953:15;;10840:144;;;:::o;2411:187:4:-;2484:16;2503:6;;;;;;;;;;;2484:25;;2528:8;2519:6;;:17;;;;;;;;;;;;;;;;;;2582:8;2551:40;;2572:8;2551:40;;;;;;;;;;;;2474:124;2411:187;:::o;23577:697:2:-;23735:4;23780:2;23755:45;;;23801:19;:17;:19::i;:::-;23822:4;23828:7;23837:5;23755:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23751:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24050:1;24033:6;:13;:18;24029:229;;;24078:40;;;;;;;;;;;;;;24029:229;24218:6;24212:13;24203:6;24199:2;24195:15;24188:38;23751:517;23921:54;;;23911:64;;;:6;:64;;;;23904:71;;;23577:697;;;;;;:::o;377:703:6:-;433:13;659:1;650:5;:10;646:51;;;676:10;;;;;;;;;;;;;;;;;;;;;646:51;706:12;721:5;706:20;;736:14;760:75;775:1;767:4;:9;760:75;;792:8;;;;;:::i;:::-;;;;822:2;814:10;;;;;:::i;:::-;;;760:75;;;844:19;876:6;866:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;844:39;;893:150;909:1;900:5;:10;893:150;;936:1;926:11;;;;;:::i;:::-;;;1002:2;994:5;:10;;;;:::i;:::-;981:2;:24;;;;:::i;:::-;968:39;;951:6;958;951:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1030:2;1021:11;;;;;:::i;:::-;;;893:150;;;1066:6;1052:21;;;;;377:703;;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;24905:154:2:-;;;;;:::o;25700:153::-;;;;;:::o;14516:661::-;14634:19;14640:2;14644:8;14634:5;:19::i;:::-;14710:1;14692:2;:14;;;:19;14688:473;;14731:11;14745:13;;14731:27;;14776:13;14798:8;14792:3;:14;14776:30;;14824:229;14854:62;14893:1;14897:2;14901:7;;;;;;14910:5;14854:30;:62::i;:::-;14849:165;;14951:40;;;;;;;;;;;;;;14849:165;15048:3;15040:5;:11;14824:229;;15133:3;15116:13;;:20;15112:34;;15138:8;;;15112:34;14713:448;;14688:473;14516:661;;;:::o;15438:1574::-;15502:20;15525:13;;15502:36;;15577:1;15552:21;15570:2;15552:17;:21::i;:::-;:26;15548:58;;;15587:19;;;;;;;;;;;;;;15548:58;15632:1;15620:8;:13;15616:44;;;15642:18;;;;;;;;;;;;;;15616:44;15671:61;15701:1;15705:2;15709:12;15723:8;15671:21;:61::i;:::-;16264:1;1151:2;16235:1;:25;;16234:31;16222:8;:44;16196:18;:22;16215:2;16196:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;1909:3;16655:29;16682:1;16670:8;:13;16655:14;:29::i;:::-;:56;;1656:3;16593:15;:41;;16552:21;16570:2;16552:17;:21::i;:::-;:83;:160;16502:17;:31;16520:12;16502:31;;;;;;;;;;;:210;;;;16727:14;16755:117;16821:8;;;;;;16806:12;:23;16802:2;16781:49;;16798:1;16781:49;;;;;;;;;;;;16862:8;16853:6;:17;16755:117;;16917:8;16902:12;:23;16886:13;:39;;;;15979:957;16945:60;16974:1;16978:2;16982:12;16996:8;16945:20;:60::i;:::-;15492:1520;15438:1574;;:::o;11066:138::-;11124:14;11183:5;11173:15;;11066:138;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:7:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:179::-;7227:10;7248:46;7290:3;7282:6;7248:46;:::i;:::-;7326:4;7321:3;7317:14;7303:28;;7158:179;;;;:::o;7343:118::-;7430:24;7448:5;7430:24;:::i;:::-;7425:3;7418:37;7343:118;;:::o;7497:732::-;7616:3;7645:54;7693:5;7645:54;:::i;:::-;7715:86;7794:6;7789:3;7715:86;:::i;:::-;7708:93;;7825:56;7875:5;7825:56;:::i;:::-;7904:7;7935:1;7920:284;7945:6;7942:1;7939:13;7920:284;;;8021:6;8015:13;8048:63;8107:3;8092:13;8048:63;:::i;:::-;8041:70;;8134:60;8187:6;8134:60;:::i;:::-;8124:70;;7980:224;7967:1;7964;7960:9;7955:14;;7920:284;;;7924:14;8220:3;8213:10;;7621:608;;;7497:732;;;;:::o;8235:109::-;8316:21;8331:5;8316:21;:::i;:::-;8311:3;8304:34;8235:109;;:::o;8350:360::-;8436:3;8464:38;8496:5;8464:38;:::i;:::-;8518:70;8581:6;8576:3;8518:70;:::i;:::-;8511:77;;8597:52;8642:6;8637:3;8630:4;8623:5;8619:16;8597:52;:::i;:::-;8674:29;8696:6;8674:29;:::i;:::-;8669:3;8665:39;8658:46;;8440:270;8350:360;;;;:::o;8716:364::-;8804:3;8832:39;8865:5;8832:39;:::i;:::-;8887:71;8951:6;8946:3;8887:71;:::i;:::-;8880:78;;8967:52;9012:6;9007:3;9000:4;8993:5;8989:16;8967:52;:::i;:::-;9044:29;9066:6;9044:29;:::i;:::-;9039:3;9035:39;9028:46;;8808:272;8716:364;;;;:::o;9086:377::-;9192:3;9220:39;9253:5;9220:39;:::i;:::-;9275:89;9357:6;9352:3;9275:89;:::i;:::-;9268:96;;9373:52;9418:6;9413:3;9406:4;9399:5;9395:16;9373:52;:::i;:::-;9450:6;9445:3;9441:16;9434:23;;9196:267;9086:377;;;;:::o;9493:845::-;9596:3;9633:5;9627:12;9662:36;9688:9;9662:36;:::i;:::-;9714:89;9796:6;9791:3;9714:89;:::i;:::-;9707:96;;9834:1;9823:9;9819:17;9850:1;9845:137;;;;9996:1;9991:341;;;;9812:520;;9845:137;9929:4;9925:9;9914;9910:25;9905:3;9898:38;9965:6;9960:3;9956:16;9949:23;;9845:137;;9991:341;10058:38;10090:5;10058:38;:::i;:::-;10118:1;10132:154;10146:6;10143:1;10140:13;10132:154;;;10220:7;10214:14;10210:1;10205:3;10201:11;10194:35;10270:1;10261:7;10257:15;10246:26;;10168:4;10165:1;10161:12;10156:17;;10132:154;;;10315:6;10310:3;10306:16;10299:23;;9998:334;;9812:520;;9600:738;;9493:845;;;;:::o;10344:366::-;10486:3;10507:67;10571:2;10566:3;10507:67;:::i;:::-;10500:74;;10583:93;10672:3;10583:93;:::i;:::-;10701:2;10696:3;10692:12;10685:19;;10344:366;;;:::o;10716:::-;10858:3;10879:67;10943:2;10938:3;10879:67;:::i;:::-;10872:74;;10955:93;11044:3;10955:93;:::i;:::-;11073:2;11068:3;11064:12;11057:19;;10716:366;;;:::o;11088:::-;11230:3;11251:67;11315:2;11310:3;11251:67;:::i;:::-;11244:74;;11327:93;11416:3;11327:93;:::i;:::-;11445:2;11440:3;11436:12;11429:19;;11088:366;;;:::o;11460:::-;11602:3;11623:67;11687:2;11682:3;11623:67;:::i;:::-;11616:74;;11699:93;11788:3;11699:93;:::i;:::-;11817:2;11812:3;11808:12;11801:19;;11460:366;;;:::o;11832:400::-;11992:3;12013:84;12095:1;12090:3;12013:84;:::i;:::-;12006:91;;12106:93;12195:3;12106:93;:::i;:::-;12224:1;12219:3;12215:11;12208:18;;11832:400;;;:::o;12238:366::-;12380:3;12401:67;12465:2;12460:3;12401:67;:::i;:::-;12394:74;;12477:93;12566:3;12477:93;:::i;:::-;12595:2;12590:3;12586:12;12579:19;;12238:366;;;:::o;12610:::-;12752:3;12773:67;12837:2;12832:3;12773:67;:::i;:::-;12766:74;;12849:93;12938:3;12849:93;:::i;:::-;12967:2;12962:3;12958:12;12951:19;;12610:366;;;:::o;12982:398::-;13141:3;13162:83;13243:1;13238:3;13162:83;:::i;:::-;13155:90;;13254:93;13343:3;13254:93;:::i;:::-;13372:1;13367:3;13363:11;13356:18;;12982:398;;;:::o;13386:366::-;13528:3;13549:67;13613:2;13608:3;13549:67;:::i;:::-;13542:74;;13625:93;13714:3;13625:93;:::i;:::-;13743:2;13738:3;13734:12;13727:19;;13386:366;;;:::o;13758:::-;13900:3;13921:67;13985:2;13980:3;13921:67;:::i;:::-;13914:74;;13997:93;14086:3;13997:93;:::i;:::-;14115:2;14110:3;14106:12;14099:19;;13758:366;;;:::o;14130:::-;14272:3;14293:67;14357:2;14352:3;14293:67;:::i;:::-;14286:74;;14369:93;14458:3;14369:93;:::i;:::-;14487:2;14482:3;14478:12;14471:19;;14130:366;;;:::o;14502:365::-;14644:3;14665:66;14729:1;14724:3;14665:66;:::i;:::-;14658:73;;14740:93;14829:3;14740:93;:::i;:::-;14858:2;14853:3;14849:12;14842:19;;14502:365;;;:::o;14873:108::-;14950:24;14968:5;14950:24;:::i;:::-;14945:3;14938:37;14873:108;;:::o;14987:118::-;15074:24;15092:5;15074:24;:::i;:::-;15069:3;15062:37;14987:118;;:::o;15111:695::-;15389:3;15411:92;15499:3;15490:6;15411:92;:::i;:::-;15404:99;;15520:95;15611:3;15602:6;15520:95;:::i;:::-;15513:102;;15632:148;15776:3;15632:148;:::i;:::-;15625:155;;15797:3;15790:10;;15111:695;;;;;:::o;15812:379::-;15996:3;16018:147;16161:3;16018:147;:::i;:::-;16011:154;;16182:3;16175:10;;15812:379;;;:::o;16197:222::-;16290:4;16328:2;16317:9;16313:18;16305:26;;16341:71;16409:1;16398:9;16394:17;16385:6;16341:71;:::i;:::-;16197:222;;;;:::o;16425:640::-;16620:4;16658:3;16647:9;16643:19;16635:27;;16672:71;16740:1;16729:9;16725:17;16716:6;16672:71;:::i;:::-;16753:72;16821:2;16810:9;16806:18;16797:6;16753:72;:::i;:::-;16835;16903:2;16892:9;16888:18;16879:6;16835:72;:::i;:::-;16954:9;16948:4;16944:20;16939:2;16928:9;16924:18;16917:48;16982:76;17053:4;17044:6;16982:76;:::i;:::-;16974:84;;16425:640;;;;;;;:::o;17071:373::-;17214:4;17252:2;17241:9;17237:18;17229:26;;17301:9;17295:4;17291:20;17287:1;17276:9;17272:17;17265:47;17329:108;17432:4;17423:6;17329:108;:::i;:::-;17321:116;;17071:373;;;;:::o;17450:210::-;17537:4;17575:2;17564:9;17560:18;17552:26;;17588:65;17650:1;17639:9;17635:17;17626:6;17588:65;:::i;:::-;17450:210;;;;:::o;17666:313::-;17779:4;17817:2;17806:9;17802:18;17794:26;;17866:9;17860:4;17856:20;17852:1;17841:9;17837:17;17830:47;17894:78;17967:4;17958:6;17894:78;:::i;:::-;17886:86;;17666:313;;;;:::o;17985:419::-;18151:4;18189:2;18178:9;18174:18;18166:26;;18238:9;18232:4;18228:20;18224:1;18213:9;18209:17;18202:47;18266:131;18392:4;18266:131;:::i;:::-;18258:139;;17985:419;;;:::o;18410:::-;18576:4;18614:2;18603:9;18599:18;18591:26;;18663:9;18657:4;18653:20;18649:1;18638:9;18634:17;18627:47;18691:131;18817:4;18691:131;:::i;:::-;18683:139;;18410:419;;;:::o;18835:::-;19001:4;19039:2;19028:9;19024:18;19016:26;;19088:9;19082:4;19078:20;19074:1;19063:9;19059:17;19052:47;19116:131;19242:4;19116:131;:::i;:::-;19108:139;;18835:419;;;:::o;19260:::-;19426:4;19464:2;19453:9;19449:18;19441:26;;19513:9;19507:4;19503:20;19499:1;19488:9;19484:17;19477:47;19541:131;19667:4;19541:131;:::i;:::-;19533:139;;19260:419;;;:::o;19685:::-;19851:4;19889:2;19878:9;19874:18;19866:26;;19938:9;19932:4;19928:20;19924:1;19913:9;19909:17;19902:47;19966:131;20092:4;19966:131;:::i;:::-;19958:139;;19685:419;;;:::o;20110:::-;20276:4;20314:2;20303:9;20299:18;20291:26;;20363:9;20357:4;20353:20;20349:1;20338:9;20334:17;20327:47;20391:131;20517:4;20391:131;:::i;:::-;20383:139;;20110:419;;;:::o;20535:::-;20701:4;20739:2;20728:9;20724:18;20716:26;;20788:9;20782:4;20778:20;20774:1;20763:9;20759:17;20752:47;20816:131;20942:4;20816:131;:::i;:::-;20808:139;;20535:419;;;:::o;20960:::-;21126:4;21164:2;21153:9;21149:18;21141:26;;21213:9;21207:4;21203:20;21199:1;21188:9;21184:17;21177:47;21241:131;21367:4;21241:131;:::i;:::-;21233:139;;20960:419;;;:::o;21385:::-;21551:4;21589:2;21578:9;21574:18;21566:26;;21638:9;21632:4;21628:20;21624:1;21613:9;21609:17;21602:47;21666:131;21792:4;21666:131;:::i;:::-;21658:139;;21385:419;;;:::o;21810:::-;21976:4;22014:2;22003:9;21999:18;21991:26;;22063:9;22057:4;22053:20;22049:1;22038:9;22034:17;22027:47;22091:131;22217:4;22091:131;:::i;:::-;22083:139;;21810:419;;;:::o;22235:222::-;22328:4;22366:2;22355:9;22351:18;22343:26;;22379:71;22447:1;22436:9;22432:17;22423:6;22379:71;:::i;:::-;22235:222;;;;:::o;22463:129::-;22497:6;22524:20;;:::i;:::-;22514:30;;22553:33;22581:4;22573:6;22553:33;:::i;:::-;22463:129;;;:::o;22598:75::-;22631:6;22664:2;22658:9;22648:19;;22598:75;:::o;22679:307::-;22740:4;22830:18;22822:6;22819:30;22816:56;;;22852:18;;:::i;:::-;22816:56;22890:29;22912:6;22890:29;:::i;:::-;22882:37;;22974:4;22968;22964:15;22956:23;;22679:307;;;:::o;22992:308::-;23054:4;23144:18;23136:6;23133:30;23130:56;;;23166:18;;:::i;:::-;23130:56;23204:29;23226:6;23204:29;:::i;:::-;23196:37;;23288:4;23282;23278:15;23270:23;;22992:308;;;:::o;23306:132::-;23373:4;23396:3;23388:11;;23426:4;23421:3;23417:14;23409:22;;23306:132;;;:::o;23444:141::-;23493:4;23516:3;23508:11;;23539:3;23536:1;23529:14;23573:4;23570:1;23560:18;23552:26;;23444:141;;;:::o;23591:114::-;23658:6;23692:5;23686:12;23676:22;;23591:114;;;:::o;23711:98::-;23762:6;23796:5;23790:12;23780:22;;23711:98;;;:::o;23815:99::-;23867:6;23901:5;23895:12;23885:22;;23815:99;;;:::o;23920:113::-;23990:4;24022;24017:3;24013:14;24005:22;;23920:113;;;:::o;24039:184::-;24138:11;24172:6;24167:3;24160:19;24212:4;24207:3;24203:14;24188:29;;24039:184;;;;:::o;24229:168::-;24312:11;24346:6;24341:3;24334:19;24386:4;24381:3;24377:14;24362:29;;24229:168;;;;:::o;24403:147::-;24504:11;24541:3;24526:18;;24403:147;;;;:::o;24556:169::-;24640:11;24674:6;24669:3;24662:19;24714:4;24709:3;24705:14;24690:29;;24556:169;;;;:::o;24731:148::-;24833:11;24870:3;24855:18;;24731:148;;;;:::o;24885:305::-;24925:3;24944:20;24962:1;24944:20;:::i;:::-;24939:25;;24978:20;24996:1;24978:20;:::i;:::-;24973:25;;25132:1;25064:66;25060:74;25057:1;25054:81;25051:107;;;25138:18;;:::i;:::-;25051:107;25182:1;25179;25175:9;25168:16;;24885:305;;;;:::o;25196:185::-;25236:1;25253:20;25271:1;25253:20;:::i;:::-;25248:25;;25287:20;25305:1;25287:20;:::i;:::-;25282:25;;25326:1;25316:35;;25331:18;;:::i;:::-;25316:35;25373:1;25370;25366:9;25361:14;;25196:185;;;;:::o;25387:191::-;25427:4;25447:20;25465:1;25447:20;:::i;:::-;25442:25;;25481:20;25499:1;25481:20;:::i;:::-;25476:25;;25520:1;25517;25514:8;25511:34;;;25525:18;;:::i;:::-;25511:34;25570:1;25567;25563:9;25555:17;;25387:191;;;;:::o;25584:96::-;25621:7;25650:24;25668:5;25650:24;:::i;:::-;25639:35;;25584:96;;;:::o;25686:90::-;25720:7;25763:5;25756:13;25749:21;25738:32;;25686:90;;;:::o;25782:149::-;25818:7;25858:66;25851:5;25847:78;25836:89;;25782:149;;;:::o;25937:126::-;25974:7;26014:42;26007:5;26003:54;25992:65;;25937:126;;;:::o;26069:77::-;26106:7;26135:5;26124:16;;26069:77;;;:::o;26152:154::-;26236:6;26231:3;26226;26213:30;26298:1;26289:6;26284:3;26280:16;26273:27;26152:154;;;:::o;26312:307::-;26380:1;26390:113;26404:6;26401:1;26398:13;26390:113;;;26489:1;26484:3;26480:11;26474:18;26470:1;26465:3;26461:11;26454:39;26426:2;26423:1;26419:10;26414:15;;26390:113;;;26521:6;26518:1;26515:13;26512:101;;;26601:1;26592:6;26587:3;26583:16;26576:27;26512:101;26361:258;26312:307;;;:::o;26625:320::-;26669:6;26706:1;26700:4;26696:12;26686:22;;26753:1;26747:4;26743:12;26774:18;26764:81;;26830:4;26822:6;26818:17;26808:27;;26764:81;26892:2;26884:6;26881:14;26861:18;26858:38;26855:84;;;26911:18;;:::i;:::-;26855:84;26676:269;26625:320;;;:::o;26951:281::-;27034:27;27056:4;27034:27;:::i;:::-;27026:6;27022:40;27164:6;27152:10;27149:22;27128:18;27116:10;27113:34;27110:62;27107:88;;;27175:18;;:::i;:::-;27107:88;27215:10;27211:2;27204:22;26994:238;26951:281;;:::o;27238:233::-;27277:3;27300:24;27318:5;27300:24;:::i;:::-;27291:33;;27346:66;27339:5;27336:77;27333:103;;;27416:18;;:::i;:::-;27333:103;27463:1;27456:5;27452:13;27445:20;;27238:233;;;:::o;27477:176::-;27509:1;27526:20;27544:1;27526:20;:::i;:::-;27521:25;;27560:20;27578:1;27560:20;:::i;:::-;27555:25;;27599:1;27589:35;;27604:18;;:::i;:::-;27589:35;27645:1;27642;27638:9;27633:14;;27477:176;;;;:::o;27659:180::-;27707:77;27704:1;27697:88;27804:4;27801:1;27794:15;27828:4;27825:1;27818:15;27845:180;27893:77;27890:1;27883:88;27990:4;27987:1;27980:15;28014:4;28011:1;28004:15;28031:180;28079:77;28076:1;28069:88;28176:4;28173:1;28166:15;28200:4;28197:1;28190:15;28217:180;28265:77;28262:1;28255:88;28362:4;28359:1;28352:15;28386:4;28383:1;28376:15;28403:180;28451:77;28448:1;28441:88;28548:4;28545:1;28538:15;28572:4;28569:1;28562:15;28589:117;28698:1;28695;28688:12;28712:117;28821:1;28818;28811:12;28835:117;28944:1;28941;28934:12;28958:117;29067:1;29064;29057:12;29081:102;29122:6;29173:2;29169:7;29164:2;29157:5;29153:14;29149:28;29139:38;;29081:102;;;:::o;29189:161::-;29329:13;29325:1;29317:6;29313:14;29306:37;29189:161;:::o;29356:225::-;29496:34;29492:1;29484:6;29480:14;29473:58;29565:8;29560:2;29552:6;29548:15;29541:33;29356:225;:::o;29587:223::-;29727:34;29723:1;29715:6;29711:14;29704:58;29796:6;29791:2;29783:6;29779:15;29772:31;29587:223;:::o;29816:169::-;29956:21;29952:1;29944:6;29940:14;29933:45;29816:169;:::o;29991:155::-;30131:7;30127:1;30119:6;30115:14;30108:31;29991:155;:::o;30152:182::-;30292:34;30288:1;30280:6;30276:14;30269:58;30152:182;:::o;30340:170::-;30480:22;30476:1;30468:6;30464:14;30457:46;30340:170;:::o;30516:114::-;;:::o;30636:177::-;30776:29;30772:1;30764:6;30760:14;30753:53;30636:177;:::o;30819:231::-;30959:34;30955:1;30947:6;30943:14;30936:58;31028:14;31023:2;31015:6;31011:15;31004:39;30819:231;:::o;31056:181::-;31196:33;31192:1;31184:6;31180:14;31173:57;31056:181;:::o;31243:159::-;31383:11;31379:1;31371:6;31367:14;31360:35;31243:159;:::o;31408:122::-;31481:24;31499:5;31481:24;:::i;:::-;31474:5;31471:35;31461:63;;31520:1;31517;31510:12;31461:63;31408:122;:::o;31536:116::-;31606:21;31621:5;31606:21;:::i;:::-;31599:5;31596:32;31586:60;;31642:1;31639;31632:12;31586:60;31536:116;:::o;31658:120::-;31730:23;31747:5;31730:23;:::i;:::-;31723:5;31720:34;31710:62;;31768:1;31765;31758:12;31710:62;31658:120;:::o;31784:122::-;31857:24;31875:5;31857:24;:::i;:::-;31850:5;31847:35;31837:63;;31896:1;31893;31886:12;31837:63;31784:122;:::o
Swarm Source
ipfs://346e6bc72a5a63a9f5d074aa6121e94a8e1cd3e9e6a10e9a9d92166f47360aca
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.