ERC-721
Overview
Max Total Supply
232 SS
Holders
14
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 SSLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SealSquad
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.7.0 <0.9.0; import "erc721a/contracts/ERC721A.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "operator-filter-registry/src/DefaultOperatorFilterer.sol"; contract SealSquad is ERC721A, Ownable, ReentrancyGuard, DefaultOperatorFilterer { string public baseURI; string public notRevealedUri; uint256 public cost = 0.014 ether; uint256 public wlcost = 0.009 ether; uint256 public maxSupply = 6666; uint256 public FreeDeadline = 333; uint256 public MaxperWallet = 3; uint256 public MaxperWalletWl = 3; uint256 public FreeperVIP = 1; bool public paused = false; bool public revealed = false; bool public preSale = true; bytes32 public WLRoot; bytes32 public VIPRoot; mapping(address => uint256) public FreeMintofUser; mapping(address => uint256) public PublicMintofUser; mapping(address => uint256) public WhitelistedMintofUser; constructor() ERC721A("Seal Squad", "SS") { setNotRevealedURI("ipfs://bafkreicuam22yhmendjpp2plu57ruww55gezrebwdfm6v4bpzglejlqjdu"); } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } function _startTokenId() internal view virtual override returns (uint256) { return 1; } // public /// @dev Public mint function mint(uint256 tokens) public payable nonReentrant { require(!paused, "SS: oops contract is paused"); require(!preSale, "SS: PublicSale Hasn't started yet"); require( tokens <= MaxperWallet, "SS: max mint amount per tx exceeded" ); require(totalSupply() + tokens <= maxSupply, "SS: We Soldout"); require( PublicMintofUser[_msgSenderERC721A()] + tokens <= MaxperWallet, "SS: Max NFT Per Wallet exceeded" ); require(msg.value >= cost * tokens, "SS: insufficient funds"); PublicMintofUser[_msgSenderERC721A()] += tokens; _safeMint(_msgSenderERC721A(), tokens); } /// @dev presale mint for whitelisted function presalemint(uint256 tokens, bytes32[] calldata merkleProof) public payable nonReentrant { require(!paused, "SS: oops contract is paused"); require(preSale, "SS: Presale Hasn't started yet"); require( MerkleProof.verify( merkleProof, WLRoot, keccak256(abi.encodePacked(msg.sender)) ) || MerkleProof.verify( merkleProof, VIPRoot, keccak256(abi.encodePacked(msg.sender)) ), "SS: You are not Whitelisted" ); require( WhitelistedMintofUser[_msgSenderERC721A()] + FreeMintofUser[_msgSenderERC721A()] + tokens <= MaxperWalletWl, "SS: Max NFT Per Wallet exceeded" ); require(tokens <= MaxperWalletWl, "SS: max mint per Tx exceeded"); require( totalSupply() + tokens <= maxSupply, "SS: MaxSupply exceeded" ); uint256 pricetoPay = getPrice(_msgSenderERC721A(), tokens, merkleProof); require(msg.value >= pricetoPay, "SS: insufficient funds"); userMints(_msgSenderERC721A(), tokens, merkleProof); _safeMint(_msgSenderERC721A(), tokens); } function getPrice(address userAddr, uint256 amount, bytes32[] calldata merkleProof) public view returns (uint256 price) { if(MerkleProof.verify(merkleProof, VIPRoot, keccak256(abi.encodePacked(userAddr))) && totalSupply() + amount <= FreeDeadline && FreeMintofUser[userAddr] + amount <= FreeperVIP) { return 0; } else { return wlcost * amount; } } function userMints(address userAddr, uint256 amount, bytes32[] calldata merkleProof) internal { if(MerkleProof.verify(merkleProof, VIPRoot, keccak256(abi.encodePacked(userAddr))) && totalSupply() + amount <= FreeDeadline && FreeMintofUser[userAddr] + amount <= FreeperVIP) { FreeMintofUser[userAddr] += amount; } else { WhitelistedMintofUser[userAddr] += amount; } } /// @dev use it for giveaway and team mint function airdrop(uint256 _mintAmount, address destination) public onlyOwner nonReentrant { require( totalSupply() + _mintAmount <= maxSupply, "max NFT limit exceeded" ); _safeMint(destination, _mintAmount); } /// @notice returns metadata link of tokenid function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721AMetadata: URI query for nonexistent token" ); if (revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string( abi.encodePacked( currentBaseURI, _toString(tokenId), ".json" ) ) : ""; } /// @notice return the number minted by an address function numberMinted(address owner) public view returns (uint256) { return _numberMinted(owner); } /// @notice return the tokens owned by an address function tokensOfOwner(address owner) public view returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for ( uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i ) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } //only owner function reveal(bool _state) public onlyOwner { revealed = _state; } /// @dev change the merkle root for the whitelist phase function setWLRoot(bytes32 _newWLRoot) external onlyOwner { WLRoot = _newWLRoot; } function setVIPRoot(bytes32 _newVIPRoot) external onlyOwner { VIPRoot = _newVIPRoot; } /// @dev change the public max per wallet function setMaxPerWallet(uint256 _limit) public onlyOwner { MaxperWallet = _limit; } function setFreeDeadline(uint256 _limit) public onlyOwner { FreeDeadline = _limit; } /// @dev change the whitelist max per wallet function setWlMaxPerWallet(uint256 _limit) public onlyOwner { MaxperWalletWl = _limit; } function setFreePerVIP(uint256 _limit) public onlyOwner { FreeperVIP = _limit; } /// @dev change the public price(amount need to be in wei) function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } /// @dev change the whitelist price(amount need to be in wei) function setWlCost(uint256 _newWlCost) public onlyOwner { wlcost = _newWlCost; } /// @dev cut the supply if we dont sold out function setMaxsupply(uint256 _newsupply) public onlyOwner { maxSupply = _newsupply; } /// @dev set your baseuri function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } /// @dev set hidden uri function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } /// @dev to pause and unpause your contract(use booleans true or false) function pause(bool _state) public onlyOwner { paused = _state; } /// @dev activate whitelist sale(use booleans true or false) function togglepreSale(bool _state) external onlyOwner { preSale = _state; } /// @dev withdraw funds from contract function withdraw() public payable onlyOwner nonReentrant { uint256 balance = address(this).balance; payable(_msgSenderERC721A()).transfer(balance); } /// Opensea Royalties function transferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public payable override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {OperatorFilterer} from "./OperatorFilterer.sol"; import {CANONICAL_CORI_SUBSCRIPTION} from "./lib/Constants.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. * @dev Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { /// @dev The constructor that is called when the contract is being deployed. constructor() OperatorFilterer(CANONICAL_CORI_SUBSCRIPTION, true) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The tree and the proofs can be generated using our * https://github.com/OpenZeppelin/merkle-tree[JavaScript library]. * You will find a quickstart guide in the readme. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. * OpenZeppelin's JavaScript library generates merkle trees that are safe * against this attack out of the box. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Calldata version of {verify} * * _Available since v4.7._ */ function verifyCalldata( bytes32[] calldata proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProofCalldata(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Calldata version of {processProof} * * _Available since v4.7._ */ function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { computedHash = _hashPair(computedHash, proof[i]); } return computedHash; } /** * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerify( bytes32[] memory proof, bool[] memory proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProof(proof, proofFlags, leaves) == root; } /** * @dev Calldata version of {multiProofVerify} * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function multiProofVerifyCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32 root, bytes32[] memory leaves ) internal pure returns (bool) { return processMultiProofCalldata(proof, proofFlags, leaves) == root; } /** * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false * respectively. * * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer). * * _Available since v4.7._ */ function processMultiProof( bytes32[] memory proof, bool[] memory proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } /** * @dev Calldata version of {processMultiProof}. * * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details. * * _Available since v4.7._ */ function processMultiProofCalldata( bytes32[] calldata proof, bool[] calldata proofFlags, bytes32[] memory leaves ) internal pure returns (bytes32 merkleRoot) { // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of // the merkle tree. uint256 leavesLen = leaves.length; uint256 totalHashes = proofFlags.length; // Check proof validity. require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof"); // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop". bytes32[] memory hashes = new bytes32[](totalHashes); uint256 leafPos = 0; uint256 hashPos = 0; uint256 proofPos = 0; // At each step, we compute the next hash using two values: // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we // get the next hash. // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the // `proof` array. for (uint256 i = 0; i < totalHashes; i++) { bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++]; bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++]; hashes[i] = _hashPair(a, b); } if (totalHashes > 0) { return hashes[totalHashes - 1]; } else if (leavesLen > 0) { return leaves[0]; } else { return proof[0]; } } function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) { return a < b ? _efficientHash(a, b) : _efficientHash(b, a); } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { /// @solidity memory-safe-assembly assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (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() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // 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 (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev Interface of ERC721 token receiver. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC721A * * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721) * Non-Fungible Token Standard, including the Metadata extension. * Optimized for lower gas during batch mints. * * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...) * starting from `_startTokenId()`. * * Assumptions: * * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364). struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public payable virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public payable virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public payable virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public payable virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), but // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned. // We will need 1 word for the trailing zeros padding, 1 word for the length, // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0. let m := add(mload(0x40), 0xa0) // Update the free memory pointer to allocate. mstore(0x40, m) // Assign the `str` to the end. str := sub(m, 0x20) // Zeroize the slot after the string. mstore(str, 0) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; address constant CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS = 0x000000000000AAeB6D7670E522A718067333cd4E; address constant CANONICAL_CORI_SUBSCRIPTION = 0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6;
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; import {CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS} from "./lib/Constants.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. * Please note that if your token contract does not provide an owner with EIP-173, it must provide * administration methods on the contract itself to interact with the registry otherwise the subscription * will be locked to the options set during construction. */ abstract contract OperatorFilterer { /// @dev Emitted when an operator is not allowed. error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(CANONICAL_OPERATOR_FILTER_REGISTRY_ADDRESS); /// @dev The constructor that is called when the contract is being deployed. constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } /** * @dev A helper function to check if an operator is allowed. */ modifier onlyAllowedOperator(address from) virtual { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from != msg.sender) { _checkFilterOperator(msg.sender); } _; } /** * @dev A helper function to check if an operator approval is allowed. */ modifier onlyAllowedOperatorApproval(address operator) virtual { _checkFilterOperator(operator); _; } /** * @dev A helper function to check if an operator is allowed. */ function _checkFilterOperator(address operator) internal view virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // under normal circumstances, this function will revert rather than return false, but inheriting contracts // may specify their own OperatorFilterRegistry implementations, which may behave differently if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.3 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external payable; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external payable; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external payable; /** * @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 payable; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// 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 pragma solidity ^0.8.13; interface IOperatorFilterRegistry { /** * @notice Returns true if operator is not filtered for a given token, either by address or codeHash. Also returns * true if supplied registrant address is not registered. */ function isOperatorAllowed(address registrant, address operator) external view returns (bool); /** * @notice Registers an address with the registry. May be called by address itself or by EIP-173 owner. */ function register(address registrant) external; /** * @notice Registers an address with the registry and "subscribes" to another address's filtered operators and codeHashes. */ function registerAndSubscribe(address registrant, address subscription) external; /** * @notice Registers an address with the registry and copies the filtered operators and codeHashes from another * address without subscribing. */ function registerAndCopyEntries(address registrant, address registrantToCopy) external; /** * @notice Unregisters an address with the registry and removes its subscription. May be called by address itself or by EIP-173 owner. * Note that this does not remove any filtered addresses or codeHashes. * Also note that any subscriptions to this registrant will still be active and follow the existing filtered addresses and codehashes. */ function unregister(address addr) external; /** * @notice Update an operator address for a registered address - when filtered is true, the operator is filtered. */ function updateOperator(address registrant, address operator, bool filtered) external; /** * @notice Update multiple operators for a registered address - when filtered is true, the operators will be filtered. Reverts on duplicates. */ function updateOperators(address registrant, address[] calldata operators, bool filtered) external; /** * @notice Update a codeHash for a registered address - when filtered is true, the codeHash is filtered. */ function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; /** * @notice Update multiple codeHashes for a registered address - when filtered is true, the codeHashes will be filtered. Reverts on duplicates. */ function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; /** * @notice Subscribe an address to another registrant's filtered operators and codeHashes. Will remove previous * subscription if present. * Note that accounts with subscriptions may go on to subscribe to other accounts - in this case, * subscriptions will not be forwarded. Instead the former subscription's existing entries will still be * used. */ function subscribe(address registrant, address registrantToSubscribe) external; /** * @notice Unsubscribe an address from its current subscribed registrant, and optionally copy its filtered operators and codeHashes. */ function unsubscribe(address registrant, bool copyExistingEntries) external; /** * @notice Get the subscription address of a given registrant, if any. */ function subscriptionOf(address addr) external returns (address registrant); /** * @notice Get the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscribers(address registrant) external returns (address[] memory); /** * @notice Get the subscriber at a given index in the set of addresses subscribed to a given registrant. * Note that order is not guaranteed as updates are made. */ function subscriberAt(address registrant, uint256 index) external returns (address); /** * @notice Copy filtered operators and codeHashes from a different registrantToCopy to addr. */ function copyEntriesOf(address registrant, address registrantToCopy) external; /** * @notice Returns true if operator is filtered by a given address or its subscription. */ function isOperatorFiltered(address registrant, address operator) external returns (bool); /** * @notice Returns true if the hash of an address's code is filtered by a given address or its subscription. */ function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); /** * @notice Returns true if a codeHash is filtered by a given address or its subscription. */ function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); /** * @notice Returns a list of filtered operators for a given address or its subscription. */ function filteredOperators(address addr) external returns (address[] memory); /** * @notice Returns the set of filtered codeHashes for a given address or its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashes(address addr) external returns (bytes32[] memory); /** * @notice Returns the filtered operator at the given index of the set of filtered operators for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredOperatorAt(address registrant, uint256 index) external returns (address); /** * @notice Returns the filtered codeHash at the given index of the list of filtered codeHashes for a given address or * its subscription. * Note that order is not guaranteed as updates are made. */ function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); /** * @notice Returns true if an address has registered */ function isRegistered(address addr) external returns (bool); /** * @dev Convenience method to compute the code hash of an arbitrary contract */ function codeHashOf(address addr) external returns (bytes32); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FreeDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"FreeMintofUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FreeperVIP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxperWalletWl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"PublicMintofUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VIPRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WLRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"WhitelistedMintofUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"price","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"presalemint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreeDeadline","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setFreePerVIP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setMaxsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newVIPRoot","type":"bytes32"}],"name":"setVIPRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_newWLRoot","type":"bytes32"}],"name":"setWLRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newWlCost","type":"uint256"}],"name":"setWlCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setWlMaxPerWallet","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":"bool","name":"_state","type":"bool"}],"name":"togglepreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wlcost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526631bced02db0000600c55661ff973cafa8000600d55611a0a600e5561014d600f556003601055600360115560016012556000601360006101000a81548160ff0219169083151502179055506000601360016101000a81548160ff0219169083151502179055506001601360026101000a81548160ff0219169083151502179055503480156200009357600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600a81526020017f5365616c205371756164000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f53530000000000000000000000000000000000000000000000000000000000008152508160029081620001289190620007d3565b5080600390816200013a9190620007d3565b506200014b620003a260201b60201c565b60008190555050506200017362000167620003ab60201b60201c565b620003b360201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200037057801562000236576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001fc929190620008ff565b600060405180830381600087803b1580156200021757600080fd5b505af11580156200022c573d6000803e3d6000fd5b505050506200036f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002f0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002b6929190620008ff565b600060405180830381600087803b158015620002d157600080fd5b505af1158015620002e6573d6000803e3d6000fd5b505050506200036e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b81526004016200033991906200092c565b600060405180830381600087803b1580156200035457600080fd5b505af115801562000369573d6000803e3d6000fd5b505050505b5b5b50506200039c60405180608001604052806042815260200162005583604291396200047960201b60201c565b620009cc565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004896200049e60201b60201c565b80600b90816200049a9190620007d3565b5050565b620004ae620003ab60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004d46200052f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200052d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200052490620009aa565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005db57607f821691505b602082108103620005f157620005f062000593565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200065b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200061c565b6200066786836200061c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620006b4620006ae620006a8846200067f565b62000689565b6200067f565b9050919050565b6000819050919050565b620006d08362000693565b620006e8620006df82620006bb565b84845462000629565b825550505050565b600090565b620006ff620006f0565b6200070c818484620006c5565b505050565b5b81811015620007345762000728600082620006f5565b60018101905062000712565b5050565b601f82111562000783576200074d81620005f7565b62000758846200060c565b8101602085101562000768578190505b6200078062000777856200060c565b83018262000711565b50505b505050565b600082821c905092915050565b6000620007a86000198460080262000788565b1980831691505092915050565b6000620007c3838362000795565b9150826002028217905092915050565b620007de8262000559565b67ffffffffffffffff811115620007fa57620007f962000564565b5b620008068254620005c2565b6200081382828562000738565b600060209050601f8311600181146200084b576000841562000836578287015190505b620008428582620007b5565b865550620008b2565b601f1984166200085b86620005f7565b60005b8281101562000885578489015182556001820191506020850194506020810190506200085e565b86831015620008a55784890151620008a1601f89168262000795565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620008e782620008ba565b9050919050565b620008f981620008da565b82525050565b6000604082019050620009166000830185620008ee565b620009256020830184620008ee565b9392505050565b6000602082019050620009436000830184620008ee565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006200099260208362000949565b91506200099f826200095a565b602082019050919050565b60006020820190508181036000830152620009c58162000983565b9050919050565b614ba780620009dc6000396000f3fe60806040526004361061036a5760003560e01c8063715018a6116101c6578063bd7a1998116100f7578063f12f6d5d11610095578063fe36862b1161006f578063fe36862b14610c32578063fe3e2a0b14610c6f578063fea0e05814610c98578063fff8d2fc14610cc15761036a565b8063f12f6d5d14610bb7578063f2c4ce1e14610be0578063f2fde38b14610c095761036a565b8063d5abeb01116100d1578063d5abeb0114610ae9578063dc33e68114610b14578063e268e4d314610b51578063e985e9c514610b7a5761036a565b8063bd7a199814610a58578063bde0608a14610a83578063c87b56dd14610aac5761036a565b806395d89b4111610164578063aeeca0921161013e578063aeeca092146109bf578063b11c7f82146109ea578063b88d4fde14610a13578063bc63f02e14610a2f5761036a565b806395d89b411461094f578063a0712d681461097a578063a22cb465146109965761036a565b806389f93d0c116101a057806389f93d0c146108935780638b14966b146108be5780638da5cb5b146108fb578063940cd05b146109265761036a565b8063715018a614610816578063785451aa1461082d5780638462151c146108565761036a565b8063351a4692116102a057806355f804b31161023e5780636352211e116102185780636352211e146107465780636c0360eb146107835780636c2d3c4f146107ae57806370a08231146107d95761036a565b806355f804b3146106c75780635a7adf7f146106f05780635c975abb1461071b5761036a565b806341f434341161027a57806341f434341461062c57806342842e0e1461065757806344a0d68a14610673578063518302271461069c5761036a565b8063351a4692146105cc5780633a7cc352146105f75780633ccfd60b146106225761036a565b8063095ea7b31161030d57806318160ddd116102e757806318160ddd1461051f5780631df802a31461054a578063237f81141461057357806323b872dd146105b05761036a565b8063095ea7b3146104af57806313faede6146104cb578063149835a0146104f65761036a565b8063036e4cb511610349578063036e4cb51461040057806306fdde031461041c578063081812fc14610447578063081c8c44146104845761036a565b806277ec051461036f57806301ffc9a71461039a57806302329a29146103d7575b600080fd5b34801561037b57600080fd5b50610384610cfe565b604051610391919061341a565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906134a1565b610d04565b6040516103ce91906134e9565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613530565b610d96565b005b61041a600480360381019061041591906135ee565b610dbb565b005b34801561042857600080fd5b5061043161119f565b60405161043e91906136de565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190613700565b611231565b60405161047b919061376e565b60405180910390f35b34801561049057600080fd5b506104996112b0565b6040516104a691906136de565b60405180910390f35b6104c960048036038101906104c491906137b5565b61133e565b005b3480156104d757600080fd5b506104e0611482565b6040516104ed919061341a565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190613700565b611488565b005b34801561052b57600080fd5b5061053461149a565b604051610541919061341a565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c919061382b565b6114b1565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613858565b6114c3565b6040516105a7919061341a565b60405180910390f35b6105ca60048036038101906105c59190613885565b6114db565b005b3480156105d857600080fd5b506105e161152a565b6040516105ee919061341a565b60405180910390f35b34801561060357600080fd5b5061060c611530565b60405161061991906138e7565b60405180910390f35b61062a611536565b005b34801561063857600080fd5b506106416115a4565b60405161064e9190613961565b60405180910390f35b610671600480360381019061066c9190613885565b6115b6565b005b34801561067f57600080fd5b5061069a60048036038101906106959190613700565b611605565b005b3480156106a857600080fd5b506106b1611617565b6040516106be91906134e9565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190613aac565b61162a565b005b3480156106fc57600080fd5b50610705611645565b60405161071291906134e9565b60405180910390f35b34801561072757600080fd5b50610730611658565b60405161073d91906134e9565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613700565b61166b565b60405161077a919061376e565b60405180910390f35b34801561078f57600080fd5b5061079861167d565b6040516107a591906136de565b60405180910390f35b3480156107ba57600080fd5b506107c361170b565b6040516107d0919061341a565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190613858565b611711565b60405161080d919061341a565b60405180910390f35b34801561082257600080fd5b5061082b6117c9565b005b34801561083957600080fd5b50610854600480360381019061084f9190613700565b6117dd565b005b34801561086257600080fd5b5061087d60048036038101906108789190613858565b6117ef565b60405161088a9190613bb3565b60405180910390f35b34801561089f57600080fd5b506108a8611932565b6040516108b5919061341a565b60405180910390f35b3480156108ca57600080fd5b506108e560048036038101906108e09190613858565b611938565b6040516108f2919061341a565b60405180910390f35b34801561090757600080fd5b50610910611950565b60405161091d919061376e565b60405180910390f35b34801561093257600080fd5b5061094d60048036038101906109489190613530565b61197a565b005b34801561095b57600080fd5b5061096461199f565b60405161097191906136de565b60405180910390f35b610994600480360381019061098f9190613700565b611a31565b005b3480156109a257600080fd5b506109bd60048036038101906109b89190613bd5565b611cd4565b005b3480156109cb57600080fd5b506109d4611ddf565b6040516109e191906138e7565b60405180910390f35b3480156109f657600080fd5b50610a116004803603810190610a0c919061382b565b611de5565b005b610a2d6004803603810190610a289190613cb6565b611df7565b005b348015610a3b57600080fd5b50610a566004803603810190610a519190613d39565b611e48565b005b348015610a6457600080fd5b50610a6d611ec5565b604051610a7a919061341a565b60405180910390f35b348015610a8f57600080fd5b50610aaa6004803603810190610aa59190613700565b611ecb565b005b348015610ab857600080fd5b50610ad36004803603810190610ace9190613700565b611edd565b604051610ae091906136de565b60405180910390f35b348015610af557600080fd5b50610afe612032565b604051610b0b919061341a565b60405180910390f35b348015610b2057600080fd5b50610b3b6004803603810190610b369190613858565b612038565b604051610b48919061341a565b60405180910390f35b348015610b5d57600080fd5b50610b786004803603810190610b739190613700565b61204a565b005b348015610b8657600080fd5b50610ba16004803603810190610b9c9190613d79565b61205c565b604051610bae91906134e9565b60405180910390f35b348015610bc357600080fd5b50610bde6004803603810190610bd99190613700565b6120f0565b005b348015610bec57600080fd5b50610c076004803603810190610c029190613aac565b612102565b005b348015610c1557600080fd5b50610c306004803603810190610c2b9190613858565b61211d565b005b348015610c3e57600080fd5b50610c596004803603810190610c549190613db9565b6121a0565b604051610c66919061341a565b60405180910390f35b348015610c7b57600080fd5b50610c966004803603810190610c919190613700565b6122b5565b005b348015610ca457600080fd5b50610cbf6004803603810190610cba9190613530565b6122c7565b005b348015610ccd57600080fd5b50610ce86004803603810190610ce39190613858565b6122ec565b604051610cf5919061341a565b60405180910390f35b60115481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d5f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d8f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610d9e612304565b80601360006101000a81548160ff02191690831515021790555050565b610dc3612382565b601360009054906101000a900460ff1615610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90613e79565b60405180910390fd5b601360029054906101000a900460ff16610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990613ee5565b60405180910390fd5b610ed6828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060145433604051602001610ebb9190613f4d565b604051602081830303815290604052805190602001206123d1565b80610f515750610f50828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155433604051602001610f359190613f4d565b604051602081830303815290604052805190602001206123d1565b5b610f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8790613fb4565b60405180910390fd5b6011548360166000610fa06123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460186000610fe76123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461102c9190614003565b6110369190614003565b1115611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e90614083565b60405180910390fd5b6011548311156110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b3906140ef565b60405180910390fd5b600e54836110c861149a565b6110d29190614003565b1115611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a9061415b565b60405180910390fd5b60006111286111206123e8565b8585856121a0565b90508034101561116d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611164906141c7565b60405180910390fd5b6111806111786123e8565b8585856123f0565b61119161118b6123e8565b85612599565b5061119a6125b7565b505050565b6060600280546111ae90614216565b80601f01602080910402602001604051908101604052809291908181526020018280546111da90614216565b80156112275780601f106111fc57610100808354040283529160200191611227565b820191906000526020600020905b81548152906001019060200180831161120a57829003601f168201915b5050505050905090565b600061123c826125c1565b611272576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b80546112bd90614216565b80601f01602080910402602001604051908101604052809291908181526020018280546112e990614216565b80156113365780601f1061130b57610100808354040283529160200191611336565b820191906000526020600020905b81548152906001019060200180831161131957829003601f168201915b505050505081565b60006113498261166b565b90508073ffffffffffffffffffffffffffffffffffffffff1661136a6123e8565b73ffffffffffffffffffffffffffffffffffffffff16146113cd57611396816113916123e8565b61205c565b6113cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b611490612304565b80600e8190555050565b60006114a4612620565b6001546000540303905090565b6114b9612304565b8060158190555050565b60166020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115195761151833612629565b5b611524848484612726565b50505050565b60125481565b60155481565b61153e612304565b611546612382565b60004790506115536123e8565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611598573d6000803e3d6000fd5b50506115a26125b7565b565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115f4576115f333612629565b5b6115ff848484612a48565b50505050565b61160d612304565b80600c8190555050565b601360019054906101000a900460ff1681565b611632612304565b80600a908161164191906143e9565b5050565b601360029054906101000a900460ff1681565b601360009054906101000a900460ff1681565b600061167682612a68565b9050919050565b600a805461168a90614216565b80601f01602080910402602001604051908101604052809291908181526020018280546116b690614216565b80156117035780601f106116d857610100808354040283529160200191611703565b820191906000526020600020905b8154815290600101906020018083116116e657829003601f168201915b505050505081565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611778576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117d1612304565b6117db6000612b34565b565b6117e5612304565b8060128190555050565b606060008060006117ff85611711565b905060008167ffffffffffffffff81111561181d5761181c613981565b5b60405190808252806020026020018201604052801561184b5781602001602082028036833780820191505090505b5090506118566133b2565b6000611860612620565b90505b8386146119245761187381612bfa565b9150816040015161191957600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146118be57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611918578083878060010198508151811061190b5761190a6144bb565b5b6020026020010181815250505b5b806001019050611863565b508195505050505050919050565b600f5481565b60186020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611982612304565b80601360016101000a81548160ff02191690831515021790555050565b6060600380546119ae90614216565b80601f01602080910402602001604051908101604052809291908181526020018280546119da90614216565b8015611a275780601f106119fc57610100808354040283529160200191611a27565b820191906000526020600020905b815481529060010190602001808311611a0a57829003601f168201915b5050505050905090565b611a39612382565b601360009054906101000a900460ff1615611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090613e79565b60405180910390fd5b601360029054906101000a900460ff1615611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad09061455c565b60405180910390fd5b601054811115611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b15906145ee565b60405180910390fd5b600e5481611b2a61149a565b611b349190614003565b1115611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c9061465a565b60405180910390fd5b6010548160176000611b856123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bca9190614003565b1115611c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0290614083565b60405180910390fd5b80600c54611c19919061467a565b341015611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c52906141c7565b60405180910390fd5b8060176000611c686123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb19190614003565b92505081905550611cc9611cc36123e8565b82612599565b611cd16125b7565b50565b8060076000611ce16123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d8e6123e8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd391906134e9565b60405180910390a35050565b60145481565b611ded612304565b8060148190555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e3557611e3433612629565b5b611e4185858585612c25565b5050505050565b611e50612304565b611e58612382565b600e5482611e6461149a565b611e6e9190614003565b1115611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690614708565b60405180910390fd5b611eb98183612599565b611ec16125b7565b5050565b60105481565b611ed3612304565b8060118190555050565b6060611ee8826125c1565b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e9061479a565b60405180910390fd5b60001515601360019054906101000a900460ff16151503611fd457600b8054611f4f90614216565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7b90614216565b8015611fc85780601f10611f9d57610100808354040283529160200191611fc8565b820191906000526020600020905b815481529060010190602001808311611fab57829003601f168201915b5050505050905061202d565b6000611fde612c98565b90506000815111611ffe5760405180602001604052806000815250612029565b8061200884612d2a565b604051602001612019929190614842565b6040516020818303038152906040525b9150505b919050565b600e5481565b600061204382612d7a565b9050919050565b612052612304565b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120f8612304565b80600d8190555050565b61210a612304565b80600b908161211991906143e9565b5050565b612125612304565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b906148e3565b60405180910390fd5b61219d81612b34565b50565b6000612216838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601554876040516020016121fb9190613f4d565b604051602081830303815290604052805190602001206123d1565b80156122365750600f548461222961149a565b6122339190614003565b11155b801561228e575060125484601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461228b9190614003565b11155b1561229c57600090506122ad565b83600d546122aa919061467a565b90505b949350505050565b6122bd612304565b80600f8190555050565b6122cf612304565b80601360026101000a81548160ff02191690831515021790555050565b60176020528060005260406000206000915090505481565b61230c612dd1565b73ffffffffffffffffffffffffffffffffffffffff1661232a611950565b73ffffffffffffffffffffffffffffffffffffffff1614612380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123779061494f565b60405180910390fd5b565b6002600954036123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be906149bb565b60405180910390fd5b6002600981905550565b6000826123de8584612dd9565b1490509392505050565b600033905090565b612464828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601554866040516020016124499190613f4d565b604051602081830303815290604052805190602001206123d1565b80156124845750600f548361247761149a565b6124819190614003565b11155b80156124dc575060125483601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124d99190614003565b11155b1561253c5782601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125309190614003565b92505081905550612593565b82601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258b9190614003565b925050819055505b50505050565b6125b3828260405180602001604052806000815250612e2f565b5050565b6001600981905550565b6000816125cc612620565b111580156125db575060005482105b8015612619575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006001905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612723576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016126a09291906149db565b602060405180830381865afa1580156126bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e19190614a19565b61272257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612719919061376e565b60405180910390fd5b5b50565b600061273182612a68565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612798576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806127a484612ecc565b915091506127ba81876127b56123e8565b612ef3565b612806576127cf866127ca6123e8565b61205c565b612805576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361286c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128798686866001612f37565b801561288457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506129528561292e888887612f3d565b7c020000000000000000000000000000000000000000000000000000000017612f65565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036129d857600060018501905060006004600083815260200190815260200160002054036129d65760005481146129d5578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a408686866001612f90565b505050505050565b612a6383838360405180602001604052806000815250611df7565b505050565b60008082905080612a77612620565b11612afd57600054811015612afc5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612afa575b60008103612af0576004600083600190039350838152602001908152602001600020549050612ac6565b8092505050612b2f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c026133b2565b612c1e6004600084815260200190815260200160002054612f96565b9050919050565b612c308484846114db565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c9257612c5b8484848461304c565b612c91576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a8054612ca790614216565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd390614216565b8015612d205780601f10612cf557610100808354040283529160200191612d20565b820191906000526020600020905b815481529060010190602001808311612d0357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612d6557600184039350600a81066030018453600a8104905080612d43575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60008082905060005b8451811015612e2457612e0f82868381518110612e0257612e016144bb565b5b602002602001015161319c565b91508080612e1c90614a46565b915050612de2565b508091505092915050565b612e3983836131c7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ec757600080549050600083820390505b612e79600086838060010194508661304c565b612eaf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612e66578160005414612ec457600080fd5b50505b505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612f54868684613382565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612f9e6133b2565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130726123e8565b8786866040518563ffffffff1660e01b81526004016130949493929190614ae3565b6020604051808303816000875af19250505080156130d057506040513d601f19601f820116820180604052508101906130cd9190614b44565b60015b613149573d8060008114613100576040519150601f19603f3d011682016040523d82523d6000602084013e613105565b606091505b506000815103613141576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008183106131b4576131af828461338b565b6131bf565b6131be838361338b565b5b905092915050565b60008054905060008203613207576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132146000848385612f37565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061328b8361327c6000866000612f3d565b613285856133a2565b17612f65565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461332c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506132f1565b5060008203613367576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061337d6000848385612f90565b505050565b60009392505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000819050919050565b61341481613401565b82525050565b600060208201905061342f600083018461340b565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61347e81613449565b811461348957600080fd5b50565b60008135905061349b81613475565b92915050565b6000602082840312156134b7576134b661343f565b5b60006134c58482850161348c565b91505092915050565b60008115159050919050565b6134e3816134ce565b82525050565b60006020820190506134fe60008301846134da565b92915050565b61350d816134ce565b811461351857600080fd5b50565b60008135905061352a81613504565b92915050565b6000602082840312156135465761354561343f565b5b60006135548482850161351b565b91505092915050565b61356681613401565b811461357157600080fd5b50565b6000813590506135838161355d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126135ae576135ad613589565b5b8235905067ffffffffffffffff8111156135cb576135ca61358e565b5b6020830191508360208202830111156135e7576135e6613593565b5b9250929050565b6000806000604084860312156136075761360661343f565b5b600061361586828701613574565b935050602084013567ffffffffffffffff81111561363657613635613444565b5b61364286828701613598565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561368857808201518184015260208101905061366d565b60008484015250505050565b6000601f19601f8301169050919050565b60006136b08261364e565b6136ba8185613659565b93506136ca81856020860161366a565b6136d381613694565b840191505092915050565b600060208201905081810360008301526136f881846136a5565b905092915050565b6000602082840312156137165761371561343f565b5b600061372484828501613574565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137588261372d565b9050919050565b6137688161374d565b82525050565b6000602082019050613783600083018461375f565b92915050565b6137928161374d565b811461379d57600080fd5b50565b6000813590506137af81613789565b92915050565b600080604083850312156137cc576137cb61343f565b5b60006137da858286016137a0565b92505060206137eb85828601613574565b9150509250929050565b6000819050919050565b613808816137f5565b811461381357600080fd5b50565b600081359050613825816137ff565b92915050565b6000602082840312156138415761384061343f565b5b600061384f84828501613816565b91505092915050565b60006020828403121561386e5761386d61343f565b5b600061387c848285016137a0565b91505092915050565b60008060006060848603121561389e5761389d61343f565b5b60006138ac868287016137a0565b93505060206138bd868287016137a0565b92505060406138ce86828701613574565b9150509250925092565b6138e1816137f5565b82525050565b60006020820190506138fc60008301846138d8565b92915050565b6000819050919050565b600061392761392261391d8461372d565b613902565b61372d565b9050919050565b60006139398261390c565b9050919050565b600061394b8261392e565b9050919050565b61395b81613940565b82525050565b60006020820190506139766000830184613952565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139b982613694565b810181811067ffffffffffffffff821117156139d8576139d7613981565b5b80604052505050565b60006139eb613435565b90506139f782826139b0565b919050565b600067ffffffffffffffff821115613a1757613a16613981565b5b613a2082613694565b9050602081019050919050565b82818337600083830152505050565b6000613a4f613a4a846139fc565b6139e1565b905082815260208101848484011115613a6b57613a6a61397c565b5b613a76848285613a2d565b509392505050565b600082601f830112613a9357613a92613589565b5b8135613aa3848260208601613a3c565b91505092915050565b600060208284031215613ac257613ac161343f565b5b600082013567ffffffffffffffff811115613ae057613adf613444565b5b613aec84828501613a7e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b2a81613401565b82525050565b6000613b3c8383613b21565b60208301905092915050565b6000602082019050919050565b6000613b6082613af5565b613b6a8185613b00565b9350613b7583613b11565b8060005b83811015613ba6578151613b8d8882613b30565b9750613b9883613b48565b925050600181019050613b79565b5085935050505092915050565b60006020820190508181036000830152613bcd8184613b55565b905092915050565b60008060408385031215613bec57613beb61343f565b5b6000613bfa858286016137a0565b9250506020613c0b8582860161351b565b9150509250929050565b600067ffffffffffffffff821115613c3057613c2f613981565b5b613c3982613694565b9050602081019050919050565b6000613c59613c5484613c15565b6139e1565b905082815260208101848484011115613c7557613c7461397c565b5b613c80848285613a2d565b509392505050565b600082601f830112613c9d57613c9c613589565b5b8135613cad848260208601613c46565b91505092915050565b60008060008060808587031215613cd057613ccf61343f565b5b6000613cde878288016137a0565b9450506020613cef878288016137a0565b9350506040613d0087828801613574565b925050606085013567ffffffffffffffff811115613d2157613d20613444565b5b613d2d87828801613c88565b91505092959194509250565b60008060408385031215613d5057613d4f61343f565b5b6000613d5e85828601613574565b9250506020613d6f858286016137a0565b9150509250929050565b60008060408385031215613d9057613d8f61343f565b5b6000613d9e858286016137a0565b9250506020613daf858286016137a0565b9150509250929050565b60008060008060608587031215613dd357613dd261343f565b5b6000613de1878288016137a0565b9450506020613df287828801613574565b935050604085013567ffffffffffffffff811115613e1357613e12613444565b5b613e1f87828801613598565b925092505092959194509250565b7f53533a206f6f707320636f6e7472616374206973207061757365640000000000600082015250565b6000613e63601b83613659565b9150613e6e82613e2d565b602082019050919050565b60006020820190508181036000830152613e9281613e56565b9050919050565b7f53533a2050726573616c65204861736e27742073746172746564207965740000600082015250565b6000613ecf601e83613659565b9150613eda82613e99565b602082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b60008160601b9050919050565b6000613f1d82613f05565b9050919050565b6000613f2f82613f12565b9050919050565b613f47613f428261374d565b613f24565b82525050565b6000613f598284613f36565b60148201915081905092915050565b7f53533a20596f7520617265206e6f742057686974656c69737465640000000000600082015250565b6000613f9e601b83613659565b9150613fa982613f68565b602082019050919050565b60006020820190508181036000830152613fcd81613f91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061400e82613401565b915061401983613401565b925082820190508082111561403157614030613fd4565b5b92915050565b7f53533a204d6178204e4654205065722057616c6c657420657863656564656400600082015250565b600061406d601f83613659565b915061407882614037565b602082019050919050565b6000602082019050818103600083015261409c81614060565b9050919050565b7f53533a206d6178206d696e742070657220547820657863656564656400000000600082015250565b60006140d9601c83613659565b91506140e4826140a3565b602082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b7f53533a204d6178537570706c7920657863656564656400000000000000000000600082015250565b6000614145601683613659565b91506141508261410f565b602082019050919050565b6000602082019050818103600083015261417481614138565b9050919050565b7f53533a20696e73756666696369656e742066756e647300000000000000000000600082015250565b60006141b1601683613659565b91506141bc8261417b565b602082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061422e57607f821691505b602082108103614241576142406141e7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142a97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261426c565b6142b3868361426c565b95508019841693508086168417925050509392505050565b60006142e66142e16142dc84613401565b613902565b613401565b9050919050565b6000819050919050565b614300836142cb565b61431461430c826142ed565b848454614279565b825550505050565b600090565b61432961431c565b6143348184846142f7565b505050565b5b818110156143585761434d600082614321565b60018101905061433a565b5050565b601f82111561439d5761436e81614247565b6143778461425c565b81016020851015614386578190505b61439a6143928561425c565b830182614339565b50505b505050565b600082821c905092915050565b60006143c0600019846008026143a2565b1980831691505092915050565b60006143d983836143af565b9150826002028217905092915050565b6143f28261364e565b67ffffffffffffffff81111561440b5761440a613981565b5b6144158254614216565b61442082828561435c565b600060209050601f8311600181146144535760008415614441578287015190505b61444b85826143cd565b8655506144b3565b601f19841661446186614247565b60005b8281101561448957848901518255600182019150602085019450602081019050614464565b868310156144a657848901516144a2601f8916826143af565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53533a205075626c696353616c65204861736e2774207374617274656420796560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614546602183613659565b9150614551826144ea565b604082019050919050565b6000602082019050818103600083015261457581614539565b9050919050565b7f53533a206d6178206d696e7420616d6f756e742070657220747820657863656560008201527f6465640000000000000000000000000000000000000000000000000000000000602082015250565b60006145d8602383613659565b91506145e38261457c565b604082019050919050565b60006020820190508181036000830152614607816145cb565b9050919050565b7f53533a20576520536f6c646f7574000000000000000000000000000000000000600082015250565b6000614644600e83613659565b915061464f8261460e565b602082019050919050565b6000602082019050818103600083015261467381614637565b9050919050565b600061468582613401565b915061469083613401565b925082820261469e81613401565b915082820484148315176146b5576146b4613fd4565b5b5092915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b60006146f2601683613659565b91506146fd826146bc565b602082019050919050565b60006020820190508181036000830152614721816146e5565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000614784603083613659565b915061478f82614728565b604082019050919050565b600060208201905081810360008301526147b381614777565b9050919050565b600081905092915050565b60006147d08261364e565b6147da81856147ba565b93506147ea81856020860161366a565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061482c6005836147ba565b9150614837826147f6565b600582019050919050565b600061484e82856147c5565b915061485a82846147c5565b91506148658261481f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148cd602683613659565b91506148d882614871565b604082019050919050565b600060208201905081810360008301526148fc816148c0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614939602083613659565b915061494482614903565b602082019050919050565b600060208201905081810360008301526149688161492c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006149a5601f83613659565b91506149b08261496f565b602082019050919050565b600060208201905081810360008301526149d481614998565b9050919050565b60006040820190506149f0600083018561375f565b6149fd602083018461375f565b9392505050565b600081519050614a1381613504565b92915050565b600060208284031215614a2f57614a2e61343f565b5b6000614a3d84828501614a04565b91505092915050565b6000614a5182613401565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a8357614a82613fd4565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000614ab582614a8e565b614abf8185614a99565b9350614acf81856020860161366a565b614ad881613694565b840191505092915050565b6000608082019050614af8600083018761375f565b614b05602083018661375f565b614b12604083018561340b565b8181036060830152614b248184614aaa565b905095945050505050565b600081519050614b3e81613475565b92915050565b600060208284031215614b5a57614b5961343f565b5b6000614b6884828501614b2f565b9150509291505056fea26469706673582212205671fad92a742f804f7532ff5020e067ca9200e7d9ace79b45cbcdc6a90ccf2664736f6c63430008120033697066733a2f2f6261666b7265696375616d323279686d656e646a707032706c75353772757777353567657a7265627764666d36763462707a676c656a6c716a6475
Deployed Bytecode
0x60806040526004361061036a5760003560e01c8063715018a6116101c6578063bd7a1998116100f7578063f12f6d5d11610095578063fe36862b1161006f578063fe36862b14610c32578063fe3e2a0b14610c6f578063fea0e05814610c98578063fff8d2fc14610cc15761036a565b8063f12f6d5d14610bb7578063f2c4ce1e14610be0578063f2fde38b14610c095761036a565b8063d5abeb01116100d1578063d5abeb0114610ae9578063dc33e68114610b14578063e268e4d314610b51578063e985e9c514610b7a5761036a565b8063bd7a199814610a58578063bde0608a14610a83578063c87b56dd14610aac5761036a565b806395d89b4111610164578063aeeca0921161013e578063aeeca092146109bf578063b11c7f82146109ea578063b88d4fde14610a13578063bc63f02e14610a2f5761036a565b806395d89b411461094f578063a0712d681461097a578063a22cb465146109965761036a565b806389f93d0c116101a057806389f93d0c146108935780638b14966b146108be5780638da5cb5b146108fb578063940cd05b146109265761036a565b8063715018a614610816578063785451aa1461082d5780638462151c146108565761036a565b8063351a4692116102a057806355f804b31161023e5780636352211e116102185780636352211e146107465780636c0360eb146107835780636c2d3c4f146107ae57806370a08231146107d95761036a565b806355f804b3146106c75780635a7adf7f146106f05780635c975abb1461071b5761036a565b806341f434341161027a57806341f434341461062c57806342842e0e1461065757806344a0d68a14610673578063518302271461069c5761036a565b8063351a4692146105cc5780633a7cc352146105f75780633ccfd60b146106225761036a565b8063095ea7b31161030d57806318160ddd116102e757806318160ddd1461051f5780631df802a31461054a578063237f81141461057357806323b872dd146105b05761036a565b8063095ea7b3146104af57806313faede6146104cb578063149835a0146104f65761036a565b8063036e4cb511610349578063036e4cb51461040057806306fdde031461041c578063081812fc14610447578063081c8c44146104845761036a565b806277ec051461036f57806301ffc9a71461039a57806302329a29146103d7575b600080fd5b34801561037b57600080fd5b50610384610cfe565b604051610391919061341a565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc91906134a1565b610d04565b6040516103ce91906134e9565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190613530565b610d96565b005b61041a600480360381019061041591906135ee565b610dbb565b005b34801561042857600080fd5b5061043161119f565b60405161043e91906136de565b60405180910390f35b34801561045357600080fd5b5061046e60048036038101906104699190613700565b611231565b60405161047b919061376e565b60405180910390f35b34801561049057600080fd5b506104996112b0565b6040516104a691906136de565b60405180910390f35b6104c960048036038101906104c491906137b5565b61133e565b005b3480156104d757600080fd5b506104e0611482565b6040516104ed919061341a565b60405180910390f35b34801561050257600080fd5b5061051d60048036038101906105189190613700565b611488565b005b34801561052b57600080fd5b5061053461149a565b604051610541919061341a565b60405180910390f35b34801561055657600080fd5b50610571600480360381019061056c919061382b565b6114b1565b005b34801561057f57600080fd5b5061059a60048036038101906105959190613858565b6114c3565b6040516105a7919061341a565b60405180910390f35b6105ca60048036038101906105c59190613885565b6114db565b005b3480156105d857600080fd5b506105e161152a565b6040516105ee919061341a565b60405180910390f35b34801561060357600080fd5b5061060c611530565b60405161061991906138e7565b60405180910390f35b61062a611536565b005b34801561063857600080fd5b506106416115a4565b60405161064e9190613961565b60405180910390f35b610671600480360381019061066c9190613885565b6115b6565b005b34801561067f57600080fd5b5061069a60048036038101906106959190613700565b611605565b005b3480156106a857600080fd5b506106b1611617565b6040516106be91906134e9565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190613aac565b61162a565b005b3480156106fc57600080fd5b50610705611645565b60405161071291906134e9565b60405180910390f35b34801561072757600080fd5b50610730611658565b60405161073d91906134e9565b60405180910390f35b34801561075257600080fd5b5061076d60048036038101906107689190613700565b61166b565b60405161077a919061376e565b60405180910390f35b34801561078f57600080fd5b5061079861167d565b6040516107a591906136de565b60405180910390f35b3480156107ba57600080fd5b506107c361170b565b6040516107d0919061341a565b60405180910390f35b3480156107e557600080fd5b5061080060048036038101906107fb9190613858565b611711565b60405161080d919061341a565b60405180910390f35b34801561082257600080fd5b5061082b6117c9565b005b34801561083957600080fd5b50610854600480360381019061084f9190613700565b6117dd565b005b34801561086257600080fd5b5061087d60048036038101906108789190613858565b6117ef565b60405161088a9190613bb3565b60405180910390f35b34801561089f57600080fd5b506108a8611932565b6040516108b5919061341a565b60405180910390f35b3480156108ca57600080fd5b506108e560048036038101906108e09190613858565b611938565b6040516108f2919061341a565b60405180910390f35b34801561090757600080fd5b50610910611950565b60405161091d919061376e565b60405180910390f35b34801561093257600080fd5b5061094d60048036038101906109489190613530565b61197a565b005b34801561095b57600080fd5b5061096461199f565b60405161097191906136de565b60405180910390f35b610994600480360381019061098f9190613700565b611a31565b005b3480156109a257600080fd5b506109bd60048036038101906109b89190613bd5565b611cd4565b005b3480156109cb57600080fd5b506109d4611ddf565b6040516109e191906138e7565b60405180910390f35b3480156109f657600080fd5b50610a116004803603810190610a0c919061382b565b611de5565b005b610a2d6004803603810190610a289190613cb6565b611df7565b005b348015610a3b57600080fd5b50610a566004803603810190610a519190613d39565b611e48565b005b348015610a6457600080fd5b50610a6d611ec5565b604051610a7a919061341a565b60405180910390f35b348015610a8f57600080fd5b50610aaa6004803603810190610aa59190613700565b611ecb565b005b348015610ab857600080fd5b50610ad36004803603810190610ace9190613700565b611edd565b604051610ae091906136de565b60405180910390f35b348015610af557600080fd5b50610afe612032565b604051610b0b919061341a565b60405180910390f35b348015610b2057600080fd5b50610b3b6004803603810190610b369190613858565b612038565b604051610b48919061341a565b60405180910390f35b348015610b5d57600080fd5b50610b786004803603810190610b739190613700565b61204a565b005b348015610b8657600080fd5b50610ba16004803603810190610b9c9190613d79565b61205c565b604051610bae91906134e9565b60405180910390f35b348015610bc357600080fd5b50610bde6004803603810190610bd99190613700565b6120f0565b005b348015610bec57600080fd5b50610c076004803603810190610c029190613aac565b612102565b005b348015610c1557600080fd5b50610c306004803603810190610c2b9190613858565b61211d565b005b348015610c3e57600080fd5b50610c596004803603810190610c549190613db9565b6121a0565b604051610c66919061341a565b60405180910390f35b348015610c7b57600080fd5b50610c966004803603810190610c919190613700565b6122b5565b005b348015610ca457600080fd5b50610cbf6004803603810190610cba9190613530565b6122c7565b005b348015610ccd57600080fd5b50610ce86004803603810190610ce39190613858565b6122ec565b604051610cf5919061341a565b60405180910390f35b60115481565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610d5f57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610d8f5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b610d9e612304565b80601360006101000a81548160ff02191690831515021790555050565b610dc3612382565b601360009054906101000a900460ff1615610e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0a90613e79565b60405180910390fd5b601360029054906101000a900460ff16610e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5990613ee5565b60405180910390fd5b610ed6828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060145433604051602001610ebb9190613f4d565b604051602081830303815290604052805190602001206123d1565b80610f515750610f50828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505060155433604051602001610f359190613f4d565b604051602081830303815290604052805190602001206123d1565b5b610f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8790613fb4565b60405180910390fd5b6011548360166000610fa06123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205460186000610fe76123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461102c9190614003565b6110369190614003565b1115611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106e90614083565b60405180910390fd5b6011548311156110bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b3906140ef565b60405180910390fd5b600e54836110c861149a565b6110d29190614003565b1115611113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110a9061415b565b60405180910390fd5b60006111286111206123e8565b8585856121a0565b90508034101561116d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611164906141c7565b60405180910390fd5b6111806111786123e8565b8585856123f0565b61119161118b6123e8565b85612599565b5061119a6125b7565b505050565b6060600280546111ae90614216565b80601f01602080910402602001604051908101604052809291908181526020018280546111da90614216565b80156112275780601f106111fc57610100808354040283529160200191611227565b820191906000526020600020905b81548152906001019060200180831161120a57829003601f168201915b5050505050905090565b600061123c826125c1565b611272576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600b80546112bd90614216565b80601f01602080910402602001604051908101604052809291908181526020018280546112e990614216565b80156113365780601f1061130b57610100808354040283529160200191611336565b820191906000526020600020905b81548152906001019060200180831161131957829003601f168201915b505050505081565b60006113498261166b565b90508073ffffffffffffffffffffffffffffffffffffffff1661136a6123e8565b73ffffffffffffffffffffffffffffffffffffffff16146113cd57611396816113916123e8565b61205c565b6113cc576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c5481565b611490612304565b80600e8190555050565b60006114a4612620565b6001546000540303905090565b6114b9612304565b8060158190555050565b60166020528060005260406000206000915090505481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115195761151833612629565b5b611524848484612726565b50505050565b60125481565b60155481565b61153e612304565b611546612382565b60004790506115536123e8565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611598573d6000803e3d6000fd5b50506115a26125b7565b565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146115f4576115f333612629565b5b6115ff848484612a48565b50505050565b61160d612304565b80600c8190555050565b601360019054906101000a900460ff1681565b611632612304565b80600a908161164191906143e9565b5050565b601360029054906101000a900460ff1681565b601360009054906101000a900460ff1681565b600061167682612a68565b9050919050565b600a805461168a90614216565b80601f01602080910402602001604051908101604052809291908181526020018280546116b690614216565b80156117035780601f106116d857610100808354040283529160200191611703565b820191906000526020600020905b8154815290600101906020018083116116e657829003601f168201915b505050505081565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611778576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6117d1612304565b6117db6000612b34565b565b6117e5612304565b8060128190555050565b606060008060006117ff85611711565b905060008167ffffffffffffffff81111561181d5761181c613981565b5b60405190808252806020026020018201604052801561184b5781602001602082028036833780820191505090505b5090506118566133b2565b6000611860612620565b90505b8386146119245761187381612bfa565b9150816040015161191957600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146118be57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611918578083878060010198508151811061190b5761190a6144bb565b5b6020026020010181815250505b5b806001019050611863565b508195505050505050919050565b600f5481565b60186020528060005260406000206000915090505481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611982612304565b80601360016101000a81548160ff02191690831515021790555050565b6060600380546119ae90614216565b80601f01602080910402602001604051908101604052809291908181526020018280546119da90614216565b8015611a275780601f106119fc57610100808354040283529160200191611a27565b820191906000526020600020905b815481529060010190602001808311611a0a57829003601f168201915b5050505050905090565b611a39612382565b601360009054906101000a900460ff1615611a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8090613e79565b60405180910390fd5b601360029054906101000a900460ff1615611ad9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad09061455c565b60405180910390fd5b601054811115611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b15906145ee565b60405180910390fd5b600e5481611b2a61149a565b611b349190614003565b1115611b75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6c9061465a565b60405180910390fd5b6010548160176000611b856123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bca9190614003565b1115611c0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0290614083565b60405180910390fd5b80600c54611c19919061467a565b341015611c5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c52906141c7565b60405180910390fd5b8060176000611c686123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb19190614003565b92505081905550611cc9611cc36123e8565b82612599565b611cd16125b7565b50565b8060076000611ce16123e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d8e6123e8565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dd391906134e9565b60405180910390a35050565b60145481565b611ded612304565b8060148190555050565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e3557611e3433612629565b5b611e4185858585612c25565b5050505050565b611e50612304565b611e58612382565b600e5482611e6461149a565b611e6e9190614003565b1115611eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea690614708565b60405180910390fd5b611eb98183612599565b611ec16125b7565b5050565b60105481565b611ed3612304565b8060118190555050565b6060611ee8826125c1565b611f27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1e9061479a565b60405180910390fd5b60001515601360019054906101000a900460ff16151503611fd457600b8054611f4f90614216565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7b90614216565b8015611fc85780601f10611f9d57610100808354040283529160200191611fc8565b820191906000526020600020905b815481529060010190602001808311611fab57829003601f168201915b5050505050905061202d565b6000611fde612c98565b90506000815111611ffe5760405180602001604052806000815250612029565b8061200884612d2a565b604051602001612019929190614842565b6040516020818303038152906040525b9150505b919050565b600e5481565b600061204382612d7a565b9050919050565b612052612304565b8060108190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120f8612304565b80600d8190555050565b61210a612304565b80600b908161211991906143e9565b5050565b612125612304565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218b906148e3565b60405180910390fd5b61219d81612b34565b50565b6000612216838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601554876040516020016121fb9190613f4d565b604051602081830303815290604052805190602001206123d1565b80156122365750600f548461222961149a565b6122339190614003565b11155b801561228e575060125484601660008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461228b9190614003565b11155b1561229c57600090506122ad565b83600d546122aa919061467a565b90505b949350505050565b6122bd612304565b80600f8190555050565b6122cf612304565b80601360026101000a81548160ff02191690831515021790555050565b60176020528060005260406000206000915090505481565b61230c612dd1565b73ffffffffffffffffffffffffffffffffffffffff1661232a611950565b73ffffffffffffffffffffffffffffffffffffffff1614612380576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123779061494f565b60405180910390fd5b565b6002600954036123c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123be906149bb565b60405180910390fd5b6002600981905550565b6000826123de8584612dd9565b1490509392505050565b600033905090565b612464828280806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601554866040516020016124499190613f4d565b604051602081830303815290604052805190602001206123d1565b80156124845750600f548361247761149a565b6124819190614003565b11155b80156124dc575060125483601660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546124d99190614003565b11155b1561253c5782601660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125309190614003565b92505081905550612593565b82601860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461258b9190614003565b925050819055505b50505050565b6125b3828260405180602001604052806000815250612e2f565b5050565b6001600981905550565b6000816125cc612620565b111580156125db575060005482105b8015612619575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006001905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115612723576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016126a09291906149db565b602060405180830381865afa1580156126bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126e19190614a19565b61272257806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612719919061376e565b60405180910390fd5b5b50565b600061273182612a68565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612798576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806127a484612ecc565b915091506127ba81876127b56123e8565b612ef3565b612806576127cf866127ca6123e8565b61205c565b612805576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361286c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128798686866001612f37565b801561288457600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506129528561292e888887612f3d565b7c020000000000000000000000000000000000000000000000000000000017612f65565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036129d857600060018501905060006004600083815260200190815260200160002054036129d65760005481146129d5578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a408686866001612f90565b505050505050565b612a6383838360405180602001604052806000815250611df7565b505050565b60008082905080612a77612620565b11612afd57600054811015612afc5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612afa575b60008103612af0576004600083600190039350838152602001908152602001600020549050612ac6565b8092505050612b2f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612c026133b2565b612c1e6004600084815260200190815260200160002054612f96565b9050919050565b612c308484846114db565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612c9257612c5b8484848461304c565b612c91576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a8054612ca790614216565b80601f0160208091040260200160405190810160405280929190818152602001828054612cd390614216565b8015612d205780601f10612cf557610100808354040283529160200191612d20565b820191906000526020600020905b815481529060010190602001808311612d0357829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b600115612d6557600184039350600a81066030018453600a8104905080612d43575b50828103602084039350808452505050919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b60008082905060005b8451811015612e2457612e0f82868381518110612e0257612e016144bb565b5b602002602001015161319c565b91508080612e1c90614a46565b915050612de2565b508091505092915050565b612e3983836131c7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612ec757600080549050600083820390505b612e79600086838060010194508661304c565b612eaf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612e66578160005414612ec457600080fd5b50505b505050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612f54868684613382565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612f9e6133b2565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130726123e8565b8786866040518563ffffffff1660e01b81526004016130949493929190614ae3565b6020604051808303816000875af19250505080156130d057506040513d601f19601f820116820180604052508101906130cd9190614b44565b60015b613149573d8060008114613100576040519150601f19603f3d011682016040523d82523d6000602084013e613105565b606091505b506000815103613141576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60008183106131b4576131af828461338b565b6131bf565b6131be838361338b565b5b905092915050565b60008054905060008203613207576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6132146000848385612f37565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061328b8361327c6000866000612f3d565b613285856133a2565b17612f65565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461332c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506132f1565b5060008203613367576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061337d6000848385612f90565b505050565b60009392505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b6000819050919050565b61341481613401565b82525050565b600060208201905061342f600083018461340b565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61347e81613449565b811461348957600080fd5b50565b60008135905061349b81613475565b92915050565b6000602082840312156134b7576134b661343f565b5b60006134c58482850161348c565b91505092915050565b60008115159050919050565b6134e3816134ce565b82525050565b60006020820190506134fe60008301846134da565b92915050565b61350d816134ce565b811461351857600080fd5b50565b60008135905061352a81613504565b92915050565b6000602082840312156135465761354561343f565b5b60006135548482850161351b565b91505092915050565b61356681613401565b811461357157600080fd5b50565b6000813590506135838161355d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126135ae576135ad613589565b5b8235905067ffffffffffffffff8111156135cb576135ca61358e565b5b6020830191508360208202830111156135e7576135e6613593565b5b9250929050565b6000806000604084860312156136075761360661343f565b5b600061361586828701613574565b935050602084013567ffffffffffffffff81111561363657613635613444565b5b61364286828701613598565b92509250509250925092565b600081519050919050565b600082825260208201905092915050565b60005b8381101561368857808201518184015260208101905061366d565b60008484015250505050565b6000601f19601f8301169050919050565b60006136b08261364e565b6136ba8185613659565b93506136ca81856020860161366a565b6136d381613694565b840191505092915050565b600060208201905081810360008301526136f881846136a5565b905092915050565b6000602082840312156137165761371561343f565b5b600061372484828501613574565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137588261372d565b9050919050565b6137688161374d565b82525050565b6000602082019050613783600083018461375f565b92915050565b6137928161374d565b811461379d57600080fd5b50565b6000813590506137af81613789565b92915050565b600080604083850312156137cc576137cb61343f565b5b60006137da858286016137a0565b92505060206137eb85828601613574565b9150509250929050565b6000819050919050565b613808816137f5565b811461381357600080fd5b50565b600081359050613825816137ff565b92915050565b6000602082840312156138415761384061343f565b5b600061384f84828501613816565b91505092915050565b60006020828403121561386e5761386d61343f565b5b600061387c848285016137a0565b91505092915050565b60008060006060848603121561389e5761389d61343f565b5b60006138ac868287016137a0565b93505060206138bd868287016137a0565b92505060406138ce86828701613574565b9150509250925092565b6138e1816137f5565b82525050565b60006020820190506138fc60008301846138d8565b92915050565b6000819050919050565b600061392761392261391d8461372d565b613902565b61372d565b9050919050565b60006139398261390c565b9050919050565b600061394b8261392e565b9050919050565b61395b81613940565b82525050565b60006020820190506139766000830184613952565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6139b982613694565b810181811067ffffffffffffffff821117156139d8576139d7613981565b5b80604052505050565b60006139eb613435565b90506139f782826139b0565b919050565b600067ffffffffffffffff821115613a1757613a16613981565b5b613a2082613694565b9050602081019050919050565b82818337600083830152505050565b6000613a4f613a4a846139fc565b6139e1565b905082815260208101848484011115613a6b57613a6a61397c565b5b613a76848285613a2d565b509392505050565b600082601f830112613a9357613a92613589565b5b8135613aa3848260208601613a3c565b91505092915050565b600060208284031215613ac257613ac161343f565b5b600082013567ffffffffffffffff811115613ae057613adf613444565b5b613aec84828501613a7e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613b2a81613401565b82525050565b6000613b3c8383613b21565b60208301905092915050565b6000602082019050919050565b6000613b6082613af5565b613b6a8185613b00565b9350613b7583613b11565b8060005b83811015613ba6578151613b8d8882613b30565b9750613b9883613b48565b925050600181019050613b79565b5085935050505092915050565b60006020820190508181036000830152613bcd8184613b55565b905092915050565b60008060408385031215613bec57613beb61343f565b5b6000613bfa858286016137a0565b9250506020613c0b8582860161351b565b9150509250929050565b600067ffffffffffffffff821115613c3057613c2f613981565b5b613c3982613694565b9050602081019050919050565b6000613c59613c5484613c15565b6139e1565b905082815260208101848484011115613c7557613c7461397c565b5b613c80848285613a2d565b509392505050565b600082601f830112613c9d57613c9c613589565b5b8135613cad848260208601613c46565b91505092915050565b60008060008060808587031215613cd057613ccf61343f565b5b6000613cde878288016137a0565b9450506020613cef878288016137a0565b9350506040613d0087828801613574565b925050606085013567ffffffffffffffff811115613d2157613d20613444565b5b613d2d87828801613c88565b91505092959194509250565b60008060408385031215613d5057613d4f61343f565b5b6000613d5e85828601613574565b9250506020613d6f858286016137a0565b9150509250929050565b60008060408385031215613d9057613d8f61343f565b5b6000613d9e858286016137a0565b9250506020613daf858286016137a0565b9150509250929050565b60008060008060608587031215613dd357613dd261343f565b5b6000613de1878288016137a0565b9450506020613df287828801613574565b935050604085013567ffffffffffffffff811115613e1357613e12613444565b5b613e1f87828801613598565b925092505092959194509250565b7f53533a206f6f707320636f6e7472616374206973207061757365640000000000600082015250565b6000613e63601b83613659565b9150613e6e82613e2d565b602082019050919050565b60006020820190508181036000830152613e9281613e56565b9050919050565b7f53533a2050726573616c65204861736e27742073746172746564207965740000600082015250565b6000613ecf601e83613659565b9150613eda82613e99565b602082019050919050565b60006020820190508181036000830152613efe81613ec2565b9050919050565b60008160601b9050919050565b6000613f1d82613f05565b9050919050565b6000613f2f82613f12565b9050919050565b613f47613f428261374d565b613f24565b82525050565b6000613f598284613f36565b60148201915081905092915050565b7f53533a20596f7520617265206e6f742057686974656c69737465640000000000600082015250565b6000613f9e601b83613659565b9150613fa982613f68565b602082019050919050565b60006020820190508181036000830152613fcd81613f91565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061400e82613401565b915061401983613401565b925082820190508082111561403157614030613fd4565b5b92915050565b7f53533a204d6178204e4654205065722057616c6c657420657863656564656400600082015250565b600061406d601f83613659565b915061407882614037565b602082019050919050565b6000602082019050818103600083015261409c81614060565b9050919050565b7f53533a206d6178206d696e742070657220547820657863656564656400000000600082015250565b60006140d9601c83613659565b91506140e4826140a3565b602082019050919050565b60006020820190508181036000830152614108816140cc565b9050919050565b7f53533a204d6178537570706c7920657863656564656400000000000000000000600082015250565b6000614145601683613659565b91506141508261410f565b602082019050919050565b6000602082019050818103600083015261417481614138565b9050919050565b7f53533a20696e73756666696369656e742066756e647300000000000000000000600082015250565b60006141b1601683613659565b91506141bc8261417b565b602082019050919050565b600060208201905081810360008301526141e0816141a4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061422e57607f821691505b602082108103614241576142406141e7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026142a97fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261426c565b6142b3868361426c565b95508019841693508086168417925050509392505050565b60006142e66142e16142dc84613401565b613902565b613401565b9050919050565b6000819050919050565b614300836142cb565b61431461430c826142ed565b848454614279565b825550505050565b600090565b61432961431c565b6143348184846142f7565b505050565b5b818110156143585761434d600082614321565b60018101905061433a565b5050565b601f82111561439d5761436e81614247565b6143778461425c565b81016020851015614386578190505b61439a6143928561425c565b830182614339565b50505b505050565b600082821c905092915050565b60006143c0600019846008026143a2565b1980831691505092915050565b60006143d983836143af565b9150826002028217905092915050565b6143f28261364e565b67ffffffffffffffff81111561440b5761440a613981565b5b6144158254614216565b61442082828561435c565b600060209050601f8311600181146144535760008415614441578287015190505b61444b85826143cd565b8655506144b3565b601f19841661446186614247565b60005b8281101561448957848901518255600182019150602085019450602081019050614464565b868310156144a657848901516144a2601f8916826143af565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53533a205075626c696353616c65204861736e2774207374617274656420796560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614546602183613659565b9150614551826144ea565b604082019050919050565b6000602082019050818103600083015261457581614539565b9050919050565b7f53533a206d6178206d696e7420616d6f756e742070657220747820657863656560008201527f6465640000000000000000000000000000000000000000000000000000000000602082015250565b60006145d8602383613659565b91506145e38261457c565b604082019050919050565b60006020820190508181036000830152614607816145cb565b9050919050565b7f53533a20576520536f6c646f7574000000000000000000000000000000000000600082015250565b6000614644600e83613659565b915061464f8261460e565b602082019050919050565b6000602082019050818103600083015261467381614637565b9050919050565b600061468582613401565b915061469083613401565b925082820261469e81613401565b915082820484148315176146b5576146b4613fd4565b5b5092915050565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b60006146f2601683613659565b91506146fd826146bc565b602082019050919050565b60006020820190508181036000830152614721816146e5565b9050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b6000614784603083613659565b915061478f82614728565b604082019050919050565b600060208201905081810360008301526147b381614777565b9050919050565b600081905092915050565b60006147d08261364e565b6147da81856147ba565b93506147ea81856020860161366a565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061482c6005836147ba565b9150614837826147f6565b600582019050919050565b600061484e82856147c5565b915061485a82846147c5565b91506148658261481f565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148cd602683613659565b91506148d882614871565b604082019050919050565b600060208201905081810360008301526148fc816148c0565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614939602083613659565b915061494482614903565b602082019050919050565b600060208201905081810360008301526149688161492c565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006149a5601f83613659565b91506149b08261496f565b602082019050919050565b600060208201905081810360008301526149d481614998565b9050919050565b60006040820190506149f0600083018561375f565b6149fd602083018461375f565b9392505050565b600081519050614a1381613504565b92915050565b600060208284031215614a2f57614a2e61343f565b5b6000614a3d84828501614a04565b91505092915050565b6000614a5182613401565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a8357614a82613fd4565b5b600182019050919050565b600081519050919050565b600082825260208201905092915050565b6000614ab582614a8e565b614abf8185614a99565b9350614acf81856020860161366a565b614ad881613694565b840191505092915050565b6000608082019050614af8600083018761375f565b614b05602083018661375f565b614b12604083018561340b565b8181036060830152614b248184614aaa565b905095945050505050565b600081519050614b3e81613475565b92915050565b600060208284031215614b5a57614b5961343f565b5b6000614b6884828501614b2f565b9150509291505056fea26469706673582212205671fad92a742f804f7532ff5020e067ca9200e7d9ace79b45cbcdc6a90ccf2664736f6c63430008120033
Deployed Bytecode Sourcemap
359:9242:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;700:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9155:630:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8454:77:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2285:1312;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10039:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16360:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;473:28:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15812:398:5;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;507:33:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7978:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5894:317:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6998:98:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;927:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8941:199;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;739:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;899:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8738:170;;;:::i;:::-;;1158:142:9;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9146:207:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7676:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;806:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8112:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;840:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;774;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11391:150:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;446:21:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;546:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7045:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;7515:92:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5779:950;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;624:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1039:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6752:80:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10208:102:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1538:699:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16901:231:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;872:21:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6898:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9359:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4510:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;663:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7405:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4854:693;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;587:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5608:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7148:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17282:162:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7832:92:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8248:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3603:428:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7254:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8602:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;982:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;700:33;;;;:::o;9155:630:5:-;9240:4;9573:10;9558:25;;:11;:25;;;;:101;;;;9649:10;9634:25;;:11;:25;;;;9558:101;:177;;;;9725:10;9710:25;;:11;:25;;;;9558:177;9539:196;;9155:630;;;:::o;8454:77:4:-;1094:13:0;:11;:13::i;:::-;8518:6:4::1;8509;;:15;;;;;;;;;;;;;;;;;;8454:77:::0;:::o;2285:1312::-;2261:21:1;:19;:21::i;:::-;2429:6:4::1;;;;;;;;;;;2428:7;2420:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;2485:7;;;;;;;;;;;2477:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;2558:142;2594:11;;2558:142;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2623:6;;2674:10;2657:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2647:39;;;;;;2558:18;:142::i;:::-;:321;;;;2720:159;2760:11;;2720:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2793:7;;2849:10;2832:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2822:39;;;;;;2720:18;:159::i;:::-;2558:321;2537:395;;;;;;;;;;;;:::i;:::-;;;;;;;;;3072:14;;3046:6;3008:14;:35;3023:19;:17;:19::i;:::-;3008:35;;;;;;;;;;;;;;;;2963:21;:42;2985:19;:17;:19::i;:::-;2963:42;;;;;;;;;;;;;;;;:80;;;;:::i;:::-;:89;;;;:::i;:::-;:123;;2942:201;;;;;;;;;;;;:::i;:::-;;;;;;;;;3171:14;;3161:6;:24;;3153:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;3275:9;;3265:6;3249:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;3228:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;3342:18;3363:50;3372:19;:17;:19::i;:::-;3393:6;3401:11;;3363:8;:50::i;:::-;3342:71;;3444:10;3431:9;:23;;3423:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;3491:51;3501:19;:17;:19::i;:::-;3522:6;3530:11;;3491:9;:51::i;:::-;3552:38;3562:19;:17;:19::i;:::-;3583:6;3552:9;:38::i;:::-;2410:1187;2303:20:1::0;:18;:20::i;:::-;2285:1312:4;;;:::o;10039:98:5:-;10093:13;10125:5;10118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:98;:::o;16360:214::-;16436:7;16460:16;16468:7;16460;:16::i;:::-;16455:64;;16485:34;;;;;;;;;;;;;;16455:64;16537:15;:24;16553:7;16537:24;;;;;;;;;;;:30;;;;;;;;;;;;16530:37;;16360:214;;;:::o;473:28:4:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;15812:398:5:-;15900:13;15916:16;15924:7;15916;:16::i;:::-;15900:32;;15970:5;15947:28;;:19;:17;:19::i;:::-;:28;;;15943:172;;15994:44;16011:5;16018:19;:17;:19::i;:::-;15994:16;:44::i;:::-;15989:126;;16065:35;;;;;;;;;;;;;;15989:126;15943:172;16158:2;16125:15;:24;16141:7;16125:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16195:7;16191:2;16175:28;;16184:5;16175:28;;;;;;;;;;;;15890:320;15812:398;;:::o;507:33:4:-;;;;:::o;7978:98::-;1094:13:0;:11;:13::i;:::-;8059:10:4::1;8047:9;:22;;;;7978:98:::0;:::o;5894:317:5:-;5955:7;6179:15;:13;:15::i;:::-;6164:12;;6148:13;;:28;:46;6141:53;;5894:317;:::o;6998:98:4:-;1094:13:0;:11;:13::i;:::-;7078:11:4::1;7068:7;:21;;;;6998:98:::0;:::o;927:49::-;;;;;;;;;;;;;;;;;:::o;8941:199::-;9080:4;2646:10:9;2638:18;;:4;:18;;;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;2634:81;9096:37:4::1;9115:4;9121:2;9125:7;9096:18;:37::i;:::-;8941:199:::0;;;;:::o;739:29::-;;;;:::o;899:22::-;;;;:::o;8738:170::-;1094:13:0;:11;:13::i;:::-;2261:21:1::1;:19;:21::i;:::-;8806:15:4::2;8824:21;8806:39;;8863:19;:17;:19::i;:::-;8855:37;;:46;8893:7;8855:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;8796:112;2303:20:1::1;:18;:20::i;:::-;8738:170:4:o:0;1158:142:9:-;120:42:10;1158:142:9;:::o;9146:207:4:-;9289:4;2646:10:9;2638:18;;:4;:18;;;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;2634:81;9305:41:4::1;9328:4;9334:2;9338:7;9305:22;:41::i;:::-;9146:207:::0;;;;:::o;7676:84::-;1094:13:0;:11;:13::i;:::-;7745:8:4::1;7738:4;:15;;;;7676:84:::0;:::o;806:28::-;;;;;;;;;;;;;:::o;8112:102::-;1094:13:0;:11;:13::i;:::-;8196:11:4::1;8186:7;:21;;;;;;:::i;:::-;;8112:102:::0;:::o;840:26::-;;;;;;;;;;;;;:::o;774:::-;;;;;;;;;;;;;:::o;11391:150:5:-;11463:7;11505:27;11524:7;11505:18;:27::i;:::-;11482:52;;11391:150;;;:::o;446:21:4:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;546:35::-;;;;:::o;7045:230:5:-;7117:7;7157:1;7140:19;;:5;:19;;;7136:60;;7168:28;;;;;;;;;;;;;;7136:60;1360:13;7213:18;:25;7232:5;7213:25;;;;;;;;;;;;;;;;:55;7206:62;;7045:230;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;7515:92:4:-;1094:13:0;:11;:13::i;:::-;7594:6:4::1;7581:10;:19;;;;7515:92:::0;:::o;5779:950::-;5862:16;5918:19;5951:25;5990:22;6015:16;6025:5;6015:9;:16::i;:::-;5990:41;;6045:25;6087:14;6073:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6045:57;;6116:31;;:::i;:::-;6183:9;6195:15;:13;:15::i;:::-;6183:27;;6161:523;6243:14;6228:11;:29;6161:523;;6323:15;6336:1;6323:12;:15::i;:::-;6311:27;;6360:9;:16;;;6400:8;6356:71;6474:1;6448:28;;:9;:14;;;:28;;;6444:109;;6520:9;:14;;;6500:34;;6444:109;6595:5;6574:26;;:17;:26;;;6570:100;;6650:1;6624:8;6633:13;;;;;;6624:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6570:100;6161:523;6275:3;;;;;6161:523;;;;6704:8;6697:15;;;;;;;5779:950;;;:::o;624:33::-;;;;:::o;1039:56::-;;;;;;;;;;;;;;;;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;6752:80:4:-;1094:13:0;:11;:13::i;:::-;6819:6:4::1;6808:8;;:17;;;;;;;;;;;;;;;;;;6752:80:::0;:::o;10208:102:5:-;10264:13;10296:7;10289:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10208:102;:::o;1538:699:4:-;2261:21:1;:19;:21::i;:::-;1615:6:4::1;;;;;;;;;;;1614:7;1606:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1672:7;;;;;;;;;;;1671:8;1663:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1758:12;;1748:6;:22;;1727:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;1875:9;;1865:6;1849:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;1841:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;1984:12;;1974:6;1934:16;:37;1951:19;:17;:19::i;:::-;1934:37;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:62;;1913:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;2091:6;2084:4;;:13;;;;:::i;:::-;2071:9;:26;;2063:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;2176:6;2135:16;:37;2152:19;:17;:19::i;:::-;2135:37;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;2192:38;2202:19;:17;:19::i;:::-;2223:6;2192:9;:38::i;:::-;2303:20:1::0;:18;:20::i;:::-;1538:699:4;:::o;16901:231:5:-;17047:8;16995:18;:39;17014:19;:17;:19::i;:::-;16995:39;;;;;;;;;;;;;;;:49;17035:8;16995:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17106:8;17070:55;;17085:19;:17;:19::i;:::-;17070:55;;;17116:8;17070:55;;;;;;:::i;:::-;;;;;;;;16901:231;;:::o;872:21:4:-;;;;:::o;6898:94::-;1094:13:0;:11;:13::i;:::-;6975:10:4::1;6966:6;:19;;;;6898:94:::0;:::o;9359:240::-;9529:4;2646:10:9;2638:18;;:4;:18;;;2634:81;;2672:32;2693:10;2672:20;:32::i;:::-;2634:81;9545:47:4::1;9568:4;9574:2;9578:7;9587:4;9545:22;:47::i;:::-;9359:240:::0;;;;;:::o;4510:289::-;1094:13:0;:11;:13::i;:::-;2261:21:1::1;:19;:21::i;:::-;4689:9:4::2;;4674:11;4658:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:40;;4637:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;4757:35;4767:11;4780;4757:9;:35::i;:::-;2303:20:1::1;:18;:20::i;:::-;4510:289:4::0;;:::o;663:31::-;;;;:::o;7405:100::-;1094:13:0;:11;:13::i;:::-;7492:6:4::1;7475:14;:23;;;;7405:100:::0;:::o;4854:693::-;4967:13;5017:16;5025:7;5017;:16::i;:::-;4996:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;5134:5;5122:17;;:8;;;;;;;;;;;:17;;;5118:69;;5162:14;5155:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5118:69;5197:28;5228:10;:8;:10::i;:::-;5197:41;;5298:1;5273:14;5267:28;:32;:273;;;;;;;;;;;;;;;;;5388:14;5428:18;5438:7;5428:9;:18::i;:::-;5346:155;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5267:273;5248:292;;;4854:693;;;;:::o;587:31::-;;;;:::o;5608:111::-;5666:7;5692:20;5706:5;5692:13;:20::i;:::-;5685:27;;5608:111;;;:::o;7148:96::-;1094:13:0;:11;:13::i;:::-;7231:6:4::1;7216:12;:21;;;;7148:96:::0;:::o;17282:162:5:-;17379:4;17402:18;:25;17421:5;17402:25;;;;;;;;;;;;;;;:35;17428:8;17402:35;;;;;;;;;;;;;;;;;;;;;;;;;17395:42;;17282:162;;;;:::o;7832:92:4:-;1094:13:0;:11;:13::i;:::-;7907:10:4::1;7898:6;:19;;;;7832:92:::0;:::o;8248:124::-;1094:13:0;:11;:13::i;:::-;8350:15:4::1;8333:14;:32;;;;;;:::i;:::-;;8248:124:::0;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;::::0;2161:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;3603:428:4:-;3732:13;3764:79;3783:11;;3764:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3796:7;;3832:8;3815:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;3805:37;;;;;;3764:18;:79::i;:::-;:121;;;;;3873:12;;3863:6;3847:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:38;;3764:121;:172;;;;;3926:10;;3916:6;3889:14;:24;3904:8;3889:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:47;;3764:172;3761:264;;;3959:1;3952:8;;;;3761:264;4008:6;3999;;:15;;;;:::i;:::-;3992:22;;3603:428;;;;;;;:::o;7254:96::-;1094:13:0;:11;:13::i;:::-;7337:6:4::1;7322:12;:21;;;;7254:96:::0;:::o;8602:88::-;1094:13:0;:11;:13::i;:::-;8677:6:4::1;8667:7;;:16;;;;;;;;;;;;;;;;;;8602:88:::0;:::o;982:51::-;;;;;;;;;;;;;;;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;2336:287:1:-;1759:1;2468:7;;:19;2460:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1759:1;2598:7;:18;;;;2336:287::o;1156:184:3:-;1277:4;1329;1300:25;1313:5;1320:4;1300:12;:25::i;:::-;:33;1293:40;;1156:184;;;;;:::o;39437:103:5:-;39497:7;39523:10;39516:17;;39437:103;:::o;4037:420:4:-;4144:79;4163:11;;4144:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4176:7;;4212:8;4195:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;4185:37;;;;;;4144:18;:79::i;:::-;:121;;;;;4253:12;;4243:6;4227:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:38;;4144:121;:172;;;;;4306:10;;4296:6;4269:14;:24;4284:8;4269:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:47;;4144:172;4141:309;;;4360:6;4332:14;:24;4347:8;4332:24;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;4141:309;;;4433:6;4398:21;:31;4420:8;4398:31;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;4141:309;4037:420;;;;:::o;33423:110:5:-;33499:27;33509:2;33513:8;33499:27;;;;;;;;;;;;:9;:27::i;:::-;33423:110;;:::o;2629:209:1:-;1716:1;2809:7;:22;;;;2629:209::o;17693:277:5:-;17758:4;17812:7;17793:15;:13;:15::i;:::-;:26;;:65;;;;;17845:13;;17835:7;:23;17793:65;:151;;;;;17943:1;2118:8;17895:17;:26;17913:7;17895:26;;;;;;;;;;;;:44;:49;17793:151;17774:170;;17693:277;;;:::o;1394:99:4:-;1459:7;1485:1;1478:8;;1394:99;:::o;3038:638:9:-;3275:1;120:42:10;3227:45:9;;;:49;3223:447;;;120:42:10;3523::9;;;3574:4;3581:8;3523:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3518:142;;3636:8;3617:28;;;;;;;;;;;:::i;:::-;;;;;;;;3518:142;3223:447;3038:638;:::o;19903:2764:5:-;20040:27;20070;20089:7;20070:18;:27::i;:::-;20040:57;;20153:4;20112:45;;20128:19;20112:45;;;20108:86;;20166:28;;;;;;;;;;;;;;20108:86;20206:27;20235:23;20262:35;20289:7;20262:26;:35::i;:::-;20205:92;;;;20394:68;20419:15;20436:4;20442:19;:17;:19::i;:::-;20394:24;:68::i;:::-;20389:179;;20481:43;20498:4;20504:19;:17;:19::i;:::-;20481:16;:43::i;:::-;20476:92;;20533:35;;;;;;;;;;;;;;20476:92;20389:179;20597:1;20583:16;;:2;:16;;;20579:52;;20608:23;;;;;;;;;;;;;;20579:52;20642:43;20664:4;20670:2;20674:7;20683:1;20642:21;:43::i;:::-;20774:15;20771:157;;;20912:1;20891:19;20884:30;20771:157;21300:18;:24;21319:4;21300:24;;;;;;;;;;;;;;;;21298:26;;;;;;;;;;;;21368:18;:22;21387:2;21368:22;;;;;;;;;;;;;;;;21366:24;;;;;;;;;;;21683:143;21719:2;21767:45;21782:4;21788:2;21792:19;21767:14;:45::i;:::-;2392:8;21739:73;21683:18;:143::i;:::-;21654:17;:26;21672:7;21654:26;;;;;;;;;;;:172;;;;21994:1;2392:8;21943:19;:47;:52;21939:617;;22015:19;22047:1;22037:7;:11;22015:33;;22202:1;22168:17;:30;22186:11;22168:30;;;;;;;;;;;;:35;22164:378;;22304:13;;22289:11;:28;22285:239;;22482:19;22449:17;:30;22467:11;22449:30;;;;;;;;;;;:52;;;;22285:239;22164:378;21997:559;21939:617;22600:7;22596:2;22581:27;;22590:4;22581:27;;;;;;;;;;;;22618:42;22639:4;22645:2;22649:7;22658:1;22618:20;:42::i;:::-;20030:2637;;;19903:2764;;;:::o;22758:187::-;22899:39;22916:4;22922:2;22926:7;22899:39;;;;;;;;;;;;:16;:39::i;:::-;22758:187;;;:::o;12515:1249::-;12582:7;12601:12;12616:7;12601:22;;12681:4;12662:15;:13;:15::i;:::-;:23;12658:1042;;12714:13;;12707:4;:20;12703:997;;;12751:14;12768:17;:23;12786:4;12768:23;;;;;;;;;;;;12751:40;;12883:1;2118:8;12855:6;:24;:29;12851:831;;13510:111;13527:1;13517:6;:11;13510:111;;13569:17;:25;13587:6;;;;;;;13569:25;;;;;;;;;;;;13560:34;;13510:111;;;13653:6;13646:13;;;;;;12851:831;12729:971;12703:997;12658:1042;13726:31;;;;;;;;;;;;;;12515:1249;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;11979:159:5:-;12047:21;;:::i;:::-;12087:44;12106:17;:24;12124:5;12106:24;;;;;;;;;;;;12087:18;:44::i;:::-;12080:51;;11979:159;;;:::o;23526:396::-;23695:31;23708:4;23714:2;23718:7;23695:12;:31::i;:::-;23758:1;23740:2;:14;;;:19;23736:180;;23778:56;23809:4;23815:2;23819:7;23828:5;23778:30;:56::i;:::-;23773:143;;23861:40;;;;;;;;;;;;;;23773:143;23736:180;23526:396;;;;:::o;1282:106:4:-;1342:13;1374:7;1367:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1282:106;:::o;39637:1708:5:-;39702:17;40130:4;40123;40117:11;40113:22;40220:1;40214:4;40207:15;40293:4;40290:1;40286:12;40279:19;;40373:1;40368:3;40361:14;40474:3;40708:5;40690:419;40716:1;40690:419;;;40755:1;40750:3;40746:11;40739:18;;40923:2;40917:4;40913:13;40909:2;40905:22;40900:3;40892:36;41015:2;41009:4;41005:13;40997:21;;41080:4;40690:419;41070:25;40690:419;40694:21;41146:3;41141;41137:13;41259:4;41254:3;41250:14;41243:21;;41322:6;41317:3;41310:19;39740:1599;;;39637:1708;;;:::o;7352:176::-;7413:7;1360:13;1495:2;7440:18;:25;7459:5;7440:25;;;;;;;;;;;;;;;;:50;;7439:82;7432:89;;7352:176;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;1994:290:3:-;2077:7;2096:20;2119:4;2096:27;;2138:9;2133:116;2157:5;:12;2153:1;:16;2133:116;;;2205:33;2215:12;2229:5;2235:1;2229:8;;;;;;;;:::i;:::-;;;;;;;;2205:9;:33::i;:::-;2190:48;;2171:3;;;;;:::i;:::-;;;;2133:116;;;;2265:12;2258:19;;;1994:290;;;;:::o;32675:669:5:-;32801:19;32807:2;32811:8;32801:5;:19::i;:::-;32877:1;32859:2;:14;;;:19;32855:473;;32898:11;32912:13;;32898:27;;32943:13;32965:8;32959:3;:14;32943:30;;32991:229;33021:62;33060:1;33064:2;33068:7;;;;;;33077:5;33021:30;:62::i;:::-;33016:165;;33118:40;;;;;;;;;;;;;;33016:165;33215:3;33207:5;:11;32991:229;;33300:3;33283:13;;:20;33279:34;;33305:8;;;33279:34;32880:448;;32855:473;32675:669;;;:::o;18828:474::-;18927:27;18956:23;18995:38;19036:15;:24;19052:7;19036:24;;;;;;;;;;;18995:65;;19210:18;19187:41;;19266:19;19260:26;19241:45;;19173:123;18828:474;;;:::o;18074:646::-;18219:11;18381:16;18374:5;18370:28;18361:37;;18539:16;18528:9;18524:32;18511:45;;18687:15;18676:9;18673:30;18665:5;18654:9;18651:20;18648:56;18638:66;;18074:646;;;;;:::o;24566:154::-;;;;;:::o;38764:304::-;38895:7;38914:16;2513:3;38940:19;:41;;38914:68;;2513:3;39007:31;39018:4;39024:2;39028:9;39007:10;:31::i;:::-;38999:40;;:62;;38992:69;;;38764:304;;;;;:::o;14297:443::-;14377:14;14542:16;14535:5;14531:28;14522:37;;14717:5;14703:11;14678:23;14674:41;14671:52;14664:5;14661:63;14651:73;;14297:443;;;;:::o;25367:153::-;;;;;:::o;13858:361::-;13924:31;;:::i;:::-;14000:6;13967:9;:14;;:41;;;;;;;;;;;2004:3;14052:6;:33;;14018:9;:24;;:68;;;;;;;;;;;14143:1;2118:8;14115:6;:24;:29;;14096:9;:16;;:48;;;;;;;;;;;2513:3;14183:6;:28;;14154:9;:19;;:58;;;;;;;;;;;13858:361;;;:::o;25948:697::-;26106:4;26151:2;26126:45;;;26172:19;:17;:19::i;:::-;26193:4;26199:7;26208:5;26126:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26122:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26421:1;26404:6;:13;:18;26400:229;;26449:40;;;;;;;;;;;;;;26400:229;26589:6;26583:13;26574:6;26570:2;26566:15;26559:38;26122:517;26292:54;;;26282:64;;;:6;:64;;;;26275:71;;;25948:697;;;;;;:::o;8879:147:3:-;8942:7;8972:1;8968;:5;:51;;8999:20;9014:1;9017;8999:14;:20::i;:::-;8968:51;;;8976:20;8991:1;8994;8976:14;:20::i;:::-;8968:51;8961:58;;8879:147;;;;:::o;27091:2902:5:-;27163:20;27186:13;;27163:36;;27225:1;27213:8;:13;27209:44;;27235:18;;;;;;;;;;;;;;27209:44;27264:61;27294:1;27298:2;27302:12;27316:8;27264:21;:61::i;:::-;27797:1;1495:2;27767:1;:26;;27766:32;27754:8;:45;27728:18;:22;27747:2;27728:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28069:136;28105:2;28158:33;28181:1;28185:2;28189:1;28158:14;:33::i;:::-;28125:30;28146:8;28125:20;:30::i;:::-;:66;28069:18;:136::i;:::-;28035:17;:31;28053:12;28035:31;;;;;;;;;;;:170;;;;28220:16;28250:11;28279:8;28264:12;:23;28250:37;;28792:16;28788:2;28784:25;28772:37;;29156:12;29117:8;29077:1;29016:25;28958:1;28898;28872:328;29520:1;29506:12;29502:20;29461:339;29560:3;29551:7;29548:16;29461:339;;29774:7;29764:8;29761:1;29734:25;29731:1;29728;29723:59;29612:1;29603:7;29599:15;29588:26;;29461:339;;;29465:75;29843:1;29831:8;:13;29827:45;;29853:19;;;;;;;;;;;;;;29827:45;29903:3;29887:13;:19;;;;27508:2409;;29926:60;29955:1;29959:2;29963:12;29977:8;29926:20;:60::i;:::-;27153:2840;27091:2902;;:::o;38475:143::-;38608:6;38475:143;;;;;:::o;9032:261:3:-;9100:13;9204:1;9198:4;9191:15;9232:1;9226:4;9219:15;9272:4;9266;9256:21;9247:30;;9032:261;;;;:::o;14837:318:5:-;14907:14;15136:1;15126:8;15123:15;15097:24;15093:46;15083:56;;14837:318;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:77:11:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:149;805:7;845:66;838:5;834:78;823:89;;769:149;;;:::o;924:120::-;996:23;1013:5;996:23;:::i;:::-;989:5;986:34;976:62;;1034:1;1031;1024:12;976:62;924:120;:::o;1050:137::-;1095:5;1133:6;1120:20;1111:29;;1149:32;1175:5;1149:32;:::i;:::-;1050:137;;;;:::o;1193:327::-;1251:6;1300:2;1288:9;1279:7;1275:23;1271:32;1268:119;;;1306:79;;:::i;:::-;1268:119;1426:1;1451:52;1495:7;1486:6;1475:9;1471:22;1451:52;:::i;:::-;1441:62;;1397:116;1193:327;;;;:::o;1526:90::-;1560:7;1603:5;1596:13;1589:21;1578:32;;1526:90;;;:::o;1622:109::-;1703:21;1718:5;1703:21;:::i;:::-;1698:3;1691:34;1622:109;;:::o;1737:210::-;1824:4;1862:2;1851:9;1847:18;1839:26;;1875:65;1937:1;1926:9;1922:17;1913:6;1875:65;:::i;:::-;1737:210;;;;:::o;1953:116::-;2023:21;2038:5;2023:21;:::i;:::-;2016:5;2013:32;2003:60;;2059:1;2056;2049:12;2003:60;1953:116;:::o;2075:133::-;2118:5;2156:6;2143:20;2134:29;;2172:30;2196:5;2172:30;:::i;:::-;2075:133;;;;:::o;2214:323::-;2270:6;2319:2;2307:9;2298:7;2294:23;2290:32;2287:119;;;2325:79;;:::i;:::-;2287:119;2445:1;2470:50;2512:7;2503:6;2492:9;2488:22;2470:50;:::i;:::-;2460:60;;2416:114;2214:323;;;;:::o;2543:122::-;2616:24;2634:5;2616:24;:::i;:::-;2609:5;2606:35;2596:63;;2655:1;2652;2645:12;2596:63;2543:122;:::o;2671:139::-;2717:5;2755:6;2742:20;2733:29;;2771:33;2798:5;2771:33;:::i;:::-;2671:139;;;;:::o;2816:117::-;2925:1;2922;2915:12;2939:117;3048:1;3045;3038:12;3062:117;3171:1;3168;3161:12;3202:568;3275:8;3285:6;3335:3;3328:4;3320:6;3316:17;3312:27;3302:122;;3343:79;;:::i;:::-;3302:122;3456:6;3443:20;3433:30;;3486:18;3478:6;3475:30;3472:117;;;3508:79;;:::i;:::-;3472:117;3622:4;3614:6;3610:17;3598:29;;3676:3;3668:4;3660:6;3656:17;3646:8;3642:32;3639:41;3636:128;;;3683:79;;:::i;:::-;3636:128;3202:568;;;;;:::o;3776:704::-;3871:6;3879;3887;3936:2;3924:9;3915:7;3911:23;3907:32;3904:119;;;3942:79;;:::i;:::-;3904:119;4062:1;4087:53;4132:7;4123:6;4112:9;4108:22;4087:53;:::i;:::-;4077:63;;4033:117;4217:2;4206:9;4202:18;4189:32;4248:18;4240:6;4237:30;4234:117;;;4270:79;;:::i;:::-;4234:117;4383:80;4455:7;4446:6;4435:9;4431:22;4383:80;:::i;:::-;4365:98;;;;4160:313;3776:704;;;;;:::o;4486:99::-;4538:6;4572:5;4566:12;4556:22;;4486:99;;;:::o;4591:169::-;4675:11;4709:6;4704:3;4697:19;4749:4;4744:3;4740:14;4725:29;;4591:169;;;;:::o;4766:246::-;4847:1;4857:113;4871:6;4868:1;4865:13;4857:113;;;4956:1;4951:3;4947:11;4941:18;4937:1;4932:3;4928:11;4921:39;4893:2;4890:1;4886:10;4881:15;;4857:113;;;5004:1;4995:6;4990:3;4986:16;4979:27;4828:184;4766:246;;;:::o;5018:102::-;5059:6;5110:2;5106:7;5101:2;5094:5;5090:14;5086:28;5076:38;;5018:102;;;:::o;5126:377::-;5214:3;5242:39;5275:5;5242:39;:::i;:::-;5297:71;5361:6;5356:3;5297:71;:::i;:::-;5290:78;;5377:65;5435:6;5430:3;5423:4;5416:5;5412:16;5377:65;:::i;:::-;5467:29;5489:6;5467:29;:::i;:::-;5462:3;5458:39;5451:46;;5218:285;5126:377;;;;:::o;5509:313::-;5622:4;5660:2;5649:9;5645:18;5637:26;;5709:9;5703:4;5699:20;5695:1;5684:9;5680:17;5673:47;5737:78;5810:4;5801:6;5737:78;:::i;:::-;5729:86;;5509:313;;;;:::o;5828:329::-;5887:6;5936:2;5924:9;5915:7;5911:23;5907:32;5904:119;;;5942:79;;:::i;:::-;5904:119;6062:1;6087:53;6132:7;6123:6;6112:9;6108:22;6087:53;:::i;:::-;6077:63;;6033:117;5828:329;;;;:::o;6163:126::-;6200:7;6240:42;6233:5;6229:54;6218:65;;6163:126;;;:::o;6295:96::-;6332:7;6361:24;6379:5;6361:24;:::i;:::-;6350:35;;6295:96;;;:::o;6397:118::-;6484:24;6502:5;6484:24;:::i;:::-;6479:3;6472:37;6397:118;;:::o;6521:222::-;6614:4;6652:2;6641:9;6637:18;6629:26;;6665:71;6733:1;6722:9;6718:17;6709:6;6665:71;:::i;:::-;6521:222;;;;:::o;6749:122::-;6822:24;6840:5;6822:24;:::i;:::-;6815:5;6812:35;6802:63;;6861:1;6858;6851:12;6802:63;6749:122;:::o;6877:139::-;6923:5;6961:6;6948:20;6939:29;;6977:33;7004:5;6977:33;:::i;:::-;6877:139;;;;:::o;7022:474::-;7090:6;7098;7147:2;7135:9;7126:7;7122:23;7118:32;7115:119;;;7153:79;;:::i;:::-;7115:119;7273:1;7298:53;7343:7;7334:6;7323:9;7319:22;7298:53;:::i;:::-;7288:63;;7244:117;7400:2;7426:53;7471:7;7462:6;7451:9;7447:22;7426:53;:::i;:::-;7416:63;;7371:118;7022:474;;;;;:::o;7502:77::-;7539:7;7568:5;7557:16;;7502:77;;;:::o;7585:122::-;7658:24;7676:5;7658:24;:::i;:::-;7651:5;7648:35;7638:63;;7697:1;7694;7687:12;7638:63;7585:122;:::o;7713:139::-;7759:5;7797:6;7784:20;7775:29;;7813:33;7840:5;7813:33;:::i;:::-;7713:139;;;;:::o;7858:329::-;7917:6;7966:2;7954:9;7945:7;7941:23;7937:32;7934:119;;;7972:79;;:::i;:::-;7934:119;8092:1;8117:53;8162:7;8153:6;8142:9;8138:22;8117:53;:::i;:::-;8107:63;;8063:117;7858:329;;;;:::o;8193:::-;8252:6;8301:2;8289:9;8280:7;8276:23;8272:32;8269:119;;;8307:79;;:::i;:::-;8269:119;8427:1;8452:53;8497:7;8488:6;8477:9;8473:22;8452:53;:::i;:::-;8442:63;;8398:117;8193:329;;;;:::o;8528:619::-;8605:6;8613;8621;8670:2;8658:9;8649:7;8645:23;8641:32;8638:119;;;8676:79;;:::i;:::-;8638:119;8796:1;8821:53;8866:7;8857:6;8846:9;8842:22;8821:53;:::i;:::-;8811:63;;8767:117;8923:2;8949:53;8994:7;8985:6;8974:9;8970:22;8949:53;:::i;:::-;8939:63;;8894:118;9051:2;9077:53;9122:7;9113:6;9102:9;9098:22;9077:53;:::i;:::-;9067:63;;9022:118;8528:619;;;;;:::o;9153:118::-;9240:24;9258:5;9240:24;:::i;:::-;9235:3;9228:37;9153:118;;:::o;9277:222::-;9370:4;9408:2;9397:9;9393:18;9385:26;;9421:71;9489:1;9478:9;9474:17;9465:6;9421:71;:::i;:::-;9277:222;;;;:::o;9505:60::-;9533:3;9554:5;9547:12;;9505:60;;;:::o;9571:142::-;9621:9;9654:53;9672:34;9681:24;9699:5;9681:24;:::i;:::-;9672:34;:::i;:::-;9654:53;:::i;:::-;9641:66;;9571:142;;;:::o;9719:126::-;9769:9;9802:37;9833:5;9802:37;:::i;:::-;9789:50;;9719:126;;;:::o;9851:158::-;9933:9;9966:37;9997:5;9966:37;:::i;:::-;9953:50;;9851:158;;;:::o;10015:195::-;10134:69;10197:5;10134:69;:::i;:::-;10129:3;10122:82;10015:195;;:::o;10216:286::-;10341:4;10379:2;10368:9;10364:18;10356:26;;10392:103;10492:1;10481:9;10477:17;10468:6;10392:103;:::i;:::-;10216:286;;;;:::o;10508:117::-;10617:1;10614;10607:12;10631:180;10679:77;10676:1;10669:88;10776:4;10773:1;10766:15;10800:4;10797:1;10790:15;10817:281;10900:27;10922:4;10900:27;:::i;:::-;10892:6;10888:40;11030:6;11018:10;11015:22;10994:18;10982:10;10979:34;10976:62;10973:88;;;11041:18;;:::i;:::-;10973:88;11081:10;11077:2;11070:22;10860:238;10817:281;;:::o;11104:129::-;11138:6;11165:20;;:::i;:::-;11155:30;;11194:33;11222:4;11214:6;11194:33;:::i;:::-;11104:129;;;:::o;11239:308::-;11301:4;11391:18;11383:6;11380:30;11377:56;;;11413:18;;:::i;:::-;11377:56;11451:29;11473:6;11451:29;:::i;:::-;11443:37;;11535:4;11529;11525:15;11517:23;;11239:308;;;:::o;11553:146::-;11650:6;11645:3;11640;11627:30;11691:1;11682:6;11677:3;11673:16;11666:27;11553:146;;;:::o;11705:425::-;11783:5;11808:66;11824:49;11866:6;11824:49;:::i;:::-;11808:66;:::i;:::-;11799:75;;11897:6;11890:5;11883:21;11935:4;11928:5;11924:16;11973:3;11964:6;11959:3;11955:16;11952:25;11949:112;;;11980:79;;:::i;:::-;11949:112;12070:54;12117:6;12112:3;12107;12070:54;:::i;:::-;11789:341;11705:425;;;;;:::o;12150:340::-;12206:5;12255:3;12248:4;12240:6;12236:17;12232:27;12222:122;;12263:79;;:::i;:::-;12222:122;12380:6;12367:20;12405:79;12480:3;12472:6;12465:4;12457:6;12453:17;12405:79;:::i;:::-;12396:88;;12212:278;12150:340;;;;:::o;12496:509::-;12565:6;12614:2;12602:9;12593:7;12589:23;12585:32;12582:119;;;12620:79;;:::i;:::-;12582:119;12768:1;12757:9;12753:17;12740:31;12798:18;12790:6;12787:30;12784:117;;;12820:79;;:::i;:::-;12784:117;12925:63;12980:7;12971:6;12960:9;12956:22;12925:63;:::i;:::-;12915:73;;12711:287;12496:509;;;;:::o;13011:114::-;13078:6;13112:5;13106:12;13096:22;;13011:114;;;:::o;13131:184::-;13230:11;13264:6;13259:3;13252:19;13304:4;13299:3;13295:14;13280:29;;13131:184;;;;:::o;13321:132::-;13388:4;13411:3;13403:11;;13441:4;13436:3;13432:14;13424:22;;13321:132;;;:::o;13459:108::-;13536:24;13554:5;13536:24;:::i;:::-;13531:3;13524:37;13459:108;;:::o;13573:179::-;13642:10;13663:46;13705:3;13697:6;13663:46;:::i;:::-;13741:4;13736:3;13732:14;13718:28;;13573:179;;;;:::o;13758:113::-;13828:4;13860;13855:3;13851:14;13843:22;;13758:113;;;:::o;13907:732::-;14026:3;14055:54;14103:5;14055:54;:::i;:::-;14125:86;14204:6;14199:3;14125:86;:::i;:::-;14118:93;;14235:56;14285:5;14235:56;:::i;:::-;14314:7;14345:1;14330:284;14355:6;14352:1;14349:13;14330:284;;;14431:6;14425:13;14458:63;14517:3;14502:13;14458:63;:::i;:::-;14451:70;;14544:60;14597:6;14544:60;:::i;:::-;14534:70;;14390:224;14377:1;14374;14370:9;14365:14;;14330:284;;;14334:14;14630:3;14623:10;;14031:608;;;13907:732;;;;:::o;14645:373::-;14788:4;14826:2;14815:9;14811:18;14803:26;;14875:9;14869:4;14865:20;14861:1;14850:9;14846:17;14839:47;14903:108;15006:4;14997:6;14903:108;:::i;:::-;14895:116;;14645:373;;;;:::o;15024:468::-;15089:6;15097;15146:2;15134:9;15125:7;15121:23;15117:32;15114:119;;;15152:79;;:::i;:::-;15114:119;15272:1;15297:53;15342:7;15333:6;15322:9;15318:22;15297:53;:::i;:::-;15287:63;;15243:117;15399:2;15425:50;15467:7;15458:6;15447:9;15443:22;15425:50;:::i;:::-;15415:60;;15370:115;15024:468;;;;;:::o;15498:307::-;15559:4;15649:18;15641:6;15638:30;15635:56;;;15671:18;;:::i;:::-;15635:56;15709:29;15731:6;15709:29;:::i;:::-;15701:37;;15793:4;15787;15783:15;15775:23;;15498:307;;;:::o;15811:423::-;15888:5;15913:65;15929:48;15970:6;15929:48;:::i;:::-;15913:65;:::i;:::-;15904:74;;16001:6;15994:5;15987:21;16039:4;16032:5;16028:16;16077:3;16068:6;16063:3;16059:16;16056:25;16053:112;;;16084:79;;:::i;:::-;16053:112;16174:54;16221:6;16216:3;16211;16174:54;:::i;:::-;15894:340;15811:423;;;;;:::o;16253:338::-;16308:5;16357:3;16350:4;16342:6;16338:17;16334:27;16324:122;;16365:79;;:::i;:::-;16324:122;16482:6;16469:20;16507:78;16581:3;16573:6;16566:4;16558:6;16554:17;16507:78;:::i;:::-;16498:87;;16314:277;16253:338;;;;:::o;16597:943::-;16692:6;16700;16708;16716;16765:3;16753:9;16744:7;16740:23;16736:33;16733:120;;;16772:79;;:::i;:::-;16733:120;16892:1;16917:53;16962:7;16953:6;16942:9;16938:22;16917:53;:::i;:::-;16907:63;;16863:117;17019:2;17045:53;17090:7;17081:6;17070:9;17066:22;17045:53;:::i;:::-;17035:63;;16990:118;17147:2;17173:53;17218:7;17209:6;17198:9;17194:22;17173:53;:::i;:::-;17163:63;;17118:118;17303:2;17292:9;17288:18;17275:32;17334:18;17326:6;17323:30;17320:117;;;17356:79;;:::i;:::-;17320:117;17461:62;17515:7;17506:6;17495:9;17491:22;17461:62;:::i;:::-;17451:72;;17246:287;16597:943;;;;;;;:::o;17546:474::-;17614:6;17622;17671:2;17659:9;17650:7;17646:23;17642:32;17639:119;;;17677:79;;:::i;:::-;17639:119;17797:1;17822:53;17867:7;17858:6;17847:9;17843:22;17822:53;:::i;:::-;17812:63;;17768:117;17924:2;17950:53;17995:7;17986:6;17975:9;17971:22;17950:53;:::i;:::-;17940:63;;17895:118;17546:474;;;;;:::o;18026:::-;18094:6;18102;18151:2;18139:9;18130:7;18126:23;18122:32;18119:119;;;18157:79;;:::i;:::-;18119:119;18277:1;18302:53;18347:7;18338:6;18327:9;18323:22;18302:53;:::i;:::-;18292:63;;18248:117;18404:2;18430:53;18475:7;18466:6;18455:9;18451:22;18430:53;:::i;:::-;18420:63;;18375:118;18026:474;;;;;:::o;18506:849::-;18610:6;18618;18626;18634;18683:2;18671:9;18662:7;18658:23;18654:32;18651:119;;;18689:79;;:::i;:::-;18651:119;18809:1;18834:53;18879:7;18870:6;18859:9;18855:22;18834:53;:::i;:::-;18824:63;;18780:117;18936:2;18962:53;19007:7;18998:6;18987:9;18983:22;18962:53;:::i;:::-;18952:63;;18907:118;19092:2;19081:9;19077:18;19064:32;19123:18;19115:6;19112:30;19109:117;;;19145:79;;:::i;:::-;19109:117;19258:80;19330:7;19321:6;19310:9;19306:22;19258:80;:::i;:::-;19240:98;;;;19035:313;18506:849;;;;;;;:::o;19361:177::-;19501:29;19497:1;19489:6;19485:14;19478:53;19361:177;:::o;19544:366::-;19686:3;19707:67;19771:2;19766:3;19707:67;:::i;:::-;19700:74;;19783:93;19872:3;19783:93;:::i;:::-;19901:2;19896:3;19892:12;19885:19;;19544:366;;;:::o;19916:419::-;20082:4;20120:2;20109:9;20105:18;20097:26;;20169:9;20163:4;20159:20;20155:1;20144:9;20140:17;20133:47;20197:131;20323:4;20197:131;:::i;:::-;20189:139;;19916:419;;;:::o;20341:180::-;20481:32;20477:1;20469:6;20465:14;20458:56;20341:180;:::o;20527:366::-;20669:3;20690:67;20754:2;20749:3;20690:67;:::i;:::-;20683:74;;20766:93;20855:3;20766:93;:::i;:::-;20884:2;20879:3;20875:12;20868:19;;20527:366;;;:::o;20899:419::-;21065:4;21103:2;21092:9;21088:18;21080:26;;21152:9;21146:4;21142:20;21138:1;21127:9;21123:17;21116:47;21180:131;21306:4;21180:131;:::i;:::-;21172:139;;20899:419;;;:::o;21324:94::-;21357:8;21405:5;21401:2;21397:14;21376:35;;21324:94;;;:::o;21424:::-;21463:7;21492:20;21506:5;21492:20;:::i;:::-;21481:31;;21424:94;;;:::o;21524:100::-;21563:7;21592:26;21612:5;21592:26;:::i;:::-;21581:37;;21524:100;;;:::o;21630:157::-;21735:45;21755:24;21773:5;21755:24;:::i;:::-;21735:45;:::i;:::-;21730:3;21723:58;21630:157;;:::o;21793:256::-;21905:3;21920:75;21991:3;21982:6;21920:75;:::i;:::-;22020:2;22015:3;22011:12;22004:19;;22040:3;22033:10;;21793:256;;;;:::o;22055:177::-;22195:29;22191:1;22183:6;22179:14;22172:53;22055:177;:::o;22238:366::-;22380:3;22401:67;22465:2;22460:3;22401:67;:::i;:::-;22394:74;;22477:93;22566:3;22477:93;:::i;:::-;22595:2;22590:3;22586:12;22579:19;;22238:366;;;:::o;22610:419::-;22776:4;22814:2;22803:9;22799:18;22791:26;;22863:9;22857:4;22853:20;22849:1;22838:9;22834:17;22827:47;22891:131;23017:4;22891:131;:::i;:::-;22883:139;;22610:419;;;:::o;23035:180::-;23083:77;23080:1;23073:88;23180:4;23177:1;23170:15;23204:4;23201:1;23194:15;23221:191;23261:3;23280:20;23298:1;23280:20;:::i;:::-;23275:25;;23314:20;23332:1;23314:20;:::i;:::-;23309:25;;23357:1;23354;23350:9;23343:16;;23378:3;23375:1;23372:10;23369:36;;;23385:18;;:::i;:::-;23369:36;23221:191;;;;:::o;23418:181::-;23558:33;23554:1;23546:6;23542:14;23535:57;23418:181;:::o;23605:366::-;23747:3;23768:67;23832:2;23827:3;23768:67;:::i;:::-;23761:74;;23844:93;23933:3;23844:93;:::i;:::-;23962:2;23957:3;23953:12;23946:19;;23605:366;;;:::o;23977:419::-;24143:4;24181:2;24170:9;24166:18;24158:26;;24230:9;24224:4;24220:20;24216:1;24205:9;24201:17;24194:47;24258:131;24384:4;24258:131;:::i;:::-;24250:139;;23977:419;;;:::o;24402:178::-;24542:30;24538:1;24530:6;24526:14;24519:54;24402:178;:::o;24586:366::-;24728:3;24749:67;24813:2;24808:3;24749:67;:::i;:::-;24742:74;;24825:93;24914:3;24825:93;:::i;:::-;24943:2;24938:3;24934:12;24927:19;;24586:366;;;:::o;24958:419::-;25124:4;25162:2;25151:9;25147:18;25139:26;;25211:9;25205:4;25201:20;25197:1;25186:9;25182:17;25175:47;25239:131;25365:4;25239:131;:::i;:::-;25231:139;;24958:419;;;:::o;25383:172::-;25523:24;25519:1;25511:6;25507:14;25500:48;25383:172;:::o;25561:366::-;25703:3;25724:67;25788:2;25783:3;25724:67;:::i;:::-;25717:74;;25800:93;25889:3;25800:93;:::i;:::-;25918:2;25913:3;25909:12;25902:19;;25561:366;;;:::o;25933:419::-;26099:4;26137:2;26126:9;26122:18;26114:26;;26186:9;26180:4;26176:20;26172:1;26161:9;26157:17;26150:47;26214:131;26340:4;26214:131;:::i;:::-;26206:139;;25933:419;;;:::o;26358:172::-;26498:24;26494:1;26486:6;26482:14;26475:48;26358:172;:::o;26536:366::-;26678:3;26699:67;26763:2;26758:3;26699:67;:::i;:::-;26692:74;;26775:93;26864:3;26775:93;:::i;:::-;26893:2;26888:3;26884:12;26877:19;;26536:366;;;:::o;26908:419::-;27074:4;27112:2;27101:9;27097:18;27089:26;;27161:9;27155:4;27151:20;27147:1;27136:9;27132:17;27125:47;27189:131;27315:4;27189:131;:::i;:::-;27181:139;;26908:419;;;:::o;27333:180::-;27381:77;27378:1;27371:88;27478:4;27475:1;27468:15;27502:4;27499:1;27492:15;27519:320;27563:6;27600:1;27594:4;27590:12;27580:22;;27647:1;27641:4;27637:12;27668:18;27658:81;;27724:4;27716:6;27712:17;27702:27;;27658:81;27786:2;27778:6;27775:14;27755:18;27752:38;27749:84;;27805:18;;:::i;:::-;27749:84;27570:269;27519:320;;;:::o;27845:141::-;27894:4;27917:3;27909:11;;27940:3;27937:1;27930:14;27974:4;27971:1;27961:18;27953:26;;27845:141;;;:::o;27992:93::-;28029:6;28076:2;28071;28064:5;28060:14;28056:23;28046:33;;27992:93;;;:::o;28091:107::-;28135:8;28185:5;28179:4;28175:16;28154:37;;28091:107;;;;:::o;28204:393::-;28273:6;28323:1;28311:10;28307:18;28346:97;28376:66;28365:9;28346:97;:::i;:::-;28464:39;28494:8;28483:9;28464:39;:::i;:::-;28452:51;;28536:4;28532:9;28525:5;28521:21;28512:30;;28585:4;28575:8;28571:19;28564:5;28561:30;28551:40;;28280:317;;28204:393;;;;;:::o;28603:142::-;28653:9;28686:53;28704:34;28713:24;28731:5;28713:24;:::i;:::-;28704:34;:::i;:::-;28686:53;:::i;:::-;28673:66;;28603:142;;;:::o;28751:75::-;28794:3;28815:5;28808:12;;28751:75;;;:::o;28832:269::-;28942:39;28973:7;28942:39;:::i;:::-;29003:91;29052:41;29076:16;29052:41;:::i;:::-;29044:6;29037:4;29031:11;29003:91;:::i;:::-;28997:4;28990:105;28908:193;28832:269;;;:::o;29107:73::-;29152:3;29107:73;:::o;29186:189::-;29263:32;;:::i;:::-;29304:65;29362:6;29354;29348:4;29304:65;:::i;:::-;29239:136;29186:189;;:::o;29381:186::-;29441:120;29458:3;29451:5;29448:14;29441:120;;;29512:39;29549:1;29542:5;29512:39;:::i;:::-;29485:1;29478:5;29474:13;29465:22;;29441:120;;;29381:186;;:::o;29573:543::-;29674:2;29669:3;29666:11;29663:446;;;29708:38;29740:5;29708:38;:::i;:::-;29792:29;29810:10;29792:29;:::i;:::-;29782:8;29778:44;29975:2;29963:10;29960:18;29957:49;;;29996:8;29981:23;;29957:49;30019:80;30075:22;30093:3;30075:22;:::i;:::-;30065:8;30061:37;30048:11;30019:80;:::i;:::-;29678:431;;29663:446;29573:543;;;:::o;30122:117::-;30176:8;30226:5;30220:4;30216:16;30195:37;;30122:117;;;;:::o;30245:169::-;30289:6;30322:51;30370:1;30366:6;30358:5;30355:1;30351:13;30322:51;:::i;:::-;30318:56;30403:4;30397;30393:15;30383:25;;30296:118;30245:169;;;;:::o;30419:295::-;30495:4;30641:29;30666:3;30660:4;30641:29;:::i;:::-;30633:37;;30703:3;30700:1;30696:11;30690:4;30687:21;30679:29;;30419:295;;;;:::o;30719:1395::-;30836:37;30869:3;30836:37;:::i;:::-;30938:18;30930:6;30927:30;30924:56;;;30960:18;;:::i;:::-;30924:56;31004:38;31036:4;31030:11;31004:38;:::i;:::-;31089:67;31149:6;31141;31135:4;31089:67;:::i;:::-;31183:1;31207:4;31194:17;;31239:2;31231:6;31228:14;31256:1;31251:618;;;;31913:1;31930:6;31927:77;;;31979:9;31974:3;31970:19;31964:26;31955:35;;31927:77;32030:67;32090:6;32083:5;32030:67;:::i;:::-;32024:4;32017:81;31886:222;31221:887;;31251:618;31303:4;31299:9;31291:6;31287:22;31337:37;31369:4;31337:37;:::i;:::-;31396:1;31410:208;31424:7;31421:1;31418:14;31410:208;;;31503:9;31498:3;31494:19;31488:26;31480:6;31473:42;31554:1;31546:6;31542:14;31532:24;;31601:2;31590:9;31586:18;31573:31;;31447:4;31444:1;31440:12;31435:17;;31410:208;;;31646:6;31637:7;31634:19;31631:179;;;31704:9;31699:3;31695:19;31689:26;31747:48;31789:4;31781:6;31777:17;31766:9;31747:48;:::i;:::-;31739:6;31732:64;31654:156;31631:179;31856:1;31852;31844:6;31840:14;31836:22;31830:4;31823:36;31258:611;;;31221:887;;30811:1303;;;30719:1395;;:::o;32120:180::-;32168:77;32165:1;32158:88;32265:4;32262:1;32255:15;32289:4;32286:1;32279:15;32306:220;32446:34;32442:1;32434:6;32430:14;32423:58;32515:3;32510:2;32502:6;32498:15;32491:28;32306:220;:::o;32532:366::-;32674:3;32695:67;32759:2;32754:3;32695:67;:::i;:::-;32688:74;;32771:93;32860:3;32771:93;:::i;:::-;32889:2;32884:3;32880:12;32873:19;;32532:366;;;:::o;32904:419::-;33070:4;33108:2;33097:9;33093:18;33085:26;;33157:9;33151:4;33147:20;33143:1;33132:9;33128:17;33121:47;33185:131;33311:4;33185:131;:::i;:::-;33177:139;;32904:419;;;:::o;33329:222::-;33469:34;33465:1;33457:6;33453:14;33446:58;33538:5;33533:2;33525:6;33521:15;33514:30;33329:222;:::o;33557:366::-;33699:3;33720:67;33784:2;33779:3;33720:67;:::i;:::-;33713:74;;33796:93;33885:3;33796:93;:::i;:::-;33914:2;33909:3;33905:12;33898:19;;33557:366;;;:::o;33929:419::-;34095:4;34133:2;34122:9;34118:18;34110:26;;34182:9;34176:4;34172:20;34168:1;34157:9;34153:17;34146:47;34210:131;34336:4;34210:131;:::i;:::-;34202:139;;33929:419;;;:::o;34354:164::-;34494:16;34490:1;34482:6;34478:14;34471:40;34354:164;:::o;34524:366::-;34666:3;34687:67;34751:2;34746:3;34687:67;:::i;:::-;34680:74;;34763:93;34852:3;34763:93;:::i;:::-;34881:2;34876:3;34872:12;34865:19;;34524:366;;;:::o;34896:419::-;35062:4;35100:2;35089:9;35085:18;35077:26;;35149:9;35143:4;35139:20;35135:1;35124:9;35120:17;35113:47;35177:131;35303:4;35177:131;:::i;:::-;35169:139;;34896:419;;;:::o;35321:410::-;35361:7;35384:20;35402:1;35384:20;:::i;:::-;35379:25;;35418:20;35436:1;35418:20;:::i;:::-;35413:25;;35473:1;35470;35466:9;35495:30;35513:11;35495:30;:::i;:::-;35484:41;;35674:1;35665:7;35661:15;35658:1;35655:22;35635:1;35628:9;35608:83;35585:139;;35704:18;;:::i;:::-;35585:139;35369:362;35321:410;;;;:::o;35737:172::-;35877:24;35873:1;35865:6;35861:14;35854:48;35737:172;:::o;35915:366::-;36057:3;36078:67;36142:2;36137:3;36078:67;:::i;:::-;36071:74;;36154:93;36243:3;36154:93;:::i;:::-;36272:2;36267:3;36263:12;36256:19;;35915:366;;;:::o;36287:419::-;36453:4;36491:2;36480:9;36476:18;36468:26;;36540:9;36534:4;36530:20;36526:1;36515:9;36511:17;36504:47;36568:131;36694:4;36568:131;:::i;:::-;36560:139;;36287:419;;;:::o;36712:235::-;36852:34;36848:1;36840:6;36836:14;36829:58;36921:18;36916:2;36908:6;36904:15;36897:43;36712:235;:::o;36953:366::-;37095:3;37116:67;37180:2;37175:3;37116:67;:::i;:::-;37109:74;;37192:93;37281:3;37192:93;:::i;:::-;37310:2;37305:3;37301:12;37294:19;;36953:366;;;:::o;37325:419::-;37491:4;37529:2;37518:9;37514:18;37506:26;;37578:9;37572:4;37568:20;37564:1;37553:9;37549:17;37542:47;37606:131;37732:4;37606:131;:::i;:::-;37598:139;;37325:419;;;:::o;37750:148::-;37852:11;37889:3;37874:18;;37750:148;;;;:::o;37904:390::-;38010:3;38038:39;38071:5;38038:39;:::i;:::-;38093:89;38175:6;38170:3;38093:89;:::i;:::-;38086:96;;38191:65;38249:6;38244:3;38237:4;38230:5;38226:16;38191:65;:::i;:::-;38281:6;38276:3;38272:16;38265:23;;38014:280;37904:390;;;;:::o;38300:155::-;38440:7;38436:1;38428:6;38424:14;38417:31;38300:155;:::o;38461:400::-;38621:3;38642:84;38724:1;38719:3;38642:84;:::i;:::-;38635:91;;38735:93;38824:3;38735:93;:::i;:::-;38853:1;38848:3;38844:11;38837:18;;38461:400;;;:::o;38867:701::-;39148:3;39170:95;39261:3;39252:6;39170:95;:::i;:::-;39163:102;;39282:95;39373:3;39364:6;39282:95;:::i;:::-;39275:102;;39394:148;39538:3;39394:148;:::i;:::-;39387:155;;39559:3;39552:10;;38867:701;;;;;:::o;39574:225::-;39714:34;39710:1;39702:6;39698:14;39691:58;39783:8;39778:2;39770:6;39766:15;39759:33;39574:225;:::o;39805:366::-;39947:3;39968:67;40032:2;40027:3;39968:67;:::i;:::-;39961:74;;40044:93;40133:3;40044:93;:::i;:::-;40162:2;40157:3;40153:12;40146:19;;39805:366;;;:::o;40177:419::-;40343:4;40381:2;40370:9;40366:18;40358:26;;40430:9;40424:4;40420:20;40416:1;40405:9;40401:17;40394:47;40458:131;40584:4;40458:131;:::i;:::-;40450:139;;40177:419;;;:::o;40602:182::-;40742:34;40738:1;40730:6;40726:14;40719:58;40602:182;:::o;40790:366::-;40932:3;40953:67;41017:2;41012:3;40953:67;:::i;:::-;40946:74;;41029:93;41118:3;41029:93;:::i;:::-;41147:2;41142:3;41138:12;41131:19;;40790:366;;;:::o;41162:419::-;41328:4;41366:2;41355:9;41351:18;41343:26;;41415:9;41409:4;41405:20;41401:1;41390:9;41386:17;41379:47;41443:131;41569:4;41443:131;:::i;:::-;41435:139;;41162:419;;;:::o;41587:181::-;41727:33;41723:1;41715:6;41711:14;41704:57;41587:181;:::o;41774:366::-;41916:3;41937:67;42001:2;41996:3;41937:67;:::i;:::-;41930:74;;42013:93;42102:3;42013:93;:::i;:::-;42131:2;42126:3;42122:12;42115:19;;41774:366;;;:::o;42146:419::-;42312:4;42350:2;42339:9;42335:18;42327:26;;42399:9;42393:4;42389:20;42385:1;42374:9;42370:17;42363:47;42427:131;42553:4;42427:131;:::i;:::-;42419:139;;42146:419;;;:::o;42571:332::-;42692:4;42730:2;42719:9;42715:18;42707:26;;42743:71;42811:1;42800:9;42796:17;42787:6;42743:71;:::i;:::-;42824:72;42892:2;42881:9;42877:18;42868:6;42824:72;:::i;:::-;42571:332;;;;;:::o;42909:137::-;42963:5;42994:6;42988:13;42979:22;;43010:30;43034:5;43010:30;:::i;:::-;42909:137;;;;:::o;43052:345::-;43119:6;43168:2;43156:9;43147:7;43143:23;43139:32;43136:119;;;43174:79;;:::i;:::-;43136:119;43294:1;43319:61;43372:7;43363:6;43352:9;43348:22;43319:61;:::i;:::-;43309:71;;43265:125;43052:345;;;;:::o;43403:233::-;43442:3;43465:24;43483:5;43465:24;:::i;:::-;43456:33;;43511:66;43504:5;43501:77;43498:103;;43581:18;;:::i;:::-;43498:103;43628:1;43621:5;43617:13;43610:20;;43403:233;;;:::o;43642:98::-;43693:6;43727:5;43721:12;43711:22;;43642:98;;;:::o;43746:168::-;43829:11;43863:6;43858:3;43851:19;43903:4;43898:3;43894:14;43879:29;;43746:168;;;;:::o;43920:373::-;44006:3;44034:38;44066:5;44034:38;:::i;:::-;44088:70;44151:6;44146:3;44088:70;:::i;:::-;44081:77;;44167:65;44225:6;44220:3;44213:4;44206:5;44202:16;44167:65;:::i;:::-;44257:29;44279:6;44257:29;:::i;:::-;44252:3;44248:39;44241:46;;44010:283;43920:373;;;;:::o;44299:640::-;44494:4;44532:3;44521:9;44517:19;44509:27;;44546:71;44614:1;44603:9;44599:17;44590:6;44546:71;:::i;:::-;44627:72;44695:2;44684:9;44680:18;44671:6;44627:72;:::i;:::-;44709;44777:2;44766:9;44762:18;44753:6;44709:72;:::i;:::-;44828:9;44822:4;44818:20;44813:2;44802:9;44798:18;44791:48;44856:76;44927:4;44918:6;44856:76;:::i;:::-;44848:84;;44299:640;;;;;;;:::o;44945:141::-;45001:5;45032:6;45026:13;45017:22;;45048:32;45074:5;45048:32;:::i;:::-;44945:141;;;;:::o;45092:349::-;45161:6;45210:2;45198:9;45189:7;45185:23;45181:32;45178:119;;;45216:79;;:::i;:::-;45178:119;45336:1;45361:63;45416:7;45407:6;45396:9;45392:22;45361:63;:::i;:::-;45351:73;;45307:127;45092:349;;;;:::o
Swarm Source
ipfs://5671fad92a742f804f7532ff5020e067ca9200e7d9ace79b45cbcdc6a90ccf26
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.