Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 311 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 20405635 | 168 days ago | IN | 0 ETH | 0.00008747 | ||||
Set Approval For... | 17071070 | 636 days ago | IN | 0 ETH | 0.00147236 | ||||
Set Approval For... | 16981274 | 648 days ago | IN | 0 ETH | 0.00133227 | ||||
Set Approval For... | 16126418 | 768 days ago | IN | 0 ETH | 0.00084052 | ||||
Set Approval For... | 15995854 | 786 days ago | IN | 0 ETH | 0.00053637 | ||||
Safe Transfer Fr... | 15974433 | 789 days ago | IN | 0 ETH | 0.00091479 | ||||
Set Approval For... | 15967359 | 790 days ago | IN | 0 ETH | 0.00062434 | ||||
Set Approval For... | 15963624 | 791 days ago | IN | 0 ETH | 0.00076728 | ||||
Allowlist Mint | 15945535 | 793 days ago | IN | 0.245 ETH | 0.00049404 | ||||
Withdraw | 15916916 | 797 days ago | IN | 0 ETH | 0.00054642 | ||||
Set Approval For... | 15910085 | 798 days ago | IN | 0 ETH | 0.00054443 | ||||
Set Approval For... | 15887857 | 802 days ago | IN | 0 ETH | 0.00055218 | ||||
Safe Transfer Fr... | 15883171 | 802 days ago | IN | 0 ETH | 0.00096121 | ||||
Reveal | 15874236 | 803 days ago | IN | 0 ETH | 0.00046987 | ||||
Transfer Ownersh... | 15873726 | 803 days ago | IN | 0 ETH | 0.00029089 | ||||
Owner Mint | 15873725 | 803 days ago | IN | 0 ETH | 0.00118356 | ||||
Transfer From | 15873724 | 803 days ago | IN | 0 ETH | 0.00047802 | ||||
Transfer From | 15873723 | 804 days ago | IN | 0 ETH | 0.00067894 | ||||
Transfer From | 15873722 | 804 days ago | IN | 0 ETH | 0.00067894 | ||||
Transfer From | 15873721 | 804 days ago | IN | 0 ETH | 0.00067894 | ||||
Transfer From | 15873719 | 804 days ago | IN | 0 ETH | 0.00067894 | ||||
Transfer From | 15873718 | 804 days ago | IN | 0 ETH | 0.00067894 | ||||
Transfer From | 15873717 | 804 days ago | IN | 0 ETH | 0.00067894 | ||||
Transfer From | 15873716 | 804 days ago | IN | 0 ETH | 0.00067894 | ||||
Transfer From | 15873715 | 804 days ago | IN | 0 ETH | 0.00067894 |
Loading...
Loading
Contract Name:
KounPass
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.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"; contract KounPassERC721A is ERC721A, Ownable, ReentrancyGuard { // Enum representing the state of the mint enum MintPhase { INACTIVE, ALLOWLIST_SALE, PUBLIC_SALE, SOLD_OUT } uint256 public collectionSize; // Public mint price per token, in wei uint256 public mintPricePublic; // Allowlist mint price per token, in wei uint256 public mintPriceAllowlist; uint256 public maxPerWalletPublic; uint256 public maxPerWalletAllowlist; string private baseURI; string private hiddenURI; // Root hash for allowlist merkle tree (generated off-chain) bytes32 public merkleRoot; // Current state of the mint MintPhase public mintPhase = MintPhase.INACTIVE; constructor( string memory _name, string memory _symbol, string memory _hiddenTokenURI, uint256 _collectionSize, uint256 _mintPricePublic, uint256 _mintPriceAllowlist, uint256 _maxPerWalletPublic, uint256 _maxPerWalletAllowlist ) ERC721A(_name, _symbol) { hiddenURI = _hiddenTokenURI; collectionSize = _collectionSize; mintPricePublic = _mintPricePublic; mintPriceAllowlist = _mintPriceAllowlist; maxPerWalletPublic = _maxPerWalletPublic; maxPerWalletAllowlist = _maxPerWalletAllowlist; } /** * @notice Ensure function cannot be called outside of a given mint phase * @param _mintPhase Correct mint phase for function to execute */ modifier inMintPhase(MintPhase _mintPhase) { require(mintPhase == _mintPhase, "incorrect mint phase"); _; } /** * @notice Mint a quantity of tokens during allowlist mint phase by providing a Merkle proof * @param _quantity Number of tokens to mint * @param _proof Merkle proof to verify msg.sender is part of the allowlist */ function allowlistMint(uint256 _quantity, bytes32[] calldata _proof) external payable virtual nonReentrant inMintPhase(MintPhase.ALLOWLIST_SALE) { require(MerkleProof.verify(_proof, merkleRoot, keccak256(abi.encodePacked(msg.sender))), "invalid proof"); require(msg.value == mintPriceAllowlist * _quantity, "incorrect payment"); require(totalSupply() + _quantity <= collectionSize, "insufficient supply"); require(getRedemptionsAllowlist() + _quantity <= maxPerWalletAllowlist,"exceeds allowlist max"); incrementRedemptionsAllowlist(_quantity); _safeMint(msg.sender, _quantity); } /** * @notice Mint a quantity of tokens during public mint phase * @param _quantity Number of tokens to mint */ function mint(uint256 _quantity) external payable virtual nonReentrant inMintPhase(MintPhase.PUBLIC_SALE) { require(msg.value == mintPricePublic * _quantity, "incorrect payment"); require(totalSupply() + _quantity <= collectionSize, "insufficient supply"); require(getRedemptionsPublic() + _quantity <= maxPerWalletPublic, "exceeds public max"); incrementRedemptionsPublic(_quantity); _safeMint(msg.sender, _quantity); } /** * @notice Set the allowlist Merkle root in contract storage * @notice Use restricted to contract owner * @param _merkleRoot New Merkle root hash */ function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner { merkleRoot = _merkleRoot; } /** * @notice Set the state machine mint phase * @notice Use restricted to contract owner * @param _mintPhase New mint phase, 0 = INACTIVE / 1 = ALLOWLIST_MINT / 2 = PUBLIC_MINT / 3 = SOLD_OUT */ function setMintPhase(MintPhase _mintPhase) external onlyOwner { mintPhase = _mintPhase; } /** * @notice Set the contract base token uri * @notice Use restricted to contract owner * @param _baseTokenURI New base token uri */ function setBaseURI(string calldata _baseTokenURI) public onlyOwner { baseURI = _baseTokenURI; } /** * @notice Set the contract hidden token uri * @notice Use restricted to contract owner * @param _hiddenTokenURI New hidden token uri */ function setHiddenURI(string calldata _hiddenTokenURI) public onlyOwner { hiddenURI = _hiddenTokenURI; } /** * @notice Increment number of allowlist token mints redeemed by caller * @dev We cast the _numToIncrement argument into uint32, which will not be an issue as * mint quantity should never be greater than 2^32 - 1. * @dev Number of redemptions are stored in ERC721A auxillary storage, which can help */ function incrementRedemptionsAllowlist(uint256 _numToIncrement) private { (uint32 allowlistMintRedemptions, uint32 publicMintRedemptions) = unpackMintRedemptions(_getAux(msg.sender)); allowlistMintRedemptions += uint32(_numToIncrement); _setAux(msg.sender, packMintRedemptions(allowlistMintRedemptions, publicMintRedemptions)); } /** * @notice Increment number of public token mints redeemed by caller * @dev We cast the _numToIncrement argument into uint32, which will not be an issue as * mint quantity should never be greater than 2^32 - 1. * @dev Number of redemptions are stored in ERC721A auxillary storage, which can help */ function incrementRedemptionsPublic(uint256 _numToIncrement) private { (uint32 allowlistMintRedemptions, uint32 publicMintRedemptions) = unpackMintRedemptions(_getAux(msg.sender)); publicMintRedemptions += uint32(_numToIncrement); _setAux(msg.sender, packMintRedemptions(allowlistMintRedemptions, publicMintRedemptions)); } /** * @notice Unpack and get number of allowlist token mints redeemed by caller * @return number of allowlist redemptions used * @dev Number of redemptions are stored in ERC721A auxillary storage, which can help */ function getRedemptionsAllowlist() public view returns (uint256) { (uint32 allowlistMintRedemptions, ) = unpackMintRedemptions(_getAux(msg.sender)); return allowlistMintRedemptions; } /** * @notice Unpack and get number of public token mints redeemed by caller * @return number of public redemptions used * @dev Number of redemptions are stored in ERC721A auxillary storage, which can help */ function getRedemptionsPublic() public view returns (uint256) { (, uint32 publicMintRedemptions) = unpackMintRedemptions(_getAux(msg.sender)); return publicMintRedemptions; } /** * @return Current mint phase */ function getMintPhase() public view returns (MintPhase) { return mintPhase; } /** * @return Current base token uri */ function _baseURI() internal view virtual override returns (string memory) { return baseURI; } /** * @return Current hidden token uri */ function _hiddenURI() internal view virtual returns (string memory) { return hiddenURI; } /** * @notice Pack two uint32s (allowlist and public redemptions) into a single uint64 value * @return Packed value * @dev Performs shift and bit operations to pack two uint32s into a single uint64 */ function packMintRedemptions(uint32 _allowlistMintRedemptions, uint32 _publicMintRedemptions) private pure returns (uint64) { return (uint64(_allowlistMintRedemptions) << 32) | uint64(_publicMintRedemptions); } /** * @notice Unpack a single uint64 value into two uint32s (allowlist and public redemptions) * @return allowlistMintRedemptions publicMintRedemptions Unpacked values * @dev Performs shift and bit operations to unpack a single uint64 into two uint32s */ function unpackMintRedemptions(uint64 _mintRedemptionPack) private pure returns (uint32 allowlistMintRedemptions, uint32 publicMintRedemptions) { allowlistMintRedemptions = uint32(_mintRedemptionPack >> 32); publicMintRedemptions = uint32(_mintRedemptionPack); } /** * @notice Mint a quantity of tokens to the contract owners address * @notice Use restricted to contract owner * @param _quantity Number of tokens to mint * @dev Must be executed in `MintPhase.INACTIVE` (i.e., before allowlist or public mint begins) */ function ownerMint(uint256 _quantity) external onlyOwner inMintPhase(MintPhase.INACTIVE) { require(totalSupply() + _quantity <= collectionSize, "insufficient supply"); _safeMint(owner(), _quantity); } /** * @notice Withdraw all funds to the contract owners address * @notice Use restricted to contract owner */ function withdraw() external onlyOwner { address shareHolder55 = 0xb92535c47C6108b8a7cF1Dc9e08be449E6bE9d51; address shareHolder35 = 0x9691b70b81524E60B937eb490af9E8Ee16bB08e8; address shareHolder10 = 0x26a8aE8435Bb9653c7c66c64217D15E397A4523e; uint256 share55 = address(this).balance * 55 / 100; uint256 share35 = address(this).balance * 35 / 100; uint256 share10 = address(this).balance - share55 - share35; (bool success, ) = shareHolder55.call{value: share55}(""); require(success, "transfer failed"); (success, ) = shareHolder35.call{value: share35}(""); require(success, "transfer failed"); (success, ) = shareHolder10.call{value: share10}(""); require(success, "transfer failed"); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } /** * @notice Prevent accidental ETH transfer */ fallback() external payable { require(false, "not implemented"); } /** * @notice Prevent accidental ETH transfer */ receive() external payable { require(false, "not implemented"); } } contract KounPass is KounPassERC721A { mapping(address => uint256) public extAddressMintQuota; uint256 maxMintForExtAddress = 5; uint256 revealedMaxId = 0; constructor() KounPassERC721A("KOUN PASS", "TPZ-KP", "ipfs://QmX2z2CtFzj4VsHV4cHnCeg5ZsdMAUbDyredGW47LWKuYY", 1200, 0.06 ether, 0.049 ether, 5, 5) {} /** * @notice Mint for external address for a quantity of tokens during public mint * @notice Each minter have limited amount of quota to mint for external address * @param _quantity Number of tokens to * @dev Can only be executed in `MintPhase.PUBLIC_SALE` */ function mintForAddress(address _recipient, uint256 _quantity) external payable nonReentrant inMintPhase(MintPhase.PUBLIC_SALE) { require(msg.sender != _recipient, "Can only mint for different address"); require(extAddressMintQuota[msg.sender] + _quantity <= maxMintForExtAddress, "Exceed mint external max!"); require(msg.value == mintPricePublic * _quantity, "incorrect payment"); require(totalSupply() + _quantity <= collectionSize, "insufficient supply"); _safeMint(_recipient, _quantity); extAddressMintQuota[msg.sender] += _quantity; } /** * @notice Update mint price for public mint * @notice Use restricted to contract owner * @param _newPrice New mint price in wei */ function updatePublicPrice(uint256 _newPrice) external onlyOwner { mintPricePublic = _newPrice; } /** * @notice Update mint price for allowlist mint * @notice Use restricted to contract owner * @param _newPrice New mint price in wei */ function updateAllowlistPrice(uint256 _newPrice) external onlyOwner { mintPriceAllowlist = _newPrice; } /** * @notice Reveal max token by id with original metadata, needs to update base URI to prevent metadata tracking * @notice Use restricted to contract owner * @param _baseTokenURI New base token * @param _maxId maximum token id to reveal */ function reveal(string calldata _baseTokenURI, uint256 _maxId) external onlyOwner { setBaseURI(_baseTokenURI); revealedMaxId = _maxId; } /** * @dev Returns the token metadata URI. * @notice if tokenId is greater than revealedMaxId, it will returns the hiddenURI */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); if (tokenId > revealedMaxId) { return _hiddenURI(); } else { string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _toString(tokenId), ".json")) : ""; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Tree proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * 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. */ 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 proved to be a part of a Merkle tree defined by * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}. * * _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} * * _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 the sibling nodes in `proof`, * consuming from one or the other at each step according to the instructions given by * `proofFlags`. * * _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} * * _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 v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (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.2 // 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 { // Reference type for token approval. struct TokenApprovalRef { address value; } // ============================================================= // CONSTANTS // ============================================================= // Mask of an entry in packed address data. uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant _BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant _BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant _BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant _BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant _BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant _BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant _BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with {_mintERC2309}. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309} // is required to cause an overflow, which is unrealistic. uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // ============================================================= // STORAGE // ============================================================= // The next token ID to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See {_packedOwnershipOf} implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => TokenApprovalRef) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // ============================================================= // CONSTRUCTOR // ============================================================= constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } // ============================================================= // TOKEN COUNTING OPERATIONS // ============================================================= /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view virtual returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() public view virtual override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view virtual returns (uint256) { // Counter underflow is impossible as `_currentIndex` does not decrement, // and it is initialized to `_startTokenId()`. unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view virtual returns (uint256) { return _burnCounter; } // ============================================================= // ADDRESS DATA OPERATIONS // ============================================================= /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) public view virtual override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> _BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal virtual { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX); _packedAddressData[owner] = packed; } // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes // of the XOR of all function selectors in the interface. // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165) // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`) return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the token collection symbol. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } // ============================================================= // OWNERSHIPS OPERATIONS // ============================================================= /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around over time. */ function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal virtual { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & _BITMASK_BURNED == 0) { // Invariant: // There will always be an initialized ownership slot // (i.e. `ownership.addr != address(0) && ownership.burned == false`) // before an unintialized ownership slot // (i.e. `ownership.addr == address(0) && ownership.burned == false`) // Hence, `curr` will not underflow. // // We can directly compare the packed value. // If the address is zero, packed will be zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP); ownership.burned = packed & _BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`. result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } // ============================================================= // APPROVAL OPERATIONS // ============================================================= /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId].value = to; emit Approval(owner, to, tokenId); } /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId].value; } /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted. See {_mint}. */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned. } /** * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`. */ function _isSenderApprovedOrOwner( address approvedAddress, address owner, address msgSender ) private pure returns (bool result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, _BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, _BITMASK_ADDRESS) // `msgSender == owner || msgSender == approvedAddress`. result := or(eq(msgSender, owner), eq(msgSender, approvedAddress)) } } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedSlotAndAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId]; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { approvedAddressSlot := tokenApproval.slot approvedAddress := sload(approvedAddressSlot) } } // ============================================================= // TRANSFER OPERATIONS // ============================================================= /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Hook that is called before a set of serially-ordered token IDs * are about to be transferred. This includes minting. * And also called before burning one token. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token IDs * have been transferred. This includes minting. * And also called after one token has been burned. * * `startTokenId` - the first token ID to be transferred. * `quantity` - the amount to be transferred. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * `from` - Previous owner of the given token ID. * `to` - Target address that will receive the token. * `tokenId` - Token ID to be transferred. * `_data` - Optional data to send along with the call. * * Returns whether the call correctly returned the expected magic value. */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } // ============================================================= // MINT OPERATIONS // ============================================================= /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 toMasked; uint256 end = startTokenId + quantity; // Use assembly to loop and emit the `Transfer` event for gas savings. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. 0, // `address(0)`. toMasked, // `to`. startTokenId // `tokenId`. ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } if (toMasked == 0) revert MintToZeroAddress(); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal virtual { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal virtual { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal virtual { _safeMint(to, quantity, ''); } // ============================================================= // BURN OPERATIONS // ============================================================= /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } // ============================================================= // EXTRA DATA OPERATIONS // ============================================================= /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA; } // ============================================================= // OTHER OPERATIONS // ============================================================= /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a uint256 to its ASCII string decimal representation. */ function _toString(uint256 value) internal pure virtual returns (string memory str) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 0x80 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80. str := add(mload(0x40), 0x80) // Update the free memory pointer to allocate. mstore(0x40, str) // Cache the end of the memory to calculate the length later. let end := str // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // prettier-ignore for { let temp := value } 1 {} { str := sub(str, 1) // Write the character to the pointer. // The ASCII index of the '0' character is 48. mstore8(str, add(48, mod(temp, 10))) // Keep dividing `temp` until zero. temp := div(temp, 10) // prettier-ignore if iszero(temp) { break } } let length := sub(end, str) // Move the pointer 32 bytes leftwards to make room for the length. str := sub(str, 0x20) // Store the length. mstore(str, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables * (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in `owner`'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, * checking first that contract recipients are aware of the ERC721 protocol * to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move * this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} * whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token * by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the * zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} * for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll}. */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// 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; } }
{ "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":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"allowlistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collectionSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"extAddressMintQuota","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":[],"name":"getMintPhase","outputs":[{"internalType":"enum KounPassERC721A.MintPhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRedemptionsAllowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRedemptionsPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletAllowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWalletPublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintForAddress","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPhase","outputs":[{"internalType":"enum KounPassERC721A.MintPhase","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPriceAllowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPricePublic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"uint256","name":"_maxId","type":"uint256"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenTokenURI","type":"string"}],"name":"setHiddenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum KounPassERC721A.MintPhase","name":"_mintPhase","type":"uint8"}],"name":"setMintPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"updateAllowlistPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"updatePublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000601260006101000a81548160ff021916908360038111156200002d576200002c62000361565b5b0217905550600560145560006015553480156200004957600080fd5b506040518060400160405280600981526020017f4b4f554e205041535300000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f54505a2d4b500000000000000000000000000000000000000000000000000000815250604051806060016040528060358152602001620044f2603591396104b066d529ae9e86000066ae153d89fe800060058087878160029080519060200190620001009291906200027b565b508060039080519060200190620001199291906200027b565b506200012a620001a460201b60201c565b60008190555050506200015262000146620001ad60201b60201c565b620001b560201b60201c565b60016009819055508560109080519060200190620001729291906200027b565b5084600a8190555083600b8190555082600c8190555081600d8190555080600e819055505050505050505050620003bf565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000289906200032b565b90600052602060002090601f016020900481019282620002ad5760008555620002f9565b82601f10620002c857805160ff1916838001178555620002f9565b82800160010185558215620002f9579182015b82811115620002f8578251825591602001919060010190620002db565b5b5090506200030891906200030c565b5090565b5b80821115620003275760008160009055506001016200030d565b5090565b600060028204905060018216806200034457607f821691505b602082108114156200035b576200035a62000390565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61412380620003cf6000396000f3fe60806040526004361061023f5760003560e01c8063715018a61161012e578063bf17cd45116100ab578063e985e9c51161006f578063e985e9c5146108bb578063f19e75d4146108f8578063f254933d14610921578063f2fde38b1461093d578063fcf4b7301461096657610287565b8063bf17cd45146107d2578063c52766c6146107fd578063c87b56dd14610828578063d8ec555f14610865578063e87570bf1461089057610287565b8063a0712d68116100f2578063a0712d6814610710578063a22cb4651461072c578063b029a51414610755578063b88d4fde14610780578063bbaac02f146107a957610287565b8063715018a61461065e5780637bc9200e146106755780637cb64759146106915780638da5cb5b146106ba57806395d89b41146106e557610287565b80632eb4a7ab116101bc57806345c0f5331161018057806345c0f5331461056757806355f804b3146105925780636352211e146105bb578063708b4730146105f857806370a082311461062157610287565b80632eb4a7ab1461049657806331c07bbf146104c157806339f94118146104ea5780633ccfd60b1461052757806342842e0e1461053e57610287565b806316e0a2001161020357806316e0a200146103c357806317881cbf146103ec57806318160ddd146104175780631c18a0621461044257806323b872dd1461046d57610287565b806301ffc9a7146102ca578063031ee82b1461030757806306fdde0314610332578063081812fc1461035d578063095ea7b31461039a57610287565b36610287576000610285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027c90613760565b60405180910390fd5b005b60006102c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102bf90613760565b60405180910390fd5b005b3480156102d657600080fd5b506102f160048036038101906102ec91906130f4565b61098f565b6040516102fe919061368d565b60405180910390f35b34801561031357600080fd5b5061031c610a21565b60405161032991906138a0565b60405180910390f35b34801561033e57600080fd5b50610347610a27565b60405161035491906136de565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613228565b610ab9565b6040516103919190613626565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613087565b610b38565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613228565b610c7c565b005b3480156103f857600080fd5b50610401610c8e565b60405161040e91906136c3565b60405180910390f35b34801561042357600080fd5b5061042c610ca1565b60405161043991906138a0565b60405180910390f35b34801561044e57600080fd5b50610457610cb8565b60405161046491906138a0565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612f71565b610cbe565b005b3480156104a257600080fd5b506104ab610fe3565b6040516104b891906136a8565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e3919061314e565b610fe9565b005b3480156104f657600080fd5b50610511600480360381019061050c9190612f04565b61101e565b60405161051e91906138a0565b60405180910390f35b34801561053357600080fd5b5061053c611036565b005b34801561054a57600080fd5b5061056560048036038101906105609190612f71565b6112eb565b005b34801561057357600080fd5b5061057c61130b565b60405161058991906138a0565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b4919061317b565b611311565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190613228565b61132f565b6040516105ef9190613626565b60405180910390f35b34801561060457600080fd5b5061061f600480360381019061061a91906131c8565b611341565b005b34801561062d57600080fd5b5061064860048036038101906106439190612f04565b61135f565b60405161065591906138a0565b60405180910390f35b34801561066a57600080fd5b50610673611418565b005b61068f600480360381019061068a9190613255565b61142c565b005b34801561069d57600080fd5b506106b860048036038101906106b391906130c7565b6116c2565b005b3480156106c657600080fd5b506106cf6116d4565b6040516106dc9190613626565b60405180910390f35b3480156106f157600080fd5b506106fa6116fe565b60405161070791906136de565b60405180910390f35b61072a60048036038101906107259190613228565b611790565b005b34801561073857600080fd5b50610753600480360381019061074e9190613047565b611971565b005b34801561076157600080fd5b5061076a611ae9565b60405161077791906138a0565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190612fc4565b611aef565b005b3480156107b557600080fd5b506107d060048036038101906107cb919061317b565b611b62565b005b3480156107de57600080fd5b506107e7611b80565b6040516107f491906138a0565b60405180910390f35b34801561080957600080fd5b50610812611b86565b60405161081f91906136c3565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613228565b611b9d565b60405161085c91906136de565b60405180910390f35b34801561087157600080fd5b5061087a611c55565b60405161088791906138a0565b60405180910390f35b34801561089c57600080fd5b506108a5611c79565b6040516108b291906138a0565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd9190612f31565b611c9d565b6040516108ef919061368d565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613228565b611d31565b005b61093b60048036038101906109369190613087565b611e1c565b005b34801561094957600080fd5b50610964600480360381019061095f9190612f04565b6120f2565b005b34801561097257600080fd5b5061098d60048036038101906109889190613228565b612176565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ea57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600e5481565b606060028054610a3690613ba3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6290613ba3565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b5050505050905090565b6000610ac482612188565b610afa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b438261132f565b90508073ffffffffffffffffffffffffffffffffffffffff16610b646121e7565b73ffffffffffffffffffffffffffffffffffffffff1614610bc757610b9081610b8b6121e7565b611c9d565b610bc6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610c846121ef565b80600b8190555050565b601260009054906101000a900460ff1681565b6000610cab61226d565b6001546000540303905090565b600b5481565b6000610cc982612276565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d30576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d3c84612344565b91509150610d528187610d4d6121e7565b61236b565b610d9e57610d6786610d626121e7565b611c9d565b610d9d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e05576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1286868660016123af565b8015610e1d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610eeb85610ec78888876123b5565b7c0200000000000000000000000000000000000000000000000000000000176123dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f73576000600185019050600060046000838152602001908152602001600020541415610f71576000548114610f70578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fdb8686866001612408565b505050505050565b60115481565b610ff16121ef565b80601260006101000a81548160ff0219169083600381111561101657611015613cd1565b5b021790555050565b60136020528060005260406000206000915090505481565b61103e6121ef565b600073b92535c47c6108b8a7cf1dc9e08be449e6be9d5190506000739691b70b81524e60b937eb490af9e8ee16bb08e8905060007326a8ae8435bb9653c7c66c64217d15e397a4523e90506000606460374761109a9190613a20565b6110a491906139ef565b9050600060646023476110b79190613a20565b6110c191906139ef565b905060008183476110d29190613a7a565b6110dc9190613a7a565b905060008673ffffffffffffffffffffffffffffffffffffffff168460405161110490613611565b60006040518083038185875af1925050503d8060008114611141576040519150601f19603f3d011682016040523d82523d6000602084013e611146565b606091505b505090508061118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190613840565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16836040516111ae90613611565b60006040518083038185875af1925050503d80600081146111eb576040519150601f19603f3d011682016040523d82523d6000602084013e6111f0565b606091505b50508091505080611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90613840565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168260405161125a90613611565b60006040518083038185875af1925050503d8060008114611297576040519150601f19603f3d011682016040523d82523d6000602084013e61129c565b606091505b505080915050806112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990613840565b60405180910390fd5b50505050505050565b61130683838360405180602001604052806000815250611aef565b505050565b600a5481565b6113196121ef565b8181600f919061132a929190612cb2565b505050565b600061133a82612276565b9050919050565b6113496121ef565b6113538383611311565b80601581905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114206121ef565b61142a600061240e565b565b60026009541415611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613880565b60405180910390fd5b6002600981905550600180600381111561148f5761148e613cd1565b5b601260009054906101000a900460ff1660038111156114b1576114b0613cd1565b5b146114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e8906137a0565b60405180910390fd5b611565838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506011543360405160200161154a91906135c7565b604051602081830303815290604052805190602001206124d4565b6115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159b90613800565b60405180910390fd5b83600c546115b29190613a20565b34146115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90613700565b60405180910390fd5b600a54846115ff610ca1565b611609919061395f565b111561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190613780565b60405180910390fd5b600e5484611656611c79565b611660919061395f565b11156116a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169890613860565b60405180910390fd5b6116aa846124eb565b6116b43385612529565b506001600981905550505050565b6116ca6121ef565b8060118190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461170d90613ba3565b80601f016020809104026020016040519081016040528092919081815260200182805461173990613ba3565b80156117865780601f1061175b57610100808354040283529160200191611786565b820191906000526020600020905b81548152906001019060200180831161176957829003601f168201915b5050505050905090565b600260095414156117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613880565b60405180910390fd5b600260098190555060028060038111156117f3576117f2613cd1565b5b601260009054906101000a900460ff16600381111561181557611814613cd1565b5b14611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c906137a0565b60405180910390fd5b81600b546118639190613a20565b34146118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b90613700565b60405180910390fd5b600a54826118b0610ca1565b6118ba919061395f565b11156118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290613780565b60405180910390fd5b600d5482611907611c55565b611911919061395f565b1115611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990613720565b60405180910390fd5b61195b82612547565b6119653383612529565b50600160098190555050565b6119796121e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119de576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119eb6121e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a986121e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611add919061368d565b60405180910390a35050565b600d5481565b611afa848484610cbe565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b5c57611b2584848484612585565b611b5b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b6a6121ef565b818160109190611b7b929190612cb2565b505050565b600c5481565b6000601260009054906101000a900460ff16905090565b6060611ba882612188565b611bde576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601554821115611bf757611bf06126e5565b9050611c50565b6000611c01612777565b90506000815111611c215760405180602001604052806000815250611c4c565b80611c2b84612809565b604051602001611c3c9291906135e2565b6040516020818303038152906040525b9150505b919050565b600080611c69611c6433612859565b6128a6565b9150508063ffffffff1691505090565b600080611c8d611c8833612859565b6128a6565b5090508063ffffffff1691505090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d396121ef565b6000806003811115611d4e57611d4d613cd1565b5b601260009054906101000a900460ff166003811115611d7057611d6f613cd1565b5b14611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da7906137a0565b60405180910390fd5b600a5482611dbc610ca1565b611dc6919061395f565b1115611e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfe90613780565b60405180910390fd5b611e18611e126116d4565b83612529565b5050565b60026009541415611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613880565b60405180910390fd5b60026009819055506002806003811115611e7f57611e7e613cd1565b5b601260009054906101000a900460ff166003811115611ea157611ea0613cd1565b5b14611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed8906137a0565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f47906137c0565b60405180910390fd5b60145482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f9e919061395f565b1115611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd690613820565b60405180910390fd5b81600b54611fed9190613a20565b341461202e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202590613700565b60405180910390fd5b600a548261203a610ca1565b612044919061395f565b1115612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c90613780565b60405180910390fd5b61208f8383612529565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120de919061395f565b925050819055505060016009819055505050565b6120fa6121ef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216190613740565b60405180910390fd5b6121738161240e565b50565b61217e6121ef565b80600c8190555050565b60008161219361226d565b111580156121a2575060005482105b80156121e0575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6121f76128c2565b73ffffffffffffffffffffffffffffffffffffffff166122156116d4565b73ffffffffffffffffffffffffffffffffffffffff161461226b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612262906137e0565b60405180910390fd5b565b60006001905090565b6000808290508061228561226d565b1161230d5760005481101561230c5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561230a575b60008114156123005760046000836001900393508381526020019081526020016000205490506122d5565b809250505061233f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123cc8686846128ca565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826124e185846128d3565b1490509392505050565b6000806124ff6124fa33612859565b6128a6565b91509150828261250f91906139b5565b91506125243361251f8484612929565b612950565b505050565b612543828260405180602001604052806000815250612a06565b5050565b60008061255b61255633612859565b6128a6565b91509150828161256b91906139b5565b90506125803361257b8484612929565b612950565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125ab6121e7565b8786866040518563ffffffff1660e01b81526004016125cd9493929190613641565b602060405180830381600087803b1580156125e757600080fd5b505af192505050801561261857506040513d601f19601f820116820180604052508101906126159190613121565b60015b612692573d8060008114612648576040519150601f19603f3d011682016040523d82523d6000602084013e61264d565b606091505b5060008151141561268a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601080546126f490613ba3565b80601f016020809104026020016040519081016040528092919081815260200182805461272090613ba3565b801561276d5780601f106127425761010080835404028352916020019161276d565b820191906000526020600020905b81548152906001019060200180831161275057829003601f168201915b5050505050905090565b6060600f805461278690613ba3565b80601f01602080910402602001604051908101604052809291908181526020018280546127b290613ba3565b80156127ff5780601f106127d4576101008083540402835291602001916127ff565b820191906000526020600020905b8154815290600101906020018083116127e257829003601f168201915b5050505050905090565b606060806040510190508060405280825b60011561284557600183039250600a81066030018353600a810490508061284057612845565b61281a565b508181036020830392508083525050919050565b600060c0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c9050919050565b60008060208367ffffffffffffffff16901c9150829050915091565b600033905090565b60009392505050565b60008082905060005b845181101561291e57612909828683815181106128fc576128fb613d2f565b5b6020026020010151612aa3565b9150808061291690613c06565b9150506128dc565b508091505092915050565b60008163ffffffff1660208463ffffffff1667ffffffffffffffff16901b17905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600082905060c081901b77ffffffffffffffffffffffffffffffffffffffffffffffff831617915081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b612a108383612ace565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a9e57600080549050600083820390505b612a506000868380600101945086612585565b612a86576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a3d578160005414612a9b57600080fd5b50505b505050565b6000818310612abb57612ab68284612c8b565b612ac6565b612ac58383612c8b565b5b905092915050565b6000805490506000821415612b0f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b1c60008483856123af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b9383612b8460008660006123b5565b612b8d85612ca2565b176123dd565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c3457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bf9565b506000821415612c70576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612c866000848385612408565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612cbe90613ba3565b90600052602060002090601f016020900481019282612ce05760008555612d27565b82601f10612cf957803560ff1916838001178555612d27565b82800160010185558215612d27579182015b82811115612d26578235825591602001919060010190612d0b565b5b509050612d349190612d38565b5090565b5b80821115612d51576000816000905550600101612d39565b5090565b6000612d68612d63846138e0565b6138bb565b905082815260208101848484011115612d8457612d83613d9c565b5b612d8f848285613b61565b509392505050565b600081359050612da68161406a565b92915050565b60008083601f840112612dc257612dc1613d92565b5b8235905067ffffffffffffffff811115612ddf57612dde613d8d565b5b602083019150836020820283011115612dfb57612dfa613d97565b5b9250929050565b600081359050612e1181614081565b92915050565b600081359050612e2681614098565b92915050565b600081359050612e3b816140af565b92915050565b600081519050612e50816140af565b92915050565b600082601f830112612e6b57612e6a613d92565b5b8135612e7b848260208601612d55565b91505092915050565b600081359050612e93816140c6565b92915050565b60008083601f840112612eaf57612eae613d92565b5b8235905067ffffffffffffffff811115612ecc57612ecb613d8d565b5b602083019150836001820283011115612ee857612ee7613d97565b5b9250929050565b600081359050612efe816140d6565b92915050565b600060208284031215612f1a57612f19613da6565b5b6000612f2884828501612d97565b91505092915050565b60008060408385031215612f4857612f47613da6565b5b6000612f5685828601612d97565b9250506020612f6785828601612d97565b9150509250929050565b600080600060608486031215612f8a57612f89613da6565b5b6000612f9886828701612d97565b9350506020612fa986828701612d97565b9250506040612fba86828701612eef565b9150509250925092565b60008060008060808587031215612fde57612fdd613da6565b5b6000612fec87828801612d97565b9450506020612ffd87828801612d97565b935050604061300e87828801612eef565b925050606085013567ffffffffffffffff81111561302f5761302e613da1565b5b61303b87828801612e56565b91505092959194509250565b6000806040838503121561305e5761305d613da6565b5b600061306c85828601612d97565b925050602061307d85828601612e02565b9150509250929050565b6000806040838503121561309e5761309d613da6565b5b60006130ac85828601612d97565b92505060206130bd85828601612eef565b9150509250929050565b6000602082840312156130dd576130dc613da6565b5b60006130eb84828501612e17565b91505092915050565b60006020828403121561310a57613109613da6565b5b600061311884828501612e2c565b91505092915050565b60006020828403121561313757613136613da6565b5b600061314584828501612e41565b91505092915050565b60006020828403121561316457613163613da6565b5b600061317284828501612e84565b91505092915050565b6000806020838503121561319257613191613da6565b5b600083013567ffffffffffffffff8111156131b0576131af613da1565b5b6131bc85828601612e99565b92509250509250929050565b6000806000604084860312156131e1576131e0613da6565b5b600084013567ffffffffffffffff8111156131ff576131fe613da1565b5b61320b86828701612e99565b9350935050602061321e86828701612eef565b9150509250925092565b60006020828403121561323e5761323d613da6565b5b600061324c84828501612eef565b91505092915050565b60008060006040848603121561326e5761326d613da6565b5b600061327c86828701612eef565b935050602084013567ffffffffffffffff81111561329d5761329c613da1565b5b6132a986828701612dac565b92509250509250925092565b6132be81613aae565b82525050565b6132d56132d082613aae565b613c4f565b82525050565b6132e481613ac0565b82525050565b6132f381613acc565b82525050565b600061330482613911565b61330e8185613927565b935061331e818560208601613b70565b61332781613dab565b840191505092915050565b61333b81613b4f565b82525050565b600061334c8261391c565b6133568185613943565b9350613366818560208601613b70565b61336f81613dab565b840191505092915050565b60006133858261391c565b61338f8185613954565b935061339f818560208601613b70565b80840191505092915050565b60006133b8601183613943565b91506133c382613dc9565b602082019050919050565b60006133db601283613943565b91506133e682613df2565b602082019050919050565b60006133fe602683613943565b915061340982613e1b565b604082019050919050565b6000613421600f83613943565b915061342c82613e6a565b602082019050919050565b6000613444601383613943565b915061344f82613e93565b602082019050919050565b6000613467601483613943565b915061347282613ebc565b602082019050919050565b600061348a602383613943565b915061349582613ee5565b604082019050919050565b60006134ad600583613954565b91506134b882613f34565b600582019050919050565b60006134d0602083613943565b91506134db82613f5d565b602082019050919050565b60006134f3600083613938565b91506134fe82613f86565b600082019050919050565b6000613516600d83613943565b915061352182613f89565b602082019050919050565b6000613539601983613943565b915061354482613fb2565b602082019050919050565b600061355c600f83613943565b915061356782613fdb565b602082019050919050565b600061357f601583613943565b915061358a82614004565b602082019050919050565b60006135a2601f83613943565b91506135ad8261402d565b602082019050919050565b6135c181613b35565b82525050565b60006135d382846132c4565b60148201915081905092915050565b60006135ee828561337a565b91506135fa828461337a565b9150613605826134a0565b91508190509392505050565b600061361c826134e6565b9150819050919050565b600060208201905061363b60008301846132b5565b92915050565b600060808201905061365660008301876132b5565b61366360208301866132b5565b61367060408301856135b8565b818103606083015261368281846132f9565b905095945050505050565b60006020820190506136a260008301846132db565b92915050565b60006020820190506136bd60008301846132ea565b92915050565b60006020820190506136d86000830184613332565b92915050565b600060208201905081810360008301526136f88184613341565b905092915050565b60006020820190508181036000830152613719816133ab565b9050919050565b60006020820190508181036000830152613739816133ce565b9050919050565b60006020820190508181036000830152613759816133f1565b9050919050565b6000602082019050818103600083015261377981613414565b9050919050565b6000602082019050818103600083015261379981613437565b9050919050565b600060208201905081810360008301526137b98161345a565b9050919050565b600060208201905081810360008301526137d98161347d565b9050919050565b600060208201905081810360008301526137f9816134c3565b9050919050565b6000602082019050818103600083015261381981613509565b9050919050565b600060208201905081810360008301526138398161352c565b9050919050565b600060208201905081810360008301526138598161354f565b9050919050565b6000602082019050818103600083015261387981613572565b9050919050565b6000602082019050818103600083015261389981613595565b9050919050565b60006020820190506138b560008301846135b8565b92915050565b60006138c56138d6565b90506138d18282613bd5565b919050565b6000604051905090565b600067ffffffffffffffff8211156138fb576138fa613d5e565b5b61390482613dab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061396a82613b35565b915061397583613b35565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139aa576139a9613c73565b5b828201905092915050565b60006139c082613b3f565b91506139cb83613b3f565b92508263ffffffff038211156139e4576139e3613c73565b5b828201905092915050565b60006139fa82613b35565b9150613a0583613b35565b925082613a1557613a14613ca2565b5b828204905092915050565b6000613a2b82613b35565b9150613a3683613b35565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a6f57613a6e613c73565b5b828202905092915050565b6000613a8582613b35565b9150613a9083613b35565b925082821015613aa357613aa2613c73565b5b828203905092915050565b6000613ab982613b15565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613b1082614056565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b6000613b5a82613b02565b9050919050565b82818337600083830152505050565b60005b83811015613b8e578082015181840152602081019050613b73565b83811115613b9d576000848401525b50505050565b60006002820490506001821680613bbb57607f821691505b60208210811415613bcf57613bce613d00565b5b50919050565b613bde82613dab565b810181811067ffffffffffffffff82111715613bfd57613bfc613d5e565b5b80604052505050565b6000613c1182613b35565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c4457613c43613c73565b5b600182019050919050565b6000613c5a82613c61565b9050919050565b6000613c6c82613dbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f696e636f7272656374207061796d656e74000000000000000000000000000000600082015250565b7f65786365656473207075626c6963206d61780000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420696d706c656d656e7465640000000000000000000000000000000000600082015250565b7f696e73756666696369656e7420737570706c7900000000000000000000000000600082015250565b7f696e636f7272656374206d696e74207068617365000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e7420666f7220646966666572656e74206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f696e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f457863656564206d696e742065787465726e616c206d61782100000000000000600082015250565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f6578636565647320616c6c6f776c697374206d61780000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6004811061406757614066613cd1565b5b50565b61407381613aae565b811461407e57600080fd5b50565b61408a81613ac0565b811461409557600080fd5b50565b6140a181613acc565b81146140ac57600080fd5b50565b6140b881613ad6565b81146140c357600080fd5b50565b600481106140d357600080fd5b50565b6140df81613b35565b81146140ea57600080fd5b5056fea26469706673582212209c668e7ed681bae5b2708802c44fa6243e3d6444344d66f85e508db32e5607b364736f6c63430008070033697066733a2f2f516d58327a324374467a6a34567348563463486e436567355a73644d4155624479726564475734374c574b755959
Deployed Bytecode
0x60806040526004361061023f5760003560e01c8063715018a61161012e578063bf17cd45116100ab578063e985e9c51161006f578063e985e9c5146108bb578063f19e75d4146108f8578063f254933d14610921578063f2fde38b1461093d578063fcf4b7301461096657610287565b8063bf17cd45146107d2578063c52766c6146107fd578063c87b56dd14610828578063d8ec555f14610865578063e87570bf1461089057610287565b8063a0712d68116100f2578063a0712d6814610710578063a22cb4651461072c578063b029a51414610755578063b88d4fde14610780578063bbaac02f146107a957610287565b8063715018a61461065e5780637bc9200e146106755780637cb64759146106915780638da5cb5b146106ba57806395d89b41146106e557610287565b80632eb4a7ab116101bc57806345c0f5331161018057806345c0f5331461056757806355f804b3146105925780636352211e146105bb578063708b4730146105f857806370a082311461062157610287565b80632eb4a7ab1461049657806331c07bbf146104c157806339f94118146104ea5780633ccfd60b1461052757806342842e0e1461053e57610287565b806316e0a2001161020357806316e0a200146103c357806317881cbf146103ec57806318160ddd146104175780631c18a0621461044257806323b872dd1461046d57610287565b806301ffc9a7146102ca578063031ee82b1461030757806306fdde0314610332578063081812fc1461035d578063095ea7b31461039a57610287565b36610287576000610285576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027c90613760565b60405180910390fd5b005b60006102c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102bf90613760565b60405180910390fd5b005b3480156102d657600080fd5b506102f160048036038101906102ec91906130f4565b61098f565b6040516102fe919061368d565b60405180910390f35b34801561031357600080fd5b5061031c610a21565b60405161032991906138a0565b60405180910390f35b34801561033e57600080fd5b50610347610a27565b60405161035491906136de565b60405180910390f35b34801561036957600080fd5b50610384600480360381019061037f9190613228565b610ab9565b6040516103919190613626565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613087565b610b38565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613228565b610c7c565b005b3480156103f857600080fd5b50610401610c8e565b60405161040e91906136c3565b60405180910390f35b34801561042357600080fd5b5061042c610ca1565b60405161043991906138a0565b60405180910390f35b34801561044e57600080fd5b50610457610cb8565b60405161046491906138a0565b60405180910390f35b34801561047957600080fd5b50610494600480360381019061048f9190612f71565b610cbe565b005b3480156104a257600080fd5b506104ab610fe3565b6040516104b891906136a8565b60405180910390f35b3480156104cd57600080fd5b506104e860048036038101906104e3919061314e565b610fe9565b005b3480156104f657600080fd5b50610511600480360381019061050c9190612f04565b61101e565b60405161051e91906138a0565b60405180910390f35b34801561053357600080fd5b5061053c611036565b005b34801561054a57600080fd5b5061056560048036038101906105609190612f71565b6112eb565b005b34801561057357600080fd5b5061057c61130b565b60405161058991906138a0565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b4919061317b565b611311565b005b3480156105c757600080fd5b506105e260048036038101906105dd9190613228565b61132f565b6040516105ef9190613626565b60405180910390f35b34801561060457600080fd5b5061061f600480360381019061061a91906131c8565b611341565b005b34801561062d57600080fd5b5061064860048036038101906106439190612f04565b61135f565b60405161065591906138a0565b60405180910390f35b34801561066a57600080fd5b50610673611418565b005b61068f600480360381019061068a9190613255565b61142c565b005b34801561069d57600080fd5b506106b860048036038101906106b391906130c7565b6116c2565b005b3480156106c657600080fd5b506106cf6116d4565b6040516106dc9190613626565b60405180910390f35b3480156106f157600080fd5b506106fa6116fe565b60405161070791906136de565b60405180910390f35b61072a60048036038101906107259190613228565b611790565b005b34801561073857600080fd5b50610753600480360381019061074e9190613047565b611971565b005b34801561076157600080fd5b5061076a611ae9565b60405161077791906138a0565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190612fc4565b611aef565b005b3480156107b557600080fd5b506107d060048036038101906107cb919061317b565b611b62565b005b3480156107de57600080fd5b506107e7611b80565b6040516107f491906138a0565b60405180910390f35b34801561080957600080fd5b50610812611b86565b60405161081f91906136c3565b60405180910390f35b34801561083457600080fd5b5061084f600480360381019061084a9190613228565b611b9d565b60405161085c91906136de565b60405180910390f35b34801561087157600080fd5b5061087a611c55565b60405161088791906138a0565b60405180910390f35b34801561089c57600080fd5b506108a5611c79565b6040516108b291906138a0565b60405180910390f35b3480156108c757600080fd5b506108e260048036038101906108dd9190612f31565b611c9d565b6040516108ef919061368d565b60405180910390f35b34801561090457600080fd5b5061091f600480360381019061091a9190613228565b611d31565b005b61093b60048036038101906109369190613087565b611e1c565b005b34801561094957600080fd5b50610964600480360381019061095f9190612f04565b6120f2565b005b34801561097257600080fd5b5061098d60048036038101906109889190613228565b612176565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ea57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b600e5481565b606060028054610a3690613ba3565b80601f0160208091040260200160405190810160405280929190818152602001828054610a6290613ba3565b8015610aaf5780601f10610a8457610100808354040283529160200191610aaf565b820191906000526020600020905b815481529060010190602001808311610a9257829003601f168201915b5050505050905090565b6000610ac482612188565b610afa576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b438261132f565b90508073ffffffffffffffffffffffffffffffffffffffff16610b646121e7565b73ffffffffffffffffffffffffffffffffffffffff1614610bc757610b9081610b8b6121e7565b611c9d565b610bc6576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b610c846121ef565b80600b8190555050565b601260009054906101000a900460ff1681565b6000610cab61226d565b6001546000540303905090565b600b5481565b6000610cc982612276565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d30576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d3c84612344565b91509150610d528187610d4d6121e7565b61236b565b610d9e57610d6786610d626121e7565b611c9d565b610d9d576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610e05576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e1286868660016123af565b8015610e1d57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610eeb85610ec78888876123b5565b7c0200000000000000000000000000000000000000000000000000000000176123dd565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610f73576000600185019050600060046000838152602001908152602001600020541415610f71576000548114610f70578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fdb8686866001612408565b505050505050565b60115481565b610ff16121ef565b80601260006101000a81548160ff0219169083600381111561101657611015613cd1565b5b021790555050565b60136020528060005260406000206000915090505481565b61103e6121ef565b600073b92535c47c6108b8a7cf1dc9e08be449e6be9d5190506000739691b70b81524e60b937eb490af9e8ee16bb08e8905060007326a8ae8435bb9653c7c66c64217d15e397a4523e90506000606460374761109a9190613a20565b6110a491906139ef565b9050600060646023476110b79190613a20565b6110c191906139ef565b905060008183476110d29190613a7a565b6110dc9190613a7a565b905060008673ffffffffffffffffffffffffffffffffffffffff168460405161110490613611565b60006040518083038185875af1925050503d8060008114611141576040519150601f19603f3d011682016040523d82523d6000602084013e611146565b606091505b505090508061118a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118190613840565b60405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16836040516111ae90613611565b60006040518083038185875af1925050503d80600081146111eb576040519150601f19603f3d011682016040523d82523d6000602084013e6111f0565b606091505b50508091505080611236576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122d90613840565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168260405161125a90613611565b60006040518083038185875af1925050503d8060008114611297576040519150601f19603f3d011682016040523d82523d6000602084013e61129c565b606091505b505080915050806112e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112d990613840565b60405180910390fd5b50505050505050565b61130683838360405180602001604052806000815250611aef565b505050565b600a5481565b6113196121ef565b8181600f919061132a929190612cb2565b505050565b600061133a82612276565b9050919050565b6113496121ef565b6113538383611311565b80601581905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113c7576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6114206121ef565b61142a600061240e565b565b60026009541415611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613880565b60405180910390fd5b6002600981905550600180600381111561148f5761148e613cd1565b5b601260009054906101000a900460ff1660038111156114b1576114b0613cd1565b5b146114f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e8906137a0565b60405180910390fd5b611565838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050506011543360405160200161154a91906135c7565b604051602081830303815290604052805190602001206124d4565b6115a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159b90613800565b60405180910390fd5b83600c546115b29190613a20565b34146115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90613700565b60405180910390fd5b600a54846115ff610ca1565b611609919061395f565b111561164a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164190613780565b60405180910390fd5b600e5484611656611c79565b611660919061395f565b11156116a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169890613860565b60405180910390fd5b6116aa846124eb565b6116b43385612529565b506001600981905550505050565b6116ca6121ef565b8060118190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461170d90613ba3565b80601f016020809104026020016040519081016040528092919081815260200182805461173990613ba3565b80156117865780601f1061175b57610100808354040283529160200191611786565b820191906000526020600020905b81548152906001019060200180831161176957829003601f168201915b5050505050905090565b600260095414156117d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cd90613880565b60405180910390fd5b600260098190555060028060038111156117f3576117f2613cd1565b5b601260009054906101000a900460ff16600381111561181557611814613cd1565b5b14611855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184c906137a0565b60405180910390fd5b81600b546118639190613a20565b34146118a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189b90613700565b60405180910390fd5b600a54826118b0610ca1565b6118ba919061395f565b11156118fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f290613780565b60405180910390fd5b600d5482611907611c55565b611911919061395f565b1115611952576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194990613720565b60405180910390fd5b61195b82612547565b6119653383612529565b50600160098190555050565b6119796121e7565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119de576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006119eb6121e7565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a986121e7565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611add919061368d565b60405180910390a35050565b600d5481565b611afa848484610cbe565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611b5c57611b2584848484612585565b611b5b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611b6a6121ef565b818160109190611b7b929190612cb2565b505050565b600c5481565b6000601260009054906101000a900460ff16905090565b6060611ba882612188565b611bde576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601554821115611bf757611bf06126e5565b9050611c50565b6000611c01612777565b90506000815111611c215760405180602001604052806000815250611c4c565b80611c2b84612809565b604051602001611c3c9291906135e2565b6040516020818303038152906040525b9150505b919050565b600080611c69611c6433612859565b6128a6565b9150508063ffffffff1691505090565b600080611c8d611c8833612859565b6128a6565b5090508063ffffffff1691505090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d396121ef565b6000806003811115611d4e57611d4d613cd1565b5b601260009054906101000a900460ff166003811115611d7057611d6f613cd1565b5b14611db0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da7906137a0565b60405180910390fd5b600a5482611dbc610ca1565b611dc6919061395f565b1115611e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfe90613780565b60405180910390fd5b611e18611e126116d4565b83612529565b5050565b60026009541415611e62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5990613880565b60405180910390fd5b60026009819055506002806003811115611e7f57611e7e613cd1565b5b601260009054906101000a900460ff166003811115611ea157611ea0613cd1565b5b14611ee1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed8906137a0565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f47906137c0565b60405180910390fd5b60145482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f9e919061395f565b1115611fdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd690613820565b60405180910390fd5b81600b54611fed9190613a20565b341461202e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202590613700565b60405180910390fd5b600a548261203a610ca1565b612044919061395f565b1115612085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207c90613780565b60405180910390fd5b61208f8383612529565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120de919061395f565b925050819055505060016009819055505050565b6120fa6121ef565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561216a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216190613740565b60405180910390fd5b6121738161240e565b50565b61217e6121ef565b80600c8190555050565b60008161219361226d565b111580156121a2575060005482105b80156121e0575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b6121f76128c2565b73ffffffffffffffffffffffffffffffffffffffff166122156116d4565b73ffffffffffffffffffffffffffffffffffffffff161461226b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612262906137e0565b60405180910390fd5b565b60006001905090565b6000808290508061228561226d565b1161230d5760005481101561230c5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561230a575b60008114156123005760046000836001900393508381526020019081526020016000205490506122d5565b809250505061233f565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86123cc8686846128ca565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000826124e185846128d3565b1490509392505050565b6000806124ff6124fa33612859565b6128a6565b91509150828261250f91906139b5565b91506125243361251f8484612929565b612950565b505050565b612543828260405180602001604052806000815250612a06565b5050565b60008061255b61255633612859565b6128a6565b91509150828161256b91906139b5565b90506125803361257b8484612929565b612950565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026125ab6121e7565b8786866040518563ffffffff1660e01b81526004016125cd9493929190613641565b602060405180830381600087803b1580156125e757600080fd5b505af192505050801561261857506040513d601f19601f820116820180604052508101906126159190613121565b60015b612692573d8060008114612648576040519150601f19603f3d011682016040523d82523d6000602084013e61264d565b606091505b5060008151141561268a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601080546126f490613ba3565b80601f016020809104026020016040519081016040528092919081815260200182805461272090613ba3565b801561276d5780601f106127425761010080835404028352916020019161276d565b820191906000526020600020905b81548152906001019060200180831161275057829003601f168201915b5050505050905090565b6060600f805461278690613ba3565b80601f01602080910402602001604051908101604052809291908181526020018280546127b290613ba3565b80156127ff5780601f106127d4576101008083540402835291602001916127ff565b820191906000526020600020905b8154815290600101906020018083116127e257829003601f168201915b5050505050905090565b606060806040510190508060405280825b60011561284557600183039250600a81066030018353600a810490508061284057612845565b61281a565b508181036020830392508083525050919050565b600060c0600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c9050919050565b60008060208367ffffffffffffffff16901c9150829050915091565b600033905090565b60009392505050565b60008082905060005b845181101561291e57612909828683815181106128fc576128fb613d2f565b5b6020026020010151612aa3565b9150808061291690613c06565b9150506128dc565b508091505092915050565b60008163ffffffff1660208463ffffffff1667ffffffffffffffff16901b17905092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600082905060c081901b77ffffffffffffffffffffffffffffffffffffffffffffffff831617915081600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050505050565b612a108383612ace565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612a9e57600080549050600083820390505b612a506000868380600101945086612585565b612a86576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a3d578160005414612a9b57600080fd5b50505b505050565b6000818310612abb57612ab68284612c8b565b612ac6565b612ac58383612c8b565b5b905092915050565b6000805490506000821415612b0f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b1c60008483856123af565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b9383612b8460008660006123b5565b612b8d85612ca2565b176123dd565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c3457808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bf9565b506000821415612c70576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612c866000848385612408565b505050565b600082600052816020526040600020905092915050565b60006001821460e11b9050919050565b828054612cbe90613ba3565b90600052602060002090601f016020900481019282612ce05760008555612d27565b82601f10612cf957803560ff1916838001178555612d27565b82800160010185558215612d27579182015b82811115612d26578235825591602001919060010190612d0b565b5b509050612d349190612d38565b5090565b5b80821115612d51576000816000905550600101612d39565b5090565b6000612d68612d63846138e0565b6138bb565b905082815260208101848484011115612d8457612d83613d9c565b5b612d8f848285613b61565b509392505050565b600081359050612da68161406a565b92915050565b60008083601f840112612dc257612dc1613d92565b5b8235905067ffffffffffffffff811115612ddf57612dde613d8d565b5b602083019150836020820283011115612dfb57612dfa613d97565b5b9250929050565b600081359050612e1181614081565b92915050565b600081359050612e2681614098565b92915050565b600081359050612e3b816140af565b92915050565b600081519050612e50816140af565b92915050565b600082601f830112612e6b57612e6a613d92565b5b8135612e7b848260208601612d55565b91505092915050565b600081359050612e93816140c6565b92915050565b60008083601f840112612eaf57612eae613d92565b5b8235905067ffffffffffffffff811115612ecc57612ecb613d8d565b5b602083019150836001820283011115612ee857612ee7613d97565b5b9250929050565b600081359050612efe816140d6565b92915050565b600060208284031215612f1a57612f19613da6565b5b6000612f2884828501612d97565b91505092915050565b60008060408385031215612f4857612f47613da6565b5b6000612f5685828601612d97565b9250506020612f6785828601612d97565b9150509250929050565b600080600060608486031215612f8a57612f89613da6565b5b6000612f9886828701612d97565b9350506020612fa986828701612d97565b9250506040612fba86828701612eef565b9150509250925092565b60008060008060808587031215612fde57612fdd613da6565b5b6000612fec87828801612d97565b9450506020612ffd87828801612d97565b935050604061300e87828801612eef565b925050606085013567ffffffffffffffff81111561302f5761302e613da1565b5b61303b87828801612e56565b91505092959194509250565b6000806040838503121561305e5761305d613da6565b5b600061306c85828601612d97565b925050602061307d85828601612e02565b9150509250929050565b6000806040838503121561309e5761309d613da6565b5b60006130ac85828601612d97565b92505060206130bd85828601612eef565b9150509250929050565b6000602082840312156130dd576130dc613da6565b5b60006130eb84828501612e17565b91505092915050565b60006020828403121561310a57613109613da6565b5b600061311884828501612e2c565b91505092915050565b60006020828403121561313757613136613da6565b5b600061314584828501612e41565b91505092915050565b60006020828403121561316457613163613da6565b5b600061317284828501612e84565b91505092915050565b6000806020838503121561319257613191613da6565b5b600083013567ffffffffffffffff8111156131b0576131af613da1565b5b6131bc85828601612e99565b92509250509250929050565b6000806000604084860312156131e1576131e0613da6565b5b600084013567ffffffffffffffff8111156131ff576131fe613da1565b5b61320b86828701612e99565b9350935050602061321e86828701612eef565b9150509250925092565b60006020828403121561323e5761323d613da6565b5b600061324c84828501612eef565b91505092915050565b60008060006040848603121561326e5761326d613da6565b5b600061327c86828701612eef565b935050602084013567ffffffffffffffff81111561329d5761329c613da1565b5b6132a986828701612dac565b92509250509250925092565b6132be81613aae565b82525050565b6132d56132d082613aae565b613c4f565b82525050565b6132e481613ac0565b82525050565b6132f381613acc565b82525050565b600061330482613911565b61330e8185613927565b935061331e818560208601613b70565b61332781613dab565b840191505092915050565b61333b81613b4f565b82525050565b600061334c8261391c565b6133568185613943565b9350613366818560208601613b70565b61336f81613dab565b840191505092915050565b60006133858261391c565b61338f8185613954565b935061339f818560208601613b70565b80840191505092915050565b60006133b8601183613943565b91506133c382613dc9565b602082019050919050565b60006133db601283613943565b91506133e682613df2565b602082019050919050565b60006133fe602683613943565b915061340982613e1b565b604082019050919050565b6000613421600f83613943565b915061342c82613e6a565b602082019050919050565b6000613444601383613943565b915061344f82613e93565b602082019050919050565b6000613467601483613943565b915061347282613ebc565b602082019050919050565b600061348a602383613943565b915061349582613ee5565b604082019050919050565b60006134ad600583613954565b91506134b882613f34565b600582019050919050565b60006134d0602083613943565b91506134db82613f5d565b602082019050919050565b60006134f3600083613938565b91506134fe82613f86565b600082019050919050565b6000613516600d83613943565b915061352182613f89565b602082019050919050565b6000613539601983613943565b915061354482613fb2565b602082019050919050565b600061355c600f83613943565b915061356782613fdb565b602082019050919050565b600061357f601583613943565b915061358a82614004565b602082019050919050565b60006135a2601f83613943565b91506135ad8261402d565b602082019050919050565b6135c181613b35565b82525050565b60006135d382846132c4565b60148201915081905092915050565b60006135ee828561337a565b91506135fa828461337a565b9150613605826134a0565b91508190509392505050565b600061361c826134e6565b9150819050919050565b600060208201905061363b60008301846132b5565b92915050565b600060808201905061365660008301876132b5565b61366360208301866132b5565b61367060408301856135b8565b818103606083015261368281846132f9565b905095945050505050565b60006020820190506136a260008301846132db565b92915050565b60006020820190506136bd60008301846132ea565b92915050565b60006020820190506136d86000830184613332565b92915050565b600060208201905081810360008301526136f88184613341565b905092915050565b60006020820190508181036000830152613719816133ab565b9050919050565b60006020820190508181036000830152613739816133ce565b9050919050565b60006020820190508181036000830152613759816133f1565b9050919050565b6000602082019050818103600083015261377981613414565b9050919050565b6000602082019050818103600083015261379981613437565b9050919050565b600060208201905081810360008301526137b98161345a565b9050919050565b600060208201905081810360008301526137d98161347d565b9050919050565b600060208201905081810360008301526137f9816134c3565b9050919050565b6000602082019050818103600083015261381981613509565b9050919050565b600060208201905081810360008301526138398161352c565b9050919050565b600060208201905081810360008301526138598161354f565b9050919050565b6000602082019050818103600083015261387981613572565b9050919050565b6000602082019050818103600083015261389981613595565b9050919050565b60006020820190506138b560008301846135b8565b92915050565b60006138c56138d6565b90506138d18282613bd5565b919050565b6000604051905090565b600067ffffffffffffffff8211156138fb576138fa613d5e565b5b61390482613dab565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061396a82613b35565b915061397583613b35565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139aa576139a9613c73565b5b828201905092915050565b60006139c082613b3f565b91506139cb83613b3f565b92508263ffffffff038211156139e4576139e3613c73565b5b828201905092915050565b60006139fa82613b35565b9150613a0583613b35565b925082613a1557613a14613ca2565b5b828204905092915050565b6000613a2b82613b35565b9150613a3683613b35565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a6f57613a6e613c73565b5b828202905092915050565b6000613a8582613b35565b9150613a9083613b35565b925082821015613aa357613aa2613c73565b5b828203905092915050565b6000613ab982613b15565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050613b1082614056565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b6000613b5a82613b02565b9050919050565b82818337600083830152505050565b60005b83811015613b8e578082015181840152602081019050613b73565b83811115613b9d576000848401525b50505050565b60006002820490506001821680613bbb57607f821691505b60208210811415613bcf57613bce613d00565b5b50919050565b613bde82613dab565b810181811067ffffffffffffffff82111715613bfd57613bfc613d5e565b5b80604052505050565b6000613c1182613b35565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c4457613c43613c73565b5b600182019050919050565b6000613c5a82613c61565b9050919050565b6000613c6c82613dbc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f696e636f7272656374207061796d656e74000000000000000000000000000000600082015250565b7f65786365656473207075626c6963206d61780000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6e6f7420696d706c656d656e7465640000000000000000000000000000000000600082015250565b7f696e73756666696369656e7420737570706c7900000000000000000000000000600082015250565b7f696e636f7272656374206d696e74207068617365000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e7420666f7220646966666572656e74206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f696e76616c69642070726f6f6600000000000000000000000000000000000000600082015250565b7f457863656564206d696e742065787465726e616c206d61782100000000000000600082015250565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b7f6578636565647320616c6c6f776c697374206d61780000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6004811061406757614066613cd1565b5b50565b61407381613aae565b811461407e57600080fd5b50565b61408a81613ac0565b811461409557600080fd5b50565b6140a181613acc565b81146140ac57600080fd5b50565b6140b881613ad6565b81146140c357600080fd5b50565b600481106140d357600080fd5b50565b6140df81613b35565b81146140ea57600080fd5b5056fea26469706673582212209c668e7ed681bae5b2708802c44fa6243e3d6444344d66f85e508db32e5607b364736f6c63430008070033
Deployed Bytecode Sourcemap
10193:2808:4:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10157:5;10149:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;10193:2808;;10011:5;10003:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;10193:2808;9112:630:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;752:36:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9996:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16309:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15769:390;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11572:109:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;982:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5851:317:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;592:30:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19918:2756:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;918:25:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3934:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10236:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9000:791;;;;;;;;;;;;;:::i;:::-;;22765:179:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;514:29:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4200:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11348:150:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12242:156:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7002:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;2187:633:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3604:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10165:102:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2957:465:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16850:303:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;713:33:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23525:388:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4478:116:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;674:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6916:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12551:448;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6666:194;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6224:203;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17303:162:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8645:220:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10813:594;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11849:115:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9112:630:5;9197:4;9530:10;9515:25;;:11;:25;;;;:101;;;;9606:10;9591:25;;:11;:25;;;;9515:101;:177;;;;9682:10;9667:25;;:11;:25;;;;9515:177;9496:196;;9112:630;;;:::o;752:36:4:-;;;;:::o;9996:98:5:-;10050:13;10082:5;10075:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9996:98;:::o;16309:214::-;16385:7;16409:16;16417:7;16409;:16::i;:::-;16404:64;;16434:34;;;;;;;;;;;;;;16404:64;16486:15;:24;16502:7;16486:24;;;;;;;;;;;:30;;;;;;;;;;;;16479:37;;16309:214;;;:::o;15769:390::-;15849:13;15865:16;15873:7;15865;:16::i;:::-;15849:32;;15919:5;15896:28;;:19;:17;:19::i;:::-;:28;;;15892:172;;15943:44;15960:5;15967:19;:17;:19::i;:::-;15943:16;:44::i;:::-;15938:126;;16014:35;;;;;;;;;;;;;;15938:126;15892:172;16107:2;16074:15;:24;16090:7;16074:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;16144:7;16140:2;16124:28;;16133:5;16124:28;;;;;;;;;;;;15839:320;15769:390;;:::o;11572:109:4:-;1094:13:0;:11;:13::i;:::-;11665:9:4::1;11647:15;:27;;;;11572:109:::0;:::o;982:47::-;;;;;;;;;;;;;:::o;5851:317:5:-;5912:7;6136:15;:13;:15::i;:::-;6121:12;;6105:13;;:28;:46;6098:53;;5851:317;:::o;592:30:4:-;;;;:::o;19918:2756:5:-;20047:27;20077;20096:7;20077:18;:27::i;:::-;20047:57;;20160:4;20119:45;;20135:19;20119:45;;;20115:86;;20173:28;;;;;;;;;;;;;;20115:86;20213:27;20242:23;20269:35;20296:7;20269:26;:35::i;:::-;20212:92;;;;20401:68;20426:15;20443:4;20449:19;:17;:19::i;:::-;20401:24;:68::i;:::-;20396:179;;20488:43;20505:4;20511:19;:17;:19::i;:::-;20488:16;:43::i;:::-;20483:92;;20540:35;;;;;;;;;;;;;;20483:92;20396:179;20604:1;20590:16;;:2;:16;;;20586:52;;;20615:23;;;;;;;;;;;;;;20586:52;20649:43;20671:4;20677:2;20681:7;20690:1;20649:21;:43::i;:::-;20781:15;20778:157;;;20919:1;20898:19;20891:30;20778:157;21307:18;:24;21326:4;21307:24;;;;;;;;;;;;;;;;21305:26;;;;;;;;;;;;21375:18;:22;21394:2;21375:22;;;;;;;;;;;;;;;;21373:24;;;;;;;;;;;21690:143;21726:2;21774:45;21789:4;21795:2;21799:19;21774:14;:45::i;:::-;2349:8;21746:73;21690:18;:143::i;:::-;21661:17;:26;21679:7;21661:26;;;;;;;;;;;:172;;;;22001:1;2349:8;21950:19;:47;:52;21946:617;;;22022:19;22054:1;22044:7;:11;22022:33;;22209:1;22175:17;:30;22193:11;22175:30;;;;;;;;;;;;:35;22171:378;;;22311:13;;22296:11;:28;22292:239;;22489:19;22456:17;:30;22474:11;22456:30;;;;;;;;;;;:52;;;;22292:239;22171:378;22004:559;21946:617;22607:7;22603:2;22588:27;;22597:4;22588:27;;;;;;;;;;;;22625:42;22646:4;22652:2;22656:7;22665:1;22625:20;:42::i;:::-;20037:2637;;;19918:2756;;;:::o;918:25:4:-;;;;:::o;3934:102::-;1094:13:0;:11;:13::i;:::-;4019:10:4::1;4007:9;;:22;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;3934:102:::0;:::o;10236:54::-;;;;;;;;;;;;;;;;;:::o;9000:791::-;1094:13:0;:11;:13::i;:::-;9049:21:4::1;9073:42;9049:66;;9125:21;9149:42;9125:66;;9201:21;9225:42;9201:66;;9278:15;9325:3;9320:2;9296:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;9278:50;;9338:15;9385:3;9380:2;9356:21;:26;;;;:::i;:::-;:32;;;;:::i;:::-;9338:50;;9398:15;9450:7;9440;9416:21;:31;;;;:::i;:::-;:41;;;;:::i;:::-;9398:59;;9469:12;9487:13;:18;;9513:7;9487:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9468:57;;;9543:7;9535:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;9594:13;:18;;9620:7;9594:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9580:52;;;;;9650:7;9642:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;9701:13;:18;;9727:7;9701:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9687:52;;;;;9757:7;9749:35;;;;;;;;;;;;:::i;:::-;;;;;;;;;9039:752;;;;;;;9000:791::o:0;22765:179:5:-;22898:39;22915:4;22921:2;22925:7;22898:39;;;;;;;;;;;;:16;:39::i;:::-;22765:179;;;:::o;514:29:4:-;;;;:::o;4200:108::-;1094:13:0;:11;:13::i;:::-;4288::4::1;;4278:7;:23;;;;;;;:::i;:::-;;4200:108:::0;;:::o;11348:150:5:-;11420:7;11462:27;11481:7;11462:18;:27::i;:::-;11439:52;;11348:150;;;:::o;12242:156:4:-;1094:13:0;:11;:13::i;:::-;12334:25:4::1;12345:13;;12334:10;:25::i;:::-;12385:6;12369:13;:22;;;;12242:156:::0;;;:::o;7002:230:5:-;7074:7;7114:1;7097:19;;:5;:19;;;7093:60;;;7125:28;;;;;;;;;;;;;;7093:60;1317:13;7170:18;:25;7189:5;7170:25;;;;;;;;;;;;;;;;:55;7163:62;;7002:230;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;2187:633:4:-;1744:1:1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2306:24:4::1;1886:10;1873:23;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;1865:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2350:79:::2;2369:6;;2350:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:10;;2416;2399:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2389:39;;;;;;2350:18;:79::i;:::-;2342:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;2499:9;2478:18;;:30;;;;:::i;:::-;2465:9;:43;2457:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2577:14;;2564:9;2548:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:43;;2540:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;2674:21;;2661:9;2633:25;:23;:25::i;:::-;:37;;;;:::i;:::-;:62;;2625:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2731:40;2761:9;2731:29;:40::i;:::-;2781:32;2791:10;2803:9;2781;:32::i;:::-;2484:1:1::1;1701::::0;2628:7;:22;;;;2187:633:4;;;:::o;3604:104::-;1094:13:0;:11;:13::i;:::-;3690:11:4::1;3677:10;:24;;;;3604:104:::0;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;10165:102:5:-;10221:13;10253:7;10246:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10165:102;:::o;2957:465:4:-;1744:1:1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;3040:21:4::1;1886:10;1873:23;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;1865:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;3112:9:::2;3094:15;;:27;;;;:::i;:::-;3081:9;:40;3073:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;3190:14;;3177:9;3161:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:43;;3153:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3284:18;;3271:9;3246:22;:20;:22::i;:::-;:34;;;;:::i;:::-;:56;;3238:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;3336:37;3363:9;3336:26;:37::i;:::-;3383:32;3393:10;3405:9;3383;:32::i;:::-;2484:1:1::1;1701::::0;2628:7;:22;;;;2957:465:4;:::o;16850:303:5:-;16960:19;:17;:19::i;:::-;16948:31;;:8;:31;;;16944:61;;;16988:17;;;;;;;;;;;;;;16944:61;17068:8;17016:18;:39;17035:19;:17;:19::i;:::-;17016:39;;;;;;;;;;;;;;;:49;17056:8;17016:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;17127:8;17091:55;;17106:19;:17;:19::i;:::-;17091:55;;;17137:8;17091:55;;;;;;:::i;:::-;;;;;;;;16850:303;;:::o;713:33:4:-;;;;:::o;23525:388:5:-;23686:31;23699:4;23705:2;23709:7;23686:12;:31::i;:::-;23749:1;23731:2;:14;;;:19;23727:180;;23769:56;23800:4;23806:2;23810:7;23819:5;23769:30;:56::i;:::-;23764:143;;23852:40;;;;;;;;;;;;;;23764:143;23727:180;23525:388;;;;:::o;4478:116:4:-;1094:13:0;:11;:13::i;:::-;4572:15:4::1;;4560:9;:27;;;;;;;:::i;:::-;;4478:116:::0;;:::o;674:33::-;;;;:::o;6916:89::-;6961:9;6989;;;;;;;;;;;6982:16;;6916:89;:::o;12551:448::-;12624:13;12654:16;12662:7;12654;:16::i;:::-;12649:59;;12679:29;;;;;;;;;;;;;;12649:59;12732:13;;12722:7;:23;12718:275;;;12768:12;:10;:12::i;:::-;12761:19;;;;12718:275;12811:28;12842:10;:8;:10::i;:::-;12811:41;;12904:1;12879:14;12873:28;:32;:109;;;;;;;;;;;;;;;;;12932:14;12948:18;12958:7;12948:9;:18::i;:::-;12915:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12873:109;12866:116;;;12551:448;;;;:::o;6666:194::-;6719:7;6741:28;6773:42;6795:19;6803:10;6795:7;:19::i;:::-;6773:21;:42::i;:::-;6738:77;;;6832:21;6825:28;;;;;6666:194;:::o;6224:203::-;6280:7;6300:31;6337:42;6359:19;6367:10;6359:7;:19::i;:::-;6337:21;:42::i;:::-;6299:80;;;6396:24;6389:31;;;;;6224:203;:::o;17303:162:5:-;17400:4;17423:18;:25;17442:5;17423:25;;;;;;;;;;;;;;;:35;17449:8;17423:35;;;;;;;;;;;;;;;;;;;;;;;;;17416:42;;17303:162;;;;:::o;8645:220:4:-;1094:13:0;:11;:13::i;:::-;8714:18:4::1;1886:10;1873:23;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;1865:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;8781:14:::2;;8768:9;8752:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:43;;8744:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;8829:29;8839:7;:5;:7::i;:::-;8848:9;8829;:29::i;:::-;1117:1:0::1;8645:220:4::0;:::o;10813:594::-;1744:1:1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;10918:21:4::1;1886:10;1873:23;;;;;;;;:::i;:::-;;:9;;;;;;;;;;;:23;;;;;;;;:::i;:::-;;;1865:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;10973:10:::2;10959:24;;:10;:24;;;;10951:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;11088:20;;11075:9;11041:19;:31;11061:10;11041:31;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:67;;11033:105;;;;;;;;;;;;:::i;:::-;;;;;;;;;11187:9;11169:15;;:27;;;;:::i;:::-;11156:9;:40;11148:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;11265:14;;11252:9;11236:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:43;;11228:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;11314:32;11324:10;11336:9;11314;:32::i;:::-;11391:9;11356:19;:31;11376:10;11356:31;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;2484:1:1::1;1701::::0;2628:7;:22;;;;10813:594:4;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;11849:115:4:-;1094:13:0;:11;:13::i;:::-;11948:9:4::1;11927:18;:30;;;;11849:115:::0;:::o;17714:277:5:-;17779:4;17833:7;17814:15;:13;:15::i;:::-;:26;;:65;;;;;17866:13;;17856:7;:23;17814:65;:151;;;;;17964:1;2075:8;17916:17;:26;17934:7;17916:26;;;;;;;;;;;;:44;:49;17814:151;17795:170;;17714:277;;;:::o;38922:103::-;38982:7;39008:10;39001:17;;38922:103;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;9797:99:4:-;9862:7;9888:1;9881:8;;9797:99;:::o;12472:1249:5:-;12539:7;12558:12;12573:7;12558:22;;12638:4;12619:15;:13;:15::i;:::-;:23;12615:1042;;12671:13;;12664:4;:20;12660:997;;;12708:14;12725:17;:23;12743:4;12725:23;;;;;;;;;;;;12708:40;;12840:1;2075:8;12812:6;:24;:29;12808:831;;;13467:111;13484:1;13474:6;:11;13467:111;;;13526:17;:25;13544:6;;;;;;;13526:25;;;;;;;;;;;;13517:34;;13467:111;;;13610:6;13603:13;;;;;;12808:831;12686:971;12660:997;12615:1042;13683:31;;;;;;;;;;;;;;12472:1249;;;;:::o;18849:468::-;18948:27;18977:23;19016:38;19057:15;:24;19073:7;19057:24;;;;;;;;;;;19016:65;;19225:18;19202:41;;19281:19;19275:26;19256:45;;19188:123;18849:468;;;:::o;18095:646::-;18240:11;18402:16;18395:5;18391:28;18382:37;;18560:16;18549:9;18545:32;18532:45;;18708:15;18697:9;18694:30;18686:5;18675:9;18672:20;18669:56;18659:66;;18095:646;;;;;:::o;24557:154::-;;;;;:::o;38249:304::-;38380:7;38399:16;2470:3;38425:19;:41;;38399:68;;2470:3;38492:31;38503:4;38509:2;38513:9;38492:10;:31::i;:::-;38484:40;;:62;;38477:69;;;38249:304;;;;;:::o;14254:443::-;14334:14;14499:16;14492:5;14488:28;14479:37;;14674:5;14660:11;14635:23;14631:41;14628:52;14621:5;14618:63;14608:73;;14254:443;;;;:::o;25358:153::-;;;;;:::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;1153:184:3:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;4934:357:4:-;5017:31;5050:28;5082:42;5104:19;5112:10;5104:7;:19::i;:::-;5082:21;:42::i;:::-;5016:108;;;;5169:15;5134:51;;;;;:::i;:::-;;;5195:89;5203:10;5215:68;5235:24;5261:21;5215:19;:68::i;:::-;5195:7;:89::i;:::-;5006:285;;4934:357;:::o;32908:110:5:-;32984:27;32994:2;32998:8;32984:27;;;;;;;;;;;;:9;:27::i;:::-;32908:110;;:::o;5628:351:4:-;5708:31;5741:28;5773:42;5795:19;5803:10;5795:7;:19::i;:::-;5773:21;:42::i;:::-;5707:108;;;;5857:15;5825:48;;;;;:::i;:::-;;;5883:89;5891:10;5903:68;5923:24;5949:21;5903:19;:68::i;:::-;5883:7;:89::i;:::-;5697:282;;5628:351;:::o;25939:697:5:-;26097:4;26142:2;26117:45;;;26163:19;:17;:19::i;:::-;26184:4;26190:7;26199:5;26117:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26113:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26412:1;26395:6;:13;:18;26391:229;;;26440:40;;;;;;;;;;;;;;26391:229;26580:6;26574:13;26565:6;26561:2;26557:15;26550:38;26113:517;26283:54;;;26273:64;;;:6;:64;;;;26266:71;;;25939:697;;;;;;:::o;7233:101:4:-;7286:13;7318:9;7311:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7233:101;:::o;7065:106::-;7125:13;7157:7;7150:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7065:106;:::o;39122:1548:5:-;39187:17;39606:4;39599;39593:11;39589:22;39582:29;;39696:3;39690:4;39683:17;39799:3;40033:5;40015:419;40041:1;40015:419;;;40080:1;40075:3;40071:11;40064:18;;40248:2;40242:4;40238:13;40234:2;40230:22;40225:3;40217:36;40340:2;40334:4;40330:13;40322:21;;40405:4;40395:25;;40413:5;;40395:25;40015:419;;;40019:21;40471:3;40466;40462:13;40584:4;40579:3;40575:14;40568:21;;40647:6;40642:3;40635:19;39225:1439;;39122:1548;;;:::o;7867:135::-;7922:6;1682:3;7954:18;:25;7973:5;7954:25;;;;;;;;;;;;;;;;:40;;7940:55;;7867:135;;;:::o;8072:282:4:-;8153:31;8186:28;8283:2;8260:19;:25;;;;8226:60;;8327:19;8296:51;;8072:282;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;37960:143:5:-;38093:6;37960:143;;;;;:::o;1991:290:3:-;2074:7;2093:20;2116:4;2093:27;;2135:9;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;;2202:9;:33::i;:::-;2187:48;;2168:3;;;;;:::i;:::-;;;;2130:116;;;;2262:12;2255:19;;;1991:290;;;;:::o;7565:222:4:-;7681:6;7757:22;7750:30;;7744:2;7714:25;7707:33;;:39;;;;7706:74;7699:81;;7565:222;;;;:::o;8184:395:5:-;8255:14;8272:18;:25;8291:5;8272:25;;;;;;;;;;;;;;;;8255:42;;8307:17;8434:3;8421:16;;1682:3;8503:9;:24;;1824:14;8466:6;:32;8465:63;8456:72;;8566:6;8538:18;:25;8557:5;8538:25;;;;;;;;;;;;;;;:34;;;;8245:334;;8184:395;;:::o;32160:669::-;32286:19;32292:2;32296:8;32286:5;:19::i;:::-;32362:1;32344:2;:14;;;:19;32340:473;;32383:11;32397:13;;32383:27;;32428:13;32450:8;32444:3;:14;32428:30;;32476:229;32506:62;32545:1;32549:2;32553:7;;;;;;32562:5;32506:30;:62::i;:::-;32501:165;;32603:40;;;;;;;;;;;;;;32501:165;32700:3;32692:5;:11;32476:229;;32785:3;32768:13;;:20;32764:34;;32790:8;;;32764:34;32365:448;;32340:473;32160:669;;;:::o;8054:147:3:-;8117:7;8147:1;8143;:5;:51;;8174:20;8189:1;8192;8174:14;:20::i;:::-;8143:51;;;8151:20;8166:1;8169;8151:14;:20::i;:::-;8143:51;8136:58;;8054:147;;;;:::o;27082:2396:5:-;27154:20;27177:13;;27154:36;;27216:1;27204:8;:13;27200:44;;;27226:18;;;;;;;;;;;;;;27200:44;27255:61;27285:1;27289:2;27293:12;27307:8;27255:21;:61::i;:::-;27788:1;1452:2;27758:1;:26;;27757:32;27745:8;:45;27719:18;:22;27738:2;27719:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;28060:136;28096:2;28149:33;28172:1;28176:2;28180:1;28149:14;:33::i;:::-;28116:30;28137:8;28116:20;:30::i;:::-;:66;28060:18;:136::i;:::-;28026:17;:31;28044:12;28026:31;;;;;;;;;;;:170;;;;28211:16;28241:11;28270:8;28255:12;:23;28241:37;;28520:16;28516:2;28512:25;28500:37;;28884:12;28845:8;28805:1;28744:25;28686:1;28626;28600:328;29005:1;28991:12;28987:20;28946:339;29045:3;29036:7;29033:16;28946:339;;29259:7;29249:8;29246:1;29219:25;29216:1;29213;29208:59;29097:1;29088:7;29084:15;29073:26;;28946:339;;;28950:75;29328:1;29316:8;:13;29312:45;;;29338:19;;;;;;;;;;;;;;29312:45;29388:3;29372:13;:19;;;;27499:1903;;29411:60;29440:1;29444:2;29448:12;29462:8;29411:20;:60::i;:::-;27144:2334;27082:2396;;:::o;8207:261:3:-;8275:13;8379:1;8373:4;8366:15;8407:1;8401:4;8394:15;8447:4;8441;8431:21;8422:30;;8207:261;;;;:::o;14794:318:5:-;14864:14;15093:1;15083:8;15080:15;15054:24;15050:46;15040:56;;14794:318;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:7:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1159:133::-;1202:5;1240:6;1227:20;1218:29;;1256:30;1280:5;1256:30;:::i;:::-;1159:133;;;;:::o;1298:139::-;1344:5;1382:6;1369:20;1360:29;;1398:33;1425:5;1398:33;:::i;:::-;1298:139;;;;:::o;1443:137::-;1488:5;1526:6;1513:20;1504:29;;1542:32;1568:5;1542:32;:::i;:::-;1443:137;;;;:::o;1586:141::-;1642:5;1673:6;1667:13;1658:22;;1689:32;1715:5;1689:32;:::i;:::-;1586:141;;;;:::o;1746:338::-;1801:5;1850:3;1843:4;1835:6;1831:17;1827:27;1817:122;;1858:79;;:::i;:::-;1817:122;1975:6;1962:20;2000:78;2074:3;2066:6;2059:4;2051:6;2047:17;2000:78;:::i;:::-;1991:87;;1807:277;1746:338;;;;:::o;2090:165::-;2149:5;2187:6;2174:20;2165:29;;2203:46;2243:5;2203:46;:::i;:::-;2090:165;;;;:::o;2275:553::-;2333:8;2343:6;2393:3;2386:4;2378:6;2374:17;2370:27;2360:122;;2401:79;;:::i;:::-;2360:122;2514:6;2501:20;2491:30;;2544:18;2536:6;2533:30;2530:117;;;2566:79;;:::i;:::-;2530:117;2680:4;2672:6;2668:17;2656:29;;2734:3;2726:4;2718:6;2714:17;2704:8;2700:32;2697:41;2694:128;;;2741:79;;:::i;:::-;2694:128;2275:553;;;;;:::o;2834:139::-;2880:5;2918:6;2905:20;2896:29;;2934:33;2961:5;2934:33;:::i;:::-;2834:139;;;;:::o;2979:329::-;3038:6;3087:2;3075:9;3066:7;3062:23;3058:32;3055:119;;;3093:79;;:::i;:::-;3055:119;3213:1;3238:53;3283:7;3274:6;3263:9;3259:22;3238:53;:::i;:::-;3228:63;;3184:117;2979:329;;;;:::o;3314:474::-;3382:6;3390;3439:2;3427:9;3418:7;3414:23;3410:32;3407:119;;;3445:79;;:::i;:::-;3407:119;3565:1;3590:53;3635:7;3626:6;3615:9;3611:22;3590:53;:::i;:::-;3580:63;;3536:117;3692:2;3718:53;3763:7;3754:6;3743:9;3739:22;3718:53;:::i;:::-;3708:63;;3663:118;3314:474;;;;;:::o;3794:619::-;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;4189:2;4215:53;4260:7;4251:6;4240:9;4236:22;4215:53;:::i;:::-;4205:63;;4160:118;4317:2;4343:53;4388:7;4379:6;4368:9;4364:22;4343:53;:::i;:::-;4333:63;;4288:118;3794:619;;;;;:::o;4419:943::-;4514:6;4522;4530;4538;4587:3;4575:9;4566:7;4562:23;4558:33;4555:120;;;4594:79;;:::i;:::-;4555:120;4714:1;4739:53;4784:7;4775:6;4764:9;4760:22;4739:53;:::i;:::-;4729:63;;4685:117;4841:2;4867:53;4912:7;4903:6;4892:9;4888:22;4867:53;:::i;:::-;4857:63;;4812:118;4969:2;4995:53;5040:7;5031:6;5020:9;5016:22;4995:53;:::i;:::-;4985:63;;4940:118;5125:2;5114:9;5110:18;5097:32;5156:18;5148:6;5145:30;5142:117;;;5178:79;;:::i;:::-;5142:117;5283:62;5337:7;5328:6;5317:9;5313:22;5283:62;:::i;:::-;5273:72;;5068:287;4419:943;;;;;;;:::o;5368:468::-;5433:6;5441;5490:2;5478:9;5469:7;5465:23;5461:32;5458:119;;;5496:79;;:::i;:::-;5458:119;5616:1;5641:53;5686:7;5677:6;5666:9;5662:22;5641:53;:::i;:::-;5631:63;;5587:117;5743:2;5769:50;5811:7;5802:6;5791:9;5787:22;5769:50;:::i;:::-;5759:60;;5714:115;5368:468;;;;;:::o;5842:474::-;5910:6;5918;5967:2;5955:9;5946:7;5942:23;5938:32;5935:119;;;5973:79;;:::i;:::-;5935:119;6093:1;6118:53;6163:7;6154:6;6143:9;6139:22;6118:53;:::i;:::-;6108:63;;6064:117;6220:2;6246:53;6291:7;6282:6;6271:9;6267:22;6246:53;:::i;:::-;6236:63;;6191:118;5842:474;;;;;:::o;6322:329::-;6381:6;6430:2;6418:9;6409:7;6405:23;6401:32;6398:119;;;6436:79;;:::i;:::-;6398:119;6556:1;6581:53;6626:7;6617:6;6606:9;6602:22;6581:53;:::i;:::-;6571:63;;6527:117;6322:329;;;;:::o;6657:327::-;6715:6;6764:2;6752:9;6743:7;6739:23;6735:32;6732:119;;;6770:79;;:::i;:::-;6732:119;6890:1;6915:52;6959:7;6950:6;6939:9;6935:22;6915:52;:::i;:::-;6905:62;;6861:116;6657:327;;;;:::o;6990:349::-;7059:6;7108:2;7096:9;7087:7;7083:23;7079:32;7076:119;;;7114:79;;:::i;:::-;7076:119;7234:1;7259:63;7314:7;7305:6;7294:9;7290:22;7259:63;:::i;:::-;7249:73;;7205:127;6990:349;;;;:::o;7345:355::-;7417:6;7466:2;7454:9;7445:7;7441:23;7437:32;7434:119;;;7472:79;;:::i;:::-;7434:119;7592:1;7617:66;7675:7;7666:6;7655:9;7651:22;7617:66;:::i;:::-;7607:76;;7563:130;7345:355;;;;:::o;7706:529::-;7777:6;7785;7834:2;7822:9;7813:7;7809:23;7805:32;7802:119;;;7840:79;;:::i;:::-;7802:119;7988:1;7977:9;7973:17;7960:31;8018:18;8010:6;8007:30;8004:117;;;8040:79;;:::i;:::-;8004:117;8153:65;8210:7;8201:6;8190:9;8186:22;8153:65;:::i;:::-;8135:83;;;;7931:297;7706:529;;;;;:::o;8241:674::-;8321:6;8329;8337;8386:2;8374:9;8365:7;8361:23;8357:32;8354:119;;;8392:79;;:::i;:::-;8354:119;8540:1;8529:9;8525:17;8512:31;8570:18;8562:6;8559:30;8556:117;;;8592:79;;:::i;:::-;8556:117;8705:65;8762:7;8753:6;8742:9;8738:22;8705:65;:::i;:::-;8687:83;;;;8483:297;8819:2;8845:53;8890:7;8881:6;8870:9;8866:22;8845:53;:::i;:::-;8835:63;;8790:118;8241:674;;;;;:::o;8921:329::-;8980:6;9029:2;9017:9;9008:7;9004:23;9000:32;8997:119;;;9035:79;;:::i;:::-;8997:119;9155:1;9180:53;9225:7;9216:6;9205:9;9201:22;9180:53;:::i;:::-;9170:63;;9126:117;8921:329;;;;:::o;9256:704::-;9351:6;9359;9367;9416:2;9404:9;9395:7;9391:23;9387:32;9384:119;;;9422:79;;:::i;:::-;9384:119;9542:1;9567:53;9612:7;9603:6;9592:9;9588:22;9567:53;:::i;:::-;9557:63;;9513:117;9697:2;9686:9;9682:18;9669:32;9728:18;9720:6;9717:30;9714:117;;;9750:79;;:::i;:::-;9714:117;9863:80;9935:7;9926:6;9915:9;9911:22;9863:80;:::i;:::-;9845:98;;;;9640:313;9256:704;;;;;:::o;9966:118::-;10053:24;10071:5;10053:24;:::i;:::-;10048:3;10041:37;9966:118;;:::o;10090:157::-;10195:45;10215:24;10233:5;10215:24;:::i;:::-;10195:45;:::i;:::-;10190:3;10183:58;10090:157;;:::o;10253:109::-;10334:21;10349:5;10334:21;:::i;:::-;10329:3;10322:34;10253:109;;:::o;10368:118::-;10455:24;10473:5;10455:24;:::i;:::-;10450:3;10443:37;10368:118;;:::o;10492:360::-;10578:3;10606:38;10638:5;10606:38;:::i;:::-;10660:70;10723:6;10718:3;10660:70;:::i;:::-;10653:77;;10739:52;10784:6;10779:3;10772:4;10765:5;10761:16;10739:52;:::i;:::-;10816:29;10838:6;10816:29;:::i;:::-;10811:3;10807:39;10800:46;;10582:270;10492:360;;;;:::o;10858:153::-;10956:48;10998:5;10956:48;:::i;:::-;10951:3;10944:61;10858:153;;:::o;11017:364::-;11105:3;11133:39;11166:5;11133:39;:::i;:::-;11188:71;11252:6;11247:3;11188:71;:::i;:::-;11181:78;;11268:52;11313:6;11308:3;11301:4;11294:5;11290:16;11268:52;:::i;:::-;11345:29;11367:6;11345:29;:::i;:::-;11340:3;11336:39;11329:46;;11109:272;11017:364;;;;:::o;11387:377::-;11493:3;11521:39;11554:5;11521:39;:::i;:::-;11576:89;11658:6;11653:3;11576:89;:::i;:::-;11569:96;;11674:52;11719:6;11714:3;11707:4;11700:5;11696:16;11674:52;:::i;:::-;11751:6;11746:3;11742:16;11735:23;;11497:267;11387:377;;;;:::o;11770:366::-;11912:3;11933:67;11997:2;11992:3;11933:67;:::i;:::-;11926:74;;12009:93;12098:3;12009:93;:::i;:::-;12127:2;12122:3;12118:12;12111:19;;11770:366;;;:::o;12142:::-;12284:3;12305:67;12369:2;12364:3;12305:67;:::i;:::-;12298:74;;12381:93;12470:3;12381:93;:::i;:::-;12499:2;12494:3;12490:12;12483:19;;12142:366;;;:::o;12514:::-;12656:3;12677:67;12741:2;12736:3;12677:67;:::i;:::-;12670:74;;12753:93;12842:3;12753:93;:::i;:::-;12871:2;12866:3;12862:12;12855:19;;12514:366;;;:::o;12886:::-;13028:3;13049:67;13113:2;13108:3;13049:67;:::i;:::-;13042:74;;13125:93;13214:3;13125:93;:::i;:::-;13243:2;13238:3;13234:12;13227:19;;12886:366;;;:::o;13258:::-;13400:3;13421:67;13485:2;13480:3;13421:67;:::i;:::-;13414:74;;13497:93;13586:3;13497:93;:::i;:::-;13615:2;13610:3;13606:12;13599:19;;13258:366;;;:::o;13630:::-;13772:3;13793:67;13857:2;13852:3;13793:67;:::i;:::-;13786:74;;13869:93;13958:3;13869:93;:::i;:::-;13987:2;13982:3;13978:12;13971:19;;13630:366;;;:::o;14002:::-;14144:3;14165:67;14229:2;14224:3;14165:67;:::i;:::-;14158:74;;14241:93;14330:3;14241:93;:::i;:::-;14359:2;14354:3;14350:12;14343:19;;14002:366;;;:::o;14374:400::-;14534:3;14555:84;14637:1;14632:3;14555:84;:::i;:::-;14548:91;;14648:93;14737:3;14648:93;:::i;:::-;14766:1;14761:3;14757:11;14750:18;;14374:400;;;:::o;14780:366::-;14922:3;14943:67;15007:2;15002:3;14943:67;:::i;:::-;14936:74;;15019:93;15108:3;15019:93;:::i;:::-;15137:2;15132:3;15128:12;15121:19;;14780:366;;;:::o;15152:398::-;15311:3;15332:83;15413:1;15408:3;15332:83;:::i;:::-;15325:90;;15424:93;15513:3;15424:93;:::i;:::-;15542:1;15537:3;15533:11;15526:18;;15152:398;;;:::o;15556:366::-;15698:3;15719:67;15783:2;15778:3;15719:67;:::i;:::-;15712:74;;15795:93;15884:3;15795:93;:::i;:::-;15913:2;15908:3;15904:12;15897:19;;15556:366;;;:::o;15928:::-;16070:3;16091:67;16155:2;16150:3;16091:67;:::i;:::-;16084:74;;16167:93;16256:3;16167:93;:::i;:::-;16285:2;16280:3;16276:12;16269:19;;15928:366;;;:::o;16300:::-;16442:3;16463:67;16527:2;16522:3;16463:67;:::i;:::-;16456:74;;16539:93;16628:3;16539:93;:::i;:::-;16657:2;16652:3;16648:12;16641:19;;16300:366;;;:::o;16672:::-;16814:3;16835:67;16899:2;16894:3;16835:67;:::i;:::-;16828:74;;16911:93;17000:3;16911:93;:::i;:::-;17029:2;17024:3;17020:12;17013:19;;16672:366;;;:::o;17044:::-;17186:3;17207:67;17271:2;17266:3;17207:67;:::i;:::-;17200:74;;17283:93;17372:3;17283:93;:::i;:::-;17401:2;17396:3;17392:12;17385:19;;17044:366;;;:::o;17416:118::-;17503:24;17521:5;17503:24;:::i;:::-;17498:3;17491:37;17416:118;;:::o;17540:256::-;17652:3;17667:75;17738:3;17729:6;17667:75;:::i;:::-;17767:2;17762:3;17758:12;17751:19;;17787:3;17780:10;;17540:256;;;;:::o;17802:701::-;18083:3;18105:95;18196:3;18187:6;18105:95;:::i;:::-;18098:102;;18217:95;18308:3;18299:6;18217:95;:::i;:::-;18210:102;;18329:148;18473:3;18329:148;:::i;:::-;18322:155;;18494:3;18487:10;;17802:701;;;;;:::o;18509:379::-;18693:3;18715:147;18858:3;18715:147;:::i;:::-;18708:154;;18879:3;18872:10;;18509:379;;;:::o;18894:222::-;18987:4;19025:2;19014:9;19010:18;19002:26;;19038:71;19106:1;19095:9;19091:17;19082:6;19038:71;:::i;:::-;18894:222;;;;:::o;19122:640::-;19317:4;19355:3;19344:9;19340:19;19332:27;;19369:71;19437:1;19426:9;19422:17;19413:6;19369:71;:::i;:::-;19450:72;19518:2;19507:9;19503:18;19494:6;19450:72;:::i;:::-;19532;19600:2;19589:9;19585:18;19576:6;19532:72;:::i;:::-;19651:9;19645:4;19641:20;19636:2;19625:9;19621:18;19614:48;19679:76;19750:4;19741:6;19679:76;:::i;:::-;19671:84;;19122:640;;;;;;;:::o;19768:210::-;19855:4;19893:2;19882:9;19878:18;19870:26;;19906:65;19968:1;19957:9;19953:17;19944:6;19906:65;:::i;:::-;19768:210;;;;:::o;19984:222::-;20077:4;20115:2;20104:9;20100:18;20092:26;;20128:71;20196:1;20185:9;20181:17;20172:6;20128:71;:::i;:::-;19984:222;;;;:::o;20212:244::-;20316:4;20354:2;20343:9;20339:18;20331:26;;20367:82;20446:1;20435:9;20431:17;20422:6;20367:82;:::i;:::-;20212:244;;;;:::o;20462:313::-;20575:4;20613:2;20602:9;20598:18;20590:26;;20662:9;20656:4;20652:20;20648:1;20637:9;20633:17;20626:47;20690:78;20763:4;20754:6;20690:78;:::i;:::-;20682:86;;20462:313;;;;:::o;20781:419::-;20947:4;20985:2;20974:9;20970:18;20962:26;;21034:9;21028:4;21024:20;21020:1;21009:9;21005:17;20998:47;21062:131;21188:4;21062:131;:::i;:::-;21054:139;;20781:419;;;:::o;21206:::-;21372:4;21410:2;21399:9;21395:18;21387:26;;21459:9;21453:4;21449:20;21445:1;21434:9;21430:17;21423:47;21487:131;21613:4;21487:131;:::i;:::-;21479:139;;21206:419;;;:::o;21631:::-;21797:4;21835:2;21824:9;21820:18;21812:26;;21884:9;21878:4;21874:20;21870:1;21859:9;21855:17;21848:47;21912:131;22038:4;21912:131;:::i;:::-;21904:139;;21631:419;;;:::o;22056:::-;22222:4;22260:2;22249:9;22245:18;22237:26;;22309:9;22303:4;22299:20;22295:1;22284:9;22280:17;22273:47;22337:131;22463:4;22337:131;:::i;:::-;22329:139;;22056:419;;;:::o;22481:::-;22647:4;22685:2;22674:9;22670:18;22662:26;;22734:9;22728:4;22724:20;22720:1;22709:9;22705:17;22698:47;22762:131;22888:4;22762:131;:::i;:::-;22754:139;;22481:419;;;:::o;22906:::-;23072:4;23110:2;23099:9;23095:18;23087:26;;23159:9;23153:4;23149:20;23145:1;23134:9;23130:17;23123:47;23187:131;23313:4;23187:131;:::i;:::-;23179:139;;22906:419;;;:::o;23331:::-;23497:4;23535:2;23524:9;23520:18;23512:26;;23584:9;23578:4;23574:20;23570:1;23559:9;23555:17;23548:47;23612:131;23738:4;23612:131;:::i;:::-;23604:139;;23331:419;;;:::o;23756:::-;23922:4;23960:2;23949:9;23945:18;23937:26;;24009:9;24003:4;23999:20;23995:1;23984:9;23980:17;23973:47;24037:131;24163:4;24037:131;:::i;:::-;24029:139;;23756:419;;;:::o;24181:::-;24347:4;24385:2;24374:9;24370:18;24362:26;;24434:9;24428:4;24424:20;24420:1;24409:9;24405:17;24398:47;24462:131;24588:4;24462:131;:::i;:::-;24454:139;;24181:419;;;:::o;24606:::-;24772:4;24810:2;24799:9;24795:18;24787:26;;24859:9;24853:4;24849:20;24845:1;24834:9;24830:17;24823:47;24887:131;25013:4;24887:131;:::i;:::-;24879:139;;24606:419;;;:::o;25031:::-;25197:4;25235:2;25224:9;25220:18;25212:26;;25284:9;25278:4;25274:20;25270:1;25259:9;25255:17;25248:47;25312:131;25438:4;25312:131;:::i;:::-;25304:139;;25031:419;;;:::o;25456:::-;25622:4;25660:2;25649:9;25645:18;25637:26;;25709:9;25703:4;25699:20;25695:1;25684:9;25680:17;25673:47;25737:131;25863:4;25737:131;:::i;:::-;25729:139;;25456:419;;;:::o;25881:::-;26047:4;26085:2;26074:9;26070:18;26062:26;;26134:9;26128:4;26124:20;26120:1;26109:9;26105:17;26098:47;26162:131;26288:4;26162:131;:::i;:::-;26154:139;;25881:419;;;:::o;26306:222::-;26399:4;26437:2;26426:9;26422:18;26414:26;;26450:71;26518:1;26507:9;26503:17;26494:6;26450:71;:::i;:::-;26306:222;;;;:::o;26534:129::-;26568:6;26595:20;;:::i;:::-;26585:30;;26624:33;26652:4;26644:6;26624:33;:::i;:::-;26534:129;;;:::o;26669:75::-;26702:6;26735:2;26729:9;26719:19;;26669:75;:::o;26750:307::-;26811:4;26901:18;26893:6;26890:30;26887:56;;;26923:18;;:::i;:::-;26887:56;26961:29;26983:6;26961:29;:::i;:::-;26953:37;;27045:4;27039;27035:15;27027:23;;26750:307;;;:::o;27063:98::-;27114:6;27148:5;27142:12;27132:22;;27063:98;;;:::o;27167:99::-;27219:6;27253:5;27247:12;27237:22;;27167:99;;;:::o;27272:168::-;27355:11;27389:6;27384:3;27377:19;27429:4;27424:3;27420:14;27405:29;;27272:168;;;;:::o;27446:147::-;27547:11;27584:3;27569:18;;27446:147;;;;:::o;27599:169::-;27683:11;27717:6;27712:3;27705:19;27757:4;27752:3;27748:14;27733:29;;27599:169;;;;:::o;27774:148::-;27876:11;27913:3;27898:18;;27774:148;;;;:::o;27928:305::-;27968:3;27987:20;28005:1;27987:20;:::i;:::-;27982:25;;28021:20;28039:1;28021:20;:::i;:::-;28016:25;;28175:1;28107:66;28103:74;28100:1;28097:81;28094:107;;;28181:18;;:::i;:::-;28094:107;28225:1;28222;28218:9;28211:16;;27928:305;;;;:::o;28239:246::-;28278:3;28297:19;28314:1;28297:19;:::i;:::-;28292:24;;28330:19;28347:1;28330:19;:::i;:::-;28325:24;;28427:1;28415:10;28411:18;28408:1;28405:25;28402:51;;;28433:18;;:::i;:::-;28402:51;28477:1;28474;28470:9;28463:16;;28239:246;;;;:::o;28491:185::-;28531:1;28548:20;28566:1;28548:20;:::i;:::-;28543:25;;28582:20;28600:1;28582:20;:::i;:::-;28577:25;;28621:1;28611:35;;28626:18;;:::i;:::-;28611:35;28668:1;28665;28661:9;28656:14;;28491:185;;;;:::o;28682:348::-;28722:7;28745:20;28763:1;28745:20;:::i;:::-;28740:25;;28779:20;28797:1;28779:20;:::i;:::-;28774:25;;28967:1;28899:66;28895:74;28892:1;28889:81;28884:1;28877:9;28870:17;28866:105;28863:131;;;28974:18;;:::i;:::-;28863:131;29022:1;29019;29015:9;29004:20;;28682:348;;;;:::o;29036:191::-;29076:4;29096:20;29114:1;29096:20;:::i;:::-;29091:25;;29130:20;29148:1;29130:20;:::i;:::-;29125:25;;29169:1;29166;29163:8;29160:34;;;29174:18;;:::i;:::-;29160:34;29219:1;29216;29212:9;29204:17;;29036:191;;;;:::o;29233:96::-;29270:7;29299:24;29317:5;29299:24;:::i;:::-;29288:35;;29233:96;;;:::o;29335:90::-;29369:7;29412:5;29405:13;29398:21;29387:32;;29335:90;;;:::o;29431:77::-;29468:7;29497:5;29486:16;;29431:77;;;:::o;29514:149::-;29550:7;29590:66;29583:5;29579:78;29568:89;;29514:149;;;:::o;29669:137::-;29719:7;29748:5;29737:16;;29754:46;29794:5;29754:46;:::i;:::-;29669:137;;;:::o;29812:126::-;29849:7;29889:42;29882:5;29878:54;29867:65;;29812:126;;;:::o;29944:77::-;29981:7;30010:5;29999:16;;29944:77;;;:::o;30027:93::-;30063:7;30103:10;30096:5;30092:22;30081:33;;30027:93;;;:::o;30126:137::-;30187:9;30220:37;30251:5;30220:37;:::i;:::-;30207:50;;30126:137;;;:::o;30269:154::-;30353:6;30348:3;30343;30330:30;30415:1;30406:6;30401:3;30397:16;30390:27;30269:154;;;:::o;30429:307::-;30497:1;30507:113;30521:6;30518:1;30515:13;30507:113;;;30606:1;30601:3;30597:11;30591:18;30587:1;30582:3;30578:11;30571:39;30543:2;30540:1;30536:10;30531:15;;30507:113;;;30638:6;30635:1;30632:13;30629:101;;;30718:1;30709:6;30704:3;30700:16;30693:27;30629:101;30478:258;30429:307;;;:::o;30742:320::-;30786:6;30823:1;30817:4;30813:12;30803:22;;30870:1;30864:4;30860:12;30891:18;30881:81;;30947:4;30939:6;30935:17;30925:27;;30881:81;31009:2;31001:6;30998:14;30978:18;30975:38;30972:84;;;31028:18;;:::i;:::-;30972:84;30793:269;30742:320;;;:::o;31068:281::-;31151:27;31173:4;31151:27;:::i;:::-;31143:6;31139:40;31281:6;31269:10;31266:22;31245:18;31233:10;31230:34;31227:62;31224:88;;;31292:18;;:::i;:::-;31224:88;31332:10;31328:2;31321:22;31111:238;31068:281;;:::o;31355:233::-;31394:3;31417:24;31435:5;31417:24;:::i;:::-;31408:33;;31463:66;31456:5;31453:77;31450:103;;;31533:18;;:::i;:::-;31450:103;31580:1;31573:5;31569:13;31562:20;;31355:233;;;:::o;31594:100::-;31633:7;31662:26;31682:5;31662:26;:::i;:::-;31651:37;;31594:100;;;:::o;31700:94::-;31739:7;31768:20;31782:5;31768:20;:::i;:::-;31757:31;;31700:94;;;:::o;31800:180::-;31848:77;31845:1;31838:88;31945:4;31942:1;31935:15;31969:4;31966:1;31959:15;31986:180;32034:77;32031:1;32024:88;32131:4;32128:1;32121:15;32155:4;32152:1;32145:15;32172:180;32220:77;32217:1;32210:88;32317:4;32314:1;32307:15;32341:4;32338:1;32331:15;32358:180;32406:77;32403:1;32396:88;32503:4;32500:1;32493:15;32527:4;32524:1;32517:15;32544:180;32592:77;32589:1;32582:88;32689:4;32686:1;32679:15;32713:4;32710:1;32703:15;32730:180;32778:77;32775:1;32768:88;32875:4;32872:1;32865:15;32899:4;32896:1;32889:15;32916:117;33025:1;33022;33015:12;33039:117;33148:1;33145;33138:12;33162:117;33271:1;33268;33261:12;33285:117;33394:1;33391;33384:12;33408:117;33517:1;33514;33507:12;33531:117;33640:1;33637;33630:12;33654:102;33695:6;33746:2;33742:7;33737:2;33730:5;33726:14;33722:28;33712:38;;33654:102;;;:::o;33762:94::-;33795:8;33843:5;33839:2;33835:14;33814:35;;33762:94;;;:::o;33862:167::-;34002:19;33998:1;33990:6;33986:14;33979:43;33862:167;:::o;34035:168::-;34175:20;34171:1;34163:6;34159:14;34152:44;34035:168;:::o;34209:225::-;34349:34;34345:1;34337:6;34333:14;34326:58;34418:8;34413:2;34405:6;34401:15;34394:33;34209:225;:::o;34440:165::-;34580:17;34576:1;34568:6;34564:14;34557:41;34440:165;:::o;34611:169::-;34751:21;34747:1;34739:6;34735:14;34728:45;34611:169;:::o;34786:170::-;34926:22;34922:1;34914:6;34910:14;34903:46;34786:170;:::o;34962:222::-;35102:34;35098:1;35090:6;35086:14;35079:58;35171:5;35166:2;35158:6;35154:15;35147:30;34962:222;:::o;35190:155::-;35330:7;35326:1;35318:6;35314:14;35307:31;35190:155;:::o;35351:182::-;35491:34;35487:1;35479:6;35475:14;35468:58;35351:182;:::o;35539:114::-;;:::o;35659:163::-;35799:15;35795:1;35787:6;35783:14;35776:39;35659:163;:::o;35828:175::-;35968:27;35964:1;35956:6;35952:14;35945:51;35828:175;:::o;36009:165::-;36149:17;36145:1;36137:6;36133:14;36126:41;36009:165;:::o;36180:171::-;36320:23;36316:1;36308:6;36304:14;36297:47;36180:171;:::o;36357:181::-;36497:33;36493:1;36485:6;36481:14;36474:57;36357:181;:::o;36544:118::-;36630:1;36623:5;36620:12;36610:46;;36636:18;;:::i;:::-;36610:46;36544:118;:::o;36668:122::-;36741:24;36759:5;36741:24;:::i;:::-;36734:5;36731:35;36721:63;;36780:1;36777;36770:12;36721:63;36668:122;:::o;36796:116::-;36866:21;36881:5;36866:21;:::i;:::-;36859:5;36856:32;36846:60;;36902:1;36899;36892:12;36846:60;36796:116;:::o;36918:122::-;36991:24;37009:5;36991:24;:::i;:::-;36984:5;36981:35;36971:63;;37030:1;37027;37020:12;36971:63;36918:122;:::o;37046:120::-;37118:23;37135:5;37118:23;:::i;:::-;37111:5;37108:34;37098:62;;37156:1;37153;37146:12;37098:62;37046:120;:::o;37172:112::-;37258:1;37251:5;37248:12;37238:40;;37274:1;37271;37264:12;37238:40;37172:112;:::o;37290:122::-;37363:24;37381:5;37363:24;:::i;:::-;37356:5;37353:35;37343:63;;37402:1;37399;37392:12;37343:63;37290:122;:::o
Swarm Source
ipfs://9c668e7ed681bae5b2708802c44fa6243e3d6444344d66f85e508db32e5607b3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.