ERC-721
Overview
Max Total Supply
2,500 MIR
Holders
815
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MIRLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MiladyRaveMaker
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-08-09 */ // SPDX-License-Identifier: MIT // File: solady/src/utils/SafeTransferLib.sol pragma solidity ^0.8.4; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Caution! This library won't check that a token has code, responsibility is delegated to the caller. library SafeTransferLib { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ error ETHTransferFailed(); error TransferFromFailed(); error TransferFailed(); error ApproveFailed(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ETH OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function safeTransferETH(address to, uint256 amount) internal { assembly { // Transfer the ETH and check if it succeeded or not. if iszero(call(gas(), to, amount, 0, 0, 0, 0)) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function safeTransferFrom( address token, address from, address to, uint256 amount ) internal { assembly { // We'll write our calldata to this slot below, but restore it later. let memPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(0x00, 0x23b872dd) mstore(0x20, from) // Append the "from" argument. mstore(0x40, to) // Append the "to" argument. mstore(0x60, amount) // Append the "amount" argument. if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x64 because that's the total length of our calldata (0x04 + 0x20 * 3) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, memPointer) // Restore the memPointer. } } function safeTransfer( address token, address to, uint256 amount ) internal { assembly { // We'll write our calldata to this slot below, but restore it later. let memPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(0x00, 0xa9059cbb) mstore(0x20, to) // Append the "to" argument. mstore(0x40, amount) // Append the "amount" argument. if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x44 because that's the total length of our calldata (0x04 + 0x20 * 2) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), token, 0, 0x1c, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x40, memPointer) // Restore the memPointer. } } function safeApprove( address token, address to, uint256 amount ) internal { assembly { // We'll write our calldata to this slot below, but restore it later. let memPointer := mload(0x40) // Write the abi-encoded calldata into memory, beginning with the function selector. mstore(0x00, 0x095ea7b3) mstore(0x20, to) // Append the "to" argument. mstore(0x40, amount) // Append the "amount" argument. if iszero( and( // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), // We use 0x44 because that's the total length of our calldata (0x04 + 0x20 * 2) // Counterintuitively, this call() must be positioned after the or() in the // surrounding and() because and() evaluates its arguments from right to left. call(gas(), token, 0, 0x1c, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `ApproveFailed()`. mstore(0x00, 0x3e3f8f73) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x40, memPointer) // Restore the memPointer. } } } // File: solady/src/utils/LibString.sol pragma solidity ^0.8.4; /// @notice Library for converting numbers into strings and other string operations. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibString.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibString.sol) library LibString { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ error HexLengthInsufficient(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* DECIMAL OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function toString(uint256 value) internal pure returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 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: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* HEXADECIMAL OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function toHexString(uint256 value, uint256 length) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need length * 2 bytes for the digits, 2 bytes for the prefix, // and 32 bytes for the length. We add 32 to the total and round down // to a multiple of 32. (32 + 2 + 32) = 66. str := add(start, and(add(shl(1, length), 66), not(31))) // Cache the end to calculate the length later. let end := str // Allocate the memory. mstore(0x40, str) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let temp := value // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for {} 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) length := sub(length, 1) // prettier-ignore if iszero(length) { break } } if temp { // Store the function selector of `HexLengthInsufficient()`. mstore(0x00, 0x2194895a) // Revert with (offset, size). revert(0x1c, 0x04) } // Compute the string's length. let strLength := add(sub(end, str), 2) // Move the pointer and write the "0x" prefix. str := sub(str, 0x20) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, strLength) } } function toHexString(uint256 value) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 0x20 bytes for the length, 0x02 bytes for the prefix, // and 0x40 bytes for the digits. // The next multiple of 0x20 above (0x20 + 2 + 0x40) is 0x80. str := add(start, 0x80) // Cache the end to calculate the length later. let end := str // Allocate the memory. mstore(0x40, str) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) // prettier-ignore if iszero(temp) { break } } // Compute the string's length. let strLength := add(sub(end, str), 2) // Move the pointer and write the "0x" prefix. str := sub(str, 0x20) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, strLength) } } function toHexString(address value) internal pure returns (string memory str) { assembly { let start := mload(0x40) // We need 32 bytes for the length, 2 bytes for the prefix, // and 40 bytes for the digits. // The next multiple of 32 above (32 + 2 + 40) is 96. str := add(start, 96) // Allocate the memory. mstore(0x40, str) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let length := 20 // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 2) mstore8(add(str, 1), mload(and(temp, 15))) mstore8(str, mload(and(shr(4, temp), 15))) temp := shr(8, temp) length := sub(length, 1) // prettier-ignore if iszero(length) { break } } // Move the pointer and write the "0x" prefix. str := sub(str, 32) mstore(str, 0x3078) // Move the pointer and write the length. str := sub(str, 2) mstore(str, 42) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* OTHER STRING OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function replace( string memory subject, string memory search, string memory replacement ) internal pure returns (string memory result) { assembly { let subjectLength := mload(subject) let searchLength := mload(search) let replacementLength := mload(replacement) subject := add(subject, 0x20) search := add(search, 0x20) replacement := add(replacement, 0x20) result := add(mload(0x40), 0x20) let subjectEnd := add(subject, subjectLength) if iszero(gt(searchLength, subjectLength)) { let subjectSearchEnd := add(sub(subjectEnd, searchLength), 1) let h := 0 if iszero(lt(searchLength, 32)) { h := keccak256(search, searchLength) } let m := shl(3, sub(32, and(searchLength, 31))) let s := mload(search) // prettier-ignore for {} 1 {} { let t := mload(subject) // Whether the first `searchLength % 32` bytes of // `subject` and `search` matches. if iszero(shr(m, xor(t, s))) { if h { if iszero(eq(keccak256(subject, searchLength), h)) { mstore(result, t) result := add(result, 1) subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } } // Copy the `replacement` one word at a time. // prettier-ignore for { let o := 0 } 1 {} { mstore(add(result, o), mload(add(replacement, o))) o := add(o, 0x20) // prettier-ignore if iszero(lt(o, replacementLength)) { break } } result := add(result, replacementLength) subject := add(subject, searchLength) if iszero(searchLength) { mstore(result, t) result := add(result, 1) subject := add(subject, 1) } // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } continue } mstore(result, t) result := add(result, 1) subject := add(subject, 1) // prettier-ignore if iszero(lt(subject, subjectSearchEnd)) { break } } } let resultRemainder := result result := add(mload(0x40), 0x20) let k := add(sub(resultRemainder, result), sub(subjectEnd, subject)) // Copy the rest of the string one word at a time. // prettier-ignore for {} lt(subject, subjectEnd) {} { mstore(resultRemainder, mload(subject)) resultRemainder := add(resultRemainder, 0x20) subject := add(subject, 0x20) } // Allocate memory for the length and the bytes, // rounded up to a multiple of 32. mstore(0x40, add(result, and(add(k, 0x40), not(0x1f)))) result := sub(result, 0x20) mstore(result, k) } } } // File: solady/src/utils/ECDSA.sol pragma solidity ^0.8.4; /// @notice Gas optimized ECDSA wrapper. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ECDSA.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ECDSA.sol) /// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol) library ECDSA { function recover(bytes32 hash, bytes calldata signature) internal view returns (address result) { assembly { // Copy the free memory pointer so that we can restore it later. let m := mload(0x40) // Directly load `s` from the calldata. let s := calldataload(add(signature.offset, 0x20)) switch signature.length case 64 { // Here, `s` is actually `vs` that needs to be recovered into `v` and `s`. // Compute `v` and store it in the scratch space. mstore(0x20, add(shr(255, s), 27)) // prettier-ignore s := and(s, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) } case 65 { // Compute `v` and store it in the scratch space. mstore(0x20, byte(0, calldataload(add(signature.offset, 0x40)))) } // If `s` in lower half order, such that the signature is not malleable. // prettier-ignore if iszero(gt(s, 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0)) { mstore(0x00, hash) calldatacopy(0x40, signature.offset, 0x20) // Directly copy `r` over. mstore(0x60, s) pop( staticcall( gas(), // Amount of gas left for the transaction. 0x01, // Address of `ecrecover`. 0x00, // Start of input. 0x80, // Size of input. 0x40, // Start of output. 0x20 // Size of output. ) ) // Restore the zero slot. mstore(0x60, 0) // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise. result := mload(sub(0x60, returndatasize())) } // Restore the free memory pointer. mstore(0x40, m) } } function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 result) { assembly { // Store into scratch space for keccak256. mstore(0x20, hash) mstore(0x00, "\x00\x00\x00\x00\x19Ethereum Signed Message:\n32") // 0x40 - 0x04 = 0x3c result := keccak256(0x04, 0x3c) } } function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32 result) { assembly { // We need at most 128 bytes for Ethereum signed message header. // The max length of the ASCII reprenstation of a uint256 is 78 bytes. // The length of "\x19Ethereum Signed Message:\n" is 26 bytes (i.e. 0x1a). // The next multiple of 32 above 78 + 26 is 128 (i.e. 0x80). // Instead of allocating, we temporarily copy the 128 bytes before the // start of `s` data to some variables. let m3 := mload(sub(s, 0x60)) let m2 := mload(sub(s, 0x40)) let m1 := mload(sub(s, 0x20)) // The length of `s` is in bytes. let sLength := mload(s) let ptr := add(s, 0x20) // `end` marks the end of the memory which we will compute the keccak256 of. let end := add(ptr, sLength) // Convert the length of the bytes to ASCII decimal representation // and store it into the memory. // prettier-ignore for { let temp := sLength } 1 {} { ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } // Copy the header over to the memory. mstore(sub(ptr, 0x20), "\x00\x00\x00\x00\x00\x00\x19Ethereum Signed Message:\n") // Compute the keccak256 of the memory. result := keccak256(sub(ptr, 0x1a), sub(end, sub(ptr, 0x1a))) // Restore the previous memory. mstore(s, sLength) mstore(sub(s, 0x20), m1) mstore(sub(s, 0x40), m2) mstore(sub(s, 0x60), m3) } } } // File: solady/src/Milady.sol pragma solidity ^0.8.4; /* ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣷⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠿⣿⣿⣿⣿⣿⣿⣶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣠⣤⣴⣶⣾⣿⣷⣆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠻⢿⣿⣿⣿⣿⣷⣦⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⢿⣿⣿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣾⣿⣿⣿⣿⣿⡿⠿⠟⠛⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⣿⣿⣿⣆⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⡿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣿⣧⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⣿⣇⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣴⣶⣿⣿⣿⣿⣿⣿⣿⣶⣤⡀⠀⠙⠋⠀⠀⠀ ⠀⠀⠀⠀⠀⣠⣾⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣾⠟⢋⣥⣤⠀⣶⣶⣶⣦⣤⣌⣉⠛⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⣴⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠋⢁⣴⣿⣿⡿⠀⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀ ⠀⠀⠀⣼⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣤⣶⣶⣾⣿⣿⣿⣿⣷⣶⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⠁⠀⠀⢹⣿⣿⣿⣿⣿⣿⢻⣿⡄⠀⠀⠀⠀ ⠀⠀⠀⠛⠋⠀⠀⠀⠀⠀⠀⠀⢀⣤⣾⣿⠿⠛⣛⣉⣉⣀⣀⡀⠀⠀⠀⠀⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣿⣿⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⢸⣿⣿⡄⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⡿⢋⣩⣶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣶⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣦⣀⣀⣴⣿⣿⣿⣿⣿⡿⢸⣿⢿⣷⡀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣡⣄⠀⠋⠁⠀⠈⠹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⡟⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇⢸⡿⠀⠛⠃⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣧⡀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠛⠃⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⠈⠁⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⢿⣿⣿⣿⣷⣦⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣶⣶⠀⠈⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⣿⠇⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⢠⣿⣿⣿⠟⠉⠀⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣿⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⣿⣿⠁⢸⣿⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⣼⣿⡟⠁⣠⣦⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠉⣿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⡆⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⠏⠀⣸⡏⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⣿⡏⠀⠀⣿⣿⡀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠀⢹⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣇⠀⠀⠀⠙⢿⣿⣿⡿⠟⠁⠀⣸⡿⠁⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⢸⣿⠁⠀⠀⢸⣿⣇⠀⠀⠘⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⢀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣦⡀⠀⠀⠀⠈⠉⠀⠀⠀⣼⡿⠁⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠈⠁⠀⠀⠀⠀⢿⣿⡄⠀⠀⠈⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⠀⣼⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣷⣦⣄⣀⠀⠀⢀⡈⠙⠁⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢻⣿⣆⠀⠀⠀⠉⠛⠿⢿⣿⣿⠿⠛⠁⠀⠀⠀⣠⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠿⣿⣿⣷⣿⣯⣤⣶⠄⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣷⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠉⠙⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⢿⣷⣤⣀⠀⠀⠀⠀⠀⠀⠀⠺⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢻⣿⣶⣤⣤⣤⣶⣷⣤⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⡿⠿⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠶⢤⣄⣀⣀⣤⠶⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ */ library Milady { string public constant WEBSITE = "https://miladymaker.net"; address public constant CONTRACT = 0x5Af0D9827E0c53E4799BB226655A1de152A425a5; } // File: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @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() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 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`, * 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, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721AQueryable. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ 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: [ERC165](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. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * 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 initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @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) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @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) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @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. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @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 memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns 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)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @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 virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _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 Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @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 virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 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: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721AQueryable. * * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * * - `addr = address(0)` * - `startTimestamp = 0` * - `burned = false` * - `extraData = 0` * * If the `tokenId` is burned: * * - `addr = <Address of owner before token was burned>` * - `startTimestamp = <Timestamp when token was burned>` * - `burned = true` * - `extraData = <Extra data when token was burned>` * * Otherwise: * * - `addr = <Address of owner>` * - `startTimestamp = <Timestamp of start of ownership>` * - `burned = false` * - `extraData = <Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view virtual override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] calldata tokenIds) external view virtual override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view virtual override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) external view virtual override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: MiladyRave.sol pragma solidity ^0.8.4; contract MiladyRaveMaker is ERC721A, ERC721AQueryable, Ownable { using ECDSA for bytes32; uint256 public constant PRICE_UNIT = 0.001 ether; string private _tokenURI; address public signer; uint16 public maxSupply; uint16 private _miladyPriceUnits; uint16 private _publicPriceUnits; bool public paused; bool public mintLocked; bool public maxSupplyLocked; bool public tokenURILocked; constructor() ERC721A("MiladyRave", "MIR") { maxSupply = 5000; _miladyPriceUnits = _toPriceUnits(0.03 ether); _publicPriceUnits = _toPriceUnits(0.06 ether); paused = true; // Must be initialized to true. } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function tokenURI(uint256 tokenId) public view override returns (string memory) { return LibString.replace(_tokenURI, "{id}", _toString(tokenId)); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* MINTING FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function publicMint(uint256 quantity) external payable mintNotPaused requireMintable(quantity) requireExactPayment(_publicPriceUnits, quantity) { _mint(msg.sender, quantity); } function miladyMint(uint256 quantity, bytes calldata signature) external payable mintNotPaused requireMintable(quantity) requireSignature(signature) requireExactPayment(_miladyPriceUnits, quantity) { _mint(msg.sender, quantity); } function claimGiveaway(bytes calldata signature) external payable mintNotPaused requireMintable(1) requireSignature(signature) { require(_getAux(msg.sender) == 0, "Already claimed."); _setAux(msg.sender, 1); _mint(msg.sender, 1); } function hasClaimedGiveaway(address claimer) external view returns (bool) { return _getAux(claimer) != 0; } function miladyPrice() external view returns (uint256) { return _toPrice(_miladyPriceUnits); } function publicPrice() external view returns (uint256) { return _toPrice(_publicPriceUnits); } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* HELPERS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function _toPriceUnits(uint256 price) private pure returns (uint16) { unchecked { require(price % PRICE_UNIT == 0, "Price must be a multiple of PRICE_UNIT."); require((price /= PRICE_UNIT) <= type(uint16).max, "Overflow."); return uint16(price); } } function _toPrice(uint16 priceUnits) private pure returns (uint256) { return uint256(priceUnits) * PRICE_UNIT; } modifier requireMintable(uint256 quantity) { unchecked { require(mintLocked == false, "Locked."); require(_totalMinted() + quantity <= maxSupply, "Out of stock!"); } _; } modifier requireExactPayment(uint16 priceUnits, uint256 quantity) { unchecked { require(quantity <= 100, "Quantity too high."); require(msg.value == _toPrice(priceUnits) * quantity, "Wrong Ether value."); } _; } modifier requireSignature(bytes calldata signature) { require( keccak256(abi.encode(msg.sender)).toEthSignedMessageHash().recover(signature) == signer, "Invalid signature." ); _; } modifier mintNotPaused() { require(paused == false, "Paused."); _; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ADMIN FUNCTIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ function forceMint(address[] calldata to, uint256 quantity) external onlyOwner requireMintable(quantity * to.length) { unchecked { for (uint256 i; i != to.length; ++i) { _mint(to[i], quantity); } } } function selfMint(uint256 quantity) external onlyOwner requireMintable(quantity) { unchecked { uint256 miniBatchSize = 8; uint256 i = quantity % miniBatchSize; _mint(msg.sender, i); while (i != quantity) { _mint(msg.sender, miniBatchSize); i += miniBatchSize; } } } function setTokenURI(string calldata value) external onlyOwner { require(tokenURILocked == false, "Locked."); _tokenURI = value; } function setMaxSupply(uint16 value) external onlyOwner { require(maxSupplyLocked == false, "Locked."); maxSupply = value; } function setPaused(bool value) external onlyOwner { if (value == false) { require(maxSupply != 0, "Max supply not set."); require(signer != address(0), "Signer not set."); } paused = value; } function setSigner(address value) external onlyOwner { require(value != address(0), "Signer must not be the zero address."); signer = value; } function lockMint() external onlyOwner { mintLocked = true; } function lockMaxSupply() external onlyOwner { maxSupplyLocked = true; } function lockTokenURI() external onlyOwner { tokenURILocked = true; } function setMiladyPrice(uint256 value) external onlyOwner { _miladyPriceUnits = _toPriceUnits(value); } function setPublicPrice(uint256 value) external onlyOwner { _publicPriceUnits = _toPriceUnits(value); } function withdraw() external payable onlyOwner { SafeTransferLib.safeTransferETH(msg.sender, address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRICE_UNIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claimGiveaway","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"forceMint","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":"claimer","type":"address"}],"name":"hasClaimedGiveaway","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"lockMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"miladyMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"miladyPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"selfMint","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":"uint16","name":"value","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setMiladyPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"value","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"value","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"tokenURILocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604080518082018252600a8152694d696c6164795261766560b01b60208083019182528351808501909452600384526226a4a960e91b9084015281519192916200005f916002916200022b565b508051620000759060039060208401906200022b565b505060016000555062000088336200011a565b600a805461ffff60a01b191661027160a31b179055620000af666a94d74f4300006200016c565b600a805461ffff92909216600160b01b0261ffff60b01b19909216919091179055620000e266d529ae9e8600006200016c565b600a805460ff60d01b1961ffff93909316600160c01b029290921662ffffff60c01b1990921691909117600160d01b17905562000304565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600066038d7ea4c68000820615620001db5760405162461bcd60e51b815260206004820152602760248201527f5072696365206d7573742062652061206d756c7469706c65206f66205052494360448201526622afaaa724aa1760c91b60648201526084015b60405180910390fd5b61ffff66038d7ea4c6800083049250821115620002275760405162461bcd60e51b815260206004820152600960248201526827bb32b9333637bb9760b91b6044820152606401620001d2565b5090565b8280546200023990620002c7565b90600052602060002090601f0160209004810192826200025d5760008555620002a8565b82601f106200027857805160ff1916838001178555620002a8565b82800160010185558215620002a8579182015b82811115620002a85782518255916020019190600101906200028b565b50620002279291505b80821115620002275760008155600101620002b1565b600181811c90821680620002dc57607f821691505b60208210811415620002fe57634e487b7160e01b600052602260045260246000fd5b50919050565b6129f780620003146000396000f3fe60806040526004361061027d5760003560e01c80638462151c1161014f578063c6275255116100c1578063e0b6bb671161007a578063e0b6bb671461079d578063e0df5b6f146107b2578063e985e9c5146107d2578063ed435e581461081b578063f2fde38b14610836578063fca76c261461085657600080fd5b8063c6275255146106d4578063c87b56dd146106f4578063d40651ee14610714578063d5abeb0114610727578063d6d0095e1461075c578063df3c3a301461077c57600080fd5b8063a8d0466c11610113578063a8d0466c14610610578063a945bf8014610631578063ac998f4514610646578063b88d4fde14610667578063c23dc68f14610687578063c2d52560146106b457600080fd5b80638462151c146105705780638da5cb5b1461059d57806395d89b41146105bb57806399a2557a146105d0578063a22cb465146105f057600080fd5b80632db11544116101f35780635e5a9e30116101ac5780635e5a9e30146104d15780636352211e146104e65780636c19e7831461050657806370a0823114610526578063715018a6146105465780637cf8cf3f1461055b57600080fd5b80632db11544146104355780633ccfd60b1461044857806342842e0e14610450578063435644e8146104705780635bbb2177146104835780635c975abb146104b057600080fd5b8063095ea7b311610245578063095ea7b31461036e5780630d3c69b41461038e57806316c38b3c146103ae57806318160ddd146103ce578063238ac933146103f557806323b872dd1461041557600080fd5b806301ffc9a71461028257806305295695146102b757806306421c2f146102f257806306fdde0314610314578063081812fc14610336575b600080fd5b34801561028e57600080fd5b506102a261029d366004612656565b61086b565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102a26102d23660046123c3565b6001600160a01b031660009081526005602052604090205460c01c151590565b3480156102fe57600080fd5b5061031261030d3660046126c5565b6108bd565b005b34801561032057600080fd5b5061032961091a565b6040516102ae919061288d565b34801561034257600080fd5b506103566103513660046126e9565b6109ac565b6040516001600160a01b0390911681526020016102ae565b34801561037a57600080fd5b50610312610389366004612552565b6109f0565b34801561039a57600080fd5b506103126103a93660046126e9565b610a90565b3480156103ba57600080fd5b506103126103c936600461263b565b610b2d565b3480156103da57600080fd5b5060015460005403600019015b6040519081526020016102ae565b34801561040157600080fd5b50600a54610356906001600160a01b031681565b34801561042157600080fd5b50610312610430366004612411565b610bf2565b6103126104433660046126e9565b610d83565b610312610ec1565b34801561045c57600080fd5b5061031261046b366004612411565b610ed5565b61031261047e366004612702565b610ef5565b34801561048f57600080fd5b506104a361049e3660046125fa565b6110fb565b6040516102ae9190612813565b3480156104bc57600080fd5b50600a546102a290600160d01b900460ff1681565b3480156104dd57600080fd5b506103126111c6565b3480156104f257600080fd5b506103566105013660046126e9565b6111e3565b34801561051257600080fd5b506103126105213660046123c3565b6111ee565b34801561053257600080fd5b506103e76105413660046123c3565b61127a565b34801561055257600080fd5b506103126112c8565b34801561056757600080fd5b506103e76112da565b34801561057c57600080fd5b5061059061058b3660046123c3565b6112f9565b6040516102ae9190612855565b3480156105a957600080fd5b506008546001600160a01b0316610356565b3480156105c757600080fd5b50610329611408565b3480156105dc57600080fd5b506105906105eb36600461257c565b611417565b3480156105fc57600080fd5b5061031261060b366004612528565b6115a2565b34801561061c57600080fd5b50600a546102a290600160e01b900460ff1681565b34801561063d57600080fd5b506103e7611638565b34801561065257600080fd5b50600a546102a290600160e81b900460ff1681565b34801561067357600080fd5b5061031261068236600461244d565b611652565b34801561069357600080fd5b506106a76106a23660046126e9565b611696565b6040516102ae9190612909565b3480156106c057600080fd5b506103126106cf3660046126e9565b61171e565b3480156106e057600080fd5b506103126106ef3660046126e9565b61174e565b34801561070057600080fd5b5061032961070f3660046126e9565b61177e565b610312610722366004612690565b611839565b34801561073357600080fd5b50600a5461074990600160a01b900461ffff1681565b60405161ffff90911681526020016102ae565b34801561076857600080fd5b506103126107773660046125af565b6119cc565b34801561078857600080fd5b50600a546102a290600160d81b900460ff1681565b3480156107a957600080fd5b50610312611a85565b3480156107be57600080fd5b506103126107cd366004612690565b611aa2565b3480156107de57600080fd5b506102a26107ed3660046123de565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561082757600080fd5b506103e766038d7ea4c6800081565b34801561084257600080fd5b506103126108513660046123c3565b611ae0565b34801561086257600080fd5b50610312611b59565b60006301ffc9a760e01b6001600160e01b03198316148061089c57506380ac58cd60e01b6001600160e01b03198316145b806108b75750635b5e139f60e01b6001600160e01b03198316145b92915050565b6108c5611b76565b600a54600160e01b900460ff16156108f85760405162461bcd60e51b81526004016108ef906128c1565b60405180910390fd5b600a805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b60606002805461092990612944565b80601f016020809104026020016040519081016040528092919081815260200182805461095590612944565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505050905090565b60006109b782611bd0565b6109d4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109fb826111e3565b9050336001600160a01b03821614610a3457610a1781336107ed565b610a34576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a98611b76565b600a548190600160d81b900460ff1615610ac45760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610ae06000546000190190565b011115610aff5760405162461bcd60e51b81526004016108ef906128e2565b600860078316610b0f3382611c05565b838114610b2757610b203383611c05565b8101610b0f565b50505050565b610b35611b76565b80610bd457600a54600160a01b900461ffff16610b8a5760405162461bcd60e51b815260206004820152601360248201527226b0bc1039bab838363c903737ba1039b2ba1760691b60448201526064016108ef565b600a546001600160a01b0316610bd45760405162461bcd60e51b815260206004820152600f60248201526e29b4b3b732b9103737ba1039b2ba1760891b60448201526064016108ef565b600a8054911515600160d01b0260ff60d01b19909216919091179055565b6000610bfd82611cfc565b9050836001600160a01b0316816001600160a01b031614610c305760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610c7d57610c6086336107ed565b610c7d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610ca457604051633a954ecd60e21b815260040160405180910390fd5b8015610caf57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610d3a5760018401600081815260046020526040902054610d38576000548114610d385760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600a54600160d01b900460ff1615610dad5760405162461bcd60e51b81526004016108ef906128a0565b600a548190600160d81b900460ff1615610dd95760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610df56000546000190190565b011115610e145760405162461bcd60e51b81526004016108ef906128e2565b600a54600160c01b900461ffff16826064811115610e695760405162461bcd60e51b815260206004820152601260248201527128bab0b73a34ba3c903a37b7903434b3b41760711b60448201526064016108ef565b80610e7383611d65565b023414610eb75760405162461bcd60e51b81526020600482015260126024820152712bb937b7339022ba3432b9103b30b63ab29760711b60448201526064016108ef565b610b273385611c05565b610ec9611b76565b610ed33347611d7c565b565b610ef083838360405180602001604052806000815250611652565b505050565b600a54600160d01b900460ff1615610f1f5760405162461bcd60e51b81526004016108ef906128a0565b600a548390600160d81b900460ff1615610f4b5760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610f676000546000190190565b011115610f865760405162461bcd60e51b81526004016108ef906128e2565b600a5460408051336020820152859285926001600160a01b0390911691610ff99185918591610ff291015b604051602081830303815290604052805190602001206020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9190611d9c565b6001600160a01b0316146110445760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016108ef565b600a54600160b01b900461ffff168660648111156110995760405162461bcd60e51b815260206004820152601260248201527128bab0b73a34ba3c903a37b7903434b3b41760711b60448201526064016108ef565b806110a383611d65565b0234146110e75760405162461bcd60e51b81526020600482015260126024820152712bb937b7339022ba3432b9103b30b63ab29760711b60448201526064016108ef565b6110f13389611c05565b5050505050505050565b6060816000816001600160401b0381111561111857611118612995565b60405190808252806020026020018201604052801561116a57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816111365790505b50905060005b8281146111bd5761119886868381811061118c5761118c61297f565b90506020020135611696565b8282815181106111aa576111aa61297f565b6020908102919091010152600101611170565b50949350505050565b6111ce611b76565b600a805460ff60e81b1916600160e81b179055565b60006108b782611cfc565b6111f6611b76565b6001600160a01b0381166112585760405162461bcd60e51b8152602060048201526024808201527f5369676e6572206d757374206e6f7420626520746865207a65726f206164647260448201526332b9b99760e11b60648201526084016108ef565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166112a3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6112d0611b76565b610ed36000611e3e565b600a546000906112f490600160b01b900461ffff16611d65565b905090565b606060008060006113098561127a565b90506000816001600160401b0381111561132557611325612995565b60405190808252806020026020018201604052801561134e578160200160208202803683370190505b50905061137b60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b8386146113fc5761138e81611e90565b915081604001511561139f576113f4565b81516001600160a01b0316156113b457815194505b876001600160a01b0316856001600160a01b031614156113f457808387806001019850815181106113e7576113e761297f565b6020026020010181815250505b60010161137e565b50909695505050505050565b60606003805461092990612944565b606081831061143957604051631960ccad60e11b815260040160405180910390fd5b60008061144560005490565b9050600185101561145557600194505b80841115611461578093505b600061146c8761127a565b90508486101561148b5785850381811015611485578091505b5061148f565b5060005b6000816001600160401b038111156114a9576114a9612995565b6040519080825280602002602001820160405280156114d2578160200160208202803683370190505b509050816114e557935061159b92505050565b60006114f088611696565b905060008160400151611501575080515b885b8881141580156115135750848714155b1561158f5761152181611e90565b925082604001511561153257611587565b82516001600160a01b03161561154757825191505b8a6001600160a01b0316826001600160a01b03161415611587578084888060010199508151811061157a5761157a61297f565b6020026020010181815250505b600101611503565b50505092835250909150505b9392505050565b6001600160a01b0382163314156115cc5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546000906112f490600160c01b900461ffff16611d65565b61165d848484610bf2565b6001600160a01b0383163b15610b275761167984848484611ecc565b610b27576040516368d2bf6b60e11b815260040160405180910390fd5b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806116ef57506000548310155b156116fa5792915050565b61170383611e90565b90508060400151156117155792915050565b61159b83611fc3565b611726611b76565b61172f81611ff8565b600a60166101000a81548161ffff021916908361ffff16021790555050565b611756611b76565b61175f81611ff8565b600a60186101000a81548161ffff021916908361ffff16021790555050565b60606108b76009805461179090612944565b80601f01602080910402602001604051908101604052809291908181526020018280546117bc90612944565b80156118095780601f106117de57610100808354040283529160200191611809565b820191906000526020600020905b8154815290600101906020018083116117ec57829003601f168201915b5050505050604051806040016040528060048152602001637b69647d60e01b815250611834856120af565b6120f1565b600a54600160d01b900460ff16156118635760405162461bcd60e51b81526004016108ef906128a0565b600a54600190600160d81b900460ff16156118905760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff16816118ac6000546000190190565b0111156118cb5760405162461bcd60e51b81526004016108ef906128e2565b600a5460408051336020820152859285926001600160a01b03909116916118fa9185918591610ff29101610fb1565b6001600160a01b0316146119455760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016108ef565b3360009081526005602052604090205460c01c156119985760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9031b630b4b6b2b21760811b60448201526064016108ef565b33600090815260056020526040902080546001600160c01b0316600160c01b1790556119c5336001611c05565b5050505050565b6119d4611b76565b6119de8282612917565b600a54600160d81b900460ff1615611a085760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681611a246000546000190190565b011115611a435760405162461bcd60e51b81526004016108ef906128e2565b60005b8084146119c557611a7d858583818110611a6257611a6261297f565b9050602002016020810190611a7791906123c3565b84611c05565b600101611a46565b611a8d611b76565b600a805460ff60d81b1916600160d81b179055565b611aaa611b76565b600a54600160e81b900460ff1615611ad45760405162461bcd60e51b81526004016108ef906128c1565b610ef06009838361227b565b611ae8611b76565b6001600160a01b038116611b4d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ef565b611b5681611e3e565b50565b611b61611b76565b600a805460ff60e01b1916600160e01b179055565b6008546001600160a01b03163314610ed35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ef565b600081600111158015611be4575060005482105b80156108b7575050600090815260046020526040902054600160e01b161590565b60005481611c265760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611cd557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611c9d565b5081611cf357604051622e076360e81b815260040160405180910390fd5b60005550505050565b60008180600111611d4c57600054811015611d4c57600081815260046020526040902054600160e01b8116611d4a575b8061159b575060001901600081815260046020526040902054611d2c565b505b604051636f96cda160e11b815260040160405180910390fd5b60006108b766038d7ea4c6800061ffff8416612917565b60008060008084865af1611d985763b12d13eb6000526004601cfd5b5050565b600060405160208401358360408114611dbc5760418114611dd757611de3565b601b8260ff1c016020526001600160ff1b0382169150611de3565b604086013560001a6020525b507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111611e33578560005260208560403780606052602060406080600060015afa5060006060523d6060035192505b506040529392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546108b790612234565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f019033908990889088906004016127d6565b602060405180830381600087803b158015611f1b57600080fd5b505af1925050508015611f4b575060408051601f3d908101601f19168201909252611f4891810190612673565b60015b611fa6573d808015611f79576040519150601f19603f3d011682016040523d82523d6000602084013e611f7e565b606091505b508051611f9e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526108b7611ff383611cfc565b612234565b600066038d7ea4c680008206156120615760405162461bcd60e51b815260206004820152602760248201527f5072696365206d7573742062652061206d756c7469706c65206f66205052494360448201526622afaaa724aa1760c91b60648201526084016108ef565b61ffff66038d7ea4c68000830492508211156120ab5760405162461bcd60e51b815260206004820152600960248201526827bb32b9333637bb9760b91b60448201526064016108ef565b5090565b604080516080019081905280825b600183039250600a81066030018353600a9004806120da576120df565b6120bd565b50819003601f19909101908152919050565b606083518351835160208701965060208601955060208501945060206040510193508287018383116121e35760018382030160006020851061213257508388205b601f851660200360031b89515b8b51818118831c6121c15783156121795783888e201461217957808a5260019c8d019c90990198848d1061217357506121de565b5061213f565b60005b8b8101518b82015260200187811061219357612198565b61217c565b509b87019b98860198876121b457808a5260019c8d019c909901985b848d1061217357506121de565b895260019b8c019b90980197838c106121d9576121de565b61213f565b505050505b84935060206040510194508781038585030192505b808810156122135787518452602097880197909301926121f8565b5050601f196040820116830160405260208303925080835250509392505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b82805461228790612944565b90600052602060002090601f0160209004810192826122a957600085556122ef565b82601f106122c25782800160ff198235161785556122ef565b828001600101855582156122ef579182015b828111156122ef5782358255916020019190600101906122d4565b506120ab9291505b808211156120ab57600081556001016122f7565b80356001600160a01b038116811461232257600080fd5b919050565b60008083601f84011261233957600080fd5b5081356001600160401b0381111561235057600080fd5b6020830191508360208260051b850101111561236b57600080fd5b9250929050565b8035801515811461232257600080fd5b60008083601f84011261239457600080fd5b5081356001600160401b038111156123ab57600080fd5b60208301915083602082850101111561236b57600080fd5b6000602082840312156123d557600080fd5b61159b8261230b565b600080604083850312156123f157600080fd5b6123fa8361230b565b91506124086020840161230b565b90509250929050565b60008060006060848603121561242657600080fd5b61242f8461230b565b925061243d6020850161230b565b9150604084013590509250925092565b6000806000806080858703121561246357600080fd5b61246c8561230b565b935061247a6020860161230b565b92506040850135915060608501356001600160401b038082111561249d57600080fd5b818701915087601f8301126124b157600080fd5b8135818111156124c3576124c3612995565b604051601f8201601f19908116603f011681019083821181831017156124eb576124eb612995565b816040528281528a602084870101111561250457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561253b57600080fd5b6125448361230b565b915061240860208401612372565b6000806040838503121561256557600080fd5b61256e8361230b565b946020939093013593505050565b60008060006060848603121561259157600080fd5b61259a8461230b565b95602085013595506040909401359392505050565b6000806000604084860312156125c457600080fd5b83356001600160401b038111156125da57600080fd5b6125e686828701612327565b909790965060209590950135949350505050565b6000806020838503121561260d57600080fd5b82356001600160401b0381111561262357600080fd5b61262f85828601612327565b90969095509350505050565b60006020828403121561264d57600080fd5b61159b82612372565b60006020828403121561266857600080fd5b813561159b816129ab565b60006020828403121561268557600080fd5b815161159b816129ab565b600080602083850312156126a357600080fd5b82356001600160401b038111156126b957600080fd5b61262f85828601612382565b6000602082840312156126d757600080fd5b813561ffff8116811461159b57600080fd5b6000602082840312156126fb57600080fd5b5035919050565b60008060006040848603121561271757600080fd5b8335925060208401356001600160401b0381111561273457600080fd5b61274086828701612382565b9497909650939450505050565b6000815180845260005b8181101561277357602081850181015186830182015201612757565b81811115612785576000602083870101525b50601f01601f19169290920160200192915050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128099083018461274d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113fc5761284283855161279a565b928401926080929092019160010161282f565b6020808252825182820181905260009190848201906040850190845b818110156113fc57835183529284019291840191600101612871565b60208152600061159b602083018461274d565b6020808252600790820152662830bab9b2b21760c91b604082015260600190565b6020808252600790820152662637b1b5b2b21760c91b604082015260600190565b6020808252600d908201526c4f7574206f662073746f636b2160981b604082015260600190565b608081016108b7828461279a565b600081600019048311821515161561293f57634e487b7160e01b600052601160045260246000fd5b500290565b600181811c9082168061295857607f821691505b6020821081141561297957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b5657600080fdfea264697066735822122091802568b431d7df3e85c1b5b7eabc8f33ea2b8422dbc503174b375c16c8bdf264736f6c63430008070033
Deployed Bytecode
0x60806040526004361061027d5760003560e01c80638462151c1161014f578063c6275255116100c1578063e0b6bb671161007a578063e0b6bb671461079d578063e0df5b6f146107b2578063e985e9c5146107d2578063ed435e581461081b578063f2fde38b14610836578063fca76c261461085657600080fd5b8063c6275255146106d4578063c87b56dd146106f4578063d40651ee14610714578063d5abeb0114610727578063d6d0095e1461075c578063df3c3a301461077c57600080fd5b8063a8d0466c11610113578063a8d0466c14610610578063a945bf8014610631578063ac998f4514610646578063b88d4fde14610667578063c23dc68f14610687578063c2d52560146106b457600080fd5b80638462151c146105705780638da5cb5b1461059d57806395d89b41146105bb57806399a2557a146105d0578063a22cb465146105f057600080fd5b80632db11544116101f35780635e5a9e30116101ac5780635e5a9e30146104d15780636352211e146104e65780636c19e7831461050657806370a0823114610526578063715018a6146105465780637cf8cf3f1461055b57600080fd5b80632db11544146104355780633ccfd60b1461044857806342842e0e14610450578063435644e8146104705780635bbb2177146104835780635c975abb146104b057600080fd5b8063095ea7b311610245578063095ea7b31461036e5780630d3c69b41461038e57806316c38b3c146103ae57806318160ddd146103ce578063238ac933146103f557806323b872dd1461041557600080fd5b806301ffc9a71461028257806305295695146102b757806306421c2f146102f257806306fdde0314610314578063081812fc14610336575b600080fd5b34801561028e57600080fd5b506102a261029d366004612656565b61086b565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102a26102d23660046123c3565b6001600160a01b031660009081526005602052604090205460c01c151590565b3480156102fe57600080fd5b5061031261030d3660046126c5565b6108bd565b005b34801561032057600080fd5b5061032961091a565b6040516102ae919061288d565b34801561034257600080fd5b506103566103513660046126e9565b6109ac565b6040516001600160a01b0390911681526020016102ae565b34801561037a57600080fd5b50610312610389366004612552565b6109f0565b34801561039a57600080fd5b506103126103a93660046126e9565b610a90565b3480156103ba57600080fd5b506103126103c936600461263b565b610b2d565b3480156103da57600080fd5b5060015460005403600019015b6040519081526020016102ae565b34801561040157600080fd5b50600a54610356906001600160a01b031681565b34801561042157600080fd5b50610312610430366004612411565b610bf2565b6103126104433660046126e9565b610d83565b610312610ec1565b34801561045c57600080fd5b5061031261046b366004612411565b610ed5565b61031261047e366004612702565b610ef5565b34801561048f57600080fd5b506104a361049e3660046125fa565b6110fb565b6040516102ae9190612813565b3480156104bc57600080fd5b50600a546102a290600160d01b900460ff1681565b3480156104dd57600080fd5b506103126111c6565b3480156104f257600080fd5b506103566105013660046126e9565b6111e3565b34801561051257600080fd5b506103126105213660046123c3565b6111ee565b34801561053257600080fd5b506103e76105413660046123c3565b61127a565b34801561055257600080fd5b506103126112c8565b34801561056757600080fd5b506103e76112da565b34801561057c57600080fd5b5061059061058b3660046123c3565b6112f9565b6040516102ae9190612855565b3480156105a957600080fd5b506008546001600160a01b0316610356565b3480156105c757600080fd5b50610329611408565b3480156105dc57600080fd5b506105906105eb36600461257c565b611417565b3480156105fc57600080fd5b5061031261060b366004612528565b6115a2565b34801561061c57600080fd5b50600a546102a290600160e01b900460ff1681565b34801561063d57600080fd5b506103e7611638565b34801561065257600080fd5b50600a546102a290600160e81b900460ff1681565b34801561067357600080fd5b5061031261068236600461244d565b611652565b34801561069357600080fd5b506106a76106a23660046126e9565b611696565b6040516102ae9190612909565b3480156106c057600080fd5b506103126106cf3660046126e9565b61171e565b3480156106e057600080fd5b506103126106ef3660046126e9565b61174e565b34801561070057600080fd5b5061032961070f3660046126e9565b61177e565b610312610722366004612690565b611839565b34801561073357600080fd5b50600a5461074990600160a01b900461ffff1681565b60405161ffff90911681526020016102ae565b34801561076857600080fd5b506103126107773660046125af565b6119cc565b34801561078857600080fd5b50600a546102a290600160d81b900460ff1681565b3480156107a957600080fd5b50610312611a85565b3480156107be57600080fd5b506103126107cd366004612690565b611aa2565b3480156107de57600080fd5b506102a26107ed3660046123de565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561082757600080fd5b506103e766038d7ea4c6800081565b34801561084257600080fd5b506103126108513660046123c3565b611ae0565b34801561086257600080fd5b50610312611b59565b60006301ffc9a760e01b6001600160e01b03198316148061089c57506380ac58cd60e01b6001600160e01b03198316145b806108b75750635b5e139f60e01b6001600160e01b03198316145b92915050565b6108c5611b76565b600a54600160e01b900460ff16156108f85760405162461bcd60e51b81526004016108ef906128c1565b60405180910390fd5b600a805461ffff909216600160a01b0261ffff60a01b19909216919091179055565b60606002805461092990612944565b80601f016020809104026020016040519081016040528092919081815260200182805461095590612944565b80156109a25780601f10610977576101008083540402835291602001916109a2565b820191906000526020600020905b81548152906001019060200180831161098557829003601f168201915b5050505050905090565b60006109b782611bd0565b6109d4576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109fb826111e3565b9050336001600160a01b03821614610a3457610a1781336107ed565b610a34576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b610a98611b76565b600a548190600160d81b900460ff1615610ac45760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610ae06000546000190190565b011115610aff5760405162461bcd60e51b81526004016108ef906128e2565b600860078316610b0f3382611c05565b838114610b2757610b203383611c05565b8101610b0f565b50505050565b610b35611b76565b80610bd457600a54600160a01b900461ffff16610b8a5760405162461bcd60e51b815260206004820152601360248201527226b0bc1039bab838363c903737ba1039b2ba1760691b60448201526064016108ef565b600a546001600160a01b0316610bd45760405162461bcd60e51b815260206004820152600f60248201526e29b4b3b732b9103737ba1039b2ba1760891b60448201526064016108ef565b600a8054911515600160d01b0260ff60d01b19909216919091179055565b6000610bfd82611cfc565b9050836001600160a01b0316816001600160a01b031614610c305760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b03881690911417610c7d57610c6086336107ed565b610c7d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610ca457604051633a954ecd60e21b815260040160405180910390fd5b8015610caf57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040902055600160e11b8316610d3a5760018401600081815260046020526040902054610d38576000548114610d385760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050505050565b600a54600160d01b900460ff1615610dad5760405162461bcd60e51b81526004016108ef906128a0565b600a548190600160d81b900460ff1615610dd95760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610df56000546000190190565b011115610e145760405162461bcd60e51b81526004016108ef906128e2565b600a54600160c01b900461ffff16826064811115610e695760405162461bcd60e51b815260206004820152601260248201527128bab0b73a34ba3c903a37b7903434b3b41760711b60448201526064016108ef565b80610e7383611d65565b023414610eb75760405162461bcd60e51b81526020600482015260126024820152712bb937b7339022ba3432b9103b30b63ab29760711b60448201526064016108ef565b610b273385611c05565b610ec9611b76565b610ed33347611d7c565b565b610ef083838360405180602001604052806000815250611652565b505050565b600a54600160d01b900460ff1615610f1f5760405162461bcd60e51b81526004016108ef906128a0565b600a548390600160d81b900460ff1615610f4b5760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681610f676000546000190190565b011115610f865760405162461bcd60e51b81526004016108ef906128e2565b600a5460408051336020820152859285926001600160a01b0390911691610ff99185918591610ff291015b604051602081830303815290604052805190602001206020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b9190611d9c565b6001600160a01b0316146110445760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016108ef565b600a54600160b01b900461ffff168660648111156110995760405162461bcd60e51b815260206004820152601260248201527128bab0b73a34ba3c903a37b7903434b3b41760711b60448201526064016108ef565b806110a383611d65565b0234146110e75760405162461bcd60e51b81526020600482015260126024820152712bb937b7339022ba3432b9103b30b63ab29760711b60448201526064016108ef565b6110f13389611c05565b5050505050505050565b6060816000816001600160401b0381111561111857611118612995565b60405190808252806020026020018201604052801561116a57816020015b6040805160808101825260008082526020808301829052928201819052606082015282526000199092019101816111365790505b50905060005b8281146111bd5761119886868381811061118c5761118c61297f565b90506020020135611696565b8282815181106111aa576111aa61297f565b6020908102919091010152600101611170565b50949350505050565b6111ce611b76565b600a805460ff60e81b1916600160e81b179055565b60006108b782611cfc565b6111f6611b76565b6001600160a01b0381166112585760405162461bcd60e51b8152602060048201526024808201527f5369676e6572206d757374206e6f7420626520746865207a65726f206164647260448201526332b9b99760e11b60648201526084016108ef565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166112a3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6112d0611b76565b610ed36000611e3e565b600a546000906112f490600160b01b900461ffff16611d65565b905090565b606060008060006113098561127a565b90506000816001600160401b0381111561132557611325612995565b60405190808252806020026020018201604052801561134e578160200160208202803683370190505b50905061137b60408051608081018252600080825260208201819052918101829052606081019190915290565b60015b8386146113fc5761138e81611e90565b915081604001511561139f576113f4565b81516001600160a01b0316156113b457815194505b876001600160a01b0316856001600160a01b031614156113f457808387806001019850815181106113e7576113e761297f565b6020026020010181815250505b60010161137e565b50909695505050505050565b60606003805461092990612944565b606081831061143957604051631960ccad60e11b815260040160405180910390fd5b60008061144560005490565b9050600185101561145557600194505b80841115611461578093505b600061146c8761127a565b90508486101561148b5785850381811015611485578091505b5061148f565b5060005b6000816001600160401b038111156114a9576114a9612995565b6040519080825280602002602001820160405280156114d2578160200160208202803683370190505b509050816114e557935061159b92505050565b60006114f088611696565b905060008160400151611501575080515b885b8881141580156115135750848714155b1561158f5761152181611e90565b925082604001511561153257611587565b82516001600160a01b03161561154757825191505b8a6001600160a01b0316826001600160a01b03161415611587578084888060010199508151811061157a5761157a61297f565b6020026020010181815250505b600101611503565b50505092835250909150505b9392505050565b6001600160a01b0382163314156115cc5760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546000906112f490600160c01b900461ffff16611d65565b61165d848484610bf2565b6001600160a01b0383163b15610b275761167984848484611ecc565b610b27576040516368d2bf6b60e11b815260040160405180910390fd5b60408051608081018252600080825260208201819052918101829052606081019190915260408051608081018252600080825260208201819052918101829052606081019190915260018310806116ef57506000548310155b156116fa5792915050565b61170383611e90565b90508060400151156117155792915050565b61159b83611fc3565b611726611b76565b61172f81611ff8565b600a60166101000a81548161ffff021916908361ffff16021790555050565b611756611b76565b61175f81611ff8565b600a60186101000a81548161ffff021916908361ffff16021790555050565b60606108b76009805461179090612944565b80601f01602080910402602001604051908101604052809291908181526020018280546117bc90612944565b80156118095780601f106117de57610100808354040283529160200191611809565b820191906000526020600020905b8154815290600101906020018083116117ec57829003601f168201915b5050505050604051806040016040528060048152602001637b69647d60e01b815250611834856120af565b6120f1565b600a54600160d01b900460ff16156118635760405162461bcd60e51b81526004016108ef906128a0565b600a54600190600160d81b900460ff16156118905760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff16816118ac6000546000190190565b0111156118cb5760405162461bcd60e51b81526004016108ef906128e2565b600a5460408051336020820152859285926001600160a01b03909116916118fa9185918591610ff29101610fb1565b6001600160a01b0316146119455760405162461bcd60e51b815260206004820152601260248201527124b73b30b634b21039b4b3b730ba3ab9329760711b60448201526064016108ef565b3360009081526005602052604090205460c01c156119985760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9031b630b4b6b2b21760811b60448201526064016108ef565b33600090815260056020526040902080546001600160c01b0316600160c01b1790556119c5336001611c05565b5050505050565b6119d4611b76565b6119de8282612917565b600a54600160d81b900460ff1615611a085760405162461bcd60e51b81526004016108ef906128c1565b600a54600160a01b900461ffff1681611a246000546000190190565b011115611a435760405162461bcd60e51b81526004016108ef906128e2565b60005b8084146119c557611a7d858583818110611a6257611a6261297f565b9050602002016020810190611a7791906123c3565b84611c05565b600101611a46565b611a8d611b76565b600a805460ff60d81b1916600160d81b179055565b611aaa611b76565b600a54600160e81b900460ff1615611ad45760405162461bcd60e51b81526004016108ef906128c1565b610ef06009838361227b565b611ae8611b76565b6001600160a01b038116611b4d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108ef565b611b5681611e3e565b50565b611b61611b76565b600a805460ff60e01b1916600160e01b179055565b6008546001600160a01b03163314610ed35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ef565b600081600111158015611be4575060005482105b80156108b7575050600090815260046020526040902054600160e01b161590565b60005481611c265760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611cd557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600101611c9d565b5081611cf357604051622e076360e81b815260040160405180910390fd5b60005550505050565b60008180600111611d4c57600054811015611d4c57600081815260046020526040902054600160e01b8116611d4a575b8061159b575060001901600081815260046020526040902054611d2c565b505b604051636f96cda160e11b815260040160405180910390fd5b60006108b766038d7ea4c6800061ffff8416612917565b60008060008084865af1611d985763b12d13eb6000526004601cfd5b5050565b600060405160208401358360408114611dbc5760418114611dd757611de3565b601b8260ff1c016020526001600160ff1b0382169150611de3565b604086013560001a6020525b507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111611e33578560005260208560403780606052602060406080600060015afa5060006060523d6060035192505b506040529392505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160808101825260008082526020820181905291810182905260608101919091526000828152600460205260409020546108b790612234565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a0290611f019033908990889088906004016127d6565b602060405180830381600087803b158015611f1b57600080fd5b505af1925050508015611f4b575060408051601f3d908101601f19168201909252611f4891810190612673565b60015b611fa6573d808015611f79576040519150601f19603f3d011682016040523d82523d6000602084013e611f7e565b606091505b508051611f9e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6040805160808101825260008082526020820181905291810182905260608101919091526108b7611ff383611cfc565b612234565b600066038d7ea4c680008206156120615760405162461bcd60e51b815260206004820152602760248201527f5072696365206d7573742062652061206d756c7469706c65206f66205052494360448201526622afaaa724aa1760c91b60648201526084016108ef565b61ffff66038d7ea4c68000830492508211156120ab5760405162461bcd60e51b815260206004820152600960248201526827bb32b9333637bb9760b91b60448201526064016108ef565b5090565b604080516080019081905280825b600183039250600a81066030018353600a9004806120da576120df565b6120bd565b50819003601f19909101908152919050565b606083518351835160208701965060208601955060208501945060206040510193508287018383116121e35760018382030160006020851061213257508388205b601f851660200360031b89515b8b51818118831c6121c15783156121795783888e201461217957808a5260019c8d019c90990198848d1061217357506121de565b5061213f565b60005b8b8101518b82015260200187811061219357612198565b61217c565b509b87019b98860198876121b457808a5260019c8d019c909901985b848d1061217357506121de565b895260019b8c019b90980197838c106121d9576121de565b61213f565b505050505b84935060206040510194508781038585030192505b808810156122135787518452602097880197909301926121f8565b5050601f196040820116830160405260208303925080835250509392505050565b604080516080810182526001600160a01b038316815260a083901c6001600160401b03166020820152600160e01b831615159181019190915260e89190911c606082015290565b82805461228790612944565b90600052602060002090601f0160209004810192826122a957600085556122ef565b82601f106122c25782800160ff198235161785556122ef565b828001600101855582156122ef579182015b828111156122ef5782358255916020019190600101906122d4565b506120ab9291505b808211156120ab57600081556001016122f7565b80356001600160a01b038116811461232257600080fd5b919050565b60008083601f84011261233957600080fd5b5081356001600160401b0381111561235057600080fd5b6020830191508360208260051b850101111561236b57600080fd5b9250929050565b8035801515811461232257600080fd5b60008083601f84011261239457600080fd5b5081356001600160401b038111156123ab57600080fd5b60208301915083602082850101111561236b57600080fd5b6000602082840312156123d557600080fd5b61159b8261230b565b600080604083850312156123f157600080fd5b6123fa8361230b565b91506124086020840161230b565b90509250929050565b60008060006060848603121561242657600080fd5b61242f8461230b565b925061243d6020850161230b565b9150604084013590509250925092565b6000806000806080858703121561246357600080fd5b61246c8561230b565b935061247a6020860161230b565b92506040850135915060608501356001600160401b038082111561249d57600080fd5b818701915087601f8301126124b157600080fd5b8135818111156124c3576124c3612995565b604051601f8201601f19908116603f011681019083821181831017156124eb576124eb612995565b816040528281528a602084870101111561250457600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561253b57600080fd5b6125448361230b565b915061240860208401612372565b6000806040838503121561256557600080fd5b61256e8361230b565b946020939093013593505050565b60008060006060848603121561259157600080fd5b61259a8461230b565b95602085013595506040909401359392505050565b6000806000604084860312156125c457600080fd5b83356001600160401b038111156125da57600080fd5b6125e686828701612327565b909790965060209590950135949350505050565b6000806020838503121561260d57600080fd5b82356001600160401b0381111561262357600080fd5b61262f85828601612327565b90969095509350505050565b60006020828403121561264d57600080fd5b61159b82612372565b60006020828403121561266857600080fd5b813561159b816129ab565b60006020828403121561268557600080fd5b815161159b816129ab565b600080602083850312156126a357600080fd5b82356001600160401b038111156126b957600080fd5b61262f85828601612382565b6000602082840312156126d757600080fd5b813561ffff8116811461159b57600080fd5b6000602082840312156126fb57600080fd5b5035919050565b60008060006040848603121561271757600080fd5b8335925060208401356001600160401b0381111561273457600080fd5b61274086828701612382565b9497909650939450505050565b6000815180845260005b8181101561277357602081850181015186830182015201612757565b81811115612785576000602083870101525b50601f01601f19169290920160200192915050565b80516001600160a01b031682526020808201516001600160401b03169083015260408082015115159083015260609081015162ffffff16910152565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906128099083018461274d565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156113fc5761284283855161279a565b928401926080929092019160010161282f565b6020808252825182820181905260009190848201906040850190845b818110156113fc57835183529284019291840191600101612871565b60208152600061159b602083018461274d565b6020808252600790820152662830bab9b2b21760c91b604082015260600190565b6020808252600790820152662637b1b5b2b21760c91b604082015260600190565b6020808252600d908201526c4f7574206f662073746f636b2160981b604082015260600190565b608081016108b7828461279a565b600081600019048311821515161561293f57634e487b7160e01b600052601160045260246000fd5b500290565b600181811c9082168061295857607f821691505b6020821081141561297957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611b5657600080fdfea264697066735822122091802568b431d7df3e85c1b5b7eabc8f33ea2b8422dbc503174b375c16c8bdf264736f6c63430008070033
Deployed Bytecode Sourcemap
96454:6510:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53949:639;;;;;;;;;;-1:-1:-1;53949:639:0;;;;;:::i;:::-;;:::i;:::-;;;10332:14:1;;10325:22;10307:41;;10295:2;10280:18;53949:639:0;;;;;;;;98621:121;;;;;;;;;;-1:-1:-1;98621:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;52761:25:0;98689:4;52761:25;;;:18;:25;;;;;;46319:3;52761:40;98713:21;;;98621:121;101728:146;;;;;;;;;;-1:-1:-1;101728:146:0;;;;;:::i;:::-;;:::i;:::-;;54851:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61334:218::-;;;;;;;;;;-1:-1:-1;61334:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;8266:32:1;;;8248:51;;8236:2;8221:18;61334:218:0;8102:203:1;60775:400:0;;;;;;;;;;-1:-1:-1;60775:400:0;;;;;:::i;:::-;;:::i;101172:387::-;;;;;;;;;;-1:-1:-1;101172:387:0;;;;;:::i;:::-;;:::i;101882:249::-;;;;;;;;;;-1:-1:-1;101882:249:0;;;;;:::i;:::-;;:::i;50602:323::-;;;;;;;;;;-1:-1:-1;97265:1:0;50876:12;50663:7;50860:13;:28;-1:-1:-1;;50860:46:0;50602:323;;;16201:25:1;;;16189:2;16174:18;50602:323:0;16055:177:1;96646:21:0;;;;;;;;;;-1:-1:-1;96646:21:0;;;;-1:-1:-1;;;;;96646:21:0;;;65041:2817;;;;;;;;;;-1:-1:-1;65041:2817:0;;;;;:::i;:::-;;:::i;97739:240::-;;;;;;:::i;:::-;;:::i;102829:132::-;;;:::i;67954:185::-;;;;;;;;;;-1:-1:-1;67954:185:0;;;;;:::i;:::-;;:::i;97987:303::-;;;;;;:::i;:::-;;:::i;88008:528::-;;;;;;;;;;-1:-1:-1;88008:528:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;96790:18::-;;;;;;;;;;-1:-1:-1;96790:18:0;;;;-1:-1:-1;;;96790:18:0;;;;;;102488:83;;;;;;;;;;;;;:::i;56244:152::-;;;;;;;;;;-1:-1:-1;56244:152:0;;;;;:::i;:::-;;:::i;102139:165::-;;;;;;;;;;-1:-1:-1;102139:165:0;;;;;:::i;:::-;;:::i;51786:233::-;;;;;;;;;;-1:-1:-1;51786:233:0;;;;;:::i;:::-;;:::i;95567:103::-;;;;;;;;;;;;;:::i;98750:108::-;;;;;;;;;;;;;:::i;91884:900::-;;;;;;;;;;-1:-1:-1;91884:900:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;94919:87::-;;;;;;;;;;-1:-1:-1;94992:6:0;;-1:-1:-1;;;;;94992:6:0;94919:87;;55027:104;;;;;;;;;;;;;:::i;88924:2513::-;;;;;;;;;;-1:-1:-1;88924:2513:0;;;;;:::i;:::-;;:::i;61892:308::-;;;;;;;;;;-1:-1:-1;61892:308:0;;;;;:::i;:::-;;:::i;96848:27::-;;;;;;;;;;-1:-1:-1;96848:27:0;;;;-1:-1:-1;;;96848:27:0;;;;;;98866:108;;;;;;;;;;;;;:::i;96884:26::-;;;;;;;;;;-1:-1:-1;96884:26:0;;;;-1:-1:-1;;;96884:26:0;;;;;;68737:399;;;;;;;;;;-1:-1:-1;68737:399:0;;;;;:::i;:::-;;:::i;87421:428::-;;;;;;;;;;-1:-1:-1;87421:428:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;102579:117::-;;;;;;;;;;-1:-1:-1;102579:117:0;;;;;:::i;:::-;;:::i;102704:::-;;;;;;;;;;-1:-1:-1;102704:117:0;;;;;:::i;:::-;;:::i;97282:162::-;;;;;;;;;;-1:-1:-1;97282:162:0;;;;;:::i;:::-;;:::i;98298:315::-;;;;;;:::i;:::-;;:::i;96676:23::-;;;;;;;;;;-1:-1:-1;96676:23:0;;;;-1:-1:-1;;;96676:23:0;;;;;;;;;16036:6:1;16024:19;;;16006:38;;15994:2;15979:18;96676:23:0;15862:188:1;100867:297:0;;;;;;;;;;-1:-1:-1;100867:297:0;;;;;:::i;:::-;;:::i;96817:22::-;;;;;;;;;;-1:-1:-1;96817:22:0;;;;-1:-1:-1;;;96817:22:0;;;;;;102312:75;;;;;;;;;;;;;:::i;101567:153::-;;;;;;;;;;-1:-1:-1;101567:153:0;;;;;:::i;:::-;;:::i;62357:164::-;;;;;;;;;;-1:-1:-1;62357:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;62478:25:0;;;62454:4;62478:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;62357:164;96556:48;;;;;;;;;;;;96593:11;96556:48;;95825:201;;;;;;;;;;-1:-1:-1;95825:201:0;;;;;:::i;:::-;;:::i;102395:85::-;;;;;;;;;;;;;:::i;53949:639::-;54034:4;-1:-1:-1;;;;;;;;;54358:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;54435:25:0;;;54358:102;:179;;;-1:-1:-1;;;;;;;;;;54512:25:0;;;54358:179;54338:199;53949:639;-1:-1:-1;;53949:639:0:o;101728:146::-;94805:13;:11;:13::i;:::-;101802:15:::1;::::0;-1:-1:-1;;;101802:15:0;::::1;;;:24;101794:44;;;;-1:-1:-1::0;;;101794:44:0::1;;;;;;;:::i;:::-;;;;;;;;;101849:9;:17:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;101849:17:0::1;-1:-1:-1::0;;;;101849:17:0;;::::1;::::0;;;::::1;::::0;;101728:146::o;54851:100::-;54905:13;54938:5;54931:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54851:100;:::o;61334:218::-;61410:7;61435:16;61443:7;61435;:16::i;:::-;61430:64;;61460:34;;-1:-1:-1;;;61460:34:0;;;;;;;;;;;61430:64;-1:-1:-1;61514:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;61514:30:0;;61334:218::o;60775:400::-;60856:13;60872:16;60880:7;60872;:16::i;:::-;60856:32;-1:-1:-1;84632:10:0;-1:-1:-1;;;;;60905:28:0;;;60901:175;;60953:44;60970:5;84632:10;62357:164;:::i;60953:44::-;60948:128;;61025:35;;-1:-1:-1;;;61025:35:0;;;;;;;;;;;60948:128;61088:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;61088:35:0;-1:-1:-1;;;;;61088:35:0;;;;;;;;;61139:28;;61088:24;;61139:28;;;;;;;60845:330;60775:400;;:::o;101172:387::-;94805:13;:11;:13::i;:::-;99809:10:::1;::::0;101243:8;;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;101313:1:::2;101341:24:::0;;;101380:20:::2;101386:10;101341:24:::0;101380:5:::2;:20::i;:::-;101427:8;101422:1;:13;101415:126;;101456:32;101462:10;101474:13;101456:5;:32::i;:::-;101507:18:::0;::::2;101415:126;;;101264:288;;94829:1:::1;101172:387:::0;:::o;101882:249::-;94805:13;:11;:13::i;:::-;101947:14;101943:156:::1;;101986:9;::::0;-1:-1:-1;;;101986:9:0;::::1;;;101978:46;;;::::0;-1:-1:-1;;;101978:46:0;;11539:2:1;101978:46:0::1;::::0;::::1;11521:21:1::0;11578:2;11558:18;;;11551:30;-1:-1:-1;;;11597:18:1;;;11590:49;11656:18;;101978:46:0::1;11337:343:1::0;101978:46:0::1;102047:6;::::0;-1:-1:-1;;;;;102047:6:0::1;102039:48;;;::::0;-1:-1:-1;;;102039:48:0;;15449:2:1;102039:48:0::1;::::0;::::1;15431:21:1::0;15488:2;15468:18;;;15461:30;-1:-1:-1;;;15507:18:1;;;15500:45;15562:18;;102039:48:0::1;15247:339:1::0;102039:48:0::1;102109:6;:14:::0;;;::::1;;-1:-1:-1::0;;;102109:14:0::1;-1:-1:-1::0;;;;102109:14:0;;::::1;::::0;;;::::1;::::0;;101882:249::o;65041:2817::-;65175:27;65205;65224:7;65205:18;:27::i;:::-;65175:57;;65290:4;-1:-1:-1;;;;;65249:45:0;65265:19;-1:-1:-1;;;;;65249:45:0;;65245:86;;65303:28;;-1:-1:-1;;;65303:28:0;;;;;;;;;;;65245:86;65345:27;64155:24;;;:15;:24;;;;;64377:26;;84632:10;63780:30;;;-1:-1:-1;;;;;63473:28:0;;63758:20;;;63755:56;65531:180;;65624:43;65641:4;84632:10;62357:164;:::i;65624:43::-;65619:92;;65676:35;;-1:-1:-1;;;65676:35:0;;;;;;;;;;;65619:92;-1:-1:-1;;;;;65728:16:0;;65724:52;;65753:23;;-1:-1:-1;;;65753:23:0;;;;;;;;;;;65724:52;65925:15;65922:160;;;66065:1;66044:19;66037:30;65922:160;-1:-1:-1;;;;;66462:24:0;;;;;;;:18;:24;;;;;;66460:26;;-1:-1:-1;;66460:26:0;;;66531:22;;;;;;;;;66529:24;;-1:-1:-1;66529:24:0;;;59633:11;59608:23;59604:41;59591:63;-1:-1:-1;;;59591:63:0;66824:26;;;;:17;:26;;;;;:175;-1:-1:-1;;;67119:47:0;;67115:627;;67224:1;67214:11;;67192:19;67347:30;;;:17;:30;;;;;;67343:384;;67485:13;;67470:11;:28;67466:242;;67632:30;;;;:17;:30;;;;;:52;;;67466:242;67173:569;67115:627;67789:7;67785:2;-1:-1:-1;;;;;67770:27:0;67779:4;-1:-1:-1;;;;;67770:27:0;;;;;;;;;;;65164:2694;;;65041:2817;;;:::o;97739:240::-;100525:6;;-1:-1:-1;;;100525:6:0;;;;:15;100517:35;;;;-1:-1:-1;;;100517:35:0;;;;;;;:::i;:::-;99809:10:::1;::::0;97860:8;;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;97899:17:::2;::::0;-1:-1:-1;;;97899:17:0;::::2;;;97918:8:::0;100080:3:::2;100068:15:::0;::::2;;100060:46;;;::::0;-1:-1:-1;;;100060:46:0;;10785:2:1;100060:46:0::2;::::0;::::2;10767:21:1::0;10824:2;10804:18;;;10797:30;-1:-1:-1;;;10843:18:1;;;10836:48;10901:18;;100060:46:0::2;10583:342:1::0;100060:46:0::2;100165:8;100142:20;100151:10;100142:8;:20::i;:::-;:31;100129:9;:44;100121:75;;;::::0;-1:-1:-1;;;100121:75:0;;13380:2:1;100121:75:0::2;::::0;::::2;13362:21:1::0;13419:2;13399:18;;;13392:30;-1:-1:-1;;;13438:18:1;;;13431:48;13496:18;;100121:75:0::2;13178:342:1::0;100121:75:0::2;97944:27:::3;97950:10;97962:8;97944:5;:27::i;102829:132::-:0;94805:13;:11;:13::i;:::-;102887:66:::1;102919:10;102931:21;102887:31;:66::i;:::-;102829:132::o:0;67954:185::-;68092:39;68109:4;68115:2;68119:7;68092:39;;;;;;;;;;;;:16;:39::i;:::-;67954:185;;;:::o;97987:303::-;100525:6;;-1:-1:-1;;;100525:6:0;;;;:15;100517:35;;;;-1:-1:-1;;;100517:35:0;;;;;;;:::i;:::-;99809:10:::1;::::0;98134:8;;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;100401:6:::2;::::0;100330:22:::2;::::0;;100341:10:::2;100330:22;::::0;::::2;8248:51:1::0;98170:9:0;;;;-1:-1:-1;;;;;100401:6:0;;::::2;::::0;100320:77:::2;::::0;98170:9;;;;100320:58:::2;::::0;8221:18:1;100330:22:0::2;;;;;;;;;;;;;100320:33;;;;;;21470:4:::0;21463:18;21508:50;21356:14;21495:64;21634:4;21628;21618:21;;21287:370;100320:58:::2;:66:::0;:77;:66:::2;:77::i;:::-;-1:-1:-1::0;;;;;100320:87:0::2;;100298:155;;;::::0;-1:-1:-1;;;100298:155:0;;14760:2:1;100298:155:0::2;::::0;::::2;14742:21:1::0;14799:2;14779:18;;;14772:30;-1:-1:-1;;;14818:18:1;;;14811:48;14876:18;;100298:155:0::2;14558:342:1::0;100298:155:0::2;98210:17:::3;::::0;-1:-1:-1;;;98210:17:0;::::3;;;98229:8:::0;100080:3:::3;100068:15:::0;::::3;;100060:46;;;::::0;-1:-1:-1;;;100060:46:0;;10785:2:1;100060:46:0::3;::::0;::::3;10767:21:1::0;10824:2;10804:18;;;10797:30;-1:-1:-1;;;10843:18:1;;;10836:48;10901:18;;100060:46:0::3;10583:342:1::0;100060:46:0::3;100165:8;100142:20;100151:10;100142:8;:20::i;:::-;:31;100129:9;:44;100121:75;;;::::0;-1:-1:-1;;;100121:75:0;;13380:2:1;100121:75:0::3;::::0;::::3;13362:21:1::0;13419:2;13399:18;;;13392:30;-1:-1:-1;;;13438:18:1;;;13431:48;13496:18;;100121:75:0::3;13178:342:1::0;100121:75:0::3;98255:27:::4;98261:10;98273:8;98255:5;:27::i;:::-;100464:1:::3;;99941::::2;;100563::::1;97987:303:::0;;;:::o;88008:528::-;88152:23;88243:8;88218:22;88243:8;-1:-1:-1;;;;;88310:36:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;88310:36:0;;-1:-1:-1;;88310:36:0;;;;;;;;;;;;88273:73;;88366:9;88361:125;88382:14;88377:1;:19;88361:125;;88438:32;88458:8;;88467:1;88458:11;;;;;;;:::i;:::-;;;;;;;88438:19;:32::i;:::-;88422:10;88433:1;88422:13;;;;;;;;:::i;:::-;;;;;;;;;;:48;88398:3;;88361:125;;;-1:-1:-1;88507:10:0;88008:528;-1:-1:-1;;;;88008:528:0:o;102488:83::-;94805:13;:11;:13::i;:::-;102542:14:::1;:21:::0;;-1:-1:-1;;;;102542:21:0::1;-1:-1:-1::0;;;102542:21:0::1;::::0;;102488:83::o;56244:152::-;56316:7;56359:27;56378:7;56359:18;:27::i;102139:165::-;94805:13;:11;:13::i;:::-;-1:-1:-1;;;;;102211:19:0;::::1;102203:68;;;::::0;-1:-1:-1;;;102203:68:0;;12630:2:1;102203:68:0::1;::::0;::::1;12612:21:1::0;12669:2;12649:18;;;12642:30;12708:34;12688:18;;;12681:62;-1:-1:-1;;;12759:18:1;;;12752:34;12803:19;;102203:68:0::1;12428:400:1::0;102203:68:0::1;102282:6;:14:::0;;-1:-1:-1;;;;;;102282:14:0::1;-1:-1:-1::0;;;;;102282:14:0;;;::::1;::::0;;;::::1;::::0;;102139:165::o;51786:233::-;51858:7;-1:-1:-1;;;;;51882:19:0;;51878:60;;51910:28;;-1:-1:-1;;;51910:28:0;;;;;;;;;;;51878:60;-1:-1:-1;;;;;;51956:25:0;;;;;:18;:25;;;;;;-1:-1:-1;;;;;51956:55:0;;51786:233::o;95567:103::-;94805:13;:11;:13::i;:::-;95632:30:::1;95659:1;95632:18;:30::i;98750:108::-:0;98832:17;;98796:7;;98823:27;;-1:-1:-1;;;98832:17:0;;;;98823:8;:27::i;:::-;98816:34;;98750:108;:::o;91884:900::-;91962:16;92016:19;92050:25;92090:22;92115:16;92125:5;92115:9;:16::i;:::-;92090:41;;92146:25;92188:14;-1:-1:-1;;;;;92174:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92174:29:0;;92146:57;;92218:31;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92218:31:0;97265:1;92264:472;92313:14;92298:11;:29;92264:472;;92365:15;92378:1;92365:12;:15::i;:::-;92353:27;;92403:9;:16;;;92399:73;;;92444:8;;92399:73;92494:14;;-1:-1:-1;;;;;92494:28:0;;92490:111;;92567:14;;;-1:-1:-1;92490:111:0;92644:5;-1:-1:-1;;;;;92623:26:0;:17;-1:-1:-1;;;;;92623:26:0;;92619:102;;;92700:1;92674:8;92683:13;;;;;;92674:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;92619:102;92329:3;;92264:472;;;-1:-1:-1;92757:8:0;;91884:900;-1:-1:-1;;;;;;91884:900:0:o;55027:104::-;55083:13;55116:7;55109:14;;;;;:::i;88924:2513::-;89067:16;89134:4;89125:5;:13;89121:45;;89147:19;;-1:-1:-1;;;89147:19:0;;;;;;;;;;;89121:45;89181:19;89215:17;89235:14;50344:7;50371:13;;50289:103;89235:14;89215:34;-1:-1:-1;97265:1:0;89327:5;:23;89323:87;;;97265:1;89371:23;;89323:87;89486:9;89479:4;:16;89475:73;;;89523:9;89516:16;;89475:73;89562:25;89590:16;89600:5;89590:9;:16::i;:::-;89562:44;;89784:4;89776:5;:12;89772:278;;;89831:12;;;89866:31;;;89862:111;;;89942:11;89922:31;;89862:111;89790:198;89772:278;;;-1:-1:-1;90033:1:0;89772:278;90064:25;90106:17;-1:-1:-1;;;;;90092:32:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;90092:32:0;-1:-1:-1;90064:60:0;-1:-1:-1;90143:22:0;90139:78;;90193:8;-1:-1:-1;90186:15:0;;-1:-1:-1;;;90186:15:0;90139:78;90361:31;90395:26;90415:5;90395:19;:26::i;:::-;90361:60;;90436:25;90681:9;:16;;;90676:92;;-1:-1:-1;90738:14:0;;90676:92;90799:5;90782:478;90811:4;90806:1;:9;;:45;;;;;90834:17;90819:11;:32;;90806:45;90782:478;;;90889:15;90902:1;90889:12;:15::i;:::-;90877:27;;90927:9;:16;;;90923:73;;;90968:8;;90923:73;91018:14;;-1:-1:-1;;;;;91018:28:0;;91014:111;;91091:14;;;-1:-1:-1;91014:111:0;91168:5;-1:-1:-1;;;;;91147:26:0;:17;-1:-1:-1;;;;;91147:26:0;;91143:102;;;91224:1;91198:8;91207:13;;;;;;91198:23;;;;;;;;:::i;:::-;;;;;;:27;;;;;91143:102;90853:3;;90782:478;;;-1:-1:-1;;;91345:29:0;;;-1:-1:-1;91352:8:0;;-1:-1:-1;;88924:2513:0;;;;;;:::o;61892:308::-;-1:-1:-1;;;;;61991:31:0;;84632:10;61991:31;61987:61;;;62031:17;;-1:-1:-1;;;62031:17:0;;;;;;;;;;;61987:61;84632:10;62061:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;62061:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;62061:60:0;;;;;;;;;;62137:55;;10307:41:1;;;62061:49:0;;84632:10;62137:55;;10280:18:1;62137:55:0;;;;;;;61892:308;;:::o;98866:108::-;98948:17;;98912:7;;98939:27;;-1:-1:-1;;;98948:17:0;;;;98939:8;:27::i;68737:399::-;68904:31;68917:4;68923:2;68927:7;68904:12;:31::i;:::-;-1:-1:-1;;;;;68950:14:0;;;:19;68946:183;;68989:56;69020:4;69026:2;69030:7;69039:5;68989:30;:56::i;:::-;68984:145;;69073:40;;-1:-1:-1;;;69073:40:0;;;;;;;;;;;87421:428;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97265:1:0;87585:7;:25;:54;;;-1:-1:-1;50344:7:0;50371:13;87614:7;:25;;87585:54;87581:103;;;87663:9;87421:428;-1:-1:-1;;87421:428:0:o;87581:103::-;87706:21;87719:7;87706:12;:21::i;:::-;87694:33;;87742:9;:16;;;87738:65;;;87782:9;87421:428;-1:-1:-1;;87421:428:0:o;87738:65::-;87820:21;87833:7;87820:12;:21::i;102579:117::-;94805:13;:11;:13::i;:::-;102668:20:::1;102682:5;102668:13;:20::i;:::-;102648:17;;:40;;;;;;;;;;;;;;;;;;102579:117:::0;:::o;102704:::-;94805:13;:11;:13::i;:::-;102793:20:::1;102807:5;102793:13;:20::i;:::-;102773:17;;:40;;;;;;;;;;;;;;;;;;102704:117:::0;:::o;97282:162::-;97347:13;97380:56;97398:9;97380:56;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;97380:56:0;;;97417:18;97427:7;97417:9;:18::i;:::-;97380:17;:56::i;98298:315::-;100525:6;;-1:-1:-1;;;100525:6:0;;;;:15;100517:35;;;;-1:-1:-1;;;100517:35:0;;;;;;;:::i;:::-;99809:10:::1;::::0;98430:1:::1;::::0;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;100401:6:::2;::::0;100330:22:::2;::::0;;100341:10:::2;100330:22;::::0;::::2;8248:51:1::0;98459:9:0;;;;-1:-1:-1;;;;;100401:6:0;;::::2;::::0;100320:77:::2;::::0;98459:9;;;;100320:58:::2;::::0;8221:18:1;100330:22:0::2;8102:203:1::0;100320:77:0::2;-1:-1:-1::0;;;;;100320:87:0::2;;100298:155;;;::::0;-1:-1:-1;;;100298:155:0;;14760:2:1;100298:155:0::2;::::0;::::2;14742:21:1::0;14799:2;14779:18;;;14772:30;-1:-1:-1;;;14818:18:1;;;14811:48;14876:18;;100298:155:0::2;14558:342:1::0;100298:155:0::2;98502:10:::3;52728:6:::0;52761:25;;;:18;:25;;;;;;46319:3;52761:40;98494:24;98486:53:::3;;;::::0;-1:-1:-1;;;98486:53:0;;13035:2:1;98486:53:0::3;::::0;::::3;13017:21:1::0;13074:2;13054:18;;;13047:30;-1:-1:-1;;;13093:18:1;;;13086:46;13149:18;;98486:53:0::3;12833:340:1::0;98486:53:0::3;98558:10;53070:14:::0;53087:25;;;:18;:25;;;;;;;-1:-1:-1;;;;;53287:32:0;-1:-1:-1;;;53286:63:0;53360:34;;98585:20:::3;98591:10;98603:1;98585:5;:20::i;:::-;99941:1:::2;;100563::::1;98298:315:::0;;:::o;100867:297::-;94805:13;:11;:13::i;:::-;100989:20:::1;101000:2:::0;100989:8;:20:::1;:::i;:::-;99809:10;::::0;-1:-1:-1;;;99809:10:0;::::1;;;:19;99801:39;;;;-1:-1:-1::0;;;99801:39:0::1;;;;;;;:::i;:::-;99892:9;::::0;-1:-1:-1;;;99892:9:0;::::1;;;99880:8:::0;99863:14:::1;51078:7:::0;51269:13;-1:-1:-1;;51269:31:0;;51023:296;99863:14:::1;:25;:38;;99855:64;;;;-1:-1:-1::0;;;99855:64:0::1;;;;;;;:::i;:::-;101057:9:::2;101052:94;101068:14:::0;;::::2;101052:94;;101108:22;101114:2;;101117:1;101114:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;101121:8;101108:5;:22::i;:::-;101084:3;;101052:94;;102312:75:::0;94805:13;:11;:13::i;:::-;102362:10:::1;:17:::0;;-1:-1:-1;;;;102362:17:0::1;-1:-1:-1::0;;;102362:17:0::1;::::0;;102312:75::o;101567:153::-;94805:13;:11;:13::i;:::-;101649:14:::1;::::0;-1:-1:-1;;;101649:14:0;::::1;;;:23;101641:43;;;;-1:-1:-1::0;;;101641:43:0::1;;;;;;;:::i;:::-;101695:17;:9;101707:5:::0;;101695:17:::1;:::i;95825:201::-:0;94805:13;:11;:13::i;:::-;-1:-1:-1;;;;;95914:22:0;::::1;95906:73;;;::::0;-1:-1:-1;;;95906:73:0;;11132:2:1;95906:73:0::1;::::0;::::1;11114:21:1::0;11171:2;11151:18;;;11144:30;11210:34;11190:18;;;11183:62;-1:-1:-1;;;11261:18:1;;;11254:36;11307:19;;95906:73:0::1;10930:402:1::0;95906:73:0::1;95990:28;96009:8;95990:18;:28::i;:::-;95825:201:::0;:::o;102395:85::-;94805:13;:11;:13::i;:::-;102450:15:::1;:22:::0;;-1:-1:-1;;;;102450:22:0::1;-1:-1:-1::0;;;102450:22:0::1;::::0;;102395:85::o;95084:132::-;94992:6;;-1:-1:-1;;;;;94992:6:0;84632:10;95148:23;95140:68;;;;-1:-1:-1;;;95140:68:0;;14399:2:1;95140:68:0;;;14381:21:1;;;14418:18;;;14411:30;14477:34;14457:18;;;14450:62;14529:18;;95140:68:0;14197:356:1;62779:282:0;62844:4;62900:7;97265:1;62881:26;;:66;;;;;62934:13;;62924:7;:23;62881:66;:153;;;;-1:-1:-1;;62985:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;62985:44:0;:49;;62779:282::o;72398:2454::-;72471:20;72494:13;72522;72518:44;;72544:18;;-1:-1:-1;;;72544:18:0;;;;;;;;;;;72518:44;-1:-1:-1;;;;;73050:22:0;;;;;;:18;:22;;;;46083:2;73050:22;;;:71;;73088:32;73076:45;;73050:71;;;73364:31;;;:17;:31;;;;;-1:-1:-1;60064:15:0;;60038:24;60034:46;59633:11;59608:23;59604:41;59601:52;59591:63;;73364:173;;73599:23;;;;73364:31;;73050:22;;74098:25;73050:22;;73951:335;74366:1;74352:12;74348:20;74306:346;74407:3;74398:7;74395:16;74306:346;;74625:7;74615:8;74612:1;74585:25;74582:1;74579;74574:59;74460:1;74447:15;74306:346;;;-1:-1:-1;74685:13:0;74681:45;;74707:19;;-1:-1:-1;;;74707:19:0;;;;;;;;;;;74681:45;74743:13;:19;-1:-1:-1;67954:185:0;;;:::o;57399:1275::-;57466:7;57501;;97265:1;57550:23;57546:1061;;57603:13;;57596:4;:20;57592:1015;;;57641:14;57658:23;;;:17;:23;;;;;;-1:-1:-1;;;57747:24:0;;57743:845;;58412:113;58419:11;58412:113;;-1:-1:-1;;;58490:6:0;58472:25;;;;:17;:25;;;;;;58412:113;;57743:845;57618:989;57592:1015;58635:31;;-1:-1:-1;;;58635:31:0;;;;;;;;;;;99588:126;99647:7;99674:32;96593:11;99674:19;;;:32;:::i;1273:445::-;1480:1;1477;1474;1471;1463:6;1459:2;1452:5;1447:35;1437:263;;1590:10;1584:4;1577:24;1680:4;1674;1667:18;1437:263;1273:445;;:::o;19181:2098::-;19261:14;19405:4;19399:11;19521:4;19503:16;19499:27;19486:41;19550:16;19585:2;19580:368;;;;19967:2;19962:173;;;;19543:592;;19580:368;19796:2;19792:1;19787:3;19783:11;19779:20;19773:4;19766:34;-1:-1:-1;;;;;19863:1:0;19859:74;19854:79;;19580:368;;19962:173;20112:4;20094:16;20090:27;20077:41;20074:1;20069:50;20063:4;20056:64;19543:592;;20285:66;20282:1;20279:73;20269:914;;20386:4;20380;20373:18;20446:4;20428:16;20422:4;20409:42;20509:1;20503:4;20496:15;20875:4;20824;20775;20725;20667;20592:5;20555:366;20529:411;21014:1;21008:4;21001:15;21150:16;21144:4;21140:27;21134:34;21124:44;;20269:914;-1:-1:-1;21253:4:0;21246:15;19181:2098;;-1:-1:-1;;;19181:2098:0:o;96186:191::-;96279:6;;;-1:-1:-1;;;;;96296:17:0;;;-1:-1:-1;;;;;;96296:17:0;;;;;;;96329:40;;96279:6;;;96296:17;96279:6;;96329:40;;96260:16;;96329:40;96249:128;96186:191;:::o;56847:161::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56975:24:0;;;;:17;:24;;;;;;56956:44;;:18;:44::i;71220:716::-;71404:88;;-1:-1:-1;;;71404:88:0;;71383:4;;-1:-1:-1;;;;;71404:45:0;;;;;:88;;84632:10;;71471:4;;71477:7;;71486:5;;71404:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71404:88:0;;;;;;;;-1:-1:-1;;71404:88:0;;;;;;;;;;;;:::i;:::-;;;71400:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;71687:13:0;;71683:235;;71733:40;;-1:-1:-1;;;71733:40:0;;;;;;;;;;;71683:235;71876:6;71870:13;71861:6;71857:2;71853:15;71846:38;71400:529;-1:-1:-1;;;;;;71563:64:0;-1:-1:-1;;;71563:64:0;;-1:-1:-1;71220:716:0;;;;;;:::o;56585:166::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56696:47:0;56715:27;56734:7;56715:18;:27::i;:::-;56696:18;:47::i;99269:311::-;99329:6;96593:11;99381:5;:18;:23;99373:75;;;;-1:-1:-1;;;99373:75:0;;12222:2:1;99373:75:0;;;12204:21:1;12261:2;12241:18;;;12234:30;12300:34;12280:18;;;12273:62;-1:-1:-1;;;12351:18:1;;;12344:37;12398:19;;99373:75:0;12020:403:1;99373:75:0;99496:16;96593:11;99472:19;;;;;99471:41;;99463:63;;;;-1:-1:-1;;;99463:63:0;;13727:2:1;99463:63:0;;;13709:21:1;13766:1;13746:18;;;13739:29;-1:-1:-1;;;13784:18:1;;;13777:39;13833:18;;99463:63:0;13525:332:1;99463:63:0;-1:-1:-1;99555:5:0;99269:311::o;84752:1581::-;85235:4;85229:11;;85242:4;85225:22;85321:17;;;;85225:22;85679:5;85661:428;85727:1;85722:3;85718:11;85711:18;;85898:2;85892:4;85888:13;85884:2;85880:22;85875:3;85867:36;85992:2;85982:13;;;86049:25;;86067:5;;86049:25;85661:428;;;-1:-1:-1;86119:13:0;;;-1:-1:-1;;86234:14:0;;;86296:19;;;86234:14;84752:1581;-1:-1:-1;84752:1581:0:o;14865:3831::-;15011:20;15095:7;15089:14;15143:6;15137:13;15195:11;15189:18;15247:4;15238:7;15234:18;15223:29;;15288:4;15280:6;15276:17;15266:27;;15339:4;15326:11;15322:22;15307:37;;15385:4;15378;15372:11;15368:22;15358:32;;15437:13;15428:7;15424:27;15492:13;15478:12;15475:31;15465:2462;;15586:1;15571:12;15559:10;15555:29;15551:37;15615:1;15661:2;15647:12;15644:20;15634:110;;-1:-1:-1;15694:31:0;;;15634:110;15804:2;15790:12;15786:21;15782:2;15778:30;15775:1;15771:38;15842:6;15836:13;15903:2009;15953:7;15947:14;16135:1;16132;16128:9;16125:1;16121:17;16111:1537;;16170:1;16167:493;;;16250:1;16235:12;16226:7;16216:32;16213:39;16203:430;;16289:17;;;16362:1;16409:15;;;;16350:14;;;;16520:29;;;16510:50;;16553:5;;;16510:50;16594:8;15903:2009;;16203:430;16816:1;16801:302;16885:19;;;16879:26;16863:14;;;16856:50;16948:4;16941:12;17041:24;;;17031:45;;17069:5;;17031:45;16801:302;;;-1:-1:-1;17206:26:0;;;;17139:30;;;;17219:12;17262:209;;17317:17;;;17386:1;17429:15;;;;17374:14;;;;17262:209;17563:16;17554:7;17551:29;17541:50;;17584:5;;;16111:1537;17670:17;;17731:1;17766:15;;;;17719:14;;;;17853:29;;;17843:50;;17886:5;;17843:50;15903:2009;;;15907:2;;;;15465:2462;17966:6;17943:29;;18013:4;18006;18000:11;17996:22;17986:32;;18091:7;18079:10;18075:24;18066:6;18049:15;18045:28;18041:59;18032:68;;18210:217;18229:10;18220:7;18217:23;18210:217;;;18287:14;;18263:39;;18360:4;18394:18;;;;18339:26;;;;18210:217;;;18214:2;;18598:4;18594:9;18587:4;18584:1;18580:12;18576:28;18568:6;18564:41;18558:4;18551:55;18642:4;18634:6;18630:17;18620:27;;18676:1;18668:6;18661:17;;;14865:3831;;;;;:::o;58773:366::-;-1:-1:-1;;;;;;;;;;;;;58883:41:0;;;;46604:3;58969:33;;;-1:-1:-1;;;;;58935:68:0;-1:-1:-1;;;58935:68:0;-1:-1:-1;;;59033:24:0;;:29;;-1:-1:-1;;;59014:48:0;;;;47125:3;59102:28;;;;-1:-1:-1;;;59073:58:0;-1:-1:-1;58773:366:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:367::-;255:8;265:6;319:3;312:4;304:6;300:17;296:27;286:55;;337:1;334;327:12;286:55;-1:-1:-1;360:20:1;;-1:-1:-1;;;;;392:30:1;;389:50;;;435:1;432;425:12;389:50;472:4;464:6;460:17;448:29;;532:3;525:4;515:6;512:1;508:14;500:6;496:27;492:38;489:47;486:67;;;549:1;546;539:12;486:67;192:367;;;;;:::o;564:160::-;629:20;;685:13;;678:21;668:32;;658:60;;714:1;711;704:12;729:347;780:8;790:6;844:3;837:4;829:6;825:17;821:27;811:55;;862:1;859;852:12;811:55;-1:-1:-1;885:20:1;;-1:-1:-1;;;;;917:30:1;;914:50;;;960:1;957;950:12;914:50;997:4;989:6;985:17;973:29;;1049:3;1042:4;1033:6;1025;1021:19;1017:30;1014:39;1011:59;;;1066:1;1063;1056:12;1081:186;1140:6;1193:2;1181:9;1172:7;1168:23;1164:32;1161:52;;;1209:1;1206;1199:12;1161:52;1232:29;1251:9;1232:29;:::i;1272:260::-;1340:6;1348;1401:2;1389:9;1380:7;1376:23;1372:32;1369:52;;;1417:1;1414;1407:12;1369:52;1440:29;1459:9;1440:29;:::i;:::-;1430:39;;1488:38;1522:2;1511:9;1507:18;1488:38;:::i;:::-;1478:48;;1272:260;;;;;:::o;1537:328::-;1614:6;1622;1630;1683:2;1671:9;1662:7;1658:23;1654:32;1651:52;;;1699:1;1696;1689:12;1651:52;1722:29;1741:9;1722:29;:::i;:::-;1712:39;;1770:38;1804:2;1793:9;1789:18;1770:38;:::i;:::-;1760:48;;1855:2;1844:9;1840:18;1827:32;1817:42;;1537:328;;;;;:::o;1870:1138::-;1965:6;1973;1981;1989;2042:3;2030:9;2021:7;2017:23;2013:33;2010:53;;;2059:1;2056;2049:12;2010:53;2082:29;2101:9;2082:29;:::i;:::-;2072:39;;2130:38;2164:2;2153:9;2149:18;2130:38;:::i;:::-;2120:48;;2215:2;2204:9;2200:18;2187:32;2177:42;;2270:2;2259:9;2255:18;2242:32;-1:-1:-1;;;;;2334:2:1;2326:6;2323:14;2320:34;;;2350:1;2347;2340:12;2320:34;2388:6;2377:9;2373:22;2363:32;;2433:7;2426:4;2422:2;2418:13;2414:27;2404:55;;2455:1;2452;2445:12;2404:55;2491:2;2478:16;2513:2;2509;2506:10;2503:36;;;2519:18;;:::i;:::-;2594:2;2588:9;2562:2;2648:13;;-1:-1:-1;;2644:22:1;;;2668:2;2640:31;2636:40;2624:53;;;2692:18;;;2712:22;;;2689:46;2686:72;;;2738:18;;:::i;:::-;2778:10;2774:2;2767:22;2813:2;2805:6;2798:18;2853:7;2848:2;2843;2839;2835:11;2831:20;2828:33;2825:53;;;2874:1;2871;2864:12;2825:53;2930:2;2925;2921;2917:11;2912:2;2904:6;2900:15;2887:46;2975:1;2970:2;2965;2957:6;2953:15;2949:24;2942:35;2996:6;2986:16;;;;;;;1870:1138;;;;;;;:::o;3013:254::-;3078:6;3086;3139:2;3127:9;3118:7;3114:23;3110:32;3107:52;;;3155:1;3152;3145:12;3107:52;3178:29;3197:9;3178:29;:::i;:::-;3168:39;;3226:35;3257:2;3246:9;3242:18;3226:35;:::i;3272:254::-;3340:6;3348;3401:2;3389:9;3380:7;3376:23;3372:32;3369:52;;;3417:1;3414;3407:12;3369:52;3440:29;3459:9;3440:29;:::i;:::-;3430:39;3516:2;3501:18;;;;3488:32;;-1:-1:-1;;;3272:254:1:o;3531:322::-;3608:6;3616;3624;3677:2;3665:9;3656:7;3652:23;3648:32;3645:52;;;3693:1;3690;3683:12;3645:52;3716:29;3735:9;3716:29;:::i;:::-;3706:39;3792:2;3777:18;;3764:32;;-1:-1:-1;3843:2:1;3828:18;;;3815:32;;3531:322;-1:-1:-1;;;3531:322:1:o;3858:505::-;3953:6;3961;3969;4022:2;4010:9;4001:7;3997:23;3993:32;3990:52;;;4038:1;4035;4028:12;3990:52;4078:9;4065:23;-1:-1:-1;;;;;4103:6:1;4100:30;4097:50;;;4143:1;4140;4133:12;4097:50;4182:70;4244:7;4235:6;4224:9;4220:22;4182:70;:::i;:::-;4271:8;;4156:96;;-1:-1:-1;4353:2:1;4338:18;;;;4325:32;;3858:505;-1:-1:-1;;;;3858:505:1:o;4368:437::-;4454:6;4462;4515:2;4503:9;4494:7;4490:23;4486:32;4483:52;;;4531:1;4528;4521:12;4483:52;4571:9;4558:23;-1:-1:-1;;;;;4596:6:1;4593:30;4590:50;;;4636:1;4633;4626:12;4590:50;4675:70;4737:7;4728:6;4717:9;4713:22;4675:70;:::i;:::-;4764:8;;4649:96;;-1:-1:-1;4368:437:1;-1:-1:-1;;;;4368:437:1:o;4810:180::-;4866:6;4919:2;4907:9;4898:7;4894:23;4890:32;4887:52;;;4935:1;4932;4925:12;4887:52;4958:26;4974:9;4958:26;:::i;4995:245::-;5053:6;5106:2;5094:9;5085:7;5081:23;5077:32;5074:52;;;5122:1;5119;5112:12;5074:52;5161:9;5148:23;5180:30;5204:5;5180:30;:::i;5245:249::-;5314:6;5367:2;5355:9;5346:7;5342:23;5338:32;5335:52;;;5383:1;5380;5373:12;5335:52;5415:9;5409:16;5434:30;5458:5;5434:30;:::i;5499:409::-;5569:6;5577;5630:2;5618:9;5609:7;5605:23;5601:32;5598:52;;;5646:1;5643;5636:12;5598:52;5686:9;5673:23;-1:-1:-1;;;;;5711:6:1;5708:30;5705:50;;;5751:1;5748;5741:12;5705:50;5790:58;5840:7;5831:6;5820:9;5816:22;5790:58;:::i;6328:272::-;6386:6;6439:2;6427:9;6418:7;6414:23;6410:32;6407:52;;;6455:1;6452;6445:12;6407:52;6494:9;6481:23;6544:6;6537:5;6533:18;6526:5;6523:29;6513:57;;6566:1;6563;6556:12;6605:180;6664:6;6717:2;6705:9;6696:7;6692:23;6688:32;6685:52;;;6733:1;6730;6723:12;6685:52;-1:-1:-1;6756:23:1;;6605:180;-1:-1:-1;6605:180:1:o;6790:477::-;6869:6;6877;6885;6938:2;6926:9;6917:7;6913:23;6909:32;6906:52;;;6954:1;6951;6944:12;6906:52;6990:9;6977:23;6967:33;;7051:2;7040:9;7036:18;7023:32;-1:-1:-1;;;;;7070:6:1;7067:30;7064:50;;;7110:1;7107;7100:12;7064:50;7149:58;7199:7;7190:6;7179:9;7175:22;7149:58;:::i;:::-;6790:477;;7226:8;;-1:-1:-1;7123:84:1;;-1:-1:-1;;;;6790:477:1:o;7272:471::-;7313:3;7351:5;7345:12;7378:6;7373:3;7366:19;7403:1;7413:162;7427:6;7424:1;7421:13;7413:162;;;7489:4;7545:13;;;7541:22;;7535:29;7517:11;;;7513:20;;7506:59;7442:12;7413:162;;;7593:6;7590:1;7587:13;7584:87;;;7659:1;7652:4;7643:6;7638:3;7634:16;7630:27;7623:38;7584:87;-1:-1:-1;7725:2:1;7704:15;-1:-1:-1;;7700:29:1;7691:39;;;;7732:4;7687:50;;7272:471;-1:-1:-1;;7272:471:1:o;7748:349::-;7832:12;;-1:-1:-1;;;;;7828:38:1;7816:51;;7920:4;7909:16;;;7903:23;-1:-1:-1;;;;;7899:48:1;7883:14;;;7876:72;8011:4;8000:16;;;7994:23;7987:31;7980:39;7964:14;;;7957:63;8073:4;8062:16;;;8056:23;8081:8;8052:38;8036:14;;8029:62;7748:349::o;8310:488::-;-1:-1:-1;;;;;8579:15:1;;;8561:34;;8631:15;;8626:2;8611:18;;8604:43;8678:2;8663:18;;8656:34;;;8726:3;8721:2;8706:18;;8699:31;;;8504:4;;8747:45;;8772:19;;8764:6;8747:45;:::i;:::-;8739:53;8310:488;-1:-1:-1;;;;;;8310:488:1:o;8803:722::-;9036:2;9088:21;;;9158:13;;9061:18;;;9180:22;;;9007:4;;9036:2;9259:15;;;;9233:2;9218:18;;;9007:4;9302:197;9316:6;9313:1;9310:13;9302:197;;;9365:52;9413:3;9404:6;9398:13;9365:52;:::i;:::-;9474:15;;;;9446:4;9437:14;;;;;9338:1;9331:9;9302:197;;9530:632;9701:2;9753:21;;;9823:13;;9726:18;;;9845:22;;;9672:4;;9701:2;9924:15;;;;9898:2;9883:18;;;9672:4;9967:169;9981:6;9978:1;9975:13;9967:169;;;10042:13;;10030:26;;10111:15;;;;10076:12;;;;10003:1;9996:9;9967:169;;10359:219;10508:2;10497:9;10490:21;10471:4;10528:44;10568:2;10557:9;10553:18;10545:6;10528:44;:::i;11685:330::-;11887:2;11869:21;;;11926:1;11906:18;;;11899:29;-1:-1:-1;;;11959:2:1;11944:18;;11937:37;12006:2;11991:18;;11685:330::o;13862:::-;14064:2;14046:21;;;14103:1;14083:18;;;14076:29;-1:-1:-1;;;14136:2:1;14121:18;;14114:37;14183:2;14168:18;;13862:330::o;14905:337::-;15107:2;15089:21;;;15146:2;15126:18;;;15119:30;-1:-1:-1;;;15180:2:1;15165:18;;15158:43;15233:2;15218:18;;14905:337::o;15591:266::-;15787:3;15772:19;;15800:51;15776:9;15833:6;15800:51;:::i;16237:265::-;16277:7;16343:1;16339;16335:6;16331:14;16328:1;16325:21;16320:1;16313:9;16306:17;16302:45;16299:168;;;16389:10;16384:3;16380:20;16377:1;16370:31;16424:4;16421:1;16414:15;16452:4;16449:1;16442:15;16299:168;-1:-1:-1;16487:9:1;;16237:265::o;16507:380::-;16586:1;16582:12;;;;16629;;;16650:61;;16704:4;16696:6;16692:17;16682:27;;16650:61;16757:2;16749:6;16746:14;16726:18;16723:38;16720:161;;;16803:10;16798:3;16794:20;16791:1;16784:31;16838:4;16835:1;16828:15;16866:4;16863:1;16856:15;16720:161;;16507:380;;;:::o;17024:127::-;17085:10;17080:3;17076:20;17073:1;17066:31;17116:4;17113:1;17106:15;17140:4;17137:1;17130:15;17156:127;17217:10;17212:3;17208:20;17205:1;17198:31;17248:4;17245:1;17238:15;17272:4;17269:1;17262:15;17288:131;-1:-1:-1;;;;;;17362:32:1;;17352:43;;17342:71;;17409:1;17406;17399:12
Swarm Source
ipfs://91802568b431d7df3e85c1b5b7eabc8f33ea2b8422dbc503174b375c16c8bdf2
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.