Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
563 ANUBISNFT
Holders
69
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
3 ANUBISNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Anubis
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.9 <0.9.0; import 'erc721a/contracts/extensions/ERC721AQueryable.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/cryptography/MerkleProof.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; contract Anubis is ERC721AQueryable, Ownable, ReentrancyGuard { using Strings for uint256; string public tokenName = "Anubis NFT"; string public tokenSymbol = "ANUBISNFT"; uint256 public maxSupply = 4444; uint256 public maxReservedSupply = 888; uint256 public maxOGMintAddress = 3; uint256 public maxWLMintAddress = 3; uint256 public maxPublicMintAddress = 3; bytes32 public ogMerkleRoot; bytes32 public wlMerkleRoot; mapping(address => bool) public mintClaimed; mapping(uint256 => uint256) public nftTrait; bool public paused = false; bool public whitelistMintEnabled = true; bool public revealed = true; string public uriPrefix = ''; string public uriSuffix = '.json'; string public hiddenMetadataUri = ""; string public trait1MetadataUri = "ipfs://QmcpUFDj9xdrCZMiTGw4S5ek3G6DhiC7A7KjZcfjYgrCZe/"; string public trait2MetadataUri = "ipfs://QmdmpDK2y79P8zcEgGqUp3m8NSfHxZApZXpxiUzo4qWe67/"; uint256 public ogMintUnixTimestamp = 1670164200; uint256 public wlMintUnixTimestamp = 1670166000; uint256 public publicMintUnixTimestamp = 1670173200; uint256 public ogCost = 0.015 ether; uint256 public wlCost = 0.018 ether; uint256 public publicCost = 0.024 ether; constructor() ERC721A(tokenName, tokenSymbol) { } modifier mintPriceCompliance(uint256 _mintAmount) { require(msg.value >= updateMintCost(_mintAmount), 'Insufficient funds!'); _; } function mint(uint256 _mintAmount, uint256 traitType, bytes32[] calldata _merkleProof) public payable mintPriceCompliance(_mintAmount) { uint stage = mintStage(); require(stage > 0, 'Mint not start'); if (stage == 1) { bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, ogMerkleRoot, leaf), 'Invalid proof!'); } else if (stage == 2) { bytes32 leaf = keccak256(abi.encodePacked(_msgSender())); require(MerkleProof.verify(_merkleProof, wlMerkleRoot, leaf), 'Invalid proof!'); } require(!paused, 'The contract is paused!'); if (stage == 1) { require(_mintAmount > 0 && _mintAmount <= maxOGMintAddress, 'Invalid mint amount!'); } else if (stage == 2) { require(_mintAmount > 0 && _mintAmount <= maxWLMintAddress, 'Invalid mint amount!'); } else { require(_mintAmount > 0 && _mintAmount <= maxPublicMintAddress, 'Invalid mint amount!'); } require(totalSupply() + _mintAmount <= (maxSupply - maxReservedSupply), 'Max supply exceeded!'); require(!mintClaimed[_msgSender()], 'Address already claimed!'); if (traitType == 1) { uint tokenIdx = totalSupply() + 1; nftTrait[tokenIdx] = 1; nftTrait[tokenIdx + _mintAmount - 1] = 1; } else { uint tokenIdx = totalSupply() + 1; nftTrait[tokenIdx] = 2; nftTrait[tokenIdx + _mintAmount - 1] = 2; } mintClaimed[_msgSender()] = true; _safeMint(_msgSender(), _mintAmount); } function mintOwner(uint256 _mintAmount, address _receiver, uint256 traitType) public onlyOwner { require((totalSupply() + _mintAmount) <= maxSupply, 'Max supply exceeded!'); if (traitType == 1) { uint tokenIdx = totalSupply() + 1; nftTrait[tokenIdx] = 1; nftTrait[tokenIdx + _mintAmount - 1] = 1; } else { uint tokenIdx = totalSupply() + 1; nftTrait[tokenIdx] = 2; nftTrait[tokenIdx + _mintAmount - 1] = 2; } _safeMint(_receiver, _mintAmount); } function mintStage() public view returns (uint) { if (block.timestamp > publicMintUnixTimestamp) { return 3; } if (block.timestamp > wlMintUnixTimestamp) { return 2; } if (block.timestamp > ogMintUnixTimestamp) { return 1; } return 0; } function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), 'ERC721Metadata: URI query for nonexistent token'); if (revealed == false) { return hiddenMetadataUri; } string memory currentBaseURI = _baseURI(); uint256 traitType = nftTrait[_tokenId]; if (traitType == 0) { for (uint i = _tokenId; i > 0; i--) { if (nftTrait[i] != 0) { traitType = nftTrait[i]; break; } } } if (traitType == 1) { return bytes(trait1MetadataUri).length > 0 ? string(abi.encodePacked(trait1MetadataUri, _tokenId.toString(), uriSuffix)) : ''; } else if (traitType == 2) { return bytes(trait2MetadataUri).length > 0 ? string(abi.encodePacked(trait2MetadataUri, _tokenId.toString(), uriSuffix)) : ''; } return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix)) : ''; } function setPaused(bool _state) public onlyOwner { paused = _state; } function setRevealed(bool _state) public onlyOwner { revealed = _state; } function setCost(uint256 _cost, uint256 stage) public onlyOwner { if (stage == 1) { ogCost = _cost; } else if (stage == 2) { wlCost = _cost; } else { publicCost = _cost; } } function setMaxReservedSupply(uint256 _newMaxReservedSupply) public onlyOwner { require(_newMaxReservedSupply <= (maxSupply - totalSupply())); maxReservedSupply = _newMaxReservedSupply; } function setMaxOGMintAddress(uint256 _maxMintAddress) public onlyOwner { maxOGMintAddress = _maxMintAddress; } function setMaxWLMintAddress(uint256 _maxMintAddress) public onlyOwner { maxWLMintAddress = _maxMintAddress; } function setMaxPublicMintAddress(uint256 _maxMintAddress) public onlyOwner { maxPublicMintAddress = _maxMintAddress; } function setogMintUnixTimestamp(uint256 _ogMintUnixTimestamp) public onlyOwner { ogMintUnixTimestamp = _ogMintUnixTimestamp; } function setwlMintUnixTimestamp(uint256 _wlMintUnixTimestamp) public onlyOwner { wlMintUnixTimestamp = _wlMintUnixTimestamp; } function setpublicMintUnixTimestamp(uint256 _publicMintUnixTimestamp) public onlyOwner { publicMintUnixTimestamp = _publicMintUnixTimestamp; } function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner { hiddenMetadataUri = _hiddenMetadataUri; } function setUriPrefix(string memory _uriPrefix) public onlyOwner { uriPrefix = _uriPrefix; } function setTraitMetadataUri(string memory _uriPrefix, uint traitType) public onlyOwner { if (traitType == 1) { trait1MetadataUri = _uriPrefix; } else if (traitType == 2) { trait2MetadataUri = _uriPrefix; } } function setUriSuffix(string memory _uriSuffix) public onlyOwner { uriSuffix = _uriSuffix; } function setMerkleRoot(bytes32 _merkleRoot, uint stage) public onlyOwner { if (stage == 1) { ogMerkleRoot = _merkleRoot; } else if (stage == 2) { wlMerkleRoot = _merkleRoot; } } function setWhitelistMintEnabled(bool _state) public onlyOwner { whitelistMintEnabled = _state; } // A function of hope -> function withdraw() public onlyOwner nonReentrant { (bool os, ) = payable(owner()).call{value: address(this).balance}(''); require(os); } // Internal -> function _startTokenId() internal view virtual override returns (uint256) { return 1; } function updateMintCost(uint256 _amount) internal view returns (uint256 _cost) { uint256 cost; uint stage = mintStage(); if (stage == 1) { cost = ogCost; } else if (stage == 2) { cost = wlCost; } else { cost = publicCost; } return cost * _amount; } function _baseURI() internal view virtual override returns (string memory) { return uriPrefix; } }
// 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) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// 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 (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.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721AQueryable.sol'; import '../ERC721A.sol'; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import './IERC721A.sol'; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The 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 tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [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 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (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 { 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; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev 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 See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @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)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); 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 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _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 { 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 Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function 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) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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 `_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) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(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++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { 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 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; } /** * @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 Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; import '../IERC721A.sol'; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
{ "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":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxOGMintAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPublicMintAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReservedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWLMintAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint256","name":"traitType","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"traitType","type":"uint256"}],"name":"mintOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftTrait","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ogMintUnixTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMintUnixTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"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":"uint256","name":"_cost","type":"uint256"},{"internalType":"uint256","name":"stage","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAddress","type":"uint256"}],"name":"setMaxOGMintAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAddress","type":"uint256"}],"name":"setMaxPublicMintAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxReservedSupply","type":"uint256"}],"name":"setMaxReservedSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAddress","type":"uint256"}],"name":"setMaxWLMintAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"stage","type":"uint256"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"},{"internalType":"uint256","name":"traitType","type":"uint256"}],"name":"setTraitMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ogMintUnixTimestamp","type":"uint256"}],"name":"setogMintUnixTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_publicMintUnixTimestamp","type":"uint256"}],"name":"setpublicMintUnixTimestamp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wlMintUnixTimestamp","type":"uint256"}],"name":"setwlMintUnixTimestamp","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":[],"name":"tokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenSymbol","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trait1MetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trait2MetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wlCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wlMintUnixTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600a81526020017f416e75626973204e465400000000000000000000000000000000000000000000815250600a908051906020019062000051929190620004ca565b506040518060400160405280600981526020017f414e554249534e46540000000000000000000000000000000000000000000000815250600b90805190602001906200009f929190620004ca565b5061115c600c55610378600d556003600e556003600f5560036010556000601560006101000a81548160ff0219169083151502179055506001601560016101000a81548160ff0219169083151502179055506001601560026101000a81548160ff021916908315150217905550604051806020016040528060008152506016908051906020019062000133929190620004ca565b506040518060400160405280600581526020017f2e6a736f6e0000000000000000000000000000000000000000000000000000008152506017908051906020019062000181929190620004ca565b506040518060200160405280600081525060189080519060200190620001a9929190620004ca565b5060405180606001604052806036815260200162005abd6036913960199080519060200190620001db929190620004ca565b5060405180606001604052806036815260200162005af360369139601a90805190602001906200020d929190620004ca565b5063638caee8601b5563638cb5f0601c5563638cd210601d5566354a6ba7a18000601e55663ff2e795f50000601f55665543df729c00006020553480156200025457600080fd5b50600a80546200026490620005a9565b80601f01602080910402602001604051908101604052809291908181526020018280546200029290620005a9565b8015620002e35780601f10620002b757610100808354040283529160200191620002e3565b820191906000526020600020905b815481529060010190602001808311620002c557829003601f168201915b5050505050600b8054620002f790620005a9565b80601f01602080910402602001604051908101604052809291908181526020018280546200032590620005a9565b8015620003765780601f106200034a5761010080835404028352916020019162000376565b820191906000526020600020905b8154815290600101906020018083116200035857829003601f168201915b5050505050816002908051906020019062000393929190620004ca565b508060039080519060200190620003ac929190620004ca565b50620003bd620003f360201b60201c565b6000819055505050620003e5620003d9620003fc60201b60201c565b6200040460201b60201c565b6001600981905550620005df565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004d890620005a9565b90600052602060002090601f016020900481019282620004fc576000855562000548565b82601f106200051757805160ff191683800117855562000548565b8280016001018555821562000548579182015b82811115620005475782518255916020019190600101906200052a565b5b5090506200055791906200055b565b5090565b5b80821115620005765760008160009055506001016200055c565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620005c257607f821691505b60208210811415620005d957620005d86200057a565b5b50919050565b6154ce80620005ef6000396000f3fe6080604052600436106103d95760003560e01c80636caede3d116101fd578063a99ce12b11610118578063d6b5e5af116100ab578063e646c7d11161007a578063e646c7d114610e91578063e6d37b8814610eba578063e985e9c514610ed6578063f150a04914610f13578063f2fde38b14610f3e576103d9565b8063d6b5e5af14610dd5578063d70a28d114610e00578063db65830f14610e2b578063e0a8085314610e68576103d9565b8063c1fad42c116100e7578063c1fad42c14610d05578063c23dc68f14610d30578063c87b56dd14610d6d578063d5abeb0114610daa576103d9565b8063a99ce12b14610c5d578063b767a09814610c88578063b88d4fde14610cb1578063b9479a5614610cda576103d9565b80638462151c1161019057806395d89b411161015f57806395d89b4114610ba157806399a2557a14610bcc578063a22cb46514610c09578063a45ba8e714610c32576103d9565b80638462151c14610ae55780638693da2014610b225780638da5cb5b14610b4d57806392ea451814610b78576103d9565b80637696e088116101cc5780637696e08814610a3f5780637b61c32014610a685780637c382d0b14610a935780637ec4a65914610abc576103d9565b80636caede3d1461099557806370a08231146109c0578063715018a6146109fd57806375620aa814610a14576103d9565b806342842e0e116102f85780635bbb21771161028b5780636352211e1161025a5780636352211e146108b0578063670da514146108ed57806369aff65f146109165780636a6a1c9c146109415780636c02a9311461096a576103d9565b80635bbb2177146107f25780635c29ac191461082f5780635c975abb1461085a57806362b99ad414610885576103d9565b806351830227116102c7578063518302271461074857806354c06aee146107735780635503a0e81461079e5780635a75ece1146107c9576103d9565b806342842e0e146106a05780634d464d4c146106c95780634fc75c4e146106f45780634fdd43cb1461071f576103d9565b806316c38b3c116103705780632991b6881161033f5780632991b6881461060c5780632d458f33146106355780632e39c0c5146106605780633ccfd60b14610689576103d9565b806316c38b3c1461056657806318160ddd1461058f57806323b872dd146105ba578063271b2fcc146105e3576103d9565b8063095ea7b3116103ac578063095ea7b3146104ac5780630a302530146104d55780631237e5e81461050057806316ba10e01461053d576103d9565b806301cbeca1146103de57806301ffc9a71461040757806306fdde0314610444578063081812fc1461046f575b600080fd5b3480156103ea57600080fd5b5061040560048036038101906104009190613e62565b610f67565b005b34801561041357600080fd5b5061042e60048036038101906104299190613f16565b610fba565b60405161043b9190613f5e565b60405180910390f35b34801561045057600080fd5b5061045961104c565b6040516104669190614001565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190614023565b6110de565b6040516104a39190614091565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce91906140d8565b61115a565b005b3480156104e157600080fd5b506104ea61129b565b6040516104f79190614131565b60405180910390f35b34801561050c57600080fd5b506105276004803603810190610522919061414c565b6112a1565b6040516105349190613f5e565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190614179565b6112c1565b005b34801561057257600080fd5b5061058d600480360381019061058891906141ee565b6112e3565b005b34801561059b57600080fd5b506105a4611308565b6040516105b1919061422a565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190614245565b61131f565b005b3480156105ef57600080fd5b5061060a60048036038101906106059190614023565b611644565b005b34801561061857600080fd5b50610633600480360381019061062e9190614298565b611677565b005b34801561064157600080fd5b5061064a6117b8565b604051610657919061422a565b60405180910390f35b34801561066c57600080fd5b5061068760048036038101906106829190614023565b6117be565b005b34801561069557600080fd5b5061069e6117d0565b005b3480156106ac57600080fd5b506106c760048036038101906106c29190614245565b6118ae565b005b3480156106d557600080fd5b506106de6118ce565b6040516106eb919061422a565b60405180910390f35b34801561070057600080fd5b506107096118d4565b604051610716919061422a565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190614179565b6118da565b005b34801561075457600080fd5b5061075d6118fc565b60405161076a9190613f5e565b60405180910390f35b34801561077f57600080fd5b5061078861190f565b6040516107959190614131565b60405180910390f35b3480156107aa57600080fd5b506107b3611915565b6040516107c09190614001565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190614023565b6119a3565b005b3480156107fe57600080fd5b50610819600480360381019061081491906143b3565b6119b5565b604051610826919061455f565b60405180910390f35b34801561083b57600080fd5b50610844611a76565b6040516108519190614001565b60405180910390f35b34801561086657600080fd5b5061086f611b04565b60405161087c9190613f5e565b60405180910390f35b34801561089157600080fd5b5061089a611b17565b6040516108a79190614001565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d29190614023565b611ba5565b6040516108e49190614091565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190614023565b611bb7565b005b34801561092257600080fd5b5061092b611bc9565b604051610938919061422a565b60405180910390f35b34801561094d57600080fd5b5061096860048036038101906109639190614023565b611bcf565b005b34801561097657600080fd5b5061097f611be1565b60405161098c9190614001565b60405180910390f35b3480156109a157600080fd5b506109aa611c6f565b6040516109b79190613f5e565b60405180910390f35b3480156109cc57600080fd5b506109e760048036038101906109e2919061414c565b611c82565b6040516109f4919061422a565b60405180910390f35b348015610a0957600080fd5b50610a12611d3b565b005b348015610a2057600080fd5b50610a29611d4f565b604051610a36919061422a565b60405180910390f35b348015610a4b57600080fd5b50610a666004803603810190610a619190614581565b611d55565b005b348015610a7457600080fd5b50610a7d611d94565b604051610a8a9190614001565b60405180910390f35b348015610a9f57600080fd5b50610aba6004803603810190610ab591906145ed565b611e22565b005b348015610ac857600080fd5b50610ae36004803603810190610ade9190614179565b611e55565b005b348015610af157600080fd5b50610b0c6004803603810190610b07919061414c565b611e77565b604051610b1991906146eb565b60405180910390f35b348015610b2e57600080fd5b50610b37611fc1565b604051610b44919061422a565b60405180910390f35b348015610b5957600080fd5b50610b62611fc7565b604051610b6f9190614091565b60405180910390f35b348015610b8457600080fd5b50610b9f6004803603810190610b9a9190614023565b611ff1565b005b348015610bad57600080fd5b50610bb6612003565b604051610bc39190614001565b60405180910390f35b348015610bd857600080fd5b50610bf36004803603810190610bee919061470d565b612095565b604051610c0091906146eb565b60405180910390f35b348015610c1557600080fd5b50610c306004803603810190610c2b9190614760565b6122a9565b005b348015610c3e57600080fd5b50610c47612421565b604051610c549190614001565b60405180910390f35b348015610c6957600080fd5b50610c726124af565b604051610c7f919061422a565b60405180910390f35b348015610c9457600080fd5b50610caf6004803603810190610caa91906141ee565b6124b5565b005b348015610cbd57600080fd5b50610cd86004803603810190610cd39190614841565b6124da565b005b348015610ce657600080fd5b50610cef61254d565b604051610cfc9190614001565b60405180910390f35b348015610d1157600080fd5b50610d1a6125db565b604051610d27919061422a565b60405180910390f35b348015610d3c57600080fd5b50610d576004803603810190610d529190614023565b6125e1565b604051610d649190614919565b60405180910390f35b348015610d7957600080fd5b50610d946004803603810190610d8f9190614023565b61264b565b604051610da19190614001565b60405180910390f35b348015610db657600080fd5b50610dbf6128f8565b604051610dcc919061422a565b60405180910390f35b348015610de157600080fd5b50610dea6128fe565b604051610df7919061422a565b60405180910390f35b348015610e0c57600080fd5b50610e15612904565b604051610e22919061422a565b60405180910390f35b348015610e3757600080fd5b50610e526004803603810190610e4d9190614023565b61290a565b604051610e5f919061422a565b60405180910390f35b348015610e7457600080fd5b50610e8f6004803603810190610e8a91906141ee565b612922565b005b348015610e9d57600080fd5b50610eb86004803603810190610eb39190614023565b612947565b005b610ed46004803603810190610ecf919061498f565b612959565b005b348015610ee257600080fd5b50610efd6004803603810190610ef89190614a03565b612f31565b604051610f0a9190613f5e565b60405180910390f35b348015610f1f57600080fd5b50610f28612fc5565b604051610f35919061422a565b60405180910390f35b348015610f4a57600080fd5b50610f656004803603810190610f60919061414c565b613008565b005b610f6f61308c565b6001811415610f94578160199080519060200190610f8e929190613be0565b50610fb6565b6002811415610fb55781601a9080519060200190610fb3929190613be0565b505b5b5050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061101557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806110455750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461105b90614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461108790614a72565b80156110d45780601f106110a9576101008083540402835291602001916110d4565b820191906000526020600020905b8154815290600101906020018083116110b757829003601f168201915b5050505050905090565b60006110e98261310a565b61111f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061116582611ba5565b90508073ffffffffffffffffffffffffffffffffffffffff16611186613169565b73ffffffffffffffffffffffffffffffffffffffff16146111e9576111b2816111ad613169565b612f31565b6111e8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60115481565b60136020528060005260406000206000915054906101000a900460ff1681565b6112c961308c565b80601790805190602001906112df929190613be0565b5050565b6112eb61308c565b80601560006101000a81548160ff02191690831515021790555050565b6000611312613171565b6001546000540303905090565b600061132a8261317a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611391576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061139d84613248565b915091506113b381876113ae613169565b61326a565b6113ff576113c8866113c3613169565b612f31565b6113fe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611466576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147386868660016132ae565b801561147e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061154c856115288888876132b4565b7c0200000000000000000000000000000000000000000000000000000000176132dc565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156115d45760006001850190506000600460008381526020019081526020016000205414156115d25760005481146115d1578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461163c8686866001613307565b505050505050565b61164c61308c565b611654611308565b600c546116619190614ad3565b81111561166d57600080fd5b80600d8190555050565b61167f61308c565b600c548361168b611308565b6116959190614b07565b11156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614ba9565b60405180910390fd5b600181141561174657600060016116eb611308565b6116f59190614b07565b905060016014600083815260200190815260200160002081905550600160146000600187856117249190614b07565b61172e9190614ad3565b815260200190815260200160002081905550506117a9565b60006001611752611308565b61175c9190614b07565b9050600260146000838152602001908152602001600020819055506002601460006001878561178b9190614b07565b6117959190614ad3565b815260200190815260200160002081905550505b6117b3828461330d565b505050565b601d5481565b6117c661308c565b80600e8190555050565b6117d861308c565b6002600954141561181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590614c15565b60405180910390fd5b60026009819055506000611830611fc7565b73ffffffffffffffffffffffffffffffffffffffff164760405161185390614c66565b60006040518083038185875af1925050503d8060008114611890576040519150601f19603f3d011682016040523d82523d6000602084013e611895565b606091505b50509050806118a357600080fd5b506001600981905550565b6118c9838383604051806020016040528060008152506124da565b505050565b600e5481565b60105481565b6118e261308c565b80601890805190602001906118f8929190613be0565b5050565b601560029054906101000a900460ff1681565b60125481565b6017805461192290614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461194e90614a72565b801561199b5780601f106119705761010080835404028352916020019161199b565b820191906000526020600020905b81548152906001019060200180831161197e57829003601f168201915b505050505081565b6119ab61308c565b80600f8190555050565b606060008251905060008167ffffffffffffffff8111156119d9576119d8613d01565b5b604051908082528060200260200182016040528015611a1257816020015b6119ff613c66565b8152602001906001900390816119f75790505b50905060005b828114611a6b57611a42858281518110611a3557611a34614c7b565b5b60200260200101516125e1565b828281518110611a5557611a54614c7b565b5b6020026020010181905250806001019050611a18565b508092505050919050565b601a8054611a8390614a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaf90614a72565b8015611afc5780601f10611ad157610100808354040283529160200191611afc565b820191906000526020600020905b815481529060010190602001808311611adf57829003601f168201915b505050505081565b601560009054906101000a900460ff1681565b60168054611b2490614a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5090614a72565b8015611b9d5780601f10611b7257610100808354040283529160200191611b9d565b820191906000526020600020905b815481529060010190602001808311611b8057829003601f168201915b505050505081565b6000611bb08261317a565b9050919050565b611bbf61308c565b80601b8190555050565b601e5481565b611bd761308c565b80601c8190555050565b600a8054611bee90614a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1a90614a72565b8015611c675780601f10611c3c57610100808354040283529160200191611c67565b820191906000526020600020905b815481529060010190602001808311611c4a57829003601f168201915b505050505081565b601560019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cea576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d4361308c565b611d4d600061332b565b565b601b5481565b611d5d61308c565b6001811415611d725781601e81905550611d90565b6002811415611d875781601f81905550611d8f565b816020819055505b5b5050565b600b8054611da190614a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611dcd90614a72565b8015611e1a5780601f10611def57610100808354040283529160200191611e1a565b820191906000526020600020905b815481529060010190602001808311611dfd57829003601f168201915b505050505081565b611e2a61308c565b6001811415611e3f5781601181905550611e51565b6002811415611e5057816012819055505b5b5050565b611e5d61308c565b8060169080519060200190611e73929190613be0565b5050565b60606000806000611e8785611c82565b905060008167ffffffffffffffff811115611ea557611ea4613d01565b5b604051908082528060200260200182016040528015611ed35781602001602082028036833780820191505090505b509050611ede613c66565b6000611ee8613171565b90505b838614611fb357611efb816133f1565b9150816040015115611f0c57611fa8565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f4c57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611fa75780838780600101985081518110611f9a57611f99614c7b565b5b6020026020010181815250505b5b806001019050611eeb565b508195505050505050919050565b60205481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ff961308c565b80601d8190555050565b60606003805461201290614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461203e90614a72565b801561208b5780601f106120605761010080835404028352916020019161208b565b820191906000526020600020905b81548152906001019060200180831161206e57829003601f168201915b5050505050905090565b60608183106120d0576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806120db61341c565b90506120e5613171565b8510156120f7576120f4613171565b94505b80841115612103578093505b600061210e87611c82565b90508486101561213157600086860390508181101561212b578091505b50612136565b600090505b60008167ffffffffffffffff81111561215257612151613d01565b5b6040519080825280602002602001820160405280156121805781602001602082028036833780820191505090505b509050600082141561219857809450505050506122a2565b60006121a3886125e1565b9050600081604001516121b857816000015190505b60008990505b8881141580156121ce5750848714155b15612294576121dc816133f1565b92508260400151156121ed57612289565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461222d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612288578084888060010199508151811061227b5761227a614c7b565b5b6020026020010181815250505b5b8060010190506121be565b508583528296505050505050505b9392505050565b6122b1613169565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612316576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612323613169565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123d0613169565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124159190613f5e565b60405180910390a35050565b6018805461242e90614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461245a90614a72565b80156124a75780601f1061247c576101008083540402835291602001916124a7565b820191906000526020600020905b81548152906001019060200180831161248a57829003601f168201915b505050505081565b601c5481565b6124bd61308c565b80601560016101000a81548160ff02191690831515021790555050565b6124e584848461131f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125475761251084848484613425565b612546576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6019805461255a90614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461258690614a72565b80156125d35780601f106125a8576101008083540402835291602001916125d3565b820191906000526020600020905b8154815290600101906020018083116125b657829003601f168201915b505050505081565b600d5481565b6125e9613c66565b6125f1613c66565b6125f9613171565b83108061260d575061260961341c565b8310155b1561261b5780915050612646565b612624836133f1565b90508060400151156126395780915050612646565b61264283613585565b9150505b919050565b60606126568261310a565b612695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268c90614d1c565b60405180910390fd5b60001515601560029054906101000a900460ff161515141561274357601880546126be90614a72565b80601f01602080910402602001604051908101604052809291908181526020018280546126ea90614a72565b80156127375780601f1061270c57610100808354040283529160200191612737565b820191906000526020600020905b81548152906001019060200180831161271a57829003601f168201915b505050505090506128f3565b600061274d6135a5565b905060006014600085815260200190815260200160002054905060008114156127ca5760008490505b60008111156127c85760006014600083815260200190815260200160002054146127b557601460008281526020019081526020016000205491506127c8565b80806127c090614d3c565b915050612776565b505b6001811415612836576000601980546127e290614a72565b9050116127fe576040518060200160405280600081525061282d565b601961280985613637565b601760405160200161281d93929190614e36565b6040516020818303038152906040525b925050506128f3565b60028114156128a2576000601a805461284e90614a72565b90501161286a5760405180602001604052806000815250612899565b601a61287585613637565b601760405160200161288993929190614e36565b6040516020818303038152906040525b925050506128f3565b60008251116128c057604051806020016040528060008152506128ee565b816128ca85613637565b60176040516020016128de93929190614e67565b6040516020818303038152906040525b925050505b919050565b600c5481565b600f5481565b601f5481565b60146020528060005260406000206000915090505481565b61292a61308c565b80601560026101000a81548160ff02191690831515021790555050565b61294f61308c565b8060108190555050565b8361296381613798565b3410156129a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299c90614ee4565b60405180910390fd5b60006129af612fc5565b9050600081116129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129eb90614f50565b60405180910390fd5b6001811415612ac2576000612a076137e9565b604051602001612a179190614fb8565b604051602081830303815290604052805190602001209050612a7d858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601154836137f1565b612abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab39061501f565b60405180910390fd5b50612b8d565b6002811415612b8c576000612ad56137e9565b604051602001612ae59190614fb8565b604051602081830303815290604052805190602001209050612b4b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601254836137f1565b612b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b819061501f565b60405180910390fd5b505b5b601560009054906101000a900460ff1615612bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd49061508b565b60405180910390fd5b6001811415612c3c57600086118015612bf85750600e548611155b612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e906150f7565b60405180910390fd5b612cee565b6002811415612c9b57600086118015612c575750600f548611155b612c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8d906150f7565b60405180910390fd5b612ced565b600086118015612cad57506010548611155b612cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce3906150f7565b60405180910390fd5b5b5b600d54600c54612cfe9190614ad3565b86612d07611308565b612d119190614b07565b1115612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4990614ba9565b60405180910390fd5b60136000612d5e6137e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd90615163565b60405180910390fd5b6001851415612e565760006001612dfb611308565b612e059190614b07565b90506001601460008381526020019081526020016000208190555060016014600060018a85612e349190614b07565b612e3e9190614ad3565b81526020019081526020016000208190555050612eb9565b60006001612e62611308565b612e6c9190614b07565b90506002601460008381526020019081526020016000208190555060026014600060018a85612e9b9190614b07565b612ea59190614ad3565b815260200190815260200160002081905550505b600160136000612ec76137e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612f29612f236137e9565b8761330d565b505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601d54421115612fda5760039050613005565b601c54421115612fed5760029050613005565b601b544211156130005760019050613005565b600090505b90565b61301061308c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613077906151f5565b60405180910390fd5b6130898161332b565b50565b6130946137e9565b73ffffffffffffffffffffffffffffffffffffffff166130b2611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614613108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff90615261565b60405180910390fd5b565b600081613115613171565b11158015613124575060005482105b8015613162575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080613189613171565b11613211576000548110156132105760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561320e575b60008114156132045760046000836001900393508381526020019081526020016000205490506131d9565b8092505050613243565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86132cb868684613808565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b613327828260405180602001604052806000815250613811565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6133f9613c66565b61341560046000848152602001908152602001600020546138ae565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261344b613169565b8786866040518563ffffffff1660e01b815260040161346d94939291906152d6565b602060405180830381600087803b15801561348757600080fd5b505af19250505080156134b857506040513d601f19601f820116820180604052508101906134b59190615337565b60015b613532573d80600081146134e8576040519150601f19603f3d011682016040523d82523d6000602084013e6134ed565b606091505b5060008151141561352a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61358d613c66565b61359e6135998361317a565b6138ae565b9050919050565b6060601680546135b490614a72565b80601f01602080910402602001604051908101604052809291908181526020018280546135e090614a72565b801561362d5780601f106136025761010080835404028352916020019161362d565b820191906000526020600020905b81548152906001019060200180831161361057829003601f168201915b5050505050905090565b6060600082141561367f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613793565b600082905060005b600082146136b157808061369a90615364565b915050600a826136aa91906153dc565b9150613687565b60008167ffffffffffffffff8111156136cd576136cc613d01565b5b6040519080825280601f01601f1916602001820160405280156136ff5781602001600182028036833780820191505090505b5090505b6000851461378c576001826137189190614ad3565b9150600a85613727919061540d565b60306137339190614b07565b60f81b81838151811061374957613748614c7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561378591906153dc565b9450613703565b8093505050505b919050565b60008060006137a5612fc5565b905060018114156137ba57601e5491506137d4565b60028114156137cd57601f5491506137d3565b60205491505b5b83826137e0919061543e565b92505050919050565b600033905090565b6000826137fe8584613964565b1490509392505050565b60009392505050565b61381b83836139ba565b60008373ffffffffffffffffffffffffffffffffffffffff163b146138a957600080549050600083820390505b61385b6000868380600101945086613425565b613891576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138485781600054146138a657600080fd5b50505b505050565b6138b6613c66565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b84518110156139af5761399a8286838151811061398d5761398c614c7b565b5b6020026020010151613b8e565b915080806139a790615364565b91505061396d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613a27576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415613a62576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a6f60008483856132ae565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613ae683613ad760008660006132b4565b613ae085613bb9565b176132dc565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613b0a57806000819055505050613b896000848385613307565b505050565b6000818310613ba657613ba18284613bc9565b613bb1565b613bb08383613bc9565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054613bec90614a72565b90600052602060002090601f016020900481019282613c0e5760008555613c55565b82601f10613c2757805160ff1916838001178555613c55565b82800160010185558215613c55579182015b82811115613c54578251825591602001919060010190613c39565b5b509050613c629190613cb5565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115613cce576000816000905550600101613cb6565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d3982613cf0565b810181811067ffffffffffffffff82111715613d5857613d57613d01565b5b80604052505050565b6000613d6b613cd2565b9050613d778282613d30565b919050565b600067ffffffffffffffff821115613d9757613d96613d01565b5b613da082613cf0565b9050602081019050919050565b82818337600083830152505050565b6000613dcf613dca84613d7c565b613d61565b905082815260208101848484011115613deb57613dea613ceb565b5b613df6848285613dad565b509392505050565b600082601f830112613e1357613e12613ce6565b5b8135613e23848260208601613dbc565b91505092915050565b6000819050919050565b613e3f81613e2c565b8114613e4a57600080fd5b50565b600081359050613e5c81613e36565b92915050565b60008060408385031215613e7957613e78613cdc565b5b600083013567ffffffffffffffff811115613e9757613e96613ce1565b5b613ea385828601613dfe565b9250506020613eb485828601613e4d565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ef381613ebe565b8114613efe57600080fd5b50565b600081359050613f1081613eea565b92915050565b600060208284031215613f2c57613f2b613cdc565b5b6000613f3a84828501613f01565b91505092915050565b60008115159050919050565b613f5881613f43565b82525050565b6000602082019050613f736000830184613f4f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613fb3578082015181840152602081019050613f98565b83811115613fc2576000848401525b50505050565b6000613fd382613f79565b613fdd8185613f84565b9350613fed818560208601613f95565b613ff681613cf0565b840191505092915050565b6000602082019050818103600083015261401b8184613fc8565b905092915050565b60006020828403121561403957614038613cdc565b5b600061404784828501613e4d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061407b82614050565b9050919050565b61408b81614070565b82525050565b60006020820190506140a66000830184614082565b92915050565b6140b581614070565b81146140c057600080fd5b50565b6000813590506140d2816140ac565b92915050565b600080604083850312156140ef576140ee613cdc565b5b60006140fd858286016140c3565b925050602061410e85828601613e4d565b9150509250929050565b6000819050919050565b61412b81614118565b82525050565b60006020820190506141466000830184614122565b92915050565b60006020828403121561416257614161613cdc565b5b6000614170848285016140c3565b91505092915050565b60006020828403121561418f5761418e613cdc565b5b600082013567ffffffffffffffff8111156141ad576141ac613ce1565b5b6141b984828501613dfe565b91505092915050565b6141cb81613f43565b81146141d657600080fd5b50565b6000813590506141e8816141c2565b92915050565b60006020828403121561420457614203613cdc565b5b6000614212848285016141d9565b91505092915050565b61422481613e2c565b82525050565b600060208201905061423f600083018461421b565b92915050565b60008060006060848603121561425e5761425d613cdc565b5b600061426c868287016140c3565b935050602061427d868287016140c3565b925050604061428e86828701613e4d565b9150509250925092565b6000806000606084860312156142b1576142b0613cdc565b5b60006142bf86828701613e4d565b93505060206142d0868287016140c3565b92505060406142e186828701613e4d565b9150509250925092565b600067ffffffffffffffff82111561430657614305613d01565b5b602082029050602081019050919050565b600080fd5b600061432f61432a846142eb565b613d61565b9050808382526020820190506020840283018581111561435257614351614317565b5b835b8181101561437b57806143678882613e4d565b845260208401935050602081019050614354565b5050509392505050565b600082601f83011261439a57614399613ce6565b5b81356143aa84826020860161431c565b91505092915050565b6000602082840312156143c9576143c8613cdc565b5b600082013567ffffffffffffffff8111156143e7576143e6613ce1565b5b6143f384828501614385565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61443181614070565b82525050565b600067ffffffffffffffff82169050919050565b61445481614437565b82525050565b61446381613f43565b82525050565b600062ffffff82169050919050565b61448181614469565b82525050565b60808201600082015161449d6000850182614428565b5060208201516144b0602085018261444b565b5060408201516144c3604085018261445a565b5060608201516144d66060850182614478565b50505050565b60006144e88383614487565b60808301905092915050565b6000602082019050919050565b600061450c826143fc565b6145168185614407565b935061452183614418565b8060005b8381101561455257815161453988826144dc565b9750614544836144f4565b925050600181019050614525565b5085935050505092915050565b600060208201905081810360008301526145798184614501565b905092915050565b6000806040838503121561459857614597613cdc565b5b60006145a685828601613e4d565b92505060206145b785828601613e4d565b9150509250929050565b6145ca81614118565b81146145d557600080fd5b50565b6000813590506145e7816145c1565b92915050565b6000806040838503121561460457614603613cdc565b5b6000614612858286016145d8565b925050602061462385828601613e4d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61466281613e2c565b82525050565b60006146748383614659565b60208301905092915050565b6000602082019050919050565b60006146988261462d565b6146a28185614638565b93506146ad83614649565b8060005b838110156146de5781516146c58882614668565b97506146d083614680565b9250506001810190506146b1565b5085935050505092915050565b60006020820190508181036000830152614705818461468d565b905092915050565b60008060006060848603121561472657614725613cdc565b5b6000614734868287016140c3565b935050602061474586828701613e4d565b925050604061475686828701613e4d565b9150509250925092565b6000806040838503121561477757614776613cdc565b5b6000614785858286016140c3565b9250506020614796858286016141d9565b9150509250929050565b600067ffffffffffffffff8211156147bb576147ba613d01565b5b6147c482613cf0565b9050602081019050919050565b60006147e46147df846147a0565b613d61565b905082815260208101848484011115614800576147ff613ceb565b5b61480b848285613dad565b509392505050565b600082601f83011261482857614827613ce6565b5b81356148388482602086016147d1565b91505092915050565b6000806000806080858703121561485b5761485a613cdc565b5b6000614869878288016140c3565b945050602061487a878288016140c3565b935050604061488b87828801613e4d565b925050606085013567ffffffffffffffff8111156148ac576148ab613ce1565b5b6148b887828801614813565b91505092959194509250565b6080820160008201516148da6000850182614428565b5060208201516148ed602085018261444b565b506040820151614900604085018261445a565b5060608201516149136060850182614478565b50505050565b600060808201905061492e60008301846148c4565b92915050565b600080fd5b60008083601f84011261494f5761494e613ce6565b5b8235905067ffffffffffffffff81111561496c5761496b614934565b5b60208301915083602082028301111561498857614987614317565b5b9250929050565b600080600080606085870312156149a9576149a8613cdc565b5b60006149b787828801613e4d565b94505060206149c887828801613e4d565b935050604085013567ffffffffffffffff8111156149e9576149e8613ce1565b5b6149f587828801614939565b925092505092959194509250565b60008060408385031215614a1a57614a19613cdc565b5b6000614a28858286016140c3565b9250506020614a39858286016140c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a8a57607f821691505b60208210811415614a9e57614a9d614a43565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ade82613e2c565b9150614ae983613e2c565b925082821015614afc57614afb614aa4565b5b828203905092915050565b6000614b1282613e2c565b9150614b1d83613e2c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b5257614b51614aa4565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614b93601483613f84565b9150614b9e82614b5d565b602082019050919050565b60006020820190508181036000830152614bc281614b86565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614bff601f83613f84565b9150614c0a82614bc9565b602082019050919050565b60006020820190508181036000830152614c2e81614bf2565b9050919050565b600081905092915050565b50565b6000614c50600083614c35565b9150614c5b82614c40565b600082019050919050565b6000614c7182614c43565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d06602f83613f84565b9150614d1182614caa565b604082019050919050565b60006020820190508181036000830152614d3581614cf9565b9050919050565b6000614d4782613e2c565b91506000821415614d5b57614d5a614aa4565b5b600182039050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614d9381614a72565b614d9d8186614d66565b94506001821660008114614db85760018114614dc957614dfc565b60ff19831686528186019350614dfc565b614dd285614d71565b60005b83811015614df457815481890152600182019150602081019050614dd5565b838801955050505b50505092915050565b6000614e1082613f79565b614e1a8185614d66565b9350614e2a818560208601613f95565b80840191505092915050565b6000614e428286614d86565b9150614e4e8285614e05565b9150614e5a8284614d86565b9150819050949350505050565b6000614e738286614e05565b9150614e7f8285614e05565b9150614e8b8284614d86565b9150819050949350505050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614ece601383613f84565b9150614ed982614e98565b602082019050919050565b60006020820190508181036000830152614efd81614ec1565b9050919050565b7f4d696e74206e6f74207374617274000000000000000000000000000000000000600082015250565b6000614f3a600e83613f84565b9150614f4582614f04565b602082019050919050565b60006020820190508181036000830152614f6981614f2d565b9050919050565b60008160601b9050919050565b6000614f8882614f70565b9050919050565b6000614f9a82614f7d565b9050919050565b614fb2614fad82614070565b614f8f565b82525050565b6000614fc48284614fa1565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000615009600e83613f84565b915061501482614fd3565b602082019050919050565b6000602082019050818103600083015261503881614ffc565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000615075601783613f84565b91506150808261503f565b602082019050919050565b600060208201905081810360008301526150a481615068565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006150e1601483613f84565b91506150ec826150ab565b602082019050919050565b60006020820190508181036000830152615110816150d4565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b600061514d601883613f84565b915061515882615117565b602082019050919050565b6000602082019050818103600083015261517c81615140565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151df602683613f84565b91506151ea82615183565b604082019050919050565b6000602082019050818103600083015261520e816151d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061524b602083613f84565b915061525682615215565b602082019050919050565b6000602082019050818103600083015261527a8161523e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152a882615281565b6152b2818561528c565b93506152c2818560208601613f95565b6152cb81613cf0565b840191505092915050565b60006080820190506152eb6000830187614082565b6152f86020830186614082565b615305604083018561421b565b8181036060830152615317818461529d565b905095945050505050565b60008151905061533181613eea565b92915050565b60006020828403121561534d5761534c613cdc565b5b600061535b84828501615322565b91505092915050565b600061536f82613e2c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153a2576153a1614aa4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153e782613e2c565b91506153f283613e2c565b925082615402576154016153ad565b5b828204905092915050565b600061541882613e2c565b915061542383613e2c565b925082615433576154326153ad565b5b828206905092915050565b600061544982613e2c565b915061545483613e2c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561548d5761548c614aa4565b5b82820290509291505056fea2646970667358221220c1362509d6dab414519033cba81785847e0abd81c3cd302cd2b4ad9b083fa48764736f6c63430008090033697066733a2f2f516d63705546446a39786472435a4d69544777345335656b334736446869433741374b6a5a63666a596772435a652f697066733a2f2f516d646d70444b3279373950387a63456747715570336d384e536648785a41705a58707869557a6f3471576536372f
Deployed Bytecode
0x6080604052600436106103d95760003560e01c80636caede3d116101fd578063a99ce12b11610118578063d6b5e5af116100ab578063e646c7d11161007a578063e646c7d114610e91578063e6d37b8814610eba578063e985e9c514610ed6578063f150a04914610f13578063f2fde38b14610f3e576103d9565b8063d6b5e5af14610dd5578063d70a28d114610e00578063db65830f14610e2b578063e0a8085314610e68576103d9565b8063c1fad42c116100e7578063c1fad42c14610d05578063c23dc68f14610d30578063c87b56dd14610d6d578063d5abeb0114610daa576103d9565b8063a99ce12b14610c5d578063b767a09814610c88578063b88d4fde14610cb1578063b9479a5614610cda576103d9565b80638462151c1161019057806395d89b411161015f57806395d89b4114610ba157806399a2557a14610bcc578063a22cb46514610c09578063a45ba8e714610c32576103d9565b80638462151c14610ae55780638693da2014610b225780638da5cb5b14610b4d57806392ea451814610b78576103d9565b80637696e088116101cc5780637696e08814610a3f5780637b61c32014610a685780637c382d0b14610a935780637ec4a65914610abc576103d9565b80636caede3d1461099557806370a08231146109c0578063715018a6146109fd57806375620aa814610a14576103d9565b806342842e0e116102f85780635bbb21771161028b5780636352211e1161025a5780636352211e146108b0578063670da514146108ed57806369aff65f146109165780636a6a1c9c146109415780636c02a9311461096a576103d9565b80635bbb2177146107f25780635c29ac191461082f5780635c975abb1461085a57806362b99ad414610885576103d9565b806351830227116102c7578063518302271461074857806354c06aee146107735780635503a0e81461079e5780635a75ece1146107c9576103d9565b806342842e0e146106a05780634d464d4c146106c95780634fc75c4e146106f45780634fdd43cb1461071f576103d9565b806316c38b3c116103705780632991b6881161033f5780632991b6881461060c5780632d458f33146106355780632e39c0c5146106605780633ccfd60b14610689576103d9565b806316c38b3c1461056657806318160ddd1461058f57806323b872dd146105ba578063271b2fcc146105e3576103d9565b8063095ea7b3116103ac578063095ea7b3146104ac5780630a302530146104d55780631237e5e81461050057806316ba10e01461053d576103d9565b806301cbeca1146103de57806301ffc9a71461040757806306fdde0314610444578063081812fc1461046f575b600080fd5b3480156103ea57600080fd5b5061040560048036038101906104009190613e62565b610f67565b005b34801561041357600080fd5b5061042e60048036038101906104299190613f16565b610fba565b60405161043b9190613f5e565b60405180910390f35b34801561045057600080fd5b5061045961104c565b6040516104669190614001565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190614023565b6110de565b6040516104a39190614091565b60405180910390f35b3480156104b857600080fd5b506104d360048036038101906104ce91906140d8565b61115a565b005b3480156104e157600080fd5b506104ea61129b565b6040516104f79190614131565b60405180910390f35b34801561050c57600080fd5b506105276004803603810190610522919061414c565b6112a1565b6040516105349190613f5e565b60405180910390f35b34801561054957600080fd5b50610564600480360381019061055f9190614179565b6112c1565b005b34801561057257600080fd5b5061058d600480360381019061058891906141ee565b6112e3565b005b34801561059b57600080fd5b506105a4611308565b6040516105b1919061422a565b60405180910390f35b3480156105c657600080fd5b506105e160048036038101906105dc9190614245565b61131f565b005b3480156105ef57600080fd5b5061060a60048036038101906106059190614023565b611644565b005b34801561061857600080fd5b50610633600480360381019061062e9190614298565b611677565b005b34801561064157600080fd5b5061064a6117b8565b604051610657919061422a565b60405180910390f35b34801561066c57600080fd5b5061068760048036038101906106829190614023565b6117be565b005b34801561069557600080fd5b5061069e6117d0565b005b3480156106ac57600080fd5b506106c760048036038101906106c29190614245565b6118ae565b005b3480156106d557600080fd5b506106de6118ce565b6040516106eb919061422a565b60405180910390f35b34801561070057600080fd5b506107096118d4565b604051610716919061422a565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190614179565b6118da565b005b34801561075457600080fd5b5061075d6118fc565b60405161076a9190613f5e565b60405180910390f35b34801561077f57600080fd5b5061078861190f565b6040516107959190614131565b60405180910390f35b3480156107aa57600080fd5b506107b3611915565b6040516107c09190614001565b60405180910390f35b3480156107d557600080fd5b506107f060048036038101906107eb9190614023565b6119a3565b005b3480156107fe57600080fd5b50610819600480360381019061081491906143b3565b6119b5565b604051610826919061455f565b60405180910390f35b34801561083b57600080fd5b50610844611a76565b6040516108519190614001565b60405180910390f35b34801561086657600080fd5b5061086f611b04565b60405161087c9190613f5e565b60405180910390f35b34801561089157600080fd5b5061089a611b17565b6040516108a79190614001565b60405180910390f35b3480156108bc57600080fd5b506108d760048036038101906108d29190614023565b611ba5565b6040516108e49190614091565b60405180910390f35b3480156108f957600080fd5b50610914600480360381019061090f9190614023565b611bb7565b005b34801561092257600080fd5b5061092b611bc9565b604051610938919061422a565b60405180910390f35b34801561094d57600080fd5b5061096860048036038101906109639190614023565b611bcf565b005b34801561097657600080fd5b5061097f611be1565b60405161098c9190614001565b60405180910390f35b3480156109a157600080fd5b506109aa611c6f565b6040516109b79190613f5e565b60405180910390f35b3480156109cc57600080fd5b506109e760048036038101906109e2919061414c565b611c82565b6040516109f4919061422a565b60405180910390f35b348015610a0957600080fd5b50610a12611d3b565b005b348015610a2057600080fd5b50610a29611d4f565b604051610a36919061422a565b60405180910390f35b348015610a4b57600080fd5b50610a666004803603810190610a619190614581565b611d55565b005b348015610a7457600080fd5b50610a7d611d94565b604051610a8a9190614001565b60405180910390f35b348015610a9f57600080fd5b50610aba6004803603810190610ab591906145ed565b611e22565b005b348015610ac857600080fd5b50610ae36004803603810190610ade9190614179565b611e55565b005b348015610af157600080fd5b50610b0c6004803603810190610b07919061414c565b611e77565b604051610b1991906146eb565b60405180910390f35b348015610b2e57600080fd5b50610b37611fc1565b604051610b44919061422a565b60405180910390f35b348015610b5957600080fd5b50610b62611fc7565b604051610b6f9190614091565b60405180910390f35b348015610b8457600080fd5b50610b9f6004803603810190610b9a9190614023565b611ff1565b005b348015610bad57600080fd5b50610bb6612003565b604051610bc39190614001565b60405180910390f35b348015610bd857600080fd5b50610bf36004803603810190610bee919061470d565b612095565b604051610c0091906146eb565b60405180910390f35b348015610c1557600080fd5b50610c306004803603810190610c2b9190614760565b6122a9565b005b348015610c3e57600080fd5b50610c47612421565b604051610c549190614001565b60405180910390f35b348015610c6957600080fd5b50610c726124af565b604051610c7f919061422a565b60405180910390f35b348015610c9457600080fd5b50610caf6004803603810190610caa91906141ee565b6124b5565b005b348015610cbd57600080fd5b50610cd86004803603810190610cd39190614841565b6124da565b005b348015610ce657600080fd5b50610cef61254d565b604051610cfc9190614001565b60405180910390f35b348015610d1157600080fd5b50610d1a6125db565b604051610d27919061422a565b60405180910390f35b348015610d3c57600080fd5b50610d576004803603810190610d529190614023565b6125e1565b604051610d649190614919565b60405180910390f35b348015610d7957600080fd5b50610d946004803603810190610d8f9190614023565b61264b565b604051610da19190614001565b60405180910390f35b348015610db657600080fd5b50610dbf6128f8565b604051610dcc919061422a565b60405180910390f35b348015610de157600080fd5b50610dea6128fe565b604051610df7919061422a565b60405180910390f35b348015610e0c57600080fd5b50610e15612904565b604051610e22919061422a565b60405180910390f35b348015610e3757600080fd5b50610e526004803603810190610e4d9190614023565b61290a565b604051610e5f919061422a565b60405180910390f35b348015610e7457600080fd5b50610e8f6004803603810190610e8a91906141ee565b612922565b005b348015610e9d57600080fd5b50610eb86004803603810190610eb39190614023565b612947565b005b610ed46004803603810190610ecf919061498f565b612959565b005b348015610ee257600080fd5b50610efd6004803603810190610ef89190614a03565b612f31565b604051610f0a9190613f5e565b60405180910390f35b348015610f1f57600080fd5b50610f28612fc5565b604051610f35919061422a565b60405180910390f35b348015610f4a57600080fd5b50610f656004803603810190610f60919061414c565b613008565b005b610f6f61308c565b6001811415610f94578160199080519060200190610f8e929190613be0565b50610fb6565b6002811415610fb55781601a9080519060200190610fb3929190613be0565b505b5b5050565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061101557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806110455750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461105b90614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461108790614a72565b80156110d45780601f106110a9576101008083540402835291602001916110d4565b820191906000526020600020905b8154815290600101906020018083116110b757829003601f168201915b5050505050905090565b60006110e98261310a565b61111f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061116582611ba5565b90508073ffffffffffffffffffffffffffffffffffffffff16611186613169565b73ffffffffffffffffffffffffffffffffffffffff16146111e9576111b2816111ad613169565b612f31565b6111e8576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60115481565b60136020528060005260406000206000915054906101000a900460ff1681565b6112c961308c565b80601790805190602001906112df929190613be0565b5050565b6112eb61308c565b80601560006101000a81548160ff02191690831515021790555050565b6000611312613171565b6001546000540303905090565b600061132a8261317a565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611391576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061139d84613248565b915091506113b381876113ae613169565b61326a565b6113ff576113c8866113c3613169565b612f31565b6113fe576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611466576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61147386868660016132ae565b801561147e57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061154c856115288888876132b4565b7c0200000000000000000000000000000000000000000000000000000000176132dc565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841614156115d45760006001850190506000600460008381526020019081526020016000205414156115d25760005481146115d1578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461163c8686866001613307565b505050505050565b61164c61308c565b611654611308565b600c546116619190614ad3565b81111561166d57600080fd5b80600d8190555050565b61167f61308c565b600c548361168b611308565b6116959190614b07565b11156116d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116cd90614ba9565b60405180910390fd5b600181141561174657600060016116eb611308565b6116f59190614b07565b905060016014600083815260200190815260200160002081905550600160146000600187856117249190614b07565b61172e9190614ad3565b815260200190815260200160002081905550506117a9565b60006001611752611308565b61175c9190614b07565b9050600260146000838152602001908152602001600020819055506002601460006001878561178b9190614b07565b6117959190614ad3565b815260200190815260200160002081905550505b6117b3828461330d565b505050565b601d5481565b6117c661308c565b80600e8190555050565b6117d861308c565b6002600954141561181e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181590614c15565b60405180910390fd5b60026009819055506000611830611fc7565b73ffffffffffffffffffffffffffffffffffffffff164760405161185390614c66565b60006040518083038185875af1925050503d8060008114611890576040519150601f19603f3d011682016040523d82523d6000602084013e611895565b606091505b50509050806118a357600080fd5b506001600981905550565b6118c9838383604051806020016040528060008152506124da565b505050565b600e5481565b60105481565b6118e261308c565b80601890805190602001906118f8929190613be0565b5050565b601560029054906101000a900460ff1681565b60125481565b6017805461192290614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461194e90614a72565b801561199b5780601f106119705761010080835404028352916020019161199b565b820191906000526020600020905b81548152906001019060200180831161197e57829003601f168201915b505050505081565b6119ab61308c565b80600f8190555050565b606060008251905060008167ffffffffffffffff8111156119d9576119d8613d01565b5b604051908082528060200260200182016040528015611a1257816020015b6119ff613c66565b8152602001906001900390816119f75790505b50905060005b828114611a6b57611a42858281518110611a3557611a34614c7b565b5b60200260200101516125e1565b828281518110611a5557611a54614c7b565b5b6020026020010181905250806001019050611a18565b508092505050919050565b601a8054611a8390614a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611aaf90614a72565b8015611afc5780601f10611ad157610100808354040283529160200191611afc565b820191906000526020600020905b815481529060010190602001808311611adf57829003601f168201915b505050505081565b601560009054906101000a900460ff1681565b60168054611b2490614a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611b5090614a72565b8015611b9d5780601f10611b7257610100808354040283529160200191611b9d565b820191906000526020600020905b815481529060010190602001808311611b8057829003601f168201915b505050505081565b6000611bb08261317a565b9050919050565b611bbf61308c565b80601b8190555050565b601e5481565b611bd761308c565b80601c8190555050565b600a8054611bee90614a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1a90614a72565b8015611c675780601f10611c3c57610100808354040283529160200191611c67565b820191906000526020600020905b815481529060010190602001808311611c4a57829003601f168201915b505050505081565b601560019054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cea576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611d4361308c565b611d4d600061332b565b565b601b5481565b611d5d61308c565b6001811415611d725781601e81905550611d90565b6002811415611d875781601f81905550611d8f565b816020819055505b5b5050565b600b8054611da190614a72565b80601f0160208091040260200160405190810160405280929190818152602001828054611dcd90614a72565b8015611e1a5780601f10611def57610100808354040283529160200191611e1a565b820191906000526020600020905b815481529060010190602001808311611dfd57829003601f168201915b505050505081565b611e2a61308c565b6001811415611e3f5781601181905550611e51565b6002811415611e5057816012819055505b5b5050565b611e5d61308c565b8060169080519060200190611e73929190613be0565b5050565b60606000806000611e8785611c82565b905060008167ffffffffffffffff811115611ea557611ea4613d01565b5b604051908082528060200260200182016040528015611ed35781602001602082028036833780820191505090505b509050611ede613c66565b6000611ee8613171565b90505b838614611fb357611efb816133f1565b9150816040015115611f0c57611fa8565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611f4c57816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415611fa75780838780600101985081518110611f9a57611f99614c7b565b5b6020026020010181815250505b5b806001019050611eeb565b508195505050505050919050565b60205481565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ff961308c565b80601d8190555050565b60606003805461201290614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461203e90614a72565b801561208b5780601f106120605761010080835404028352916020019161208b565b820191906000526020600020905b81548152906001019060200180831161206e57829003601f168201915b5050505050905090565b60608183106120d0576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806120db61341c565b90506120e5613171565b8510156120f7576120f4613171565b94505b80841115612103578093505b600061210e87611c82565b90508486101561213157600086860390508181101561212b578091505b50612136565b600090505b60008167ffffffffffffffff81111561215257612151613d01565b5b6040519080825280602002602001820160405280156121805781602001602082028036833780820191505090505b509050600082141561219857809450505050506122a2565b60006121a3886125e1565b9050600081604001516121b857816000015190505b60008990505b8881141580156121ce5750848714155b15612294576121dc816133f1565b92508260400151156121ed57612289565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461222d57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612288578084888060010199508151811061227b5761227a614c7b565b5b6020026020010181815250505b5b8060010190506121be565b508583528296505050505050505b9392505050565b6122b1613169565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612316576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612323613169565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166123d0613169565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124159190613f5e565b60405180910390a35050565b6018805461242e90614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461245a90614a72565b80156124a75780601f1061247c576101008083540402835291602001916124a7565b820191906000526020600020905b81548152906001019060200180831161248a57829003601f168201915b505050505081565b601c5481565b6124bd61308c565b80601560016101000a81548160ff02191690831515021790555050565b6124e584848461131f565b60008373ffffffffffffffffffffffffffffffffffffffff163b146125475761251084848484613425565b612546576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6019805461255a90614a72565b80601f016020809104026020016040519081016040528092919081815260200182805461258690614a72565b80156125d35780601f106125a8576101008083540402835291602001916125d3565b820191906000526020600020905b8154815290600101906020018083116125b657829003601f168201915b505050505081565b600d5481565b6125e9613c66565b6125f1613c66565b6125f9613171565b83108061260d575061260961341c565b8310155b1561261b5780915050612646565b612624836133f1565b90508060400151156126395780915050612646565b61264283613585565b9150505b919050565b60606126568261310a565b612695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268c90614d1c565b60405180910390fd5b60001515601560029054906101000a900460ff161515141561274357601880546126be90614a72565b80601f01602080910402602001604051908101604052809291908181526020018280546126ea90614a72565b80156127375780601f1061270c57610100808354040283529160200191612737565b820191906000526020600020905b81548152906001019060200180831161271a57829003601f168201915b505050505090506128f3565b600061274d6135a5565b905060006014600085815260200190815260200160002054905060008114156127ca5760008490505b60008111156127c85760006014600083815260200190815260200160002054146127b557601460008281526020019081526020016000205491506127c8565b80806127c090614d3c565b915050612776565b505b6001811415612836576000601980546127e290614a72565b9050116127fe576040518060200160405280600081525061282d565b601961280985613637565b601760405160200161281d93929190614e36565b6040516020818303038152906040525b925050506128f3565b60028114156128a2576000601a805461284e90614a72565b90501161286a5760405180602001604052806000815250612899565b601a61287585613637565b601760405160200161288993929190614e36565b6040516020818303038152906040525b925050506128f3565b60008251116128c057604051806020016040528060008152506128ee565b816128ca85613637565b60176040516020016128de93929190614e67565b6040516020818303038152906040525b925050505b919050565b600c5481565b600f5481565b601f5481565b60146020528060005260406000206000915090505481565b61292a61308c565b80601560026101000a81548160ff02191690831515021790555050565b61294f61308c565b8060108190555050565b8361296381613798565b3410156129a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299c90614ee4565b60405180910390fd5b60006129af612fc5565b9050600081116129f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129eb90614f50565b60405180910390fd5b6001811415612ac2576000612a076137e9565b604051602001612a179190614fb8565b604051602081830303815290604052805190602001209050612a7d858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601154836137f1565b612abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ab39061501f565b60405180910390fd5b50612b8d565b6002811415612b8c576000612ad56137e9565b604051602001612ae59190614fb8565b604051602081830303815290604052805190602001209050612b4b858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601254836137f1565b612b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b819061501f565b60405180910390fd5b505b5b601560009054906101000a900460ff1615612bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd49061508b565b60405180910390fd5b6001811415612c3c57600086118015612bf85750600e548611155b612c37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2e906150f7565b60405180910390fd5b612cee565b6002811415612c9b57600086118015612c575750600f548611155b612c96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8d906150f7565b60405180910390fd5b612ced565b600086118015612cad57506010548611155b612cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ce3906150f7565b60405180910390fd5b5b5b600d54600c54612cfe9190614ad3565b86612d07611308565b612d119190614b07565b1115612d52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d4990614ba9565b60405180910390fd5b60136000612d5e6137e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ddd90615163565b60405180910390fd5b6001851415612e565760006001612dfb611308565b612e059190614b07565b90506001601460008381526020019081526020016000208190555060016014600060018a85612e349190614b07565b612e3e9190614ad3565b81526020019081526020016000208190555050612eb9565b60006001612e62611308565b612e6c9190614b07565b90506002601460008381526020019081526020016000208190555060026014600060018a85612e9b9190614b07565b612ea59190614ad3565b815260200190815260200160002081905550505b600160136000612ec76137e9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550612f29612f236137e9565b8761330d565b505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000601d54421115612fda5760039050613005565b601c54421115612fed5760029050613005565b601b544211156130005760019050613005565b600090505b90565b61301061308c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613080576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613077906151f5565b60405180910390fd5b6130898161332b565b50565b6130946137e9565b73ffffffffffffffffffffffffffffffffffffffff166130b2611fc7565b73ffffffffffffffffffffffffffffffffffffffff1614613108576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130ff90615261565b60405180910390fd5b565b600081613115613171565b11158015613124575060005482105b8015613162575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b60008082905080613189613171565b11613211576000548110156132105760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561320e575b60008114156132045760046000836001900393508381526020019081526020016000205490506131d9565b8092505050613243565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86132cb868684613808565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b613327828260405180602001604052806000815250613811565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6133f9613c66565b61341560046000848152602001908152602001600020546138ae565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261344b613169565b8786866040518563ffffffff1660e01b815260040161346d94939291906152d6565b602060405180830381600087803b15801561348757600080fd5b505af19250505080156134b857506040513d601f19601f820116820180604052508101906134b59190615337565b60015b613532573d80600081146134e8576040519150601f19603f3d011682016040523d82523d6000602084013e6134ed565b606091505b5060008151141561352a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b61358d613c66565b61359e6135998361317a565b6138ae565b9050919050565b6060601680546135b490614a72565b80601f01602080910402602001604051908101604052809291908181526020018280546135e090614a72565b801561362d5780601f106136025761010080835404028352916020019161362d565b820191906000526020600020905b81548152906001019060200180831161361057829003601f168201915b5050505050905090565b6060600082141561367f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613793565b600082905060005b600082146136b157808061369a90615364565b915050600a826136aa91906153dc565b9150613687565b60008167ffffffffffffffff8111156136cd576136cc613d01565b5b6040519080825280601f01601f1916602001820160405280156136ff5781602001600182028036833780820191505090505b5090505b6000851461378c576001826137189190614ad3565b9150600a85613727919061540d565b60306137339190614b07565b60f81b81838151811061374957613748614c7b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561378591906153dc565b9450613703565b8093505050505b919050565b60008060006137a5612fc5565b905060018114156137ba57601e5491506137d4565b60028114156137cd57601f5491506137d3565b60205491505b5b83826137e0919061543e565b92505050919050565b600033905090565b6000826137fe8584613964565b1490509392505050565b60009392505050565b61381b83836139ba565b60008373ffffffffffffffffffffffffffffffffffffffff163b146138a957600080549050600083820390505b61385b6000868380600101945086613425565b613891576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106138485781600054146138a657600080fd5b50505b505050565b6138b6613c66565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b60008082905060005b84518110156139af5761399a8286838151811061398d5761398c614c7b565b5b6020026020010151613b8e565b915080806139a790615364565b91505061396d565b508091505092915050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613a27576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415613a62576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613a6f60008483856132ae565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550613ae683613ad760008660006132b4565b613ae085613bb9565b176132dc565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210613b0a57806000819055505050613b896000848385613307565b505050565b6000818310613ba657613ba18284613bc9565b613bb1565b613bb08383613bc9565b5b905092915050565b60006001821460e11b9050919050565b600082600052816020526040600020905092915050565b828054613bec90614a72565b90600052602060002090601f016020900481019282613c0e5760008555613c55565b82601f10613c2757805160ff1916838001178555613c55565b82800160010185558215613c55579182015b82811115613c54578251825591602001919060010190613c39565b5b509050613c629190613cb5565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115613cce576000816000905550600101613cb6565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d3982613cf0565b810181811067ffffffffffffffff82111715613d5857613d57613d01565b5b80604052505050565b6000613d6b613cd2565b9050613d778282613d30565b919050565b600067ffffffffffffffff821115613d9757613d96613d01565b5b613da082613cf0565b9050602081019050919050565b82818337600083830152505050565b6000613dcf613dca84613d7c565b613d61565b905082815260208101848484011115613deb57613dea613ceb565b5b613df6848285613dad565b509392505050565b600082601f830112613e1357613e12613ce6565b5b8135613e23848260208601613dbc565b91505092915050565b6000819050919050565b613e3f81613e2c565b8114613e4a57600080fd5b50565b600081359050613e5c81613e36565b92915050565b60008060408385031215613e7957613e78613cdc565b5b600083013567ffffffffffffffff811115613e9757613e96613ce1565b5b613ea385828601613dfe565b9250506020613eb485828601613e4d565b9150509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ef381613ebe565b8114613efe57600080fd5b50565b600081359050613f1081613eea565b92915050565b600060208284031215613f2c57613f2b613cdc565b5b6000613f3a84828501613f01565b91505092915050565b60008115159050919050565b613f5881613f43565b82525050565b6000602082019050613f736000830184613f4f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613fb3578082015181840152602081019050613f98565b83811115613fc2576000848401525b50505050565b6000613fd382613f79565b613fdd8185613f84565b9350613fed818560208601613f95565b613ff681613cf0565b840191505092915050565b6000602082019050818103600083015261401b8184613fc8565b905092915050565b60006020828403121561403957614038613cdc565b5b600061404784828501613e4d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061407b82614050565b9050919050565b61408b81614070565b82525050565b60006020820190506140a66000830184614082565b92915050565b6140b581614070565b81146140c057600080fd5b50565b6000813590506140d2816140ac565b92915050565b600080604083850312156140ef576140ee613cdc565b5b60006140fd858286016140c3565b925050602061410e85828601613e4d565b9150509250929050565b6000819050919050565b61412b81614118565b82525050565b60006020820190506141466000830184614122565b92915050565b60006020828403121561416257614161613cdc565b5b6000614170848285016140c3565b91505092915050565b60006020828403121561418f5761418e613cdc565b5b600082013567ffffffffffffffff8111156141ad576141ac613ce1565b5b6141b984828501613dfe565b91505092915050565b6141cb81613f43565b81146141d657600080fd5b50565b6000813590506141e8816141c2565b92915050565b60006020828403121561420457614203613cdc565b5b6000614212848285016141d9565b91505092915050565b61422481613e2c565b82525050565b600060208201905061423f600083018461421b565b92915050565b60008060006060848603121561425e5761425d613cdc565b5b600061426c868287016140c3565b935050602061427d868287016140c3565b925050604061428e86828701613e4d565b9150509250925092565b6000806000606084860312156142b1576142b0613cdc565b5b60006142bf86828701613e4d565b93505060206142d0868287016140c3565b92505060406142e186828701613e4d565b9150509250925092565b600067ffffffffffffffff82111561430657614305613d01565b5b602082029050602081019050919050565b600080fd5b600061432f61432a846142eb565b613d61565b9050808382526020820190506020840283018581111561435257614351614317565b5b835b8181101561437b57806143678882613e4d565b845260208401935050602081019050614354565b5050509392505050565b600082601f83011261439a57614399613ce6565b5b81356143aa84826020860161431c565b91505092915050565b6000602082840312156143c9576143c8613cdc565b5b600082013567ffffffffffffffff8111156143e7576143e6613ce1565b5b6143f384828501614385565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61443181614070565b82525050565b600067ffffffffffffffff82169050919050565b61445481614437565b82525050565b61446381613f43565b82525050565b600062ffffff82169050919050565b61448181614469565b82525050565b60808201600082015161449d6000850182614428565b5060208201516144b0602085018261444b565b5060408201516144c3604085018261445a565b5060608201516144d66060850182614478565b50505050565b60006144e88383614487565b60808301905092915050565b6000602082019050919050565b600061450c826143fc565b6145168185614407565b935061452183614418565b8060005b8381101561455257815161453988826144dc565b9750614544836144f4565b925050600181019050614525565b5085935050505092915050565b600060208201905081810360008301526145798184614501565b905092915050565b6000806040838503121561459857614597613cdc565b5b60006145a685828601613e4d565b92505060206145b785828601613e4d565b9150509250929050565b6145ca81614118565b81146145d557600080fd5b50565b6000813590506145e7816145c1565b92915050565b6000806040838503121561460457614603613cdc565b5b6000614612858286016145d8565b925050602061462385828601613e4d565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61466281613e2c565b82525050565b60006146748383614659565b60208301905092915050565b6000602082019050919050565b60006146988261462d565b6146a28185614638565b93506146ad83614649565b8060005b838110156146de5781516146c58882614668565b97506146d083614680565b9250506001810190506146b1565b5085935050505092915050565b60006020820190508181036000830152614705818461468d565b905092915050565b60008060006060848603121561472657614725613cdc565b5b6000614734868287016140c3565b935050602061474586828701613e4d565b925050604061475686828701613e4d565b9150509250925092565b6000806040838503121561477757614776613cdc565b5b6000614785858286016140c3565b9250506020614796858286016141d9565b9150509250929050565b600067ffffffffffffffff8211156147bb576147ba613d01565b5b6147c482613cf0565b9050602081019050919050565b60006147e46147df846147a0565b613d61565b905082815260208101848484011115614800576147ff613ceb565b5b61480b848285613dad565b509392505050565b600082601f83011261482857614827613ce6565b5b81356148388482602086016147d1565b91505092915050565b6000806000806080858703121561485b5761485a613cdc565b5b6000614869878288016140c3565b945050602061487a878288016140c3565b935050604061488b87828801613e4d565b925050606085013567ffffffffffffffff8111156148ac576148ab613ce1565b5b6148b887828801614813565b91505092959194509250565b6080820160008201516148da6000850182614428565b5060208201516148ed602085018261444b565b506040820151614900604085018261445a565b5060608201516149136060850182614478565b50505050565b600060808201905061492e60008301846148c4565b92915050565b600080fd5b60008083601f84011261494f5761494e613ce6565b5b8235905067ffffffffffffffff81111561496c5761496b614934565b5b60208301915083602082028301111561498857614987614317565b5b9250929050565b600080600080606085870312156149a9576149a8613cdc565b5b60006149b787828801613e4d565b94505060206149c887828801613e4d565b935050604085013567ffffffffffffffff8111156149e9576149e8613ce1565b5b6149f587828801614939565b925092505092959194509250565b60008060408385031215614a1a57614a19613cdc565b5b6000614a28858286016140c3565b9250506020614a39858286016140c3565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614a8a57607f821691505b60208210811415614a9e57614a9d614a43565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614ade82613e2c565b9150614ae983613e2c565b925082821015614afc57614afb614aa4565b5b828203905092915050565b6000614b1282613e2c565b9150614b1d83613e2c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614b5257614b51614aa4565b5b828201905092915050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000614b93601483613f84565b9150614b9e82614b5d565b602082019050919050565b60006020820190508181036000830152614bc281614b86565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614bff601f83613f84565b9150614c0a82614bc9565b602082019050919050565b60006020820190508181036000830152614c2e81614bf2565b9050919050565b600081905092915050565b50565b6000614c50600083614c35565b9150614c5b82614c40565b600082019050919050565b6000614c7182614c43565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614d06602f83613f84565b9150614d1182614caa565b604082019050919050565b60006020820190508181036000830152614d3581614cf9565b9050919050565b6000614d4782613e2c565b91506000821415614d5b57614d5a614aa4565b5b600182039050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614d9381614a72565b614d9d8186614d66565b94506001821660008114614db85760018114614dc957614dfc565b60ff19831686528186019350614dfc565b614dd285614d71565b60005b83811015614df457815481890152600182019150602081019050614dd5565b838801955050505b50505092915050565b6000614e1082613f79565b614e1a8185614d66565b9350614e2a818560208601613f95565b80840191505092915050565b6000614e428286614d86565b9150614e4e8285614e05565b9150614e5a8284614d86565b9150819050949350505050565b6000614e738286614e05565b9150614e7f8285614e05565b9150614e8b8284614d86565b9150819050949350505050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614ece601383613f84565b9150614ed982614e98565b602082019050919050565b60006020820190508181036000830152614efd81614ec1565b9050919050565b7f4d696e74206e6f74207374617274000000000000000000000000000000000000600082015250565b6000614f3a600e83613f84565b9150614f4582614f04565b602082019050919050565b60006020820190508181036000830152614f6981614f2d565b9050919050565b60008160601b9050919050565b6000614f8882614f70565b9050919050565b6000614f9a82614f7d565b9050919050565b614fb2614fad82614070565b614f8f565b82525050565b6000614fc48284614fa1565b60148201915081905092915050565b7f496e76616c69642070726f6f6621000000000000000000000000000000000000600082015250565b6000615009600e83613f84565b915061501482614fd3565b602082019050919050565b6000602082019050818103600083015261503881614ffc565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b6000615075601783613f84565b91506150808261503f565b602082019050919050565b600060208201905081810360008301526150a481615068565b9050919050565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b60006150e1601483613f84565b91506150ec826150ab565b602082019050919050565b60006020820190508181036000830152615110816150d4565b9050919050565b7f4164647265737320616c726561647920636c61696d6564210000000000000000600082015250565b600061514d601883613f84565b915061515882615117565b602082019050919050565b6000602082019050818103600083015261517c81615140565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151df602683613f84565b91506151ea82615183565b604082019050919050565b6000602082019050818103600083015261520e816151d2565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061524b602083613f84565b915061525682615215565b602082019050919050565b6000602082019050818103600083015261527a8161523e565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006152a882615281565b6152b2818561528c565b93506152c2818560208601613f95565b6152cb81613cf0565b840191505092915050565b60006080820190506152eb6000830187614082565b6152f86020830186614082565b615305604083018561421b565b8181036060830152615317818461529d565b905095945050505050565b60008151905061533181613eea565b92915050565b60006020828403121561534d5761534c613cdc565b5b600061535b84828501615322565b91505092915050565b600061536f82613e2c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153a2576153a1614aa4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006153e782613e2c565b91506153f283613e2c565b925082615402576154016153ad565b5b828204905092915050565b600061541882613e2c565b915061542383613e2c565b925082615433576154326153ad565b5b828206905092915050565b600061544982613e2c565b915061545483613e2c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561548d5761548c614aa4565b5b82820290509291505056fea2646970667358221220c1362509d6dab414519033cba81785847e0abd81c3cd302cd2b4ad9b083fa48764736f6c63430008090033
Deployed Bytecode Sourcemap
364:7735:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6739:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5653:607:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11161:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13048:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12611:376;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;745:27:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;807:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6982:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5132:75;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4736:309:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22055:2739;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5507:197:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3302:503;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1410:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5708:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7425:145;;;;;;;;;;;;;:::i;:::-;;13912:179:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;623:35:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;701:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6502:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;977:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;776;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1041:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5828:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1655:459:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1213:90:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;904:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1009:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10957:142:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6078:132:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1466:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6214:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;460:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;934:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6319:221:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;1308:47:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5294:209;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;502:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7084:203;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6636:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5373:871:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1544:39:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1201:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6350:148:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11323:102:6;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2490:2446:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13315:303:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1079:36:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1359:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7291:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14157:388:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1119:90:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;580:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1092:410:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4106:1023:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;545:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;662:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1505;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;856:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5211:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5948:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1790:1508;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13684:162:6;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3809:293:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6739:239:5;1094:13:0;:11;:13::i;:::-;6851:1:5::1;6838:9;:14;6834:140;;;6883:10;6863:17;:30;;;;;;;;;;;;:::i;:::-;;6834:140;;;6924:1;6911:9;:14;6907:67;;;6956:10;6936:17;:30;;;;;;;;;;;;:::i;:::-;;6907:67;6834:140;6739:239:::0;;:::o;5653:607:6:-;5738:4;6048:10;6033:25;;:11;:25;;;;:101;;;;6124:10;6109:25;;:11;:25;;;;6033:101;:177;;;;6200:10;6185:25;;:11;:25;;;;6033:177;6014:196;;5653:607;;;:::o;11161:98::-;11215:13;11247:5;11240:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11161:98;:::o;13048:200::-;13116:7;13140:16;13148:7;13140;:16::i;:::-;13135:64;;13165:34;;;;;;;;;;;;;;13135:64;13217:15;:24;13233:7;13217:24;;;;;;;;;;;;;;;;;;;;;13210:31;;13048:200;;;:::o;12611:376::-;12683:13;12699:16;12707:7;12699;:16::i;:::-;12683:32;;12753:5;12730:28;;:19;:17;:19::i;:::-;:28;;;12726:172;;12777:44;12794:5;12801:19;:17;:19::i;:::-;12777:16;:44::i;:::-;12772:126;;12848:35;;;;;;;;;;;;;;12772:126;12726:172;12935:2;12908:15;:24;12924:7;12908:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;12972:7;12968:2;12952:28;;12961:5;12952:28;;;;;;;;;;;;12673:314;12611:376;;:::o;745:27:5:-;;;;:::o;807:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;6982:98::-;1094:13:0;:11;:13::i;:::-;7065:10:5::1;7053:9;:22;;;;;;;;;;;;:::i;:::-;;6982:98:::0;:::o;5132:75::-;1094:13:0;:11;:13::i;:::-;5196:6:5::1;5187;;:15;;;;;;;;;;;;;;;;;;5132:75:::0;:::o;4736:309:6:-;4789:7;5013:15;:13;:15::i;:::-;4998:12;;4982:13;;:28;:46;4975:53;;4736:309;:::o;22055:2739::-;22184:27;22214;22233:7;22214:18;:27::i;:::-;22184:57;;22297:4;22256:45;;22272:19;22256:45;;;22252:86;;22310:28;;;;;;;;;;;;;;22252:86;22350:27;22379:23;22406:28;22426:7;22406:19;:28::i;:::-;22349:85;;;;22531:62;22550:15;22567:4;22573:19;:17;:19::i;:::-;22531:18;:62::i;:::-;22526:173;;22612:43;22629:4;22635:19;:17;:19::i;:::-;22612:16;:43::i;:::-;22607:92;;22664:35;;;;;;;;;;;;;;22607:92;22526:173;22728:1;22714:16;;:2;:16;;;22710:52;;;22739:23;;;;;;;;;;;;;;22710:52;22773:43;22795:4;22801:2;22805:7;22814:1;22773:21;:43::i;:::-;22905:15;22902:157;;;23043:1;23022:19;23015:30;22902:157;23429:18;:24;23448:4;23429:24;;;;;;;;;;;;;;;;23427:26;;;;;;;;;;;;23497:18;:22;23516:2;23497:22;;;;;;;;;;;;;;;;23495:24;;;;;;;;;;;23812:142;23848:2;23895:45;23910:4;23916:2;23920:19;23895:14;:45::i;:::-;2046:8;23868:72;23812:18;:142::i;:::-;23783:17;:26;23801:7;23783:26;;;;;;;;;;;:171;;;;24121:1;2046:8;24071:19;:46;:51;24067:616;;;24142:19;24174:1;24164:7;:11;24142:33;;24329:1;24295:17;:30;24313:11;24295:30;;;;;;;;;;;;:35;24291:378;;;24431:13;;24416:11;:28;24412:239;;24609:19;24576:17;:30;24594:11;24576:30;;;;;;;;;;;:52;;;;24412:239;24291:378;24124:559;24067:616;24727:7;24723:2;24708:27;;24717:4;24708:27;;;;;;;;;;;;24745:42;24766:4;24772:2;24776:7;24785:1;24745:20;:42::i;:::-;22174:2620;;;22055:2739;;;:::o;5507:197:5:-;1094:13:0;:11;:13::i;:::-;5637::5::1;:11;:13::i;:::-;5625:9;;:25;;;;:::i;:::-;5599:21;:52;;5591:61;;;::::0;::::1;;5678:21;5658:17;:41;;;;5507:197:::0;:::o;3302:503::-;1094:13:0;:11;:13::i;:::-;3442:9:5::1;;3426:11;3410:13;:11;:13::i;:::-;:27;;;;:::i;:::-;3409:42;;3401:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;3500:1;3487:9;:14;3483:278;;;3511:13;3543:1;3527:13;:11;:13::i;:::-;:17;;;;:::i;:::-;3511:33;;3573:1;3552:8;:18;3561:8;3552:18;;;;;;;;;;;:22;;;;3621:1;3582:8;:36;3616:1;3602:11;3591:8;:22;;;;:::i;:::-;:26;;;;:::i;:::-;3582:36;;;;;;;;;;;:40;;;;3503:126;3483:278;;;3643:13;3675:1;3659:13;:11;:13::i;:::-;:17;;;;:::i;:::-;3643:33;;3705:1;3684:8;:18;3693:8;3684:18;;;;;;;;;;;:22;;;;3753:1;3714:8;:36;3748:1;3734:11;3723:8;:22;;;;:::i;:::-;:26;;;;:::i;:::-;3714:36;;;;;;;;;;;:40;;;;3635:126;3483:278;3767:33;3777:9;3788:11;3767:9;:33::i;:::-;3302:503:::0;;;:::o;1410:51::-;;;;:::o;5708:116::-;1094:13:0;:11;:13::i;:::-;5804:15:5::1;5785:16;:34;;;;5708:116:::0;:::o;7425:145::-;1094:13:0;:11;:13::i;:::-;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;7481:7:5::2;7502;:5;:7::i;:::-;7494:21;;7523;7494:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7480:69;;;7562:2;7554:11;;;::::0;::::2;;7475:95;1701:1:1::1;2628:7;:22;;;;7425:145:5:o:0;13912:179:6:-;14045:39;14062:4;14068:2;14072:7;14045:39;;;;;;;;;;;;:16;:39::i;:::-;13912:179;;;:::o;623:35:5:-;;;;:::o;701:39::-;;;;:::o;6502:130::-;1094:13:0;:11;:13::i;:::-;6609:18:5::1;6589:17;:38;;;;;;;;;;;;:::i;:::-;;6502:130:::0;:::o;977:27::-;;;;;;;;;;;;;:::o;776:::-;;;;:::o;1041:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5828:116::-;1094:13:0;:11;:13::i;:::-;5924:15:5::1;5905:16;:34;;;;5828:116:::0;:::o;1655:459:8:-;1744:23;1803:22;1828:8;:15;1803:40;;1857:34;1915:14;1894:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1857:73;;1949:9;1944:123;1965:14;1960:1;:19;1944:123;;2020:32;2040:8;2049:1;2040:11;;;;;;;;:::i;:::-;;;;;;;;2020:19;:32::i;:::-;2004:10;2015:1;2004:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;1981:3;;;;;1944:123;;;;2087:10;2080:17;;;;1655:459;;;:::o;1213:90:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;904:26::-;;;;;;;;;;;;;:::o;1009:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10957:142:6:-;11021:7;11063:27;11082:7;11063:18;:27::i;:::-;11040:52;;10957:142;;;:::o;6078:132:5:-;1094:13:0;:11;:13::i;:::-;6185:20:5::1;6163:19;:42;;;;6078:132:::0;:::o;1466:35::-;;;;:::o;6214:132::-;1094:13:0;:11;:13::i;:::-;6321:20:5::1;6299:19;:42;;;;6214:132:::0;:::o;460:38::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;934:39::-;;;;;;;;;;;;;:::o;6319:221:6:-;6383:7;6423:1;6406:19;;:5;:19;;;6402:60;;;6434:28;;;;;;;;;;;;;;6402:60;1022:13;6479:18;:25;6498:5;6479:25;;;;;;;;;;;;;;;;:54;6472:61;;6319:221;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1308:47:5:-;;;;:::o;5294:209::-;1094:13:0;:11;:13::i;:::-;5377:1:5::1;5368:5;:10;5364:135;;;5397:5;5388:6;:14;;;;5364:135;;;5428:1;5419:5;:10;5415:84;;;5448:5;5439:6;:14;;;;5415:84;;;5487:5;5474:10;:18;;;;5415:84;5364:135;5294:209:::0;;:::o;502:39::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7084:203::-;1094:13:0;:11;:13::i;:::-;7176:1:5::1;7167:5;:10;7163:120;;;7202:11;7187:12;:26;;;;7163:120;;;7239:1;7230:5;:10;7226:57;;;7265:11;7250:12;:26;;;;7226:57;7163:120;7084:203:::0;;:::o;6636:98::-;1094:13:0;:11;:13::i;:::-;6719:10:5::1;6707:9;:22;;;;;;;;;;;;:::i;:::-;;6636:98:::0;:::o;5373:871:8:-;5443:16;5495:19;5528:25;5567:22;5592:16;5602:5;5592:9;:16::i;:::-;5567:41;;5622:25;5664:14;5650:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5622:57;;5693:31;;:::i;:::-;5743:9;5755:15;:13;:15::i;:::-;5743:27;;5738:461;5787:14;5772:11;:29;5738:461;;5838:15;5851:1;5838:12;:15::i;:::-;5826:27;;5875:9;:16;;;5871:71;;;5915:8;;5871:71;5989:1;5963:28;;:9;:14;;;:28;;;5959:109;;6035:9;:14;;;6015:34;;5959:109;6110:5;6089:26;;:17;:26;;;6085:100;;;6165:1;6139:8;6148:13;;;;;;6139:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;6085:100;5738:461;5803:3;;;;;5738:461;;;;6219:8;6212:15;;;;;;;5373:871;;;:::o;1544:39:5:-;;;;:::o;1201:85:0:-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;6350:148:5:-;1094:13:0;:11;:13::i;:::-;6469:24:5::1;6443:23;:50;;;;6350:148:::0;:::o;11323:102:6:-;11379:13;11411:7;11404:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11323:102;:::o;2490:2446:8:-;2621:16;2686:4;2677:5;:13;2673:45;;2699:19;;;;;;;;;;;;;;2673:45;2732:19;2765:17;2785:14;:12;:14::i;:::-;2765:34;;2883:15;:13;:15::i;:::-;2875:5;:23;2871:85;;;2926:15;:13;:15::i;:::-;2918:23;;2871:85;3030:9;3023:4;:16;3019:71;;;3066:9;3059:16;;3019:71;3103:25;3131:16;3141:5;3131:9;:16::i;:::-;3103:44;;3322:4;3314:5;:12;3310:271;;;3346:19;3375:5;3368:4;:12;3346:34;;3416:17;3402:11;:31;3398:109;;;3477:11;3457:31;;3398:109;3328:193;3310:271;;;3565:1;3545:21;;3310:271;3594:25;3636:17;3622:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3594:60;;3693:1;3672:17;:22;3668:76;;;3721:8;3714:15;;;;;;;;3668:76;3885:31;3919:26;3939:5;3919:19;:26::i;:::-;3885:60;;3959:25;4201:9;:16;;;4196:90;;4257:9;:14;;;4237:34;;4196:90;4304:9;4316:5;4304:17;;4299:467;4328:4;4323:1;:9;;:45;;;;;4351:17;4336:11;:32;;4323:45;4299:467;;;4405:15;4418:1;4405:12;:15::i;:::-;4393:27;;4442:9;:16;;;4438:71;;;4482:8;;4438:71;4556:1;4530:28;;:9;:14;;;:28;;;4526:109;;4602:9;:14;;;4582:34;;4526:109;4677:5;4656:26;;:17;:26;;;4652:100;;;4732:1;4706:8;4715:13;;;;;;4706:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;4652:100;4299:467;4370:3;;;;;4299:467;;;;4865:11;4855:8;4848:29;4911:8;4904:15;;;;;;;;2490:2446;;;;;;:::o;13315:303:6:-;13425:19;:17;:19::i;:::-;13413:31;;:8;:31;;;13409:61;;;13453:17;;;;;;;;;;;;;;13409:61;13533:8;13481:18;:39;13500:19;:17;:19::i;:::-;13481:39;;;;;;;;;;;;;;;:49;13521:8;13481:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;13592:8;13556:55;;13571:19;:17;:19::i;:::-;13556:55;;;13602:8;13556:55;;;;;;:::i;:::-;;;;;;;;13315:303;;:::o;1079:36:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1359:47::-;;;;:::o;7291:103::-;1094:13:0;:11;:13::i;:::-;7383:6:5::1;7360:20;;:29;;;;;;;;;;;;;;;;;;7291:103:::0;:::o;14157:388:6:-;14318:31;14331:4;14337:2;14341:7;14318:12;:31::i;:::-;14381:1;14363:2;:14;;;:19;14359:180;;14401:56;14432:4;14438:2;14442:7;14451:5;14401:30;:56::i;:::-;14396:143;;14484:40;;;;;;;;;;;;;;14396:143;14359:180;14157:388;;;;:::o;1119:90:5:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;580:38::-;;;;:::o;1092:410:8:-;1168:21;;:::i;:::-;1201:31;;:::i;:::-;1256:15;:13;:15::i;:::-;1246:7;:25;:54;;;;1286:14;:12;:14::i;:::-;1275:7;:25;;1246:54;1242:101;;;1323:9;1316:16;;;;;1242:101;1364:21;1377:7;1364:12;:21::i;:::-;1352:33;;1399:9;:16;;;1395:63;;;1438:9;1431:16;;;;;1395:63;1474:21;1487:7;1474:12;:21::i;:::-;1467:28;;;1092:410;;;;:::o;4106:1023:5:-;4180:13;4209:17;4217:8;4209:7;:17::i;:::-;4201:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;4301:5;4289:17;;:8;;;;;;;;;;;:17;;;4285:62;;;4323:17;4316:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4285:62;4353:28;4384:10;:8;:10::i;:::-;4353:41;;4400:17;4420:8;:18;4429:8;4420:18;;;;;;;;;;;;4400:38;;4461:1;4448:9;:14;4444:173;;;4477:6;4486:8;4477:17;;4472:139;4500:1;4496;:5;4472:139;;;4537:1;4522:8;:11;4531:1;4522:11;;;;;;;;;;;;:16;4518:85;;4564:8;:11;4573:1;4564:11;;;;;;;;;;;;4552:23;;4587:5;;4518:85;4503:3;;;;;:::i;:::-;;;;4472:139;;;;4444:173;4640:1;4627:9;:14;4623:360;;;4691:1;4663:17;4657:31;;;;;:::i;:::-;;;:35;:134;;;;;;;;;;;;;;;;;4727:17;4746:19;:8;:17;:19::i;:::-;4767:9;4710:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4657:134;4650:141;;;;;;4623:360;4822:1;4809:9;:14;4805:178;;;4874:1;4846:17;4840:31;;;;;:::i;:::-;;;:35;:134;;;;;;;;;;;;;;;;;4910:17;4929:19;:8;:17;:19::i;:::-;4950:9;4893:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4840:134;4833:141;;;;;;4805:178;5027:1;5002:14;4996:28;:32;:128;;;;;;;;;;;;;;;;;5063:14;5079:19;:8;:17;:19::i;:::-;5100:9;5046:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4996:128;4989:135;;;;4106:1023;;;;:::o;545:31::-;;;;:::o;662:35::-;;;;:::o;1505:::-;;;;:::o;856:43::-;;;;;;;;;;;;;;;;;:::o;5211:79::-;1094:13:0;:11;:13::i;:::-;5279:6:5::1;5268:8;;:17;;;;;;;;;;;;;;;;;;5211:79:::0;:::o;5948:124::-;1094:13:0;:11;:13::i;:::-;6052:15:5::1;6029:20;:38;;;;5948:124:::0;:::o;1790:1508::-;1912:11;1723:27;1738:11;1723:14;:27::i;:::-;1710:9;:40;;1702:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;1932:10:::1;1945:11;:9;:11::i;:::-;1932:24;;1979:1;1971:5;:9;1963:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1;2010:5;:10;2006:354;;;2030:12;2072;:10;:12::i;:::-;2055:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;2045:41;;;;;;2030:56;;2102:52;2121:12;;2102:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2135:12;;2149:4;2102:18;:52::i;:::-;2094:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;2022:158;2006:354;;;2199:1;2190:5;:10;2186:174;;;2210:12;2252;:10;:12::i;:::-;2235:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;2225:41;;;;;;2210:56;;2282:52;2301:12;;2282:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2315:12;;2329:4;2282:18;:52::i;:::-;2274:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;2202:158;2186:174;2006:354;2375:6;;;;;;;;;;;2374:7;2366:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;2429:1;2420:5;:10;2416:342;;;2462:1;2448:11;:15;:50;;;;;2482:16;;2467:11;:31;;2448:50;2440:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2416:342;;;2549:1;2540:5;:10;2536:222;;;2582:1;2568:11;:15;:50;;;;;2602:16;;2587:11;:31;;2568:50;2560:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2536:222;;;2686:1;2672:11;:15;:54;;;;;2706:20;;2691:11;:35;;2672:54;2664:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;2536:222;2416:342;2818:17;;2806:9;;:29;;;;:::i;:::-;2790:11;2774:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:62;;2766:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2874:11;:25;2886:12;:10;:12::i;:::-;2874:25;;;;;;;;;;;;;;;;;;;;;;;;;2873:26;2865:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2952:1;2939:9;:14;2935:278;;;2963:13;2995:1;2979:13;:11;:13::i;:::-;:17;;;;:::i;:::-;2963:33;;3025:1;3004:8;:18;3013:8;3004:18;;;;;;;;;;;:22;;;;3073:1;3034:8;:36;3068:1;3054:11;3043:8;:22;;;;:::i;:::-;:26;;;;:::i;:::-;3034:36;;;;;;;;;;;:40;;;;2955:126;2935:278;;;3095:13;3127:1;3111:13;:11;:13::i;:::-;:17;;;;:::i;:::-;3095:33;;3157:1;3136:8;:18;3145:8;3136:18;;;;;;;;;;;:22;;;;3205:1;3166:8;:36;3200:1;3186:11;3175:8;:22;;;;:::i;:::-;:26;;;;:::i;:::-;3166:36;;;;;;;;;;;:40;;;;3087:126;2935:278;3247:4;3219:11;:25;3231:12;:10;:12::i;:::-;3219:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;3257:36;3267:12;:10;:12::i;:::-;3281:11;3257:9;:36::i;:::-;1925:1373;1790:1508:::0;;;;;:::o;13684:162:6:-;13781:4;13804:18;:25;13823:5;13804:25;;;;;;;;;;;;;;;:35;13830:8;13804:35;;;;;;;;;;;;;;;;;;;;;;;;;13797:42;;13684:162;;;;:::o;3809:293:5:-;3851:4;3890:23;;3872:15;:41;3868:70;;;3930:1;3923:8;;;;3868:70;3966:19;;3948:15;:37;3944:66;;;4002:1;3995:8;;;;3944:66;4039:19;;4021:15;:37;4017:66;;;4075:1;4068:8;;;;4017:66;4096:1;4089:8;;3809:293;;:::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;1359:130::-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;14791:268:6:-;14848:4;14902:7;14883:15;:13;:15::i;:::-;:26;;:65;;;;;14935:13;;14925:7;:23;14883:65;:150;;;;;15032:1;1774:8;14985:17;:26;15003:7;14985:26;;;;;;;;;;;;:43;:48;14883:150;14864:169;;14791:268;;;:::o;32874:103::-;32934:7;32960:10;32953:17;;32874:103;:::o;7591:93:5:-;7656:7;7678:1;7671:8;;7591:93;:::o;7949:1105:6:-;8016:7;8035:12;8050:7;8035:22;;8115:4;8096:15;:13;:15::i;:::-;:23;8092:898;;8148:13;;8141:4;:20;8137:853;;;8185:14;8202:17;:23;8220:4;8202:23;;;;;;;;;;;;8185:40;;8316:1;1774:8;8289:6;:23;:28;8285:687;;;8800:111;8817:1;8807:6;:11;8800:111;;;8859:17;:25;8877:6;;;;;;;8859:25;;;;;;;;;;;;8850:34;;8800:111;;;8943:6;8936:13;;;;;;8285:687;8163:827;8137:853;8092:898;9016:31;;;;;;;;;;;;;;7949:1105;;;;:::o;20436:637::-;20528:27;20557:23;20596:53;20652:15;20596:71;;20834:7;20828:4;20821:21;20868:22;20862:4;20855:36;20943:4;20937;20927:21;20904:44;;21037:19;21031:26;21012:45;;20774:293;20436:637;;;:::o;21181:632::-;21319:11;21478:15;21472:4;21468:26;21460:34;;21635:15;21624:9;21620:31;21607:44;;21780:15;21769:9;21766:30;21759:4;21748:9;21745:19;21742:55;21732:65;;21181:632;;;;;:::o;31742:154::-;;;;;:::o;30099:302::-;30230:7;30249:16;2166:3;30275:19;:40;;30249:67;;2166:3;30341:31;30352:4;30358:2;30362:9;30341:10;:31::i;:::-;30333:40;;:61;;30326:68;;;30099:302;;;;;:::o;10460:440::-;10540:14;10705:15;10698:5;10694:27;10685:36;;10877:5;10863:11;10839:22;10835:40;10832:51;10825:5;10822:62;10812:72;;10460:440;;;;:::o;32537:153::-;;;;;:::o;15138:102::-;15206:27;15216:2;15220:8;15206:27;;;;;;;;;;;;:9;:27::i;:::-;15138:102;;:::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;9587:151:6:-;9647:21;;:::i;:::-;9687:44;9706:17;:24;9724:5;9706:24;;;;;;;;;;;;9687:18;:44::i;:::-;9680:51;;9587:151;;;:::o;4440:93::-;4487:7;4513:13;;4506:20;;4440:93;:::o;28649:697::-;28807:4;28852:2;28827:45;;;28873:19;:17;:19::i;:::-;28894:4;28900:7;28909:5;28827:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;28823:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29122:1;29105:6;:13;:18;29101:229;;;29150:40;;;;;;;;;;;;;;29101:229;29290:6;29284:13;29275:6;29271:2;29267:15;29260:38;28823:517;28993:54;;;28983:64;;;:6;:64;;;;28976:71;;;28649:697;;;;;;:::o;10226:156::-;10288:21;;:::i;:::-;10328:47;10347:27;10366:7;10347:18;:27::i;:::-;10328:18;:47::i;:::-;10321:54;;10226:156;;;:::o;7995:102:5:-;8055:13;8083:9;8076:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7995:102;:::o;392:703:3:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;7688:303:5:-;7752:13;7774:12;7792:10;7805:11;:9;:11::i;:::-;7792:24;;7840:1;7831:5;:10;7827:132;;;7858:6;;7851:13;;7827:132;;;7890:1;7881:5;:10;7877:82;;;7908:6;;7901:13;;7877:82;;;7942:10;;7935:17;;7877:82;7827:132;7979:7;7972:4;:14;;;;:::i;:::-;7965:21;;;;7688:303;;;:::o;640:96:2:-;693:7;719:10;712:17;;640:96;:::o;1153:184:4:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1153:184;;;;;:::o;30961:143:6:-;31094:6;30961:143;;;;;:::o;15641:661::-;15759:19;15765:2;15769:8;15759:5;:19::i;:::-;15835:1;15817:2;:14;;;:19;15813:473;;15856:11;15870:13;;15856:27;;15901:13;15923:8;15917:3;:14;15901:30;;15949:229;15979:62;16018:1;16022:2;16026:7;;;;;;16035:5;15979:30;:62::i;:::-;15974:165;;16076:40;;;;;;;;;;;;;;15974:165;16173:3;16165:5;:11;15949:229;;16258:3;16241:13;;:20;16237:34;;16263:8;;;16237:34;15838:448;;15813:473;15641:661;;;:::o;9143:358::-;9209:31;;:::i;:::-;9285:6;9252:9;:14;;:41;;;;;;;;;;;1661:3;9337:6;:32;;9303:9;:24;;:67;;;;;;;;;;;9426:1;1774:8;9399:6;:23;:28;;9380:9;:16;;:47;;;;;;;;;;;2166:3;9466:6;:27;;9437:9;:19;;:57;;;;;;;;;;;9143:358;;;:::o;1991:290:4:-;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;16563:1492:6:-;16627:20;16650:13;;16627:36;;16691:1;16677:16;;:2;:16;;;16673:48;;;16702:19;;;;;;;;;;;;;;16673:48;16747:1;16735:8;:13;16731:44;;;16757:18;;;;;;;;;;;;;;16731:44;16786:61;16816:1;16820:2;16824:12;16838:8;16786:21;:61::i;:::-;17318:1;1156:2;17289:1;:25;;17288:31;17276:8;:44;17250:18;:22;17269:2;17250:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;17590:136;17626:2;17679:33;17702:1;17706:2;17710:1;17679:14;:33::i;:::-;17646:30;17667:8;17646:20;:30::i;:::-;:66;17590:18;:136::i;:::-;17556:17;:31;17574:12;17556:31;;;;;;;;;;;:170;;;;17741:15;17759:12;17741:30;;17785:11;17814:8;17799:12;:23;17785:37;;17836:99;17887:9;;;;;;17883:2;17862:35;;17879:1;17862:35;;;;;;;;;;;;17930:3;17920:7;:13;17836:99;;17965:3;17949:13;:19;;;;17030:949;;17988:60;18017:1;18021:2;18025:12;18039:8;17988:20;:60::i;:::-;16617:1438;16563:1492;;:::o;8054:147:4:-;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;12238:316:6:-;12308:14;12535:1;12525:8;12522:15;12497:23;12493:45;12483:55;;12238:316;;;:::o;8207:261:4:-;8275:13;8379:1;8373:4;8366:15;8407:1;8401:4;8394:15;8447:4;8441;8431:21;8422:30;;8207:261;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:10:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:117;443:1;440;433:12;457:117;566:1;563;556:12;580:102;621:6;672:2;668:7;663:2;656:5;652:14;648:28;638:38;;580:102;;;:::o;688:180::-;736:77;733:1;726:88;833:4;830:1;823:15;857:4;854:1;847:15;874:281;957:27;979:4;957:27;:::i;:::-;949:6;945:40;1087:6;1075:10;1072:22;1051:18;1039:10;1036:34;1033:62;1030:88;;;1098:18;;:::i;:::-;1030:88;1138:10;1134:2;1127:22;917:238;874:281;;:::o;1161:129::-;1195:6;1222:20;;:::i;:::-;1212:30;;1251:33;1279:4;1271:6;1251:33;:::i;:::-;1161:129;;;:::o;1296:308::-;1358:4;1448:18;1440:6;1437:30;1434:56;;;1470:18;;:::i;:::-;1434:56;1508:29;1530:6;1508:29;:::i;:::-;1500:37;;1592:4;1586;1582:15;1574:23;;1296:308;;;:::o;1610:154::-;1694:6;1689:3;1684;1671:30;1756:1;1747:6;1742:3;1738:16;1731:27;1610:154;;;:::o;1770:412::-;1848:5;1873:66;1889:49;1931:6;1889:49;:::i;:::-;1873:66;:::i;:::-;1864:75;;1962:6;1955:5;1948:21;2000:4;1993:5;1989:16;2038:3;2029:6;2024:3;2020:16;2017:25;2014:112;;;2045:79;;:::i;:::-;2014:112;2135:41;2169:6;2164:3;2159;2135:41;:::i;:::-;1854:328;1770:412;;;;;:::o;2202:340::-;2258:5;2307:3;2300:4;2292:6;2288:17;2284:27;2274:122;;2315:79;;:::i;:::-;2274:122;2432:6;2419:20;2457:79;2532:3;2524:6;2517:4;2509:6;2505:17;2457:79;:::i;:::-;2448:88;;2264:278;2202:340;;;;:::o;2548:77::-;2585:7;2614:5;2603:16;;2548:77;;;:::o;2631:122::-;2704:24;2722:5;2704:24;:::i;:::-;2697:5;2694:35;2684:63;;2743:1;2740;2733:12;2684:63;2631:122;:::o;2759:139::-;2805:5;2843:6;2830:20;2821:29;;2859:33;2886:5;2859:33;:::i;:::-;2759:139;;;;:::o;2904:654::-;2982:6;2990;3039:2;3027:9;3018:7;3014:23;3010:32;3007:119;;;3045:79;;:::i;:::-;3007:119;3193:1;3182:9;3178:17;3165:31;3223:18;3215:6;3212:30;3209:117;;;3245:79;;:::i;:::-;3209:117;3350:63;3405:7;3396:6;3385:9;3381:22;3350:63;:::i;:::-;3340:73;;3136:287;3462:2;3488:53;3533:7;3524:6;3513:9;3509:22;3488:53;:::i;:::-;3478:63;;3433:118;2904:654;;;;;:::o;3564:149::-;3600:7;3640:66;3633:5;3629:78;3618:89;;3564:149;;;:::o;3719:120::-;3791:23;3808:5;3791:23;:::i;:::-;3784:5;3781:34;3771:62;;3829:1;3826;3819:12;3771:62;3719:120;:::o;3845:137::-;3890:5;3928:6;3915:20;3906:29;;3944:32;3970:5;3944:32;:::i;:::-;3845:137;;;;:::o;3988:327::-;4046:6;4095:2;4083:9;4074:7;4070:23;4066:32;4063:119;;;4101:79;;:::i;:::-;4063:119;4221:1;4246:52;4290:7;4281:6;4270:9;4266:22;4246:52;:::i;:::-;4236:62;;4192:116;3988:327;;;;:::o;4321:90::-;4355:7;4398:5;4391:13;4384:21;4373:32;;4321:90;;;:::o;4417:109::-;4498:21;4513:5;4498:21;:::i;:::-;4493:3;4486:34;4417:109;;:::o;4532:210::-;4619:4;4657:2;4646:9;4642:18;4634:26;;4670:65;4732:1;4721:9;4717:17;4708:6;4670:65;:::i;:::-;4532:210;;;;:::o;4748:99::-;4800:6;4834:5;4828:12;4818:22;;4748:99;;;:::o;4853:169::-;4937:11;4971:6;4966:3;4959:19;5011:4;5006:3;5002:14;4987:29;;4853:169;;;;:::o;5028:307::-;5096:1;5106:113;5120:6;5117:1;5114:13;5106:113;;;5205:1;5200:3;5196:11;5190:18;5186:1;5181:3;5177:11;5170:39;5142:2;5139:1;5135:10;5130:15;;5106:113;;;5237:6;5234:1;5231:13;5228:101;;;5317:1;5308:6;5303:3;5299:16;5292:27;5228:101;5077:258;5028:307;;;:::o;5341:364::-;5429:3;5457:39;5490:5;5457:39;:::i;:::-;5512:71;5576:6;5571:3;5512:71;:::i;:::-;5505:78;;5592:52;5637:6;5632:3;5625:4;5618:5;5614:16;5592:52;:::i;:::-;5669:29;5691:6;5669:29;:::i;:::-;5664:3;5660:39;5653:46;;5433:272;5341:364;;;;:::o;5711:313::-;5824:4;5862:2;5851:9;5847:18;5839:26;;5911:9;5905:4;5901:20;5897:1;5886:9;5882:17;5875:47;5939:78;6012:4;6003:6;5939:78;:::i;:::-;5931:86;;5711:313;;;;:::o;6030:329::-;6089:6;6138:2;6126:9;6117:7;6113:23;6109:32;6106:119;;;6144:79;;:::i;:::-;6106:119;6264:1;6289:53;6334:7;6325:6;6314:9;6310:22;6289:53;:::i;:::-;6279:63;;6235:117;6030:329;;;;:::o;6365:126::-;6402:7;6442:42;6435:5;6431:54;6420:65;;6365:126;;;:::o;6497:96::-;6534:7;6563:24;6581:5;6563:24;:::i;:::-;6552:35;;6497:96;;;:::o;6599:118::-;6686:24;6704:5;6686:24;:::i;:::-;6681:3;6674:37;6599:118;;:::o;6723:222::-;6816:4;6854:2;6843:9;6839:18;6831:26;;6867:71;6935:1;6924:9;6920:17;6911:6;6867:71;:::i;:::-;6723:222;;;;:::o;6951:122::-;7024:24;7042:5;7024:24;:::i;:::-;7017:5;7014:35;7004:63;;7063:1;7060;7053:12;7004:63;6951:122;:::o;7079:139::-;7125:5;7163:6;7150:20;7141:29;;7179:33;7206:5;7179:33;:::i;:::-;7079:139;;;;:::o;7224:474::-;7292:6;7300;7349:2;7337:9;7328:7;7324:23;7320:32;7317:119;;;7355:79;;:::i;:::-;7317:119;7475:1;7500:53;7545:7;7536:6;7525:9;7521:22;7500:53;:::i;:::-;7490:63;;7446:117;7602:2;7628:53;7673:7;7664:6;7653:9;7649:22;7628:53;:::i;:::-;7618:63;;7573:118;7224:474;;;;;:::o;7704:77::-;7741:7;7770:5;7759:16;;7704:77;;;:::o;7787:118::-;7874:24;7892:5;7874:24;:::i;:::-;7869:3;7862:37;7787:118;;:::o;7911:222::-;8004:4;8042:2;8031:9;8027:18;8019:26;;8055:71;8123:1;8112:9;8108:17;8099:6;8055:71;:::i;:::-;7911:222;;;;:::o;8139:329::-;8198:6;8247:2;8235:9;8226:7;8222:23;8218:32;8215:119;;;8253:79;;:::i;:::-;8215:119;8373:1;8398:53;8443:7;8434:6;8423:9;8419:22;8398:53;:::i;:::-;8388:63;;8344:117;8139:329;;;;:::o;8474:509::-;8543:6;8592:2;8580:9;8571:7;8567:23;8563:32;8560:119;;;8598:79;;:::i;:::-;8560:119;8746:1;8735:9;8731:17;8718:31;8776:18;8768:6;8765:30;8762:117;;;8798:79;;:::i;:::-;8762:117;8903:63;8958:7;8949:6;8938:9;8934:22;8903:63;:::i;:::-;8893:73;;8689:287;8474:509;;;;:::o;8989:116::-;9059:21;9074:5;9059:21;:::i;:::-;9052:5;9049:32;9039:60;;9095:1;9092;9085:12;9039:60;8989:116;:::o;9111:133::-;9154:5;9192:6;9179:20;9170:29;;9208:30;9232:5;9208:30;:::i;:::-;9111:133;;;;:::o;9250:323::-;9306:6;9355:2;9343:9;9334:7;9330:23;9326:32;9323:119;;;9361:79;;:::i;:::-;9323:119;9481:1;9506:50;9548:7;9539:6;9528:9;9524:22;9506:50;:::i;:::-;9496:60;;9452:114;9250:323;;;;:::o;9579:118::-;9666:24;9684:5;9666:24;:::i;:::-;9661:3;9654:37;9579:118;;:::o;9703:222::-;9796:4;9834:2;9823:9;9819:18;9811:26;;9847:71;9915:1;9904:9;9900:17;9891:6;9847:71;:::i;:::-;9703:222;;;;:::o;9931:619::-;10008:6;10016;10024;10073:2;10061:9;10052:7;10048:23;10044:32;10041:119;;;10079:79;;:::i;:::-;10041:119;10199:1;10224:53;10269:7;10260:6;10249:9;10245:22;10224:53;:::i;:::-;10214:63;;10170:117;10326:2;10352:53;10397:7;10388:6;10377:9;10373:22;10352:53;:::i;:::-;10342:63;;10297:118;10454:2;10480:53;10525:7;10516:6;10505:9;10501:22;10480:53;:::i;:::-;10470:63;;10425:118;9931:619;;;;;:::o;10556:::-;10633:6;10641;10649;10698:2;10686:9;10677:7;10673:23;10669:32;10666:119;;;10704:79;;:::i;:::-;10666:119;10824:1;10849:53;10894:7;10885:6;10874:9;10870:22;10849:53;:::i;:::-;10839:63;;10795:117;10951:2;10977:53;11022:7;11013:6;11002:9;10998:22;10977:53;:::i;:::-;10967:63;;10922:118;11079:2;11105:53;11150:7;11141:6;11130:9;11126:22;11105:53;:::i;:::-;11095:63;;11050:118;10556:619;;;;;:::o;11181:311::-;11258:4;11348:18;11340:6;11337:30;11334:56;;;11370:18;;:::i;:::-;11334:56;11420:4;11412:6;11408:17;11400:25;;11480:4;11474;11470:15;11462:23;;11181:311;;;:::o;11498:117::-;11607:1;11604;11597:12;11638:710;11734:5;11759:81;11775:64;11832:6;11775:64;:::i;:::-;11759:81;:::i;:::-;11750:90;;11860:5;11889:6;11882:5;11875:21;11923:4;11916:5;11912:16;11905:23;;11976:4;11968:6;11964:17;11956:6;11952:30;12005:3;11997:6;11994:15;11991:122;;;12024:79;;:::i;:::-;11991:122;12139:6;12122:220;12156:6;12151:3;12148:15;12122:220;;;12231:3;12260:37;12293:3;12281:10;12260:37;:::i;:::-;12255:3;12248:50;12327:4;12322:3;12318:14;12311:21;;12198:144;12182:4;12177:3;12173:14;12166:21;;12122:220;;;12126:21;11740:608;;11638:710;;;;;:::o;12371:370::-;12442:5;12491:3;12484:4;12476:6;12472:17;12468:27;12458:122;;12499:79;;:::i;:::-;12458:122;12616:6;12603:20;12641:94;12731:3;12723:6;12716:4;12708:6;12704:17;12641:94;:::i;:::-;12632:103;;12448:293;12371:370;;;;:::o;12747:539::-;12831:6;12880:2;12868:9;12859:7;12855:23;12851:32;12848:119;;;12886:79;;:::i;:::-;12848:119;13034:1;13023:9;13019:17;13006:31;13064:18;13056:6;13053:30;13050:117;;;13086:79;;:::i;:::-;13050:117;13191:78;13261:7;13252:6;13241:9;13237:22;13191:78;:::i;:::-;13181:88;;12977:302;12747:539;;;;:::o;13292:146::-;13391:6;13425:5;13419:12;13409:22;;13292:146;;;:::o;13444:216::-;13575:11;13609:6;13604:3;13597:19;13649:4;13644:3;13640:14;13625:29;;13444:216;;;;:::o;13666:164::-;13765:4;13788:3;13780:11;;13818:4;13813:3;13809:14;13801:22;;13666:164;;;:::o;13836:108::-;13913:24;13931:5;13913:24;:::i;:::-;13908:3;13901:37;13836:108;;:::o;13950:101::-;13986:7;14026:18;14019:5;14015:30;14004:41;;13950:101;;;:::o;14057:105::-;14132:23;14149:5;14132:23;:::i;:::-;14127:3;14120:36;14057:105;;:::o;14168:99::-;14239:21;14254:5;14239:21;:::i;:::-;14234:3;14227:34;14168:99;;:::o;14273:91::-;14309:7;14349:8;14342:5;14338:20;14327:31;;14273:91;;;:::o;14370:105::-;14445:23;14462:5;14445:23;:::i;:::-;14440:3;14433:36;14370:105;;:::o;14553:866::-;14704:4;14699:3;14695:14;14791:4;14784:5;14780:16;14774:23;14810:63;14867:4;14862:3;14858:14;14844:12;14810:63;:::i;:::-;14719:164;14975:4;14968:5;14964:16;14958:23;14994:61;15049:4;15044:3;15040:14;15026:12;14994:61;:::i;:::-;14893:172;15149:4;15142:5;15138:16;15132:23;15168:57;15219:4;15214:3;15210:14;15196:12;15168:57;:::i;:::-;15075:160;15322:4;15315:5;15311:16;15305:23;15341:61;15396:4;15391:3;15387:14;15373:12;15341:61;:::i;:::-;15245:167;14673:746;14553:866;;:::o;15425:307::-;15558:10;15579:110;15685:3;15677:6;15579:110;:::i;:::-;15721:4;15716:3;15712:14;15698:28;;15425:307;;;;:::o;15738:145::-;15840:4;15872;15867:3;15863:14;15855:22;;15738:145;;;:::o;15965:988::-;16148:3;16177:86;16257:5;16177:86;:::i;:::-;16279:118;16390:6;16385:3;16279:118;:::i;:::-;16272:125;;16421:88;16503:5;16421:88;:::i;:::-;16532:7;16563:1;16548:380;16573:6;16570:1;16567:13;16548:380;;;16649:6;16643:13;16676:127;16799:3;16784:13;16676:127;:::i;:::-;16669:134;;16826:92;16911:6;16826:92;:::i;:::-;16816:102;;16608:320;16595:1;16592;16588:9;16583:14;;16548:380;;;16552:14;16944:3;16937:10;;16153:800;;;15965:988;;;;:::o;16959:501::-;17166:4;17204:2;17193:9;17189:18;17181:26;;17253:9;17247:4;17243:20;17239:1;17228:9;17224:17;17217:47;17281:172;17448:4;17439:6;17281:172;:::i;:::-;17273:180;;16959:501;;;;:::o;17466:474::-;17534:6;17542;17591:2;17579:9;17570:7;17566:23;17562:32;17559:119;;;17597:79;;:::i;:::-;17559:119;17717:1;17742:53;17787:7;17778:6;17767:9;17763:22;17742:53;:::i;:::-;17732:63;;17688:117;17844:2;17870:53;17915:7;17906:6;17895:9;17891:22;17870:53;:::i;:::-;17860:63;;17815:118;17466:474;;;;;:::o;17946:122::-;18019:24;18037:5;18019:24;:::i;:::-;18012:5;18009:35;17999:63;;18058:1;18055;18048:12;17999:63;17946:122;:::o;18074:139::-;18120:5;18158:6;18145:20;18136:29;;18174:33;18201:5;18174:33;:::i;:::-;18074:139;;;;:::o;18219:474::-;18287:6;18295;18344:2;18332:9;18323:7;18319:23;18315:32;18312:119;;;18350:79;;:::i;:::-;18312:119;18470:1;18495:53;18540:7;18531:6;18520:9;18516:22;18495:53;:::i;:::-;18485:63;;18441:117;18597:2;18623:53;18668:7;18659:6;18648:9;18644:22;18623:53;:::i;:::-;18613:63;;18568:118;18219:474;;;;;:::o;18699:114::-;18766:6;18800:5;18794:12;18784:22;;18699:114;;;:::o;18819:184::-;18918:11;18952:6;18947:3;18940:19;18992:4;18987:3;18983:14;18968:29;;18819:184;;;;:::o;19009:132::-;19076:4;19099:3;19091:11;;19129:4;19124:3;19120:14;19112:22;;19009:132;;;:::o;19147:108::-;19224:24;19242:5;19224:24;:::i;:::-;19219:3;19212:37;19147:108;;:::o;19261:179::-;19330:10;19351:46;19393:3;19385:6;19351:46;:::i;:::-;19429:4;19424:3;19420:14;19406:28;;19261:179;;;;:::o;19446:113::-;19516:4;19548;19543:3;19539:14;19531:22;;19446:113;;;:::o;19595:732::-;19714:3;19743:54;19791:5;19743:54;:::i;:::-;19813:86;19892:6;19887:3;19813:86;:::i;:::-;19806:93;;19923:56;19973:5;19923:56;:::i;:::-;20002:7;20033:1;20018:284;20043:6;20040:1;20037:13;20018:284;;;20119:6;20113:13;20146:63;20205:3;20190:13;20146:63;:::i;:::-;20139:70;;20232:60;20285:6;20232:60;:::i;:::-;20222:70;;20078:224;20065:1;20062;20058:9;20053:14;;20018:284;;;20022:14;20318:3;20311:10;;19719:608;;;19595:732;;;;:::o;20333:373::-;20476:4;20514:2;20503:9;20499:18;20491:26;;20563:9;20557:4;20553:20;20549:1;20538:9;20534:17;20527:47;20591:108;20694:4;20685:6;20591:108;:::i;:::-;20583:116;;20333:373;;;;:::o;20712:619::-;20789:6;20797;20805;20854:2;20842:9;20833:7;20829:23;20825:32;20822:119;;;20860:79;;:::i;:::-;20822:119;20980:1;21005:53;21050:7;21041:6;21030:9;21026:22;21005:53;:::i;:::-;20995:63;;20951:117;21107:2;21133:53;21178:7;21169:6;21158:9;21154:22;21133:53;:::i;:::-;21123:63;;21078:118;21235:2;21261:53;21306:7;21297:6;21286:9;21282:22;21261:53;:::i;:::-;21251:63;;21206:118;20712:619;;;;;:::o;21337:468::-;21402:6;21410;21459:2;21447:9;21438:7;21434:23;21430:32;21427:119;;;21465:79;;:::i;:::-;21427:119;21585:1;21610:53;21655:7;21646:6;21635:9;21631:22;21610:53;:::i;:::-;21600:63;;21556:117;21712:2;21738:50;21780:7;21771:6;21760:9;21756:22;21738:50;:::i;:::-;21728:60;;21683:115;21337:468;;;;;:::o;21811:307::-;21872:4;21962:18;21954:6;21951:30;21948:56;;;21984:18;;:::i;:::-;21948:56;22022:29;22044:6;22022:29;:::i;:::-;22014:37;;22106:4;22100;22096:15;22088:23;;21811:307;;;:::o;22124:410::-;22201:5;22226:65;22242:48;22283:6;22242:48;:::i;:::-;22226:65;:::i;:::-;22217:74;;22314:6;22307:5;22300:21;22352:4;22345:5;22341:16;22390:3;22381:6;22376:3;22372:16;22369:25;22366:112;;;22397:79;;:::i;:::-;22366:112;22487:41;22521:6;22516:3;22511;22487:41;:::i;:::-;22207:327;22124:410;;;;;:::o;22553:338::-;22608:5;22657:3;22650:4;22642:6;22638:17;22634:27;22624:122;;22665:79;;:::i;:::-;22624:122;22782:6;22769:20;22807:78;22881:3;22873:6;22866:4;22858:6;22854:17;22807:78;:::i;:::-;22798:87;;22614:277;22553:338;;;;:::o;22897:943::-;22992:6;23000;23008;23016;23065:3;23053:9;23044:7;23040:23;23036:33;23033:120;;;23072:79;;:::i;:::-;23033:120;23192:1;23217:53;23262:7;23253:6;23242:9;23238:22;23217:53;:::i;:::-;23207:63;;23163:117;23319:2;23345:53;23390:7;23381:6;23370:9;23366:22;23345:53;:::i;:::-;23335:63;;23290:118;23447:2;23473:53;23518:7;23509:6;23498:9;23494:22;23473:53;:::i;:::-;23463:63;;23418:118;23603:2;23592:9;23588:18;23575:32;23634:18;23626:6;23623:30;23620:117;;;23656:79;;:::i;:::-;23620:117;23761:62;23815:7;23806:6;23795:9;23791:22;23761:62;:::i;:::-;23751:72;;23546:287;22897:943;;;;;;;:::o;23918:876::-;24079:4;24074:3;24070:14;24166:4;24159:5;24155:16;24149:23;24185:63;24242:4;24237:3;24233:14;24219:12;24185:63;:::i;:::-;24094:164;24350:4;24343:5;24339:16;24333:23;24369:61;24424:4;24419:3;24415:14;24401:12;24369:61;:::i;:::-;24268:172;24524:4;24517:5;24513:16;24507:23;24543:57;24594:4;24589:3;24585:14;24571:12;24543:57;:::i;:::-;24450:160;24697:4;24690:5;24686:16;24680:23;24716:61;24771:4;24766:3;24762:14;24748:12;24716:61;:::i;:::-;24620:167;24048:746;23918:876;;:::o;24800:351::-;24957:4;24995:3;24984:9;24980:19;24972:27;;25009:135;25141:1;25130:9;25126:17;25117:6;25009:135;:::i;:::-;24800:351;;;;:::o;25157:117::-;25266:1;25263;25256:12;25297:568;25370:8;25380:6;25430:3;25423:4;25415:6;25411:17;25407:27;25397:122;;25438:79;;:::i;:::-;25397:122;25551:6;25538:20;25528:30;;25581:18;25573:6;25570:30;25567:117;;;25603:79;;:::i;:::-;25567:117;25717:4;25709:6;25705:17;25693:29;;25771:3;25763:4;25755:6;25751:17;25741:8;25737:32;25734:41;25731:128;;;25778:79;;:::i;:::-;25731:128;25297:568;;;;;:::o;25871:849::-;25975:6;25983;25991;25999;26048:2;26036:9;26027:7;26023:23;26019:32;26016:119;;;26054:79;;:::i;:::-;26016:119;26174:1;26199:53;26244:7;26235:6;26224:9;26220:22;26199:53;:::i;:::-;26189:63;;26145:117;26301:2;26327:53;26372:7;26363:6;26352:9;26348:22;26327:53;:::i;:::-;26317:63;;26272:118;26457:2;26446:9;26442:18;26429:32;26488:18;26480:6;26477:30;26474:117;;;26510:79;;:::i;:::-;26474:117;26623:80;26695:7;26686:6;26675:9;26671:22;26623:80;:::i;:::-;26605:98;;;;26400:313;25871:849;;;;;;;:::o;26726:474::-;26794:6;26802;26851:2;26839:9;26830:7;26826:23;26822:32;26819:119;;;26857:79;;:::i;:::-;26819:119;26977:1;27002:53;27047:7;27038:6;27027:9;27023:22;27002:53;:::i;:::-;26992:63;;26948:117;27104:2;27130:53;27175:7;27166:6;27155:9;27151:22;27130:53;:::i;:::-;27120:63;;27075:118;26726:474;;;;;:::o;27206:180::-;27254:77;27251:1;27244:88;27351:4;27348:1;27341:15;27375:4;27372:1;27365:15;27392:320;27436:6;27473:1;27467:4;27463:12;27453:22;;27520:1;27514:4;27510:12;27541:18;27531:81;;27597:4;27589:6;27585:17;27575:27;;27531:81;27659:2;27651:6;27648:14;27628:18;27625:38;27622:84;;;27678:18;;:::i;:::-;27622:84;27443:269;27392:320;;;:::o;27718:180::-;27766:77;27763:1;27756:88;27863:4;27860:1;27853:15;27887:4;27884:1;27877:15;27904:191;27944:4;27964:20;27982:1;27964:20;:::i;:::-;27959:25;;27998:20;28016:1;27998:20;:::i;:::-;27993:25;;28037:1;28034;28031:8;28028:34;;;28042:18;;:::i;:::-;28028:34;28087:1;28084;28080:9;28072:17;;27904:191;;;;:::o;28101:305::-;28141:3;28160:20;28178:1;28160:20;:::i;:::-;28155:25;;28194:20;28212:1;28194:20;:::i;:::-;28189:25;;28348:1;28280:66;28276:74;28273:1;28270:81;28267:107;;;28354:18;;:::i;:::-;28267:107;28398:1;28395;28391:9;28384:16;;28101:305;;;;:::o;28412:170::-;28552:22;28548:1;28540:6;28536:14;28529:46;28412:170;:::o;28588:366::-;28730:3;28751:67;28815:2;28810:3;28751:67;:::i;:::-;28744:74;;28827:93;28916:3;28827:93;:::i;:::-;28945:2;28940:3;28936:12;28929:19;;28588:366;;;:::o;28960:419::-;29126:4;29164:2;29153:9;29149:18;29141:26;;29213:9;29207:4;29203:20;29199:1;29188:9;29184:17;29177:47;29241:131;29367:4;29241:131;:::i;:::-;29233:139;;28960:419;;;:::o;29385:181::-;29525:33;29521:1;29513:6;29509:14;29502:57;29385:181;:::o;29572:366::-;29714:3;29735:67;29799:2;29794:3;29735:67;:::i;:::-;29728:74;;29811:93;29900:3;29811:93;:::i;:::-;29929:2;29924:3;29920:12;29913:19;;29572:366;;;:::o;29944:419::-;30110:4;30148:2;30137:9;30133:18;30125:26;;30197:9;30191:4;30187:20;30183:1;30172:9;30168:17;30161:47;30225:131;30351:4;30225:131;:::i;:::-;30217:139;;29944:419;;;:::o;30369:147::-;30470:11;30507:3;30492:18;;30369:147;;;;:::o;30522:114::-;;:::o;30642:398::-;30801:3;30822:83;30903:1;30898:3;30822:83;:::i;:::-;30815:90;;30914:93;31003:3;30914:93;:::i;:::-;31032:1;31027:3;31023:11;31016:18;;30642:398;;;:::o;31046:379::-;31230:3;31252:147;31395:3;31252:147;:::i;:::-;31245:154;;31416:3;31409:10;;31046:379;;;:::o;31431:180::-;31479:77;31476:1;31469:88;31576:4;31573:1;31566:15;31600:4;31597:1;31590:15;31617:234;31757:34;31753:1;31745:6;31741:14;31734:58;31826:17;31821:2;31813:6;31809:15;31802:42;31617:234;:::o;31857:366::-;31999:3;32020:67;32084:2;32079:3;32020:67;:::i;:::-;32013:74;;32096:93;32185:3;32096:93;:::i;:::-;32214:2;32209:3;32205:12;32198:19;;31857:366;;;:::o;32229:419::-;32395:4;32433:2;32422:9;32418:18;32410:26;;32482:9;32476:4;32472:20;32468:1;32457:9;32453:17;32446:47;32510:131;32636:4;32510:131;:::i;:::-;32502:139;;32229:419;;;:::o;32654:171::-;32693:3;32716:24;32734:5;32716:24;:::i;:::-;32707:33;;32762:4;32755:5;32752:15;32749:41;;;32770:18;;:::i;:::-;32749:41;32817:1;32810:5;32806:13;32799:20;;32654:171;;;:::o;32831:148::-;32933:11;32970:3;32955:18;;32831:148;;;;:::o;32985:141::-;33034:4;33057:3;33049:11;;33080:3;33077:1;33070:14;33114:4;33111:1;33101:18;33093:26;;32985:141;;;:::o;33156:845::-;33259:3;33296:5;33290:12;33325:36;33351:9;33325:36;:::i;:::-;33377:89;33459:6;33454:3;33377:89;:::i;:::-;33370:96;;33497:1;33486:9;33482:17;33513:1;33508:137;;;;33659:1;33654:341;;;;33475:520;;33508:137;33592:4;33588:9;33577;33573:25;33568:3;33561:38;33628:6;33623:3;33619:16;33612:23;;33508:137;;33654:341;33721:38;33753:5;33721:38;:::i;:::-;33781:1;33795:154;33809:6;33806:1;33803:13;33795:154;;;33883:7;33877:14;33873:1;33868:3;33864:11;33857:35;33933:1;33924:7;33920:15;33909:26;;33831:4;33828:1;33824:12;33819:17;;33795:154;;;33978:6;33973:3;33969:16;33962:23;;33661:334;;33475:520;;33263:738;;33156:845;;;;:::o;34007:377::-;34113:3;34141:39;34174:5;34141:39;:::i;:::-;34196:89;34278:6;34273:3;34196:89;:::i;:::-;34189:96;;34294:52;34339:6;34334:3;34327:4;34320:5;34316:16;34294:52;:::i;:::-;34371:6;34366:3;34362:16;34355:23;;34117:267;34007:377;;;;:::o;34390:583::-;34612:3;34634:92;34722:3;34713:6;34634:92;:::i;:::-;34627:99;;34743:95;34834:3;34825:6;34743:95;:::i;:::-;34736:102;;34855:92;34943:3;34934:6;34855:92;:::i;:::-;34848:99;;34964:3;34957:10;;34390:583;;;;;;:::o;34979:589::-;35204:3;35226:95;35317:3;35308:6;35226:95;:::i;:::-;35219:102;;35338:95;35429:3;35420:6;35338:95;:::i;:::-;35331:102;;35450:92;35538:3;35529:6;35450:92;:::i;:::-;35443:99;;35559:3;35552:10;;34979:589;;;;;;:::o;35574:169::-;35714:21;35710:1;35702:6;35698:14;35691:45;35574:169;:::o;35749:366::-;35891:3;35912:67;35976:2;35971:3;35912:67;:::i;:::-;35905:74;;35988:93;36077:3;35988:93;:::i;:::-;36106:2;36101:3;36097:12;36090:19;;35749:366;;;:::o;36121:419::-;36287:4;36325:2;36314:9;36310:18;36302:26;;36374:9;36368:4;36364:20;36360:1;36349:9;36345:17;36338:47;36402:131;36528:4;36402:131;:::i;:::-;36394:139;;36121:419;;;:::o;36546:164::-;36686:16;36682:1;36674:6;36670:14;36663:40;36546:164;:::o;36716:366::-;36858:3;36879:67;36943:2;36938:3;36879:67;:::i;:::-;36872:74;;36955:93;37044:3;36955:93;:::i;:::-;37073:2;37068:3;37064:12;37057:19;;36716:366;;;:::o;37088:419::-;37254:4;37292:2;37281:9;37277:18;37269:26;;37341:9;37335:4;37331:20;37327:1;37316:9;37312:17;37305:47;37369:131;37495:4;37369:131;:::i;:::-;37361:139;;37088:419;;;:::o;37513:94::-;37546:8;37594:5;37590:2;37586:14;37565:35;;37513:94;;;:::o;37613:::-;37652:7;37681:20;37695:5;37681:20;:::i;:::-;37670:31;;37613:94;;;:::o;37713:100::-;37752:7;37781:26;37801:5;37781:26;:::i;:::-;37770:37;;37713:100;;;:::o;37819:157::-;37924:45;37944:24;37962:5;37944:24;:::i;:::-;37924:45;:::i;:::-;37919:3;37912:58;37819:157;;:::o;37982:256::-;38094:3;38109:75;38180:3;38171:6;38109:75;:::i;:::-;38209:2;38204:3;38200:12;38193:19;;38229:3;38222:10;;37982:256;;;;:::o;38244:164::-;38384:16;38380:1;38372:6;38368:14;38361:40;38244:164;:::o;38414:366::-;38556:3;38577:67;38641:2;38636:3;38577:67;:::i;:::-;38570:74;;38653:93;38742:3;38653:93;:::i;:::-;38771:2;38766:3;38762:12;38755:19;;38414:366;;;:::o;38786:419::-;38952:4;38990:2;38979:9;38975:18;38967:26;;39039:9;39033:4;39029:20;39025:1;39014:9;39010:17;39003:47;39067:131;39193:4;39067:131;:::i;:::-;39059:139;;38786:419;;;:::o;39211:173::-;39351:25;39347:1;39339:6;39335:14;39328:49;39211:173;:::o;39390:366::-;39532:3;39553:67;39617:2;39612:3;39553:67;:::i;:::-;39546:74;;39629:93;39718:3;39629:93;:::i;:::-;39747:2;39742:3;39738:12;39731:19;;39390:366;;;:::o;39762:419::-;39928:4;39966:2;39955:9;39951:18;39943:26;;40015:9;40009:4;40005:20;40001:1;39990:9;39986:17;39979:47;40043:131;40169:4;40043:131;:::i;:::-;40035:139;;39762:419;;;:::o;40187:170::-;40327:22;40323:1;40315:6;40311:14;40304:46;40187:170;:::o;40363:366::-;40505:3;40526:67;40590:2;40585:3;40526:67;:::i;:::-;40519:74;;40602:93;40691:3;40602:93;:::i;:::-;40720:2;40715:3;40711:12;40704:19;;40363:366;;;:::o;40735:419::-;40901:4;40939:2;40928:9;40924:18;40916:26;;40988:9;40982:4;40978:20;40974:1;40963:9;40959:17;40952:47;41016:131;41142:4;41016:131;:::i;:::-;41008:139;;40735:419;;;:::o;41160:174::-;41300:26;41296:1;41288:6;41284:14;41277:50;41160:174;:::o;41340:366::-;41482:3;41503:67;41567:2;41562:3;41503:67;:::i;:::-;41496:74;;41579:93;41668:3;41579:93;:::i;:::-;41697:2;41692:3;41688:12;41681:19;;41340:366;;;:::o;41712:419::-;41878:4;41916:2;41905:9;41901:18;41893:26;;41965:9;41959:4;41955:20;41951:1;41940:9;41936:17;41929:47;41993:131;42119:4;41993:131;:::i;:::-;41985:139;;41712:419;;;:::o;42137:225::-;42277:34;42273:1;42265:6;42261:14;42254:58;42346:8;42341:2;42333:6;42329:15;42322:33;42137:225;:::o;42368:366::-;42510:3;42531:67;42595:2;42590:3;42531:67;:::i;:::-;42524:74;;42607:93;42696:3;42607:93;:::i;:::-;42725:2;42720:3;42716:12;42709:19;;42368:366;;;:::o;42740:419::-;42906:4;42944:2;42933:9;42929:18;42921:26;;42993:9;42987:4;42983:20;42979:1;42968:9;42964:17;42957:47;43021:131;43147:4;43021:131;:::i;:::-;43013:139;;42740:419;;;:::o;43165:182::-;43305:34;43301:1;43293:6;43289:14;43282:58;43165:182;:::o;43353:366::-;43495:3;43516:67;43580:2;43575:3;43516:67;:::i;:::-;43509:74;;43592:93;43681:3;43592:93;:::i;:::-;43710:2;43705:3;43701:12;43694:19;;43353:366;;;:::o;43725:419::-;43891:4;43929:2;43918:9;43914:18;43906:26;;43978:9;43972:4;43968:20;43964:1;43953:9;43949:17;43942:47;44006:131;44132:4;44006:131;:::i;:::-;43998:139;;43725:419;;;:::o;44150:98::-;44201:6;44235:5;44229:12;44219:22;;44150:98;;;:::o;44254:168::-;44337:11;44371:6;44366:3;44359:19;44411:4;44406:3;44402:14;44387:29;;44254:168;;;;:::o;44428:360::-;44514:3;44542:38;44574:5;44542:38;:::i;:::-;44596:70;44659:6;44654:3;44596:70;:::i;:::-;44589:77;;44675:52;44720:6;44715:3;44708:4;44701:5;44697:16;44675:52;:::i;:::-;44752:29;44774:6;44752:29;:::i;:::-;44747:3;44743:39;44736:46;;44518:270;44428:360;;;;:::o;44794:640::-;44989:4;45027:3;45016:9;45012:19;45004:27;;45041:71;45109:1;45098:9;45094:17;45085:6;45041:71;:::i;:::-;45122:72;45190:2;45179:9;45175:18;45166:6;45122:72;:::i;:::-;45204;45272:2;45261:9;45257:18;45248:6;45204:72;:::i;:::-;45323:9;45317:4;45313:20;45308:2;45297:9;45293:18;45286:48;45351:76;45422:4;45413:6;45351:76;:::i;:::-;45343:84;;44794:640;;;;;;;:::o;45440:141::-;45496:5;45527:6;45521:13;45512:22;;45543:32;45569:5;45543:32;:::i;:::-;45440:141;;;;:::o;45587:349::-;45656:6;45705:2;45693:9;45684:7;45680:23;45676:32;45673:119;;;45711:79;;:::i;:::-;45673:119;45831:1;45856:63;45911:7;45902:6;45891:9;45887:22;45856:63;:::i;:::-;45846:73;;45802:127;45587:349;;;;:::o;45942:233::-;45981:3;46004:24;46022:5;46004:24;:::i;:::-;45995:33;;46050:66;46043:5;46040:77;46037:103;;;46120:18;;:::i;:::-;46037:103;46167:1;46160:5;46156:13;46149:20;;45942:233;;;:::o;46181:180::-;46229:77;46226:1;46219:88;46326:4;46323:1;46316:15;46350:4;46347:1;46340:15;46367:185;46407:1;46424:20;46442:1;46424:20;:::i;:::-;46419:25;;46458:20;46476:1;46458:20;:::i;:::-;46453:25;;46497:1;46487:35;;46502:18;;:::i;:::-;46487:35;46544:1;46541;46537:9;46532:14;;46367:185;;;;:::o;46558:176::-;46590:1;46607:20;46625:1;46607:20;:::i;:::-;46602:25;;46641:20;46659:1;46641:20;:::i;:::-;46636:25;;46680:1;46670:35;;46685:18;;:::i;:::-;46670:35;46726:1;46723;46719:9;46714:14;;46558:176;;;;:::o;46740:348::-;46780:7;46803:20;46821:1;46803:20;:::i;:::-;46798:25;;46837:20;46855:1;46837:20;:::i;:::-;46832:25;;47025:1;46957:66;46953:74;46950:1;46947:81;46942:1;46935:9;46928:17;46924:105;46921:131;;;47032:18;;:::i;:::-;46921:131;47080:1;47077;47073:9;47062:20;;46740:348;;;;:::o
Swarm Source
ipfs://c1362509d6dab414519033cba81785847e0abd81c3cd302cd2b4ad9b083fa487
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.