Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 532 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Approval For... | 15157174 | 1318 days ago | IN | 0 ETH | 0.00125257 | ||||
| Set Approval For... | 15132989 | 1322 days ago | IN | 0 ETH | 0.00075843 | ||||
| Transfer From | 15000478 | 1344 days ago | IN | 0 ETH | 0.0010969 | ||||
| Transfer From | 14998144 | 1344 days ago | IN | 0 ETH | 0.00228641 | ||||
| Set Approval For... | 14967522 | 1349 days ago | IN | 0 ETH | 0.00157892 | ||||
| Set Approval For... | 14867693 | 1366 days ago | IN | 0 ETH | 0.0015661 | ||||
| Transfer From | 14711468 | 1391 days ago | IN | 0 ETH | 0.00377859 | ||||
| Set Approval For... | 14514671 | 1422 days ago | IN | 0 ETH | 0.00234704 | ||||
| Set Approval For... | 14498698 | 1425 days ago | IN | 0 ETH | 0.00187689 | ||||
| Set Approval For... | 14494187 | 1425 days ago | IN | 0 ETH | 0.00196784 | ||||
| Transfer From | 14494160 | 1425 days ago | IN | 0 ETH | 0.00212414 | ||||
| Withdraw Fund | 14486994 | 1426 days ago | IN | 0 ETH | 0.00113657 | ||||
| Set Approval For... | 14485381 | 1427 days ago | IN | 0 ETH | 0.00162162 | ||||
| Mint | 14472857 | 1429 days ago | IN | 0.07 ETH | 0.00192471 | ||||
| Mint | 14465448 | 1430 days ago | IN | 0.07 ETH | 0.00170358 | ||||
| Mint | 14462599 | 1430 days ago | IN | 0.07 ETH | 0.0027322 | ||||
| Set Approval For... | 14462373 | 1430 days ago | IN | 0 ETH | 0.00138508 | ||||
| Set Approval For... | 14461320 | 1430 days ago | IN | 0 ETH | 0.0009783 | ||||
| Mint | 14461171 | 1430 days ago | IN | 0.07 ETH | 0.00172586 | ||||
| Mint | 14461152 | 1430 days ago | IN | 0.21 ETH | 0.00235835 | ||||
| Set Approval For... | 14460847 | 1431 days ago | IN | 0 ETH | 0.00130732 | ||||
| Mint | 14460088 | 1431 days ago | IN | 0.07 ETH | 0.00208157 | ||||
| Mint | 14460084 | 1431 days ago | IN | 0.14 ETH | 0.00248298 | ||||
| Mint | 14460051 | 1431 days ago | IN | 0.07 ETH | 0.0020557 | ||||
| Mint | 14460020 | 1431 days ago | IN | 0.14 ETH | 0.00208043 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ElfPrincessClub
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./ERC721A.sol";
import "./Strings.sol";
import "./SafeMath.sol";
import "./ECDSA.sol";
abstract contract MintingPass {
function balanceOf(address owner, uint256 id) public view virtual returns (uint256 balance);
}
contract ElfPrincessClub is Ownable, ERC721A, ReentrancyGuard {
using SafeMath for uint256;
MintingPass mintpass;
using ECDSA for bytes32;
string private _baseTokenURI;
uint256 public presalePrice = 0.07 ether;
uint256 public publicSalePrice = 0.08 ether;
uint256 public presaleStartDate;
uint256 public whitelistStartDate;
uint256 public publicSaleDate;
uint256 count;
uint256 public maxPerTx;
constructor( uint256 _maxPerTx, uint256 collectionSize_,address _address,string memory uri,uint256 _presaleStartDate,uint256 _whitelistStartDate,uint256 _publicSaleDate)
ERC721A("Elf Princess Club", "ELF",collectionSize_) {
mintpass = MintingPass(_address);
maxPerTx=_maxPerTx;
_baseTokenURI=uri;
presaleStartDate=_presaleStartDate;
whitelistStartDate=_whitelistStartDate;
publicSaleDate=_publicSaleDate;
}
function devMint(uint256 quantity,address _mintAddress) external onlyOwner {
require(quantity>0 && quantity <= getMaxTx() , "Quantity greater than max mint allowed");
require(count.add(quantity)<=150,"Limit exceed");
count=count.add(quantity);
_safeMint(_mintAddress, quantity);
}
function setPrice(uint256 _price) external onlyOwner {
publicSalePrice = _price;
}
function getMaxPerTransaction(uint _id) public view returns (uint256) {
if(block.timestamp > presaleStartDate && block.timestamp<whitelistStartDate)
{
if(_id==1)
{
return 100;
}else if(_id==2)
{
return 25;
}else{
return 10;
}
}else{
return maxPerTx;
}
}
function getPhase() public view returns (uint256)
{
if(block.timestamp<presaleStartDate)
{
return 0;
}else if(block.timestamp>presaleStartDate && block.timestamp<whitelistStartDate)
{
return 1;
}else if(block.timestamp>whitelistStartDate && block.timestamp<publicSaleDate)
{
return 2;
}else{
return 3;
}
}
function presaleMint(uint256 quantity,uint256 passId) external payable
{
require(getPhase()==1,"Presale closed");
require(quantity>0 && quantity <= getMaxPerTransaction(passId) , "Quantity greater than max mint allowed");
require(tx.origin == msg.sender, "The caller is another contract");
address minter=msg.sender;
uint256 tokenBalance=mintpass.balanceOf(minter, passId);
require(passId > 0 && tokenBalance>0,"Missing mint pass");
if(passId==1)
{
require(balanceOf(minter) <= 100,"You have already minted 100 elfs");
}else if(passId==2)
{
require(balanceOf(minter) <= 25,"You have already minted 25 elfs");
}else{
require(balanceOf(minter) <= 10,"You have already minted 10 elfs");
}
_safeMint(msg.sender, quantity);
}
function verifySignature(bytes memory _signature) public view returns (bool)
{
bytes32 messagehash = keccak256(abi.encodePacked(address(this), msg.sender));
address signer = messagehash.toEthSignedMessageHash().recover( _signature);
if (owner() == signer) {
return true;
} else {
return false;
}
}
function whitelistMint(uint256 quantity,bytes memory _signature) external payable
{
require(getPhase()==2,"Whitelist phase closed");
require(verifySignature(_signature),"Invalid address");
require(quantity>0 && quantity <= 3, "Quantity greater than max mint allowed");
require(msg.value == publicSalePrice.mul(quantity), "Invalid value");
require(tx.origin == msg.sender, "The caller is another contract");
require(balanceOf(msg.sender)<3,"Whitelist address can only contain upto 3 ELF's");
_safeMint(msg.sender, quantity);
}
function mint(uint256 quantity) external payable {
require(getPhase()==3,"Public sale closed");
require(quantity>0 && quantity <= getMaxTx() , "Quantity greater than max mint allowed");
require(tx.origin == msg.sender, "The caller is another contract");
require(msg.value == publicSalePrice.mul(quantity), "Invalid value");
_safeMint(msg.sender, quantity);
}
function _baseURI() internal view virtual override returns (string memory) {
return _baseTokenURI;
}
function getMaxTx() internal view virtual override returns (uint256)
{
return maxPerTx;
}
function setMaxTx(uint256 _maxTx) public onlyOwner
{
maxPerTx=_maxTx;
}
function setBaseURI(string calldata baseURI) external onlyOwner {
_baseTokenURI = baseURI;
}
function withdrawFund() external onlyOwner {
payable(msg.sender).transfer(address(this).balance);
}
function setOwnersExplicit(uint256 quantity) external onlyOwner nonReentrant {
_setOwnersExplicit(quantity);
}
function numberMinted(address owner) public view returns (uint256) {
return _numberMinted(owner);
}
function getOwnershipData(uint256 tokenId)
external
view
returns (TokenOwnership memory)
{
return ownershipOf(tokenId);
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/ECDSA.sol)
pragma solidity ^0.8.0;
import "./Strings.sol";
/**
* @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
*
* These functions can be used to verify that a message was signed by the holder
* of the private keys of a given address.
*/
library ECDSA {
enum RecoverError {
NoError,
InvalidSignature,
InvalidSignatureLength,
InvalidSignatureS,
InvalidSignatureV
}
function _throwError(RecoverError error) private pure {
if (error == RecoverError.NoError) {
return; // no error: do nothing
} else if (error == RecoverError.InvalidSignature) {
revert("ECDSA: invalid signature");
} else if (error == RecoverError.InvalidSignatureLength) {
revert("ECDSA: invalid signature length");
} else if (error == RecoverError.InvalidSignatureS) {
revert("ECDSA: invalid signature 's' value");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' value");
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature` or error string. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*
* Documentation for signature generation:
* - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
* - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
*
* _Available since v4.3._
*/
function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
// Check the signature length
// - case 65: r,s,v signature (standard)
// - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
if (signature.length == 65) {
bytes32 r;
bytes32 s;
uint8 v;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
s := mload(add(signature, 0x40))
v := byte(0, mload(add(signature, 0x60)))
}
return tryRecover(hash, v, r, s);
} else if (signature.length == 64) {
bytes32 r;
bytes32 vs;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return tryRecover(hash, r, vs);
} else {
return (address(0), RecoverError.InvalidSignatureLength);
}
}
/**
* @dev Returns the address that signed a hashed message (`hash`) with
* `signature`. This address can then be used for verification purposes.
*
* The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
* this function rejects them by requiring the `s` value to be in the lower
* half order, and the `v` value to be either 27 or 28.
*
* IMPORTANT: `hash` _must_ be the result of a hash operation for the
* verification to be secure: it is possible to craft signatures that
* recover to arbitrary addresses for non-hashed data. A safe way to ensure
* this is by receiving a hash of the original message (which may otherwise
* be too long), and then calling {toEthSignedMessageHash} on it.
*/
function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, signature);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
*
* See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address, RecoverError) {
bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
uint8 v = uint8((uint256(vs) >> 255) + 27);
return tryRecover(hash, v, r, s);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
*
* _Available since v4.2._
*/
function recover(
bytes32 hash,
bytes32 r,
bytes32 vs
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, r, vs);
_throwError(error);
return recovered;
}
/**
* @dev Overload of {ECDSA-tryRecover} that receives the `v`,
* `r` and `s` signature fields separately.
*
* _Available since v4.3._
*/
function tryRecover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address, RecoverError) {
// EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
// unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
// the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
// signatures from current libraries generate a unique signature with an s-value in the lower half order.
//
// If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
// with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
// vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
// these malleable signatures as well.
if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
return (address(0), RecoverError.InvalidSignatureS);
}
if (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// If the signature is valid (and not malleable), return the signer address
address signer = ecrecover(hash, v, r, s);
if (signer == address(0)) {
return (address(0), RecoverError.InvalidSignature);
}
return (signer, RecoverError.NoError);
}
/**
* @dev Overload of {ECDSA-recover} that receives the `v`,
* `r` and `s` signature fields separately.
*/
function recover(
bytes32 hash,
uint8 v,
bytes32 r,
bytes32 s
) internal pure returns (address) {
(address recovered, RecoverError error) = tryRecover(hash, v, r, s);
_throwError(error);
return recovered;
}
/**
* @dev Returns an Ethereum Signed Message, created from a `hash`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @dev Returns an Ethereum Signed Message, created from `s`. This
* produces hash corresponding to the one signed with the
* https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
* JSON-RPC method as part of EIP-191.
*
* See {recover}.
*/
function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
}
/**
* @dev Returns an Ethereum Signed Typed Data, created from a
* `domainSeparator` and a `structHash`. This produces hash corresponding
* to the one signed with the
* https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
* JSON-RPC method as part of EIP-712.
*
* See {recover}.
*/
function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./IERC721Enumerable.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";
import "./SafeMath.sol";
/**
* @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
* the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
*
* Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
*
* Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
*
* Does not support burning tokens to address(0).
*/
contract ERC721A is
Context,
ERC165,
IERC721,
IERC721Metadata,
IERC721Enumerable
{
using Address for address;
using Strings for uint256;
using SafeMath for uint256;
struct TokenOwnership {
address addr;
uint64 startTimestamp;
}
struct AddressData {
uint128 balance;
uint128 numberMinted;
}
uint256 private currentIndex = 0;
uint256 internal immutable collectionSize;
// 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 ownershipOf implementation for details.
mapping(uint256 => TokenOwnership) private _ownerships;
// Mapping owner address to address data
mapping(address => AddressData) private _addressData;
// Mapping from token ID to approved address
mapping(uint256 => address) private _tokenApprovals;
// Mapping from owner to operator approvals
mapping(address => mapping(address => bool)) private _operatorApprovals;
/**
* @dev
* `maxBatchSize` refers to how much a minter can mint at a time.
* `collectionSize_` refers to how many tokens are in the collection.
*/
constructor(
string memory name_,
string memory symbol_,
uint256 collectionSize_
) {
require(
collectionSize_ > 0,
"ERC721A: collection must have a nonzero supply"
);
_name = name_;
_symbol = symbol_;
collectionSize = collectionSize_;
}
/**
* @dev See {IERC721Enumerable-totalSupply}.
*/
function totalSupply() public view override returns (uint256) {
return currentIndex;
}
/**
* @dev See {IERC721Enumerable-tokenByIndex}.
*/
function tokenByIndex(uint256 index) public view override returns (uint256) {
require(index < totalSupply(), "ERC721A: global index out of bounds");
return index;
}
/**
* @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
* This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
* It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
*/
function tokenOfOwnerByIndex(address owner, uint256 index)
public
view
override
returns (uint256)
{
require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
uint256 numMintedSoFar = totalSupply();
uint256 tokenIdsIdx = 0;
address currOwnershipAddr = address(0);
for (uint256 i = 0; i < numMintedSoFar; i++) {
TokenOwnership memory ownership = _ownerships[i];
if (ownership.addr != address(0)) {
currOwnershipAddr = ownership.addr;
}
if (currOwnershipAddr == owner) {
if (tokenIdsIdx == index) {
return i;
}
tokenIdsIdx++;
}
}
revert("ERC721A: unable to get token of owner by index");
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(ERC165, IERC165)
returns (bool)
{
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
interfaceId == type(IERC721Enumerable).interfaceId ||
super.supportsInterface(interfaceId);
}
/**
* @dev See {IERC721-balanceOf}.
*/
function balanceOf(address owner) public view override returns (uint256) {
require(owner != address(0), "ERC721A: balance query for the zero address");
return uint256(_addressData[owner].balance);
}
function _numberMinted(address owner) internal view returns (uint256) {
require(
owner != address(0),
"ERC721A: number minted query for the zero address"
);
return uint256(_addressData[owner].numberMinted);
}
function ownershipOf(uint256 tokenId)
internal
view
returns (TokenOwnership memory)
{
require(_exists(tokenId), "ERC721A: owner query for nonexistent token");
uint256 lowestTokenToCheck;
if (tokenId >= getMaxTx()) {
lowestTokenToCheck = tokenId - getMaxTx() + 1;
}
for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
TokenOwnership memory ownership = _ownerships[curr];
if (ownership.addr != address(0)) {
return ownership;
}
}
revert("ERC721A: unable to determine the owner of token");
}
/**
* @dev See {IERC721-ownerOf}.
*/
function ownerOf(uint256 tokenId) public view override returns (address) {
return ownershipOf(tokenId).addr;
}
function getMaxTx() internal view virtual returns (uint256) {
return 0;
}
/**
* @dev See {IERC721Metadata-name}.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev See {IERC721Metadata-symbol}.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev See {IERC721Metadata-tokenURI}.
*/
function tokenURI(uint256 tokenId)
public
view
virtual
override
returns (string memory)
{
require(
_exists(tokenId),
"ERC721Metadata: URI query for nonexistent token"
);
string memory baseURI = _baseURI();
return string(abi.encodePacked(baseURI,Strings.toString(tokenId), '.json'));
}
/**
* @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
* token will be the concatenation of the `baseURI` and the `tokenId`. Empty
* by default, can be overriden in child contracts.
*/
function _baseURI() internal view virtual returns (string memory) {
return "";
}
/**
* @dev See {IERC721-approve}.
*/
function approve(address to, uint256 tokenId) public override {
address owner = ERC721A.ownerOf(tokenId);
require(to != owner, "ERC721A: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721A: approve caller is not owner nor approved for all"
);
_approve(to, tokenId, owner);
}
/**
* @dev See {IERC721-getApproved}.
*/
function getApproved(uint256 tokenId) public view override returns (address) {
require(_exists(tokenId), "ERC721A: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
/**
* @dev See {IERC721-setApprovalForAll}.
*/
function setApprovalForAll(address operator, bool approved) public override {
require(operator != _msgSender(), "ERC721A: approve to caller");
_operatorApprovals[_msgSender()][operator] = approved;
emit ApprovalForAll(_msgSender(), operator, approved);
}
/**
* @dev See {IERC721-isApprovedForAll}.
*/
function isApprovedForAll(address owner, address operator)
public
view
virtual
override
returns (bool)
{
return _operatorApprovals[owner][operator];
}
/**
* @dev See {IERC721-transferFrom}.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) public override {
_transfer(from, to, tokenId);
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public override {
safeTransferFrom(from, to, tokenId, "");
}
/**
* @dev See {IERC721-safeTransferFrom}.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public override {
_transfer(from, to, tokenId);
require(
_checkOnERC721Received(from, to, tokenId, _data),
"ERC721A: transfer to non ERC721Receiver implementer"
);
}
/**
* @dev Returns whether `tokenId` exists.
*
* Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
*
* Tokens start existing when they are minted (`_mint`),
*/
function _exists(uint256 tokenId) internal view returns (bool) {
return tokenId < currentIndex;
}
function _safeMint(address to, uint256 quantity) internal {
_safeMint(to, quantity, "");
}
/**
* @dev Mints `quantity` tokens and transfers them to `to`.
*
* Requirements:
*
* - there must be `quantity` tokens remaining unminted in the total collection.
* - `to` cannot be the zero address.
* - `quantity` cannot be larger than the max batch size.
*
* Emits a {Transfer} event.
*/
function _safeMint(
address to,
uint256 quantity,
bytes memory _data
) internal {
uint256 startTokenId = currentIndex;
require(to != address(0), "ERC721A: mint to the zero address");
// We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
require(!_exists(startTokenId), "ERC721A: token already minted");
require(quantity <= getMaxTx(), "ERC721A: quantity to mint too high");
require(currentIndex.add(quantity) <= collectionSize, "Max supply exceeds");
_beforeTokenTransfers(address(0), to, startTokenId, quantity);
AddressData memory addressData = _addressData[to];
_addressData[to] = AddressData(
addressData.balance + uint128(quantity),
addressData.numberMinted + uint128(quantity)
);
_ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));
uint256 updatedIndex = startTokenId;
for (uint256 i = 0; i < quantity; i++) {
emit Transfer(address(0), to, updatedIndex);
require(
_checkOnERC721Received(address(0), to, updatedIndex, _data),
"ERC721A: transfer to non ERC721Receiver implementer"
);
updatedIndex++;
}
currentIndex = updatedIndex;
_afterTokenTransfers(address(0), to, startTokenId, quantity);
}
/**
* @dev Transfers `tokenId` from `from` to `to`.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
*
* Emits a {Transfer} event.
*/
function _transfer(
address from,
address to,
uint256 tokenId
) private {
TokenOwnership memory prevOwnership = ownershipOf(tokenId);
bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
getApproved(tokenId) == _msgSender() ||
isApprovedForAll(prevOwnership.addr, _msgSender()));
require(
isApprovedOrOwner,
"ERC721A: transfer caller is not owner nor approved"
);
require(
prevOwnership.addr == from,
"ERC721A: transfer from incorrect owner"
);
require(to != address(0), "ERC721A: transfer to the zero address");
_beforeTokenTransfers(from, to, tokenId, 1);
// Clear approvals from the previous owner
_approve(address(0), tokenId, prevOwnership.addr);
_addressData[from].balance -= 1;
_addressData[to].balance += 1;
_ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));
// If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
// Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
uint256 nextTokenId = tokenId + 1;
if (_ownerships[nextTokenId].addr == address(0)) {
if (_exists(nextTokenId)) {
_ownerships[nextTokenId] = TokenOwnership(
prevOwnership.addr,
prevOwnership.startTimestamp
);
}
}
emit Transfer(from, to, tokenId);
_afterTokenTransfers(from, to, tokenId, 1);
}
/**
* @dev Approve `to` to operate on `tokenId`
*
* Emits a {Approval} event.
*/
function _approve(
address to,
uint256 tokenId,
address owner
) private {
_tokenApprovals[tokenId] = to;
emit Approval(owner, to, tokenId);
}
uint256 public nextOwnerToExplicitlySet = 0;
/**
* @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
*/
function _setOwnersExplicit(uint256 quantity) internal {
uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
require(quantity > 0, "quantity must be nonzero");
uint256 endIndex = oldNextOwnerToSet + quantity - 1;
if (endIndex > collectionSize - 1) {
endIndex = collectionSize - 1;
}
// We know if the last one in the group exists, all in the group exist, due to serial ordering.
require(_exists(endIndex), "not enough minted yet for this cleanup");
for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
if (_ownerships[i].addr == address(0)) {
TokenOwnership memory ownership = ownershipOf(i);
_ownerships[i] = TokenOwnership(
ownership.addr,
ownership.startTimestamp
);
}
}
nextOwnerToExplicitlySet = endIndex + 1;
}
/**
* @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
* The call is not executed if the target address is not a contract.
*
* @param from address representing the previous owner of the given token ID
* @param to target address that will receive the tokens
* @param tokenId uint256 ID of the token to be transferred
* @param _data bytes optional data to send along with the call
* @return bool whether the call correctly returned the expected magic value
*/
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try
IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721A: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
/**
* @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
*
* 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`.
*/
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.
*
* 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` and `to` are never both zero.
*/
function _afterTokenTransfers(
address from,
address to,
uint256 startTokenId,
uint256 quantity
) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @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
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @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 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);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Enumerable is IERC721 {
/**
* @dev Returns the total amount of tokens stored by the contract.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns a token ID owned by `owner` at a given `index` of its token list.
* Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
*/
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
/**
* @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
* Use along with {totalSupply} to enumerate all tokens.
*/
function tokenByIndex(uint256 index) external view returns (uint256);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
pragma solidity ^0.8.0;
import "./IERC721.sol";
/**
* @title ERC-721 Non-Fungible Token Standard, optional metadata extension
* @dev See https://eips.ethereum.org/EIPS/eip-721
*/
interface IERC721Metadata is IERC721 {
/**
* @dev Returns the token collection name.
*/
function name() external view returns (string memory);
/**
* @dev Returns the token collection symbol.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
*/
function tokenURI(uint256 tokenId) external view returns (string memory);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)
pragma solidity ^0.8.0;
/**
* @title ERC721 token receiver interface
* @dev Interface for any contract that wants to support safeTransfers
* from ERC721 asset contracts.
*/
interface IERC721Receiver {
/**
* @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
* by `operator` from `from`, this function is called.
*
* It must return its Solidity selector to confirm the token transfer.
* If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
*
* The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
*/
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"},{"internalType":"uint256","name":"collectionSize_","type":"uint256"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"string","name":"uri","type":"string"},{"internalType":"uint256","name":"_presaleStartDate","type":"uint256"},{"internalType":"uint256","name":"_whitelistStartDate","type":"uint256"},{"internalType":"uint256","name":"_publicSaleDate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"_mintAddress","type":"address"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getMaxPerTransaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPhase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint256","name":"passId","type":"uint256"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTx","type":"uint256"}],"name":"setMaxTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"verifySignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFund","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040526000600155600060085566f8b0a10e470000600c5567011c37937e080000600d553480156200003257600080fd5b5060405162003ca538038062003ca58339810160408190526200005591620002b5565b6040518060400160405280601181526020017022b63310283934b731b2b9b99021b63ab160791b8152506040518060400160405280600381526020016222a62360e91b81525087620000b6620000b0620001a560201b60201c565b620001a9565b60008111620001225760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b606482015260840160405180910390fd5b825162000137906002906020860190620001f9565b5081516200014d906003906020850190620001f9565b5060805250506001600955600a80546001600160a01b0319166001600160a01b038716179055601287905583516200018d90600b906020870190620001f9565b50600e92909255600f55601055506200042392505050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200020790620003e6565b90600052602060002090601f0160209004810192826200022b576000855562000276565b82601f106200024657805160ff191683800117855562000276565b8280016001018555821562000276579182015b828111156200027657825182559160200191906001019062000259565b506200028492915062000288565b5090565b5b8082111562000284576000815560010162000289565b634e487b7160e01b600052604160045260246000fd5b600080600080600080600060e0888a031215620002d157600080fd5b87516020808a015160408b01519299509750906001600160a01b0381168114620002fa57600080fd5b60608a01519096506001600160401b03808211156200031857600080fd5b818b0191508b601f8301126200032d57600080fd5b8151818111156200034257620003426200029f565b604051601f8201601f19908116603f011681019083821181831017156200036d576200036d6200029f565b816040528281528e868487010111156200038657600080fd5b600093505b82841015620003aa57848401860151818501870152928501926200038b565b82841115620003bc5760008684830101525b8099505050505050506080880151925060a0880151915060c0880151905092959891949750929550565b600181811c90821680620003fb57607f821691505b602082108114156200041d57634e487b7160e01b600052602260045260246000fd5b50919050565b6080516138586200044d600039600081816122b3015281816122e50152612b1b01526138586000f3fe6080604052600436106102ba5760003560e01c806391b7f5ed1161016e578063c87b56dd116100cb578063eced02801161007f578063f2fde38b11610064578063f2fde38b14610759578063f80af98414610779578063f968adbe1461079957600080fd5b8063eced02801461072e578063eced38731461074357600080fd5b8063dc33e681116100b0578063dc33e681146106b0578063e07fa3c1146106d0578063e985e9c5146106e557600080fd5b8063c87b56dd1461067a578063d7224ba01461069a57600080fd5b8063a0712d6811610122578063b88d4fde11610107578063b88d4fde14610624578063bc33718214610644578063c79804811461066457600080fd5b8063a0712d68146105f1578063a22cb4651461060457600080fd5b806395d89b411161015357806395d89b41146105b35780639b6860c8146105c85780639e852f75146105de57600080fd5b806391b7f5ed146105455780639231ab2a1461056557600080fd5b806342842e0e1161021c5780636372f6fe116101d0578063715018a6116101b5578063715018a6146104fc57806380a3a783146105115780638da5cb5b1461052757600080fd5b80636372f6fe146104bc57806370a08231146104dc57600080fd5b806355f804b31161020157806355f804b31461046957806358dd175d146104895780636352211e1461049c57600080fd5b806342842e0e146104295780634f6ccce71461044957600080fd5b806318160ddd116102735780632d1a12f6116102585780632d1a12f6146103c95780632d20fb60146103e95780632f745c591461040957600080fd5b806318160ddd1461039457806323b872dd146103a957600080fd5b806306fdde03116102a457806306fdde0314610318578063081812fc1461033a578063095ea7b31461037257600080fd5b80620e7fa8146102bf57806301ffc9a7146102e8575b600080fd5b3480156102cb57600080fd5b506102d5600c5481565b6040519081526020015b60405180910390f35b3480156102f457600080fd5b506103086103033660046131d3565b6107af565b60405190151581526020016102df565b34801561032457600080fd5b5061032d610880565b6040516102df9190613248565b34801561034657600080fd5b5061035a61035536600461325b565b610912565b6040516001600160a01b0390911681526020016102df565b34801561037e57600080fd5b5061039261038d36600461328b565b6109b2565b005b3480156103a057600080fd5b506001546102d5565b3480156103b557600080fd5b506103926103c43660046132b5565b610ae5565b3480156103d557600080fd5b506103926103e43660046132f1565b610af0565b3480156103f557600080fd5b5061039261040436600461325b565b610c33565b34801561041557600080fd5b506102d561042436600461328b565b610cf6565b34801561043557600080fd5b506103926104443660046132b5565b610e99565b34801561045557600080fd5b506102d561046436600461325b565b610eb4565b34801561047557600080fd5b5061039261048436600461331d565b610f37565b61039261049736600461338f565b610f9d565b3480156104a857600080fd5b5061035a6104b736600461325b565b6112d6565b3480156104c857600080fd5b506102d56104d736600461325b565b6112e8565b3480156104e857600080fd5b506102d56104f73660046133b1565b611338565b34801561050857600080fd5b506103926113e4565b34801561051d57600080fd5b506102d5600e5481565b34801561053357600080fd5b506000546001600160a01b031661035a565b34801561055157600080fd5b5061039261056036600461325b565b61144a565b34801561057157600080fd5b5061058561058036600461325b565b6114a9565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102df565b3480156105bf57600080fd5b5061032d6114c6565b3480156105d457600080fd5b506102d5600d5481565b6103926105ec36600461346f565b6114d5565b6103926105ff36600461325b565b61171f565b34801561061057600080fd5b5061039261061f3660046134b6565b61189a565b34801561063057600080fd5b5061039261063f3660046134f2565b61195f565b34801561065057600080fd5b5061039261065f36600461325b565b6119e8565b34801561067057600080fd5b506102d5600f5481565b34801561068657600080fd5b5061032d61069536600461325b565b611a47565b3480156106a657600080fd5b506102d560085481565b3480156106bc57600080fd5b506102d56106cb3660046133b1565b611b04565b3480156106dc57600080fd5b50610392611b0f565b3480156106f157600080fd5b5061030861070036600461355a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561073a57600080fd5b506102d5611b95565b34801561074f57600080fd5b506102d560105481565b34801561076557600080fd5b506103926107743660046133b1565b611be7565b34801561078557600080fd5b50610308610794366004613584565b611cc6565b3480156107a557600080fd5b506102d560125481565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061081257506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061084657506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061087a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606002805461088f906135b9565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb906135b9565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b600061091f826001541190565b6109965760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109bd826112d6565b9050806001600160a01b0316836001600160a01b03161415610a475760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f6572000000000000000000000000000000000000000000000000000000000000606482015260840161098d565b336001600160a01b0382161480610a635750610a638133610700565b610ad55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161098d565b610ae0838383611dc4565b505050565b610ae0838383611e38565b6000546001600160a01b03163314610b4a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b600082118015610b5c57506012548211155b610bb75760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792067726561746572207468616e206d6178206d696e7420616044820152651b1b1bddd95960d21b606482015260840161098d565b601154609690610bc79084612215565b1115610c155760405162461bcd60e51b815260206004820152600c60248201527f4c696d6974206578636565640000000000000000000000000000000000000000604482015260640161098d565b601154610c229083612215565b601155610c2f8183612228565b5050565b6000546001600160a01b03163314610c8d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b60026009541415610ce05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161098d565b6002600955610cee81612242565b506001600955565b6000610d0183611338565b8210610d755760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f6473000000000000000000000000000000000000000000000000000000000000606482015260840161098d565b6000610d8060015490565b905060008060005b83811015610e2a576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610ddb57805192505b876001600160a01b0316836001600160a01b03161415610e175786841415610e095750935061087a92505050565b83610e138161360a565b9450505b5080610e228161360a565b915050610d88565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e646578000000000000000000000000000000000000606482015260840161098d565b610ae08383836040518060200160405280600081525061195f565b6000610ebf60015490565b8210610f335760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e64730000000000000000000000000000000000000000000000000000000000606482015260840161098d565b5090565b6000546001600160a01b03163314610f915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b610ae0600b838361312d565b610fa5611b95565b600114610ff45760405162461bcd60e51b815260206004820152600e60248201527f50726573616c6520636c6f736564000000000000000000000000000000000000604482015260640161098d565b60008211801561100c5750611008816112e8565b8211155b6110675760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792067726561746572207468616e206d6178206d696e7420616044820152651b1b1bddd95960d21b606482015260840161098d565b3233146110b65760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161098d565b600a546040517efdd58e000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052916000916001600160a01b039091169062fdd58e90604401602060405180830381865afa158015611122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111469190613625565b90506000831180156111585750600081115b6111a45760405162461bcd60e51b815260206004820152601160248201527f4d697373696e67206d696e742070617373000000000000000000000000000000604482015260640161098d565b826001141561120b5760646111b883611338565b11156112065760405162461bcd60e51b815260206004820181905260248201527f596f75206861766520616c7265616479206d696e7465642031303020656c6673604482015260640161098d565b6112c6565b826002141561126d57601961121f83611338565b11156112065760405162461bcd60e51b815260206004820152601f60248201527f596f75206861766520616c7265616479206d696e74656420323520656c667300604482015260640161098d565b600a61127883611338565b11156112c65760405162461bcd60e51b815260206004820152601f60248201527f596f75206861766520616c7265616479206d696e74656420313020656c667300604482015260640161098d565b6112d03385612228565b50505050565b60006112e182612443565b5192915050565b6000600e54421180156112fc5750600f5442105b1561132b57816001141561131257506064919050565b816002141561132357506019919050565b50600a919050565b505060125490565b919050565b60006001600160a01b0382166113b65760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f2061646472657373000000000000000000000000000000000000000000606482015260840161098d565b506001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6000546001600160a01b0316331461143e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b61144860006125d9565b565b6000546001600160a01b031633146114a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b600d55565b604080518082019091526000808252602082015261087a82612443565b60606003805461088f906135b9565b6114dd611b95565b60021461152c5760405162461bcd60e51b815260206004820152601660248201527f57686974656c69737420706861736520636c6f73656400000000000000000000604482015260640161098d565b61153581611cc6565b6115815760405162461bcd60e51b815260206004820152600f60248201527f496e76616c696420616464726573730000000000000000000000000000000000604482015260640161098d565b600082118015611592575060038211155b6115ed5760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792067726561746572207468616e206d6178206d696e7420616044820152651b1b1bddd95960d21b606482015260840161098d565b600d546115fa9083612641565b34146116485760405162461bcd60e51b815260206004820152600d60248201527f496e76616c69642076616c756500000000000000000000000000000000000000604482015260640161098d565b3233146116975760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161098d565b60036116a233611338565b106117155760405162461bcd60e51b815260206004820152602f60248201527f57686974656c69737420616464726573732063616e206f6e6c7920636f6e746160448201527f696e207570746f203320454c4627730000000000000000000000000000000000606482015260840161098d565b610c2f3383612228565b611727611b95565b6003146117765760405162461bcd60e51b815260206004820152601260248201527f5075626c69632073616c6520636c6f7365640000000000000000000000000000604482015260640161098d565b60008111801561178857506012548111155b6117e35760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792067726561746572207468616e206d6178206d696e7420616044820152651b1b1bddd95960d21b606482015260840161098d565b3233146118325760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161098d565b600d5461183f9082612641565b341461188d5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c69642076616c756500000000000000000000000000000000000000604482015260640161098d565b6118973382612228565b50565b6001600160a01b0382163314156118f35760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161098d565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61196a848484611e38565b6119768484848461264d565b6112d05760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161098d565b6000546001600160a01b03163314611a425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b601255565b6060611a54826001541190565b611ac65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161098d565b6000611ad06127a2565b905080611adc846127b1565b604051602001611aed92919061363e565b604051602081830303815290604052915050919050565b600061087a826128e3565b6000546001600160a01b03163314611b695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b60405133904780156108fc02916000818181858888f19350505050158015611897573d6000803e3d6000fd5b6000600e54421015611ba75750600090565b600e5442118015611bb95750600f5442105b15611bc45750600190565b600f5442118015611bd6575060105442105b15611be15750600290565b50600390565b6000546001600160a01b03163314611c415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b6001600160a01b038116611cbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161098d565b611897816125d9565b6040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000030606090811b8216602084015233901b16603482015260009081906048016040516020818303038152906040528051906020012090506000611d8384611d7d846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906129a3565b9050806001600160a01b0316611da16000546001600160a01b031690565b6001600160a01b03161415611dba575060019392505050565b5060009392505050565b60008281526006602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611e4382612443565b80519091506000906001600160a01b0316336001600160a01b03161480611e7a575033611e6f84610912565b6001600160a01b0316145b80611e8c57508151611e8c9033610700565b905080611f015760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161098d565b846001600160a01b031682600001516001600160a01b031614611f8c5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e65720000000000000000000000000000000000000000000000000000606482015260840161098d565b6001600160a01b0384166120085760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161098d565b6120186000848460000151611dc4565b6001600160a01b03851660009081526005602052604081208054600192906120539084906fffffffffffffffffffffffffffffffff16613695565b82546101009290920a6fffffffffffffffffffffffffffffffff8181021990931691831602179091556001600160a01b038616600090815260056020526040812080546001945090926120a8918591166136c6565b82546fffffffffffffffffffffffffffffffff9182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556121398460016136fa565b6000818152600460205260409020549091506001600160a01b03166121cb57612163816001541190565b156121cb5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600061222182846136fa565b9392505050565b610c2f8282604051806020016040528060008152506129c7565b600854816122925760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161098d565b600060016122a084846136fa565b6122aa9190613712565b90506122d760017f0000000000000000000000000000000000000000000000000000000000000000613712565b81111561230c5761230960017f0000000000000000000000000000000000000000000000000000000000000000613712565b90505b612317816001541190565b6123895760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201527f6c65616e75700000000000000000000000000000000000000000000000000000606482015260840161098d565b815b81811161242f576000818152600460205260409020546001600160a01b031661241d5760006123b982612443565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806124278161360a565b91505061238b565b5061243b8160016136fa565b600855505050565b6040805180820190915260008082526020820152612462826001541190565b6124d45760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e00000000000000000000000000000000000000000000606482015260840161098d565b60006124df60125490565b8310612500576012546124f29084613712565b6124fd9060016136fa565b90505b825b81811061256a576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561255757949350505050565b508061256281613729565b915050612502565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000606482015260840161098d565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006122218284613740565b60006001600160a01b0384163b1561279657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061269190339089908890889060040161375f565b6020604051808303816000875af19250505080156126cc575060408051601f3d908101601f191682019092526126c99181019061379b565b60015b61277c573d8080156126fa576040519150601f19603f3d011682016040523d82523d6000602084013e6126ff565b606091505b5080516127745760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161098d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061279a565b5060015b949350505050565b6060600b805461088f906135b9565b6060816127f157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561281b57806128058161360a565b91506128149050600a836137ce565b91506127f5565b60008167ffffffffffffffff811115612836576128366133cc565b6040519080825280601f01601f191660200182016040528015612860576020820181803683370190505b5090505b841561279a57612875600183613712565b9150612882600a866137e2565b61288d9060306136fa565b60f81b8183815181106128a2576128a26137f6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506128dc600a866137ce565b9450612864565b60006001600160a01b0382166129615760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527f20746865207a65726f2061646472657373000000000000000000000000000000606482015260840161098d565b506001600160a01b031660009081526005602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b60008060006129b28585612dc3565b915091506129bf81612e33565b509392505050565b6001546001600160a01b038416612a465760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161098d565b612a51816001541190565b15612a9e5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161098d565b601254831115612b165760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f6768000000000000000000000000000000000000000000000000000000000000606482015260840161098d565b6001547f000000000000000000000000000000000000000000000000000000000000000090612b459085612215565b1115612b935760405162461bcd60e51b815260206004820152601260248201527f4d617820737570706c7920657863656564730000000000000000000000000000604482015260640161098d565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810191909152815180830190925280519091908190612c059087906136c6565b6fffffffffffffffffffffffffffffffff168152602001858360200151612c2c91906136c6565b6fffffffffffffffffffffffffffffffff9081169091526001600160a01b03808816600081815260056020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612db85760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d26600088848861264d565b612d985760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161098d565b81612da28161360a565b9250508080612db09061360a565b915050612cd9565b50600181905561220d565b600080825160411415612dfa5760208301516040840151606085015160001a612dee87828585612fee565b94509450505050612e2c565b825160401415612e245760208301516040840151612e198683836130db565b935093505050612e2c565b506000905060025b9250929050565b6000816004811115612e4757612e4761380c565b1415612e505750565b6001816004811115612e6457612e6461380c565b1415612eb25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161098d565b6002816004811115612ec657612ec661380c565b1415612f145760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161098d565b6003816004811115612f2857612f2861380c565b1415612f815760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161098d565b6004816004811115612f9557612f9561380c565b14156118975760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161098d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561302557506000905060036130d2565b8460ff16601b1415801561303d57508460ff16601c14155b1561304e57506000905060046130d2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156130a2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166130cb576000600192509250506130d2565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168161311160ff86901c601b6136fa565b905061311f87828885612fee565b935093505050935093915050565b828054613139906135b9565b90600052602060002090601f01602090048101928261315b57600085556131a1565b82601f106131745782800160ff198235161785556131a1565b828001600101855582156131a1579182015b828111156131a1578235825591602001919060010190613186565b50610f339291505b80821115610f3357600081556001016131a9565b6001600160e01b03198116811461189757600080fd5b6000602082840312156131e557600080fd5b8135612221816131bd565b60005b8381101561320b5781810151838201526020016131f3565b838111156112d05750506000910152565b600081518084526132348160208601602086016131f0565b601f01601f19169290920160200192915050565b602081526000612221602083018461321c565b60006020828403121561326d57600080fd5b5035919050565b80356001600160a01b038116811461133357600080fd5b6000806040838503121561329e57600080fd5b6132a783613274565b946020939093013593505050565b6000806000606084860312156132ca57600080fd5b6132d384613274565b92506132e160208501613274565b9150604084013590509250925092565b6000806040838503121561330457600080fd5b8235915061331460208401613274565b90509250929050565b6000806020838503121561333057600080fd5b823567ffffffffffffffff8082111561334857600080fd5b818501915085601f83011261335c57600080fd5b81358181111561336b57600080fd5b86602082850101111561337d57600080fd5b60209290920196919550909350505050565b600080604083850312156133a257600080fd5b50508035926020909101359150565b6000602082840312156133c357600080fd5b61222182613274565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126133f357600080fd5b813567ffffffffffffffff8082111561340e5761340e6133cc565b604051601f8301601f19908116603f01168101908282118183101715613436576134366133cc565b8160405283815286602085880101111561344f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561348257600080fd5b82359150602083013567ffffffffffffffff8111156134a057600080fd5b6134ac858286016133e2565b9150509250929050565b600080604083850312156134c957600080fd5b6134d283613274565b9150602083013580151581146134e757600080fd5b809150509250929050565b6000806000806080858703121561350857600080fd5b61351185613274565b935061351f60208601613274565b925060408501359150606085013567ffffffffffffffff81111561354257600080fd5b61354e878288016133e2565b91505092959194509250565b6000806040838503121561356d57600080fd5b61357683613274565b915061331460208401613274565b60006020828403121561359657600080fd5b813567ffffffffffffffff8111156135ad57600080fd5b61279a848285016133e2565b600181811c908216806135cd57607f821691505b602082108114156135ee57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561361e5761361e6135f4565b5060010190565b60006020828403121561363757600080fd5b5051919050565b600083516136508184602088016131f0565b8351908301906136648183602088016131f0565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006fffffffffffffffffffffffffffffffff838116908316818110156136be576136be6135f4565b039392505050565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156136f1576136f16135f4565b01949350505050565b6000821982111561370d5761370d6135f4565b500190565b600082821015613724576137246135f4565b500390565b600081613738576137386135f4565b506000190190565b600081600019048311821515161561375a5761375a6135f4565b500290565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613791608083018461321c565b9695505050505050565b6000602082840312156137ad57600080fd5b8151612221816131bd565b634e487b7160e01b600052601260045260246000fd5b6000826137dd576137dd6137b8565b500490565b6000826137f1576137f16137b8565b500690565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220fb536522012fdf4a65b4826d9b12f9bef2ed5a3fe4388355e4bcb95c5828189764736f6c634300080c0033000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000027100000000000000000000000006a74c2fd9f6762244887c2cf3090491c7f1bdb6f00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000623160c0000000000000000000000000000000000000000000000000000000006235554000000000000000000000000000000000000000000000000000000000623949c0000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6431377362717379637a3031736b2e636c6f756466726f6e742e6e65742f0000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102ba5760003560e01c806391b7f5ed1161016e578063c87b56dd116100cb578063eced02801161007f578063f2fde38b11610064578063f2fde38b14610759578063f80af98414610779578063f968adbe1461079957600080fd5b8063eced02801461072e578063eced38731461074357600080fd5b8063dc33e681116100b0578063dc33e681146106b0578063e07fa3c1146106d0578063e985e9c5146106e557600080fd5b8063c87b56dd1461067a578063d7224ba01461069a57600080fd5b8063a0712d6811610122578063b88d4fde11610107578063b88d4fde14610624578063bc33718214610644578063c79804811461066457600080fd5b8063a0712d68146105f1578063a22cb4651461060457600080fd5b806395d89b411161015357806395d89b41146105b35780639b6860c8146105c85780639e852f75146105de57600080fd5b806391b7f5ed146105455780639231ab2a1461056557600080fd5b806342842e0e1161021c5780636372f6fe116101d0578063715018a6116101b5578063715018a6146104fc57806380a3a783146105115780638da5cb5b1461052757600080fd5b80636372f6fe146104bc57806370a08231146104dc57600080fd5b806355f804b31161020157806355f804b31461046957806358dd175d146104895780636352211e1461049c57600080fd5b806342842e0e146104295780634f6ccce71461044957600080fd5b806318160ddd116102735780632d1a12f6116102585780632d1a12f6146103c95780632d20fb60146103e95780632f745c591461040957600080fd5b806318160ddd1461039457806323b872dd146103a957600080fd5b806306fdde03116102a457806306fdde0314610318578063081812fc1461033a578063095ea7b31461037257600080fd5b80620e7fa8146102bf57806301ffc9a7146102e8575b600080fd5b3480156102cb57600080fd5b506102d5600c5481565b6040519081526020015b60405180910390f35b3480156102f457600080fd5b506103086103033660046131d3565b6107af565b60405190151581526020016102df565b34801561032457600080fd5b5061032d610880565b6040516102df9190613248565b34801561034657600080fd5b5061035a61035536600461325b565b610912565b6040516001600160a01b0390911681526020016102df565b34801561037e57600080fd5b5061039261038d36600461328b565b6109b2565b005b3480156103a057600080fd5b506001546102d5565b3480156103b557600080fd5b506103926103c43660046132b5565b610ae5565b3480156103d557600080fd5b506103926103e43660046132f1565b610af0565b3480156103f557600080fd5b5061039261040436600461325b565b610c33565b34801561041557600080fd5b506102d561042436600461328b565b610cf6565b34801561043557600080fd5b506103926104443660046132b5565b610e99565b34801561045557600080fd5b506102d561046436600461325b565b610eb4565b34801561047557600080fd5b5061039261048436600461331d565b610f37565b61039261049736600461338f565b610f9d565b3480156104a857600080fd5b5061035a6104b736600461325b565b6112d6565b3480156104c857600080fd5b506102d56104d736600461325b565b6112e8565b3480156104e857600080fd5b506102d56104f73660046133b1565b611338565b34801561050857600080fd5b506103926113e4565b34801561051d57600080fd5b506102d5600e5481565b34801561053357600080fd5b506000546001600160a01b031661035a565b34801561055157600080fd5b5061039261056036600461325b565b61144a565b34801561057157600080fd5b5061058561058036600461325b565b6114a9565b6040805182516001600160a01b0316815260209283015167ffffffffffffffff1692810192909252016102df565b3480156105bf57600080fd5b5061032d6114c6565b3480156105d457600080fd5b506102d5600d5481565b6103926105ec36600461346f565b6114d5565b6103926105ff36600461325b565b61171f565b34801561061057600080fd5b5061039261061f3660046134b6565b61189a565b34801561063057600080fd5b5061039261063f3660046134f2565b61195f565b34801561065057600080fd5b5061039261065f36600461325b565b6119e8565b34801561067057600080fd5b506102d5600f5481565b34801561068657600080fd5b5061032d61069536600461325b565b611a47565b3480156106a657600080fd5b506102d560085481565b3480156106bc57600080fd5b506102d56106cb3660046133b1565b611b04565b3480156106dc57600080fd5b50610392611b0f565b3480156106f157600080fd5b5061030861070036600461355a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561073a57600080fd5b506102d5611b95565b34801561074f57600080fd5b506102d560105481565b34801561076557600080fd5b506103926107743660046133b1565b611be7565b34801561078557600080fd5b50610308610794366004613584565b611cc6565b3480156107a557600080fd5b506102d560125481565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061081257506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061084657506001600160e01b031982167f780e9d6300000000000000000000000000000000000000000000000000000000145b8061087a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b60606002805461088f906135b9565b80601f01602080910402602001604051908101604052809291908181526020018280546108bb906135b9565b80156109085780601f106108dd57610100808354040283529160200191610908565b820191906000526020600020905b8154815290600101906020018083116108eb57829003601f168201915b5050505050905090565b600061091f826001541190565b6109965760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201527f78697374656e7420746f6b656e0000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006109bd826112d6565b9050806001600160a01b0316836001600160a01b03161415610a475760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201527f6572000000000000000000000000000000000000000000000000000000000000606482015260840161098d565b336001600160a01b0382161480610a635750610a638133610700565b610ad55760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606482015260840161098d565b610ae0838383611dc4565b505050565b610ae0838383611e38565b6000546001600160a01b03163314610b4a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b600082118015610b5c57506012548211155b610bb75760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792067726561746572207468616e206d6178206d696e7420616044820152651b1b1bddd95960d21b606482015260840161098d565b601154609690610bc79084612215565b1115610c155760405162461bcd60e51b815260206004820152600c60248201527f4c696d6974206578636565640000000000000000000000000000000000000000604482015260640161098d565b601154610c229083612215565b601155610c2f8183612228565b5050565b6000546001600160a01b03163314610c8d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b60026009541415610ce05760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161098d565b6002600955610cee81612242565b506001600955565b6000610d0183611338565b8210610d755760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60448201527f6473000000000000000000000000000000000000000000000000000000000000606482015260840161098d565b6000610d8060015490565b905060008060005b83811015610e2a576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610ddb57805192505b876001600160a01b0316836001600160a01b03161415610e175786841415610e095750935061087a92505050565b83610e138161360a565b9450505b5080610e228161360a565b915050610d88565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201527f6f776e657220627920696e646578000000000000000000000000000000000000606482015260840161098d565b610ae08383836040518060200160405280600081525061195f565b6000610ebf60015490565b8210610f335760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560448201527f6e64730000000000000000000000000000000000000000000000000000000000606482015260840161098d565b5090565b6000546001600160a01b03163314610f915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b610ae0600b838361312d565b610fa5611b95565b600114610ff45760405162461bcd60e51b815260206004820152600e60248201527f50726573616c6520636c6f736564000000000000000000000000000000000000604482015260640161098d565b60008211801561100c5750611008816112e8565b8211155b6110675760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792067726561746572207468616e206d6178206d696e7420616044820152651b1b1bddd95960d21b606482015260840161098d565b3233146110b65760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161098d565b600a546040517efdd58e000000000000000000000000000000000000000000000000000000008152336004820181905260248201849052916000916001600160a01b039091169062fdd58e90604401602060405180830381865afa158015611122573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111469190613625565b90506000831180156111585750600081115b6111a45760405162461bcd60e51b815260206004820152601160248201527f4d697373696e67206d696e742070617373000000000000000000000000000000604482015260640161098d565b826001141561120b5760646111b883611338565b11156112065760405162461bcd60e51b815260206004820181905260248201527f596f75206861766520616c7265616479206d696e7465642031303020656c6673604482015260640161098d565b6112c6565b826002141561126d57601961121f83611338565b11156112065760405162461bcd60e51b815260206004820152601f60248201527f596f75206861766520616c7265616479206d696e74656420323520656c667300604482015260640161098d565b600a61127883611338565b11156112c65760405162461bcd60e51b815260206004820152601f60248201527f596f75206861766520616c7265616479206d696e74656420313020656c667300604482015260640161098d565b6112d03385612228565b50505050565b60006112e182612443565b5192915050565b6000600e54421180156112fc5750600f5442105b1561132b57816001141561131257506064919050565b816002141561132357506019919050565b50600a919050565b505060125490565b919050565b60006001600160a01b0382166113b65760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201527f65726f2061646472657373000000000000000000000000000000000000000000606482015260840161098d565b506001600160a01b03166000908152600560205260409020546fffffffffffffffffffffffffffffffff1690565b6000546001600160a01b0316331461143e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b61144860006125d9565b565b6000546001600160a01b031633146114a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b600d55565b604080518082019091526000808252602082015261087a82612443565b60606003805461088f906135b9565b6114dd611b95565b60021461152c5760405162461bcd60e51b815260206004820152601660248201527f57686974656c69737420706861736520636c6f73656400000000000000000000604482015260640161098d565b61153581611cc6565b6115815760405162461bcd60e51b815260206004820152600f60248201527f496e76616c696420616464726573730000000000000000000000000000000000604482015260640161098d565b600082118015611592575060038211155b6115ed5760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792067726561746572207468616e206d6178206d696e7420616044820152651b1b1bddd95960d21b606482015260840161098d565b600d546115fa9083612641565b34146116485760405162461bcd60e51b815260206004820152600d60248201527f496e76616c69642076616c756500000000000000000000000000000000000000604482015260640161098d565b3233146116975760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161098d565b60036116a233611338565b106117155760405162461bcd60e51b815260206004820152602f60248201527f57686974656c69737420616464726573732063616e206f6e6c7920636f6e746160448201527f696e207570746f203320454c4627730000000000000000000000000000000000606482015260840161098d565b610c2f3383612228565b611727611b95565b6003146117765760405162461bcd60e51b815260206004820152601260248201527f5075626c69632073616c6520636c6f7365640000000000000000000000000000604482015260640161098d565b60008111801561178857506012548111155b6117e35760405162461bcd60e51b815260206004820152602660248201527f5175616e746974792067726561746572207468616e206d6178206d696e7420616044820152651b1b1bddd95960d21b606482015260840161098d565b3233146118325760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161098d565b600d5461183f9082612641565b341461188d5760405162461bcd60e51b815260206004820152600d60248201527f496e76616c69642076616c756500000000000000000000000000000000000000604482015260640161098d565b6118973382612228565b50565b6001600160a01b0382163314156118f35760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604482015260640161098d565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61196a848484611e38565b6119768484848461264d565b6112d05760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161098d565b6000546001600160a01b03163314611a425760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b601255565b6060611a54826001541190565b611ac65760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000606482015260840161098d565b6000611ad06127a2565b905080611adc846127b1565b604051602001611aed92919061363e565b604051602081830303815290604052915050919050565b600061087a826128e3565b6000546001600160a01b03163314611b695760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b60405133904780156108fc02916000818181858888f19350505050158015611897573d6000803e3d6000fd5b6000600e54421015611ba75750600090565b600e5442118015611bb95750600f5442105b15611bc45750600190565b600f5442118015611bd6575060105442105b15611be15750600290565b50600390565b6000546001600160a01b03163314611c415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161098d565b6001600160a01b038116611cbd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161098d565b611897816125d9565b6040517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000030606090811b8216602084015233901b16603482015260009081906048016040516020818303038152906040528051906020012090506000611d8384611d7d846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b906129a3565b9050806001600160a01b0316611da16000546001600160a01b031690565b6001600160a01b03161415611dba575060019392505050565b5060009392505050565b60008281526006602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611e4382612443565b80519091506000906001600160a01b0316336001600160a01b03161480611e7a575033611e6f84610912565b6001600160a01b0316145b80611e8c57508151611e8c9033610700565b905080611f015760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000606482015260840161098d565b846001600160a01b031682600001516001600160a01b031614611f8c5760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f727265637460448201527f206f776e65720000000000000000000000000000000000000000000000000000606482015260840161098d565b6001600160a01b0384166120085760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f20616460448201527f6472657373000000000000000000000000000000000000000000000000000000606482015260840161098d565b6120186000848460000151611dc4565b6001600160a01b03851660009081526005602052604081208054600192906120539084906fffffffffffffffffffffffffffffffff16613695565b82546101009290920a6fffffffffffffffffffffffffffffffff8181021990931691831602179091556001600160a01b038616600090815260056020526040812080546001945090926120a8918591166136c6565b82546fffffffffffffffffffffffffffffffff9182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556121398460016136fa565b6000818152600460205260409020549091506001600160a01b03166121cb57612163816001541190565b156121cb5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff9081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600061222182846136fa565b9392505050565b610c2f8282604051806020016040528060008152506129c7565b600854816122925760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f0000000000000000604482015260640161098d565b600060016122a084846136fa565b6122aa9190613712565b90506122d760017f0000000000000000000000000000000000000000000000000000000000002710613712565b81111561230c5761230960017f0000000000000000000000000000000000000000000000000000000000002710613712565b90505b612317816001541190565b6123895760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201527f6c65616e75700000000000000000000000000000000000000000000000000000606482015260840161098d565b815b81811161242f576000818152600460205260409020546001600160a01b031661241d5760006123b982612443565b60408051808201825282516001600160a01b03908116825260209384015167ffffffffffffffff9081168584019081526000888152600490965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b806124278161360a565b91505061238b565b5061243b8160016136fa565b600855505050565b6040805180820190915260008082526020820152612462826001541190565b6124d45760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360448201527f74656e7420746f6b656e00000000000000000000000000000000000000000000606482015260840161098d565b60006124df60125490565b8310612500576012546124f29084613712565b6124fd9060016136fa565b90505b825b81811061256a576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff16918301919091521561255757949350505050565b508061256281613729565b915050612502565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000606482015260840161098d565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006122218284613740565b60006001600160a01b0384163b1561279657604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061269190339089908890889060040161375f565b6020604051808303816000875af19250505080156126cc575060408051601f3d908101601f191682019092526126c99181019061379b565b60015b61277c573d8080156126fa576040519150601f19603f3d011682016040523d82523d6000602084013e6126ff565b606091505b5080516127745760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161098d565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061279a565b5060015b949350505050565b6060600b805461088f906135b9565b6060816127f157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561281b57806128058161360a565b91506128149050600a836137ce565b91506127f5565b60008167ffffffffffffffff811115612836576128366133cc565b6040519080825280601f01601f191660200182016040528015612860576020820181803683370190505b5090505b841561279a57612875600183613712565b9150612882600a866137e2565b61288d9060306136fa565b60f81b8183815181106128a2576128a26137f6565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506128dc600a866137ce565b9450612864565b60006001600160a01b0382166129615760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527f20746865207a65726f2061646472657373000000000000000000000000000000606482015260840161098d565b506001600160a01b031660009081526005602052604090205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690565b60008060006129b28585612dc3565b915091506129bf81612e33565b509392505050565b6001546001600160a01b038416612a465760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f2061646472657360448201527f7300000000000000000000000000000000000000000000000000000000000000606482015260840161098d565b612a51816001541190565b15612a9e5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604482015260640161098d565b601254831115612b165760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960448201527f6768000000000000000000000000000000000000000000000000000000000000606482015260840161098d565b6001547f000000000000000000000000000000000000000000000000000000000000271090612b459085612215565b1115612b935760405162461bcd60e51b815260206004820152601260248201527f4d617820737570706c7920657863656564730000000000000000000000000000604482015260640161098d565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810191909152815180830190925280519091908190612c059087906136c6565b6fffffffffffffffffffffffffffffffff168152602001858360200151612c2c91906136c6565b6fffffffffffffffffffffffffffffffff9081169091526001600160a01b03808816600081815260056020908152604080832087519783015187167001000000000000000000000000000000000297909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612db85760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612d26600088848861264d565b612d985760405162461bcd60e51b815260206004820152603360248201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260448201527f6563656976657220696d706c656d656e74657200000000000000000000000000606482015260840161098d565b81612da28161360a565b9250508080612db09061360a565b915050612cd9565b50600181905561220d565b600080825160411415612dfa5760208301516040840151606085015160001a612dee87828585612fee565b94509450505050612e2c565b825160401415612e245760208301516040840151612e198683836130db565b935093505050612e2c565b506000905060025b9250929050565b6000816004811115612e4757612e4761380c565b1415612e505750565b6001816004811115612e6457612e6461380c565b1415612eb25760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161098d565b6002816004811115612ec657612ec661380c565b1415612f145760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161098d565b6003816004811115612f2857612f2861380c565b1415612f815760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161098d565b6004816004811115612f9557612f9561380c565b14156118975760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161098d565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561302557506000905060036130d2565b8460ff16601b1415801561303d57508460ff16601c14155b1561304e57506000905060046130d2565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156130a2573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166130cb576000600192509250506130d2565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168161311160ff86901c601b6136fa565b905061311f87828885612fee565b935093505050935093915050565b828054613139906135b9565b90600052602060002090601f01602090048101928261315b57600085556131a1565b82601f106131745782800160ff198235161785556131a1565b828001600101855582156131a1579182015b828111156131a1578235825591602001919060010190613186565b50610f339291505b80821115610f3357600081556001016131a9565b6001600160e01b03198116811461189757600080fd5b6000602082840312156131e557600080fd5b8135612221816131bd565b60005b8381101561320b5781810151838201526020016131f3565b838111156112d05750506000910152565b600081518084526132348160208601602086016131f0565b601f01601f19169290920160200192915050565b602081526000612221602083018461321c565b60006020828403121561326d57600080fd5b5035919050565b80356001600160a01b038116811461133357600080fd5b6000806040838503121561329e57600080fd5b6132a783613274565b946020939093013593505050565b6000806000606084860312156132ca57600080fd5b6132d384613274565b92506132e160208501613274565b9150604084013590509250925092565b6000806040838503121561330457600080fd5b8235915061331460208401613274565b90509250929050565b6000806020838503121561333057600080fd5b823567ffffffffffffffff8082111561334857600080fd5b818501915085601f83011261335c57600080fd5b81358181111561336b57600080fd5b86602082850101111561337d57600080fd5b60209290920196919550909350505050565b600080604083850312156133a257600080fd5b50508035926020909101359150565b6000602082840312156133c357600080fd5b61222182613274565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126133f357600080fd5b813567ffffffffffffffff8082111561340e5761340e6133cc565b604051601f8301601f19908116603f01168101908282118183101715613436576134366133cc565b8160405283815286602085880101111561344f57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561348257600080fd5b82359150602083013567ffffffffffffffff8111156134a057600080fd5b6134ac858286016133e2565b9150509250929050565b600080604083850312156134c957600080fd5b6134d283613274565b9150602083013580151581146134e757600080fd5b809150509250929050565b6000806000806080858703121561350857600080fd5b61351185613274565b935061351f60208601613274565b925060408501359150606085013567ffffffffffffffff81111561354257600080fd5b61354e878288016133e2565b91505092959194509250565b6000806040838503121561356d57600080fd5b61357683613274565b915061331460208401613274565b60006020828403121561359657600080fd5b813567ffffffffffffffff8111156135ad57600080fd5b61279a848285016133e2565b600181811c908216806135cd57607f821691505b602082108114156135ee57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561361e5761361e6135f4565b5060010190565b60006020828403121561363757600080fd5b5051919050565b600083516136508184602088016131f0565b8351908301906136648183602088016131f0565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b60006fffffffffffffffffffffffffffffffff838116908316818110156136be576136be6135f4565b039392505050565b60006fffffffffffffffffffffffffffffffff8083168185168083038211156136f1576136f16135f4565b01949350505050565b6000821982111561370d5761370d6135f4565b500190565b600082821015613724576137246135f4565b500390565b600081613738576137386135f4565b506000190190565b600081600019048311821515161561375a5761375a6135f4565b500290565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613791608083018461321c565b9695505050505050565b6000602082840312156137ad57600080fd5b8151612221816131bd565b634e487b7160e01b600052601260045260246000fd5b6000826137dd576137dd6137b8565b500490565b6000826137f1576137f16137b8565b500690565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052602160045260246000fdfea2646970667358221220fb536522012fdf4a65b4826d9b12f9bef2ed5a3fe4388355e4bcb95c5828189764736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000027100000000000000000000000006a74c2fd9f6762244887c2cf3090491c7f1bdb6f00000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000623160c0000000000000000000000000000000000000000000000000000000006235554000000000000000000000000000000000000000000000000000000000623949c0000000000000000000000000000000000000000000000000000000000000002668747470733a2f2f6431377362717379637a3031736b2e636c6f756466726f6e742e6e65742f0000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _maxPerTx (uint256): 100
Arg [1] : collectionSize_ (uint256): 10000
Arg [2] : _address (address): 0x6A74c2FD9f6762244887c2cf3090491C7F1bDB6F
Arg [3] : uri (string): https://d17sbqsycz01sk.cloudfront.net/
Arg [4] : _presaleStartDate (uint256): 1647403200
Arg [5] : _whitelistStartDate (uint256): 1647662400
Arg [6] : _publicSaleDate (uint256): 1647921600
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [1] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [2] : 0000000000000000000000006a74c2fd9f6762244887c2cf3090491c7f1bdb6f
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [4] : 00000000000000000000000000000000000000000000000000000000623160c0
Arg [5] : 0000000000000000000000000000000000000000000000000000000062355540
Arg [6] : 00000000000000000000000000000000000000000000000000000000623949c0
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000026
Arg [8] : 68747470733a2f2f6431377362717379637a3031736b2e636c6f756466726f6e
Arg [9] : 742e6e65742f0000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
358:5008:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;553:40;;;;;;;;;;;;;;;;;;;160:25:15;;;148:2;133:18;553:40:5;;;;;;;;3833:370:4;;;;;;;;;;-1:-1:-1;3833:370:4;;;;;:::i;:::-;;:::i;:::-;;;793:14:15;;786:22;768:41;;756:2;741:18;3833:370:4;628:187:15;5642:94:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;7124:204::-;;;;;;;;;;-1:-1:-1;7124:204:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1920:55:15;;;1902:74;;1890:2;1875:18;7124:204:4;1756:226:15;6687:379:4;;;;;;;;;;-1:-1:-1;6687:379:4;;;;;:::i;:::-;;:::i;:::-;;2394:94;;;;;;;;;;-1:-1:-1;2470:12:4;;2394:94;;7974:142;;;;;;;;;;-1:-1:-1;7974:142:4;;;;;:::i;:::-;;:::i;1265:303:5:-;;;;;;;;;;-1:-1:-1;1265:303:5;;;;;:::i;:::-;;:::i;4979:118::-;;;;;;;;;;-1:-1:-1;4979:118:5;;;;;:::i;:::-;;:::i;3025:744:4:-;;;;;;;;;;-1:-1:-1;3025:744:4;;;;;:::i;:::-;;:::i;8179:157::-;;;;;;;;;;-1:-1:-1;8179:157:4;;;;;:::i;:::-;;:::i;2557:177::-;;;;;;;;;;-1:-1:-1;2557:177:4;;;;;:::i;:::-;;:::i;4761:100:5:-;;;;;;;;;;-1:-1:-1;4761:100:5;;;;;:::i;:::-;;:::i;2407:777::-;;;;;;:::i;:::-;;:::i;5378:118:4:-;;;;;;;;;;-1:-1:-1;5378:118:4;;;;;:::i;:::-;;:::i;1670:377:5:-;;;;;;;;;;-1:-1:-1;1670:377:5;;;;;:::i;:::-;;:::i;4259:211:4:-;;;;;;;;;;-1:-1:-1;4259:211:4;;;;;:::i;:::-;;:::i;1714:103:11:-;;;;;;;;;;;;;:::i;648:31:5:-;;;;;;;;;;;;;;;;1063:87:11;;;;;;;;;;-1:-1:-1;1109:7:11;1136:6;-1:-1:-1;;;;;1136:6:11;1063:87;;1574:90:5;;;;;;;;;;-1:-1:-1;1574:90:5;;;;;:::i;:::-;;:::i;5216:147::-;;;;;;;;;;-1:-1:-1;5216:147:5;;;;;:::i;:::-;;:::i;:::-;;;;4310:13:15;;-1:-1:-1;;;;;4306:62:15;4288:81;;4429:4;4417:17;;;4411:24;4437:18;4407:49;4385:20;;;4378:79;;;;4261:18;5216:147:5;4080:383:15;5797:98:4;;;;;;;;;;;;;:::i;598:43:5:-;;;;;;;;;;;;;;;;3518:549;;;;;;:::i;:::-;;:::i;4071:374::-;;;;;;:::i;:::-;;:::i;7392:274:4:-;;;;;;;;;;-1:-1:-1;7392:274:4;;;;;:::i;:::-;;:::i;8399:311::-;;;;;;;;;;-1:-1:-1;8399:311:4;;;;;:::i;:::-;;:::i;4673:82:5:-;;;;;;;;;;-1:-1:-1;4673:82:5;;;;;:::i;:::-;;:::i;684:33::-;;;;;;;;;;;;;;;;5958:351:4;;;;;;;;;;-1:-1:-1;5958:351:4;;;;;:::i;:::-;;:::i;12894:43::-;;;;;;;;;;;;;;;;5103:107:5;;;;;;;;;;-1:-1:-1;5103:107:5;;;;;:::i;:::-;;:::i;4867:106::-;;;;;;;;;;;;;:::i;7729:186:4:-;;;;;;;;;;-1:-1:-1;7729:186:4;;;;;:::i;:::-;-1:-1:-1;;;;;7874:25:4;;;7851:4;7874:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;7729:186;2051:352:5;;;;;;;;;;;;;:::i;722:29::-;;;;;;;;;;;;;;;;1972:201:11;;;;;;;;;;-1:-1:-1;1972:201:11;;;;;:::i;:::-;;:::i;3188:326:5:-;;;;;;;;;;-1:-1:-1;3188:326:5;;;;;:::i;:::-;;:::i;774:23::-;;;;;;;;;;;;;;;;3833:370:4;3960:4;-1:-1:-1;;;;;;3990:40:4;;4005:25;3990:40;;:99;;-1:-1:-1;;;;;;;4041:48:4;;4056:33;4041:48;3990:99;:160;;;-1:-1:-1;;;;;;;4100:50:4;;4115:35;4100:50;3990:160;:207;;;-1:-1:-1;978:25:3;-1:-1:-1;;;;;;963:40:3;;;4161:36:4;3976:221;3833:370;-1:-1:-1;;3833:370:4:o;5642:94::-;5696:13;5725:5;5718:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5642:94;:::o;7124:204::-;7192:7;7216:16;7224:7;9036:12;;-1:-1:-1;9026:22:4;8949:105;7216:16;7208:74;;;;-1:-1:-1;;;7208:74:4;;7901:2:15;7208:74:4;;;7883:21:15;7940:2;7920:18;;;7913:30;7979:34;7959:18;;;7952:62;8050:15;8030:18;;;8023:43;8083:19;;7208:74:4;;;;;;;;;-1:-1:-1;7298:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;7298:24:4;;7124:204::o;6687:379::-;6756:13;6772:24;6788:7;6772:15;:24::i;:::-;6756:40;;6817:5;-1:-1:-1;;;;;6811:11:4;:2;-1:-1:-1;;;;;6811:11:4;;;6803:58;;;;-1:-1:-1;;;6803:58:4;;8315:2:15;6803:58:4;;;8297:21:15;8354:2;8334:18;;;8327:30;8393:34;8373:18;;;8366:62;8464:4;8444:18;;;8437:32;8486:19;;6803:58:4;8113:398:15;6803:58:4;736:10:1;-1:-1:-1;;;;;6886:21:4;;;;:62;;-1:-1:-1;6911:37:4;6928:5;736:10:1;7729:186:4;:::i;6911:37::-;6870:153;;;;-1:-1:-1;;;6870:153:4;;8718:2:15;6870:153:4;;;8700:21:15;8757:2;8737:18;;;8730:30;8796:34;8776:18;;;8769:62;8867:27;8847:18;;;8840:55;8912:19;;6870:153:4;8516:421:15;6870:153:4;7032:28;7041:2;7045:7;7054:5;7032:8;:28::i;:::-;6749:317;6687:379;;:::o;7974:142::-;8082:28;8092:4;8098:2;8102:7;8082:9;:28::i;1265:303:5:-;1109:7:11;1136:6;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;9144:2:15;1275:68:11;;;9126:21:15;;;9163:18;;;9156:30;9222:34;9202:18;;;9195:62;9274:18;;1275:68:11;8942:356:15;1275:68:11;1364:1:5::1;1355:8;:10;:36;;;;-1:-1:-1::0;4653:8:5;;1369::::1;:22;;1355:36;1347:88;;;::::0;-1:-1:-1;;;1347:88:5;;9505:2:15;1347:88:5::1;::::0;::::1;9487:21:15::0;9544:2;9524:18;;;9517:30;9583:34;9563:18;;;9556:62;-1:-1:-1;;;9634:18:15;;;9627:36;9680:19;;1347:88:5::1;9303:402:15::0;1347:88:5::1;1450:5;::::0;1471:3:::1;::::0;1450:19:::1;::::0;1460:8;1450:9:::1;:19::i;:::-;:24;;1442:48;;;::::0;-1:-1:-1;;;1442:48:5;;9912:2:15;1442:48:5::1;::::0;::::1;9894:21:15::0;9951:2;9931:18;;;9924:30;9990:14;9970:18;;;9963:42;10022:18;;1442:48:5::1;9710:336:15::0;1442:48:5::1;1503:5;::::0;:19:::1;::::0;1513:8;1503:9:::1;:19::i;:::-;1497:5;:25:::0;1529:33:::1;1539:12:::0;1553:8;1529:9:::1;:33::i;:::-;1265:303:::0;;:::o;4979:118::-;1109:7:11;1136:6;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;9144:2:15;1275:68:11;;;9126:21:15;;;9163:18;;;9156:30;9222:34;9202:18;;;9195:62;9274:18;;1275:68:11;8942:356:15;1275:68:11;1778:1:12::1;2376:7;;:19;;2368:63;;;::::0;-1:-1:-1;;;2368:63:12;;10253:2:15;2368:63:12::1;::::0;::::1;10235:21:15::0;10292:2;10272:18;;;10265:30;10331:33;10311:18;;;10304:61;10382:18;;2368:63:12::1;10051:355:15::0;2368:63:12::1;1778:1;2509:7;:18:::0;5063:28:5::2;5082:8:::0;5063:18:::2;:28::i;:::-;-1:-1:-1::0;1734:1:12::1;2688:7;:22:::0;4979:118:5:o;3025:744:4:-;3134:7;3169:16;3179:5;3169:9;:16::i;:::-;3161:5;:24;3153:71;;;;-1:-1:-1;;;3153:71:4;;10613:2:15;3153:71:4;;;10595:21:15;10652:2;10632:18;;;10625:30;10691:34;10671:18;;;10664:62;10762:4;10742:18;;;10735:32;10784:19;;3153:71:4;10411:398:15;3153:71:4;3231:22;3256:13;2470:12;;;2394:94;3256:13;3231:38;;3276:19;3306:25;3356:9;3351:350;3375:14;3371:1;:18;3351:350;;;3405:31;3439:14;;;:11;:14;;;;;;;;;3405:48;;;;;;;;;-1:-1:-1;;;;;3405:48:4;;;;;-1:-1:-1;;;3405:48:4;;;;;;;;;;;;3466:28;3462:89;;3527:14;;;-1:-1:-1;3462:89:4;3584:5;-1:-1:-1;;;;;3563:26:4;:17;-1:-1:-1;;;;;3563:26:4;;3559:135;;;3621:5;3606:11;:20;3602:59;;;-1:-1:-1;3648:1:4;-1:-1:-1;3641:8:4;;-1:-1:-1;;;3641:8:4;3602:59;3671:13;;;;:::i;:::-;;;;3559:135;-1:-1:-1;3391:3:4;;;;:::i;:::-;;;;3351:350;;;-1:-1:-1;3707:56:4;;-1:-1:-1;;;3707:56:4;;11345:2:15;3707:56:4;;;11327:21:15;11384:2;11364:18;;;11357:30;11423:34;11403:18;;;11396:62;11494:16;11474:18;;;11467:44;11528:19;;3707:56:4;11143:410:15;8179:157:4;8291:39;8308:4;8314:2;8318:7;8291:39;;;;;;;;;;;;:16;:39::i;2557:177::-;2624:7;2656:13;2470:12;;;2394:94;2656:13;2648:5;:21;2640:69;;;;-1:-1:-1;;;2640:69:4;;11760:2:15;2640:69:4;;;11742:21:15;11799:2;11779:18;;;11772:30;11838:34;11818:18;;;11811:62;11909:5;11889:18;;;11882:33;11932:19;;2640:69:4;11558:399:15;2640:69:4;-1:-1:-1;2723:5:4;2557:177::o;4761:100:5:-;1109:7:11;1136:6;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;9144:2:15;1275:68:11;;;9126:21:15;;;9163:18;;;9156:30;9222:34;9202:18;;;9195:62;9274:18;;1275:68:11;8942:356:15;1275:68:11;4832:23:5::1;:13;4848:7:::0;;4832:23:::1;:::i;2407:777::-:0;2492:10;:8;:10::i;:::-;2504:1;2492:13;2484:39;;;;-1:-1:-1;;;2484:39:5;;12164:2:15;2484:39:5;;;12146:21:15;12203:2;12183:18;;;12176:30;12242:16;12222:18;;;12215:44;12276:18;;2484:39:5;11962:338:15;2484:39:5;2545:1;2536:8;:10;:54;;;;;2562:28;2583:6;2562:20;:28::i;:::-;2550:8;:40;;2536:54;2528:106;;;;-1:-1:-1;;;2528:106:5;;9505:2:15;2528:106:5;;;9487:21:15;9544:2;9524:18;;;9517:30;9583:34;9563:18;;;9556:62;-1:-1:-1;;;9634:18:15;;;9627:36;9680:19;;2528:106:5;9303:402:15;2528:106:5;2647:9;2660:10;2647:23;2639:66;;;;-1:-1:-1;;;2639:66:5;;12507:2:15;2639:66:5;;;12489:21:15;12546:2;12526:18;;;12519:30;12585:32;12565:18;;;12558:60;12635:18;;2639:66:5;12305:354:15;2639:66:5;2761:8;;:34;;;;;2725:10;2761:34;;;12838:74:15;;;12928:18;;;12921:34;;;2725:10:5;2710:14;;-1:-1:-1;;;;;2761:8:5;;;;:18;;12811::15;;2761:34:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2740:55;;2817:1;2808:6;:10;:28;;;;;2835:1;2822:12;:14;2808:28;2800:57;;;;-1:-1:-1;;;2800:57:5;;13357:2:15;2800:57:5;;;13339:21:15;13396:2;13376:18;;;13369:30;13435:19;13415:18;;;13408:47;13472:18;;2800:57:5;13155:341:15;2800:57:5;2865:6;2873:1;2865:9;2862:282;;;2915:3;2894:17;2904:6;2894:9;:17::i;:::-;:24;;2886:68;;;;-1:-1:-1;;;2886:68:5;;13703:2:15;2886:68:5;;;13685:21:15;;;13722:18;;;13715:30;13781:34;13761:18;;;13754:62;13833:18;;2886:68:5;13501:356:15;2886:68:5;2862:282;;;2968:6;2976:1;2968:9;2965:179;;;3018:2;2997:17;3007:6;2997:9;:17::i;:::-;:23;;2989:66;;;;-1:-1:-1;;;2989:66:5;;14064:2:15;2989:66:5;;;14046:21:15;14103:2;14083:18;;;14076:30;14142:33;14122:18;;;14115:61;14193:18;;2989:66:5;13862:355:15;2965:179:5;3101:2;3080:17;3090:6;3080:9;:17::i;:::-;:23;;3072:66;;;;-1:-1:-1;;;3072:66:5;;14424:2:15;3072:66:5;;;14406:21:15;14463:2;14443:18;;;14436:30;14502:33;14482:18;;;14475:61;14553:18;;3072:66:5;14222:355:15;3072:66:5;3149:31;3159:10;3171:8;3149:9;:31::i;:::-;2479:705;;2407:777;;:::o;5378:118:4:-;5442:7;5465:20;5477:7;5465:11;:20::i;:::-;:25;;5378:118;-1:-1:-1;;5378:118:4:o;1670:377:5:-;1731:7;1768:16;;1750:15;:34;:72;;;;;1804:18;;1788:15;:34;1750:72;1747:297;;;1843:3;1848:1;1843:6;1840:159;;;-1:-1:-1;1883:3:5;;1670:377;-1:-1:-1;1670:377:5:o;1840:159::-;1906:3;1911:1;1906:6;1903:96;;;-1:-1:-1;1945:2:5;;1670:377;-1:-1:-1;1670:377:5:o;1903:96::-;-1:-1:-1;1985:2:5;;1670:377;-1:-1:-1;1670:377:5:o;1747:297::-;-1:-1:-1;;2028:8:5;;;1670:377::o;1747:297::-;1670:377;;;:::o;4259:211:4:-;4323:7;-1:-1:-1;;;;;4347:19:4;;4339:75;;;;-1:-1:-1;;;4339:75:4;;14784:2:15;4339:75:4;;;14766:21:15;14823:2;14803:18;;;14796:30;14862:34;14842:18;;;14835:62;14933:13;14913:18;;;14906:41;14964:19;;4339:75:4;14582:407:15;4339:75:4;-1:-1:-1;;;;;;4436:19:4;;;;;:12;:19;;;;;:27;;;;4259:211::o;1714:103:11:-;1109:7;1136:6;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;9144:2:15;1275:68:11;;;9126:21:15;;;9163:18;;;9156:30;9222:34;9202:18;;;9195:62;9274:18;;1275:68:11;8942:356:15;1275:68:11;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;1574:90:5:-;1109:7:11;1136:6;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;9144:2:15;1275:68:11;;;9126:21:15;;;9163:18;;;9156:30;9222:34;9202:18;;;9195:62;9274:18;;1275:68:11;8942:356:15;1275:68:11;1634:15:5::1;:24:::0;1574:90::o;5216:147::-;-1:-1:-1;;;;;;;;;;;;;;;;;5337:20:5;5349:7;5337:11;:20::i;5797:98:4:-;5853:13;5882:7;5875:14;;;;;:::i;3518:549:5:-;3614:10;:8;:10::i;:::-;3626:1;3614:13;3606:47;;;;-1:-1:-1;;;3606:47:5;;15196:2:15;3606:47:5;;;15178:21:15;15235:2;15215:18;;;15208:30;15274:24;15254:18;;;15247:52;15316:18;;3606:47:5;14994:346:15;3606:47:5;3666:27;3682:10;3666:15;:27::i;:::-;3658:54;;;;-1:-1:-1;;;3658:54:5;;15547:2:15;3658:54:5;;;15529:21:15;15586:2;15566:18;;;15559:30;15625:17;15605:18;;;15598:45;15660:18;;3658:54:5;15345:339:15;3658:54:5;3734:1;3725:8;:10;:27;;;;;3751:1;3739:8;:13;;3725:27;3717:78;;;;-1:-1:-1;;;3717:78:5;;9505:2:15;3717:78:5;;;9487:21:15;9544:2;9524:18;;;9517:30;9583:34;9563:18;;;9556:62;-1:-1:-1;;;9634:18:15;;;9627:36;9680:19;;3717:78:5;9303:402:15;3717:78:5;3821:15;;:29;;3841:8;3821:19;:29::i;:::-;3808:9;:42;3800:68;;;;-1:-1:-1;;;3800:68:5;;15891:2:15;3800:68:5;;;15873:21:15;15930:2;15910:18;;;15903:30;15969:15;15949:18;;;15942:43;16002:18;;3800:68:5;15689:337:15;3800:68:5;3881:9;3894:10;3881:23;3873:66;;;;-1:-1:-1;;;3873:66:5;;12507:2:15;3873:66:5;;;12489:21:15;12546:2;12526:18;;;12519:30;12585:32;12565:18;;;12558:60;12635:18;;3873:66:5;12305:354:15;3873:66:5;3974:1;3952:21;3962:10;3952:9;:21::i;:::-;:23;3944:82;;;;-1:-1:-1;;;3944:82:5;;16233:2:15;3944:82:5;;;16215:21:15;16272:2;16252:18;;;16245:30;16311:34;16291:18;;;16284:62;16382:17;16362:18;;;16355:45;16417:19;;3944:82:5;16031:411:15;3944:82:5;4032:31;4042:10;4054:8;4032:9;:31::i;4071:374::-;4133:10;:8;:10::i;:::-;4145:1;4133:13;4125:43;;;;-1:-1:-1;;;4125:43:5;;16649:2:15;4125:43:5;;;16631:21:15;16688:2;16668:18;;;16661:30;16727:20;16707:18;;;16700:48;16765:18;;4125:43:5;16447:342:15;4125:43:5;4190:1;4181:8;:10;:36;;;;-1:-1:-1;4653:8:5;;4195;:22;;4181:36;4173:88;;;;-1:-1:-1;;;4173:88:5;;9505:2:15;4173:88:5;;;9487:21:15;9544:2;9524:18;;;9517:30;9583:34;9563:18;;;9556:62;-1:-1:-1;;;9634:18:15;;;9627:36;9680:19;;4173:88:5;9303:402:15;4173:88:5;4274:9;4287:10;4274:23;4266:66;;;;-1:-1:-1;;;4266:66:5;;12507:2:15;4266:66:5;;;12489:21:15;12546:2;12526:18;;;12519:30;12585:32;12565:18;;;12558:60;12635:18;;4266:66:5;12305:354:15;4266:66:5;4358:15;;:29;;4378:8;4358:19;:29::i;:::-;4345:9;:42;4337:68;;;;-1:-1:-1;;;4337:68:5;;15891:2:15;4337:68:5;;;15873:21:15;15930:2;15910:18;;;15903:30;15969:15;15949:18;;;15942:43;16002:18;;4337:68:5;15689:337:15;4337:68:5;4410:31;4420:10;4432:8;4410:9;:31::i;:::-;4071:374;:::o;7392:274:4:-;-1:-1:-1;;;;;7483:24:4;;736:10:1;7483:24:4;;7475:63;;;;-1:-1:-1;;;7475:63:4;;16996:2:15;7475:63:4;;;16978:21:15;17035:2;17015:18;;;17008:30;17074:28;17054:18;;;17047:56;17120:18;;7475:63:4;16794:350:15;7475:63:4;736:10:1;7547:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;7547:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;7547:53:4;;;;;;;;;;7612:48;;768:41:15;;;7547:42:4;;736:10:1;7612:48:4;;741:18:15;7612:48:4;;;;;;;7392:274;;:::o;8399:311::-;8536:28;8546:4;8552:2;8556:7;8536:9;:28::i;:::-;8587:48;8610:4;8616:2;8620:7;8629:5;8587:22;:48::i;:::-;8571:133;;;;-1:-1:-1;;;8571:133:4;;17351:2:15;8571:133:4;;;17333:21:15;17390:2;17370:18;;;17363:30;17429:34;17409:18;;;17402:62;17500:21;17480:18;;;17473:49;17539:19;;8571:133:4;17149:415:15;4673:82:5;1109:7:11;1136:6;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;9144:2:15;1275:68:11;;;9126:21:15;;;9163:18;;;9156:30;9222:34;9202:18;;;9195:62;9274:18;;1275:68:11;8942:356:15;1275:68:11;4734:8:5::1;:15:::0;4673:82::o;5958:351:4:-;6056:13;6097:16;6105:7;9036:12;;-1:-1:-1;9026:22:4;8949:105;6097:16;6081:97;;;;-1:-1:-1;;;6081:97:4;;17771:2:15;6081:97:4;;;17753:21:15;17810:2;17790:18;;;17783:30;17849:34;17829:18;;;17822:62;17920:17;17900:18;;;17893:45;17955:19;;6081:97:4;17569:411:15;6081:97:4;6187:21;6211:10;:8;:10::i;:::-;6187:34;;6259:7;6267:25;6284:7;6267:16;:25::i;:::-;6242:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6228:75;;;5958:351;;;:::o;5103:107:5:-;5161:7;5184:20;5198:5;5184:13;:20::i;4867:106::-;1109:7:11;1136:6;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;9144:2:15;1275:68:11;;;9126:21:15;;;9163:18;;;9156:30;9222:34;9202:18;;;9195:62;9274:18;;1275:68:11;8942:356:15;1275:68:11;4916:51:5::1;::::0;4924:10:::1;::::0;4945:21:::1;4916:51:::0;::::1;;;::::0;::::1;::::0;;;4945:21;4924:10;4916:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;2051:352:::0;2092:7;2127:16;;2111:15;:32;2108:292;;;-1:-1:-1;2162:1:5;;2051:352::o;2108:292::-;2193:16;;2177:15;:32;:70;;;;;2229:18;;2213:15;:34;2177:70;2174:226;;;-1:-1:-1;2266:1:5;;2051:352::o;2174:226::-;2297:18;;2281:15;:34;:68;;;;;2335:14;;2319:15;:30;2281:68;2278:122;;;-1:-1:-1;2368:1:5;;2051:352::o;2278:122::-;-1:-1:-1;2393:1:5;;2051:352::o;1972:201:11:-;1109:7;1136:6;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;9144:2:15;1275:68:11;;;9126:21:15;;;9163:18;;;9156:30;9222:34;9202:18;;;9195:62;9274:18;;1275:68:11;8942:356:15;1275:68:11;-1:-1:-1;;;;;2061:22:11;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:11;;18829:2:15;2053:73:11::1;::::0;::::1;18811:21:15::0;18868:2;18848:18;;;18841:30;18907:34;18887:18;;;18880:62;18978:8;18958:18;;;18951:36;19004:19;;2053:73:11::1;18627:402:15::0;2053:73:11::1;2137:28;2156:8;2137:18;:28::i;3188:326:5:-:0;3303:43;;19201:66:15;3328:4:5;19296:2:15;19292:15;;;19288:24;;3303:43:5;;;19276:37:15;3335:10:5;19347:15:15;;19343:24;19329:12;;;19322:46;3259:4:5;;;;19384:12:15;;3303:43:5;;;;;;;;;;;;3293:54;;;;;;3271:76;;3352:14;3369:57;3415:10;3369:36;:11;8412:58:2;;25363:66:15;8412:58:2;;;25351:79:15;25446:12;;;25439:28;;;8279:7:2;;25483:12:15;;8412:58:2;;;;;;;;;;;;8402:69;;;;;;8395:76;;8210:269;;;;3369:36:5;:44;;:57::i;:::-;3352:74;;3446:6;-1:-1:-1;;;;;3435:17:5;:7;1109::11;1136:6;-1:-1:-1;;;;;1136:6:11;;1063:87;3435:7:5;-1:-1:-1;;;;;3435:17:5;;3431:80;;;-1:-1:-1;3470:4:5;;3188:326;-1:-1:-1;;;3188:326:5:o;3431:80::-;-1:-1:-1;3500:5:5;;3188:326;-1:-1:-1;;;3188:326:5:o;12716:172:4:-;12813:24;;;;:15;:24;;;;;;:29;;;;-1:-1:-1;;;;;12813:29:4;;;;;;;;;12854:28;;12813:24;;12854:28;;;;;;;12716:172;;;:::o;11081:1529::-;11178:35;11216:20;11228:7;11216:11;:20::i;:::-;11287:18;;11178:58;;-1:-1:-1;11245:22:4;;-1:-1:-1;;;;;11271:34:4;736:10:1;-1:-1:-1;;;;;11271:34:4;;:81;;;-1:-1:-1;736:10:1;11316:20:4;11328:7;11316:11;:20::i;:::-;-1:-1:-1;;;;;11316:36:4;;11271:81;:142;;;-1:-1:-1;11380:18:4;;11363:50;;736:10:1;7729:186:4;:::i;11363:50::-;11245:169;;11439:17;11423:101;;;;-1:-1:-1;;;11423:101:4;;19609:2:15;11423:101:4;;;19591:21:15;19648:2;19628:18;;;19621:30;19687:34;19667:18;;;19660:62;19758:20;19738:18;;;19731:48;19796:19;;11423:101:4;19407:414:15;11423:101:4;11571:4;-1:-1:-1;;;;;11549:26:4;:13;:18;;;-1:-1:-1;;;;;11549:26:4;;11533:98;;;;-1:-1:-1;;;11533:98:4;;20028:2:15;11533:98:4;;;20010:21:15;20067:2;20047:18;;;20040:30;20106:34;20086:18;;;20079:62;20177:8;20157:18;;;20150:36;20203:19;;11533:98:4;19826:402:15;11533:98:4;-1:-1:-1;;;;;11646:16:4;;11638:66;;;;-1:-1:-1;;;11638:66:4;;20435:2:15;11638:66:4;;;20417:21:15;20474:2;20454:18;;;20447:30;20513:34;20493:18;;;20486:62;20584:7;20564:18;;;20557:35;20609:19;;11638:66:4;20233:401:15;11638:66:4;11813:49;11830:1;11834:7;11843:13;:18;;;11813:8;:49::i;:::-;-1:-1:-1;;;;;11871:18:4;;;;;;:12;:18;;;;;:31;;11901:1;;11871:18;:31;;11901:1;;11871:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11909:16:4;;-1:-1:-1;11909:16:4;;;:12;:16;;;;;:29;;-1:-1:-1;;;11909:16:4;;:29;;-1:-1:-1;;11909:29:4;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11968:43:4;;;;;;;;-1:-1:-1;;;;;11968:43:4;;;;;;11994:15;11968:43;;;;;;;;;-1:-1:-1;11945:20:4;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;11945:66:4;-1:-1:-1;;;;;;11945:66:4;;;;;;;;;;;12261:11;11957:7;-1:-1:-1;12261:11:4;:::i;:::-;12324:1;12283:24;;;:11;:24;;;;;:29;12239:33;;-1:-1:-1;;;;;;12283:29:4;12279:236;;12341:20;12349:11;9036:12;;-1:-1:-1;9026:22:4;8949:105;12341:20;12337:171;;;12401:97;;;;;;;;12428:18;;-1:-1:-1;;;;;12401:97:4;;;;;;12459:28;;;;12401:97;;;;;;;;;;-1:-1:-1;12374:24:4;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;12374:124:4;-1:-1:-1;;;;;;12374:124:4;;;;;;;;;;;;12337:171;12547:7;12543:2;-1:-1:-1;;;;;12528:27:4;12537:4;-1:-1:-1;;;;;12528:27:4;;;;;;;;;;;12562:42;11171:1439;;;11081:1529;;;:::o;2835:98:13:-;2893:7;2920:5;2924:1;2920;:5;:::i;:::-;2913:12;2835:98;-1:-1:-1;;;2835:98:13:o;9060::4:-;9125:27;9135:2;9139:8;9125:27;;;;;;;;;;;;:9;:27::i;13042:846::-;13132:24;;13171:12;13163:49;;;;-1:-1:-1;;;13163:49:4;;21483:2:15;13163:49:4;;;21465:21:15;21522:2;21502:18;;;21495:30;21561:26;21541:18;;;21534:54;21605:18;;13163:49:4;21281:348:15;13163:49:4;13219:16;13269:1;13238:28;13258:8;13238:17;:28;:::i;:::-;:32;;;;:::i;:::-;13219:51;-1:-1:-1;13292:18:4;13309:1;13292:14;:18;:::i;:::-;13281:8;:29;13277:81;;;13332:18;13349:1;13332:14;:18;:::i;:::-;13321:29;;13277:81;13473:17;13481:8;9036:12;;-1:-1:-1;9026:22:4;8949:105;13473:17;13465:68;;;;-1:-1:-1;;;13465:68:4;;21966:2:15;13465:68:4;;;21948:21:15;22005:2;21985:18;;;21978:30;22044:34;22024:18;;;22017:62;22115:8;22095:18;;;22088:36;22141:19;;13465:68:4;21764:402:15;13465:68:4;13557:17;13540:297;13581:8;13576:1;:13;13540:297;;13640:1;13609:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;13609:19:4;13605:225;;13655:31;13689:14;13701:1;13689:11;:14::i;:::-;13731:89;;;;;;;;13758:14;;-1:-1:-1;;;;;13731:89:4;;;;;;13785:24;;;;13731:89;;;;;;;;;;-1:-1:-1;13714:14:4;;;:11;:14;;;;;;;:106;;;;;;;;;-1:-1:-1;;;13714:106:4;-1:-1:-1;;;;;;13714:106:4;;;;;;;;;;;;-1:-1:-1;13605:225:4;13591:3;;;;:::i;:::-;;;;13540:297;;;-1:-1:-1;13870:12:4;:8;13881:1;13870:12;:::i;:::-;13843:24;:39;-1:-1:-1;;;13042:846:4:o;4722:602::-;-1:-1:-1;;;;;;;;;;;;;;;;;4839:16:4;4847:7;9036:12;;-1:-1:-1;9026:22:4;8949:105;4839:16;4831:71;;;;-1:-1:-1;;;4831:71:4;;22373:2:15;4831:71:4;;;22355:21:15;22412:2;22392:18;;;22385:30;22451:34;22431:18;;;22424:62;22522:12;22502:18;;;22495:40;22552:19;;4831:71:4;22171:406:15;4831:71:4;4911:26;4959:10;4653:8:5;;;4565:102;4959:10:4;4948:7;:21;4944:89;;4653:8:5;;5001:20:4;;:7;:20;:::i;:::-;:24;;5024:1;5001:24;:::i;:::-;4980:45;;4944:89;5061:7;5041:212;5078:18;5070:4;:26;5041:212;;5115:31;5149:17;;;:11;:17;;;;;;;;;5115:51;;;;;;;;;-1:-1:-1;;;;;5115:51:4;;;;;-1:-1:-1;;;5115:51:4;;;;;;;;;;;;5179:28;5175:71;;5227:9;4722:602;-1:-1:-1;;;;4722:602:4:o;5175:71::-;-1:-1:-1;5098:6:4;;;;:::i;:::-;;;;5041:212;;;-1:-1:-1;5261:57:4;;-1:-1:-1;;;5261:57:4;;22925:2:15;5261:57:4;;;22907:21:15;22964:2;22944:18;;;22937:30;23003:34;22983:18;;;22976:62;23074:17;23054:18;;;23047:45;23109:19;;5261:57:4;22723:411:15;2333:191:11;2407:16;2426:6;;-1:-1:-1;;;;;2443:17:11;;;;;;;;;;2476:40;;2426:6;;;;;;;2476:40;;2407:16;2476:40;2396:128;2333:191;:::o;3573:98:13:-;3631:7;3658:5;3662:1;3658;:5;:::i;14431:690:4:-;14568:4;-1:-1:-1;;;;;14585:13:4;;1120:20:0;1168:8;14581:535:4;;14624:72;;-1:-1:-1;;;14624:72:4;;-1:-1:-1;;;;;14624:36:4;;;;;:72;;736:10:1;;14675:4:4;;14681:7;;14690:5;;14624:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14624:72:4;;;;;;;;-1:-1:-1;;14624:72:4;;;;;;;;;;;;:::i;:::-;;;14611:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14855:13:4;;14851:215;;14888:61;;-1:-1:-1;;;14888:61:4;;17351:2:15;14888:61:4;;;17333:21:15;17390:2;17370:18;;;17363:30;17429:34;17409:18;;;17402:62;17500:21;17480:18;;;17473:49;17539:19;;14888:61:4;17149:415:15;14851:215:4;15034:6;15028:13;15019:6;15015:2;15011:15;15004:38;14611:464;-1:-1:-1;;;;;;14746:55:4;-1:-1:-1;;;14746:55:4;;-1:-1:-1;14739:62:4;;14581:535;-1:-1:-1;15104:4:4;14581:535;14431:690;;;;;;:::o;4451:108:5:-;4511:13;4540;4533:20;;;;;:::i;342:723:14:-;398:13;619:10;615:53;;-1:-1:-1;;646:10:14;;;;;;;;;;;;;;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:14;;-1:-1:-1;798:2:14;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:14;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:14;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1003:11:14;1012:2;1003:11;;:::i;:::-;;;872:154;;4476:240:4;4537:7;-1:-1:-1;;;;;4569:19:4;;4553:102;;;;-1:-1:-1;;;4553:102:4;;24905:2:15;4553:102:4;;;24887:21:15;24944:2;24924:18;;;24917:30;24983:34;24963:18;;;24956:62;25054:19;25034:18;;;25027:47;25091:19;;4553:102:4;24703:413:15;4553:102:4;-1:-1:-1;;;;;;4677:19:4;;;;;:12;:19;;;;;:32;;;;;;;4476:240::o;4408:231:2:-;4486:7;4507:17;4526:18;4548:27;4559:4;4565:9;4548:10;:27::i;:::-;4506:69;;;;4586:18;4598:5;4586:11;:18::i;:::-;-1:-1:-1;4622:9:2;4408:231;-1:-1:-1;;;4408:231:2:o;9497:1352:4:-;9625:12;;-1:-1:-1;;;;;9652:16:4;;9644:62;;;;-1:-1:-1;;;9644:62:4;;25708:2:15;9644:62:4;;;25690:21:15;25747:2;25727:18;;;25720:30;25786:34;25766:18;;;25759:62;25857:3;25837:18;;;25830:31;25878:19;;9644:62:4;25506:397:15;9644:62:4;9843:21;9851:12;9036;;-1:-1:-1;9026:22:4;8949:105;9843:21;9842:22;9834:64;;;;-1:-1:-1;;;9834:64:4;;26110:2:15;9834:64:4;;;26092:21:15;26149:2;26129:18;;;26122:30;26188:31;26168:18;;;26161:59;26237:18;;9834:64:4;25908:353:15;9834:64:4;4653:8:5;;9913::4;:22;;9905:69;;;;-1:-1:-1;;;9905:69:4;;26468:2:15;9905:69:4;;;26450:21:15;26507:2;26487:18;;;26480:30;26546:34;26526:18;;;26519:62;26617:4;26597:18;;;26590:32;26639:19;;9905:69:4;26266:398:15;9905:69:4;9989:12;;10019:14;;9989:26;;10006:8;9989:16;:26::i;:::-;:44;;9981:75;;;;-1:-1:-1;;;9981:75:4;;26871:2:15;9981:75:4;;;26853:21:15;26910:2;26890:18;;;26883:30;26949:20;26929:18;;;26922:48;26987:18;;9981:75:4;26669:342:15;9981:75:4;-1:-1:-1;;;;;10168:16:4;;10135:30;10168:16;;;:12;:16;;;;;;;;;10135:49;;;;;;;;;;;;;;;;;;;;;;;;;;;10210:119;;;;;;;;10230:19;;10135:49;;10210:119;;;10230:39;;10260:8;;10230:39;:::i;:::-;10210:119;;;;;;10313:8;10278:11;:24;;;:44;;;;:::i;:::-;10210:119;;;;;;;-1:-1:-1;;;;;10191:16:4;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;10364:43;;;;;;;;;;;10390:15;10364:43;;;;;;;;10336:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;10336:71:4;-1:-1:-1;;;;;;10336:71:4;;;;;;;;;;;;;;;;;;10348:12;;10460:281;10484:8;10480:1;:12;10460:281;;;10513:38;;10538:12;;-1:-1:-1;;;;;10513:38:4;;;10530:1;;10513:38;;10530:1;;10513:38;10578:59;10609:1;10613:2;10617:12;10631:5;10578:22;:59::i;:::-;10560:150;;;;-1:-1:-1;;;10560:150:4;;17351:2:15;10560:150:4;;;17333:21:15;17390:2;17370:18;;;17363:30;17429:34;17409:18;;;17402:62;17500:21;17480:18;;;17473:49;17539:19;;10560:150:4;17149:415:15;10560:150:4;10719:14;;;;:::i;:::-;;;;10494:3;;;;;:::i;:::-;;;;10460:281;;;-1:-1:-1;10749:12:4;:27;;;10783:60;2407:777:5;2298:1308:2;2379:7;2388:12;2613:9;:16;2633:2;2613:22;2609:990;;;2909:4;2894:20;;2888:27;2959:4;2944:20;;2938:27;3017:4;3002:20;;2996:27;2652:9;2988:36;3060:25;3071:4;2988:36;2888:27;2938;3060:10;:25::i;:::-;3053:32;;;;;;;;;2609:990;3107:9;:16;3127:2;3107:22;3103:496;;;3382:4;3367:20;;3361:27;3433:4;3418:20;;3412:27;3475:23;3486:4;3361:27;3412;3475:10;:23::i;:::-;3468:30;;;;;;;;3103:496;-1:-1:-1;3547:1:2;;-1:-1:-1;3551:35:2;3103:496;2298:1308;;;;;:::o;569:643::-;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:571;;;569:643;:::o;634:571::-;745:29;736:5;:38;;;;;;;;:::i;:::-;;732:473;;;791:34;;-1:-1:-1;;;791:34:2;;27407:2:15;791:34:2;;;27389:21:15;27446:2;27426:18;;;27419:30;27485:26;27465:18;;;27458:54;27529:18;;791:34:2;27205:348:15;732:473:2;856:35;847:5;:44;;;;;;;;:::i;:::-;;843:362;;;908:41;;-1:-1:-1;;;908:41:2;;27760:2:15;908:41:2;;;27742:21:15;27799:2;27779:18;;;27772:30;27838:33;27818:18;;;27811:61;27889:18;;908:41:2;27558:355:15;843:362:2;980:30;971:5;:39;;;;;;;;:::i;:::-;;967:238;;;1027:44;;-1:-1:-1;;;1027:44:2;;28120:2:15;1027:44:2;;;28102:21:15;28159:2;28139:18;;;28132:30;28198:34;28178:18;;;28171:62;-1:-1:-1;;;28249:18:15;;;28242:32;28291:19;;1027:44:2;27918:398:15;967:238:2;1102:30;1093:5;:39;;;;;;;;:::i;:::-;;1089:116;;;1149:44;;-1:-1:-1;;;1149:44:2;;28523:2:15;1149:44:2;;;28505:21:15;28562:2;28542:18;;;28535:30;28601:34;28581:18;;;28574:62;-1:-1:-1;;;28652:18:15;;;28645:32;28694:19;;1149:44:2;28321:398:15;5860:1632:2;5991:7;;6925:66;6912:79;;6908:163;;;-1:-1:-1;7024:1:2;;-1:-1:-1;7028:30:2;7008:51;;6908:163;7085:1;:7;;7090:2;7085:7;;:18;;;;;7096:1;:7;;7101:2;7096:7;;7085:18;7081:102;;;-1:-1:-1;7136:1:2;;-1:-1:-1;7140:30:2;7120:51;;7081:102;7297:24;;;7280:14;7297:24;;;;;;;;;28951:25:15;;;29024:4;29012:17;;28992:18;;;28985:45;;;;29046:18;;;29039:34;;;29089:18;;;29082:34;;;7297:24:2;;28923:19:15;;7297:24:2;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7297:24:2;;-1:-1:-1;;7297:24:2;;;-1:-1:-1;;;;;;;7336:20:2;;7332:103;;7389:1;7393:29;7373:50;;;;;;;7332:103;7455:6;-1:-1:-1;7463:20:2;;-1:-1:-1;5860:1632:2;;;;;;;;:::o;4902:344::-;5016:7;;5075:66;5062:80;;5016:7;5169:25;5185:3;5170:18;;;5192:2;5169:25;:::i;:::-;5153:42;;5213:25;5224:4;5230:1;5233;5236;5213:10;:25::i;:::-;5206:32;;;;;;4902:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;196:177:15;-1:-1:-1;;;;;;274:5:15;270:78;263:5;260:89;250:117;;363:1;360;353:12;378:245;436:6;489:2;477:9;468:7;464:23;460:32;457:52;;;505:1;502;495:12;457:52;544:9;531:23;563:30;587:5;563:30;:::i;820:258::-;892:1;902:113;916:6;913:1;910:13;902:113;;;992:11;;;986:18;973:11;;;966:39;938:2;931:10;902:113;;;1033:6;1030:1;1027:13;1024:48;;;-1:-1:-1;;1068:1:15;1050:16;;1043:27;820:258::o;1083:::-;1125:3;1163:5;1157:12;1190:6;1185:3;1178:19;1206:63;1262:6;1255:4;1250:3;1246:14;1239:4;1232:5;1228:16;1206:63;:::i;:::-;1323:2;1302:15;-1:-1:-1;;1298:29:15;1289:39;;;;1330:4;1285:50;;1083:258;-1:-1:-1;;1083:258:15:o;1346:220::-;1495:2;1484:9;1477:21;1458:4;1515:45;1556:2;1545:9;1541:18;1533:6;1515:45;:::i;1571:180::-;1630:6;1683:2;1671:9;1662:7;1658:23;1654:32;1651:52;;;1699:1;1696;1689:12;1651:52;-1:-1:-1;1722:23:15;;1571:180;-1:-1:-1;1571:180:15:o;1987:196::-;2055:20;;-1:-1:-1;;;;;2104:54:15;;2094:65;;2084:93;;2173:1;2170;2163:12;2188:254;2256:6;2264;2317:2;2305:9;2296:7;2292:23;2288:32;2285:52;;;2333:1;2330;2323:12;2285:52;2356:29;2375:9;2356:29;:::i;:::-;2346:39;2432:2;2417:18;;;;2404:32;;-1:-1:-1;;;2188:254:15:o;2447:328::-;2524:6;2532;2540;2593:2;2581:9;2572:7;2568:23;2564:32;2561:52;;;2609:1;2606;2599:12;2561:52;2632:29;2651:9;2632:29;:::i;:::-;2622:39;;2680:38;2714:2;2703:9;2699:18;2680:38;:::i;:::-;2670:48;;2765:2;2754:9;2750:18;2737:32;2727:42;;2447:328;;;;;:::o;2780:254::-;2848:6;2856;2909:2;2897:9;2888:7;2884:23;2880:32;2877:52;;;2925:1;2922;2915:12;2877:52;2961:9;2948:23;2938:33;;2990:38;3024:2;3013:9;3009:18;2990:38;:::i;:::-;2980:48;;2780:254;;;;;:::o;3039:592::-;3110:6;3118;3171:2;3159:9;3150:7;3146:23;3142:32;3139:52;;;3187:1;3184;3177:12;3139:52;3227:9;3214:23;3256:18;3297:2;3289:6;3286:14;3283:34;;;3313:1;3310;3303:12;3283:34;3351:6;3340:9;3336:22;3326:32;;3396:7;3389:4;3385:2;3381:13;3377:27;3367:55;;3418:1;3415;3408:12;3367:55;3458:2;3445:16;3484:2;3476:6;3473:14;3470:34;;;3500:1;3497;3490:12;3470:34;3545:7;3540:2;3531:6;3527:2;3523:15;3519:24;3516:37;3513:57;;;3566:1;3563;3556:12;3513:57;3597:2;3589:11;;;;;3619:6;;-1:-1:-1;3039:592:15;;-1:-1:-1;;;;3039:592:15:o;3636:248::-;3704:6;3712;3765:2;3753:9;3744:7;3740:23;3736:32;3733:52;;;3781:1;3778;3771:12;3733:52;-1:-1:-1;;3804:23:15;;;3874:2;3859:18;;;3846:32;;-1:-1:-1;3636:248:15:o;3889:186::-;3948:6;4001:2;3989:9;3980:7;3976:23;3972:32;3969:52;;;4017:1;4014;4007:12;3969:52;4040:29;4059:9;4040:29;:::i;4468:184::-;-1:-1:-1;;;4517:1:15;4510:88;4617:4;4614:1;4607:15;4641:4;4638:1;4631:15;4657:718;4699:5;4752:3;4745:4;4737:6;4733:17;4729:27;4719:55;;4770:1;4767;4760:12;4719:55;4806:6;4793:20;4832:18;4869:2;4865;4862:10;4859:36;;;4875:18;;:::i;:::-;4950:2;4944:9;4918:2;5004:13;;-1:-1:-1;;5000:22:15;;;5024:2;4996:31;4992:40;4980:53;;;5048:18;;;5068:22;;;5045:46;5042:72;;;5094:18;;:::i;:::-;5134:10;5130:2;5123:22;5169:2;5161:6;5154:18;5215:3;5208:4;5203:2;5195:6;5191:15;5187:26;5184:35;5181:55;;;5232:1;5229;5222:12;5181:55;5296:2;5289:4;5281:6;5277:17;5270:4;5262:6;5258:17;5245:54;5343:1;5336:4;5331:2;5323:6;5319:15;5315:26;5308:37;5363:6;5354:15;;;;;;4657:718;;;;:::o;5380:388::-;5457:6;5465;5518:2;5506:9;5497:7;5493:23;5489:32;5486:52;;;5534:1;5531;5524:12;5486:52;5570:9;5557:23;5547:33;;5631:2;5620:9;5616:18;5603:32;5658:18;5650:6;5647:30;5644:50;;;5690:1;5687;5680:12;5644:50;5713:49;5754:7;5745:6;5734:9;5730:22;5713:49;:::i;:::-;5703:59;;;5380:388;;;;;:::o;5773:347::-;5838:6;5846;5899:2;5887:9;5878:7;5874:23;5870:32;5867:52;;;5915:1;5912;5905:12;5867:52;5938:29;5957:9;5938:29;:::i;:::-;5928:39;;6017:2;6006:9;6002:18;5989:32;6064:5;6057:13;6050:21;6043:5;6040:32;6030:60;;6086:1;6083;6076:12;6030:60;6109:5;6099:15;;;5773:347;;;;;:::o;6125:537::-;6220:6;6228;6236;6244;6297:3;6285:9;6276:7;6272:23;6268:33;6265:53;;;6314:1;6311;6304:12;6265:53;6337:29;6356:9;6337:29;:::i;:::-;6327:39;;6385:38;6419:2;6408:9;6404:18;6385:38;:::i;:::-;6375:48;;6470:2;6459:9;6455:18;6442:32;6432:42;;6525:2;6514:9;6510:18;6497:32;6552:18;6544:6;6541:30;6538:50;;;6584:1;6581;6574:12;6538:50;6607:49;6648:7;6639:6;6628:9;6624:22;6607:49;:::i;:::-;6597:59;;;6125:537;;;;;;;:::o;6667:260::-;6735:6;6743;6796:2;6784:9;6775:7;6771:23;6767:32;6764:52;;;6812:1;6809;6802:12;6764:52;6835:29;6854:9;6835:29;:::i;:::-;6825:39;;6883:38;6917:2;6906:9;6902:18;6883:38;:::i;6932:320::-;7000:6;7053:2;7041:9;7032:7;7028:23;7024:32;7021:52;;;7069:1;7066;7059:12;7021:52;7109:9;7096:23;7142:18;7134:6;7131:30;7128:50;;;7174:1;7171;7164:12;7128:50;7197:49;7238:7;7229:6;7218:9;7214:22;7197:49;:::i;7257:437::-;7336:1;7332:12;;;;7379;;;7400:61;;7454:4;7446:6;7442:17;7432:27;;7400:61;7507:2;7499:6;7496:14;7476:18;7473:38;7470:218;;;-1:-1:-1;;;7541:1:15;7534:88;7645:4;7642:1;7635:15;7673:4;7670:1;7663:15;7470:218;;7257:437;;;:::o;10814:184::-;-1:-1:-1;;;10863:1:15;10856:88;10963:4;10960:1;10953:15;10987:4;10984:1;10977:15;11003:135;11042:3;-1:-1:-1;;11063:17:15;;11060:43;;;11083:18;;:::i;:::-;-1:-1:-1;11130:1:15;11119:13;;11003:135::o;12966:184::-;13036:6;13089:2;13077:9;13068:7;13064:23;13060:32;13057:52;;;13105:1;13102;13095:12;13057:52;-1:-1:-1;13128:16:15;;12966:184;-1:-1:-1;12966:184:15:o;17985:637::-;18265:3;18303:6;18297:13;18319:53;18365:6;18360:3;18353:4;18345:6;18341:17;18319:53;:::i;:::-;18435:13;;18394:16;;;;18457:57;18435:13;18394:16;18491:4;18479:17;;18457:57;:::i;:::-;18579:7;18536:20;;18565:22;;;18614:1;18603:13;;17985:637;-1:-1:-1;;;;17985:637:15:o;20639:246::-;20679:4;20708:34;20792:10;;;;20762;;20814:12;;;20811:38;;;20829:18;;:::i;:::-;20866:13;;20639:246;-1:-1:-1;;;20639:246:15:o;20890:253::-;20930:3;20958:34;21019:2;21016:1;21012:10;21049:2;21046:1;21042:10;21080:3;21076:2;21072:12;21067:3;21064:21;21061:47;;;21088:18;;:::i;:::-;21124:13;;20890:253;-1:-1:-1;;;;20890:253:15:o;21148:128::-;21188:3;21219:1;21215:6;21212:1;21209:13;21206:39;;;21225:18;;:::i;:::-;-1:-1:-1;21261:9:15;;21148:128::o;21634:125::-;21674:4;21702:1;21699;21696:8;21693:34;;;21707:18;;:::i;:::-;-1:-1:-1;21744:9:15;;21634:125::o;22582:136::-;22621:3;22649:5;22639:39;;22658:18;;:::i;:::-;-1:-1:-1;;;22694:18:15;;22582:136::o;23139:168::-;23179:7;23245:1;23241;23237:6;23233:14;23230:1;23227:21;23222:1;23215:9;23208:17;23204:45;23201:71;;;23252:18;;:::i;:::-;-1:-1:-1;23292:9:15;;23139:168::o;23312:512::-;23506:4;-1:-1:-1;;;;;23616:2:15;23608:6;23604:15;23593:9;23586:34;23668:2;23660:6;23656:15;23651:2;23640:9;23636:18;23629:43;;23708:6;23703:2;23692:9;23688:18;23681:34;23751:3;23746:2;23735:9;23731:18;23724:31;23772:46;23813:3;23802:9;23798:19;23790:6;23772:46;:::i;:::-;23764:54;23312:512;-1:-1:-1;;;;;;23312:512:15:o;23829:249::-;23898:6;23951:2;23939:9;23930:7;23926:23;23922:32;23919:52;;;23967:1;23964;23957:12;23919:52;23999:9;23993:16;24018:30;24042:5;24018:30;:::i;24083:184::-;-1:-1:-1;;;24132:1:15;24125:88;24232:4;24229:1;24222:15;24256:4;24253:1;24246:15;24272:120;24312:1;24338;24328:35;;24343:18;;:::i;:::-;-1:-1:-1;24377:9:15;;24272:120::o;24397:112::-;24429:1;24455;24445:35;;24460:18;;:::i;:::-;-1:-1:-1;24494:9:15;;24397:112::o;24514:184::-;-1:-1:-1;;;24563:1:15;24556:88;24663:4;24660:1;24653:15;24687:4;24684:1;24677:15;27016:184;-1:-1:-1;;;27065:1:15;27058:88;27165:4;27162:1;27155:15;27189:4;27186:1;27179:15
Swarm Source
ipfs://fb536522012fdf4a65b4826d9b12f9bef2ed5a3fe4388355e4bcb95c58281897
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.